xref: /qemu/meson.build (revision a0c9162c)
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')
138b18cdbfSRichard Hendersonfs = import('fs')
14a81df1b6SPaolo Bonzini
15ce1c1e7aSPaolo Bonzinish = find_program('sh')
16a81df1b6SPaolo Bonzinicc = meson.get_compiler('c')
17a5665051SPaolo Bonziniconfig_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
183154fee4SMarc-André Lureauenable_modules = 'CONFIG_MODULES' in config_host
1935be72baSPaolo Bonzinienable_static = 'CONFIG_STATIC' in config_host
20f8aa24eaSPaolo Bonzinibuild_docs = 'BUILD_DOCS' in config_host
218fe11232SMarc-André Lureau
228fe11232SMarc-André Lureauif get_option('qemu_suffix').startswith('/')
238fe11232SMarc-André Lureau  error('qemu_suffix cannot start with a /')
248fe11232SMarc-André Lureauendif
258fe11232SMarc-André Lureau
26ab4c0996SMarc-André Lureauqemu_datadir = get_option('datadir') / get_option('qemu_suffix')
27491e74c1SMarc-André Lureauqemu_docdir = get_option('docdir') / get_option('qemu_suffix')
28859aef02SPaolo Bonziniconfig_host_data = configuration_data()
29859aef02SPaolo Bonzinigenh = []
30a5665051SPaolo Bonzini
31760e4327SPaolo Bonzinitarget_dirs = config_host['TARGET_DIRS'].split()
32760e4327SPaolo Bonzinihave_user = false
33760e4327SPaolo Bonzinihave_system = false
34760e4327SPaolo Bonziniforeach target : target_dirs
35760e4327SPaolo Bonzini  have_user = have_user or target.endswith('-user')
36760e4327SPaolo Bonzini  have_system = have_system or target.endswith('-softmmu')
37760e4327SPaolo Bonziniendforeach
38760e4327SPaolo Bonzinihave_tools = 'CONFIG_TOOLS' in config_host
39760e4327SPaolo Bonzinihave_block = have_system or have_tools
40760e4327SPaolo Bonzini
41201e8ed7SPaolo Bonzinipython = import('python').find_installation()
42201e8ed7SPaolo Bonzini
43201e8ed7SPaolo Bonzinisupported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
44201e8ed7SPaolo Bonzinisupported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
45201e8ed7SPaolo Bonzini  'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
46201e8ed7SPaolo Bonzini
47201e8ed7SPaolo Bonzinicpu = host_machine.cpu_family()
48201e8ed7SPaolo Bonzinitargetos = host_machine.system()
49201e8ed7SPaolo Bonzini
50201e8ed7SPaolo Bonziniconfigure_file(input: files('scripts/ninjatool.py'),
51201e8ed7SPaolo Bonzini               output: 'ninjatool',
52201e8ed7SPaolo Bonzini               configuration: config_host)
53201e8ed7SPaolo Bonzini
548a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64']
558a19980eSPaolo Bonzini  kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
568a19980eSPaolo Bonzinielif cpu == 'aarch64'
578a19980eSPaolo Bonzini  kvm_targets = ['aarch64-softmmu']
588a19980eSPaolo Bonzinielif cpu == 's390x'
598a19980eSPaolo Bonzini  kvm_targets = ['s390x-softmmu']
608a19980eSPaolo Bonzinielif cpu in ['ppc', 'ppc64']
618a19980eSPaolo Bonzini  kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
62fbc5884cSHuacai Chenelif cpu in ['mips', 'mips64']
63fbc5884cSHuacai Chen  kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
648a19980eSPaolo Bonzinielse
658a19980eSPaolo Bonzini  kvm_targets = []
668a19980eSPaolo Bonziniendif
678a19980eSPaolo Bonzini
688a19980eSPaolo Bonziniaccelerator_targets = { 'CONFIG_KVM': kvm_targets }
698a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64']
708a19980eSPaolo Bonzini  accelerator_targets += {
718a19980eSPaolo Bonzini    'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
728a19980eSPaolo Bonzini    'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
738a19980eSPaolo Bonzini    'CONFIG_HVF': ['x86_64-softmmu'],
748a19980eSPaolo Bonzini    'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
758a19980eSPaolo Bonzini  }
768a19980eSPaolo Bonziniendif
778a19980eSPaolo Bonzini
78201e8ed7SPaolo Bonzini##################
79201e8ed7SPaolo Bonzini# Compiler flags #
80201e8ed7SPaolo Bonzini##################
81201e8ed7SPaolo Bonzini
82ff9ed62bSAlexander Bulekov# Specify linker-script with add_project_link_arguments so that it is not placed
83ff9ed62bSAlexander Bulekov# within a linker --start-group/--end-group pair
84ff9ed62bSAlexander Bulekovif 'CONFIG_FUZZ' in config_host
85ff9ed62bSAlexander Bulekov   add_project_link_arguments(['-Wl,-T,',
86ff9ed62bSAlexander Bulekov                               (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
87ff9ed62bSAlexander Bulekov                              native: false, language: ['c', 'cpp', 'objc'])
88ff9ed62bSAlexander Bulekovendif
89ff9ed62bSAlexander Bulekov
90a5665051SPaolo Bonziniadd_project_arguments(config_host['QEMU_CFLAGS'].split(),
91a5665051SPaolo Bonzini                      native: false, language: ['c', 'objc'])
92a5665051SPaolo Bonziniadd_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
93a5665051SPaolo Bonzini                      native: false, language: 'cpp')
94a5665051SPaolo Bonziniadd_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
95a5665051SPaolo Bonzini                           native: false, language: ['c', 'cpp', 'objc'])
96a5665051SPaolo Bonziniadd_project_arguments(config_host['QEMU_INCLUDES'].split(),
97a5665051SPaolo Bonzini                      language: ['c', 'cpp', 'objc'])
98a5665051SPaolo Bonzini
99c46f76d1SAlexander Bulekov
100fc929892SMarc-André Lureaulink_language = meson.get_external_property('link_language', 'cpp')
101fc929892SMarc-André Lureauif link_language == 'cpp'
102fc929892SMarc-André Lureau  add_languages('cpp', required: true, native: false)
103fc929892SMarc-André Lureauendif
104a5665051SPaolo Bonziniif host_machine.system() == 'darwin'
105a5665051SPaolo Bonzini  add_languages('objc', required: false, native: false)
106a5665051SPaolo Bonziniendif
107a5665051SPaolo Bonzini
108deb62371SPaolo Bonzinisparse = find_program('cgcc', required: get_option('sparse'))
109deb62371SPaolo Bonziniif sparse.found()
110968b4db3SPaolo Bonzini  run_target('sparse',
111968b4db3SPaolo Bonzini             command: [find_program('scripts/check_sparse.py'),
112deb62371SPaolo Bonzini                       'compile_commands.json', sparse.full_path(), '-Wbitwise',
113deb62371SPaolo Bonzini                       '-Wno-transparent-union', '-Wno-old-initializer',
114deb62371SPaolo Bonzini                       '-Wno-non-pointer-null'])
115968b4db3SPaolo Bonziniendif
116968b4db3SPaolo Bonzini
1176ec0e15dSPaolo Bonzini###########################################
1186ec0e15dSPaolo Bonzini# Target-specific checks and dependencies #
1196ec0e15dSPaolo Bonzini###########################################
1206ec0e15dSPaolo Bonzini
1216ec0e15dSPaolo Bonziniif targetos != 'linux' and get_option('mpath').enabled()
1226ec0e15dSPaolo Bonzini  error('Multipath is supported only on Linux')
1236ec0e15dSPaolo Bonziniendif
1246ec0e15dSPaolo Bonzini
125a81df1b6SPaolo Bonzinim = cc.find_library('m', required: false)
126a81df1b6SPaolo Bonziniutil = cc.find_library('util', required: false)
1274a96337dSPaolo Bonziniwinmm = []
128a81df1b6SPaolo Bonzinisocket = []
12904c6f1e7SMarc-André Lureauversion_res = []
130d92989aaSMarc-André Lureaucoref = []
131d92989aaSMarc-André Lureauiokit = []
132b6c7cfd4SPaolo Bonziniemulator_link_args = []
133b4e312e9SPaolo Bonzinicocoa = not_found
1348a19980eSPaolo Bonzinihvf = not_found
135a81df1b6SPaolo Bonziniif targetos == 'windows'
136a81df1b6SPaolo Bonzini  socket = cc.find_library('ws2_32')
1374a96337dSPaolo Bonzini  winmm = cc.find_library('winmm')
13804c6f1e7SMarc-André Lureau
13904c6f1e7SMarc-André Lureau  win = import('windows')
14004c6f1e7SMarc-André Lureau  version_res = win.compile_resources('version.rc',
14104c6f1e7SMarc-André Lureau                                      depend_files: files('pc-bios/qemu-nsis.ico'),
14204c6f1e7SMarc-André Lureau                                      include_directories: include_directories('.'))
143d92989aaSMarc-André Lureauelif targetos == 'darwin'
144d92989aaSMarc-André Lureau  coref = dependency('appleframeworks', modules: 'CoreFoundation')
145d92989aaSMarc-André Lureau  iokit = dependency('appleframeworks', modules: 'IOKit')
146b4e312e9SPaolo Bonzini  cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
147cfad62f1SPaolo Bonzinielif targetos == 'sunos'
148cfad62f1SPaolo Bonzini  socket = [cc.find_library('socket'),
149cfad62f1SPaolo Bonzini            cc.find_library('nsl'),
150cfad62f1SPaolo Bonzini            cc.find_library('resolv')]
151cfad62f1SPaolo Bonzinielif targetos == 'haiku'
152cfad62f1SPaolo Bonzini  socket = [cc.find_library('posix_error_mapper'),
153cfad62f1SPaolo Bonzini            cc.find_library('network'),
154cfad62f1SPaolo Bonzini            cc.find_library('bsd')]
155b6c7cfd4SPaolo Bonzinielif targetos == 'openbsd'
156b6c7cfd4SPaolo Bonzini  if not get_option('tcg').disabled() and target_dirs.length() > 0
157b6c7cfd4SPaolo Bonzini    # Disable OpenBSD W^X if available
158b6c7cfd4SPaolo Bonzini    emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
159b6c7cfd4SPaolo Bonzini  endif
160a81df1b6SPaolo Bonziniendif
1616ec0e15dSPaolo Bonzini
1628a19980eSPaolo Bonziniaccelerators = []
1638a19980eSPaolo Bonziniif not get_option('kvm').disabled() and targetos == 'linux'
1648a19980eSPaolo Bonzini  accelerators += 'CONFIG_KVM'
1658a19980eSPaolo Bonziniendif
1668a19980eSPaolo Bonziniif not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
1678a19980eSPaolo Bonzini  accelerators += 'CONFIG_XEN'
1688a19980eSPaolo Bonzini  have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
1698a19980eSPaolo Bonzinielse
1708a19980eSPaolo Bonzini  have_xen_pci_passthrough = false
1718a19980eSPaolo Bonziniendif
1728a19980eSPaolo Bonziniif not get_option('whpx').disabled() and targetos == 'windows'
1738a19980eSPaolo Bonzini  if get_option('whpx').enabled() and cpu != 'x86_64'
1748a19980eSPaolo Bonzini    error('WHPX requires 64-bit host')
1758a19980eSPaolo Bonzini  elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
1768a19980eSPaolo Bonzini       cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
1778a19980eSPaolo Bonzini    accelerators += 'CONFIG_WHPX'
1788a19980eSPaolo Bonzini  endif
1798a19980eSPaolo Bonziniendif
1808a19980eSPaolo Bonziniif not get_option('hvf').disabled()
1818a19980eSPaolo Bonzini  hvf = dependency('appleframeworks', modules: 'Hypervisor',
1828a19980eSPaolo Bonzini                   required: get_option('hvf'))
1838a19980eSPaolo Bonzini  if hvf.found()
1848a19980eSPaolo Bonzini    accelerators += 'CONFIG_HVF'
1858a19980eSPaolo Bonzini  endif
1868a19980eSPaolo Bonziniendif
1878a19980eSPaolo Bonziniif not get_option('hax').disabled()
1888a19980eSPaolo Bonzini  if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
1898a19980eSPaolo Bonzini    accelerators += 'CONFIG_HAX'
1908a19980eSPaolo Bonzini  endif
1918a19980eSPaolo Bonziniendif
1928a19980eSPaolo Bonziniif not get_option('tcg').disabled()
1938a19980eSPaolo Bonzini  if cpu not in supported_cpus
1948a19980eSPaolo Bonzini    if 'CONFIG_TCG_INTERPRETER' in config_host
1958a19980eSPaolo Bonzini      warning('Unsupported CPU @0@, will use TCG with TCI (experimental)'.format(cpu))
1968a19980eSPaolo Bonzini    else
1978a19980eSPaolo Bonzini      error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
1988a19980eSPaolo Bonzini    endif
1998a19980eSPaolo Bonzini  endif
2008a19980eSPaolo Bonzini  accelerators += 'CONFIG_TCG'
2018a19980eSPaolo Bonzini  config_host += { 'CONFIG_TCG': 'y' }
2028a19980eSPaolo Bonziniendif
2038a19980eSPaolo Bonzini
2048a19980eSPaolo Bonziniif 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
2058a19980eSPaolo Bonzini  error('KVM not available on this platform')
2068a19980eSPaolo Bonziniendif
2078a19980eSPaolo Bonziniif 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
2088a19980eSPaolo Bonzini  error('HVF not available on this platform')
2098a19980eSPaolo Bonziniendif
2108a19980eSPaolo Bonziniif 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
2118a19980eSPaolo Bonzini  error('WHPX not available on this platform')
2128a19980eSPaolo Bonziniendif
2138a19980eSPaolo Bonziniif not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
2148a19980eSPaolo Bonzini  if 'CONFIG_XEN' in accelerators
2158a19980eSPaolo Bonzini    error('Xen PCI passthrough not available on this platform')
2168a19980eSPaolo Bonzini  else
2178a19980eSPaolo Bonzini    error('Xen PCI passthrough requested but Xen not enabled')
2188a19980eSPaolo Bonzini  endif
2198a19980eSPaolo Bonziniendif
220b4e312e9SPaolo Bonziniif not cocoa.found() and get_option('cocoa').enabled()
221b4e312e9SPaolo Bonzini  error('Cocoa not available on this platform')
222b4e312e9SPaolo Bonziniendif
223b4e312e9SPaolo Bonzini
2246ec0e15dSPaolo Bonzini################
2256ec0e15dSPaolo Bonzini# Dependencies #
2266ec0e15dSPaolo Bonzini################
2276ec0e15dSPaolo Bonzini
228215b0c2fSPaolo Bonzini# The path to glib.h is added to all compilation commands.  This was
229215b0c2fSPaolo Bonzini# grandfathered in from the QEMU Makefiles.
230215b0c2fSPaolo Bonziniadd_project_arguments(config_host['GLIB_CFLAGS'].split(),
231215b0c2fSPaolo Bonzini                      native: false, language: ['c', 'cpp', 'objc'])
232215b0c2fSPaolo Bonziniglib = declare_dependency(link_args: config_host['GLIB_LIBS'].split())
233a81df1b6SPaolo Bonzinigio = not_found
234a81df1b6SPaolo Bonziniif 'CONFIG_GIO' in config_host
235a81df1b6SPaolo Bonzini  gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
236a81df1b6SPaolo Bonzini                           link_args: config_host['GIO_LIBS'].split())
237a81df1b6SPaolo Bonziniendif
238a81df1b6SPaolo Bonzinilttng = not_found
239a81df1b6SPaolo Bonziniif 'CONFIG_TRACE_UST' in config_host
240a81df1b6SPaolo Bonzini  lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
241a81df1b6SPaolo Bonziniendif
242a81df1b6SPaolo Bonziniurcubp = not_found
243a81df1b6SPaolo Bonziniif 'CONFIG_TRACE_UST' in config_host
244a81df1b6SPaolo Bonzini  urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
245a81df1b6SPaolo Bonziniendif
24646859d93SDaniel P. Berrangégcrypt = not_found
24746859d93SDaniel P. Berrangéif 'CONFIG_GCRYPT' in config_host
24846859d93SDaniel P. Berrangé  gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
24946859d93SDaniel P. Berrangé                              link_args: config_host['GCRYPT_LIBS'].split())
25046859d93SDaniel P. Berrangéendif
251a81df1b6SPaolo Bonzininettle = not_found
252a81df1b6SPaolo Bonziniif 'CONFIG_NETTLE' in config_host
253a81df1b6SPaolo Bonzini  nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
254a81df1b6SPaolo Bonzini                              link_args: config_host['NETTLE_LIBS'].split())
255a81df1b6SPaolo Bonziniendif
256a81df1b6SPaolo Bonzinignutls = not_found
257a81df1b6SPaolo Bonziniif 'CONFIG_GNUTLS' in config_host
258a81df1b6SPaolo Bonzini  gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
259a81df1b6SPaolo Bonzini                              link_args: config_host['GNUTLS_LIBS'].split())
260a81df1b6SPaolo Bonziniendif
261b7612f45SPaolo Bonzinipixman = not_found
262b7612f45SPaolo Bonziniif have_system or have_tools
263b7612f45SPaolo Bonzini  pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
2641a94933fSPaolo Bonzini                      method: 'pkg-config', static: enable_static)
265b7612f45SPaolo Bonziniendif
2665e7fbd25SMarc-André Lureaupam = not_found
2675e7fbd25SMarc-André Lureauif 'CONFIG_AUTH_PAM' in config_host
2685e7fbd25SMarc-André Lureau  pam = cc.find_library('pam')
2695e7fbd25SMarc-André Lureauendif
2705e5733e5SMarc-André Lureaulibaio = cc.find_library('aio', required: false)
2711ffb3bbbSPaolo Bonzinizlib = dependency('zlib', required: true, static: enable_static)
2725e5733e5SMarc-André Lureaulinux_io_uring = not_found
2735e5733e5SMarc-André Lureauif 'CONFIG_LINUX_IO_URING' in config_host
2745e5733e5SMarc-André Lureau  linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
2755e5733e5SMarc-André Lureau                                      link_args: config_host['LINUX_IO_URING_LIBS'].split())
2765e5733e5SMarc-André Lureauendif
2775e5733e5SMarc-André Lureaulibxml2 = not_found
2785e5733e5SMarc-André Lureauif 'CONFIG_LIBXML2' in config_host
2795e5733e5SMarc-André Lureau  libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
2805e5733e5SMarc-André Lureau                               link_args: config_host['LIBXML2_LIBS'].split())
2815e5733e5SMarc-André Lureauendif
2825e5733e5SMarc-André Lureaulibnfs = not_found
2835e5733e5SMarc-André Lureauif 'CONFIG_LIBNFS' in config_host
2845e5733e5SMarc-André Lureau  libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
2855e5733e5SMarc-André Lureauendif
286ec0d5893SMarc-André Lureaulibattr = not_found
287ec0d5893SMarc-André Lureauif 'CONFIG_ATTR' in config_host
288ec0d5893SMarc-André Lureau  libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
289ec0d5893SMarc-André Lureauendif
2903f99cf57SPaolo Bonziniseccomp = not_found
2913f99cf57SPaolo Bonziniif 'CONFIG_SECCOMP' in config_host
2923f99cf57SPaolo Bonzini  seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
2933f99cf57SPaolo Bonzini                               link_args: config_host['SECCOMP_LIBS'].split())
2943f99cf57SPaolo Bonziniendif
2953f99cf57SPaolo Bonzinilibcap_ng = not_found
2963f99cf57SPaolo Bonziniif 'CONFIG_LIBCAP_NG' in config_host
2973f99cf57SPaolo Bonzini  libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
2983f99cf57SPaolo Bonziniendif
2991917ec6dSPaolo Bonziniif get_option('xkbcommon').auto() and not have_system and not have_tools
3001917ec6dSPaolo Bonzini  xkbcommon = not_found
3011917ec6dSPaolo Bonzinielse
3021917ec6dSPaolo Bonzini  xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
3031a94933fSPaolo Bonzini                         method: 'pkg-config', static: enable_static)
304ade60d4fSMarc-André Lureauendif
305cdaf0722SMarc-André Lureauvde = not_found
306cdaf0722SMarc-André Lureauif config_host.has_key('CONFIG_VDE')
307cdaf0722SMarc-André Lureau  vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
308cdaf0722SMarc-André Lureauendif
309478e943fSPaolo Bonzinipulse = not_found
310478e943fSPaolo Bonziniif 'CONFIG_LIBPULSE' in config_host
311478e943fSPaolo Bonzini  pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
312478e943fSPaolo Bonzini                             link_args: config_host['PULSE_LIBS'].split())
313478e943fSPaolo Bonziniendif
314478e943fSPaolo Bonzinialsa = not_found
315478e943fSPaolo Bonziniif 'CONFIG_ALSA' in config_host
316478e943fSPaolo Bonzini  alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
317478e943fSPaolo Bonzini                            link_args: config_host['ALSA_LIBS'].split())
318478e943fSPaolo Bonziniendif
319478e943fSPaolo Bonzinijack = not_found
320478e943fSPaolo Bonziniif 'CONFIG_LIBJACK' in config_host
321478e943fSPaolo Bonzini  jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
322478e943fSPaolo Bonziniendif
3232634733cSPaolo Bonzinispice = not_found
3242634733cSPaolo Bonziniif 'CONFIG_SPICE' in config_host
3252634733cSPaolo Bonzini  spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
3262634733cSPaolo Bonzini                             link_args: config_host['SPICE_LIBS'].split())
3272634733cSPaolo Bonziniendif
3285ee24e78SMarc-André Lureaurt = cc.find_library('rt', required: false)
329ccf7afa5SPaolo Bonzinilibdl = not_found
330ccf7afa5SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host
331ccf7afa5SPaolo Bonzini  libdl = cc.find_library('dl', required: true)
332ccf7afa5SPaolo Bonziniendif
33399650b62SPaolo Bonzinilibiscsi = not_found
33499650b62SPaolo Bonziniif 'CONFIG_LIBISCSI' in config_host
33599650b62SPaolo Bonzini  libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
33699650b62SPaolo Bonzini                                link_args: config_host['LIBISCSI_LIBS'].split())
33799650b62SPaolo Bonziniendif
3385e5733e5SMarc-André Lureauzstd = not_found
3395e5733e5SMarc-André Lureauif 'CONFIG_ZSTD' in config_host
3405e5733e5SMarc-André Lureau  zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
3415e5733e5SMarc-André Lureau                            link_args: config_host['ZSTD_LIBS'].split())
3425e5733e5SMarc-André Lureauendif
343ea458960SMarc-André Lureaugbm = not_found
344ea458960SMarc-André Lureauif 'CONFIG_GBM' in config_host
345ea458960SMarc-André Lureau  gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
346ea458960SMarc-André Lureau                           link_args: config_host['GBM_LIBS'].split())
347ea458960SMarc-André Lureauendif
348ea458960SMarc-André Lureauvirgl = not_found
349ea458960SMarc-André Lureauif 'CONFIG_VIRGL' in config_host
350ea458960SMarc-André Lureau  virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
351ea458960SMarc-André Lureau                             link_args: config_host['VIRGL_LIBS'].split())
352ea458960SMarc-André Lureauendif
3531d7bb6abSMarc-André Lureaucurl = not_found
3541d7bb6abSMarc-André Lureauif 'CONFIG_CURL' in config_host
3551d7bb6abSMarc-André Lureau  curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
3561d7bb6abSMarc-André Lureau                            link_args: config_host['CURL_LIBS'].split())
3571d7bb6abSMarc-André Lureauendif
358f15bff25SPaolo Bonzinilibudev = not_found
359f01496a3SPaolo Bonziniif targetos == 'linux' and (have_system or have_tools)
3606ec0e15dSPaolo Bonzini  libudev = dependency('libudev',
3616ec0e15dSPaolo Bonzini                       required: get_option('mpath').enabled(),
3626ec0e15dSPaolo Bonzini                       static: enable_static)
363f15bff25SPaolo Bonziniendif
3646ec0e15dSPaolo Bonzini
3656ec0e15dSPaolo Bonzinimpathpersist = not_found
3666ec0e15dSPaolo Bonzinimpathpersist_new_api = false
3676ec0e15dSPaolo Bonziniif targetos == 'linux' and have_tools and not get_option('mpath').disabled()
3686ec0e15dSPaolo Bonzini  mpath_test_source_new = '''
3696ec0e15dSPaolo Bonzini    #include <libudev.h>
3706ec0e15dSPaolo Bonzini    #include <mpath_persist.h>
3716ec0e15dSPaolo Bonzini    unsigned mpath_mx_alloc_len = 1024;
3726ec0e15dSPaolo Bonzini    int logsink;
3736ec0e15dSPaolo Bonzini    static struct config *multipath_conf;
3746ec0e15dSPaolo Bonzini    extern struct udev *udev;
3756ec0e15dSPaolo Bonzini    extern struct config *get_multipath_config(void);
3766ec0e15dSPaolo Bonzini    extern void put_multipath_config(struct config *conf);
3776ec0e15dSPaolo Bonzini    struct udev *udev;
3786ec0e15dSPaolo Bonzini    struct config *get_multipath_config(void) { return multipath_conf; }
3796ec0e15dSPaolo Bonzini    void put_multipath_config(struct config *conf) { }
3806ec0e15dSPaolo Bonzini    int main(void) {
3816ec0e15dSPaolo Bonzini        udev = udev_new();
3826ec0e15dSPaolo Bonzini        multipath_conf = mpath_lib_init();
3836ec0e15dSPaolo Bonzini        return 0;
3846ec0e15dSPaolo Bonzini    }'''
3856ec0e15dSPaolo Bonzini  mpath_test_source_old = '''
3866ec0e15dSPaolo Bonzini      #include <libudev.h>
3876ec0e15dSPaolo Bonzini      #include <mpath_persist.h>
3886ec0e15dSPaolo Bonzini      unsigned mpath_mx_alloc_len = 1024;
3896ec0e15dSPaolo Bonzini      int logsink;
3906ec0e15dSPaolo Bonzini      int main(void) {
3916ec0e15dSPaolo Bonzini          struct udev *udev = udev_new();
3926ec0e15dSPaolo Bonzini          mpath_lib_init(udev);
3936ec0e15dSPaolo Bonzini          return 0;
3946ec0e15dSPaolo Bonzini      }'''
39543b43a40SPaolo Bonzini  mpathlibs = [libudev]
39643b43a40SPaolo Bonzini  if enable_static
39743b43a40SPaolo Bonzini    mpathlibs += cc.find_library('devmapper',
3986ec0e15dSPaolo Bonzini                                   required: get_option('mpath'),
3996ec0e15dSPaolo Bonzini                                   static: enable_static)
40043b43a40SPaolo Bonzini  endif
40143b43a40SPaolo Bonzini  mpathlibs += cc.find_library('multipath',
4026ec0e15dSPaolo Bonzini                               required: get_option('mpath'),
4036ec0e15dSPaolo Bonzini                               static: enable_static)
40443b43a40SPaolo Bonzini  mpathlibs += cc.find_library('mpathpersist',
40543b43a40SPaolo Bonzini                               required: get_option('mpath'),
40643b43a40SPaolo Bonzini                               static: enable_static)
40743b43a40SPaolo Bonzini  foreach lib: mpathlibs
40843b43a40SPaolo Bonzini    if not lib.found()
40943b43a40SPaolo Bonzini      mpathlibs = []
41043b43a40SPaolo Bonzini      break
41143b43a40SPaolo Bonzini    endif
41243b43a40SPaolo Bonzini  endforeach
41343b43a40SPaolo Bonzini  if mpathlibs.length() > 0
4146ec0e15dSPaolo Bonzini    if cc.links(mpath_test_source_new, dependencies: mpathlibs)
4156ec0e15dSPaolo Bonzini      mpathpersist = declare_dependency(dependencies: mpathlibs)
4166ec0e15dSPaolo Bonzini      mpathpersist_new_api = true
4176ec0e15dSPaolo Bonzini    elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
4186ec0e15dSPaolo Bonzini      mpathpersist = declare_dependency(dependencies: mpathlibs)
4196ec0e15dSPaolo Bonzini    else
4206ec0e15dSPaolo Bonzini      if get_option('mpath').enabled()
4216ec0e15dSPaolo Bonzini        error('Cannot detect libmpathpersist API')
4226ec0e15dSPaolo Bonzini      else
4236ec0e15dSPaolo Bonzini        warning('Cannot detect libmpathpersist API, disabling')
4246ec0e15dSPaolo Bonzini      endif
4256ec0e15dSPaolo Bonzini    endif
4266ec0e15dSPaolo Bonzini  endif
4276ec0e15dSPaolo Bonziniendif
4286ec0e15dSPaolo Bonzini
4292634733cSPaolo Bonzinibrlapi = not_found
4302634733cSPaolo Bonziniif 'CONFIG_BRLAPI' in config_host
4312634733cSPaolo Bonzini  brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
4322634733cSPaolo Bonziniendif
43335be72baSPaolo Bonzini
434760e4327SPaolo Bonzinisdl = not_found
435760e4327SPaolo Bonziniif have_system
436363743daSYonggang Luo  sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
43735be72baSPaolo Bonzini  sdl_image = not_found
438760e4327SPaolo Bonziniendif
43935be72baSPaolo Bonziniif sdl.found()
44035be72baSPaolo Bonzini  # work around 2.0.8 bug
44135be72baSPaolo Bonzini  sdl = declare_dependency(compile_args: '-Wno-undef',
44235be72baSPaolo Bonzini                           dependencies: sdl)
4437161a433SVolker Rümelin  sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
4441a94933fSPaolo Bonzini                         method: 'pkg-config', static: enable_static)
44535be72baSPaolo Bonzinielse
44635be72baSPaolo Bonzini  if get_option('sdl_image').enabled()
447a8dc2aceSSergei Trofimovich    error('sdl-image required, but SDL was @0@'.format(
448a8dc2aceSSergei Trofimovich          get_option('sdl').disabled() ? 'disabled' : 'not found'))
4492634733cSPaolo Bonzini  endif
45035be72baSPaolo Bonzini  sdl_image = not_found
45135be72baSPaolo Bonziniendif
45235be72baSPaolo Bonzini
4535e5733e5SMarc-André Lureaurbd = not_found
4545e5733e5SMarc-André Lureauif 'CONFIG_RBD' in config_host
4555e5733e5SMarc-André Lureau  rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
4565e5733e5SMarc-André Lureauendif
4575e5733e5SMarc-André Lureauglusterfs = not_found
4585e5733e5SMarc-André Lureauif 'CONFIG_GLUSTERFS' in config_host
4595e5733e5SMarc-André Lureau  glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
4605e5733e5SMarc-André Lureau                                 link_args: config_host['GLUSTERFS_LIBS'].split())
4615e5733e5SMarc-André Lureauendif
4625e5733e5SMarc-André Lureaulibssh = not_found
4635e5733e5SMarc-André Lureauif 'CONFIG_LIBSSH' in config_host
4645e5733e5SMarc-André Lureau  libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
4655e5733e5SMarc-André Lureau                              link_args: config_host['LIBSSH_LIBS'].split())
4665e5733e5SMarc-André Lureauendif
4675e5733e5SMarc-André Lureaulibbzip2 = not_found
4685e5733e5SMarc-André Lureauif 'CONFIG_BZIP2' in config_host
4695e5733e5SMarc-André Lureau  libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
4705e5733e5SMarc-André Lureauendif
4715e5733e5SMarc-André Lureauliblzfse = not_found
4725e5733e5SMarc-André Lureauif 'CONFIG_LZFSE' in config_host
4735e5733e5SMarc-André Lureau  liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
4745e5733e5SMarc-André Lureauendif
475478e943fSPaolo Bonzinioss = not_found
476478e943fSPaolo Bonziniif 'CONFIG_AUDIO_OSS' in config_host
477478e943fSPaolo Bonzini  oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
478478e943fSPaolo Bonziniendif
479478e943fSPaolo Bonzinidsound = not_found
480478e943fSPaolo Bonziniif 'CONFIG_AUDIO_DSOUND' in config_host
481478e943fSPaolo Bonzini  dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
482478e943fSPaolo Bonziniendif
483478e943fSPaolo Bonzinicoreaudio = not_found
484478e943fSPaolo Bonziniif 'CONFIG_AUDIO_COREAUDIO' in config_host
485478e943fSPaolo Bonzini  coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
486478e943fSPaolo Bonziniendif
4872b1ccdf4SMarc-André Lureauopengl = not_found
4882b1ccdf4SMarc-André Lureauif 'CONFIG_OPENGL' in config_host
489de2d3005SPaolo Bonzini  opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
490de2d3005SPaolo Bonzini                              link_args: config_host['OPENGL_LIBS'].split())
4912b1ccdf4SMarc-André Lureauendif
4922b1ccdf4SMarc-André Lureaugtk = not_found
4932b1ccdf4SMarc-André Lureauif 'CONFIG_GTK' in config_host
4942b1ccdf4SMarc-André Lureau  gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
4952b1ccdf4SMarc-André Lureau                              link_args: config_host['GTK_LIBS'].split())
4962b1ccdf4SMarc-André Lureauendif
4972b1ccdf4SMarc-André Lureauvte = not_found
4982b1ccdf4SMarc-André Lureauif 'CONFIG_VTE' in config_host
4992b1ccdf4SMarc-André Lureau  vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
5002b1ccdf4SMarc-André Lureau                           link_args: config_host['VTE_LIBS'].split())
5012b1ccdf4SMarc-André Lureauendif
5022b1ccdf4SMarc-André Lureaux11 = not_found
5032b1ccdf4SMarc-André Lureauif 'CONFIG_X11' in config_host
5042b1ccdf4SMarc-André Lureau  x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
5052b1ccdf4SMarc-André Lureau                           link_args: config_host['X11_LIBS'].split())
5062b1ccdf4SMarc-André Lureauendif
5072b1ccdf4SMarc-André Lureaucurses = not_found
5082b1ccdf4SMarc-André Lureauif 'CONFIG_CURSES' in config_host
5092b1ccdf4SMarc-André Lureau  curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
5102b1ccdf4SMarc-André Lureau                              link_args: config_host['CURSES_LIBS'].split())
5112b1ccdf4SMarc-André Lureauendif
5122b1ccdf4SMarc-André Lureauiconv = not_found
5132b1ccdf4SMarc-André Lureauif 'CONFIG_ICONV' in config_host
5142b1ccdf4SMarc-André Lureau  iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
5152b1ccdf4SMarc-André Lureau                             link_args: config_host['ICONV_LIBS'].split())
5162b1ccdf4SMarc-André Lureauendif
517a0b93237SPaolo Bonzinivnc = not_found
5182b1ccdf4SMarc-André Lureaupng = not_found
5192b1ccdf4SMarc-André Lureaujpeg = not_found
5202b1ccdf4SMarc-André Lureausasl = not_found
521a0b93237SPaolo Bonziniif get_option('vnc').enabled()
522a0b93237SPaolo Bonzini  vnc = declare_dependency() # dummy dependency
523a0b93237SPaolo Bonzini  png = dependency('libpng', required: get_option('vnc_png'),
5241a94933fSPaolo Bonzini                   method: 'pkg-config', static: enable_static)
525a0b93237SPaolo Bonzini  jpeg = cc.find_library('jpeg', has_headers: ['jpeglib.h'],
526a0b93237SPaolo Bonzini                         required: get_option('vnc_jpeg'),
527a0b93237SPaolo Bonzini                         static: enable_static)
528a0b93237SPaolo Bonzini  sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
529a0b93237SPaolo Bonzini                         required: get_option('vnc_sasl'),
530a0b93237SPaolo Bonzini                         static: enable_static)
531a0b93237SPaolo Bonzini  if sasl.found()
532a0b93237SPaolo Bonzini    sasl = declare_dependency(dependencies: sasl,
533a0b93237SPaolo Bonzini                              compile_args: '-DSTRUCT_IOVEC_DEFINED')
534a0b93237SPaolo Bonzini  endif
5352b1ccdf4SMarc-André Lureauendif
536708eab42SMarc-André Lureausnappy = not_found
537708eab42SMarc-André Lureauif 'CONFIG_SNAPPY' in config_host
538708eab42SMarc-André Lureau  snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
539708eab42SMarc-André Lureauendif
540708eab42SMarc-André Lureaulzo = not_found
541708eab42SMarc-André Lureauif 'CONFIG_LZO' in config_host
542708eab42SMarc-André Lureau  lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
543708eab42SMarc-André Lureauendif
54455166230SMarc-André Lureaurdma = not_found
54555166230SMarc-André Lureauif 'CONFIG_RDMA' in config_host
54655166230SMarc-André Lureau  rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
54755166230SMarc-André Lureauendif
548ab318051SMarc-André Lureaunuma = not_found
549ab318051SMarc-André Lureauif 'CONFIG_NUMA' in config_host
550ab318051SMarc-André Lureau  numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
551ab318051SMarc-André Lureauendif
552582ea95fSMarc-André Lureauxen = not_found
553582ea95fSMarc-André Lureauif 'CONFIG_XEN_BACKEND' in config_host
554582ea95fSMarc-André Lureau  xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
555582ea95fSMarc-André Lureau                           link_args: config_host['XEN_LIBS'].split())
556582ea95fSMarc-André Lureauendif
55706677ce1SPaolo Bonzinicacard = not_found
55806677ce1SPaolo Bonziniif 'CONFIG_SMARTCARD' in config_host
55906677ce1SPaolo Bonzini  cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
56006677ce1SPaolo Bonzini                              link_args: config_host['SMARTCARD_LIBS'].split())
56106677ce1SPaolo Bonziniendif
5620a40bcb7SCésar Belleyu2f = not_found
5630a40bcb7SCésar Belleyif have_system
5640a40bcb7SCésar Belley  u2f = dependency('u2f-emu', required: get_option('u2f'),
5650a40bcb7SCésar Belley                   method: 'pkg-config',
5660a40bcb7SCésar Belley                   static: enable_static)
5670a40bcb7SCésar Belleyendif
56806677ce1SPaolo Bonziniusbredir = not_found
56906677ce1SPaolo Bonziniif 'CONFIG_USB_REDIR' in config_host
57006677ce1SPaolo Bonzini  usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
57106677ce1SPaolo Bonzini                                link_args: config_host['USB_REDIR_LIBS'].split())
57206677ce1SPaolo Bonziniendif
57306677ce1SPaolo Bonzinilibusb = not_found
57406677ce1SPaolo Bonziniif 'CONFIG_USB_LIBUSB' in config_host
57506677ce1SPaolo Bonzini  libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
57606677ce1SPaolo Bonzini                              link_args: config_host['LIBUSB_LIBS'].split())
57706677ce1SPaolo Bonziniendif
578c9322ab5SMarc-André Lureaulibpmem = not_found
579c9322ab5SMarc-André Lureauif 'CONFIG_LIBPMEM' in config_host
580c9322ab5SMarc-André Lureau  libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
581c9322ab5SMarc-André Lureau                               link_args: config_host['LIBPMEM_LIBS'].split())
582c9322ab5SMarc-André Lureauendif
583c7c91a74SBruce Rogerslibdaxctl = not_found
584c7c91a74SBruce Rogersif 'CONFIG_LIBDAXCTL' in config_host
585c7c91a74SBruce Rogers  libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
586c7c91a74SBruce Rogersendif
5878ce0a45fSMarc-André Lureautasn1 = not_found
5888ce0a45fSMarc-André Lureauif 'CONFIG_TASN1' in config_host
5898ce0a45fSMarc-André Lureau  tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
5908ce0a45fSMarc-André Lureau                             link_args: config_host['TASN1_LIBS'].split())
5918ce0a45fSMarc-André Lureauendif
592af04e89dSMarc-André Lureaukeyutils = dependency('libkeyutils', required: false,
593af04e89dSMarc-André Lureau                      method: 'pkg-config', static: enable_static)
594a81df1b6SPaolo Bonzini
5953909def8SMarc-André Lureauhas_gettid = cc.has_function('gettid')
5963909def8SMarc-André Lureau
597aa087962SPaolo Bonzini# Malloc tests
598aa087962SPaolo Bonzini
599aa087962SPaolo Bonzinimalloc = []
600aa087962SPaolo Bonziniif get_option('malloc') == 'system'
601aa087962SPaolo Bonzini  has_malloc_trim = \
602aa087962SPaolo Bonzini    not get_option('malloc_trim').disabled() and \
603aa087962SPaolo Bonzini    cc.links('''#include <malloc.h>
604aa087962SPaolo Bonzini                int main(void) { malloc_trim(0); return 0; }''')
605aa087962SPaolo Bonzinielse
606aa087962SPaolo Bonzini  has_malloc_trim = false
607aa087962SPaolo Bonzini  malloc = cc.find_library(get_option('malloc'), required: true)
608aa087962SPaolo Bonziniendif
609aa087962SPaolo Bonziniif not has_malloc_trim and get_option('malloc_trim').enabled()
610aa087962SPaolo Bonzini  if get_option('malloc') == 'system'
611aa087962SPaolo Bonzini    error('malloc_trim not available on this platform.')
612aa087962SPaolo Bonzini  else
613aa087962SPaolo Bonzini    error('malloc_trim not available with non-libc memory allocator')
614aa087962SPaolo Bonzini  endif
615aa087962SPaolo Bonziniendif
616aa087962SPaolo Bonzini
617*a0c9162cSPaolo Bonzini#################
618*a0c9162cSPaolo Bonzini# config-host.h #
619*a0c9162cSPaolo Bonzini#################
620859aef02SPaolo Bonzini
621b4e312e9SPaolo Bonziniconfig_host_data.set('CONFIG_COCOA', cocoa.found())
622f01496a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBUDEV', libudev.found())
6236ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH', mpathpersist.found())
6246ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
62535be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL', sdl.found())
62635be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
627a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC', vnc.found())
628a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
629a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_PNG', png.found())
630a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_SASL', sasl.found())
6314113f4cfSLaurent Vivierconfig_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
632af04e89dSMarc-André Lureauconfig_host_data.set('CONFIG_KEYUTILS', keyutils.found())
6333909def8SMarc-André Lureauconfig_host_data.set('CONFIG_GETTID', has_gettid)
634aa087962SPaolo Bonziniconfig_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
635859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
636859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
637859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
638859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
639859aef02SPaolo Bonzini
640765686d6SPaolo Bonziniignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
641859aef02SPaolo Bonziniarrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
642f4f5ed2cSPaolo Bonzinistrings = ['HOST_DSOSUF', 'CONFIG_IASL', 'bindir', 'prefix', 'qemu_confdir', 'qemu_datadir',
643859aef02SPaolo Bonzini           'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
644f4f5ed2cSPaolo Bonzini           'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath', 'sysconfdir']
645859aef02SPaolo Bonziniforeach k, v: config_host
646765686d6SPaolo Bonzini  if ignored.contains(k)
647765686d6SPaolo Bonzini    # do nothing
648765686d6SPaolo Bonzini  elif arrays.contains(k)
649859aef02SPaolo Bonzini    if v != ''
650859aef02SPaolo Bonzini      v = '"' + '", "'.join(v.split()) + '", '
651859aef02SPaolo Bonzini    endif
652859aef02SPaolo Bonzini    config_host_data.set(k, v)
653859aef02SPaolo Bonzini  elif k == 'ARCH'
654859aef02SPaolo Bonzini    config_host_data.set('HOST_' + v.to_upper(), 1)
655859aef02SPaolo Bonzini  elif strings.contains(k)
656859aef02SPaolo Bonzini    if not k.startswith('CONFIG_')
657859aef02SPaolo Bonzini      k = 'CONFIG_' + k.to_upper()
658859aef02SPaolo Bonzini    endif
659859aef02SPaolo Bonzini    config_host_data.set_quoted(k, v)
660859aef02SPaolo Bonzini  elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
661859aef02SPaolo Bonzini    config_host_data.set(k, v == 'y' ? 1 : v)
662859aef02SPaolo Bonzini  endif
663859aef02SPaolo Bonziniendforeach
664859aef02SPaolo Bonzini
665*a0c9162cSPaolo Bonzini########################
666*a0c9162cSPaolo Bonzini# Target configuration #
667*a0c9162cSPaolo Bonzini########################
668*a0c9162cSPaolo Bonzini
6692becc36aSPaolo Bonziniminikconf = find_program('scripts/minikconf.py')
67005512f55SPaolo Bonziniconfig_all = {}
671a98006bcSPaolo Bonziniconfig_all_devices = {}
672ca0fc784SPaolo Bonziniconfig_all_disas = {}
6732becc36aSPaolo Bonziniconfig_devices_mak_list = []
6742becc36aSPaolo Bonziniconfig_devices_h = {}
675859aef02SPaolo Bonziniconfig_target_h = {}
6762becc36aSPaolo Bonziniconfig_target_mak = {}
677ca0fc784SPaolo Bonzini
678ca0fc784SPaolo Bonzinidisassemblers = {
679ca0fc784SPaolo Bonzini  'alpha' : ['CONFIG_ALPHA_DIS'],
680ca0fc784SPaolo Bonzini  'arm' : ['CONFIG_ARM_DIS'],
681ca0fc784SPaolo Bonzini  'avr' : ['CONFIG_AVR_DIS'],
682ca0fc784SPaolo Bonzini  'cris' : ['CONFIG_CRIS_DIS'],
683ca0fc784SPaolo Bonzini  'hppa' : ['CONFIG_HPPA_DIS'],
684ca0fc784SPaolo Bonzini  'i386' : ['CONFIG_I386_DIS'],
685ca0fc784SPaolo Bonzini  'x86_64' : ['CONFIG_I386_DIS'],
686ca0fc784SPaolo Bonzini  'x32' : ['CONFIG_I386_DIS'],
687ca0fc784SPaolo Bonzini  'lm32' : ['CONFIG_LM32_DIS'],
688ca0fc784SPaolo Bonzini  'm68k' : ['CONFIG_M68K_DIS'],
689ca0fc784SPaolo Bonzini  'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
690ca0fc784SPaolo Bonzini  'mips' : ['CONFIG_MIPS_DIS'],
691ca0fc784SPaolo Bonzini  'moxie' : ['CONFIG_MOXIE_DIS'],
692ca0fc784SPaolo Bonzini  'nios2' : ['CONFIG_NIOS2_DIS'],
693ca0fc784SPaolo Bonzini  'or1k' : ['CONFIG_OPENRISC_DIS'],
694ca0fc784SPaolo Bonzini  'ppc' : ['CONFIG_PPC_DIS'],
695ca0fc784SPaolo Bonzini  'riscv' : ['CONFIG_RISCV_DIS'],
696ca0fc784SPaolo Bonzini  'rx' : ['CONFIG_RX_DIS'],
697ca0fc784SPaolo Bonzini  's390' : ['CONFIG_S390_DIS'],
698ca0fc784SPaolo Bonzini  'sh4' : ['CONFIG_SH4_DIS'],
699ca0fc784SPaolo Bonzini  'sparc' : ['CONFIG_SPARC_DIS'],
700ca0fc784SPaolo Bonzini  'xtensa' : ['CONFIG_XTENSA_DIS'],
701ca0fc784SPaolo Bonzini}
702ca0fc784SPaolo Bonziniif link_language == 'cpp'
703ca0fc784SPaolo Bonzini  disassemblers += {
704ca0fc784SPaolo Bonzini    'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
705ca0fc784SPaolo Bonzini    'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
706ca0fc784SPaolo Bonzini    'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
707ca0fc784SPaolo Bonzini  }
708ca0fc784SPaolo Bonziniendif
709ca0fc784SPaolo Bonzini
7102becc36aSPaolo Bonzinikconfig_external_symbols = [
7112becc36aSPaolo Bonzini  'CONFIG_KVM',
7122becc36aSPaolo Bonzini  'CONFIG_XEN',
7132becc36aSPaolo Bonzini  'CONFIG_TPM',
7142becc36aSPaolo Bonzini  'CONFIG_SPICE',
7152becc36aSPaolo Bonzini  'CONFIG_IVSHMEM',
7162becc36aSPaolo Bonzini  'CONFIG_OPENGL',
7172becc36aSPaolo Bonzini  'CONFIG_X11',
7182becc36aSPaolo Bonzini  'CONFIG_VHOST_USER',
71940bc0ca9SLaurent Vivier  'CONFIG_VHOST_VDPA',
7202becc36aSPaolo Bonzini  'CONFIG_VHOST_KERNEL',
7212becc36aSPaolo Bonzini  'CONFIG_VIRTFS',
7222becc36aSPaolo Bonzini  'CONFIG_LINUX',
7232becc36aSPaolo Bonzini  'CONFIG_PVRDMA',
7242becc36aSPaolo Bonzini]
725a9a74907SPaolo Bonziniignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
726ca0fc784SPaolo Bonzini
727fdb75aefSPaolo Bonzinidefault_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
728fdb75aefSPaolo Bonziniactual_target_dirs = []
729fbb4121dSPaolo Bonzinifdt_required = []
730a81df1b6SPaolo Bonziniforeach target : target_dirs
731765686d6SPaolo Bonzini  config_target = { 'TARGET_NAME': target.split('-')[0] }
732765686d6SPaolo Bonzini  if target.endswith('linux-user')
733fdb75aefSPaolo Bonzini    if targetos != 'linux'
734fdb75aefSPaolo Bonzini      if default_targets
735fdb75aefSPaolo Bonzini        continue
736fdb75aefSPaolo Bonzini      endif
737fdb75aefSPaolo Bonzini      error('Target @0@ is only available on a Linux host'.format(target))
738fdb75aefSPaolo Bonzini    endif
739765686d6SPaolo Bonzini    config_target += { 'CONFIG_LINUX_USER': 'y' }
740765686d6SPaolo Bonzini  elif target.endswith('bsd-user')
741fdb75aefSPaolo Bonzini    if 'CONFIG_BSD' not in config_host
742fdb75aefSPaolo Bonzini      if default_targets
743fdb75aefSPaolo Bonzini        continue
744fdb75aefSPaolo Bonzini      endif
745fdb75aefSPaolo Bonzini      error('Target @0@ is only available on a BSD host'.format(target))
746fdb75aefSPaolo Bonzini    endif
747765686d6SPaolo Bonzini    config_target += { 'CONFIG_BSD_USER': 'y' }
748765686d6SPaolo Bonzini  elif target.endswith('softmmu')
749765686d6SPaolo Bonzini    config_target += { 'CONFIG_SOFTMMU': 'y' }
750765686d6SPaolo Bonzini  endif
751765686d6SPaolo Bonzini  if target.endswith('-user')
752765686d6SPaolo Bonzini    config_target += {
753765686d6SPaolo Bonzini      'CONFIG_USER_ONLY': 'y',
754765686d6SPaolo Bonzini      'CONFIG_QEMU_INTERP_PREFIX':
755765686d6SPaolo Bonzini        config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
756765686d6SPaolo Bonzini    }
757765686d6SPaolo Bonzini  endif
758859aef02SPaolo Bonzini
7598a19980eSPaolo Bonzini  have_accel = false
7608a19980eSPaolo Bonzini  foreach sym: accelerators
7618a19980eSPaolo Bonzini    if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
7628a19980eSPaolo Bonzini      config_target += { sym: 'y' }
7638a19980eSPaolo Bonzini      config_all += { sym: 'y' }
7648a19980eSPaolo Bonzini      if sym == 'CONFIG_XEN' and have_xen_pci_passthrough
7658a19980eSPaolo Bonzini        config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
7668a19980eSPaolo Bonzini      endif
7678a19980eSPaolo Bonzini      have_accel = true
7688a19980eSPaolo Bonzini    endif
7698a19980eSPaolo Bonzini  endforeach
770fdb75aefSPaolo Bonzini  if not have_accel
771fdb75aefSPaolo Bonzini    if default_targets
772fdb75aefSPaolo Bonzini      continue
773fdb75aefSPaolo Bonzini    endif
774fdb75aefSPaolo Bonzini    error('No accelerator available for target @0@'.format(target))
775fdb75aefSPaolo Bonzini  endif
7768a19980eSPaolo Bonzini
777fdb75aefSPaolo Bonzini  actual_target_dirs += target
778765686d6SPaolo Bonzini  config_target += keyval.load('default-configs/targets' / target + '.mak')
779a9a74907SPaolo Bonzini  config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
780765686d6SPaolo Bonzini
781fbb4121dSPaolo Bonzini  if 'TARGET_NEED_FDT' in config_target
782fbb4121dSPaolo Bonzini    fdt_required += target
783fbb4121dSPaolo Bonzini  endif
784fbb4121dSPaolo Bonzini
785fa73168bSPaolo Bonzini  # Add default keys
786fa73168bSPaolo Bonzini  if 'TARGET_BASE_ARCH' not in config_target
787fa73168bSPaolo Bonzini    config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
788fa73168bSPaolo Bonzini  endif
789fa73168bSPaolo Bonzini  if 'TARGET_ABI_DIR' not in config_target
790fa73168bSPaolo Bonzini    config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
791fa73168bSPaolo Bonzini  endif
792859aef02SPaolo Bonzini
793ca0fc784SPaolo Bonzini  foreach k, v: disassemblers
794ca0fc784SPaolo Bonzini    if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
795ca0fc784SPaolo Bonzini      foreach sym: v
796ca0fc784SPaolo Bonzini        config_target += { sym: 'y' }
797ca0fc784SPaolo Bonzini        config_all_disas += { sym: 'y' }
798ca0fc784SPaolo Bonzini      endforeach
799ca0fc784SPaolo Bonzini    endif
800ca0fc784SPaolo Bonzini  endforeach
801ca0fc784SPaolo Bonzini
802859aef02SPaolo Bonzini  config_target_data = configuration_data()
803859aef02SPaolo Bonzini  foreach k, v: config_target
804859aef02SPaolo Bonzini    if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
805859aef02SPaolo Bonzini      # do nothing
806859aef02SPaolo Bonzini    elif ignored.contains(k)
807859aef02SPaolo Bonzini      # do nothing
808859aef02SPaolo Bonzini    elif k == 'TARGET_BASE_ARCH'
809a9a74907SPaolo Bonzini      # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
810a9a74907SPaolo Bonzini      # not used to select files from sourcesets.
811859aef02SPaolo Bonzini      config_target_data.set('TARGET_' + v.to_upper(), 1)
812765686d6SPaolo Bonzini    elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
813859aef02SPaolo Bonzini      config_target_data.set_quoted(k, v)
814859aef02SPaolo Bonzini    elif v == 'y'
815859aef02SPaolo Bonzini      config_target_data.set(k, 1)
816859aef02SPaolo Bonzini    else
817859aef02SPaolo Bonzini      config_target_data.set(k, v)
818859aef02SPaolo Bonzini    endif
819859aef02SPaolo Bonzini  endforeach
820859aef02SPaolo Bonzini  config_target_h += {target: configure_file(output: target + '-config-target.h',
821859aef02SPaolo Bonzini                                               configuration: config_target_data)}
8222becc36aSPaolo Bonzini
8232becc36aSPaolo Bonzini  if target.endswith('-softmmu')
8242becc36aSPaolo Bonzini    base_kconfig = []
8252becc36aSPaolo Bonzini    foreach sym : kconfig_external_symbols
826859aef02SPaolo Bonzini      if sym in config_target or sym in config_host
8272becc36aSPaolo Bonzini        base_kconfig += '@0@=y'.format(sym)
8282becc36aSPaolo Bonzini      endif
8292becc36aSPaolo Bonzini    endforeach
8302becc36aSPaolo Bonzini
8312becc36aSPaolo Bonzini    config_devices_mak = target + '-config-devices.mak'
8322becc36aSPaolo Bonzini    config_devices_mak = configure_file(
8331bb4cb1cSPaolo Bonzini      input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
8342becc36aSPaolo Bonzini      output: config_devices_mak,
8352becc36aSPaolo Bonzini      depfile: config_devices_mak + '.d',
8362becc36aSPaolo Bonzini      capture: true,
8372becc36aSPaolo Bonzini      command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
8382becc36aSPaolo Bonzini                config_devices_mak, '@DEPFILE@', '@INPUT@',
8392becc36aSPaolo Bonzini                base_kconfig])
840859aef02SPaolo Bonzini
841859aef02SPaolo Bonzini    config_devices_data = configuration_data()
842859aef02SPaolo Bonzini    config_devices = keyval.load(config_devices_mak)
843859aef02SPaolo Bonzini    foreach k, v: config_devices
844859aef02SPaolo Bonzini      config_devices_data.set(k, 1)
845859aef02SPaolo Bonzini    endforeach
8462becc36aSPaolo Bonzini    config_devices_mak_list += config_devices_mak
847859aef02SPaolo Bonzini    config_devices_h += {target: configure_file(output: target + '-config-devices.h',
848859aef02SPaolo Bonzini                                                configuration: config_devices_data)}
849859aef02SPaolo Bonzini    config_target += config_devices
850a98006bcSPaolo Bonzini    config_all_devices += config_devices
8512becc36aSPaolo Bonzini  endif
8522becc36aSPaolo Bonzini  config_target_mak += {target: config_target}
853a81df1b6SPaolo Bonziniendforeach
854fdb75aefSPaolo Bonzinitarget_dirs = actual_target_dirs
855a81df1b6SPaolo Bonzini
8562becc36aSPaolo Bonzini# This configuration is used to build files that are shared by
8572becc36aSPaolo Bonzini# multiple binaries, and then extracted out of the "common"
8582becc36aSPaolo Bonzini# static_library target.
8592becc36aSPaolo Bonzini#
8602becc36aSPaolo Bonzini# We do not use all_sources()/all_dependencies(), because it would
8612becc36aSPaolo Bonzini# build literally all source files, including devices only used by
8622becc36aSPaolo Bonzini# targets that are not built for this compilation.  The CONFIG_ALL
8632becc36aSPaolo Bonzini# pseudo symbol replaces it.
8642becc36aSPaolo Bonzini
86505512f55SPaolo Bonziniconfig_all += config_all_devices
8662becc36aSPaolo Bonziniconfig_all += config_host
8672becc36aSPaolo Bonziniconfig_all += config_all_disas
8682becc36aSPaolo Bonziniconfig_all += {
8692becc36aSPaolo Bonzini  'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
8702becc36aSPaolo Bonzini  'CONFIG_SOFTMMU': have_system,
8712becc36aSPaolo Bonzini  'CONFIG_USER_ONLY': have_user,
8722becc36aSPaolo Bonzini  'CONFIG_ALL': true,
8732becc36aSPaolo Bonzini}
8742becc36aSPaolo Bonzini
875*a0c9162cSPaolo Bonzini##############
876*a0c9162cSPaolo Bonzini# Submodules #
877*a0c9162cSPaolo Bonzini##############
8788b18cdbfSRichard Henderson
8798b18cdbfSRichard Hendersoncapstone = not_found
8808b18cdbfSRichard Hendersoncapstone_opt = get_option('capstone')
8818b18cdbfSRichard Hendersonif capstone_opt in ['enabled', 'auto', 'system']
8828b18cdbfSRichard Henderson  have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
883bcf36862SRichard Henderson  capstone = dependency('capstone', version: '>=4.0',
884bcf36862SRichard Henderson                        static: enable_static, method: 'pkg-config',
8858b18cdbfSRichard Henderson                        required: capstone_opt == 'system' or
8868b18cdbfSRichard Henderson                                  capstone_opt == 'enabled' and not have_internal)
8878b18cdbfSRichard Henderson  if capstone.found()
8888b18cdbfSRichard Henderson    capstone_opt = 'system'
8898b18cdbfSRichard Henderson  elif have_internal
8908b18cdbfSRichard Henderson    capstone_opt = 'internal'
8918b18cdbfSRichard Henderson  else
8928b18cdbfSRichard Henderson    capstone_opt = 'disabled'
8938b18cdbfSRichard Henderson  endif
8948b18cdbfSRichard Hendersonendif
8958b18cdbfSRichard Hendersonif capstone_opt == 'internal'
8968b18cdbfSRichard Henderson  capstone_data = configuration_data()
8978b18cdbfSRichard Henderson  capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
8988b18cdbfSRichard Henderson
8998b18cdbfSRichard Henderson  capstone_files = files(
9008b18cdbfSRichard Henderson    'capstone/cs.c',
9018b18cdbfSRichard Henderson    'capstone/MCInst.c',
9028b18cdbfSRichard Henderson    'capstone/MCInstrDesc.c',
9038b18cdbfSRichard Henderson    'capstone/MCRegisterInfo.c',
9048b18cdbfSRichard Henderson    'capstone/SStream.c',
9058b18cdbfSRichard Henderson    'capstone/utils.c'
9068b18cdbfSRichard Henderson  )
9078b18cdbfSRichard Henderson
9088b18cdbfSRichard Henderson  if 'CONFIG_ARM_DIS' in config_all_disas
9098b18cdbfSRichard Henderson    capstone_data.set('CAPSTONE_HAS_ARM', '1')
9108b18cdbfSRichard Henderson    capstone_files += files(
9118b18cdbfSRichard Henderson      'capstone/arch/ARM/ARMDisassembler.c',
9128b18cdbfSRichard Henderson      'capstone/arch/ARM/ARMInstPrinter.c',
9138b18cdbfSRichard Henderson      'capstone/arch/ARM/ARMMapping.c',
9148b18cdbfSRichard Henderson      'capstone/arch/ARM/ARMModule.c'
9158b18cdbfSRichard Henderson    )
9168b18cdbfSRichard Henderson  endif
9178b18cdbfSRichard Henderson
9188b18cdbfSRichard Henderson  # FIXME: This config entry currently depends on a c++ compiler.
9198b18cdbfSRichard Henderson  # Which is needed for building libvixl, but not for capstone.
9208b18cdbfSRichard Henderson  if 'CONFIG_ARM_A64_DIS' in config_all_disas
9218b18cdbfSRichard Henderson    capstone_data.set('CAPSTONE_HAS_ARM64', '1')
9228b18cdbfSRichard Henderson    capstone_files += files(
9238b18cdbfSRichard Henderson      'capstone/arch/AArch64/AArch64BaseInfo.c',
9248b18cdbfSRichard Henderson      'capstone/arch/AArch64/AArch64Disassembler.c',
9258b18cdbfSRichard Henderson      'capstone/arch/AArch64/AArch64InstPrinter.c',
9268b18cdbfSRichard Henderson      'capstone/arch/AArch64/AArch64Mapping.c',
9278b18cdbfSRichard Henderson      'capstone/arch/AArch64/AArch64Module.c'
9288b18cdbfSRichard Henderson    )
9298b18cdbfSRichard Henderson  endif
9308b18cdbfSRichard Henderson
9318b18cdbfSRichard Henderson  if 'CONFIG_PPC_DIS' in config_all_disas
9328b18cdbfSRichard Henderson    capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
9338b18cdbfSRichard Henderson    capstone_files += files(
9348b18cdbfSRichard Henderson      'capstone/arch/PowerPC/PPCDisassembler.c',
9358b18cdbfSRichard Henderson      'capstone/arch/PowerPC/PPCInstPrinter.c',
9368b18cdbfSRichard Henderson      'capstone/arch/PowerPC/PPCMapping.c',
9378b18cdbfSRichard Henderson      'capstone/arch/PowerPC/PPCModule.c'
9388b18cdbfSRichard Henderson    )
9398b18cdbfSRichard Henderson  endif
9408b18cdbfSRichard Henderson
9413d562845SRichard Henderson  if 'CONFIG_S390_DIS' in config_all_disas
9423d562845SRichard Henderson    capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
9433d562845SRichard Henderson    capstone_files += files(
9443d562845SRichard Henderson      'capstone/arch/SystemZ/SystemZDisassembler.c',
9453d562845SRichard Henderson      'capstone/arch/SystemZ/SystemZInstPrinter.c',
9463d562845SRichard Henderson      'capstone/arch/SystemZ/SystemZMapping.c',
9473d562845SRichard Henderson      'capstone/arch/SystemZ/SystemZModule.c',
9483d562845SRichard Henderson      'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
9493d562845SRichard Henderson    )
9503d562845SRichard Henderson  endif
9513d562845SRichard Henderson
9528b18cdbfSRichard Henderson  if 'CONFIG_I386_DIS' in config_all_disas
9538b18cdbfSRichard Henderson    capstone_data.set('CAPSTONE_HAS_X86', 1)
9548b18cdbfSRichard Henderson    capstone_files += files(
9558b18cdbfSRichard Henderson      'capstone/arch/X86/X86Disassembler.c',
9568b18cdbfSRichard Henderson      'capstone/arch/X86/X86DisassemblerDecoder.c',
9578b18cdbfSRichard Henderson      'capstone/arch/X86/X86ATTInstPrinter.c',
9588b18cdbfSRichard Henderson      'capstone/arch/X86/X86IntelInstPrinter.c',
959eef20e40SRichard Henderson      'capstone/arch/X86/X86InstPrinterCommon.c',
9608b18cdbfSRichard Henderson      'capstone/arch/X86/X86Mapping.c',
9618b18cdbfSRichard Henderson      'capstone/arch/X86/X86Module.c'
9628b18cdbfSRichard Henderson    )
9638b18cdbfSRichard Henderson  endif
9648b18cdbfSRichard Henderson
9658b18cdbfSRichard Henderson  configure_file(output: 'capstone-defs.h', configuration: capstone_data)
9668b18cdbfSRichard Henderson
9678b18cdbfSRichard Henderson  capstone_cargs = [
9688b18cdbfSRichard Henderson    # FIXME: There does not seem to be a way to completely replace the c_args
9698b18cdbfSRichard Henderson    # that come from add_project_arguments() -- we can only add to them.
9708b18cdbfSRichard Henderson    # So: disable all warnings with a big hammer.
9718b18cdbfSRichard Henderson    '-Wno-error', '-w',
9728b18cdbfSRichard Henderson
9738b18cdbfSRichard Henderson    # Include all configuration defines via a header file, which will wind up
9748b18cdbfSRichard Henderson    # as a dependency on the object file, and thus changes here will result
9758b18cdbfSRichard Henderson    # in a rebuild.
9768b18cdbfSRichard Henderson    '-include', 'capstone-defs.h'
9778b18cdbfSRichard Henderson  ]
9788b18cdbfSRichard Henderson
9798b18cdbfSRichard Henderson  libcapstone = static_library('capstone',
9808b18cdbfSRichard Henderson                               sources: capstone_files,
9818b18cdbfSRichard Henderson                               c_args: capstone_cargs,
9828b18cdbfSRichard Henderson                               include_directories: 'capstone/include')
9838b18cdbfSRichard Henderson  capstone = declare_dependency(link_with: libcapstone,
984eef20e40SRichard Henderson                                include_directories: 'capstone/include/capstone')
9858b18cdbfSRichard Hendersonendif
9864d34a86bSPaolo Bonzini
9874d34a86bSPaolo Bonzinislirp = not_found
9884d34a86bSPaolo Bonzinislirp_opt = 'disabled'
9894d34a86bSPaolo Bonziniif have_system
9904d34a86bSPaolo Bonzini  slirp_opt = get_option('slirp')
9914d34a86bSPaolo Bonzini  if slirp_opt in ['enabled', 'auto', 'system']
9924d34a86bSPaolo Bonzini    have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
9934d34a86bSPaolo Bonzini    slirp = dependency('slirp', static: enable_static,
9944d34a86bSPaolo Bonzini                       method: 'pkg-config',
9954d34a86bSPaolo Bonzini                       required: slirp_opt == 'system' or
9964d34a86bSPaolo Bonzini                                 slirp_opt == 'enabled' and not have_internal)
9974d34a86bSPaolo Bonzini    if slirp.found()
9984d34a86bSPaolo Bonzini      slirp_opt = 'system'
9994d34a86bSPaolo Bonzini    elif have_internal
10004d34a86bSPaolo Bonzini      slirp_opt = 'internal'
10014d34a86bSPaolo Bonzini    else
10024d34a86bSPaolo Bonzini      slirp_opt = 'disabled'
10034d34a86bSPaolo Bonzini    endif
10044d34a86bSPaolo Bonzini  endif
10054d34a86bSPaolo Bonzini  if slirp_opt == 'internal'
10064d34a86bSPaolo Bonzini    slirp_deps = []
10074d34a86bSPaolo Bonzini    if targetos == 'windows'
10084d34a86bSPaolo Bonzini      slirp_deps = cc.find_library('iphlpapi')
10094d34a86bSPaolo Bonzini    endif
10104d34a86bSPaolo Bonzini    slirp_conf = configuration_data()
10114d34a86bSPaolo Bonzini    slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
10124d34a86bSPaolo Bonzini    slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
10134d34a86bSPaolo Bonzini    slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
10144d34a86bSPaolo Bonzini    slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
10154d34a86bSPaolo Bonzini    slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
10164d34a86bSPaolo Bonzini    slirp_files = [
10174d34a86bSPaolo Bonzini      'slirp/src/arp_table.c',
10184d34a86bSPaolo Bonzini      'slirp/src/bootp.c',
10194d34a86bSPaolo Bonzini      'slirp/src/cksum.c',
10204d34a86bSPaolo Bonzini      'slirp/src/dhcpv6.c',
10214d34a86bSPaolo Bonzini      'slirp/src/dnssearch.c',
10224d34a86bSPaolo Bonzini      'slirp/src/if.c',
10234d34a86bSPaolo Bonzini      'slirp/src/ip6_icmp.c',
10244d34a86bSPaolo Bonzini      'slirp/src/ip6_input.c',
10254d34a86bSPaolo Bonzini      'slirp/src/ip6_output.c',
10264d34a86bSPaolo Bonzini      'slirp/src/ip_icmp.c',
10274d34a86bSPaolo Bonzini      'slirp/src/ip_input.c',
10284d34a86bSPaolo Bonzini      'slirp/src/ip_output.c',
10294d34a86bSPaolo Bonzini      'slirp/src/mbuf.c',
10304d34a86bSPaolo Bonzini      'slirp/src/misc.c',
10314d34a86bSPaolo Bonzini      'slirp/src/ncsi.c',
10324d34a86bSPaolo Bonzini      'slirp/src/ndp_table.c',
10334d34a86bSPaolo Bonzini      'slirp/src/sbuf.c',
10344d34a86bSPaolo Bonzini      'slirp/src/slirp.c',
10354d34a86bSPaolo Bonzini      'slirp/src/socket.c',
10364d34a86bSPaolo Bonzini      'slirp/src/state.c',
10374d34a86bSPaolo Bonzini      'slirp/src/stream.c',
10384d34a86bSPaolo Bonzini      'slirp/src/tcp_input.c',
10394d34a86bSPaolo Bonzini      'slirp/src/tcp_output.c',
10404d34a86bSPaolo Bonzini      'slirp/src/tcp_subr.c',
10414d34a86bSPaolo Bonzini      'slirp/src/tcp_timer.c',
10424d34a86bSPaolo Bonzini      'slirp/src/tftp.c',
10434d34a86bSPaolo Bonzini      'slirp/src/udp.c',
10444d34a86bSPaolo Bonzini      'slirp/src/udp6.c',
10454d34a86bSPaolo Bonzini      'slirp/src/util.c',
10464d34a86bSPaolo Bonzini      'slirp/src/version.c',
10474d34a86bSPaolo Bonzini      'slirp/src/vmstate.c',
10484d34a86bSPaolo Bonzini    ]
10494d34a86bSPaolo Bonzini
10504d34a86bSPaolo Bonzini    configure_file(
10514d34a86bSPaolo Bonzini      input : 'slirp/src/libslirp-version.h.in',
10524d34a86bSPaolo Bonzini      output : 'libslirp-version.h',
10534d34a86bSPaolo Bonzini      configuration: slirp_conf)
10544d34a86bSPaolo Bonzini
10554d34a86bSPaolo Bonzini    slirp_inc = include_directories('slirp', 'slirp/src')
10564d34a86bSPaolo Bonzini    libslirp = static_library('slirp',
10574d34a86bSPaolo Bonzini                              sources: slirp_files,
10584d34a86bSPaolo Bonzini                              c_args: slirp_cargs,
10594d34a86bSPaolo Bonzini                              include_directories: slirp_inc)
10604d34a86bSPaolo Bonzini    slirp = declare_dependency(link_with: libslirp,
10614d34a86bSPaolo Bonzini                               dependencies: slirp_deps,
10624d34a86bSPaolo Bonzini                               include_directories: slirp_inc)
10634d34a86bSPaolo Bonzini  endif
10644d34a86bSPaolo Bonziniendif
10654d34a86bSPaolo Bonzini
1066fbb4121dSPaolo Bonzinifdt = not_found
1067fbb4121dSPaolo Bonzinifdt_opt = get_option('fdt')
1068fbb4121dSPaolo Bonziniif have_system
1069fbb4121dSPaolo Bonzini  if fdt_opt in ['enabled', 'auto', 'system']
1070fbb4121dSPaolo Bonzini    have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
1071fbb4121dSPaolo Bonzini    fdt = cc.find_library('fdt', static: enable_static,
1072fbb4121dSPaolo Bonzini                          required: fdt_opt == 'system' or
1073fbb4121dSPaolo Bonzini                                    fdt_opt == 'enabled' and not have_internal)
1074fbb4121dSPaolo Bonzini    if fdt.found() and cc.links('''
1075fbb4121dSPaolo Bonzini       #include <libfdt.h>
1076fbb4121dSPaolo Bonzini       #include <libfdt_env.h>
1077fbb4121dSPaolo Bonzini       int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1078fbb4121dSPaolo Bonzini         dependencies: fdt)
1079fbb4121dSPaolo Bonzini      fdt_opt = 'system'
1080fbb4121dSPaolo Bonzini    elif have_internal
1081fbb4121dSPaolo Bonzini      fdt_opt = 'internal'
1082fbb4121dSPaolo Bonzini    else
1083fbb4121dSPaolo Bonzini      fdt_opt = 'disabled'
1084fbb4121dSPaolo Bonzini    endif
1085fbb4121dSPaolo Bonzini  endif
1086fbb4121dSPaolo Bonzini  if fdt_opt == 'internal'
1087fbb4121dSPaolo Bonzini    fdt_files = files(
1088fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt.c',
1089fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_ro.c',
1090fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_wip.c',
1091fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_sw.c',
1092fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_rw.c',
1093fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_strerror.c',
1094fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_empty_tree.c',
1095fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_addresses.c',
1096fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_overlay.c',
1097fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_check.c',
1098fbb4121dSPaolo Bonzini    )
1099fbb4121dSPaolo Bonzini
1100fbb4121dSPaolo Bonzini    fdt_inc = include_directories('dtc/libfdt')
1101fbb4121dSPaolo Bonzini    libfdt = static_library('fdt',
1102fbb4121dSPaolo Bonzini                            sources: fdt_files,
1103fbb4121dSPaolo Bonzini                            include_directories: fdt_inc)
1104fbb4121dSPaolo Bonzini    fdt = declare_dependency(link_with: libfdt,
1105fbb4121dSPaolo Bonzini                             include_directories: fdt_inc)
1106fbb4121dSPaolo Bonzini  endif
1107fbb4121dSPaolo Bonziniendif
1108fbb4121dSPaolo Bonziniif not fdt.found() and fdt_required.length() > 0
1109fbb4121dSPaolo Bonzini  error('fdt not available but required by targets ' + ', '.join(fdt_required))
1110fbb4121dSPaolo Bonziniendif
1111fbb4121dSPaolo Bonzini
11128b18cdbfSRichard Hendersonconfig_host_data.set('CONFIG_CAPSTONE', capstone.found())
1113fbb4121dSPaolo Bonziniconfig_host_data.set('CONFIG_FDT', fdt.found())
11144d34a86bSPaolo Bonziniconfig_host_data.set('CONFIG_SLIRP', slirp.found())
11158b18cdbfSRichard Henderson
1116*a0c9162cSPaolo Bonzini#####################
1117*a0c9162cSPaolo Bonzini# Generated sources #
1118*a0c9162cSPaolo Bonzini#####################
11198b18cdbfSRichard Henderson
1120*a0c9162cSPaolo Bonzinigenh += configure_file(output: 'config-host.h', configuration: config_host_data)
1121a81df1b6SPaolo Bonzini
11223f885659SMarc-André Lureauhxtool = find_program('scripts/hxtool')
1123650b5d54SMarc-André Lureaushaderinclude = find_program('scripts/shaderinclude.pl')
1124a81df1b6SPaolo Bonziniqapi_gen = find_program('scripts/qapi-gen.py')
1125a81df1b6SPaolo Bonziniqapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1126a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/commands.py',
1127a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/common.py',
1128a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/error.py',
1129a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/events.py',
1130a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/expr.py',
1131a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/gen.py',
1132a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/introspect.py',
1133a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/parser.py',
1134a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/schema.py',
1135a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/source.py',
1136a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/types.py',
1137a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/visit.py',
1138a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/common.py',
1139a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi-gen.py'
1140a81df1b6SPaolo Bonzini]
1141a81df1b6SPaolo Bonzini
1142a81df1b6SPaolo Bonzinitracetool = [
1143a81df1b6SPaolo Bonzini  python, files('scripts/tracetool.py'),
1144a81df1b6SPaolo Bonzini   '--backend=' + config_host['TRACE_BACKENDS']
1145a81df1b6SPaolo Bonzini]
1146a81df1b6SPaolo Bonzini
11472c273f32SMarc-André Lureauqemu_version_cmd = [find_program('scripts/qemu-version.sh'),
11482c273f32SMarc-André Lureau                    meson.current_source_dir(),
1149859aef02SPaolo Bonzini                    config_host['PKGVERSION'], meson.project_version()]
11502c273f32SMarc-André Lureauqemu_version = custom_target('qemu-version.h',
11512c273f32SMarc-André Lureau                             output: 'qemu-version.h',
11522c273f32SMarc-André Lureau                             command: qemu_version_cmd,
11532c273f32SMarc-André Lureau                             capture: true,
11542c273f32SMarc-André Lureau                             build_by_default: true,
11552c273f32SMarc-André Lureau                             build_always_stale: true)
11562c273f32SMarc-André Lureaugenh += qemu_version
11572c273f32SMarc-André Lureau
11583f885659SMarc-André Lureauhxdep = []
11593f885659SMarc-André Lureauhx_headers = [
11603f885659SMarc-André Lureau  ['qemu-options.hx', 'qemu-options.def'],
11613f885659SMarc-André Lureau  ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
11623f885659SMarc-André Lureau]
11633f885659SMarc-André Lureauif have_system
11643f885659SMarc-André Lureau  hx_headers += [
11653f885659SMarc-André Lureau    ['hmp-commands.hx', 'hmp-commands.h'],
11663f885659SMarc-André Lureau    ['hmp-commands-info.hx', 'hmp-commands-info.h'],
11673f885659SMarc-André Lureau  ]
11683f885659SMarc-André Lureauendif
11693f885659SMarc-André Lureauforeach d : hx_headers
1170b7c70bf2SMarc-André Lureau  hxdep += custom_target(d[1],
11713f885659SMarc-André Lureau                input: files(d[0]),
11723f885659SMarc-André Lureau                output: d[1],
11733f885659SMarc-André Lureau                capture: true,
11743f885659SMarc-André Lureau                build_by_default: true, # to be removed when added to a target
11753f885659SMarc-André Lureau                command: [hxtool, '-h', '@INPUT0@'])
11763f885659SMarc-André Lureauendforeach
11773f885659SMarc-André Lureaugenh += hxdep
11783f885659SMarc-André Lureau
1179eb937365SPeter MaydellSPHINX_ARGS = [config_host['SPHINX_BUILD'],
1180eb937365SPeter Maydell               '-Dversion=' + meson.project_version(),
1181eb937365SPeter Maydell               '-Drelease=' + config_host['PKGVERSION']]
1182eb937365SPeter Maydell
1183eb937365SPeter Maydellif get_option('werror')
1184eb937365SPeter Maydell  SPHINX_ARGS += [ '-W' ]
1185eb937365SPeter Maydellendif
1186eb937365SPeter Maydell
1187b3f4830aSPeter Maydellsphinx_extn_depends = [ meson.source_root() / 'docs/sphinx/depfile.py',
1188b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/hxtool.py',
1189b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/kerneldoc.py',
1190b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/kernellog.py',
1191b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/qapidoc.py',
1192b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/qmp_lexer.py',
1193b3f4830aSPeter Maydell                        qapi_gen_depends ]
1194b3f4830aSPeter Maydell
1195*a0c9162cSPaolo Bonzini###################
1196*a0c9162cSPaolo Bonzini# Collect sources #
1197*a0c9162cSPaolo Bonzini###################
1198a81df1b6SPaolo Bonzini
119955567891SPhilippe Mathieu-Daudéauthz_ss = ss.source_set()
12007e2b888fSPhilippe Mathieu-Daudéblockdev_ss = ss.source_set()
12017e2b888fSPhilippe Mathieu-Daudéblock_ss = ss.source_set()
12027e2b888fSPhilippe Mathieu-Daudébsd_user_ss = ss.source_set()
1203c2306d71SPhilippe Mathieu-Daudéchardev_ss = ss.source_set()
12047e2b888fSPhilippe Mathieu-Daudécommon_ss = ss.source_set()
12052389304aSPhilippe Mathieu-Daudécrypto_ss = ss.source_set()
1206f78536b1SPhilippe Mathieu-Daudéio_ss = ss.source_set()
12077e2b888fSPhilippe Mathieu-Daudélinux_user_ss = ss.source_set()
12087e2b888fSPhilippe Mathieu-Daudéqmp_ss = ss.source_set()
1209da33fc09SPhilippe Mathieu-Daudéqom_ss = ss.source_set()
12107e2b888fSPhilippe Mathieu-Daudésoftmmu_ss = ss.source_set()
12117e2b888fSPhilippe Mathieu-Daudéspecific_fuzz_ss = ss.source_set()
12127e2b888fSPhilippe Mathieu-Daudéspecific_ss = ss.source_set()
1213a81df1b6SPaolo Bonzinistub_ss = ss.source_set()
1214a81df1b6SPaolo Bonzinitrace_ss = ss.source_set()
12152becc36aSPaolo Bonziniuser_ss = ss.source_set()
12167e2b888fSPhilippe Mathieu-Daudéutil_ss = ss.source_set()
12172becc36aSPaolo Bonzini
12183154fee4SMarc-André Lureaumodules = {}
12192becc36aSPaolo Bonzinihw_arch = {}
12202becc36aSPaolo Bonzinitarget_arch = {}
12212becc36aSPaolo Bonzinitarget_softmmu_arch = {}
1222a81df1b6SPaolo Bonzini
1223a81df1b6SPaolo Bonzini###############
1224a81df1b6SPaolo Bonzini# Trace files #
1225a81df1b6SPaolo Bonzini###############
1226a81df1b6SPaolo Bonzini
1227c9322ab5SMarc-André Lureau# TODO: add each directory to the subdirs from its own meson.build, once
1228c9322ab5SMarc-André Lureau# we have those
1229a81df1b6SPaolo Bonzinitrace_events_subdirs = [
1230a81df1b6SPaolo Bonzini  'accel/kvm',
1231a81df1b6SPaolo Bonzini  'accel/tcg',
1232a81df1b6SPaolo Bonzini  'crypto',
1233a81df1b6SPaolo Bonzini  'monitor',
1234a81df1b6SPaolo Bonzini]
1235a81df1b6SPaolo Bonziniif have_user
1236a81df1b6SPaolo Bonzini  trace_events_subdirs += [ 'linux-user' ]
1237a81df1b6SPaolo Bonziniendif
1238a81df1b6SPaolo Bonziniif have_block
1239a81df1b6SPaolo Bonzini  trace_events_subdirs += [
1240a81df1b6SPaolo Bonzini    'authz',
1241a81df1b6SPaolo Bonzini    'block',
1242a81df1b6SPaolo Bonzini    'io',
1243a81df1b6SPaolo Bonzini    'nbd',
1244a81df1b6SPaolo Bonzini    'scsi',
1245a81df1b6SPaolo Bonzini  ]
1246a81df1b6SPaolo Bonziniendif
1247a81df1b6SPaolo Bonziniif have_system
1248a81df1b6SPaolo Bonzini  trace_events_subdirs += [
1249a81df1b6SPaolo Bonzini    'audio',
1250a81df1b6SPaolo Bonzini    'backends',
1251a81df1b6SPaolo Bonzini    'backends/tpm',
1252a81df1b6SPaolo Bonzini    'chardev',
1253a81df1b6SPaolo Bonzini    'hw/9pfs',
1254a81df1b6SPaolo Bonzini    'hw/acpi',
1255a81df1b6SPaolo Bonzini    'hw/alpha',
1256a81df1b6SPaolo Bonzini    'hw/arm',
1257a81df1b6SPaolo Bonzini    'hw/audio',
1258a81df1b6SPaolo Bonzini    'hw/block',
1259a81df1b6SPaolo Bonzini    'hw/block/dataplane',
1260a81df1b6SPaolo Bonzini    'hw/char',
1261a81df1b6SPaolo Bonzini    'hw/display',
1262a81df1b6SPaolo Bonzini    'hw/dma',
1263a81df1b6SPaolo Bonzini    'hw/hppa',
1264a81df1b6SPaolo Bonzini    'hw/hyperv',
1265a81df1b6SPaolo Bonzini    'hw/i2c',
1266a81df1b6SPaolo Bonzini    'hw/i386',
1267a81df1b6SPaolo Bonzini    'hw/i386/xen',
1268a81df1b6SPaolo Bonzini    'hw/ide',
1269a81df1b6SPaolo Bonzini    'hw/input',
1270a81df1b6SPaolo Bonzini    'hw/intc',
1271a81df1b6SPaolo Bonzini    'hw/isa',
1272a81df1b6SPaolo Bonzini    'hw/mem',
1273a81df1b6SPaolo Bonzini    'hw/mips',
1274a81df1b6SPaolo Bonzini    'hw/misc',
1275a81df1b6SPaolo Bonzini    'hw/misc/macio',
1276a81df1b6SPaolo Bonzini    'hw/net',
1277a81df1b6SPaolo Bonzini    'hw/nvram',
1278a81df1b6SPaolo Bonzini    'hw/pci',
1279a81df1b6SPaolo Bonzini    'hw/pci-host',
1280a81df1b6SPaolo Bonzini    'hw/ppc',
1281a81df1b6SPaolo Bonzini    'hw/rdma',
1282a81df1b6SPaolo Bonzini    'hw/rdma/vmw',
1283a81df1b6SPaolo Bonzini    'hw/rtc',
1284a81df1b6SPaolo Bonzini    'hw/s390x',
1285a81df1b6SPaolo Bonzini    'hw/scsi',
1286a81df1b6SPaolo Bonzini    'hw/sd',
1287a81df1b6SPaolo Bonzini    'hw/sparc',
1288a81df1b6SPaolo Bonzini    'hw/sparc64',
1289a81df1b6SPaolo Bonzini    'hw/ssi',
1290a81df1b6SPaolo Bonzini    'hw/timer',
1291a81df1b6SPaolo Bonzini    'hw/tpm',
1292a81df1b6SPaolo Bonzini    'hw/usb',
1293a81df1b6SPaolo Bonzini    'hw/vfio',
1294a81df1b6SPaolo Bonzini    'hw/virtio',
1295a81df1b6SPaolo Bonzini    'hw/watchdog',
1296a81df1b6SPaolo Bonzini    'hw/xen',
1297a81df1b6SPaolo Bonzini    'hw/gpio',
1298a81df1b6SPaolo Bonzini    'migration',
1299a81df1b6SPaolo Bonzini    'net',
13008b7a5507SPhilippe Mathieu-Daudé    'softmmu',
1301a81df1b6SPaolo Bonzini    'ui',
1302a81df1b6SPaolo Bonzini  ]
1303a81df1b6SPaolo Bonziniendif
1304a81df1b6SPaolo Bonzinitrace_events_subdirs += [
1305a81df1b6SPaolo Bonzini  'hw/core',
1306a81df1b6SPaolo Bonzini  'qapi',
1307a81df1b6SPaolo Bonzini  'qom',
1308a81df1b6SPaolo Bonzini  'target/arm',
1309a81df1b6SPaolo Bonzini  'target/hppa',
1310a81df1b6SPaolo Bonzini  'target/i386',
1311a81df1b6SPaolo Bonzini  'target/mips',
1312a81df1b6SPaolo Bonzini  'target/ppc',
1313a81df1b6SPaolo Bonzini  'target/riscv',
1314a81df1b6SPaolo Bonzini  'target/s390x',
1315a81df1b6SPaolo Bonzini  'target/sparc',
1316a81df1b6SPaolo Bonzini  'util',
1317a81df1b6SPaolo Bonzini]
1318a81df1b6SPaolo Bonzini
1319a81df1b6SPaolo Bonzinisubdir('qapi')
1320a81df1b6SPaolo Bonzinisubdir('qobject')
1321a81df1b6SPaolo Bonzinisubdir('stubs')
1322a81df1b6SPaolo Bonzinisubdir('trace')
1323a81df1b6SPaolo Bonzinisubdir('util')
13245582c58fSMarc-André Lureausubdir('qom')
13255582c58fSMarc-André Lureausubdir('authz')
1326a81df1b6SPaolo Bonzinisubdir('crypto')
13272d78b56eSMarc-André Lureausubdir('ui')
1328a81df1b6SPaolo Bonzini
13293154fee4SMarc-André Lureau
13303154fee4SMarc-André Lureauif enable_modules
13313154fee4SMarc-André Lureau  libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
13323154fee4SMarc-André Lureau  modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
13333154fee4SMarc-André Lureauendif
13343154fee4SMarc-André Lureau
13352becc36aSPaolo Bonzinistub_ss = stub_ss.apply(config_all, strict: false)
1336a81df1b6SPaolo Bonzini
1337a81df1b6SPaolo Bonziniutil_ss.add_all(trace_ss)
13382becc36aSPaolo Bonziniutil_ss = util_ss.apply(config_all, strict: false)
1339a81df1b6SPaolo Bonzinilibqemuutil = static_library('qemuutil',
1340a81df1b6SPaolo Bonzini                             sources: util_ss.sources() + stub_ss.sources() + genh,
1341aa087962SPaolo Bonzini                             dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
1342a81df1b6SPaolo Bonziniqemuutil = declare_dependency(link_with: libqemuutil,
134304c6f1e7SMarc-André Lureau                              sources: genh + version_res)
1344a81df1b6SPaolo Bonzini
1345abff1abfSPaolo Bonzinidecodetree = generator(find_program('scripts/decodetree.py'),
1346abff1abfSPaolo Bonzini                       output: 'decode-@BASENAME@.c.inc',
1347abff1abfSPaolo Bonzini                       arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1348abff1abfSPaolo Bonzini
1349478e943fSPaolo Bonzinisubdir('audio')
13507fcfd456SMarc-André Lureausubdir('io')
1351848e8ff6SMarc-André Lureausubdir('chardev')
1352ec0d5893SMarc-André Lureausubdir('fsdev')
1353abff1abfSPaolo Bonzinisubdir('libdecnumber')
1354d3b18480SMarc-André Lureausubdir('target')
1355708eab42SMarc-André Lureausubdir('dump')
1356ec0d5893SMarc-André Lureau
13575e5733e5SMarc-André Lureaublock_ss.add(files(
13585e5733e5SMarc-André Lureau  'block.c',
135956ee8626SKevin Wolf  'blockdev-nbd.c',
13605e5733e5SMarc-André Lureau  'blockjob.c',
13615e5733e5SMarc-André Lureau  'job.c',
13625e5733e5SMarc-André Lureau  'qemu-io-cmds.c',
13635e5733e5SMarc-André Lureau))
13645e5733e5SMarc-André Lureaublock_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
13655e5733e5SMarc-André Lureau
13665e5733e5SMarc-André Lureausubdir('nbd')
13675e5733e5SMarc-André Lureausubdir('scsi')
13685e5733e5SMarc-André Lureausubdir('block')
13695e5733e5SMarc-André Lureau
13704a96337dSPaolo Bonziniblockdev_ss.add(files(
13714a96337dSPaolo Bonzini  'blockdev.c',
13724a96337dSPaolo Bonzini  'iothread.c',
13734a96337dSPaolo Bonzini  'job-qmp.c',
13744a96337dSPaolo Bonzini))
13754a96337dSPaolo Bonzini
13764a96337dSPaolo Bonzini# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
13774a96337dSPaolo Bonzini# os-win32.c does not
13784a96337dSPaolo Bonziniblockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
13794a96337dSPaolo Bonzinisoftmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
13804a96337dSPaolo Bonzinisoftmmu_ss.add_all(blockdev_ss)
13814a96337dSPaolo Bonzini
13824a96337dSPaolo Bonzinicommon_ss.add(files('cpus-common.c'))
13834a96337dSPaolo Bonzini
13845d3ea0e1SPaolo Bonzinisubdir('softmmu')
1385c9322ab5SMarc-André Lureau
1386f343346bSRichard Hendersoncommon_ss.add(capstone)
1387d9f24bf5SPaolo Bonzinispecific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
1388c9322ab5SMarc-André Lureauspecific_ss.add(files('exec-vary.c'))
1389c9322ab5SMarc-André Lureauspecific_ss.add(when: 'CONFIG_TCG', if_true: files(
1390c9322ab5SMarc-André Lureau  'fpu/softfloat.c',
1391c9322ab5SMarc-André Lureau  'tcg/optimize.c',
1392c9322ab5SMarc-André Lureau  'tcg/tcg-common.c',
1393c9322ab5SMarc-André Lureau  'tcg/tcg-op-gvec.c',
1394c9322ab5SMarc-André Lureau  'tcg/tcg-op-vec.c',
1395c9322ab5SMarc-André Lureau  'tcg/tcg-op.c',
1396c9322ab5SMarc-André Lureau  'tcg/tcg.c',
1397c9322ab5SMarc-André Lureau))
1398c9322ab5SMarc-André Lureauspecific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1399c9322ab5SMarc-André Lureau
1400ab318051SMarc-André Lureausubdir('backends')
1401c574e161SMarc-André Lureausubdir('disas')
140255166230SMarc-André Lureausubdir('migration')
1403ff219dcaSPaolo Bonzinisubdir('monitor')
1404cdaf0722SMarc-André Lureausubdir('net')
140517ef2af6SMarc-André Lureausubdir('replay')
1406582ea95fSMarc-André Lureausubdir('hw')
14071a82878aSMarc-André Lureausubdir('accel')
1408f556b4a1SPaolo Bonzinisubdir('plugins')
1409b309c321SMarc-André Lureausubdir('bsd-user')
14103a30446aSMarc-André Lureausubdir('linux-user')
14113a30446aSMarc-André Lureau
1412b309c321SMarc-André Lureaubsd_user_ss.add(files('gdbstub.c'))
1413b309c321SMarc-André Lureauspecific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1414b309c321SMarc-André Lureau
14153a30446aSMarc-André Lureaulinux_user_ss.add(files('gdbstub.c', 'thunk.c'))
14163a30446aSMarc-André Lureauspecific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
14175d3ea0e1SPaolo Bonzini
1418a2ce7dbdSPaolo Bonzini# needed for fuzzing binaries
1419a2ce7dbdSPaolo Bonzinisubdir('tests/qtest/libqos')
142064ed6f92SPaolo Bonzinisubdir('tests/qtest/fuzz')
1421a2ce7dbdSPaolo Bonzini
1422*a0c9162cSPaolo Bonzini########################
1423*a0c9162cSPaolo Bonzini# Library dependencies #
1424*a0c9162cSPaolo Bonzini########################
1425*a0c9162cSPaolo Bonzini
14263154fee4SMarc-André Lureaublock_mods = []
14273154fee4SMarc-André Lureausoftmmu_mods = []
14283154fee4SMarc-André Lureauforeach d, list : modules
14293154fee4SMarc-André Lureau  foreach m, module_ss : list
14303154fee4SMarc-André Lureau    if enable_modules and targetos != 'windows'
14313e292c51SGerd Hoffmann      module_ss = module_ss.apply(config_all, strict: false)
14323154fee4SMarc-André Lureau      sl = static_library(d + '-' + m, [genh, module_ss.sources()],
14333154fee4SMarc-André Lureau                          dependencies: [modulecommon, module_ss.dependencies()], pic: true)
14343154fee4SMarc-André Lureau      if d == 'block'
14353154fee4SMarc-André Lureau        block_mods += sl
14363154fee4SMarc-André Lureau      else
14373154fee4SMarc-André Lureau        softmmu_mods += sl
14383154fee4SMarc-André Lureau      endif
14393154fee4SMarc-André Lureau    else
14403154fee4SMarc-André Lureau      if d == 'block'
14413154fee4SMarc-André Lureau        block_ss.add_all(module_ss)
14423154fee4SMarc-André Lureau      else
14433154fee4SMarc-André Lureau        softmmu_ss.add_all(module_ss)
14443154fee4SMarc-André Lureau      endif
14453154fee4SMarc-André Lureau    endif
14463154fee4SMarc-André Lureau  endforeach
14473154fee4SMarc-André Lureauendforeach
14483154fee4SMarc-André Lureau
14493154fee4SMarc-André Lureaunm = find_program('nm')
1450604f3e4eSYonggang Luoundefsym = find_program('scripts/undefsym.py')
14513154fee4SMarc-André Lureaublock_syms = custom_target('block.syms', output: 'block.syms',
14523154fee4SMarc-André Lureau                             input: [libqemuutil, block_mods],
14533154fee4SMarc-André Lureau                             capture: true,
14543154fee4SMarc-André Lureau                             command: [undefsym, nm, '@INPUT@'])
14553154fee4SMarc-André Lureauqemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
14563154fee4SMarc-André Lureau                             input: [libqemuutil, softmmu_mods],
14573154fee4SMarc-André Lureau                             capture: true,
14583154fee4SMarc-André Lureau                             command: [undefsym, nm, '@INPUT@'])
14593154fee4SMarc-André Lureau
1460da33fc09SPhilippe Mathieu-Daudéqom_ss = qom_ss.apply(config_host, strict: false)
1461da33fc09SPhilippe Mathieu-Daudélibqom = static_library('qom', qom_ss.sources() + genh,
1462da33fc09SPhilippe Mathieu-Daudé                        dependencies: [qom_ss.dependencies()],
1463da33fc09SPhilippe Mathieu-Daudé                        name_suffix: 'fa')
1464da33fc09SPhilippe Mathieu-Daudé
1465da33fc09SPhilippe Mathieu-Daudéqom = declare_dependency(link_whole: libqom)
1466da33fc09SPhilippe Mathieu-Daudé
146755567891SPhilippe Mathieu-Daudéauthz_ss = authz_ss.apply(config_host, strict: false)
146855567891SPhilippe Mathieu-Daudélibauthz = static_library('authz', authz_ss.sources() + genh,
146955567891SPhilippe Mathieu-Daudé                          dependencies: [authz_ss.dependencies()],
147055567891SPhilippe Mathieu-Daudé                          name_suffix: 'fa',
147155567891SPhilippe Mathieu-Daudé                          build_by_default: false)
147255567891SPhilippe Mathieu-Daudé
147355567891SPhilippe Mathieu-Daudéauthz = declare_dependency(link_whole: libauthz,
147455567891SPhilippe Mathieu-Daudé                           dependencies: qom)
147555567891SPhilippe Mathieu-Daudé
14762389304aSPhilippe Mathieu-Daudécrypto_ss = crypto_ss.apply(config_host, strict: false)
14772389304aSPhilippe Mathieu-Daudélibcrypto = static_library('crypto', crypto_ss.sources() + genh,
14782389304aSPhilippe Mathieu-Daudé                           dependencies: [crypto_ss.dependencies()],
14792389304aSPhilippe Mathieu-Daudé                           name_suffix: 'fa',
14802389304aSPhilippe Mathieu-Daudé                           build_by_default: false)
14812389304aSPhilippe Mathieu-Daudé
14822389304aSPhilippe Mathieu-Daudécrypto = declare_dependency(link_whole: libcrypto,
14832389304aSPhilippe Mathieu-Daudé                            dependencies: [authz, qom])
14842389304aSPhilippe Mathieu-Daudé
1485f78536b1SPhilippe Mathieu-Daudéio_ss = io_ss.apply(config_host, strict: false)
1486f78536b1SPhilippe Mathieu-Daudélibio = static_library('io', io_ss.sources() + genh,
1487f78536b1SPhilippe Mathieu-Daudé                       dependencies: [io_ss.dependencies()],
1488f78536b1SPhilippe Mathieu-Daudé                       link_with: libqemuutil,
1489f78536b1SPhilippe Mathieu-Daudé                       name_suffix: 'fa',
1490f78536b1SPhilippe Mathieu-Daudé                       build_by_default: false)
1491f78536b1SPhilippe Mathieu-Daudé
1492f78536b1SPhilippe Mathieu-Daudéio = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
1493f78536b1SPhilippe Mathieu-Daudé
14947e6edef3SPhilippe Mathieu-Daudélibmigration = static_library('migration', sources: migration_files + genh,
14957e6edef3SPhilippe Mathieu-Daudé                              name_suffix: 'fa',
14967e6edef3SPhilippe Mathieu-Daudé                              build_by_default: false)
14977e6edef3SPhilippe Mathieu-Daudémigration = declare_dependency(link_with: libmigration,
14987e6edef3SPhilippe Mathieu-Daudé                               dependencies: [zlib, qom, io])
14997e6edef3SPhilippe Mathieu-Daudésoftmmu_ss.add(migration)
15007e6edef3SPhilippe Mathieu-Daudé
15015e5733e5SMarc-André Lureaublock_ss = block_ss.apply(config_host, strict: false)
15025e5733e5SMarc-André Lureaulibblock = static_library('block', block_ss.sources() + genh,
15035e5733e5SMarc-André Lureau                          dependencies: block_ss.dependencies(),
15045e5733e5SMarc-André Lureau                          link_depends: block_syms,
15055e5733e5SMarc-André Lureau                          name_suffix: 'fa',
15065e5733e5SMarc-André Lureau                          build_by_default: false)
15075e5733e5SMarc-André Lureau
15085e5733e5SMarc-André Lureaublock = declare_dependency(link_whole: [libblock],
1509b7c70bf2SMarc-André Lureau                           link_args: '@block.syms',
1510b7c70bf2SMarc-André Lureau                           dependencies: [crypto, io])
15115e5733e5SMarc-André Lureau
1512ff219dcaSPaolo Bonziniqmp_ss = qmp_ss.apply(config_host, strict: false)
1513ff219dcaSPaolo Bonzinilibqmp = static_library('qmp', qmp_ss.sources() + genh,
1514ff219dcaSPaolo Bonzini                        dependencies: qmp_ss.dependencies(),
1515ff219dcaSPaolo Bonzini                        name_suffix: 'fa',
1516ff219dcaSPaolo Bonzini                        build_by_default: false)
1517ff219dcaSPaolo Bonzini
1518ff219dcaSPaolo Bonziniqmp = declare_dependency(link_whole: [libqmp])
1519ff219dcaSPaolo Bonzini
1520c2306d71SPhilippe Mathieu-Daudélibchardev = static_library('chardev', chardev_ss.sources() + genh,
1521c2306d71SPhilippe Mathieu-Daudé                            name_suffix: 'fa',
1522c2306d71SPhilippe Mathieu-Daudé                            build_by_default: false)
1523c2306d71SPhilippe Mathieu-Daudé
1524c2306d71SPhilippe Mathieu-Daudéchardev = declare_dependency(link_whole: libchardev)
1525c2306d71SPhilippe Mathieu-Daudé
1526e28ab096SPhilippe Mathieu-Daudélibhwcore = static_library('hwcore', sources: hwcore_files + genh,
1527e28ab096SPhilippe Mathieu-Daudé                           name_suffix: 'fa',
1528e28ab096SPhilippe Mathieu-Daudé                           build_by_default: false)
1529e28ab096SPhilippe Mathieu-Daudéhwcore = declare_dependency(link_whole: libhwcore)
1530e28ab096SPhilippe Mathieu-Daudécommon_ss.add(hwcore)
1531e28ab096SPhilippe Mathieu-Daudé
1532064f8ee7SPhilippe Mathieu-Daudé###########
1533064f8ee7SPhilippe Mathieu-Daudé# Targets #
1534064f8ee7SPhilippe Mathieu-Daudé###########
1535064f8ee7SPhilippe Mathieu-Daudé
15363154fee4SMarc-André Lureauforeach m : block_mods + softmmu_mods
15373154fee4SMarc-André Lureau  shared_module(m.name(),
15383154fee4SMarc-André Lureau                name_prefix: '',
15393154fee4SMarc-André Lureau                link_whole: m,
15403154fee4SMarc-André Lureau                install: true,
15413154fee4SMarc-André Lureau                install_dir: config_host['qemu_moddir'])
15423154fee4SMarc-André Lureauendforeach
15433154fee4SMarc-André Lureau
154464ed6f92SPaolo Bonzinisoftmmu_ss.add(authz, block, chardev, crypto, io, qmp)
154564ed6f92SPaolo Bonzinicommon_ss.add(qom, qemuutil)
154664ed6f92SPaolo Bonzini
154764ed6f92SPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
15482becc36aSPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
15492becc36aSPaolo Bonzini
15502becc36aSPaolo Bonzinicommon_all = common_ss.apply(config_all, strict: false)
15512becc36aSPaolo Bonzinicommon_all = static_library('common',
15522becc36aSPaolo Bonzini                            build_by_default: false,
15532becc36aSPaolo Bonzini                            sources: common_all.sources() + genh,
15542becc36aSPaolo Bonzini                            dependencies: common_all.dependencies(),
15552becc36aSPaolo Bonzini                            name_suffix: 'fa')
15562becc36aSPaolo Bonzini
1557c9322ab5SMarc-André Lureaufeature_to_c = find_program('scripts/feature_to_c.sh')
1558c9322ab5SMarc-André Lureau
1559fd5eef85SPaolo Bonziniemulators = {}
15602becc36aSPaolo Bonziniforeach target : target_dirs
15612becc36aSPaolo Bonzini  config_target = config_target_mak[target]
15622becc36aSPaolo Bonzini  target_name = config_target['TARGET_NAME']
15632becc36aSPaolo Bonzini  arch = config_target['TARGET_BASE_ARCH']
1564859aef02SPaolo Bonzini  arch_srcs = [config_target_h[target]]
156564ed6f92SPaolo Bonzini  arch_deps = []
156664ed6f92SPaolo Bonzini  c_args = ['-DNEED_CPU_H',
156764ed6f92SPaolo Bonzini            '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
156864ed6f92SPaolo Bonzini            '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
1569b6c7cfd4SPaolo Bonzini  link_args = emulator_link_args
15702becc36aSPaolo Bonzini
1571859aef02SPaolo Bonzini  config_target += config_host
15722becc36aSPaolo Bonzini  target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
15732becc36aSPaolo Bonzini  if targetos == 'linux'
15742becc36aSPaolo Bonzini    target_inc += include_directories('linux-headers', is_system: true)
15752becc36aSPaolo Bonzini  endif
15762becc36aSPaolo Bonzini  if target.endswith('-softmmu')
15772becc36aSPaolo Bonzini    qemu_target_name = 'qemu-system-' + target_name
15782becc36aSPaolo Bonzini    target_type='system'
1579abff1abfSPaolo Bonzini    t = target_softmmu_arch[arch].apply(config_target, strict: false)
1580abff1abfSPaolo Bonzini    arch_srcs += t.sources()
158164ed6f92SPaolo Bonzini    arch_deps += t.dependencies()
1582abff1abfSPaolo Bonzini
15832c44220dSMarc-André Lureau    hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
15842c44220dSMarc-André Lureau    hw = hw_arch[hw_dir].apply(config_target, strict: false)
15852c44220dSMarc-André Lureau    arch_srcs += hw.sources()
158664ed6f92SPaolo Bonzini    arch_deps += hw.dependencies()
15872c44220dSMarc-André Lureau
15882becc36aSPaolo Bonzini    arch_srcs += config_devices_h[target]
158964ed6f92SPaolo Bonzini    link_args += ['@block.syms', '@qemu.syms']
15902becc36aSPaolo Bonzini  else
15913a30446aSMarc-André Lureau    abi = config_target['TARGET_ABI_DIR']
15922becc36aSPaolo Bonzini    target_type='user'
15932becc36aSPaolo Bonzini    qemu_target_name = 'qemu-' + target_name
15942becc36aSPaolo Bonzini    if 'CONFIG_LINUX_USER' in config_target
15952becc36aSPaolo Bonzini      base_dir = 'linux-user'
15962becc36aSPaolo Bonzini      target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
15972becc36aSPaolo Bonzini    else
15982becc36aSPaolo Bonzini      base_dir = 'bsd-user'
15992becc36aSPaolo Bonzini    endif
16002becc36aSPaolo Bonzini    target_inc += include_directories(
16012becc36aSPaolo Bonzini      base_dir,
16023a30446aSMarc-André Lureau      base_dir / abi,
16032becc36aSPaolo Bonzini    )
16043a30446aSMarc-André Lureau    if 'CONFIG_LINUX_USER' in config_target
16053a30446aSMarc-André Lureau      dir = base_dir / abi
16063a30446aSMarc-André Lureau      arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
16073a30446aSMarc-André Lureau      if config_target.has_key('TARGET_SYSTBL_ABI')
16083a30446aSMarc-André Lureau        arch_srcs += \
16093a30446aSMarc-André Lureau          syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
16103a30446aSMarc-André Lureau                                             extra_args : config_target['TARGET_SYSTBL_ABI'])
16113a30446aSMarc-André Lureau      endif
16123a30446aSMarc-André Lureau    endif
16132becc36aSPaolo Bonzini  endif
16142becc36aSPaolo Bonzini
1615c9322ab5SMarc-André Lureau  if 'TARGET_XML_FILES' in config_target
1616c9322ab5SMarc-André Lureau    gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1617c9322ab5SMarc-André Lureau                                output: target + '-gdbstub-xml.c',
1618c9322ab5SMarc-André Lureau                                input: files(config_target['TARGET_XML_FILES'].split()),
1619c9322ab5SMarc-André Lureau                                command: [feature_to_c, '@INPUT@'],
1620c9322ab5SMarc-André Lureau                                capture: true)
1621c9322ab5SMarc-André Lureau    arch_srcs += gdbstub_xml
1622c9322ab5SMarc-André Lureau  endif
1623c9322ab5SMarc-André Lureau
1624abff1abfSPaolo Bonzini  t = target_arch[arch].apply(config_target, strict: false)
1625abff1abfSPaolo Bonzini  arch_srcs += t.sources()
162664ed6f92SPaolo Bonzini  arch_deps += t.dependencies()
1627abff1abfSPaolo Bonzini
16282becc36aSPaolo Bonzini  target_common = common_ss.apply(config_target, strict: false)
16292becc36aSPaolo Bonzini  objects = common_all.extract_objects(target_common.sources())
163064ed6f92SPaolo Bonzini  deps = target_common.dependencies()
16312becc36aSPaolo Bonzini
16322becc36aSPaolo Bonzini  target_specific = specific_ss.apply(config_target, strict: false)
16332becc36aSPaolo Bonzini  arch_srcs += target_specific.sources()
163464ed6f92SPaolo Bonzini  arch_deps += target_specific.dependencies()
16352becc36aSPaolo Bonzini
163664ed6f92SPaolo Bonzini  lib = static_library('qemu-' + target,
1637859aef02SPaolo Bonzini                 sources: arch_srcs + genh,
1638b7612f45SPaolo Bonzini                 dependencies: arch_deps,
16392becc36aSPaolo Bonzini                 objects: objects,
16402becc36aSPaolo Bonzini                 include_directories: target_inc,
164164ed6f92SPaolo Bonzini                 c_args: c_args,
164264ed6f92SPaolo Bonzini                 build_by_default: false,
16432becc36aSPaolo Bonzini                 name_suffix: 'fa')
164464ed6f92SPaolo Bonzini
164564ed6f92SPaolo Bonzini  if target.endswith('-softmmu')
164664ed6f92SPaolo Bonzini    execs = [{
164764ed6f92SPaolo Bonzini      'name': 'qemu-system-' + target_name,
164864ed6f92SPaolo Bonzini      'gui': false,
164964ed6f92SPaolo Bonzini      'sources': files('softmmu/main.c'),
165064ed6f92SPaolo Bonzini      'dependencies': []
165164ed6f92SPaolo Bonzini    }]
165235be72baSPaolo Bonzini    if targetos == 'windows' and (sdl.found() or gtk.found())
165364ed6f92SPaolo Bonzini      execs += [{
165464ed6f92SPaolo Bonzini        'name': 'qemu-system-' + target_name + 'w',
165564ed6f92SPaolo Bonzini        'gui': true,
165664ed6f92SPaolo Bonzini        'sources': files('softmmu/main.c'),
165764ed6f92SPaolo Bonzini        'dependencies': []
165864ed6f92SPaolo Bonzini      }]
165964ed6f92SPaolo Bonzini    endif
166064ed6f92SPaolo Bonzini    if config_host.has_key('CONFIG_FUZZ')
166164ed6f92SPaolo Bonzini      specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
166264ed6f92SPaolo Bonzini      execs += [{
166364ed6f92SPaolo Bonzini        'name': 'qemu-fuzz-' + target_name,
166464ed6f92SPaolo Bonzini        'gui': false,
166564ed6f92SPaolo Bonzini        'sources': specific_fuzz.sources(),
166664ed6f92SPaolo Bonzini        'dependencies': specific_fuzz.dependencies(),
166764ed6f92SPaolo Bonzini      }]
166864ed6f92SPaolo Bonzini    endif
166964ed6f92SPaolo Bonzini  else
167064ed6f92SPaolo Bonzini    execs = [{
167164ed6f92SPaolo Bonzini      'name': 'qemu-' + target_name,
167264ed6f92SPaolo Bonzini      'gui': false,
167364ed6f92SPaolo Bonzini      'sources': [],
167464ed6f92SPaolo Bonzini      'dependencies': []
167564ed6f92SPaolo Bonzini    }]
167664ed6f92SPaolo Bonzini  endif
167764ed6f92SPaolo Bonzini  foreach exe: execs
1678fd5eef85SPaolo Bonzini    emulators += {exe['name']:
1679fd5eef85SPaolo Bonzini         executable(exe['name'], exe['sources'],
168064ed6f92SPaolo Bonzini               install: true,
168164ed6f92SPaolo Bonzini               c_args: c_args,
168264ed6f92SPaolo Bonzini               dependencies: arch_deps + deps + exe['dependencies'],
168364ed6f92SPaolo Bonzini               objects: lib.extract_all_objects(recursive: true),
168464ed6f92SPaolo Bonzini               link_language: link_language,
168564ed6f92SPaolo Bonzini               link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
168664ed6f92SPaolo Bonzini               link_args: link_args,
168764ed6f92SPaolo Bonzini               gui_app: exe['gui'])
1688fd5eef85SPaolo Bonzini    }
168910e1d263SMarc-André Lureau
169010e1d263SMarc-André Lureau    if 'CONFIG_TRACE_SYSTEMTAP' in config_host
169110e1d263SMarc-André Lureau      foreach stp: [
1692bd5f973aSStefan Hajnoczi        {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1693bd5f973aSStefan Hajnoczi        {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
169410e1d263SMarc-André Lureau        {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
169510e1d263SMarc-André Lureau        {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
169610e1d263SMarc-André Lureau      ]
1697bd5f973aSStefan Hajnoczi        custom_target(exe['name'] + stp['ext'],
169810e1d263SMarc-André Lureau                      input: trace_events_all,
1699bd5f973aSStefan Hajnoczi                      output: exe['name'] + stp['ext'],
170010e1d263SMarc-André Lureau                      capture: true,
170110e1d263SMarc-André Lureau                      install: stp['install'],
1702ab4c0996SMarc-André Lureau                      install_dir: qemu_datadir / '../systemtap/tapset',
170310e1d263SMarc-André Lureau                      command: [
170410e1d263SMarc-André Lureau                        tracetool, '--group=all', '--format=' + stp['fmt'],
170510e1d263SMarc-André Lureau                        '--binary=' + stp['bin'],
170610e1d263SMarc-André Lureau                        '--target-name=' + target_name,
170710e1d263SMarc-André Lureau                        '--target-type=' + target_type,
170810e1d263SMarc-André Lureau                        '--probe-prefix=qemu.' + target_type + '.' + target_name,
170910e1d263SMarc-André Lureau                        '@INPUT@',
171010e1d263SMarc-André Lureau                      ])
171110e1d263SMarc-André Lureau      endforeach
171210e1d263SMarc-André Lureau    endif
171364ed6f92SPaolo Bonzini  endforeach
17142becc36aSPaolo Bonziniendforeach
17152becc36aSPaolo Bonzini
1716931049b4SPaolo Bonzini# Other build targets
1717897b5afaSMarc-André Lureau
1718f556b4a1SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host
1719f556b4a1SPaolo Bonzini  install_headers('include/qemu/qemu-plugin.h')
1720f556b4a1SPaolo Bonziniendif
1721f556b4a1SPaolo Bonzini
1722f15bff25SPaolo Bonziniif 'CONFIG_GUEST_AGENT' in config_host
1723f15bff25SPaolo Bonzini  subdir('qga')
1724f15bff25SPaolo Bonziniendif
1725f15bff25SPaolo Bonzini
17269755c94aSLaurent Vivier# Don't build qemu-keymap if xkbcommon is not explicitly enabled
17279755c94aSLaurent Vivier# when we don't build tools or system
17284113f4cfSLaurent Vivierif xkbcommon.found()
172928742467SMarc-André Lureau  # used for the update-keymaps target, so include rules even if !have_tools
173028742467SMarc-André Lureau  qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
173128742467SMarc-André Lureau                           dependencies: [qemuutil, xkbcommon], install: have_tools)
173228742467SMarc-André Lureauendif
173328742467SMarc-André Lureau
1734931049b4SPaolo Bonziniif have_tools
1735b7c70bf2SMarc-André Lureau  qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1736b7c70bf2SMarc-André Lureau             dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1737b7c70bf2SMarc-André Lureau  qemu_io = executable('qemu-io', files('qemu-io.c'),
1738b7c70bf2SMarc-André Lureau             dependencies: [block, qemuutil], install: true)
1739b7c70bf2SMarc-André Lureau  qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
1740b7c70bf2SMarc-André Lureau               dependencies: [block, qemuutil], install: true)
1741b7c70bf2SMarc-André Lureau
17427c58bb76SPaolo Bonzini  subdir('storage-daemon')
1743a9c9727cSPaolo Bonzini  subdir('contrib/rdmacm-mux')
17441d7bb6abSMarc-André Lureau  subdir('contrib/elf2dmp')
1745a9c9727cSPaolo Bonzini
1746157e7b13SMarc-André Lureau  executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1747157e7b13SMarc-André Lureau             dependencies: qemuutil,
1748157e7b13SMarc-André Lureau             install: true)
1749157e7b13SMarc-André Lureau
1750931049b4SPaolo Bonzini  if 'CONFIG_VHOST_USER' in config_host
1751931049b4SPaolo Bonzini    subdir('contrib/libvhost-user')
17522d7ac0afSPaolo Bonzini    subdir('contrib/vhost-user-blk')
1753ea458960SMarc-André Lureau    subdir('contrib/vhost-user-gpu')
175432fcc624SMarc-André Lureau    subdir('contrib/vhost-user-input')
175599650b62SPaolo Bonzini    subdir('contrib/vhost-user-scsi')
1756931049b4SPaolo Bonzini  endif
17578f51e01cSMarc-André Lureau
17588f51e01cSMarc-André Lureau  if targetos == 'linux'
17598f51e01cSMarc-André Lureau    executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
17608f51e01cSMarc-André Lureau               dependencies: [qemuutil, libcap_ng],
17618f51e01cSMarc-André Lureau               install: true,
17628f51e01cSMarc-André Lureau               install_dir: get_option('libexecdir'))
1763897b5afaSMarc-André Lureau
1764897b5afaSMarc-André Lureau    executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1765897b5afaSMarc-André Lureau               dependencies: [authz, crypto, io, qom, qemuutil,
17666ec0e15dSPaolo Bonzini                              libcap_ng, mpathpersist],
1767897b5afaSMarc-André Lureau               install: true)
17688f51e01cSMarc-André Lureau  endif
17698f51e01cSMarc-André Lureau
17705ee24e78SMarc-André Lureau  if 'CONFIG_IVSHMEM' in config_host
17715ee24e78SMarc-André Lureau    subdir('contrib/ivshmem-client')
17725ee24e78SMarc-André Lureau    subdir('contrib/ivshmem-server')
17735ee24e78SMarc-André Lureau  endif
1774931049b4SPaolo Bonziniendif
1775931049b4SPaolo Bonzini
1776f5aa6320SMarc-André Lureausubdir('scripts')
17773f99cf57SPaolo Bonzinisubdir('tools')
1778bdcbea7aSMarc-André Lureausubdir('pc-bios')
1779ce1c1e7aSPaolo Bonzinisubdir('tests')
1780f8aa24eaSPaolo Bonzinisubdir('docs')
1781e8f3bd71SMarc-André Lureauif 'CONFIG_GTK' in config_host
1782e8f3bd71SMarc-André Lureau  subdir('po')
1783e8f3bd71SMarc-André Lureauendif
17843f99cf57SPaolo Bonzini
17858adfeba9SMarc-André Lureauif host_machine.system() == 'windows'
17868adfeba9SMarc-André Lureau  nsis_cmd = [
17878adfeba9SMarc-André Lureau    find_program('scripts/nsis.py'),
17888adfeba9SMarc-André Lureau    '@OUTPUT@',
17898adfeba9SMarc-André Lureau    get_option('prefix'),
17908adfeba9SMarc-André Lureau    meson.current_source_dir(),
17918adfeba9SMarc-André Lureau    host_machine.cpu_family(),
17928adfeba9SMarc-André Lureau    '--',
17938adfeba9SMarc-André Lureau    '-DDISPLAYVERSION=' + meson.project_version(),
17948adfeba9SMarc-André Lureau  ]
17958adfeba9SMarc-André Lureau  if build_docs
17968adfeba9SMarc-André Lureau    nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
17978adfeba9SMarc-André Lureau  endif
17988adfeba9SMarc-André Lureau  if 'CONFIG_GTK' in config_host
17998adfeba9SMarc-André Lureau    nsis_cmd += '-DCONFIG_GTK=y'
18008adfeba9SMarc-André Lureau  endif
18018adfeba9SMarc-André Lureau
18028adfeba9SMarc-André Lureau  nsis = custom_target('nsis',
18038adfeba9SMarc-André Lureau                       output: 'qemu-setup-' + meson.project_version() + '.exe',
18048adfeba9SMarc-André Lureau                       input: files('qemu.nsi'),
18058adfeba9SMarc-André Lureau                       build_always_stale: true,
18068adfeba9SMarc-André Lureau                       command: nsis_cmd + ['@INPUT@'])
18078adfeba9SMarc-André Lureau  alias_target('installer', nsis)
18088adfeba9SMarc-André Lureauendif
18098adfeba9SMarc-André Lureau
1810*a0c9162cSPaolo Bonzini#########################
1811*a0c9162cSPaolo Bonzini# Configuration summary #
1812*a0c9162cSPaolo Bonzini#########################
1813*a0c9162cSPaolo Bonzini
1814f9332757SPaolo Bonzinisummary_info = {}
1815f9332757SPaolo Bonzinisummary_info += {'Install prefix':    config_host['prefix']}
1816f9332757SPaolo Bonzinisummary_info += {'BIOS directory':    config_host['qemu_datadir']}
1817f9332757SPaolo Bonzinisummary_info += {'firmware path':     config_host['qemu_firmwarepath']}
1818f9332757SPaolo Bonzinisummary_info += {'binary directory':  config_host['bindir']}
1819f9332757SPaolo Bonzinisummary_info += {'library directory': config_host['libdir']}
1820f9332757SPaolo Bonzinisummary_info += {'module directory':  config_host['qemu_moddir']}
1821f9332757SPaolo Bonzinisummary_info += {'libexec directory': config_host['libexecdir']}
1822f9332757SPaolo Bonzinisummary_info += {'include directory': config_host['includedir']}
1823f9332757SPaolo Bonzinisummary_info += {'config directory':  config_host['sysconfdir']}
1824f9332757SPaolo Bonziniif targetos != 'windows'
1825f9332757SPaolo Bonzini  summary_info += {'local state directory': config_host['qemu_localstatedir']}
1826b81efab7SMarc-André Lureau  summary_info += {'Manual directory':      get_option('mandir')}
1827f9332757SPaolo Bonzinielse
1828f9332757SPaolo Bonzini  summary_info += {'local state directory': 'queried at runtime'}
1829f9332757SPaolo Bonziniendif
1830491e74c1SMarc-André Lureausummary_info += {'Doc directory':     get_option('docdir')}
1831f9332757SPaolo Bonzinisummary_info += {'Build directory':   meson.current_build_dir()}
1832f9332757SPaolo Bonzinisummary_info += {'Source path':       meson.current_source_dir()}
1833f9332757SPaolo Bonzinisummary_info += {'GIT binary':        config_host['GIT']}
1834f9332757SPaolo Bonzinisummary_info += {'GIT submodules':    config_host['GIT_SUBMODULES']}
1835f9332757SPaolo Bonzinisummary_info += {'C compiler':        meson.get_compiler('c').cmd_array()[0]}
1836f9332757SPaolo Bonzinisummary_info += {'Host C compiler':   meson.get_compiler('c', native: true).cmd_array()[0]}
1837f9332757SPaolo Bonziniif link_language == 'cpp'
1838f9332757SPaolo Bonzini  summary_info += {'C++ compiler':      meson.get_compiler('cpp').cmd_array()[0]}
1839f9332757SPaolo Bonzinielse
1840f9332757SPaolo Bonzini  summary_info += {'C++ compiler':      false}
1841f9332757SPaolo Bonziniendif
1842f9332757SPaolo Bonziniif targetos == 'darwin'
1843f9332757SPaolo Bonzini  summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1844f9332757SPaolo Bonziniendif
1845f9332757SPaolo Bonzinisummary_info += {'ARFLAGS':           config_host['ARFLAGS']}
184647b30835SPaolo Bonzinisummary_info += {'CFLAGS':            ' '.join(get_option('c_args')
184747b30835SPaolo Bonzini                                               + ['-O' + get_option('optimization')]
184847b30835SPaolo Bonzini                                               + (get_option('debug') ? ['-g'] : []))}
184947b30835SPaolo Bonziniif link_language == 'cpp'
185047b30835SPaolo Bonzini  summary_info += {'CXXFLAGS':        ' '.join(get_option('cpp_args')
185147b30835SPaolo Bonzini                                               + ['-O' + get_option('optimization')]
185247b30835SPaolo Bonzini                                               + (get_option('debug') ? ['-g'] : []))}
185347b30835SPaolo Bonziniendif
185447b30835SPaolo Bonzinilink_args = get_option(link_language + '_link_args')
185547b30835SPaolo Bonziniif link_args.length() > 0
185647b30835SPaolo Bonzini  summary_info += {'LDFLAGS':         ' '.join(link_args)}
185747b30835SPaolo Bonziniendif
1858f9332757SPaolo Bonzinisummary_info += {'QEMU_CFLAGS':       config_host['QEMU_CFLAGS']}
1859f9332757SPaolo Bonzinisummary_info += {'QEMU_LDFLAGS':      config_host['QEMU_LDFLAGS']}
1860f9332757SPaolo Bonzinisummary_info += {'make':              config_host['MAKE']}
1861f9332757SPaolo Bonzinisummary_info += {'python':            '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1862f9332757SPaolo Bonzinisummary_info += {'sphinx-build':      config_host['SPHINX_BUILD']}
1863f9332757SPaolo Bonzinisummary_info += {'genisoimage':       config_host['GENISOIMAGE']}
1864f9332757SPaolo Bonzini# TODO: add back version
18654d34a86bSPaolo Bonzinisummary_info += {'slirp support':     slirp_opt == 'disabled' ? false : slirp_opt}
18664d34a86bSPaolo Bonziniif slirp_opt != 'disabled'
1867f9332757SPaolo Bonzini  summary_info += {'smbd':            config_host['CONFIG_SMBD_COMMAND']}
1868f9332757SPaolo Bonziniendif
1869f9332757SPaolo Bonzinisummary_info += {'module support':    config_host.has_key('CONFIG_MODULES')}
1870f9332757SPaolo Bonziniif config_host.has_key('CONFIG_MODULES')
1871f9332757SPaolo Bonzini  summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1872f9332757SPaolo Bonziniendif
1873f9332757SPaolo Bonzinisummary_info += {'host CPU':          cpu}
1874f9332757SPaolo Bonzinisummary_info += {'host endianness':   build_machine.endian()}
1875fdb75aefSPaolo Bonzinisummary_info += {'target list':       ' '.join(target_dirs)}
1876f9332757SPaolo Bonzinisummary_info += {'gprof enabled':     config_host.has_key('CONFIG_GPROF')}
1877deb62371SPaolo Bonzinisummary_info += {'sparse enabled':    sparse.found()}
1878f9332757SPaolo Bonzinisummary_info += {'strip binaries':    get_option('strip')}
1879f9332757SPaolo Bonzinisummary_info += {'profiler':          config_host.has_key('CONFIG_PROFILER')}
18803e8529ddSLaurent Viviersummary_info += {'static build':      config_host.has_key('CONFIG_STATIC')}
1881f9332757SPaolo Bonziniif targetos == 'darwin'
1882f9332757SPaolo Bonzini  summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1883f9332757SPaolo Bonziniendif
1884f9332757SPaolo Bonzini# TODO: add back version
188535be72baSPaolo Bonzinisummary_info += {'SDL support':       sdl.found()}
188635be72baSPaolo Bonzinisummary_info += {'SDL image support': sdl_image.found()}
1887f9332757SPaolo Bonzini# TODO: add back version
1888f9332757SPaolo Bonzinisummary_info += {'GTK support':       config_host.has_key('CONFIG_GTK')}
1889f9332757SPaolo Bonzinisummary_info += {'GTK GL support':    config_host.has_key('CONFIG_GTK_GL')}
1890b7612f45SPaolo Bonzinisummary_info += {'pixman':            pixman.found()}
1891f9332757SPaolo Bonzini# TODO: add back version
1892f9332757SPaolo Bonzinisummary_info += {'VTE support':       config_host.has_key('CONFIG_VTE')}
1893f9332757SPaolo Bonzinisummary_info += {'TLS priority':      config_host['CONFIG_TLS_PRIORITY']}
1894f9332757SPaolo Bonzinisummary_info += {'GNUTLS support':    config_host.has_key('CONFIG_GNUTLS')}
1895f9332757SPaolo Bonzini# TODO: add back version
1896f9332757SPaolo Bonzinisummary_info += {'libgcrypt':         config_host.has_key('CONFIG_GCRYPT')}
1897f9332757SPaolo Bonziniif config_host.has_key('CONFIG_GCRYPT')
1898f9332757SPaolo Bonzini   summary_info += {'  hmac':            config_host.has_key('CONFIG_GCRYPT_HMAC')}
1899f9332757SPaolo Bonzini   summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1900f9332757SPaolo Bonziniendif
1901f9332757SPaolo Bonzini# TODO: add back version
1902f9332757SPaolo Bonzinisummary_info += {'nettle':            config_host.has_key('CONFIG_NETTLE')}
1903f9332757SPaolo Bonziniif config_host.has_key('CONFIG_NETTLE')
1904f9332757SPaolo Bonzini   summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1905f9332757SPaolo Bonziniendif
1906f9332757SPaolo Bonzinisummary_info += {'libtasn1':          config_host.has_key('CONFIG_TASN1')}
1907f9332757SPaolo Bonzinisummary_info += {'PAM':               config_host.has_key('CONFIG_AUTH_PAM')}
1908f9332757SPaolo Bonzinisummary_info += {'iconv support':     config_host.has_key('CONFIG_ICONV')}
1909f9332757SPaolo Bonzinisummary_info += {'curses support':    config_host.has_key('CONFIG_CURSES')}
1910f9332757SPaolo Bonzini# TODO: add back version
1911f9332757SPaolo Bonzinisummary_info += {'virgl support':     config_host.has_key('CONFIG_VIRGL')}
1912f9332757SPaolo Bonzinisummary_info += {'curl support':      config_host.has_key('CONFIG_CURL')}
1913f9332757SPaolo Bonzinisummary_info += {'mingw32 support':   targetos == 'windows'}
1914f9332757SPaolo Bonzinisummary_info += {'Audio drivers':     config_host['CONFIG_AUDIO_DRIVERS']}
1915f9332757SPaolo Bonzinisummary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1916f9332757SPaolo Bonzinisummary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1917f9332757SPaolo Bonzinisummary_info += {'VirtFS support':    config_host.has_key('CONFIG_VIRTFS')}
19186ec0e15dSPaolo Bonzinisummary_info += {'Multipath support': mpathpersist.found()}
1919a0b93237SPaolo Bonzinisummary_info += {'VNC support':       vnc.found()}
1920a0b93237SPaolo Bonziniif vnc.found()
1921a0b93237SPaolo Bonzini  summary_info += {'VNC SASL support':  sasl.found()}
1922a0b93237SPaolo Bonzini  summary_info += {'VNC JPEG support':  jpeg.found()}
1923a0b93237SPaolo Bonzini  summary_info += {'VNC PNG support':   png.found()}
1924f9332757SPaolo Bonziniendif
1925f9332757SPaolo Bonzinisummary_info += {'xen support':       config_host.has_key('CONFIG_XEN_BACKEND')}
1926f9332757SPaolo Bonziniif config_host.has_key('CONFIG_XEN_BACKEND')
1927f9332757SPaolo Bonzini  summary_info += {'xen ctrl version':  config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1928f9332757SPaolo Bonziniendif
1929f9332757SPaolo Bonzinisummary_info += {'brlapi support':    config_host.has_key('CONFIG_BRLAPI')}
1930f9332757SPaolo Bonzinisummary_info += {'Documentation':     config_host.has_key('BUILD_DOCS')}
1931f9332757SPaolo Bonzinisummary_info += {'PIE':               get_option('b_pie')}
1932f9332757SPaolo Bonzinisummary_info += {'vde support':       config_host.has_key('CONFIG_VDE')}
1933f9332757SPaolo Bonzinisummary_info += {'netmap support':    config_host.has_key('CONFIG_NETMAP')}
1934f9332757SPaolo Bonzinisummary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1935f9332757SPaolo Bonzinisummary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1936f9332757SPaolo Bonzinisummary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1937f9332757SPaolo Bonzinisummary_info += {'Install blobs':     config_host.has_key('INSTALL_BLOBS')}
193805512f55SPaolo Bonzinisummary_info += {'KVM support':       config_all.has_key('CONFIG_KVM')}
193905512f55SPaolo Bonzinisummary_info += {'HAX support':       config_all.has_key('CONFIG_HAX')}
194005512f55SPaolo Bonzinisummary_info += {'HVF support':       config_all.has_key('CONFIG_HVF')}
194105512f55SPaolo Bonzinisummary_info += {'WHPX support':      config_all.has_key('CONFIG_WHPX')}
194205512f55SPaolo Bonzinisummary_info += {'TCG support':       config_all.has_key('CONFIG_TCG')}
194305512f55SPaolo Bonziniif config_all.has_key('CONFIG_TCG')
194405512f55SPaolo Bonzini  summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
194505512f55SPaolo Bonzini  summary_info += {'TCG interpreter':   config_host.has_key('CONFIG_TCG_INTERPRETER')}
194605512f55SPaolo Bonziniendif
1947aa087962SPaolo Bonzinisummary_info += {'malloc trim support': has_malloc_trim}
1948f9332757SPaolo Bonzinisummary_info += {'RDMA support':      config_host.has_key('CONFIG_RDMA')}
1949f9332757SPaolo Bonzinisummary_info += {'PVRDMA support':    config_host.has_key('CONFIG_PVRDMA')}
1950fbb4121dSPaolo Bonzinisummary_info += {'fdt support':       fdt_opt == 'disabled' ? false : fdt_opt}
1951f9332757SPaolo Bonzinisummary_info += {'membarrier':        config_host.has_key('CONFIG_MEMBARRIER')}
1952f9332757SPaolo Bonzinisummary_info += {'preadv support':    config_host.has_key('CONFIG_PREADV')}
1953f9332757SPaolo Bonzinisummary_info += {'fdatasync':         config_host.has_key('CONFIG_FDATASYNC')}
1954f9332757SPaolo Bonzinisummary_info += {'madvise':           config_host.has_key('CONFIG_MADVISE')}
1955f9332757SPaolo Bonzinisummary_info += {'posix_madvise':     config_host.has_key('CONFIG_POSIX_MADVISE')}
1956f9332757SPaolo Bonzinisummary_info += {'posix_memalign':    config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1957f9332757SPaolo Bonzinisummary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1958f9332757SPaolo Bonzinisummary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1959f9332757SPaolo Bonzinisummary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1960f9332757SPaolo Bonzinisummary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1961f9332757SPaolo Bonzinisummary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1962f9332757SPaolo Bonzinisummary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1963f9332757SPaolo Bonzinisummary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1964f9332757SPaolo Bonzinisummary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1965f9332757SPaolo Bonzinisummary_info += {'Trace backends':    config_host['TRACE_BACKENDS']}
1966f9332757SPaolo Bonziniif config_host['TRACE_BACKENDS'].split().contains('simple')
1967f9332757SPaolo Bonzini  summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1968f9332757SPaolo Bonziniendif
1969f9332757SPaolo Bonzini# TODO: add back protocol and server version
1970f9332757SPaolo Bonzinisummary_info += {'spice support':     config_host.has_key('CONFIG_SPICE')}
1971f9332757SPaolo Bonzinisummary_info += {'rbd support':       config_host.has_key('CONFIG_RBD')}
1972f9332757SPaolo Bonzinisummary_info += {'xfsctl support':    config_host.has_key('CONFIG_XFS')}
1973f9332757SPaolo Bonzinisummary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
19740a40bcb7SCésar Belleysummary_info += {'U2F support':       u2f.found()}
1975f9332757SPaolo Bonzinisummary_info += {'libusb':            config_host.has_key('CONFIG_USB_LIBUSB')}
1976f9332757SPaolo Bonzinisummary_info += {'usb net redir':     config_host.has_key('CONFIG_USB_REDIR')}
1977f9332757SPaolo Bonzinisummary_info += {'OpenGL support':    config_host.has_key('CONFIG_OPENGL')}
1978f9332757SPaolo Bonzinisummary_info += {'OpenGL dmabufs':    config_host.has_key('CONFIG_OPENGL_DMABUF')}
1979f9332757SPaolo Bonzinisummary_info += {'libiscsi support':  config_host.has_key('CONFIG_LIBISCSI')}
1980f9332757SPaolo Bonzinisummary_info += {'libnfs support':    config_host.has_key('CONFIG_LIBNFS')}
1981f9332757SPaolo Bonzinisummary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1982f9332757SPaolo Bonziniif targetos == 'windows'
1983f9332757SPaolo Bonzini  if 'WIN_SDK' in config_host
1984f9332757SPaolo Bonzini    summary_info += {'Windows SDK':       config_host['WIN_SDK']}
1985f9332757SPaolo Bonzini  endif
1986f9332757SPaolo Bonzini  summary_info += {'QGA VSS support':   config_host.has_key('CONFIG_QGA_VSS')}
1987f9332757SPaolo Bonzini  summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
19884bad7c3bSStefan Hajnoczi  summary_info += {'QGA MSI support':   config_host.has_key('CONFIG_QGA_MSI')}
1989f9332757SPaolo Bonziniendif
1990f9332757SPaolo Bonzinisummary_info += {'seccomp support':   config_host.has_key('CONFIG_SECCOMP')}
1991f9332757SPaolo Bonzinisummary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1992f9332757SPaolo Bonzinisummary_info += {'coroutine pool':    config_host['CONFIG_COROUTINE_POOL'] == '1'}
1993f9332757SPaolo Bonzinisummary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1994f9332757SPaolo Bonzinisummary_info += {'mutex debugging':   config_host.has_key('CONFIG_DEBUG_MUTEX')}
1995f9332757SPaolo Bonzinisummary_info += {'crypto afalg':      config_host.has_key('CONFIG_AF_ALG')}
1996f9332757SPaolo Bonzinisummary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1997bf0e56a3SMarc-André Lureausummary_info += {'gcov':              get_option('b_coverage')}
1998f9332757SPaolo Bonzinisummary_info += {'TPM support':       config_host.has_key('CONFIG_TPM')}
1999f9332757SPaolo Bonzinisummary_info += {'libssh support':    config_host.has_key('CONFIG_LIBSSH')}
2000f9332757SPaolo Bonzinisummary_info += {'QOM debugging':     config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
2001f9332757SPaolo Bonzinisummary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
2002f9332757SPaolo Bonzinisummary_info += {'lzo support':       config_host.has_key('CONFIG_LZO')}
2003f9332757SPaolo Bonzinisummary_info += {'snappy support':    config_host.has_key('CONFIG_SNAPPY')}
2004f9332757SPaolo Bonzinisummary_info += {'bzip2 support':     config_host.has_key('CONFIG_BZIP2')}
2005f9332757SPaolo Bonzinisummary_info += {'lzfse support':     config_host.has_key('CONFIG_LZFSE')}
2006f9332757SPaolo Bonzinisummary_info += {'zstd support':      config_host.has_key('CONFIG_ZSTD')}
2007f9332757SPaolo Bonzinisummary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
2008f9332757SPaolo Bonzinisummary_info += {'libxml2':           config_host.has_key('CONFIG_LIBXML2')}
2009aa087962SPaolo Bonzinisummary_info += {'memory allocator':  get_option('malloc')}
2010f9332757SPaolo Bonzinisummary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2011f9332757SPaolo Bonzinisummary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2012f9332757SPaolo Bonzinisummary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2013f9332757SPaolo Bonzinisummary_info += {'bochs support':     config_host.has_key('CONFIG_BOCHS')}
2014f9332757SPaolo Bonzinisummary_info += {'cloop support':     config_host.has_key('CONFIG_CLOOP')}
2015f9332757SPaolo Bonzinisummary_info += {'dmg support':       config_host.has_key('CONFIG_DMG')}
2016f9332757SPaolo Bonzinisummary_info += {'qcow v1 support':   config_host.has_key('CONFIG_QCOW1')}
2017f9332757SPaolo Bonzinisummary_info += {'vdi support':       config_host.has_key('CONFIG_VDI')}
2018f9332757SPaolo Bonzinisummary_info += {'vvfat support':     config_host.has_key('CONFIG_VVFAT')}
2019f9332757SPaolo Bonzinisummary_info += {'qed support':       config_host.has_key('CONFIG_QED')}
2020f9332757SPaolo Bonzinisummary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
2021f9332757SPaolo Bonzinisummary_info += {'sheepdog support':  config_host.has_key('CONFIG_SHEEPDOG')}
20228b18cdbfSRichard Hendersonsummary_info += {'capstone':          capstone_opt == 'disabled' ? false : capstone_opt}
2023f9332757SPaolo Bonzinisummary_info += {'libpmem support':   config_host.has_key('CONFIG_LIBPMEM')}
2024f9332757SPaolo Bonzinisummary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
2025f01496a3SPaolo Bonzinisummary_info += {'libudev':           libudev.found()}
2026f9332757SPaolo Bonzinisummary_info += {'default devices':   config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
2027f9332757SPaolo Bonzinisummary_info += {'plugin support':    config_host.has_key('CONFIG_PLUGIN')}
2028f9332757SPaolo Bonzinisummary_info += {'fuzzing support':   config_host.has_key('CONFIG_FUZZ')}
2029f9332757SPaolo Bonziniif config_host.has_key('HAVE_GDB_BIN')
2030f9332757SPaolo Bonzini  summary_info += {'gdb':             config_host['HAVE_GDB_BIN']}
2031f9332757SPaolo Bonziniendif
2032f9332757SPaolo Bonzinisummary_info += {'thread sanitizer':  config_host.has_key('CONFIG_TSAN')}
2033f9332757SPaolo Bonzinisummary_info += {'rng-none':          config_host.has_key('CONFIG_RNG_NONE')}
2034f9332757SPaolo Bonzinisummary_info += {'Linux keyring':     config_host.has_key('CONFIG_SECRET_KEYRING')}
2035f9332757SPaolo Bonzinisummary(summary_info, bool_yn: true)
2036f9332757SPaolo Bonzini
2037f9332757SPaolo Bonziniif not supported_cpus.contains(cpu)
2038f9332757SPaolo Bonzini  message()
2039f9332757SPaolo Bonzini  warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2040f9332757SPaolo Bonzini  message()
2041f9332757SPaolo Bonzini  message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2042f9332757SPaolo Bonzini  message('The QEMU project intends to remove support for this host CPU in')
2043f9332757SPaolo Bonzini  message('a future release if nobody volunteers to maintain it and to')
2044f9332757SPaolo Bonzini  message('provide a build host for our continuous integration setup.')
2045f9332757SPaolo Bonzini  message('configure has succeeded and you can continue to build, but')
2046f9332757SPaolo Bonzini  message('if you care about QEMU on this platform you should contact')
2047f9332757SPaolo Bonzini  message('us upstream at qemu-devel@nongnu.org.')
2048f9332757SPaolo Bonziniendif
2049f9332757SPaolo Bonzini
2050f9332757SPaolo Bonziniif not supported_oses.contains(targetos)
2051f9332757SPaolo Bonzini  message()
2052f9332757SPaolo Bonzini  warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2053f9332757SPaolo Bonzini  message()
2054f9332757SPaolo Bonzini  message('Host OS ' + targetos + 'support is not currently maintained.')
2055f9332757SPaolo Bonzini  message('The QEMU project intends to remove support for this host OS in')
2056f9332757SPaolo Bonzini  message('a future release if nobody volunteers to maintain it and to')
2057f9332757SPaolo Bonzini  message('provide a build host for our continuous integration setup.')
2058f9332757SPaolo Bonzini  message('configure has succeeded and you can continue to build, but')
2059f9332757SPaolo Bonzini  message('if you care about QEMU on this platform you should contact')
2060f9332757SPaolo Bonzini  message('us upstream at qemu-devel@nongnu.org.')
2061f9332757SPaolo Bonziniendif
2062