xref: /qemu/meson.build (revision deb62371)
1a5665051SPaolo Bonziniproject('qemu', ['c'], meson_version: '>=0.55.0',
290756b2fSGerd Hoffmann        default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11',
33e0e5190SPaolo Bonzini                          'b_colorout=auto'],
4a5665051SPaolo Bonzini        version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
5a5665051SPaolo Bonzini
6a5665051SPaolo Bonzininot_found = dependency('', required: false)
7b29b40f4SPaolo Bonziniif meson.version().version_compare('>=0.56.0')
8b29b40f4SPaolo Bonzini  keyval = import('keyval')
9b29b40f4SPaolo Bonzinielse
10a5665051SPaolo Bonzini  keyval = import('unstable-keyval')
11b29b40f4SPaolo Bonziniendif
12a81df1b6SPaolo Bonziniss = import('sourceset')
13a81df1b6SPaolo Bonzini
14ce1c1e7aSPaolo Bonzinish = find_program('sh')
15a81df1b6SPaolo Bonzinicc = meson.get_compiler('c')
16a5665051SPaolo Bonziniconfig_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
173154fee4SMarc-André Lureauenable_modules = 'CONFIG_MODULES' in config_host
1835be72baSPaolo Bonzinienable_static = 'CONFIG_STATIC' in config_host
19f8aa24eaSPaolo Bonzinibuild_docs = 'BUILD_DOCS' in config_host
208fe11232SMarc-André Lureau
218fe11232SMarc-André Lureauif get_option('qemu_suffix').startswith('/')
228fe11232SMarc-André Lureau  error('qemu_suffix cannot start with a /')
238fe11232SMarc-André Lureauendif
248fe11232SMarc-André Lureau
25ab4c0996SMarc-André Lureauqemu_datadir = get_option('datadir') / get_option('qemu_suffix')
26491e74c1SMarc-André Lureauqemu_docdir = get_option('docdir') / get_option('qemu_suffix')
27859aef02SPaolo Bonziniconfig_host_data = configuration_data()
28859aef02SPaolo Bonzinigenh = []
29a5665051SPaolo Bonzini
30760e4327SPaolo Bonzinitarget_dirs = config_host['TARGET_DIRS'].split()
31760e4327SPaolo Bonzinihave_user = false
32760e4327SPaolo Bonzinihave_system = false
33760e4327SPaolo Bonziniforeach target : target_dirs
34760e4327SPaolo Bonzini  have_user = have_user or target.endswith('-user')
35760e4327SPaolo Bonzini  have_system = have_system or target.endswith('-softmmu')
36760e4327SPaolo Bonziniendforeach
37760e4327SPaolo Bonzinihave_tools = 'CONFIG_TOOLS' in config_host
38760e4327SPaolo Bonzinihave_block = have_system or have_tools
39760e4327SPaolo Bonzini
40201e8ed7SPaolo Bonzinipython = import('python').find_installation()
41201e8ed7SPaolo Bonzini
42201e8ed7SPaolo Bonzinisupported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
43201e8ed7SPaolo Bonzinisupported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
44201e8ed7SPaolo Bonzini  'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
45201e8ed7SPaolo Bonzini
46201e8ed7SPaolo Bonzinicpu = host_machine.cpu_family()
47201e8ed7SPaolo Bonzinitargetos = host_machine.system()
48201e8ed7SPaolo Bonzini
49201e8ed7SPaolo Bonziniconfigure_file(input: files('scripts/ninjatool.py'),
50201e8ed7SPaolo Bonzini               output: 'ninjatool',
51201e8ed7SPaolo Bonzini               configuration: config_host)
52201e8ed7SPaolo Bonzini
538a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64']
548a19980eSPaolo Bonzini  kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
558a19980eSPaolo Bonzinielif cpu == 'aarch64'
568a19980eSPaolo Bonzini  kvm_targets = ['aarch64-softmmu']
578a19980eSPaolo Bonzinielif cpu == 's390x'
588a19980eSPaolo Bonzini  kvm_targets = ['s390x-softmmu']
598a19980eSPaolo Bonzinielif cpu in ['ppc', 'ppc64']
608a19980eSPaolo Bonzini  kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
618a19980eSPaolo Bonzinielse
628a19980eSPaolo Bonzini  kvm_targets = []
638a19980eSPaolo Bonziniendif
648a19980eSPaolo Bonzini
658a19980eSPaolo Bonziniaccelerator_targets = { 'CONFIG_KVM': kvm_targets }
668a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64']
678a19980eSPaolo Bonzini  accelerator_targets += {
688a19980eSPaolo Bonzini    'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
698a19980eSPaolo Bonzini    'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
708a19980eSPaolo Bonzini    'CONFIG_HVF': ['x86_64-softmmu'],
718a19980eSPaolo Bonzini    'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
728a19980eSPaolo Bonzini  }
738a19980eSPaolo Bonziniendif
748a19980eSPaolo Bonzini
75201e8ed7SPaolo Bonzini##################
76201e8ed7SPaolo Bonzini# Compiler flags #
77201e8ed7SPaolo Bonzini##################
78201e8ed7SPaolo Bonzini
79ff9ed62bSAlexander Bulekov# Specify linker-script with add_project_link_arguments so that it is not placed
80ff9ed62bSAlexander Bulekov# within a linker --start-group/--end-group pair
81ff9ed62bSAlexander Bulekovif 'CONFIG_FUZZ' in config_host
82ff9ed62bSAlexander Bulekov   add_project_link_arguments(['-Wl,-T,',
83ff9ed62bSAlexander Bulekov                               (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
84ff9ed62bSAlexander Bulekov                              native: false, language: ['c', 'cpp', 'objc'])
85ff9ed62bSAlexander Bulekovendif
86ff9ed62bSAlexander Bulekov
87a5665051SPaolo Bonziniadd_project_arguments(config_host['QEMU_CFLAGS'].split(),
88a5665051SPaolo Bonzini                      native: false, language: ['c', 'objc'])
89a5665051SPaolo Bonziniadd_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
90a5665051SPaolo Bonzini                      native: false, language: 'cpp')
91a5665051SPaolo Bonziniadd_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
92a5665051SPaolo Bonzini                           native: false, language: ['c', 'cpp', 'objc'])
93a5665051SPaolo Bonziniadd_project_arguments(config_host['QEMU_INCLUDES'].split(),
94a5665051SPaolo Bonzini                      language: ['c', 'cpp', 'objc'])
95a5665051SPaolo Bonzini
96c46f76d1SAlexander Bulekov
97fc929892SMarc-André Lureaulink_language = meson.get_external_property('link_language', 'cpp')
98fc929892SMarc-André Lureauif link_language == 'cpp'
99fc929892SMarc-André Lureau  add_languages('cpp', required: true, native: false)
100fc929892SMarc-André Lureauendif
101a5665051SPaolo Bonziniif host_machine.system() == 'darwin'
102a5665051SPaolo Bonzini  add_languages('objc', required: false, native: false)
103a5665051SPaolo Bonziniendif
104a5665051SPaolo Bonzini
105*deb62371SPaolo Bonzinisparse = find_program('cgcc', required: get_option('sparse'))
106*deb62371SPaolo Bonziniif sparse.found()
107968b4db3SPaolo Bonzini  run_target('sparse',
108968b4db3SPaolo Bonzini             command: [find_program('scripts/check_sparse.py'),
109*deb62371SPaolo Bonzini                       'compile_commands.json', sparse.full_path(), '-Wbitwise',
110*deb62371SPaolo Bonzini                       '-Wno-transparent-union', '-Wno-old-initializer',
111*deb62371SPaolo Bonzini                       '-Wno-non-pointer-null'])
112968b4db3SPaolo Bonziniendif
113968b4db3SPaolo Bonzini
1146ec0e15dSPaolo Bonzini###########################################
1156ec0e15dSPaolo Bonzini# Target-specific checks and dependencies #
1166ec0e15dSPaolo Bonzini###########################################
1176ec0e15dSPaolo Bonzini
1186ec0e15dSPaolo Bonziniif targetos != 'linux' and get_option('mpath').enabled()
1196ec0e15dSPaolo Bonzini  error('Multipath is supported only on Linux')
1206ec0e15dSPaolo Bonziniendif
1216ec0e15dSPaolo Bonzini
122a81df1b6SPaolo Bonzinim = cc.find_library('m', required: false)
123a81df1b6SPaolo Bonziniutil = cc.find_library('util', required: false)
1244a96337dSPaolo Bonziniwinmm = []
125a81df1b6SPaolo Bonzinisocket = []
12604c6f1e7SMarc-André Lureauversion_res = []
127d92989aaSMarc-André Lureaucoref = []
128d92989aaSMarc-André Lureauiokit = []
129b6c7cfd4SPaolo Bonziniemulator_link_args = []
130b4e312e9SPaolo Bonzinicocoa = not_found
1318a19980eSPaolo Bonzinihvf = not_found
132a81df1b6SPaolo Bonziniif targetos == 'windows'
133a81df1b6SPaolo Bonzini  socket = cc.find_library('ws2_32')
1344a96337dSPaolo Bonzini  winmm = cc.find_library('winmm')
13504c6f1e7SMarc-André Lureau
13604c6f1e7SMarc-André Lureau  win = import('windows')
13704c6f1e7SMarc-André Lureau  version_res = win.compile_resources('version.rc',
13804c6f1e7SMarc-André Lureau                                      depend_files: files('pc-bios/qemu-nsis.ico'),
13904c6f1e7SMarc-André Lureau                                      include_directories: include_directories('.'))
140d92989aaSMarc-André Lureauelif targetos == 'darwin'
141d92989aaSMarc-André Lureau  coref = dependency('appleframeworks', modules: 'CoreFoundation')
142d92989aaSMarc-André Lureau  iokit = dependency('appleframeworks', modules: 'IOKit')
143b4e312e9SPaolo Bonzini  cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
144cfad62f1SPaolo Bonzinielif targetos == 'sunos'
145cfad62f1SPaolo Bonzini  socket = [cc.find_library('socket'),
146cfad62f1SPaolo Bonzini            cc.find_library('nsl'),
147cfad62f1SPaolo Bonzini            cc.find_library('resolv')]
148cfad62f1SPaolo Bonzinielif targetos == 'haiku'
149cfad62f1SPaolo Bonzini  socket = [cc.find_library('posix_error_mapper'),
150cfad62f1SPaolo Bonzini            cc.find_library('network'),
151cfad62f1SPaolo Bonzini            cc.find_library('bsd')]
152b6c7cfd4SPaolo Bonzinielif targetos == 'openbsd'
153b6c7cfd4SPaolo Bonzini  if not get_option('tcg').disabled() and target_dirs.length() > 0
154b6c7cfd4SPaolo Bonzini    # Disable OpenBSD W^X if available
155b6c7cfd4SPaolo Bonzini    emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
156b6c7cfd4SPaolo Bonzini  endif
157a81df1b6SPaolo Bonziniendif
1586ec0e15dSPaolo Bonzini
1598a19980eSPaolo Bonziniaccelerators = []
1608a19980eSPaolo Bonziniif not get_option('kvm').disabled() and targetos == 'linux'
1618a19980eSPaolo Bonzini  accelerators += 'CONFIG_KVM'
1628a19980eSPaolo Bonziniendif
1638a19980eSPaolo Bonziniif not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
1648a19980eSPaolo Bonzini  accelerators += 'CONFIG_XEN'
1658a19980eSPaolo Bonzini  have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
1668a19980eSPaolo Bonzinielse
1678a19980eSPaolo Bonzini  have_xen_pci_passthrough = false
1688a19980eSPaolo Bonziniendif
1698a19980eSPaolo Bonziniif not get_option('whpx').disabled() and targetos == 'windows'
1708a19980eSPaolo Bonzini  if get_option('whpx').enabled() and cpu != 'x86_64'
1718a19980eSPaolo Bonzini    error('WHPX requires 64-bit host')
1728a19980eSPaolo Bonzini  elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
1738a19980eSPaolo Bonzini       cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
1748a19980eSPaolo Bonzini    accelerators += 'CONFIG_WHPX'
1758a19980eSPaolo Bonzini  endif
1768a19980eSPaolo Bonziniendif
1778a19980eSPaolo Bonziniif not get_option('hvf').disabled()
1788a19980eSPaolo Bonzini  hvf = dependency('appleframeworks', modules: 'Hypervisor',
1798a19980eSPaolo Bonzini                   required: get_option('hvf'))
1808a19980eSPaolo Bonzini  if hvf.found()
1818a19980eSPaolo Bonzini    accelerators += 'CONFIG_HVF'
1828a19980eSPaolo Bonzini  endif
1838a19980eSPaolo Bonziniendif
1848a19980eSPaolo Bonziniif not get_option('hax').disabled()
1858a19980eSPaolo Bonzini  if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
1868a19980eSPaolo Bonzini    accelerators += 'CONFIG_HAX'
1878a19980eSPaolo Bonzini  endif
1888a19980eSPaolo Bonziniendif
1898a19980eSPaolo Bonziniif not get_option('tcg').disabled()
1908a19980eSPaolo Bonzini  if cpu not in supported_cpus
1918a19980eSPaolo Bonzini    if 'CONFIG_TCG_INTERPRETER' in config_host
1928a19980eSPaolo Bonzini      warning('Unsupported CPU @0@, will use TCG with TCI (experimental)'.format(cpu))
1938a19980eSPaolo Bonzini    else
1948a19980eSPaolo Bonzini      error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
1958a19980eSPaolo Bonzini    endif
1968a19980eSPaolo Bonzini  endif
1978a19980eSPaolo Bonzini  accelerators += 'CONFIG_TCG'
1988a19980eSPaolo Bonzini  config_host += { 'CONFIG_TCG': 'y' }
1998a19980eSPaolo Bonziniendif
2008a19980eSPaolo Bonzini
2018a19980eSPaolo Bonziniif 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
2028a19980eSPaolo Bonzini  error('KVM not available on this platform')
2038a19980eSPaolo Bonziniendif
2048a19980eSPaolo Bonziniif 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
2058a19980eSPaolo Bonzini  error('HVF not available on this platform')
2068a19980eSPaolo Bonziniendif
2078a19980eSPaolo Bonziniif 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
2088a19980eSPaolo Bonzini  error('WHPX not available on this platform')
2098a19980eSPaolo Bonziniendif
2108a19980eSPaolo Bonziniif not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
2118a19980eSPaolo Bonzini  if 'CONFIG_XEN' in accelerators
2128a19980eSPaolo Bonzini    error('Xen PCI passthrough not available on this platform')
2138a19980eSPaolo Bonzini  else
2148a19980eSPaolo Bonzini    error('Xen PCI passthrough requested but Xen not enabled')
2158a19980eSPaolo Bonzini  endif
2168a19980eSPaolo Bonziniendif
217b4e312e9SPaolo Bonziniif not cocoa.found() and get_option('cocoa').enabled()
218b4e312e9SPaolo Bonzini  error('Cocoa not available on this platform')
219b4e312e9SPaolo Bonziniendif
220b4e312e9SPaolo Bonzini
2216ec0e15dSPaolo Bonzini################
2226ec0e15dSPaolo Bonzini# Dependencies #
2236ec0e15dSPaolo Bonzini################
2246ec0e15dSPaolo Bonzini
225215b0c2fSPaolo Bonzini# The path to glib.h is added to all compilation commands.  This was
226215b0c2fSPaolo Bonzini# grandfathered in from the QEMU Makefiles.
227215b0c2fSPaolo Bonziniadd_project_arguments(config_host['GLIB_CFLAGS'].split(),
228215b0c2fSPaolo Bonzini                      native: false, language: ['c', 'cpp', 'objc'])
229215b0c2fSPaolo Bonziniglib = declare_dependency(link_args: config_host['GLIB_LIBS'].split())
230a81df1b6SPaolo Bonzinigio = not_found
231a81df1b6SPaolo Bonziniif 'CONFIG_GIO' in config_host
232a81df1b6SPaolo Bonzini  gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
233a81df1b6SPaolo Bonzini                           link_args: config_host['GIO_LIBS'].split())
234a81df1b6SPaolo Bonziniendif
235a81df1b6SPaolo Bonzinilttng = not_found
236a81df1b6SPaolo Bonziniif 'CONFIG_TRACE_UST' in config_host
237a81df1b6SPaolo Bonzini  lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
238a81df1b6SPaolo Bonziniendif
239a81df1b6SPaolo Bonziniurcubp = not_found
240a81df1b6SPaolo Bonziniif 'CONFIG_TRACE_UST' in config_host
241a81df1b6SPaolo Bonzini  urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
242a81df1b6SPaolo Bonziniendif
24346859d93SDaniel P. Berrangégcrypt = not_found
24446859d93SDaniel P. Berrangéif 'CONFIG_GCRYPT' in config_host
24546859d93SDaniel P. Berrangé  gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
24646859d93SDaniel P. Berrangé                              link_args: config_host['GCRYPT_LIBS'].split())
24746859d93SDaniel P. Berrangéendif
248a81df1b6SPaolo Bonzininettle = not_found
249a81df1b6SPaolo Bonziniif 'CONFIG_NETTLE' in config_host
250a81df1b6SPaolo Bonzini  nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
251a81df1b6SPaolo Bonzini                              link_args: config_host['NETTLE_LIBS'].split())
252a81df1b6SPaolo Bonziniendif
253a81df1b6SPaolo Bonzinignutls = not_found
254a81df1b6SPaolo Bonziniif 'CONFIG_GNUTLS' in config_host
255a81df1b6SPaolo Bonzini  gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
256a81df1b6SPaolo Bonzini                              link_args: config_host['GNUTLS_LIBS'].split())
257a81df1b6SPaolo Bonziniendif
258b7612f45SPaolo Bonzinipixman = not_found
259b7612f45SPaolo Bonziniif have_system or have_tools
260b7612f45SPaolo Bonzini  pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
2611a94933fSPaolo Bonzini                      method: 'pkg-config', static: enable_static)
262b7612f45SPaolo Bonziniendif
2635e7fbd25SMarc-André Lureaupam = not_found
2645e7fbd25SMarc-André Lureauif 'CONFIG_AUTH_PAM' in config_host
2655e7fbd25SMarc-André Lureau  pam = cc.find_library('pam')
2665e7fbd25SMarc-André Lureauendif
2675e5733e5SMarc-André Lureaulibaio = cc.find_library('aio', required: false)
2681ffb3bbbSPaolo Bonzinizlib = dependency('zlib', required: true, static: enable_static)
2695e5733e5SMarc-André Lureaulinux_io_uring = not_found
2705e5733e5SMarc-André Lureauif 'CONFIG_LINUX_IO_URING' in config_host
2715e5733e5SMarc-André Lureau  linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
2725e5733e5SMarc-André Lureau                                      link_args: config_host['LINUX_IO_URING_LIBS'].split())
2735e5733e5SMarc-André Lureauendif
2745e5733e5SMarc-André Lureaulibxml2 = not_found
2755e5733e5SMarc-André Lureauif 'CONFIG_LIBXML2' in config_host
2765e5733e5SMarc-André Lureau  libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
2775e5733e5SMarc-André Lureau                               link_args: config_host['LIBXML2_LIBS'].split())
2785e5733e5SMarc-André Lureauendif
2795e5733e5SMarc-André Lureaulibnfs = not_found
2805e5733e5SMarc-André Lureauif 'CONFIG_LIBNFS' in config_host
2815e5733e5SMarc-André Lureau  libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
2825e5733e5SMarc-André Lureauendif
283ec0d5893SMarc-André Lureaulibattr = not_found
284ec0d5893SMarc-André Lureauif 'CONFIG_ATTR' in config_host
285ec0d5893SMarc-André Lureau  libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
286ec0d5893SMarc-André Lureauendif
2873f99cf57SPaolo Bonziniseccomp = not_found
2883f99cf57SPaolo Bonziniif 'CONFIG_SECCOMP' in config_host
2893f99cf57SPaolo Bonzini  seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
2903f99cf57SPaolo Bonzini                               link_args: config_host['SECCOMP_LIBS'].split())
2913f99cf57SPaolo Bonziniendif
2923f99cf57SPaolo Bonzinilibcap_ng = not_found
2933f99cf57SPaolo Bonziniif 'CONFIG_LIBCAP_NG' in config_host
2943f99cf57SPaolo Bonzini  libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
2953f99cf57SPaolo Bonziniendif
2961917ec6dSPaolo Bonziniif get_option('xkbcommon').auto() and not have_system and not have_tools
2971917ec6dSPaolo Bonzini  xkbcommon = not_found
2981917ec6dSPaolo Bonzinielse
2991917ec6dSPaolo Bonzini  xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
3001a94933fSPaolo Bonzini                         method: 'pkg-config', static: enable_static)
301ade60d4fSMarc-André Lureauendif
302cdaf0722SMarc-André Lureauslirp = not_found
303cdaf0722SMarc-André Lureauif config_host.has_key('CONFIG_SLIRP')
304cdaf0722SMarc-André Lureau  slirp = declare_dependency(compile_args: config_host['SLIRP_CFLAGS'].split(),
305cdaf0722SMarc-André Lureau                             link_args: config_host['SLIRP_LIBS'].split())
306cdaf0722SMarc-André Lureauendif
307cdaf0722SMarc-André Lureauvde = not_found
308cdaf0722SMarc-André Lureauif config_host.has_key('CONFIG_VDE')
309cdaf0722SMarc-André Lureau  vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
310cdaf0722SMarc-André Lureauendif
311478e943fSPaolo Bonzinipulse = not_found
312478e943fSPaolo Bonziniif 'CONFIG_LIBPULSE' in config_host
313478e943fSPaolo Bonzini  pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
314478e943fSPaolo Bonzini                             link_args: config_host['PULSE_LIBS'].split())
315478e943fSPaolo Bonziniendif
316478e943fSPaolo Bonzinialsa = not_found
317478e943fSPaolo Bonziniif 'CONFIG_ALSA' in config_host
318478e943fSPaolo Bonzini  alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
319478e943fSPaolo Bonzini                            link_args: config_host['ALSA_LIBS'].split())
320478e943fSPaolo Bonziniendif
321478e943fSPaolo Bonzinijack = not_found
322478e943fSPaolo Bonziniif 'CONFIG_LIBJACK' in config_host
323478e943fSPaolo Bonzini  jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
324478e943fSPaolo Bonziniendif
3252634733cSPaolo Bonzinispice = not_found
3262634733cSPaolo Bonziniif 'CONFIG_SPICE' in config_host
3272634733cSPaolo Bonzini  spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
3282634733cSPaolo Bonzini                             link_args: config_host['SPICE_LIBS'].split())
3292634733cSPaolo Bonziniendif
3305ee24e78SMarc-André Lureaurt = cc.find_library('rt', required: false)
331ccf7afa5SPaolo Bonzinilibdl = not_found
332ccf7afa5SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host
333ccf7afa5SPaolo Bonzini  libdl = cc.find_library('dl', required: true)
334ccf7afa5SPaolo Bonziniendif
33599650b62SPaolo Bonzinilibiscsi = not_found
33699650b62SPaolo Bonziniif 'CONFIG_LIBISCSI' in config_host
33799650b62SPaolo Bonzini  libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
33899650b62SPaolo Bonzini                                link_args: config_host['LIBISCSI_LIBS'].split())
33999650b62SPaolo Bonziniendif
3405e5733e5SMarc-André Lureauzstd = not_found
3415e5733e5SMarc-André Lureauif 'CONFIG_ZSTD' in config_host
3425e5733e5SMarc-André Lureau  zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
3435e5733e5SMarc-André Lureau                            link_args: config_host['ZSTD_LIBS'].split())
3445e5733e5SMarc-André Lureauendif
345ea458960SMarc-André Lureaugbm = not_found
346ea458960SMarc-André Lureauif 'CONFIG_GBM' in config_host
347ea458960SMarc-André Lureau  gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
348ea458960SMarc-André Lureau                           link_args: config_host['GBM_LIBS'].split())
349ea458960SMarc-André Lureauendif
350ea458960SMarc-André Lureauvirgl = not_found
351ea458960SMarc-André Lureauif 'CONFIG_VIRGL' in config_host
352ea458960SMarc-André Lureau  virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
353ea458960SMarc-André Lureau                             link_args: config_host['VIRGL_LIBS'].split())
354ea458960SMarc-André Lureauendif
3551d7bb6abSMarc-André Lureaucurl = not_found
3561d7bb6abSMarc-André Lureauif 'CONFIG_CURL' in config_host
3571d7bb6abSMarc-André Lureau  curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
3581d7bb6abSMarc-André Lureau                            link_args: config_host['CURL_LIBS'].split())
3591d7bb6abSMarc-André Lureauendif
360f15bff25SPaolo Bonzinilibudev = not_found
361f01496a3SPaolo Bonziniif targetos == 'linux' and (have_system or have_tools)
3626ec0e15dSPaolo Bonzini  libudev = dependency('libudev',
3636ec0e15dSPaolo Bonzini                       required: get_option('mpath').enabled(),
3646ec0e15dSPaolo Bonzini                       static: enable_static)
365f15bff25SPaolo Bonziniendif
3666ec0e15dSPaolo Bonzini
3676ec0e15dSPaolo Bonzinimpathpersist = not_found
3686ec0e15dSPaolo Bonzinimpathpersist_new_api = false
3696ec0e15dSPaolo Bonziniif targetos == 'linux' and have_tools and not get_option('mpath').disabled()
3706ec0e15dSPaolo Bonzini  mpath_test_source_new = '''
3716ec0e15dSPaolo Bonzini    #include <libudev.h>
3726ec0e15dSPaolo Bonzini    #include <mpath_persist.h>
3736ec0e15dSPaolo Bonzini    unsigned mpath_mx_alloc_len = 1024;
3746ec0e15dSPaolo Bonzini    int logsink;
3756ec0e15dSPaolo Bonzini    static struct config *multipath_conf;
3766ec0e15dSPaolo Bonzini    extern struct udev *udev;
3776ec0e15dSPaolo Bonzini    extern struct config *get_multipath_config(void);
3786ec0e15dSPaolo Bonzini    extern void put_multipath_config(struct config *conf);
3796ec0e15dSPaolo Bonzini    struct udev *udev;
3806ec0e15dSPaolo Bonzini    struct config *get_multipath_config(void) { return multipath_conf; }
3816ec0e15dSPaolo Bonzini    void put_multipath_config(struct config *conf) { }
3826ec0e15dSPaolo Bonzini    int main(void) {
3836ec0e15dSPaolo Bonzini        udev = udev_new();
3846ec0e15dSPaolo Bonzini        multipath_conf = mpath_lib_init();
3856ec0e15dSPaolo Bonzini        return 0;
3866ec0e15dSPaolo Bonzini    }'''
3876ec0e15dSPaolo Bonzini  mpath_test_source_old = '''
3886ec0e15dSPaolo Bonzini      #include <libudev.h>
3896ec0e15dSPaolo Bonzini      #include <mpath_persist.h>
3906ec0e15dSPaolo Bonzini      unsigned mpath_mx_alloc_len = 1024;
3916ec0e15dSPaolo Bonzini      int logsink;
3926ec0e15dSPaolo Bonzini      int main(void) {
3936ec0e15dSPaolo Bonzini          struct udev *udev = udev_new();
3946ec0e15dSPaolo Bonzini          mpath_lib_init(udev);
3956ec0e15dSPaolo Bonzini          return 0;
3966ec0e15dSPaolo Bonzini      }'''
39743b43a40SPaolo Bonzini  mpathlibs = [libudev]
39843b43a40SPaolo Bonzini  if enable_static
39943b43a40SPaolo Bonzini    mpathlibs += cc.find_library('devmapper',
4006ec0e15dSPaolo Bonzini                                   required: get_option('mpath'),
4016ec0e15dSPaolo Bonzini                                   static: enable_static)
40243b43a40SPaolo Bonzini  endif
40343b43a40SPaolo Bonzini  mpathlibs += cc.find_library('multipath',
4046ec0e15dSPaolo Bonzini                               required: get_option('mpath'),
4056ec0e15dSPaolo Bonzini                               static: enable_static)
40643b43a40SPaolo Bonzini  mpathlibs += cc.find_library('mpathpersist',
40743b43a40SPaolo Bonzini                               required: get_option('mpath'),
40843b43a40SPaolo Bonzini                               static: enable_static)
40943b43a40SPaolo Bonzini  foreach lib: mpathlibs
41043b43a40SPaolo Bonzini    if not lib.found()
41143b43a40SPaolo Bonzini      mpathlibs = []
41243b43a40SPaolo Bonzini      break
41343b43a40SPaolo Bonzini    endif
41443b43a40SPaolo Bonzini  endforeach
41543b43a40SPaolo Bonzini  if mpathlibs.length() > 0
4166ec0e15dSPaolo Bonzini    if cc.links(mpath_test_source_new, dependencies: mpathlibs)
4176ec0e15dSPaolo Bonzini      mpathpersist = declare_dependency(dependencies: mpathlibs)
4186ec0e15dSPaolo Bonzini      mpathpersist_new_api = true
4196ec0e15dSPaolo Bonzini    elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
4206ec0e15dSPaolo Bonzini      mpathpersist = declare_dependency(dependencies: mpathlibs)
4216ec0e15dSPaolo Bonzini    else
4226ec0e15dSPaolo Bonzini      if get_option('mpath').enabled()
4236ec0e15dSPaolo Bonzini        error('Cannot detect libmpathpersist API')
4246ec0e15dSPaolo Bonzini      else
4256ec0e15dSPaolo Bonzini        warning('Cannot detect libmpathpersist API, disabling')
4266ec0e15dSPaolo Bonzini      endif
4276ec0e15dSPaolo Bonzini    endif
4286ec0e15dSPaolo Bonzini  endif
4296ec0e15dSPaolo Bonziniendif
4306ec0e15dSPaolo Bonzini
4312634733cSPaolo Bonzinibrlapi = not_found
4322634733cSPaolo Bonziniif 'CONFIG_BRLAPI' in config_host
4332634733cSPaolo Bonzini  brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
4342634733cSPaolo Bonziniendif
43535be72baSPaolo Bonzini
436760e4327SPaolo Bonzinisdl = not_found
437760e4327SPaolo Bonziniif have_system
438363743daSYonggang Luo  sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
43935be72baSPaolo Bonzini  sdl_image = not_found
440760e4327SPaolo Bonziniendif
44135be72baSPaolo Bonziniif sdl.found()
44235be72baSPaolo Bonzini  # work around 2.0.8 bug
44335be72baSPaolo Bonzini  sdl = declare_dependency(compile_args: '-Wno-undef',
44435be72baSPaolo Bonzini                           dependencies: sdl)
4457161a433SVolker Rümelin  sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
4461a94933fSPaolo Bonzini                         method: 'pkg-config', static: enable_static)
44735be72baSPaolo Bonzinielse
44835be72baSPaolo Bonzini  if get_option('sdl_image').enabled()
449a8dc2aceSSergei Trofimovich    error('sdl-image required, but SDL was @0@'.format(
450a8dc2aceSSergei Trofimovich          get_option('sdl').disabled() ? 'disabled' : 'not found'))
4512634733cSPaolo Bonzini  endif
45235be72baSPaolo Bonzini  sdl_image = not_found
45335be72baSPaolo Bonziniendif
45435be72baSPaolo Bonzini
4555e5733e5SMarc-André Lureaurbd = not_found
4565e5733e5SMarc-André Lureauif 'CONFIG_RBD' in config_host
4575e5733e5SMarc-André Lureau  rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
4585e5733e5SMarc-André Lureauendif
4595e5733e5SMarc-André Lureauglusterfs = not_found
4605e5733e5SMarc-André Lureauif 'CONFIG_GLUSTERFS' in config_host
4615e5733e5SMarc-André Lureau  glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
4625e5733e5SMarc-André Lureau                                 link_args: config_host['GLUSTERFS_LIBS'].split())
4635e5733e5SMarc-André Lureauendif
4645e5733e5SMarc-André Lureaulibssh = not_found
4655e5733e5SMarc-André Lureauif 'CONFIG_LIBSSH' in config_host
4665e5733e5SMarc-André Lureau  libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
4675e5733e5SMarc-André Lureau                              link_args: config_host['LIBSSH_LIBS'].split())
4685e5733e5SMarc-André Lureauendif
4695e5733e5SMarc-André Lureaulibbzip2 = not_found
4705e5733e5SMarc-André Lureauif 'CONFIG_BZIP2' in config_host
4715e5733e5SMarc-André Lureau  libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
4725e5733e5SMarc-André Lureauendif
4735e5733e5SMarc-André Lureauliblzfse = not_found
4745e5733e5SMarc-André Lureauif 'CONFIG_LZFSE' in config_host
4755e5733e5SMarc-André Lureau  liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
4765e5733e5SMarc-André Lureauendif
477478e943fSPaolo Bonzinioss = not_found
478478e943fSPaolo Bonziniif 'CONFIG_AUDIO_OSS' in config_host
479478e943fSPaolo Bonzini  oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
480478e943fSPaolo Bonziniendif
481478e943fSPaolo Bonzinidsound = not_found
482478e943fSPaolo Bonziniif 'CONFIG_AUDIO_DSOUND' in config_host
483478e943fSPaolo Bonzini  dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
484478e943fSPaolo Bonziniendif
485478e943fSPaolo Bonzinicoreaudio = not_found
486478e943fSPaolo Bonziniif 'CONFIG_AUDIO_COREAUDIO' in config_host
487478e943fSPaolo Bonzini  coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
488478e943fSPaolo Bonziniendif
4892b1ccdf4SMarc-André Lureauopengl = not_found
4902b1ccdf4SMarc-André Lureauif 'CONFIG_OPENGL' in config_host
491de2d3005SPaolo Bonzini  opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
492de2d3005SPaolo Bonzini                              link_args: config_host['OPENGL_LIBS'].split())
4932b1ccdf4SMarc-André Lureauendif
4942b1ccdf4SMarc-André Lureaugtk = not_found
4952b1ccdf4SMarc-André Lureauif 'CONFIG_GTK' in config_host
4962b1ccdf4SMarc-André Lureau  gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
4972b1ccdf4SMarc-André Lureau                              link_args: config_host['GTK_LIBS'].split())
4982b1ccdf4SMarc-André Lureauendif
4992b1ccdf4SMarc-André Lureauvte = not_found
5002b1ccdf4SMarc-André Lureauif 'CONFIG_VTE' in config_host
5012b1ccdf4SMarc-André Lureau  vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
5022b1ccdf4SMarc-André Lureau                           link_args: config_host['VTE_LIBS'].split())
5032b1ccdf4SMarc-André Lureauendif
5042b1ccdf4SMarc-André Lureaux11 = not_found
5052b1ccdf4SMarc-André Lureauif 'CONFIG_X11' in config_host
5062b1ccdf4SMarc-André Lureau  x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
5072b1ccdf4SMarc-André Lureau                           link_args: config_host['X11_LIBS'].split())
5082b1ccdf4SMarc-André Lureauendif
5092b1ccdf4SMarc-André Lureaucurses = not_found
5102b1ccdf4SMarc-André Lureauif 'CONFIG_CURSES' in config_host
5112b1ccdf4SMarc-André Lureau  curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
5122b1ccdf4SMarc-André Lureau                              link_args: config_host['CURSES_LIBS'].split())
5132b1ccdf4SMarc-André Lureauendif
5142b1ccdf4SMarc-André Lureauiconv = not_found
5152b1ccdf4SMarc-André Lureauif 'CONFIG_ICONV' in config_host
5162b1ccdf4SMarc-André Lureau  iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
5172b1ccdf4SMarc-André Lureau                             link_args: config_host['ICONV_LIBS'].split())
5182b1ccdf4SMarc-André Lureauendif
519a0b93237SPaolo Bonzinivnc = not_found
5202b1ccdf4SMarc-André Lureaupng = not_found
5212b1ccdf4SMarc-André Lureaujpeg = not_found
5222b1ccdf4SMarc-André Lureausasl = not_found
523a0b93237SPaolo Bonziniif get_option('vnc').enabled()
524a0b93237SPaolo Bonzini  vnc = declare_dependency() # dummy dependency
525a0b93237SPaolo Bonzini  png = dependency('libpng', required: get_option('vnc_png'),
5261a94933fSPaolo Bonzini                   method: 'pkg-config', static: enable_static)
527a0b93237SPaolo Bonzini  jpeg = cc.find_library('jpeg', has_headers: ['jpeglib.h'],
528a0b93237SPaolo Bonzini                         required: get_option('vnc_jpeg'),
529a0b93237SPaolo Bonzini                         static: enable_static)
530a0b93237SPaolo Bonzini  sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
531a0b93237SPaolo Bonzini                         required: get_option('vnc_sasl'),
532a0b93237SPaolo Bonzini                         static: enable_static)
533a0b93237SPaolo Bonzini  if sasl.found()
534a0b93237SPaolo Bonzini    sasl = declare_dependency(dependencies: sasl,
535a0b93237SPaolo Bonzini                              compile_args: '-DSTRUCT_IOVEC_DEFINED')
536a0b93237SPaolo Bonzini  endif
5372b1ccdf4SMarc-André Lureauendif
5384a96337dSPaolo Bonzinifdt = not_found
5394a96337dSPaolo Bonziniif 'CONFIG_FDT' in config_host
5404a96337dSPaolo Bonzini  fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
5414a96337dSPaolo Bonzini                           link_args: config_host['FDT_LIBS'].split())
5424a96337dSPaolo Bonziniendif
543708eab42SMarc-André Lureausnappy = not_found
544708eab42SMarc-André Lureauif 'CONFIG_SNAPPY' in config_host
545708eab42SMarc-André Lureau  snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
546708eab42SMarc-André Lureauendif
547708eab42SMarc-André Lureaulzo = not_found
548708eab42SMarc-André Lureauif 'CONFIG_LZO' in config_host
549708eab42SMarc-André Lureau  lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
550708eab42SMarc-André Lureauendif
55155166230SMarc-André Lureaurdma = not_found
55255166230SMarc-André Lureauif 'CONFIG_RDMA' in config_host
55355166230SMarc-André Lureau  rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
55455166230SMarc-André Lureauendif
555ab318051SMarc-André Lureaunuma = not_found
556ab318051SMarc-André Lureauif 'CONFIG_NUMA' in config_host
557ab318051SMarc-André Lureau  numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
558ab318051SMarc-André Lureauendif
559582ea95fSMarc-André Lureauxen = not_found
560582ea95fSMarc-André Lureauif 'CONFIG_XEN_BACKEND' in config_host
561582ea95fSMarc-André Lureau  xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
562582ea95fSMarc-André Lureau                           link_args: config_host['XEN_LIBS'].split())
563582ea95fSMarc-André Lureauendif
56406677ce1SPaolo Bonzinicacard = not_found
56506677ce1SPaolo Bonziniif 'CONFIG_SMARTCARD' in config_host
56606677ce1SPaolo Bonzini  cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
56706677ce1SPaolo Bonzini                              link_args: config_host['SMARTCARD_LIBS'].split())
56806677ce1SPaolo Bonziniendif
5690a40bcb7SCésar Belleyu2f = not_found
5700a40bcb7SCésar Belleyif have_system
5710a40bcb7SCésar Belley  u2f = dependency('u2f-emu', required: get_option('u2f'),
5720a40bcb7SCésar Belley                   method: 'pkg-config',
5730a40bcb7SCésar Belley                   static: enable_static)
5740a40bcb7SCésar Belleyendif
57506677ce1SPaolo Bonziniusbredir = not_found
57606677ce1SPaolo Bonziniif 'CONFIG_USB_REDIR' in config_host
57706677ce1SPaolo Bonzini  usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
57806677ce1SPaolo Bonzini                                link_args: config_host['USB_REDIR_LIBS'].split())
57906677ce1SPaolo Bonziniendif
58006677ce1SPaolo Bonzinilibusb = not_found
58106677ce1SPaolo Bonziniif 'CONFIG_USB_LIBUSB' in config_host
58206677ce1SPaolo Bonzini  libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
58306677ce1SPaolo Bonzini                              link_args: config_host['LIBUSB_LIBS'].split())
58406677ce1SPaolo Bonziniendif
585c9322ab5SMarc-André Lureaucapstone = not_found
586c9322ab5SMarc-André Lureauif 'CONFIG_CAPSTONE' in config_host
587c9322ab5SMarc-André Lureau  capstone = declare_dependency(compile_args: config_host['CAPSTONE_CFLAGS'].split(),
588c9322ab5SMarc-André Lureau                                link_args: config_host['CAPSTONE_LIBS'].split())
589c9322ab5SMarc-André Lureauendif
590c9322ab5SMarc-André Lureaulibpmem = not_found
591c9322ab5SMarc-André Lureauif 'CONFIG_LIBPMEM' in config_host
592c9322ab5SMarc-André Lureau  libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
593c9322ab5SMarc-André Lureau                               link_args: config_host['LIBPMEM_LIBS'].split())
594c9322ab5SMarc-André Lureauendif
595c7c91a74SBruce Rogerslibdaxctl = not_found
596c7c91a74SBruce Rogersif 'CONFIG_LIBDAXCTL' in config_host
597c7c91a74SBruce Rogers  libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
598c7c91a74SBruce Rogersendif
5998ce0a45fSMarc-André Lureautasn1 = not_found
6008ce0a45fSMarc-André Lureauif 'CONFIG_TASN1' in config_host
6018ce0a45fSMarc-André Lureau  tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
6028ce0a45fSMarc-André Lureau                             link_args: config_host['TASN1_LIBS'].split())
6038ce0a45fSMarc-André Lureauendif
604af04e89dSMarc-André Lureaukeyutils = dependency('libkeyutils', required: false,
605af04e89dSMarc-André Lureau                      method: 'pkg-config', static: enable_static)
606a81df1b6SPaolo Bonzini
6073909def8SMarc-André Lureauhas_gettid = cc.has_function('gettid')
6083909def8SMarc-André Lureau
609aa087962SPaolo Bonzini# Malloc tests
610aa087962SPaolo Bonzini
611aa087962SPaolo Bonzinimalloc = []
612aa087962SPaolo Bonziniif get_option('malloc') == 'system'
613aa087962SPaolo Bonzini  has_malloc_trim = \
614aa087962SPaolo Bonzini    not get_option('malloc_trim').disabled() and \
615aa087962SPaolo Bonzini    cc.links('''#include <malloc.h>
616aa087962SPaolo Bonzini                int main(void) { malloc_trim(0); return 0; }''')
617aa087962SPaolo Bonzinielse
618aa087962SPaolo Bonzini  has_malloc_trim = false
619aa087962SPaolo Bonzini  malloc = cc.find_library(get_option('malloc'), required: true)
620aa087962SPaolo Bonziniendif
621aa087962SPaolo Bonziniif not has_malloc_trim and get_option('malloc_trim').enabled()
622aa087962SPaolo Bonzini  if get_option('malloc') == 'system'
623aa087962SPaolo Bonzini    error('malloc_trim not available on this platform.')
624aa087962SPaolo Bonzini  else
625aa087962SPaolo Bonzini    error('malloc_trim not available with non-libc memory allocator')
626aa087962SPaolo Bonzini  endif
627aa087962SPaolo Bonziniendif
628aa087962SPaolo Bonzini
629859aef02SPaolo Bonzini# Create config-host.h
630859aef02SPaolo Bonzini
631b4e312e9SPaolo Bonziniconfig_host_data.set('CONFIG_COCOA', cocoa.found())
632f01496a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBUDEV', libudev.found())
6336ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH', mpathpersist.found())
6346ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
63535be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL', sdl.found())
63635be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
637a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC', vnc.found())
638a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
639a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_PNG', png.found())
640a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_SASL', sasl.found())
6414113f4cfSLaurent Vivierconfig_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
642af04e89dSMarc-André Lureauconfig_host_data.set('CONFIG_KEYUTILS', keyutils.found())
6433909def8SMarc-André Lureauconfig_host_data.set('CONFIG_GETTID', has_gettid)
644aa087962SPaolo Bonziniconfig_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
645859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
646859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
647859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
648859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
649859aef02SPaolo Bonzini
650765686d6SPaolo Bonziniignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
651859aef02SPaolo Bonziniarrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
652f4f5ed2cSPaolo Bonzinistrings = ['HOST_DSOSUF', 'CONFIG_IASL', 'bindir', 'prefix', 'qemu_confdir', 'qemu_datadir',
653859aef02SPaolo Bonzini           'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
654f4f5ed2cSPaolo Bonzini           'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath', 'sysconfdir']
655859aef02SPaolo Bonziniforeach k, v: config_host
656765686d6SPaolo Bonzini  if ignored.contains(k)
657765686d6SPaolo Bonzini    # do nothing
658765686d6SPaolo Bonzini  elif arrays.contains(k)
659859aef02SPaolo Bonzini    if v != ''
660859aef02SPaolo Bonzini      v = '"' + '", "'.join(v.split()) + '", '
661859aef02SPaolo Bonzini    endif
662859aef02SPaolo Bonzini    config_host_data.set(k, v)
663859aef02SPaolo Bonzini  elif k == 'ARCH'
664859aef02SPaolo Bonzini    config_host_data.set('HOST_' + v.to_upper(), 1)
665859aef02SPaolo Bonzini  elif strings.contains(k)
666859aef02SPaolo Bonzini    if not k.startswith('CONFIG_')
667859aef02SPaolo Bonzini      k = 'CONFIG_' + k.to_upper()
668859aef02SPaolo Bonzini    endif
669859aef02SPaolo Bonzini    config_host_data.set_quoted(k, v)
670859aef02SPaolo Bonzini  elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
671859aef02SPaolo Bonzini    config_host_data.set(k, v == 'y' ? 1 : v)
672859aef02SPaolo Bonzini  endif
673859aef02SPaolo Bonziniendforeach
674859aef02SPaolo Bonzinigenh += configure_file(output: 'config-host.h', configuration: config_host_data)
675859aef02SPaolo Bonzini
6762becc36aSPaolo Bonziniminikconf = find_program('scripts/minikconf.py')
67705512f55SPaolo Bonziniconfig_all = {}
678a98006bcSPaolo Bonziniconfig_all_devices = {}
679ca0fc784SPaolo Bonziniconfig_all_disas = {}
6802becc36aSPaolo Bonziniconfig_devices_mak_list = []
6812becc36aSPaolo Bonziniconfig_devices_h = {}
682859aef02SPaolo Bonziniconfig_target_h = {}
6832becc36aSPaolo Bonziniconfig_target_mak = {}
684ca0fc784SPaolo Bonzini
685ca0fc784SPaolo Bonzinidisassemblers = {
686ca0fc784SPaolo Bonzini  'alpha' : ['CONFIG_ALPHA_DIS'],
687ca0fc784SPaolo Bonzini  'arm' : ['CONFIG_ARM_DIS'],
688ca0fc784SPaolo Bonzini  'avr' : ['CONFIG_AVR_DIS'],
689ca0fc784SPaolo Bonzini  'cris' : ['CONFIG_CRIS_DIS'],
690ca0fc784SPaolo Bonzini  'hppa' : ['CONFIG_HPPA_DIS'],
691ca0fc784SPaolo Bonzini  'i386' : ['CONFIG_I386_DIS'],
692ca0fc784SPaolo Bonzini  'x86_64' : ['CONFIG_I386_DIS'],
693ca0fc784SPaolo Bonzini  'x32' : ['CONFIG_I386_DIS'],
694ca0fc784SPaolo Bonzini  'lm32' : ['CONFIG_LM32_DIS'],
695ca0fc784SPaolo Bonzini  'm68k' : ['CONFIG_M68K_DIS'],
696ca0fc784SPaolo Bonzini  'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
697ca0fc784SPaolo Bonzini  'mips' : ['CONFIG_MIPS_DIS'],
698ca0fc784SPaolo Bonzini  'moxie' : ['CONFIG_MOXIE_DIS'],
699ca0fc784SPaolo Bonzini  'nios2' : ['CONFIG_NIOS2_DIS'],
700ca0fc784SPaolo Bonzini  'or1k' : ['CONFIG_OPENRISC_DIS'],
701ca0fc784SPaolo Bonzini  'ppc' : ['CONFIG_PPC_DIS'],
702ca0fc784SPaolo Bonzini  'riscv' : ['CONFIG_RISCV_DIS'],
703ca0fc784SPaolo Bonzini  'rx' : ['CONFIG_RX_DIS'],
704ca0fc784SPaolo Bonzini  's390' : ['CONFIG_S390_DIS'],
705ca0fc784SPaolo Bonzini  'sh4' : ['CONFIG_SH4_DIS'],
706ca0fc784SPaolo Bonzini  'sparc' : ['CONFIG_SPARC_DIS'],
707ca0fc784SPaolo Bonzini  'xtensa' : ['CONFIG_XTENSA_DIS'],
708ca0fc784SPaolo Bonzini}
709ca0fc784SPaolo Bonziniif link_language == 'cpp'
710ca0fc784SPaolo Bonzini  disassemblers += {
711ca0fc784SPaolo Bonzini    'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
712ca0fc784SPaolo Bonzini    'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
713ca0fc784SPaolo Bonzini    'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
714ca0fc784SPaolo Bonzini  }
715ca0fc784SPaolo Bonziniendif
716ca0fc784SPaolo Bonzini
7172becc36aSPaolo Bonzinikconfig_external_symbols = [
7182becc36aSPaolo Bonzini  'CONFIG_KVM',
7192becc36aSPaolo Bonzini  'CONFIG_XEN',
7202becc36aSPaolo Bonzini  'CONFIG_TPM',
7212becc36aSPaolo Bonzini  'CONFIG_SPICE',
7222becc36aSPaolo Bonzini  'CONFIG_IVSHMEM',
7232becc36aSPaolo Bonzini  'CONFIG_OPENGL',
7242becc36aSPaolo Bonzini  'CONFIG_X11',
7252becc36aSPaolo Bonzini  'CONFIG_VHOST_USER',
72640bc0ca9SLaurent Vivier  'CONFIG_VHOST_VDPA',
7272becc36aSPaolo Bonzini  'CONFIG_VHOST_KERNEL',
7282becc36aSPaolo Bonzini  'CONFIG_VIRTFS',
7292becc36aSPaolo Bonzini  'CONFIG_LINUX',
7302becc36aSPaolo Bonzini  'CONFIG_PVRDMA',
7312becc36aSPaolo Bonzini]
732a9a74907SPaolo Bonziniignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
733ca0fc784SPaolo Bonzini
734fdb75aefSPaolo Bonzinidefault_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
735fdb75aefSPaolo Bonziniactual_target_dirs = []
736a81df1b6SPaolo Bonziniforeach target : target_dirs
737765686d6SPaolo Bonzini  config_target = { 'TARGET_NAME': target.split('-')[0] }
738765686d6SPaolo Bonzini  if target.endswith('linux-user')
739fdb75aefSPaolo Bonzini    if targetos != 'linux'
740fdb75aefSPaolo Bonzini      if default_targets
741fdb75aefSPaolo Bonzini        continue
742fdb75aefSPaolo Bonzini      endif
743fdb75aefSPaolo Bonzini      error('Target @0@ is only available on a Linux host'.format(target))
744fdb75aefSPaolo Bonzini    endif
745765686d6SPaolo Bonzini    config_target += { 'CONFIG_LINUX_USER': 'y' }
746765686d6SPaolo Bonzini  elif target.endswith('bsd-user')
747fdb75aefSPaolo Bonzini    if 'CONFIG_BSD' not in config_host
748fdb75aefSPaolo Bonzini      if default_targets
749fdb75aefSPaolo Bonzini        continue
750fdb75aefSPaolo Bonzini      endif
751fdb75aefSPaolo Bonzini      error('Target @0@ is only available on a BSD host'.format(target))
752fdb75aefSPaolo Bonzini    endif
753765686d6SPaolo Bonzini    config_target += { 'CONFIG_BSD_USER': 'y' }
754765686d6SPaolo Bonzini  elif target.endswith('softmmu')
755765686d6SPaolo Bonzini    config_target += { 'CONFIG_SOFTMMU': 'y' }
756765686d6SPaolo Bonzini  endif
757765686d6SPaolo Bonzini  if target.endswith('-user')
758765686d6SPaolo Bonzini    config_target += {
759765686d6SPaolo Bonzini      'CONFIG_USER_ONLY': 'y',
760765686d6SPaolo Bonzini      'CONFIG_QEMU_INTERP_PREFIX':
761765686d6SPaolo Bonzini        config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
762765686d6SPaolo Bonzini    }
763765686d6SPaolo Bonzini  endif
764859aef02SPaolo Bonzini
7658a19980eSPaolo Bonzini  have_accel = false
7668a19980eSPaolo Bonzini  foreach sym: accelerators
7678a19980eSPaolo Bonzini    if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
7688a19980eSPaolo Bonzini      config_target += { sym: 'y' }
7698a19980eSPaolo Bonzini      config_all += { sym: 'y' }
7708a19980eSPaolo Bonzini      if sym == 'CONFIG_XEN' and have_xen_pci_passthrough
7718a19980eSPaolo Bonzini        config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
7728a19980eSPaolo Bonzini      endif
7738a19980eSPaolo Bonzini      have_accel = true
7748a19980eSPaolo Bonzini    endif
7758a19980eSPaolo Bonzini  endforeach
776fdb75aefSPaolo Bonzini  if not have_accel
777fdb75aefSPaolo Bonzini    if default_targets
778fdb75aefSPaolo Bonzini      continue
779fdb75aefSPaolo Bonzini    endif
780fdb75aefSPaolo Bonzini    error('No accelerator available for target @0@'.format(target))
781fdb75aefSPaolo Bonzini  endif
7828a19980eSPaolo Bonzini
783fdb75aefSPaolo Bonzini  actual_target_dirs += target
784765686d6SPaolo Bonzini  config_target += keyval.load('default-configs/targets' / target + '.mak')
785a9a74907SPaolo Bonzini  config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
786765686d6SPaolo Bonzini
787fa73168bSPaolo Bonzini  # Add default keys
788fa73168bSPaolo Bonzini  if 'TARGET_BASE_ARCH' not in config_target
789fa73168bSPaolo Bonzini    config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
790fa73168bSPaolo Bonzini  endif
791fa73168bSPaolo Bonzini  if 'TARGET_ABI_DIR' not in config_target
792fa73168bSPaolo Bonzini    config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
793fa73168bSPaolo Bonzini  endif
794fa73168bSPaolo Bonzini
795ca0fc784SPaolo Bonzini  foreach k, v: disassemblers
796ca0fc784SPaolo Bonzini    if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
797ca0fc784SPaolo Bonzini      foreach sym: v
798ca0fc784SPaolo Bonzini        config_target += { sym: 'y' }
799ca0fc784SPaolo Bonzini        config_all_disas += { sym: 'y' }
800ca0fc784SPaolo Bonzini      endforeach
801ca0fc784SPaolo Bonzini    endif
802ca0fc784SPaolo Bonzini  endforeach
803ca0fc784SPaolo Bonzini
804859aef02SPaolo Bonzini  config_target_data = configuration_data()
805859aef02SPaolo Bonzini  foreach k, v: config_target
806859aef02SPaolo Bonzini    if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
807859aef02SPaolo Bonzini      # do nothing
808859aef02SPaolo Bonzini    elif ignored.contains(k)
809859aef02SPaolo Bonzini      # do nothing
810859aef02SPaolo Bonzini    elif k == 'TARGET_BASE_ARCH'
811a9a74907SPaolo Bonzini      # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
812a9a74907SPaolo Bonzini      # not used to select files from sourcesets.
813859aef02SPaolo Bonzini      config_target_data.set('TARGET_' + v.to_upper(), 1)
814765686d6SPaolo Bonzini    elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
815859aef02SPaolo Bonzini      config_target_data.set_quoted(k, v)
816859aef02SPaolo Bonzini    elif v == 'y'
817859aef02SPaolo Bonzini      config_target_data.set(k, 1)
818859aef02SPaolo Bonzini    else
819859aef02SPaolo Bonzini      config_target_data.set(k, v)
820859aef02SPaolo Bonzini    endif
821859aef02SPaolo Bonzini  endforeach
822859aef02SPaolo Bonzini  config_target_h += {target: configure_file(output: target + '-config-target.h',
823859aef02SPaolo Bonzini                                               configuration: config_target_data)}
8242becc36aSPaolo Bonzini
8252becc36aSPaolo Bonzini  if target.endswith('-softmmu')
8262becc36aSPaolo Bonzini    base_kconfig = []
8272becc36aSPaolo Bonzini    foreach sym : kconfig_external_symbols
828859aef02SPaolo Bonzini      if sym in config_target or sym in config_host
8292becc36aSPaolo Bonzini        base_kconfig += '@0@=y'.format(sym)
8302becc36aSPaolo Bonzini      endif
8312becc36aSPaolo Bonzini    endforeach
8322becc36aSPaolo Bonzini
8332becc36aSPaolo Bonzini    config_devices_mak = target + '-config-devices.mak'
8342becc36aSPaolo Bonzini    config_devices_mak = configure_file(
8351bb4cb1cSPaolo Bonzini      input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
8362becc36aSPaolo Bonzini      output: config_devices_mak,
8372becc36aSPaolo Bonzini      depfile: config_devices_mak + '.d',
8382becc36aSPaolo Bonzini      capture: true,
8392becc36aSPaolo Bonzini      command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
8402becc36aSPaolo Bonzini                config_devices_mak, '@DEPFILE@', '@INPUT@',
8412becc36aSPaolo Bonzini                base_kconfig])
842859aef02SPaolo Bonzini
843859aef02SPaolo Bonzini    config_devices_data = configuration_data()
844859aef02SPaolo Bonzini    config_devices = keyval.load(config_devices_mak)
845859aef02SPaolo Bonzini    foreach k, v: config_devices
846859aef02SPaolo Bonzini      config_devices_data.set(k, 1)
847859aef02SPaolo Bonzini    endforeach
8482becc36aSPaolo Bonzini    config_devices_mak_list += config_devices_mak
849859aef02SPaolo Bonzini    config_devices_h += {target: configure_file(output: target + '-config-devices.h',
850859aef02SPaolo Bonzini                                                configuration: config_devices_data)}
851859aef02SPaolo Bonzini    config_target += config_devices
852a98006bcSPaolo Bonzini    config_all_devices += config_devices
8532becc36aSPaolo Bonzini  endif
8542becc36aSPaolo Bonzini  config_target_mak += {target: config_target}
855a81df1b6SPaolo Bonziniendforeach
856fdb75aefSPaolo Bonzinitarget_dirs = actual_target_dirs
857a81df1b6SPaolo Bonzini
8582becc36aSPaolo Bonzini# This configuration is used to build files that are shared by
8592becc36aSPaolo Bonzini# multiple binaries, and then extracted out of the "common"
8602becc36aSPaolo Bonzini# static_library target.
8612becc36aSPaolo Bonzini#
8622becc36aSPaolo Bonzini# We do not use all_sources()/all_dependencies(), because it would
8632becc36aSPaolo Bonzini# build literally all source files, including devices only used by
8642becc36aSPaolo Bonzini# targets that are not built for this compilation.  The CONFIG_ALL
8652becc36aSPaolo Bonzini# pseudo symbol replaces it.
8662becc36aSPaolo Bonzini
86705512f55SPaolo Bonziniconfig_all += config_all_devices
8682becc36aSPaolo Bonziniconfig_all += config_host
8692becc36aSPaolo Bonziniconfig_all += config_all_disas
8702becc36aSPaolo Bonziniconfig_all += {
8712becc36aSPaolo Bonzini  'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
8722becc36aSPaolo Bonzini  'CONFIG_SOFTMMU': have_system,
8732becc36aSPaolo Bonzini  'CONFIG_USER_ONLY': have_user,
8742becc36aSPaolo Bonzini  'CONFIG_ALL': true,
8752becc36aSPaolo Bonzini}
8762becc36aSPaolo Bonzini
877a81df1b6SPaolo Bonzini# Generators
878a81df1b6SPaolo Bonzini
8793f885659SMarc-André Lureauhxtool = find_program('scripts/hxtool')
880650b5d54SMarc-André Lureaushaderinclude = find_program('scripts/shaderinclude.pl')
881a81df1b6SPaolo Bonziniqapi_gen = find_program('scripts/qapi-gen.py')
882a81df1b6SPaolo Bonziniqapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
883a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/commands.py',
884a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/common.py',
885a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/error.py',
886a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/events.py',
887a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/expr.py',
888a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/gen.py',
889a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/introspect.py',
890a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/parser.py',
891a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/schema.py',
892a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/source.py',
893a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/types.py',
894a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/visit.py',
895a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/common.py',
896a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi-gen.py'
897a81df1b6SPaolo Bonzini]
898a81df1b6SPaolo Bonzini
899a81df1b6SPaolo Bonzinitracetool = [
900a81df1b6SPaolo Bonzini  python, files('scripts/tracetool.py'),
901a81df1b6SPaolo Bonzini   '--backend=' + config_host['TRACE_BACKENDS']
902a81df1b6SPaolo Bonzini]
903a81df1b6SPaolo Bonzini
9042c273f32SMarc-André Lureauqemu_version_cmd = [find_program('scripts/qemu-version.sh'),
9052c273f32SMarc-André Lureau                    meson.current_source_dir(),
906859aef02SPaolo Bonzini                    config_host['PKGVERSION'], meson.project_version()]
9072c273f32SMarc-André Lureauqemu_version = custom_target('qemu-version.h',
9082c273f32SMarc-André Lureau                             output: 'qemu-version.h',
9092c273f32SMarc-André Lureau                             command: qemu_version_cmd,
9102c273f32SMarc-André Lureau                             capture: true,
9112c273f32SMarc-André Lureau                             build_by_default: true,
9122c273f32SMarc-André Lureau                             build_always_stale: true)
9132c273f32SMarc-André Lureaugenh += qemu_version
9142c273f32SMarc-André Lureau
9153f885659SMarc-André Lureauhxdep = []
9163f885659SMarc-André Lureauhx_headers = [
9173f885659SMarc-André Lureau  ['qemu-options.hx', 'qemu-options.def'],
9183f885659SMarc-André Lureau  ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
9193f885659SMarc-André Lureau]
9203f885659SMarc-André Lureauif have_system
9213f885659SMarc-André Lureau  hx_headers += [
9223f885659SMarc-André Lureau    ['hmp-commands.hx', 'hmp-commands.h'],
9233f885659SMarc-André Lureau    ['hmp-commands-info.hx', 'hmp-commands-info.h'],
9243f885659SMarc-André Lureau  ]
9253f885659SMarc-André Lureauendif
9263f885659SMarc-André Lureauforeach d : hx_headers
927b7c70bf2SMarc-André Lureau  hxdep += custom_target(d[1],
9283f885659SMarc-André Lureau                input: files(d[0]),
9293f885659SMarc-André Lureau                output: d[1],
9303f885659SMarc-André Lureau                capture: true,
9313f885659SMarc-André Lureau                build_by_default: true, # to be removed when added to a target
9323f885659SMarc-André Lureau                command: [hxtool, '-h', '@INPUT0@'])
9333f885659SMarc-André Lureauendforeach
9343f885659SMarc-André Lureaugenh += hxdep
9353f885659SMarc-André Lureau
936eb937365SPeter MaydellSPHINX_ARGS = [config_host['SPHINX_BUILD'],
937eb937365SPeter Maydell               '-Dversion=' + meson.project_version(),
938eb937365SPeter Maydell               '-Drelease=' + config_host['PKGVERSION']]
939eb937365SPeter Maydell
940eb937365SPeter Maydellif get_option('werror')
941eb937365SPeter Maydell  SPHINX_ARGS += [ '-W' ]
942eb937365SPeter Maydellendif
943eb937365SPeter Maydell
944b3f4830aSPeter Maydellsphinx_extn_depends = [ meson.source_root() / 'docs/sphinx/depfile.py',
945b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/hxtool.py',
946b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/kerneldoc.py',
947b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/kernellog.py',
948b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/qapidoc.py',
949b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/qmp_lexer.py',
950b3f4830aSPeter Maydell                        qapi_gen_depends ]
951b3f4830aSPeter Maydell
952a81df1b6SPaolo Bonzini# Collect sourcesets.
953a81df1b6SPaolo Bonzini
954a81df1b6SPaolo Bonziniutil_ss = ss.source_set()
955a81df1b6SPaolo Bonzinistub_ss = ss.source_set()
956a81df1b6SPaolo Bonzinitrace_ss = ss.source_set()
9573154fee4SMarc-André Lureaublock_ss = ss.source_set()
9584a96337dSPaolo Bonziniblockdev_ss = ss.source_set()
959ff219dcaSPaolo Bonziniqmp_ss = ss.source_set()
9602becc36aSPaolo Bonzinicommon_ss = ss.source_set()
9612becc36aSPaolo Bonzinisoftmmu_ss = ss.source_set()
9622becc36aSPaolo Bonziniuser_ss = ss.source_set()
9632becc36aSPaolo Bonzinibsd_user_ss = ss.source_set()
9642becc36aSPaolo Bonzinilinux_user_ss = ss.source_set()
9652becc36aSPaolo Bonzinispecific_ss = ss.source_set()
96664ed6f92SPaolo Bonzinispecific_fuzz_ss = ss.source_set()
9672becc36aSPaolo Bonzini
9683154fee4SMarc-André Lureaumodules = {}
9692becc36aSPaolo Bonzinihw_arch = {}
9702becc36aSPaolo Bonzinitarget_arch = {}
9712becc36aSPaolo Bonzinitarget_softmmu_arch = {}
972a81df1b6SPaolo Bonzini
973a81df1b6SPaolo Bonzini###############
974a81df1b6SPaolo Bonzini# Trace files #
975a81df1b6SPaolo Bonzini###############
976a81df1b6SPaolo Bonzini
977c9322ab5SMarc-André Lureau# TODO: add each directory to the subdirs from its own meson.build, once
978c9322ab5SMarc-André Lureau# we have those
979a81df1b6SPaolo Bonzinitrace_events_subdirs = [
980a81df1b6SPaolo Bonzini  'accel/kvm',
981a81df1b6SPaolo Bonzini  'accel/tcg',
982a81df1b6SPaolo Bonzini  'crypto',
983a81df1b6SPaolo Bonzini  'monitor',
984a81df1b6SPaolo Bonzini]
985a81df1b6SPaolo Bonziniif have_user
986a81df1b6SPaolo Bonzini  trace_events_subdirs += [ 'linux-user' ]
987a81df1b6SPaolo Bonziniendif
988a81df1b6SPaolo Bonziniif have_block
989a81df1b6SPaolo Bonzini  trace_events_subdirs += [
990a81df1b6SPaolo Bonzini    'authz',
991a81df1b6SPaolo Bonzini    'block',
992a81df1b6SPaolo Bonzini    'io',
993a81df1b6SPaolo Bonzini    'nbd',
994a81df1b6SPaolo Bonzini    'scsi',
995a81df1b6SPaolo Bonzini  ]
996a81df1b6SPaolo Bonziniendif
997a81df1b6SPaolo Bonziniif have_system
998a81df1b6SPaolo Bonzini  trace_events_subdirs += [
999a81df1b6SPaolo Bonzini    'audio',
1000a81df1b6SPaolo Bonzini    'backends',
1001a81df1b6SPaolo Bonzini    'backends/tpm',
1002a81df1b6SPaolo Bonzini    'chardev',
1003a81df1b6SPaolo Bonzini    'hw/9pfs',
1004a81df1b6SPaolo Bonzini    'hw/acpi',
1005a81df1b6SPaolo Bonzini    'hw/alpha',
1006a81df1b6SPaolo Bonzini    'hw/arm',
1007a81df1b6SPaolo Bonzini    'hw/audio',
1008a81df1b6SPaolo Bonzini    'hw/block',
1009a81df1b6SPaolo Bonzini    'hw/block/dataplane',
1010a81df1b6SPaolo Bonzini    'hw/char',
1011a81df1b6SPaolo Bonzini    'hw/display',
1012a81df1b6SPaolo Bonzini    'hw/dma',
1013a81df1b6SPaolo Bonzini    'hw/hppa',
1014a81df1b6SPaolo Bonzini    'hw/hyperv',
1015a81df1b6SPaolo Bonzini    'hw/i2c',
1016a81df1b6SPaolo Bonzini    'hw/i386',
1017a81df1b6SPaolo Bonzini    'hw/i386/xen',
1018a81df1b6SPaolo Bonzini    'hw/ide',
1019a81df1b6SPaolo Bonzini    'hw/input',
1020a81df1b6SPaolo Bonzini    'hw/intc',
1021a81df1b6SPaolo Bonzini    'hw/isa',
1022a81df1b6SPaolo Bonzini    'hw/mem',
1023a81df1b6SPaolo Bonzini    'hw/mips',
1024a81df1b6SPaolo Bonzini    'hw/misc',
1025a81df1b6SPaolo Bonzini    'hw/misc/macio',
1026a81df1b6SPaolo Bonzini    'hw/net',
1027a81df1b6SPaolo Bonzini    'hw/nvram',
1028a81df1b6SPaolo Bonzini    'hw/pci',
1029a81df1b6SPaolo Bonzini    'hw/pci-host',
1030a81df1b6SPaolo Bonzini    'hw/ppc',
1031a81df1b6SPaolo Bonzini    'hw/rdma',
1032a81df1b6SPaolo Bonzini    'hw/rdma/vmw',
1033a81df1b6SPaolo Bonzini    'hw/rtc',
1034a81df1b6SPaolo Bonzini    'hw/s390x',
1035a81df1b6SPaolo Bonzini    'hw/scsi',
1036a81df1b6SPaolo Bonzini    'hw/sd',
1037a81df1b6SPaolo Bonzini    'hw/sparc',
1038a81df1b6SPaolo Bonzini    'hw/sparc64',
1039a81df1b6SPaolo Bonzini    'hw/ssi',
1040a81df1b6SPaolo Bonzini    'hw/timer',
1041a81df1b6SPaolo Bonzini    'hw/tpm',
1042a81df1b6SPaolo Bonzini    'hw/usb',
1043a81df1b6SPaolo Bonzini    'hw/vfio',
1044a81df1b6SPaolo Bonzini    'hw/virtio',
1045a81df1b6SPaolo Bonzini    'hw/watchdog',
1046a81df1b6SPaolo Bonzini    'hw/xen',
1047a81df1b6SPaolo Bonzini    'hw/gpio',
1048a81df1b6SPaolo Bonzini    'migration',
1049a81df1b6SPaolo Bonzini    'net',
10508b7a5507SPhilippe Mathieu-Daudé    'softmmu',
1051a81df1b6SPaolo Bonzini    'ui',
1052a81df1b6SPaolo Bonzini  ]
1053a81df1b6SPaolo Bonziniendif
1054a81df1b6SPaolo Bonzinitrace_events_subdirs += [
1055a81df1b6SPaolo Bonzini  'hw/core',
1056a81df1b6SPaolo Bonzini  'qapi',
1057a81df1b6SPaolo Bonzini  'qom',
1058a81df1b6SPaolo Bonzini  'target/arm',
1059a81df1b6SPaolo Bonzini  'target/hppa',
1060a81df1b6SPaolo Bonzini  'target/i386',
1061a81df1b6SPaolo Bonzini  'target/mips',
1062a81df1b6SPaolo Bonzini  'target/ppc',
1063a81df1b6SPaolo Bonzini  'target/riscv',
1064a81df1b6SPaolo Bonzini  'target/s390x',
1065a81df1b6SPaolo Bonzini  'target/sparc',
1066a81df1b6SPaolo Bonzini  'util',
1067a81df1b6SPaolo Bonzini]
1068a81df1b6SPaolo Bonzini
1069a81df1b6SPaolo Bonzinisubdir('qapi')
1070a81df1b6SPaolo Bonzinisubdir('qobject')
1071a81df1b6SPaolo Bonzinisubdir('stubs')
1072a81df1b6SPaolo Bonzinisubdir('trace')
1073a81df1b6SPaolo Bonzinisubdir('util')
10745582c58fSMarc-André Lureausubdir('qom')
10755582c58fSMarc-André Lureausubdir('authz')
1076a81df1b6SPaolo Bonzinisubdir('crypto')
10772d78b56eSMarc-André Lureausubdir('ui')
1078a81df1b6SPaolo Bonzini
10793154fee4SMarc-André Lureau
10803154fee4SMarc-André Lureauif enable_modules
10813154fee4SMarc-André Lureau  libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
10823154fee4SMarc-André Lureau  modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
10833154fee4SMarc-André Lureauendif
10843154fee4SMarc-André Lureau
1085a81df1b6SPaolo Bonzini# Build targets from sourcesets
1086a81df1b6SPaolo Bonzini
10872becc36aSPaolo Bonzinistub_ss = stub_ss.apply(config_all, strict: false)
1088a81df1b6SPaolo Bonzini
1089a81df1b6SPaolo Bonziniutil_ss.add_all(trace_ss)
10902becc36aSPaolo Bonziniutil_ss = util_ss.apply(config_all, strict: false)
1091a81df1b6SPaolo Bonzinilibqemuutil = static_library('qemuutil',
1092a81df1b6SPaolo Bonzini                             sources: util_ss.sources() + stub_ss.sources() + genh,
1093aa087962SPaolo Bonzini                             dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
1094a81df1b6SPaolo Bonziniqemuutil = declare_dependency(link_with: libqemuutil,
109504c6f1e7SMarc-André Lureau                              sources: genh + version_res)
1096a81df1b6SPaolo Bonzini
1097abff1abfSPaolo Bonzinidecodetree = generator(find_program('scripts/decodetree.py'),
1098abff1abfSPaolo Bonzini                       output: 'decode-@BASENAME@.c.inc',
1099abff1abfSPaolo Bonzini                       arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1100abff1abfSPaolo Bonzini
1101478e943fSPaolo Bonzinisubdir('audio')
11027fcfd456SMarc-André Lureausubdir('io')
1103848e8ff6SMarc-André Lureausubdir('chardev')
1104ec0d5893SMarc-André Lureausubdir('fsdev')
1105abff1abfSPaolo Bonzinisubdir('libdecnumber')
1106d3b18480SMarc-André Lureausubdir('target')
1107708eab42SMarc-André Lureausubdir('dump')
1108ec0d5893SMarc-André Lureau
11095e5733e5SMarc-André Lureaublock_ss.add(files(
11105e5733e5SMarc-André Lureau  'block.c',
111156ee8626SKevin Wolf  'blockdev-nbd.c',
11125e5733e5SMarc-André Lureau  'blockjob.c',
11135e5733e5SMarc-André Lureau  'job.c',
11145e5733e5SMarc-André Lureau  'qemu-io-cmds.c',
11155e5733e5SMarc-André Lureau))
11165e5733e5SMarc-André Lureaublock_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
11175e5733e5SMarc-André Lureau
11185e5733e5SMarc-André Lureausubdir('nbd')
11195e5733e5SMarc-André Lureausubdir('scsi')
11205e5733e5SMarc-André Lureausubdir('block')
11215e5733e5SMarc-André Lureau
11224a96337dSPaolo Bonziniblockdev_ss.add(files(
11234a96337dSPaolo Bonzini  'blockdev.c',
11244a96337dSPaolo Bonzini  'iothread.c',
11254a96337dSPaolo Bonzini  'job-qmp.c',
11264a96337dSPaolo Bonzini))
11274a96337dSPaolo Bonzini
11284a96337dSPaolo Bonzini# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
11294a96337dSPaolo Bonzini# os-win32.c does not
11304a96337dSPaolo Bonziniblockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
11314a96337dSPaolo Bonzinisoftmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
11324a96337dSPaolo Bonzini
11334a96337dSPaolo Bonzinisoftmmu_ss.add_all(blockdev_ss)
11344a96337dSPaolo Bonzinisoftmmu_ss.add(files(
11354a96337dSPaolo Bonzini  'bootdevice.c',
11364a96337dSPaolo Bonzini  'dma-helpers.c',
11374a96337dSPaolo Bonzini  'qdev-monitor.c',
11384a96337dSPaolo Bonzini), sdl)
11394a96337dSPaolo Bonzini
11404a96337dSPaolo Bonzinisoftmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
11414a96337dSPaolo Bonzinisoftmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
11424a96337dSPaolo Bonzinisoftmmu_ss.add(when: ['CONFIG_FDT', fdt],  if_true: [files('device_tree.c')])
11434a96337dSPaolo Bonzini
11444a96337dSPaolo Bonzinicommon_ss.add(files('cpus-common.c'))
11454a96337dSPaolo Bonzini
11465d3ea0e1SPaolo Bonzinisubdir('softmmu')
1147c9322ab5SMarc-André Lureau
1148c7c91a74SBruce Rogersspecific_ss.add(files('disas.c', 'exec.c', 'gdbstub.c'), capstone, libpmem, libdaxctl)
1149c9322ab5SMarc-André Lureauspecific_ss.add(files('exec-vary.c'))
1150c9322ab5SMarc-André Lureauspecific_ss.add(when: 'CONFIG_TCG', if_true: files(
1151c9322ab5SMarc-André Lureau  'fpu/softfloat.c',
1152c9322ab5SMarc-André Lureau  'tcg/optimize.c',
1153c9322ab5SMarc-André Lureau  'tcg/tcg-common.c',
1154c9322ab5SMarc-André Lureau  'tcg/tcg-op-gvec.c',
1155c9322ab5SMarc-André Lureau  'tcg/tcg-op-vec.c',
1156c9322ab5SMarc-André Lureau  'tcg/tcg-op.c',
1157c9322ab5SMarc-André Lureau  'tcg/tcg.c',
1158c9322ab5SMarc-André Lureau))
1159c9322ab5SMarc-André Lureauspecific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1160c9322ab5SMarc-André Lureau
1161ab318051SMarc-André Lureausubdir('backends')
1162c574e161SMarc-André Lureausubdir('disas')
116355166230SMarc-André Lureausubdir('migration')
1164ff219dcaSPaolo Bonzinisubdir('monitor')
1165cdaf0722SMarc-André Lureausubdir('net')
116617ef2af6SMarc-André Lureausubdir('replay')
1167582ea95fSMarc-André Lureausubdir('hw')
11681a82878aSMarc-André Lureausubdir('accel')
1169f556b4a1SPaolo Bonzinisubdir('plugins')
1170b309c321SMarc-André Lureausubdir('bsd-user')
11713a30446aSMarc-André Lureausubdir('linux-user')
11723a30446aSMarc-André Lureau
1173b309c321SMarc-André Lureaubsd_user_ss.add(files('gdbstub.c'))
1174b309c321SMarc-André Lureauspecific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1175b309c321SMarc-André Lureau
11763a30446aSMarc-André Lureaulinux_user_ss.add(files('gdbstub.c', 'thunk.c'))
11773a30446aSMarc-André Lureauspecific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
11785d3ea0e1SPaolo Bonzini
1179a2ce7dbdSPaolo Bonzini# needed for fuzzing binaries
1180a2ce7dbdSPaolo Bonzinisubdir('tests/qtest/libqos')
118164ed6f92SPaolo Bonzinisubdir('tests/qtest/fuzz')
1182a2ce7dbdSPaolo Bonzini
11833154fee4SMarc-André Lureaublock_mods = []
11843154fee4SMarc-André Lureausoftmmu_mods = []
11853154fee4SMarc-André Lureauforeach d, list : modules
11863154fee4SMarc-André Lureau  foreach m, module_ss : list
11873154fee4SMarc-André Lureau    if enable_modules and targetos != 'windows'
11883e292c51SGerd Hoffmann      module_ss = module_ss.apply(config_all, strict: false)
11893154fee4SMarc-André Lureau      sl = static_library(d + '-' + m, [genh, module_ss.sources()],
11903154fee4SMarc-André Lureau                          dependencies: [modulecommon, module_ss.dependencies()], pic: true)
11913154fee4SMarc-André Lureau      if d == 'block'
11923154fee4SMarc-André Lureau        block_mods += sl
11933154fee4SMarc-André Lureau      else
11943154fee4SMarc-André Lureau        softmmu_mods += sl
11953154fee4SMarc-André Lureau      endif
11963154fee4SMarc-André Lureau    else
11973154fee4SMarc-André Lureau      if d == 'block'
11983154fee4SMarc-André Lureau        block_ss.add_all(module_ss)
11993154fee4SMarc-André Lureau      else
12003154fee4SMarc-André Lureau        softmmu_ss.add_all(module_ss)
12013154fee4SMarc-André Lureau      endif
12023154fee4SMarc-André Lureau    endif
12033154fee4SMarc-André Lureau  endforeach
12043154fee4SMarc-André Lureauendforeach
12053154fee4SMarc-André Lureau
12063154fee4SMarc-André Lureaunm = find_program('nm')
1207604f3e4eSYonggang Luoundefsym = find_program('scripts/undefsym.py')
12083154fee4SMarc-André Lureaublock_syms = custom_target('block.syms', output: 'block.syms',
12093154fee4SMarc-André Lureau                             input: [libqemuutil, block_mods],
12103154fee4SMarc-André Lureau                             capture: true,
12113154fee4SMarc-André Lureau                             command: [undefsym, nm, '@INPUT@'])
12123154fee4SMarc-André Lureauqemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
12133154fee4SMarc-André Lureau                             input: [libqemuutil, softmmu_mods],
12143154fee4SMarc-André Lureau                             capture: true,
12153154fee4SMarc-André Lureau                             command: [undefsym, nm, '@INPUT@'])
12163154fee4SMarc-André Lureau
12175e5733e5SMarc-André Lureaublock_ss = block_ss.apply(config_host, strict: false)
12185e5733e5SMarc-André Lureaulibblock = static_library('block', block_ss.sources() + genh,
12195e5733e5SMarc-André Lureau                          dependencies: block_ss.dependencies(),
12205e5733e5SMarc-André Lureau                          link_depends: block_syms,
12215e5733e5SMarc-André Lureau                          name_suffix: 'fa',
12225e5733e5SMarc-André Lureau                          build_by_default: false)
12235e5733e5SMarc-André Lureau
12245e5733e5SMarc-André Lureaublock = declare_dependency(link_whole: [libblock],
1225b7c70bf2SMarc-André Lureau                           link_args: '@block.syms',
1226b7c70bf2SMarc-André Lureau                           dependencies: [crypto, io])
12275e5733e5SMarc-André Lureau
1228ff219dcaSPaolo Bonziniqmp_ss = qmp_ss.apply(config_host, strict: false)
1229ff219dcaSPaolo Bonzinilibqmp = static_library('qmp', qmp_ss.sources() + genh,
1230ff219dcaSPaolo Bonzini                        dependencies: qmp_ss.dependencies(),
1231ff219dcaSPaolo Bonzini                        name_suffix: 'fa',
1232ff219dcaSPaolo Bonzini                        build_by_default: false)
1233ff219dcaSPaolo Bonzini
1234ff219dcaSPaolo Bonziniqmp = declare_dependency(link_whole: [libqmp])
1235ff219dcaSPaolo Bonzini
12363154fee4SMarc-André Lureauforeach m : block_mods + softmmu_mods
12373154fee4SMarc-André Lureau  shared_module(m.name(),
12383154fee4SMarc-André Lureau                name_prefix: '',
12393154fee4SMarc-André Lureau                link_whole: m,
12403154fee4SMarc-André Lureau                install: true,
12413154fee4SMarc-André Lureau                install_dir: config_host['qemu_moddir'])
12423154fee4SMarc-André Lureauendforeach
12433154fee4SMarc-André Lureau
124464ed6f92SPaolo Bonzinisoftmmu_ss.add(authz, block, chardev, crypto, io, qmp)
124564ed6f92SPaolo Bonzinicommon_ss.add(qom, qemuutil)
124664ed6f92SPaolo Bonzini
124764ed6f92SPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
12482becc36aSPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
12492becc36aSPaolo Bonzini
12502becc36aSPaolo Bonzinicommon_all = common_ss.apply(config_all, strict: false)
12512becc36aSPaolo Bonzinicommon_all = static_library('common',
12522becc36aSPaolo Bonzini                            build_by_default: false,
12532becc36aSPaolo Bonzini                            sources: common_all.sources() + genh,
12542becc36aSPaolo Bonzini                            dependencies: common_all.dependencies(),
12552becc36aSPaolo Bonzini                            name_suffix: 'fa')
12562becc36aSPaolo Bonzini
1257c9322ab5SMarc-André Lureaufeature_to_c = find_program('scripts/feature_to_c.sh')
1258c9322ab5SMarc-André Lureau
1259fd5eef85SPaolo Bonziniemulators = {}
12602becc36aSPaolo Bonziniforeach target : target_dirs
12612becc36aSPaolo Bonzini  config_target = config_target_mak[target]
12622becc36aSPaolo Bonzini  target_name = config_target['TARGET_NAME']
12632becc36aSPaolo Bonzini  arch = config_target['TARGET_BASE_ARCH']
1264859aef02SPaolo Bonzini  arch_srcs = [config_target_h[target]]
126564ed6f92SPaolo Bonzini  arch_deps = []
126664ed6f92SPaolo Bonzini  c_args = ['-DNEED_CPU_H',
126764ed6f92SPaolo Bonzini            '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
126864ed6f92SPaolo Bonzini            '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
1269b6c7cfd4SPaolo Bonzini  link_args = emulator_link_args
12702becc36aSPaolo Bonzini
1271859aef02SPaolo Bonzini  config_target += config_host
12722becc36aSPaolo Bonzini  target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
12732becc36aSPaolo Bonzini  if targetos == 'linux'
12742becc36aSPaolo Bonzini    target_inc += include_directories('linux-headers', is_system: true)
12752becc36aSPaolo Bonzini  endif
12762becc36aSPaolo Bonzini  if target.endswith('-softmmu')
12772becc36aSPaolo Bonzini    qemu_target_name = 'qemu-system-' + target_name
12782becc36aSPaolo Bonzini    target_type='system'
1279abff1abfSPaolo Bonzini    t = target_softmmu_arch[arch].apply(config_target, strict: false)
1280abff1abfSPaolo Bonzini    arch_srcs += t.sources()
128164ed6f92SPaolo Bonzini    arch_deps += t.dependencies()
1282abff1abfSPaolo Bonzini
12832c44220dSMarc-André Lureau    hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
12842c44220dSMarc-André Lureau    hw = hw_arch[hw_dir].apply(config_target, strict: false)
12852c44220dSMarc-André Lureau    arch_srcs += hw.sources()
128664ed6f92SPaolo Bonzini    arch_deps += hw.dependencies()
12872c44220dSMarc-André Lureau
12882becc36aSPaolo Bonzini    arch_srcs += config_devices_h[target]
128964ed6f92SPaolo Bonzini    link_args += ['@block.syms', '@qemu.syms']
12902becc36aSPaolo Bonzini  else
12913a30446aSMarc-André Lureau    abi = config_target['TARGET_ABI_DIR']
12922becc36aSPaolo Bonzini    target_type='user'
12932becc36aSPaolo Bonzini    qemu_target_name = 'qemu-' + target_name
12942becc36aSPaolo Bonzini    if 'CONFIG_LINUX_USER' in config_target
12952becc36aSPaolo Bonzini      base_dir = 'linux-user'
12962becc36aSPaolo Bonzini      target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
12972becc36aSPaolo Bonzini    else
12982becc36aSPaolo Bonzini      base_dir = 'bsd-user'
12992becc36aSPaolo Bonzini    endif
13002becc36aSPaolo Bonzini    target_inc += include_directories(
13012becc36aSPaolo Bonzini      base_dir,
13023a30446aSMarc-André Lureau      base_dir / abi,
13032becc36aSPaolo Bonzini    )
13043a30446aSMarc-André Lureau    if 'CONFIG_LINUX_USER' in config_target
13053a30446aSMarc-André Lureau      dir = base_dir / abi
13063a30446aSMarc-André Lureau      arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
13073a30446aSMarc-André Lureau      if config_target.has_key('TARGET_SYSTBL_ABI')
13083a30446aSMarc-André Lureau        arch_srcs += \
13093a30446aSMarc-André Lureau          syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
13103a30446aSMarc-André Lureau                                             extra_args : config_target['TARGET_SYSTBL_ABI'])
13113a30446aSMarc-André Lureau      endif
13123a30446aSMarc-André Lureau    endif
13132becc36aSPaolo Bonzini  endif
13142becc36aSPaolo Bonzini
1315c9322ab5SMarc-André Lureau  if 'TARGET_XML_FILES' in config_target
1316c9322ab5SMarc-André Lureau    gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1317c9322ab5SMarc-André Lureau                                output: target + '-gdbstub-xml.c',
1318c9322ab5SMarc-André Lureau                                input: files(config_target['TARGET_XML_FILES'].split()),
1319c9322ab5SMarc-André Lureau                                command: [feature_to_c, '@INPUT@'],
1320c9322ab5SMarc-André Lureau                                capture: true)
1321c9322ab5SMarc-André Lureau    arch_srcs += gdbstub_xml
1322c9322ab5SMarc-André Lureau  endif
1323c9322ab5SMarc-André Lureau
1324abff1abfSPaolo Bonzini  t = target_arch[arch].apply(config_target, strict: false)
1325abff1abfSPaolo Bonzini  arch_srcs += t.sources()
132664ed6f92SPaolo Bonzini  arch_deps += t.dependencies()
1327abff1abfSPaolo Bonzini
13282becc36aSPaolo Bonzini  target_common = common_ss.apply(config_target, strict: false)
13292becc36aSPaolo Bonzini  objects = common_all.extract_objects(target_common.sources())
133064ed6f92SPaolo Bonzini  deps = target_common.dependencies()
13312becc36aSPaolo Bonzini
13322becc36aSPaolo Bonzini  target_specific = specific_ss.apply(config_target, strict: false)
13332becc36aSPaolo Bonzini  arch_srcs += target_specific.sources()
133464ed6f92SPaolo Bonzini  arch_deps += target_specific.dependencies()
13352becc36aSPaolo Bonzini
133664ed6f92SPaolo Bonzini  lib = static_library('qemu-' + target,
1337859aef02SPaolo Bonzini                 sources: arch_srcs + genh,
1338b7612f45SPaolo Bonzini                 dependencies: arch_deps,
13392becc36aSPaolo Bonzini                 objects: objects,
13402becc36aSPaolo Bonzini                 include_directories: target_inc,
134164ed6f92SPaolo Bonzini                 c_args: c_args,
134264ed6f92SPaolo Bonzini                 build_by_default: false,
13432becc36aSPaolo Bonzini                 name_suffix: 'fa')
134464ed6f92SPaolo Bonzini
134564ed6f92SPaolo Bonzini  if target.endswith('-softmmu')
134664ed6f92SPaolo Bonzini    execs = [{
134764ed6f92SPaolo Bonzini      'name': 'qemu-system-' + target_name,
134864ed6f92SPaolo Bonzini      'gui': false,
134964ed6f92SPaolo Bonzini      'sources': files('softmmu/main.c'),
135064ed6f92SPaolo Bonzini      'dependencies': []
135164ed6f92SPaolo Bonzini    }]
135235be72baSPaolo Bonzini    if targetos == 'windows' and (sdl.found() or gtk.found())
135364ed6f92SPaolo Bonzini      execs += [{
135464ed6f92SPaolo Bonzini        'name': 'qemu-system-' + target_name + 'w',
135564ed6f92SPaolo Bonzini        'gui': true,
135664ed6f92SPaolo Bonzini        'sources': files('softmmu/main.c'),
135764ed6f92SPaolo Bonzini        'dependencies': []
135864ed6f92SPaolo Bonzini      }]
135964ed6f92SPaolo Bonzini    endif
136064ed6f92SPaolo Bonzini    if config_host.has_key('CONFIG_FUZZ')
136164ed6f92SPaolo Bonzini      specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
136264ed6f92SPaolo Bonzini      execs += [{
136364ed6f92SPaolo Bonzini        'name': 'qemu-fuzz-' + target_name,
136464ed6f92SPaolo Bonzini        'gui': false,
136564ed6f92SPaolo Bonzini        'sources': specific_fuzz.sources(),
136664ed6f92SPaolo Bonzini        'dependencies': specific_fuzz.dependencies(),
136764ed6f92SPaolo Bonzini      }]
136864ed6f92SPaolo Bonzini    endif
136964ed6f92SPaolo Bonzini  else
137064ed6f92SPaolo Bonzini    execs = [{
137164ed6f92SPaolo Bonzini      'name': 'qemu-' + target_name,
137264ed6f92SPaolo Bonzini      'gui': false,
137364ed6f92SPaolo Bonzini      'sources': [],
137464ed6f92SPaolo Bonzini      'dependencies': []
137564ed6f92SPaolo Bonzini    }]
137664ed6f92SPaolo Bonzini  endif
137764ed6f92SPaolo Bonzini  foreach exe: execs
1378fd5eef85SPaolo Bonzini    emulators += {exe['name']:
1379fd5eef85SPaolo Bonzini         executable(exe['name'], exe['sources'],
138064ed6f92SPaolo Bonzini               install: true,
138164ed6f92SPaolo Bonzini               c_args: c_args,
138264ed6f92SPaolo Bonzini               dependencies: arch_deps + deps + exe['dependencies'],
138364ed6f92SPaolo Bonzini               objects: lib.extract_all_objects(recursive: true),
138464ed6f92SPaolo Bonzini               link_language: link_language,
138564ed6f92SPaolo Bonzini               link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
138664ed6f92SPaolo Bonzini               link_args: link_args,
138764ed6f92SPaolo Bonzini               gui_app: exe['gui'])
1388fd5eef85SPaolo Bonzini    }
138910e1d263SMarc-André Lureau
139010e1d263SMarc-André Lureau    if 'CONFIG_TRACE_SYSTEMTAP' in config_host
139110e1d263SMarc-André Lureau      foreach stp: [
1392bd5f973aSStefan Hajnoczi        {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1393bd5f973aSStefan Hajnoczi        {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
139410e1d263SMarc-André Lureau        {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
139510e1d263SMarc-André Lureau        {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
139610e1d263SMarc-André Lureau      ]
1397bd5f973aSStefan Hajnoczi        custom_target(exe['name'] + stp['ext'],
139810e1d263SMarc-André Lureau                      input: trace_events_all,
1399bd5f973aSStefan Hajnoczi                      output: exe['name'] + stp['ext'],
140010e1d263SMarc-André Lureau                      capture: true,
140110e1d263SMarc-André Lureau                      install: stp['install'],
1402ab4c0996SMarc-André Lureau                      install_dir: qemu_datadir / '../systemtap/tapset',
140310e1d263SMarc-André Lureau                      command: [
140410e1d263SMarc-André Lureau                        tracetool, '--group=all', '--format=' + stp['fmt'],
140510e1d263SMarc-André Lureau                        '--binary=' + stp['bin'],
140610e1d263SMarc-André Lureau                        '--target-name=' + target_name,
140710e1d263SMarc-André Lureau                        '--target-type=' + target_type,
140810e1d263SMarc-André Lureau                        '--probe-prefix=qemu.' + target_type + '.' + target_name,
140910e1d263SMarc-André Lureau                        '@INPUT@',
141010e1d263SMarc-André Lureau                      ])
141110e1d263SMarc-André Lureau      endforeach
141210e1d263SMarc-André Lureau    endif
141364ed6f92SPaolo Bonzini  endforeach
14142becc36aSPaolo Bonziniendforeach
14152becc36aSPaolo Bonzini
1416931049b4SPaolo Bonzini# Other build targets
1417897b5afaSMarc-André Lureau
1418f556b4a1SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host
1419f556b4a1SPaolo Bonzini  install_headers('include/qemu/qemu-plugin.h')
1420f556b4a1SPaolo Bonziniendif
1421f556b4a1SPaolo Bonzini
1422f15bff25SPaolo Bonziniif 'CONFIG_GUEST_AGENT' in config_host
1423f15bff25SPaolo Bonzini  subdir('qga')
1424f15bff25SPaolo Bonziniendif
1425f15bff25SPaolo Bonzini
14269755c94aSLaurent Vivier# Don't build qemu-keymap if xkbcommon is not explicitly enabled
14279755c94aSLaurent Vivier# when we don't build tools or system
14284113f4cfSLaurent Vivierif xkbcommon.found()
142928742467SMarc-André Lureau  # used for the update-keymaps target, so include rules even if !have_tools
143028742467SMarc-André Lureau  qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
143128742467SMarc-André Lureau                           dependencies: [qemuutil, xkbcommon], install: have_tools)
143228742467SMarc-André Lureauendif
143328742467SMarc-André Lureau
1434931049b4SPaolo Bonziniif have_tools
1435b7c70bf2SMarc-André Lureau  qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1436b7c70bf2SMarc-André Lureau             dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1437b7c70bf2SMarc-André Lureau  qemu_io = executable('qemu-io', files('qemu-io.c'),
1438b7c70bf2SMarc-André Lureau             dependencies: [block, qemuutil], install: true)
1439b7c70bf2SMarc-André Lureau  qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
1440b7c70bf2SMarc-André Lureau               dependencies: [block, qemuutil], install: true)
1441b7c70bf2SMarc-André Lureau
14427c58bb76SPaolo Bonzini  subdir('storage-daemon')
1443a9c9727cSPaolo Bonzini  subdir('contrib/rdmacm-mux')
14441d7bb6abSMarc-André Lureau  subdir('contrib/elf2dmp')
1445a9c9727cSPaolo Bonzini
1446157e7b13SMarc-André Lureau  executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1447157e7b13SMarc-André Lureau             dependencies: qemuutil,
1448157e7b13SMarc-André Lureau             install: true)
1449157e7b13SMarc-André Lureau
1450931049b4SPaolo Bonzini  if 'CONFIG_VHOST_USER' in config_host
1451931049b4SPaolo Bonzini    subdir('contrib/libvhost-user')
14522d7ac0afSPaolo Bonzini    subdir('contrib/vhost-user-blk')
1453ea458960SMarc-André Lureau    subdir('contrib/vhost-user-gpu')
145432fcc624SMarc-André Lureau    subdir('contrib/vhost-user-input')
145599650b62SPaolo Bonzini    subdir('contrib/vhost-user-scsi')
1456931049b4SPaolo Bonzini  endif
14578f51e01cSMarc-André Lureau
14588f51e01cSMarc-André Lureau  if targetos == 'linux'
14598f51e01cSMarc-André Lureau    executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
14608f51e01cSMarc-André Lureau               dependencies: [qemuutil, libcap_ng],
14618f51e01cSMarc-André Lureau               install: true,
14628f51e01cSMarc-André Lureau               install_dir: get_option('libexecdir'))
1463897b5afaSMarc-André Lureau
1464897b5afaSMarc-André Lureau    executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1465897b5afaSMarc-André Lureau               dependencies: [authz, crypto, io, qom, qemuutil,
14666ec0e15dSPaolo Bonzini                              libcap_ng, mpathpersist],
1467897b5afaSMarc-André Lureau               install: true)
14688f51e01cSMarc-André Lureau  endif
14698f51e01cSMarc-André Lureau
14705ee24e78SMarc-André Lureau  if 'CONFIG_IVSHMEM' in config_host
14715ee24e78SMarc-André Lureau    subdir('contrib/ivshmem-client')
14725ee24e78SMarc-André Lureau    subdir('contrib/ivshmem-server')
14735ee24e78SMarc-André Lureau  endif
1474931049b4SPaolo Bonziniendif
1475931049b4SPaolo Bonzini
1476f5aa6320SMarc-André Lureausubdir('scripts')
14773f99cf57SPaolo Bonzinisubdir('tools')
1478bdcbea7aSMarc-André Lureausubdir('pc-bios')
1479ce1c1e7aSPaolo Bonzinisubdir('tests')
1480f8aa24eaSPaolo Bonzinisubdir('docs')
1481e8f3bd71SMarc-André Lureauif 'CONFIG_GTK' in config_host
1482e8f3bd71SMarc-André Lureau  subdir('po')
1483e8f3bd71SMarc-André Lureauendif
14843f99cf57SPaolo Bonzini
14858adfeba9SMarc-André Lureauif host_machine.system() == 'windows'
14868adfeba9SMarc-André Lureau  nsis_cmd = [
14878adfeba9SMarc-André Lureau    find_program('scripts/nsis.py'),
14888adfeba9SMarc-André Lureau    '@OUTPUT@',
14898adfeba9SMarc-André Lureau    get_option('prefix'),
14908adfeba9SMarc-André Lureau    meson.current_source_dir(),
14918adfeba9SMarc-André Lureau    host_machine.cpu_family(),
14928adfeba9SMarc-André Lureau    '--',
14938adfeba9SMarc-André Lureau    '-DDISPLAYVERSION=' + meson.project_version(),
14948adfeba9SMarc-André Lureau  ]
14958adfeba9SMarc-André Lureau  if build_docs
14968adfeba9SMarc-André Lureau    nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
14978adfeba9SMarc-André Lureau  endif
14988adfeba9SMarc-André Lureau  if 'CONFIG_GTK' in config_host
14998adfeba9SMarc-André Lureau    nsis_cmd += '-DCONFIG_GTK=y'
15008adfeba9SMarc-André Lureau  endif
15018adfeba9SMarc-André Lureau
15028adfeba9SMarc-André Lureau  nsis = custom_target('nsis',
15038adfeba9SMarc-André Lureau                       output: 'qemu-setup-' + meson.project_version() + '.exe',
15048adfeba9SMarc-André Lureau                       input: files('qemu.nsi'),
15058adfeba9SMarc-André Lureau                       build_always_stale: true,
15068adfeba9SMarc-André Lureau                       command: nsis_cmd + ['@INPUT@'])
15078adfeba9SMarc-André Lureau  alias_target('installer', nsis)
15088adfeba9SMarc-André Lureauendif
15098adfeba9SMarc-André Lureau
1510f9332757SPaolo Bonzinisummary_info = {}
1511f9332757SPaolo Bonzinisummary_info += {'Install prefix':    config_host['prefix']}
1512f9332757SPaolo Bonzinisummary_info += {'BIOS directory':    config_host['qemu_datadir']}
1513f9332757SPaolo Bonzinisummary_info += {'firmware path':     config_host['qemu_firmwarepath']}
1514f9332757SPaolo Bonzinisummary_info += {'binary directory':  config_host['bindir']}
1515f9332757SPaolo Bonzinisummary_info += {'library directory': config_host['libdir']}
1516f9332757SPaolo Bonzinisummary_info += {'module directory':  config_host['qemu_moddir']}
1517f9332757SPaolo Bonzinisummary_info += {'libexec directory': config_host['libexecdir']}
1518f9332757SPaolo Bonzinisummary_info += {'include directory': config_host['includedir']}
1519f9332757SPaolo Bonzinisummary_info += {'config directory':  config_host['sysconfdir']}
1520f9332757SPaolo Bonziniif targetos != 'windows'
1521f9332757SPaolo Bonzini  summary_info += {'local state directory': config_host['qemu_localstatedir']}
1522b81efab7SMarc-André Lureau  summary_info += {'Manual directory':      get_option('mandir')}
1523f9332757SPaolo Bonzinielse
1524f9332757SPaolo Bonzini  summary_info += {'local state directory': 'queried at runtime'}
1525f9332757SPaolo Bonziniendif
1526491e74c1SMarc-André Lureausummary_info += {'Doc directory':     get_option('docdir')}
1527f9332757SPaolo Bonzinisummary_info += {'Build directory':   meson.current_build_dir()}
1528f9332757SPaolo Bonzinisummary_info += {'Source path':       meson.current_source_dir()}
1529f9332757SPaolo Bonzinisummary_info += {'GIT binary':        config_host['GIT']}
1530f9332757SPaolo Bonzinisummary_info += {'GIT submodules':    config_host['GIT_SUBMODULES']}
1531f9332757SPaolo Bonzinisummary_info += {'C compiler':        meson.get_compiler('c').cmd_array()[0]}
1532f9332757SPaolo Bonzinisummary_info += {'Host C compiler':   meson.get_compiler('c', native: true).cmd_array()[0]}
1533f9332757SPaolo Bonziniif link_language == 'cpp'
1534f9332757SPaolo Bonzini  summary_info += {'C++ compiler':      meson.get_compiler('cpp').cmd_array()[0]}
1535f9332757SPaolo Bonzinielse
1536f9332757SPaolo Bonzini  summary_info += {'C++ compiler':      false}
1537f9332757SPaolo Bonziniendif
1538f9332757SPaolo Bonziniif targetos == 'darwin'
1539f9332757SPaolo Bonzini  summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1540f9332757SPaolo Bonziniendif
1541f9332757SPaolo Bonzinisummary_info += {'ARFLAGS':           config_host['ARFLAGS']}
1542f9332757SPaolo Bonzinisummary_info += {'CFLAGS':            config_host['CFLAGS']}
1543f9332757SPaolo Bonzinisummary_info += {'QEMU_CFLAGS':       config_host['QEMU_CFLAGS']}
1544f9332757SPaolo Bonzinisummary_info += {'QEMU_LDFLAGS':      config_host['QEMU_LDFLAGS']}
1545f9332757SPaolo Bonzinisummary_info += {'make':              config_host['MAKE']}
1546f9332757SPaolo Bonzinisummary_info += {'python':            '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1547f9332757SPaolo Bonzinisummary_info += {'sphinx-build':      config_host['SPHINX_BUILD']}
1548f9332757SPaolo Bonzinisummary_info += {'genisoimage':       config_host['GENISOIMAGE']}
1549f9332757SPaolo Bonzini# TODO: add back version
1550f9332757SPaolo Bonzinisummary_info += {'slirp support':     config_host.has_key('CONFIG_SLIRP')}
1551f9332757SPaolo Bonziniif config_host.has_key('CONFIG_SLIRP')
1552f9332757SPaolo Bonzini  summary_info += {'smbd':            config_host['CONFIG_SMBD_COMMAND']}
1553f9332757SPaolo Bonziniendif
1554f9332757SPaolo Bonzinisummary_info += {'module support':    config_host.has_key('CONFIG_MODULES')}
1555f9332757SPaolo Bonziniif config_host.has_key('CONFIG_MODULES')
1556f9332757SPaolo Bonzini  summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1557f9332757SPaolo Bonziniendif
1558f9332757SPaolo Bonzinisummary_info += {'host CPU':          cpu}
1559f9332757SPaolo Bonzinisummary_info += {'host endianness':   build_machine.endian()}
1560fdb75aefSPaolo Bonzinisummary_info += {'target list':       ' '.join(target_dirs)}
1561f9332757SPaolo Bonzinisummary_info += {'gprof enabled':     config_host.has_key('CONFIG_GPROF')}
1562*deb62371SPaolo Bonzinisummary_info += {'sparse enabled':    sparse.found()}
1563f9332757SPaolo Bonzinisummary_info += {'strip binaries':    get_option('strip')}
1564f9332757SPaolo Bonzinisummary_info += {'profiler':          config_host.has_key('CONFIG_PROFILER')}
15653e8529ddSLaurent Viviersummary_info += {'static build':      config_host.has_key('CONFIG_STATIC')}
1566f9332757SPaolo Bonziniif targetos == 'darwin'
1567f9332757SPaolo Bonzini  summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1568f9332757SPaolo Bonziniendif
1569f9332757SPaolo Bonzini# TODO: add back version
157035be72baSPaolo Bonzinisummary_info += {'SDL support':       sdl.found()}
157135be72baSPaolo Bonzinisummary_info += {'SDL image support': sdl_image.found()}
1572f9332757SPaolo Bonzini# TODO: add back version
1573f9332757SPaolo Bonzinisummary_info += {'GTK support':       config_host.has_key('CONFIG_GTK')}
1574f9332757SPaolo Bonzinisummary_info += {'GTK GL support':    config_host.has_key('CONFIG_GTK_GL')}
1575b7612f45SPaolo Bonzinisummary_info += {'pixman':            pixman.found()}
1576f9332757SPaolo Bonzini# TODO: add back version
1577f9332757SPaolo Bonzinisummary_info += {'VTE support':       config_host.has_key('CONFIG_VTE')}
1578f9332757SPaolo Bonzinisummary_info += {'TLS priority':      config_host['CONFIG_TLS_PRIORITY']}
1579f9332757SPaolo Bonzinisummary_info += {'GNUTLS support':    config_host.has_key('CONFIG_GNUTLS')}
1580f9332757SPaolo Bonzini# TODO: add back version
1581f9332757SPaolo Bonzinisummary_info += {'libgcrypt':         config_host.has_key('CONFIG_GCRYPT')}
1582f9332757SPaolo Bonziniif config_host.has_key('CONFIG_GCRYPT')
1583f9332757SPaolo Bonzini   summary_info += {'  hmac':            config_host.has_key('CONFIG_GCRYPT_HMAC')}
1584f9332757SPaolo Bonzini   summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1585f9332757SPaolo Bonziniendif
1586f9332757SPaolo Bonzini# TODO: add back version
1587f9332757SPaolo Bonzinisummary_info += {'nettle':            config_host.has_key('CONFIG_NETTLE')}
1588f9332757SPaolo Bonziniif config_host.has_key('CONFIG_NETTLE')
1589f9332757SPaolo Bonzini   summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1590f9332757SPaolo Bonziniendif
1591f9332757SPaolo Bonzinisummary_info += {'libtasn1':          config_host.has_key('CONFIG_TASN1')}
1592f9332757SPaolo Bonzinisummary_info += {'PAM':               config_host.has_key('CONFIG_AUTH_PAM')}
1593f9332757SPaolo Bonzinisummary_info += {'iconv support':     config_host.has_key('CONFIG_ICONV')}
1594f9332757SPaolo Bonzinisummary_info += {'curses support':    config_host.has_key('CONFIG_CURSES')}
1595f9332757SPaolo Bonzini# TODO: add back version
1596f9332757SPaolo Bonzinisummary_info += {'virgl support':     config_host.has_key('CONFIG_VIRGL')}
1597f9332757SPaolo Bonzinisummary_info += {'curl support':      config_host.has_key('CONFIG_CURL')}
1598f9332757SPaolo Bonzinisummary_info += {'mingw32 support':   targetos == 'windows'}
1599f9332757SPaolo Bonzinisummary_info += {'Audio drivers':     config_host['CONFIG_AUDIO_DRIVERS']}
1600f9332757SPaolo Bonzinisummary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1601f9332757SPaolo Bonzinisummary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1602f9332757SPaolo Bonzinisummary_info += {'VirtFS support':    config_host.has_key('CONFIG_VIRTFS')}
16036ec0e15dSPaolo Bonzinisummary_info += {'Multipath support': mpathpersist.found()}
1604a0b93237SPaolo Bonzinisummary_info += {'VNC support':       vnc.found()}
1605a0b93237SPaolo Bonziniif vnc.found()
1606a0b93237SPaolo Bonzini  summary_info += {'VNC SASL support':  sasl.found()}
1607a0b93237SPaolo Bonzini  summary_info += {'VNC JPEG support':  jpeg.found()}
1608a0b93237SPaolo Bonzini  summary_info += {'VNC PNG support':   png.found()}
1609f9332757SPaolo Bonziniendif
1610f9332757SPaolo Bonzinisummary_info += {'xen support':       config_host.has_key('CONFIG_XEN_BACKEND')}
1611f9332757SPaolo Bonziniif config_host.has_key('CONFIG_XEN_BACKEND')
1612f9332757SPaolo Bonzini  summary_info += {'xen ctrl version':  config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1613f9332757SPaolo Bonziniendif
1614f9332757SPaolo Bonzinisummary_info += {'brlapi support':    config_host.has_key('CONFIG_BRLAPI')}
1615f9332757SPaolo Bonzinisummary_info += {'Documentation':     config_host.has_key('BUILD_DOCS')}
1616f9332757SPaolo Bonzinisummary_info += {'PIE':               get_option('b_pie')}
1617f9332757SPaolo Bonzinisummary_info += {'vde support':       config_host.has_key('CONFIG_VDE')}
1618f9332757SPaolo Bonzinisummary_info += {'netmap support':    config_host.has_key('CONFIG_NETMAP')}
1619f9332757SPaolo Bonzinisummary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1620f9332757SPaolo Bonzinisummary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1621f9332757SPaolo Bonzinisummary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1622f9332757SPaolo Bonzinisummary_info += {'Install blobs':     config_host.has_key('INSTALL_BLOBS')}
162305512f55SPaolo Bonzinisummary_info += {'KVM support':       config_all.has_key('CONFIG_KVM')}
162405512f55SPaolo Bonzinisummary_info += {'HAX support':       config_all.has_key('CONFIG_HAX')}
162505512f55SPaolo Bonzinisummary_info += {'HVF support':       config_all.has_key('CONFIG_HVF')}
162605512f55SPaolo Bonzinisummary_info += {'WHPX support':      config_all.has_key('CONFIG_WHPX')}
162705512f55SPaolo Bonzinisummary_info += {'TCG support':       config_all.has_key('CONFIG_TCG')}
162805512f55SPaolo Bonziniif config_all.has_key('CONFIG_TCG')
162905512f55SPaolo Bonzini  summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
163005512f55SPaolo Bonzini  summary_info += {'TCG interpreter':   config_host.has_key('CONFIG_TCG_INTERPRETER')}
163105512f55SPaolo Bonziniendif
1632aa087962SPaolo Bonzinisummary_info += {'malloc trim support': has_malloc_trim}
1633f9332757SPaolo Bonzinisummary_info += {'RDMA support':      config_host.has_key('CONFIG_RDMA')}
1634f9332757SPaolo Bonzinisummary_info += {'PVRDMA support':    config_host.has_key('CONFIG_PVRDMA')}
1635f9332757SPaolo Bonzinisummary_info += {'fdt support':       config_host.has_key('CONFIG_FDT')}
1636f9332757SPaolo Bonzinisummary_info += {'membarrier':        config_host.has_key('CONFIG_MEMBARRIER')}
1637f9332757SPaolo Bonzinisummary_info += {'preadv support':    config_host.has_key('CONFIG_PREADV')}
1638f9332757SPaolo Bonzinisummary_info += {'fdatasync':         config_host.has_key('CONFIG_FDATASYNC')}
1639f9332757SPaolo Bonzinisummary_info += {'madvise':           config_host.has_key('CONFIG_MADVISE')}
1640f9332757SPaolo Bonzinisummary_info += {'posix_madvise':     config_host.has_key('CONFIG_POSIX_MADVISE')}
1641f9332757SPaolo Bonzinisummary_info += {'posix_memalign':    config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1642f9332757SPaolo Bonzinisummary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1643f9332757SPaolo Bonzinisummary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1644f9332757SPaolo Bonzinisummary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1645f9332757SPaolo Bonzinisummary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1646f9332757SPaolo Bonzinisummary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1647f9332757SPaolo Bonzinisummary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1648f9332757SPaolo Bonzinisummary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1649f9332757SPaolo Bonzinisummary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1650f9332757SPaolo Bonzinisummary_info += {'Trace backends':    config_host['TRACE_BACKENDS']}
1651f9332757SPaolo Bonziniif config_host['TRACE_BACKENDS'].split().contains('simple')
1652f9332757SPaolo Bonzini  summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1653f9332757SPaolo Bonziniendif
1654f9332757SPaolo Bonzini# TODO: add back protocol and server version
1655f9332757SPaolo Bonzinisummary_info += {'spice support':     config_host.has_key('CONFIG_SPICE')}
1656f9332757SPaolo Bonzinisummary_info += {'rbd support':       config_host.has_key('CONFIG_RBD')}
1657f9332757SPaolo Bonzinisummary_info += {'xfsctl support':    config_host.has_key('CONFIG_XFS')}
1658f9332757SPaolo Bonzinisummary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
16590a40bcb7SCésar Belleysummary_info += {'U2F support':       u2f.found()}
1660f9332757SPaolo Bonzinisummary_info += {'libusb':            config_host.has_key('CONFIG_USB_LIBUSB')}
1661f9332757SPaolo Bonzinisummary_info += {'usb net redir':     config_host.has_key('CONFIG_USB_REDIR')}
1662f9332757SPaolo Bonzinisummary_info += {'OpenGL support':    config_host.has_key('CONFIG_OPENGL')}
1663f9332757SPaolo Bonzinisummary_info += {'OpenGL dmabufs':    config_host.has_key('CONFIG_OPENGL_DMABUF')}
1664f9332757SPaolo Bonzinisummary_info += {'libiscsi support':  config_host.has_key('CONFIG_LIBISCSI')}
1665f9332757SPaolo Bonzinisummary_info += {'libnfs support':    config_host.has_key('CONFIG_LIBNFS')}
1666f9332757SPaolo Bonzinisummary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1667f9332757SPaolo Bonziniif targetos == 'windows'
1668f9332757SPaolo Bonzini  if 'WIN_SDK' in config_host
1669f9332757SPaolo Bonzini    summary_info += {'Windows SDK':       config_host['WIN_SDK']}
1670f9332757SPaolo Bonzini  endif
1671f9332757SPaolo Bonzini  summary_info += {'QGA VSS support':   config_host.has_key('CONFIG_QGA_VSS')}
1672f9332757SPaolo Bonzini  summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
16734bad7c3bSStefan Hajnoczi  summary_info += {'QGA MSI support':   config_host.has_key('CONFIG_QGA_MSI')}
1674f9332757SPaolo Bonziniendif
1675f9332757SPaolo Bonzinisummary_info += {'seccomp support':   config_host.has_key('CONFIG_SECCOMP')}
1676f9332757SPaolo Bonzinisummary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1677f9332757SPaolo Bonzinisummary_info += {'coroutine pool':    config_host['CONFIG_COROUTINE_POOL'] == '1'}
1678f9332757SPaolo Bonzinisummary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1679f9332757SPaolo Bonzinisummary_info += {'mutex debugging':   config_host.has_key('CONFIG_DEBUG_MUTEX')}
1680f9332757SPaolo Bonzinisummary_info += {'crypto afalg':      config_host.has_key('CONFIG_AF_ALG')}
1681f9332757SPaolo Bonzinisummary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1682bf0e56a3SMarc-André Lureausummary_info += {'gcov':              get_option('b_coverage')}
1683f9332757SPaolo Bonzinisummary_info += {'TPM support':       config_host.has_key('CONFIG_TPM')}
1684f9332757SPaolo Bonzinisummary_info += {'libssh support':    config_host.has_key('CONFIG_LIBSSH')}
1685f9332757SPaolo Bonzinisummary_info += {'QOM debugging':     config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1686f9332757SPaolo Bonzinisummary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1687f9332757SPaolo Bonzinisummary_info += {'lzo support':       config_host.has_key('CONFIG_LZO')}
1688f9332757SPaolo Bonzinisummary_info += {'snappy support':    config_host.has_key('CONFIG_SNAPPY')}
1689f9332757SPaolo Bonzinisummary_info += {'bzip2 support':     config_host.has_key('CONFIG_BZIP2')}
1690f9332757SPaolo Bonzinisummary_info += {'lzfse support':     config_host.has_key('CONFIG_LZFSE')}
1691f9332757SPaolo Bonzinisummary_info += {'zstd support':      config_host.has_key('CONFIG_ZSTD')}
1692f9332757SPaolo Bonzinisummary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1693f9332757SPaolo Bonzinisummary_info += {'libxml2':           config_host.has_key('CONFIG_LIBXML2')}
1694aa087962SPaolo Bonzinisummary_info += {'memory allocator':  get_option('malloc')}
1695f9332757SPaolo Bonzinisummary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1696f9332757SPaolo Bonzinisummary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1697f9332757SPaolo Bonzinisummary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1698f9332757SPaolo Bonzinisummary_info += {'bochs support':     config_host.has_key('CONFIG_BOCHS')}
1699f9332757SPaolo Bonzinisummary_info += {'cloop support':     config_host.has_key('CONFIG_CLOOP')}
1700f9332757SPaolo Bonzinisummary_info += {'dmg support':       config_host.has_key('CONFIG_DMG')}
1701f9332757SPaolo Bonzinisummary_info += {'qcow v1 support':   config_host.has_key('CONFIG_QCOW1')}
1702f9332757SPaolo Bonzinisummary_info += {'vdi support':       config_host.has_key('CONFIG_VDI')}
1703f9332757SPaolo Bonzinisummary_info += {'vvfat support':     config_host.has_key('CONFIG_VVFAT')}
1704f9332757SPaolo Bonzinisummary_info += {'qed support':       config_host.has_key('CONFIG_QED')}
1705f9332757SPaolo Bonzinisummary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1706f9332757SPaolo Bonzinisummary_info += {'sheepdog support':  config_host.has_key('CONFIG_SHEEPDOG')}
1707f9332757SPaolo Bonzinisummary_info += {'capstone':          config_host.has_key('CONFIG_CAPSTONE')}
1708f9332757SPaolo Bonzinisummary_info += {'libpmem support':   config_host.has_key('CONFIG_LIBPMEM')}
1709f9332757SPaolo Bonzinisummary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1710f01496a3SPaolo Bonzinisummary_info += {'libudev':           libudev.found()}
1711f9332757SPaolo Bonzinisummary_info += {'default devices':   config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1712f9332757SPaolo Bonzinisummary_info += {'plugin support':    config_host.has_key('CONFIG_PLUGIN')}
1713f9332757SPaolo Bonzinisummary_info += {'fuzzing support':   config_host.has_key('CONFIG_FUZZ')}
1714f9332757SPaolo Bonziniif config_host.has_key('HAVE_GDB_BIN')
1715f9332757SPaolo Bonzini  summary_info += {'gdb':             config_host['HAVE_GDB_BIN']}
1716f9332757SPaolo Bonziniendif
1717f9332757SPaolo Bonzinisummary_info += {'thread sanitizer':  config_host.has_key('CONFIG_TSAN')}
1718f9332757SPaolo Bonzinisummary_info += {'rng-none':          config_host.has_key('CONFIG_RNG_NONE')}
1719f9332757SPaolo Bonzinisummary_info += {'Linux keyring':     config_host.has_key('CONFIG_SECRET_KEYRING')}
1720f9332757SPaolo Bonzinisummary(summary_info, bool_yn: true)
1721f9332757SPaolo Bonzini
1722f9332757SPaolo Bonziniif not supported_cpus.contains(cpu)
1723f9332757SPaolo Bonzini  message()
1724f9332757SPaolo Bonzini  warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1725f9332757SPaolo Bonzini  message()
1726f9332757SPaolo Bonzini  message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1727f9332757SPaolo Bonzini  message('The QEMU project intends to remove support for this host CPU in')
1728f9332757SPaolo Bonzini  message('a future release if nobody volunteers to maintain it and to')
1729f9332757SPaolo Bonzini  message('provide a build host for our continuous integration setup.')
1730f9332757SPaolo Bonzini  message('configure has succeeded and you can continue to build, but')
1731f9332757SPaolo Bonzini  message('if you care about QEMU on this platform you should contact')
1732f9332757SPaolo Bonzini  message('us upstream at qemu-devel@nongnu.org.')
1733f9332757SPaolo Bonziniendif
1734f9332757SPaolo Bonzini
1735f9332757SPaolo Bonziniif not supported_oses.contains(targetos)
1736f9332757SPaolo Bonzini  message()
1737f9332757SPaolo Bonzini  warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1738f9332757SPaolo Bonzini  message()
1739f9332757SPaolo Bonzini  message('Host OS ' + targetos + 'support is not currently maintained.')
1740f9332757SPaolo Bonzini  message('The QEMU project intends to remove support for this host OS in')
1741f9332757SPaolo Bonzini  message('a future release if nobody volunteers to maintain it and to')
1742f9332757SPaolo Bonzini  message('provide a build host for our continuous integration setup.')
1743f9332757SPaolo Bonzini  message('configure has succeeded and you can continue to build, but')
1744f9332757SPaolo Bonzini  message('if you care about QEMU on this platform you should contact')
1745f9332757SPaolo Bonzini  message('us upstream at qemu-devel@nongnu.org.')
1746f9332757SPaolo Bonziniendif
1747