xref: /openbmc/qemu/meson.build (revision 3d562845)
1a5665051SPaolo Bonziniproject('qemu', ['c'], meson_version: '>=0.55.0',
290756b2fSGerd Hoffmann        default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11',
33e0e5190SPaolo Bonzini                          'b_colorout=auto'],
4a5665051SPaolo Bonzini        version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
5a5665051SPaolo Bonzini
6a5665051SPaolo Bonzininot_found = dependency('', required: false)
7b29b40f4SPaolo Bonziniif meson.version().version_compare('>=0.56.0')
8b29b40f4SPaolo Bonzini  keyval = import('keyval')
9b29b40f4SPaolo Bonzinielse
10a5665051SPaolo Bonzini  keyval = import('unstable-keyval')
11b29b40f4SPaolo Bonziniendif
12a81df1b6SPaolo Bonziniss = import('sourceset')
138b18cdbfSRichard Hendersonfs = import('fs')
14a81df1b6SPaolo Bonzini
15ce1c1e7aSPaolo Bonzinish = find_program('sh')
16a81df1b6SPaolo Bonzinicc = meson.get_compiler('c')
17a5665051SPaolo Bonziniconfig_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
183154fee4SMarc-André Lureauenable_modules = 'CONFIG_MODULES' in config_host
1935be72baSPaolo Bonzinienable_static = 'CONFIG_STATIC' in config_host
20f8aa24eaSPaolo Bonzinibuild_docs = 'BUILD_DOCS' in config_host
218fe11232SMarc-André Lureau
228fe11232SMarc-André Lureauif get_option('qemu_suffix').startswith('/')
238fe11232SMarc-André Lureau  error('qemu_suffix cannot start with a /')
248fe11232SMarc-André Lureauendif
258fe11232SMarc-André Lureau
26ab4c0996SMarc-André Lureauqemu_datadir = get_option('datadir') / get_option('qemu_suffix')
27491e74c1SMarc-André Lureauqemu_docdir = get_option('docdir') / get_option('qemu_suffix')
28859aef02SPaolo Bonziniconfig_host_data = configuration_data()
29859aef02SPaolo Bonzinigenh = []
30a5665051SPaolo Bonzini
31760e4327SPaolo Bonzinitarget_dirs = config_host['TARGET_DIRS'].split()
32760e4327SPaolo Bonzinihave_user = false
33760e4327SPaolo Bonzinihave_system = false
34760e4327SPaolo Bonziniforeach target : target_dirs
35760e4327SPaolo Bonzini  have_user = have_user or target.endswith('-user')
36760e4327SPaolo Bonzini  have_system = have_system or target.endswith('-softmmu')
37760e4327SPaolo Bonziniendforeach
38760e4327SPaolo Bonzinihave_tools = 'CONFIG_TOOLS' in config_host
39760e4327SPaolo Bonzinihave_block = have_system or have_tools
40760e4327SPaolo Bonzini
41201e8ed7SPaolo Bonzinipython = import('python').find_installation()
42201e8ed7SPaolo Bonzini
43201e8ed7SPaolo Bonzinisupported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
44201e8ed7SPaolo Bonzinisupported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
45201e8ed7SPaolo Bonzini  'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
46201e8ed7SPaolo Bonzini
47201e8ed7SPaolo Bonzinicpu = host_machine.cpu_family()
48201e8ed7SPaolo Bonzinitargetos = host_machine.system()
49201e8ed7SPaolo Bonzini
50201e8ed7SPaolo Bonziniconfigure_file(input: files('scripts/ninjatool.py'),
51201e8ed7SPaolo Bonzini               output: 'ninjatool',
52201e8ed7SPaolo Bonzini               configuration: config_host)
53201e8ed7SPaolo Bonzini
54201e8ed7SPaolo Bonzini##################
55201e8ed7SPaolo Bonzini# Compiler flags #
56201e8ed7SPaolo Bonzini##################
57201e8ed7SPaolo Bonzini
58ff9ed62bSAlexander Bulekov# Specify linker-script with add_project_link_arguments so that it is not placed
59ff9ed62bSAlexander Bulekov# within a linker --start-group/--end-group pair
60ff9ed62bSAlexander Bulekovif 'CONFIG_FUZZ' in config_host
61ff9ed62bSAlexander Bulekov   add_project_link_arguments(['-Wl,-T,',
62ff9ed62bSAlexander Bulekov                               (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
63ff9ed62bSAlexander Bulekov                              native: false, language: ['c', 'cpp', 'objc'])
64ff9ed62bSAlexander Bulekovendif
65ff9ed62bSAlexander Bulekov
66a5665051SPaolo Bonziniadd_project_arguments(config_host['QEMU_CFLAGS'].split(),
67a5665051SPaolo Bonzini                      native: false, language: ['c', 'objc'])
68a5665051SPaolo Bonziniadd_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
69a5665051SPaolo Bonzini                      native: false, language: 'cpp')
70a5665051SPaolo Bonziniadd_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
71a5665051SPaolo Bonzini                           native: false, language: ['c', 'cpp', 'objc'])
72a5665051SPaolo Bonziniadd_project_arguments(config_host['QEMU_INCLUDES'].split(),
73a5665051SPaolo Bonzini                      language: ['c', 'cpp', 'objc'])
74a5665051SPaolo Bonzini
75c46f76d1SAlexander Bulekov
76fc929892SMarc-André Lureaulink_language = meson.get_external_property('link_language', 'cpp')
77fc929892SMarc-André Lureauif link_language == 'cpp'
78fc929892SMarc-André Lureau  add_languages('cpp', required: true, native: false)
79fc929892SMarc-André Lureauendif
80a5665051SPaolo Bonziniif host_machine.system() == 'darwin'
81a5665051SPaolo Bonzini  add_languages('objc', required: false, native: false)
82a5665051SPaolo Bonziniendif
83a5665051SPaolo Bonzini
84968b4db3SPaolo Bonziniif 'SPARSE_CFLAGS' in config_host
85968b4db3SPaolo Bonzini  run_target('sparse',
86968b4db3SPaolo Bonzini             command: [find_program('scripts/check_sparse.py'),
87968b4db3SPaolo Bonzini                       config_host['SPARSE_CFLAGS'].split(),
88968b4db3SPaolo Bonzini                       'compile_commands.json'])
89968b4db3SPaolo Bonziniendif
90968b4db3SPaolo Bonzini
916ec0e15dSPaolo Bonzini###########################################
926ec0e15dSPaolo Bonzini# Target-specific checks and dependencies #
936ec0e15dSPaolo Bonzini###########################################
946ec0e15dSPaolo Bonzini
956ec0e15dSPaolo Bonziniif targetos != 'linux' and get_option('mpath').enabled()
966ec0e15dSPaolo Bonzini  error('Multipath is supported only on Linux')
976ec0e15dSPaolo Bonziniendif
986ec0e15dSPaolo Bonzini
99a81df1b6SPaolo Bonzinim = cc.find_library('m', required: false)
100a81df1b6SPaolo Bonziniutil = cc.find_library('util', required: false)
1014a96337dSPaolo Bonziniwinmm = []
102a81df1b6SPaolo Bonzinisocket = []
10304c6f1e7SMarc-André Lureauversion_res = []
104d92989aaSMarc-André Lureaucoref = []
105d92989aaSMarc-André Lureauiokit = []
106b4e312e9SPaolo Bonzinicocoa = not_found
107d92989aaSMarc-André Lureauhvf = []
108a81df1b6SPaolo Bonziniif targetos == 'windows'
109a81df1b6SPaolo Bonzini  socket = cc.find_library('ws2_32')
1104a96337dSPaolo Bonzini  winmm = cc.find_library('winmm')
11104c6f1e7SMarc-André Lureau
11204c6f1e7SMarc-André Lureau  win = import('windows')
11304c6f1e7SMarc-André Lureau  version_res = win.compile_resources('version.rc',
11404c6f1e7SMarc-André Lureau                                      depend_files: files('pc-bios/qemu-nsis.ico'),
11504c6f1e7SMarc-André Lureau                                      include_directories: include_directories('.'))
116d92989aaSMarc-André Lureauelif targetos == 'darwin'
117d92989aaSMarc-André Lureau  coref = dependency('appleframeworks', modules: 'CoreFoundation')
118d92989aaSMarc-André Lureau  iokit = dependency('appleframeworks', modules: 'IOKit')
119b4e312e9SPaolo Bonzini  cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
120d92989aaSMarc-André Lureau  hvf = dependency('appleframeworks', modules: 'Hypervisor')
121cfad62f1SPaolo Bonzinielif targetos == 'sunos'
122cfad62f1SPaolo Bonzini  socket = [cc.find_library('socket'),
123cfad62f1SPaolo Bonzini            cc.find_library('nsl'),
124cfad62f1SPaolo Bonzini            cc.find_library('resolv')]
125cfad62f1SPaolo Bonzinielif targetos == 'haiku'
126cfad62f1SPaolo Bonzini  socket = [cc.find_library('posix_error_mapper'),
127cfad62f1SPaolo Bonzini            cc.find_library('network'),
128cfad62f1SPaolo Bonzini            cc.find_library('bsd')]
129a81df1b6SPaolo Bonziniendif
1306ec0e15dSPaolo Bonzini
131b4e312e9SPaolo Bonziniif not cocoa.found() and get_option('cocoa').enabled()
132b4e312e9SPaolo Bonzini  error('Cocoa not available on this platform')
133b4e312e9SPaolo Bonziniendif
134b4e312e9SPaolo Bonzini
1356ec0e15dSPaolo Bonzini################
1366ec0e15dSPaolo Bonzini# Dependencies #
1376ec0e15dSPaolo Bonzini################
1386ec0e15dSPaolo Bonzini
139215b0c2fSPaolo Bonzini# The path to glib.h is added to all compilation commands.  This was
140215b0c2fSPaolo Bonzini# grandfathered in from the QEMU Makefiles.
141215b0c2fSPaolo Bonziniadd_project_arguments(config_host['GLIB_CFLAGS'].split(),
142215b0c2fSPaolo Bonzini                      native: false, language: ['c', 'cpp', 'objc'])
143215b0c2fSPaolo Bonziniglib = declare_dependency(link_args: config_host['GLIB_LIBS'].split())
144a81df1b6SPaolo Bonzinigio = not_found
145a81df1b6SPaolo Bonziniif 'CONFIG_GIO' in config_host
146a81df1b6SPaolo Bonzini  gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
147a81df1b6SPaolo Bonzini                           link_args: config_host['GIO_LIBS'].split())
148a81df1b6SPaolo Bonziniendif
149a81df1b6SPaolo Bonzinilttng = not_found
150a81df1b6SPaolo Bonziniif 'CONFIG_TRACE_UST' in config_host
151a81df1b6SPaolo Bonzini  lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
152a81df1b6SPaolo Bonziniendif
153a81df1b6SPaolo Bonziniurcubp = not_found
154a81df1b6SPaolo Bonziniif 'CONFIG_TRACE_UST' in config_host
155a81df1b6SPaolo Bonzini  urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
156a81df1b6SPaolo Bonziniendif
15746859d93SDaniel P. Berrangégcrypt = not_found
15846859d93SDaniel P. Berrangéif 'CONFIG_GCRYPT' in config_host
15946859d93SDaniel P. Berrangé  gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
16046859d93SDaniel P. Berrangé                              link_args: config_host['GCRYPT_LIBS'].split())
16146859d93SDaniel P. Berrangéendif
162a81df1b6SPaolo Bonzininettle = not_found
163a81df1b6SPaolo Bonziniif 'CONFIG_NETTLE' in config_host
164a81df1b6SPaolo Bonzini  nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
165a81df1b6SPaolo Bonzini                              link_args: config_host['NETTLE_LIBS'].split())
166a81df1b6SPaolo Bonziniendif
167a81df1b6SPaolo Bonzinignutls = not_found
168a81df1b6SPaolo Bonziniif 'CONFIG_GNUTLS' in config_host
169a81df1b6SPaolo Bonzini  gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
170a81df1b6SPaolo Bonzini                              link_args: config_host['GNUTLS_LIBS'].split())
171a81df1b6SPaolo Bonziniendif
172b7612f45SPaolo Bonzinipixman = not_found
173b7612f45SPaolo Bonziniif have_system or have_tools
174b7612f45SPaolo Bonzini  pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
1751a94933fSPaolo Bonzini                      method: 'pkg-config', static: enable_static)
176b7612f45SPaolo Bonziniendif
1775e7fbd25SMarc-André Lureaupam = not_found
1785e7fbd25SMarc-André Lureauif 'CONFIG_AUTH_PAM' in config_host
1795e7fbd25SMarc-André Lureau  pam = cc.find_library('pam')
1805e7fbd25SMarc-André Lureauendif
1815e5733e5SMarc-André Lureaulibaio = cc.find_library('aio', required: false)
1821ffb3bbbSPaolo Bonzinizlib = dependency('zlib', required: true, static: enable_static)
1835e5733e5SMarc-André Lureaulinux_io_uring = not_found
1845e5733e5SMarc-André Lureauif 'CONFIG_LINUX_IO_URING' in config_host
1855e5733e5SMarc-André Lureau  linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
1865e5733e5SMarc-André Lureau                                      link_args: config_host['LINUX_IO_URING_LIBS'].split())
1875e5733e5SMarc-André Lureauendif
1885e5733e5SMarc-André Lureaulibxml2 = not_found
1895e5733e5SMarc-André Lureauif 'CONFIG_LIBXML2' in config_host
1905e5733e5SMarc-André Lureau  libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
1915e5733e5SMarc-André Lureau                               link_args: config_host['LIBXML2_LIBS'].split())
1925e5733e5SMarc-André Lureauendif
1935e5733e5SMarc-André Lureaulibnfs = not_found
1945e5733e5SMarc-André Lureauif 'CONFIG_LIBNFS' in config_host
1955e5733e5SMarc-André Lureau  libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
1965e5733e5SMarc-André Lureauendif
197ec0d5893SMarc-André Lureaulibattr = not_found
198ec0d5893SMarc-André Lureauif 'CONFIG_ATTR' in config_host
199ec0d5893SMarc-André Lureau  libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
200ec0d5893SMarc-André Lureauendif
2013f99cf57SPaolo Bonziniseccomp = not_found
2023f99cf57SPaolo Bonziniif 'CONFIG_SECCOMP' in config_host
2033f99cf57SPaolo Bonzini  seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
2043f99cf57SPaolo Bonzini                               link_args: config_host['SECCOMP_LIBS'].split())
2053f99cf57SPaolo Bonziniendif
2063f99cf57SPaolo Bonzinilibcap_ng = not_found
2073f99cf57SPaolo Bonziniif 'CONFIG_LIBCAP_NG' in config_host
2083f99cf57SPaolo Bonzini  libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
2093f99cf57SPaolo Bonziniendif
2101917ec6dSPaolo Bonziniif get_option('xkbcommon').auto() and not have_system and not have_tools
2111917ec6dSPaolo Bonzini  xkbcommon = not_found
2121917ec6dSPaolo Bonzinielse
2131917ec6dSPaolo Bonzini  xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
2141a94933fSPaolo Bonzini                         method: 'pkg-config', static: enable_static)
215ade60d4fSMarc-André Lureauendif
216cdaf0722SMarc-André Lureauslirp = not_found
217cdaf0722SMarc-André Lureauif config_host.has_key('CONFIG_SLIRP')
218cdaf0722SMarc-André Lureau  slirp = declare_dependency(compile_args: config_host['SLIRP_CFLAGS'].split(),
219cdaf0722SMarc-André Lureau                             link_args: config_host['SLIRP_LIBS'].split())
220cdaf0722SMarc-André Lureauendif
221cdaf0722SMarc-André Lureauvde = not_found
222cdaf0722SMarc-André Lureauif config_host.has_key('CONFIG_VDE')
223cdaf0722SMarc-André Lureau  vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
224cdaf0722SMarc-André Lureauendif
225478e943fSPaolo Bonzinipulse = not_found
226478e943fSPaolo Bonziniif 'CONFIG_LIBPULSE' in config_host
227478e943fSPaolo Bonzini  pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
228478e943fSPaolo Bonzini                             link_args: config_host['PULSE_LIBS'].split())
229478e943fSPaolo Bonziniendif
230478e943fSPaolo Bonzinialsa = not_found
231478e943fSPaolo Bonziniif 'CONFIG_ALSA' in config_host
232478e943fSPaolo Bonzini  alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
233478e943fSPaolo Bonzini                            link_args: config_host['ALSA_LIBS'].split())
234478e943fSPaolo Bonziniendif
235478e943fSPaolo Bonzinijack = not_found
236478e943fSPaolo Bonziniif 'CONFIG_LIBJACK' in config_host
237478e943fSPaolo Bonzini  jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
238478e943fSPaolo Bonziniendif
2392634733cSPaolo Bonzinispice = not_found
2402634733cSPaolo Bonziniif 'CONFIG_SPICE' in config_host
2412634733cSPaolo Bonzini  spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
2422634733cSPaolo Bonzini                             link_args: config_host['SPICE_LIBS'].split())
2432634733cSPaolo Bonziniendif
2445ee24e78SMarc-André Lureaurt = cc.find_library('rt', required: false)
245ccf7afa5SPaolo Bonzinilibdl = not_found
246ccf7afa5SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host
247ccf7afa5SPaolo Bonzini  libdl = cc.find_library('dl', required: true)
248ccf7afa5SPaolo Bonziniendif
24999650b62SPaolo Bonzinilibiscsi = not_found
25099650b62SPaolo Bonziniif 'CONFIG_LIBISCSI' in config_host
25199650b62SPaolo Bonzini  libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
25299650b62SPaolo Bonzini                                link_args: config_host['LIBISCSI_LIBS'].split())
25399650b62SPaolo Bonziniendif
2545e5733e5SMarc-André Lureauzstd = not_found
2555e5733e5SMarc-André Lureauif 'CONFIG_ZSTD' in config_host
2565e5733e5SMarc-André Lureau  zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
2575e5733e5SMarc-André Lureau                            link_args: config_host['ZSTD_LIBS'].split())
2585e5733e5SMarc-André Lureauendif
259ea458960SMarc-André Lureaugbm = not_found
260ea458960SMarc-André Lureauif 'CONFIG_GBM' in config_host
261ea458960SMarc-André Lureau  gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
262ea458960SMarc-André Lureau                           link_args: config_host['GBM_LIBS'].split())
263ea458960SMarc-André Lureauendif
264ea458960SMarc-André Lureauvirgl = not_found
265ea458960SMarc-André Lureauif 'CONFIG_VIRGL' in config_host
266ea458960SMarc-André Lureau  virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
267ea458960SMarc-André Lureau                             link_args: config_host['VIRGL_LIBS'].split())
268ea458960SMarc-André Lureauendif
2691d7bb6abSMarc-André Lureaucurl = not_found
2701d7bb6abSMarc-André Lureauif 'CONFIG_CURL' in config_host
2711d7bb6abSMarc-André Lureau  curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
2721d7bb6abSMarc-André Lureau                            link_args: config_host['CURL_LIBS'].split())
2731d7bb6abSMarc-André Lureauendif
274f15bff25SPaolo Bonzinilibudev = not_found
275f01496a3SPaolo Bonziniif targetos == 'linux' and (have_system or have_tools)
2766ec0e15dSPaolo Bonzini  libudev = dependency('libudev',
2776ec0e15dSPaolo Bonzini                       required: get_option('mpath').enabled(),
2786ec0e15dSPaolo Bonzini                       static: enable_static)
279f15bff25SPaolo Bonziniendif
2806ec0e15dSPaolo Bonzini
2816ec0e15dSPaolo Bonzinimpathpersist = not_found
2826ec0e15dSPaolo Bonzinimpathpersist_new_api = false
2836ec0e15dSPaolo Bonziniif targetos == 'linux' and have_tools and not get_option('mpath').disabled()
2846ec0e15dSPaolo Bonzini  mpath_test_source_new = '''
2856ec0e15dSPaolo Bonzini    #include <libudev.h>
2866ec0e15dSPaolo Bonzini    #include <mpath_persist.h>
2876ec0e15dSPaolo Bonzini    unsigned mpath_mx_alloc_len = 1024;
2886ec0e15dSPaolo Bonzini    int logsink;
2896ec0e15dSPaolo Bonzini    static struct config *multipath_conf;
2906ec0e15dSPaolo Bonzini    extern struct udev *udev;
2916ec0e15dSPaolo Bonzini    extern struct config *get_multipath_config(void);
2926ec0e15dSPaolo Bonzini    extern void put_multipath_config(struct config *conf);
2936ec0e15dSPaolo Bonzini    struct udev *udev;
2946ec0e15dSPaolo Bonzini    struct config *get_multipath_config(void) { return multipath_conf; }
2956ec0e15dSPaolo Bonzini    void put_multipath_config(struct config *conf) { }
2966ec0e15dSPaolo Bonzini    int main(void) {
2976ec0e15dSPaolo Bonzini        udev = udev_new();
2986ec0e15dSPaolo Bonzini        multipath_conf = mpath_lib_init();
2996ec0e15dSPaolo Bonzini        return 0;
3006ec0e15dSPaolo Bonzini    }'''
3016ec0e15dSPaolo Bonzini  mpath_test_source_old = '''
3026ec0e15dSPaolo Bonzini      #include <libudev.h>
3036ec0e15dSPaolo Bonzini      #include <mpath_persist.h>
3046ec0e15dSPaolo Bonzini      unsigned mpath_mx_alloc_len = 1024;
3056ec0e15dSPaolo Bonzini      int logsink;
3066ec0e15dSPaolo Bonzini      int main(void) {
3076ec0e15dSPaolo Bonzini          struct udev *udev = udev_new();
3086ec0e15dSPaolo Bonzini          mpath_lib_init(udev);
3096ec0e15dSPaolo Bonzini          return 0;
3106ec0e15dSPaolo Bonzini      }'''
31143b43a40SPaolo Bonzini  mpathlibs = [libudev]
31243b43a40SPaolo Bonzini  if enable_static
31343b43a40SPaolo Bonzini    mpathlibs += cc.find_library('devmapper',
3146ec0e15dSPaolo Bonzini                                   required: get_option('mpath'),
3156ec0e15dSPaolo Bonzini                                   static: enable_static)
31643b43a40SPaolo Bonzini  endif
31743b43a40SPaolo Bonzini  mpathlibs += cc.find_library('multipath',
3186ec0e15dSPaolo Bonzini                               required: get_option('mpath'),
3196ec0e15dSPaolo Bonzini                               static: enable_static)
32043b43a40SPaolo Bonzini  mpathlibs += cc.find_library('mpathpersist',
32143b43a40SPaolo Bonzini                               required: get_option('mpath'),
32243b43a40SPaolo Bonzini                               static: enable_static)
32343b43a40SPaolo Bonzini  foreach lib: mpathlibs
32443b43a40SPaolo Bonzini    if not lib.found()
32543b43a40SPaolo Bonzini      mpathlibs = []
32643b43a40SPaolo Bonzini      break
32743b43a40SPaolo Bonzini    endif
32843b43a40SPaolo Bonzini  endforeach
32943b43a40SPaolo Bonzini  if mpathlibs.length() > 0
3306ec0e15dSPaolo Bonzini    if cc.links(mpath_test_source_new, dependencies: mpathlibs)
3316ec0e15dSPaolo Bonzini      mpathpersist = declare_dependency(dependencies: mpathlibs)
3326ec0e15dSPaolo Bonzini      mpathpersist_new_api = true
3336ec0e15dSPaolo Bonzini    elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
3346ec0e15dSPaolo Bonzini      mpathpersist = declare_dependency(dependencies: mpathlibs)
3356ec0e15dSPaolo Bonzini    else
3366ec0e15dSPaolo Bonzini      if get_option('mpath').enabled()
3376ec0e15dSPaolo Bonzini        error('Cannot detect libmpathpersist API')
3386ec0e15dSPaolo Bonzini      else
3396ec0e15dSPaolo Bonzini        warning('Cannot detect libmpathpersist API, disabling')
3406ec0e15dSPaolo Bonzini      endif
3416ec0e15dSPaolo Bonzini    endif
3426ec0e15dSPaolo Bonzini  endif
3436ec0e15dSPaolo Bonziniendif
3446ec0e15dSPaolo Bonzini
3452634733cSPaolo Bonzinibrlapi = not_found
3462634733cSPaolo Bonziniif 'CONFIG_BRLAPI' in config_host
3472634733cSPaolo Bonzini  brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
3482634733cSPaolo Bonziniendif
34935be72baSPaolo Bonzini
350760e4327SPaolo Bonzinisdl = not_found
351760e4327SPaolo Bonziniif have_system
352363743daSYonggang Luo  sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
35335be72baSPaolo Bonzini  sdl_image = not_found
354760e4327SPaolo Bonziniendif
35535be72baSPaolo Bonziniif sdl.found()
35635be72baSPaolo Bonzini  # work around 2.0.8 bug
35735be72baSPaolo Bonzini  sdl = declare_dependency(compile_args: '-Wno-undef',
35835be72baSPaolo Bonzini                           dependencies: sdl)
3597161a433SVolker Rümelin  sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
3601a94933fSPaolo Bonzini                         method: 'pkg-config', static: enable_static)
36135be72baSPaolo Bonzinielse
36235be72baSPaolo Bonzini  if get_option('sdl_image').enabled()
363a8dc2aceSSergei Trofimovich    error('sdl-image required, but SDL was @0@'.format(
364a8dc2aceSSergei Trofimovich          get_option('sdl').disabled() ? 'disabled' : 'not found'))
3652634733cSPaolo Bonzini  endif
36635be72baSPaolo Bonzini  sdl_image = not_found
36735be72baSPaolo Bonziniendif
36835be72baSPaolo Bonzini
3695e5733e5SMarc-André Lureaurbd = not_found
3705e5733e5SMarc-André Lureauif 'CONFIG_RBD' in config_host
3715e5733e5SMarc-André Lureau  rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
3725e5733e5SMarc-André Lureauendif
3735e5733e5SMarc-André Lureauglusterfs = not_found
3745e5733e5SMarc-André Lureauif 'CONFIG_GLUSTERFS' in config_host
3755e5733e5SMarc-André Lureau  glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
3765e5733e5SMarc-André Lureau                                 link_args: config_host['GLUSTERFS_LIBS'].split())
3775e5733e5SMarc-André Lureauendif
3785e5733e5SMarc-André Lureaulibssh = not_found
3795e5733e5SMarc-André Lureauif 'CONFIG_LIBSSH' in config_host
3805e5733e5SMarc-André Lureau  libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
3815e5733e5SMarc-André Lureau                              link_args: config_host['LIBSSH_LIBS'].split())
3825e5733e5SMarc-André Lureauendif
3835e5733e5SMarc-André Lureaulibbzip2 = not_found
3845e5733e5SMarc-André Lureauif 'CONFIG_BZIP2' in config_host
3855e5733e5SMarc-André Lureau  libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
3865e5733e5SMarc-André Lureauendif
3875e5733e5SMarc-André Lureauliblzfse = not_found
3885e5733e5SMarc-André Lureauif 'CONFIG_LZFSE' in config_host
3895e5733e5SMarc-André Lureau  liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
3905e5733e5SMarc-André Lureauendif
391478e943fSPaolo Bonzinioss = not_found
392478e943fSPaolo Bonziniif 'CONFIG_AUDIO_OSS' in config_host
393478e943fSPaolo Bonzini  oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
394478e943fSPaolo Bonziniendif
395478e943fSPaolo Bonzinidsound = not_found
396478e943fSPaolo Bonziniif 'CONFIG_AUDIO_DSOUND' in config_host
397478e943fSPaolo Bonzini  dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
398478e943fSPaolo Bonziniendif
399478e943fSPaolo Bonzinicoreaudio = not_found
400478e943fSPaolo Bonziniif 'CONFIG_AUDIO_COREAUDIO' in config_host
401478e943fSPaolo Bonzini  coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
402478e943fSPaolo Bonziniendif
4032b1ccdf4SMarc-André Lureauopengl = not_found
4042b1ccdf4SMarc-André Lureauif 'CONFIG_OPENGL' in config_host
405de2d3005SPaolo Bonzini  opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
406de2d3005SPaolo Bonzini                              link_args: config_host['OPENGL_LIBS'].split())
4072b1ccdf4SMarc-André Lureauendif
4082b1ccdf4SMarc-André Lureaugtk = not_found
4092b1ccdf4SMarc-André Lureauif 'CONFIG_GTK' in config_host
4102b1ccdf4SMarc-André Lureau  gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
4112b1ccdf4SMarc-André Lureau                              link_args: config_host['GTK_LIBS'].split())
4122b1ccdf4SMarc-André Lureauendif
4132b1ccdf4SMarc-André Lureauvte = not_found
4142b1ccdf4SMarc-André Lureauif 'CONFIG_VTE' in config_host
4152b1ccdf4SMarc-André Lureau  vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
4162b1ccdf4SMarc-André Lureau                           link_args: config_host['VTE_LIBS'].split())
4172b1ccdf4SMarc-André Lureauendif
4182b1ccdf4SMarc-André Lureaux11 = not_found
4192b1ccdf4SMarc-André Lureauif 'CONFIG_X11' in config_host
4202b1ccdf4SMarc-André Lureau  x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
4212b1ccdf4SMarc-André Lureau                           link_args: config_host['X11_LIBS'].split())
4222b1ccdf4SMarc-André Lureauendif
4232b1ccdf4SMarc-André Lureaucurses = not_found
4242b1ccdf4SMarc-André Lureauif 'CONFIG_CURSES' in config_host
4252b1ccdf4SMarc-André Lureau  curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
4262b1ccdf4SMarc-André Lureau                              link_args: config_host['CURSES_LIBS'].split())
4272b1ccdf4SMarc-André Lureauendif
4282b1ccdf4SMarc-André Lureauiconv = not_found
4292b1ccdf4SMarc-André Lureauif 'CONFIG_ICONV' in config_host
4302b1ccdf4SMarc-André Lureau  iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
4312b1ccdf4SMarc-André Lureau                             link_args: config_host['ICONV_LIBS'].split())
4322b1ccdf4SMarc-André Lureauendif
433a0b93237SPaolo Bonzinivnc = not_found
4342b1ccdf4SMarc-André Lureaupng = not_found
4352b1ccdf4SMarc-André Lureaujpeg = not_found
4362b1ccdf4SMarc-André Lureausasl = not_found
437a0b93237SPaolo Bonziniif get_option('vnc').enabled()
438a0b93237SPaolo Bonzini  vnc = declare_dependency() # dummy dependency
439a0b93237SPaolo Bonzini  png = dependency('libpng', required: get_option('vnc_png'),
4401a94933fSPaolo Bonzini                   method: 'pkg-config', static: enable_static)
441a0b93237SPaolo Bonzini  jpeg = cc.find_library('jpeg', has_headers: ['jpeglib.h'],
442a0b93237SPaolo Bonzini                         required: get_option('vnc_jpeg'),
443a0b93237SPaolo Bonzini                         static: enable_static)
444a0b93237SPaolo Bonzini  sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
445a0b93237SPaolo Bonzini                         required: get_option('vnc_sasl'),
446a0b93237SPaolo Bonzini                         static: enable_static)
447a0b93237SPaolo Bonzini  if sasl.found()
448a0b93237SPaolo Bonzini    sasl = declare_dependency(dependencies: sasl,
449a0b93237SPaolo Bonzini                              compile_args: '-DSTRUCT_IOVEC_DEFINED')
450a0b93237SPaolo Bonzini  endif
4512b1ccdf4SMarc-André Lureauendif
4524a96337dSPaolo Bonzinifdt = not_found
4534a96337dSPaolo Bonziniif 'CONFIG_FDT' in config_host
4544a96337dSPaolo Bonzini  fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
4554a96337dSPaolo Bonzini                           link_args: config_host['FDT_LIBS'].split())
4564a96337dSPaolo Bonziniendif
457708eab42SMarc-André Lureausnappy = not_found
458708eab42SMarc-André Lureauif 'CONFIG_SNAPPY' in config_host
459708eab42SMarc-André Lureau  snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
460708eab42SMarc-André Lureauendif
461708eab42SMarc-André Lureaulzo = not_found
462708eab42SMarc-André Lureauif 'CONFIG_LZO' in config_host
463708eab42SMarc-André Lureau  lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
464708eab42SMarc-André Lureauendif
46555166230SMarc-André Lureaurdma = not_found
46655166230SMarc-André Lureauif 'CONFIG_RDMA' in config_host
46755166230SMarc-André Lureau  rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
46855166230SMarc-André Lureauendif
469ab318051SMarc-André Lureaunuma = not_found
470ab318051SMarc-André Lureauif 'CONFIG_NUMA' in config_host
471ab318051SMarc-André Lureau  numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
472ab318051SMarc-André Lureauendif
473582ea95fSMarc-André Lureauxen = not_found
474582ea95fSMarc-André Lureauif 'CONFIG_XEN_BACKEND' in config_host
475582ea95fSMarc-André Lureau  xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
476582ea95fSMarc-André Lureau                           link_args: config_host['XEN_LIBS'].split())
477582ea95fSMarc-André Lureauendif
47806677ce1SPaolo Bonzinicacard = not_found
47906677ce1SPaolo Bonziniif 'CONFIG_SMARTCARD' in config_host
48006677ce1SPaolo Bonzini  cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
48106677ce1SPaolo Bonzini                              link_args: config_host['SMARTCARD_LIBS'].split())
48206677ce1SPaolo Bonziniendif
4830a40bcb7SCésar Belleyu2f = not_found
4840a40bcb7SCésar Belleyif have_system
4850a40bcb7SCésar Belley  u2f = dependency('u2f-emu', required: get_option('u2f'),
4860a40bcb7SCésar Belley                   method: 'pkg-config',
4870a40bcb7SCésar Belley                   static: enable_static)
4880a40bcb7SCésar Belleyendif
48906677ce1SPaolo Bonziniusbredir = not_found
49006677ce1SPaolo Bonziniif 'CONFIG_USB_REDIR' in config_host
49106677ce1SPaolo Bonzini  usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
49206677ce1SPaolo Bonzini                                link_args: config_host['USB_REDIR_LIBS'].split())
49306677ce1SPaolo Bonziniendif
49406677ce1SPaolo Bonzinilibusb = not_found
49506677ce1SPaolo Bonziniif 'CONFIG_USB_LIBUSB' in config_host
49606677ce1SPaolo Bonzini  libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
49706677ce1SPaolo Bonzini                              link_args: config_host['LIBUSB_LIBS'].split())
49806677ce1SPaolo Bonziniendif
499c9322ab5SMarc-André Lureaulibpmem = not_found
500c9322ab5SMarc-André Lureauif 'CONFIG_LIBPMEM' in config_host
501c9322ab5SMarc-André Lureau  libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
502c9322ab5SMarc-André Lureau                               link_args: config_host['LIBPMEM_LIBS'].split())
503c9322ab5SMarc-André Lureauendif
504c7c91a74SBruce Rogerslibdaxctl = not_found
505c7c91a74SBruce Rogersif 'CONFIG_LIBDAXCTL' in config_host
506c7c91a74SBruce Rogers  libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
507c7c91a74SBruce Rogersendif
5088ce0a45fSMarc-André Lureautasn1 = not_found
5098ce0a45fSMarc-André Lureauif 'CONFIG_TASN1' in config_host
5108ce0a45fSMarc-André Lureau  tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
5118ce0a45fSMarc-André Lureau                             link_args: config_host['TASN1_LIBS'].split())
5128ce0a45fSMarc-André Lureauendif
513af04e89dSMarc-André Lureaukeyutils = dependency('libkeyutils', required: false,
514af04e89dSMarc-André Lureau                      method: 'pkg-config', static: enable_static)
515a81df1b6SPaolo Bonzini
5163909def8SMarc-André Lureauhas_gettid = cc.has_function('gettid')
5173909def8SMarc-André Lureau
518aa087962SPaolo Bonzini# Malloc tests
519aa087962SPaolo Bonzini
520aa087962SPaolo Bonzinimalloc = []
521aa087962SPaolo Bonziniif get_option('malloc') == 'system'
522aa087962SPaolo Bonzini  has_malloc_trim = \
523aa087962SPaolo Bonzini    not get_option('malloc_trim').disabled() and \
524aa087962SPaolo Bonzini    cc.links('''#include <malloc.h>
525aa087962SPaolo Bonzini                int main(void) { malloc_trim(0); return 0; }''')
526aa087962SPaolo Bonzinielse
527aa087962SPaolo Bonzini  has_malloc_trim = false
528aa087962SPaolo Bonzini  malloc = cc.find_library(get_option('malloc'), required: true)
529aa087962SPaolo Bonziniendif
530aa087962SPaolo Bonziniif not has_malloc_trim and get_option('malloc_trim').enabled()
531aa087962SPaolo Bonzini  if get_option('malloc') == 'system'
532aa087962SPaolo Bonzini    error('malloc_trim not available on this platform.')
533aa087962SPaolo Bonzini  else
534aa087962SPaolo Bonzini    error('malloc_trim not available with non-libc memory allocator')
535aa087962SPaolo Bonzini  endif
536aa087962SPaolo Bonziniendif
537aa087962SPaolo Bonzini
538859aef02SPaolo Bonzini# Create config-host.h
539859aef02SPaolo Bonzini
540b4e312e9SPaolo Bonziniconfig_host_data.set('CONFIG_COCOA', cocoa.found())
541f01496a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBUDEV', libudev.found())
5426ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH', mpathpersist.found())
5436ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
54435be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL', sdl.found())
54535be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
546a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC', vnc.found())
547a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
548a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_PNG', png.found())
549a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_SASL', sasl.found())
5504113f4cfSLaurent Vivierconfig_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
551af04e89dSMarc-André Lureauconfig_host_data.set('CONFIG_KEYUTILS', keyutils.found())
5523909def8SMarc-André Lureauconfig_host_data.set('CONFIG_GETTID', has_gettid)
553aa087962SPaolo Bonziniconfig_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
554859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
555859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
556859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
557859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
558859aef02SPaolo Bonzini
559859aef02SPaolo Bonziniarrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
560f4f5ed2cSPaolo Bonzinistrings = ['HOST_DSOSUF', 'CONFIG_IASL', 'bindir', 'prefix', 'qemu_confdir', 'qemu_datadir',
561859aef02SPaolo Bonzini           'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
562f4f5ed2cSPaolo Bonzini           'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath', 'sysconfdir']
563859aef02SPaolo Bonziniforeach k, v: config_host
564859aef02SPaolo Bonzini  if arrays.contains(k)
565859aef02SPaolo Bonzini    if v != ''
566859aef02SPaolo Bonzini      v = '"' + '", "'.join(v.split()) + '", '
567859aef02SPaolo Bonzini    endif
568859aef02SPaolo Bonzini    config_host_data.set(k, v)
569859aef02SPaolo Bonzini  elif k == 'ARCH'
570859aef02SPaolo Bonzini    config_host_data.set('HOST_' + v.to_upper(), 1)
571859aef02SPaolo Bonzini  elif strings.contains(k)
572859aef02SPaolo Bonzini    if not k.startswith('CONFIG_')
573859aef02SPaolo Bonzini      k = 'CONFIG_' + k.to_upper()
574859aef02SPaolo Bonzini    endif
575859aef02SPaolo Bonzini    config_host_data.set_quoted(k, v)
576859aef02SPaolo Bonzini  elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
577859aef02SPaolo Bonzini    config_host_data.set(k, v == 'y' ? 1 : v)
578859aef02SPaolo Bonzini  endif
579859aef02SPaolo Bonziniendforeach
580859aef02SPaolo Bonzini
5812becc36aSPaolo Bonziniminikconf = find_program('scripts/minikconf.py')
58205512f55SPaolo Bonziniconfig_all = {}
583a98006bcSPaolo Bonziniconfig_all_devices = {}
584ca0fc784SPaolo Bonziniconfig_all_disas = {}
5852becc36aSPaolo Bonziniconfig_devices_mak_list = []
5862becc36aSPaolo Bonziniconfig_devices_h = {}
587859aef02SPaolo Bonziniconfig_target_h = {}
5882becc36aSPaolo Bonziniconfig_target_mak = {}
589ca0fc784SPaolo Bonzini
590ca0fc784SPaolo Bonzinidisassemblers = {
591ca0fc784SPaolo Bonzini  'alpha' : ['CONFIG_ALPHA_DIS'],
592ca0fc784SPaolo Bonzini  'arm' : ['CONFIG_ARM_DIS'],
593ca0fc784SPaolo Bonzini  'avr' : ['CONFIG_AVR_DIS'],
594ca0fc784SPaolo Bonzini  'cris' : ['CONFIG_CRIS_DIS'],
595ca0fc784SPaolo Bonzini  'hppa' : ['CONFIG_HPPA_DIS'],
596ca0fc784SPaolo Bonzini  'i386' : ['CONFIG_I386_DIS'],
597ca0fc784SPaolo Bonzini  'x86_64' : ['CONFIG_I386_DIS'],
598ca0fc784SPaolo Bonzini  'x32' : ['CONFIG_I386_DIS'],
599ca0fc784SPaolo Bonzini  'lm32' : ['CONFIG_LM32_DIS'],
600ca0fc784SPaolo Bonzini  'm68k' : ['CONFIG_M68K_DIS'],
601ca0fc784SPaolo Bonzini  'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
602ca0fc784SPaolo Bonzini  'mips' : ['CONFIG_MIPS_DIS'],
603ca0fc784SPaolo Bonzini  'moxie' : ['CONFIG_MOXIE_DIS'],
604ca0fc784SPaolo Bonzini  'nios2' : ['CONFIG_NIOS2_DIS'],
605ca0fc784SPaolo Bonzini  'or1k' : ['CONFIG_OPENRISC_DIS'],
606ca0fc784SPaolo Bonzini  'ppc' : ['CONFIG_PPC_DIS'],
607ca0fc784SPaolo Bonzini  'riscv' : ['CONFIG_RISCV_DIS'],
608ca0fc784SPaolo Bonzini  'rx' : ['CONFIG_RX_DIS'],
609ca0fc784SPaolo Bonzini  's390' : ['CONFIG_S390_DIS'],
610ca0fc784SPaolo Bonzini  'sh4' : ['CONFIG_SH4_DIS'],
611ca0fc784SPaolo Bonzini  'sparc' : ['CONFIG_SPARC_DIS'],
612ca0fc784SPaolo Bonzini  'xtensa' : ['CONFIG_XTENSA_DIS'],
613ca0fc784SPaolo Bonzini}
614ca0fc784SPaolo Bonziniif link_language == 'cpp'
615ca0fc784SPaolo Bonzini  disassemblers += {
616ca0fc784SPaolo Bonzini    'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
617ca0fc784SPaolo Bonzini    'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
618ca0fc784SPaolo Bonzini    'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
619ca0fc784SPaolo Bonzini  }
620ca0fc784SPaolo Bonziniendif
621ca0fc784SPaolo Bonzini
6222becc36aSPaolo Bonzinikconfig_external_symbols = [
6232becc36aSPaolo Bonzini  'CONFIG_KVM',
6242becc36aSPaolo Bonzini  'CONFIG_XEN',
6252becc36aSPaolo Bonzini  'CONFIG_TPM',
6262becc36aSPaolo Bonzini  'CONFIG_SPICE',
6272becc36aSPaolo Bonzini  'CONFIG_IVSHMEM',
6282becc36aSPaolo Bonzini  'CONFIG_OPENGL',
6292becc36aSPaolo Bonzini  'CONFIG_X11',
6302becc36aSPaolo Bonzini  'CONFIG_VHOST_USER',
63140bc0ca9SLaurent Vivier  'CONFIG_VHOST_VDPA',
6322becc36aSPaolo Bonzini  'CONFIG_VHOST_KERNEL',
6332becc36aSPaolo Bonzini  'CONFIG_VIRTFS',
6342becc36aSPaolo Bonzini  'CONFIG_LINUX',
6352becc36aSPaolo Bonzini  'CONFIG_PVRDMA',
6362becc36aSPaolo Bonzini]
637859aef02SPaolo Bonziniignored = ['TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_DIRS']
638ca0fc784SPaolo Bonzini
63905512f55SPaolo Bonziniaccel_symbols = [
64005512f55SPaolo Bonzini  'CONFIG_KVM',
64105512f55SPaolo Bonzini  'CONFIG_HAX',
64205512f55SPaolo Bonzini  'CONFIG_HVF',
64305512f55SPaolo Bonzini  'CONFIG_TCG',
64405512f55SPaolo Bonzini  'CONFIG_WHPX'
64505512f55SPaolo Bonzini]
64605512f55SPaolo Bonzini
647a81df1b6SPaolo Bonziniforeach target : target_dirs
648859aef02SPaolo Bonzini  config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak')
649859aef02SPaolo Bonzini
650ca0fc784SPaolo Bonzini  foreach k, v: disassemblers
651ca0fc784SPaolo Bonzini    if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
652ca0fc784SPaolo Bonzini      foreach sym: v
653ca0fc784SPaolo Bonzini        config_target += { sym: 'y' }
654ca0fc784SPaolo Bonzini        config_all_disas += { sym: 'y' }
655ca0fc784SPaolo Bonzini      endforeach
656ca0fc784SPaolo Bonzini    endif
657ca0fc784SPaolo Bonzini  endforeach
658ca0fc784SPaolo Bonzini
659859aef02SPaolo Bonzini  config_target_data = configuration_data()
660859aef02SPaolo Bonzini  foreach k, v: config_target
661859aef02SPaolo Bonzini    if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
662859aef02SPaolo Bonzini      # do nothing
663859aef02SPaolo Bonzini    elif ignored.contains(k)
664859aef02SPaolo Bonzini      # do nothing
665859aef02SPaolo Bonzini    elif k == 'TARGET_BASE_ARCH'
666859aef02SPaolo Bonzini      config_target_data.set('TARGET_' + v.to_upper(), 1)
667859aef02SPaolo Bonzini    elif k == 'TARGET_NAME'
668859aef02SPaolo Bonzini      config_target_data.set_quoted(k, v)
669859aef02SPaolo Bonzini    elif v == 'y'
670859aef02SPaolo Bonzini      config_target_data.set(k, 1)
671859aef02SPaolo Bonzini    else
672859aef02SPaolo Bonzini      config_target_data.set(k, v)
673859aef02SPaolo Bonzini    endif
674859aef02SPaolo Bonzini  endforeach
67505512f55SPaolo Bonzini  foreach sym: accel_symbols
67605512f55SPaolo Bonzini    if config_target.has_key(sym)
67705512f55SPaolo Bonzini      config_all += { sym: 'y' }
67805512f55SPaolo Bonzini    endif
67905512f55SPaolo Bonzini  endforeach
680859aef02SPaolo Bonzini  config_target_h += {target: configure_file(output: target + '-config-target.h',
681859aef02SPaolo Bonzini                                               configuration: config_target_data)}
6822becc36aSPaolo Bonzini
6832becc36aSPaolo Bonzini  if target.endswith('-softmmu')
6842becc36aSPaolo Bonzini    base_kconfig = []
6852becc36aSPaolo Bonzini    foreach sym : kconfig_external_symbols
686859aef02SPaolo Bonzini      if sym in config_target or sym in config_host
6872becc36aSPaolo Bonzini        base_kconfig += '@0@=y'.format(sym)
6882becc36aSPaolo Bonzini      endif
6892becc36aSPaolo Bonzini    endforeach
6902becc36aSPaolo Bonzini
6912becc36aSPaolo Bonzini    config_devices_mak = target + '-config-devices.mak'
6922becc36aSPaolo Bonzini    config_devices_mak = configure_file(
6932becc36aSPaolo Bonzini      input: ['default-configs' / target + '.mak', 'Kconfig'],
6942becc36aSPaolo Bonzini      output: config_devices_mak,
6952becc36aSPaolo Bonzini      depfile: config_devices_mak + '.d',
6962becc36aSPaolo Bonzini      capture: true,
6972becc36aSPaolo Bonzini      command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
6982becc36aSPaolo Bonzini                config_devices_mak, '@DEPFILE@', '@INPUT@',
6992becc36aSPaolo Bonzini                base_kconfig])
700859aef02SPaolo Bonzini
701859aef02SPaolo Bonzini    config_devices_data = configuration_data()
702859aef02SPaolo Bonzini    config_devices = keyval.load(config_devices_mak)
703859aef02SPaolo Bonzini    foreach k, v: config_devices
704859aef02SPaolo Bonzini      config_devices_data.set(k, 1)
705859aef02SPaolo Bonzini    endforeach
7062becc36aSPaolo Bonzini    config_devices_mak_list += config_devices_mak
707859aef02SPaolo Bonzini    config_devices_h += {target: configure_file(output: target + '-config-devices.h',
708859aef02SPaolo Bonzini                                                configuration: config_devices_data)}
709859aef02SPaolo Bonzini    config_target += config_devices
710a98006bcSPaolo Bonzini    config_all_devices += config_devices
7112becc36aSPaolo Bonzini  endif
7122becc36aSPaolo Bonzini  config_target_mak += {target: config_target}
713a81df1b6SPaolo Bonziniendforeach
714a81df1b6SPaolo Bonzini
7152becc36aSPaolo Bonzini# This configuration is used to build files that are shared by
7162becc36aSPaolo Bonzini# multiple binaries, and then extracted out of the "common"
7172becc36aSPaolo Bonzini# static_library target.
7182becc36aSPaolo Bonzini#
7192becc36aSPaolo Bonzini# We do not use all_sources()/all_dependencies(), because it would
7202becc36aSPaolo Bonzini# build literally all source files, including devices only used by
7212becc36aSPaolo Bonzini# targets that are not built for this compilation.  The CONFIG_ALL
7222becc36aSPaolo Bonzini# pseudo symbol replaces it.
7232becc36aSPaolo Bonzini
72405512f55SPaolo Bonziniconfig_all += config_all_devices
7252becc36aSPaolo Bonziniconfig_all += config_host
7262becc36aSPaolo Bonziniconfig_all += config_all_disas
7272becc36aSPaolo Bonziniconfig_all += {
7282becc36aSPaolo Bonzini  'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
7292becc36aSPaolo Bonzini  'CONFIG_SOFTMMU': have_system,
7302becc36aSPaolo Bonzini  'CONFIG_USER_ONLY': have_user,
7312becc36aSPaolo Bonzini  'CONFIG_ALL': true,
7322becc36aSPaolo Bonzini}
7332becc36aSPaolo Bonzini
7348b18cdbfSRichard Henderson# Submodules
7358b18cdbfSRichard Henderson
7368b18cdbfSRichard Hendersoncapstone = not_found
7378b18cdbfSRichard Hendersoncapstone_opt = get_option('capstone')
7388b18cdbfSRichard Hendersonif capstone_opt in ['enabled', 'auto', 'system']
7398b18cdbfSRichard Henderson  have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
740bcf36862SRichard Henderson  capstone = dependency('capstone', version: '>=4.0',
741bcf36862SRichard Henderson                        static: enable_static, method: 'pkg-config',
7428b18cdbfSRichard Henderson                        required: capstone_opt == 'system' or
7438b18cdbfSRichard Henderson                                  capstone_opt == 'enabled' and not have_internal)
7448b18cdbfSRichard Henderson  if capstone.found()
7458b18cdbfSRichard Henderson    capstone_opt = 'system'
7468b18cdbfSRichard Henderson  elif have_internal
7478b18cdbfSRichard Henderson    capstone_opt = 'internal'
7488b18cdbfSRichard Henderson  else
7498b18cdbfSRichard Henderson    capstone_opt = 'disabled'
7508b18cdbfSRichard Henderson  endif
7518b18cdbfSRichard Hendersonendif
7528b18cdbfSRichard Hendersonif capstone_opt == 'internal'
7538b18cdbfSRichard Henderson  capstone_data = configuration_data()
7548b18cdbfSRichard Henderson  capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
7558b18cdbfSRichard Henderson
7568b18cdbfSRichard Henderson  capstone_files = files(
7578b18cdbfSRichard Henderson    'capstone/cs.c',
7588b18cdbfSRichard Henderson    'capstone/MCInst.c',
7598b18cdbfSRichard Henderson    'capstone/MCInstrDesc.c',
7608b18cdbfSRichard Henderson    'capstone/MCRegisterInfo.c',
7618b18cdbfSRichard Henderson    'capstone/SStream.c',
7628b18cdbfSRichard Henderson    'capstone/utils.c'
7638b18cdbfSRichard Henderson  )
7648b18cdbfSRichard Henderson
7658b18cdbfSRichard Henderson  if 'CONFIG_ARM_DIS' in config_all_disas
7668b18cdbfSRichard Henderson    capstone_data.set('CAPSTONE_HAS_ARM', '1')
7678b18cdbfSRichard Henderson    capstone_files += files(
7688b18cdbfSRichard Henderson      'capstone/arch/ARM/ARMDisassembler.c',
7698b18cdbfSRichard Henderson      'capstone/arch/ARM/ARMInstPrinter.c',
7708b18cdbfSRichard Henderson      'capstone/arch/ARM/ARMMapping.c',
7718b18cdbfSRichard Henderson      'capstone/arch/ARM/ARMModule.c'
7728b18cdbfSRichard Henderson    )
7738b18cdbfSRichard Henderson  endif
7748b18cdbfSRichard Henderson
7758b18cdbfSRichard Henderson  # FIXME: This config entry currently depends on a c++ compiler.
7768b18cdbfSRichard Henderson  # Which is needed for building libvixl, but not for capstone.
7778b18cdbfSRichard Henderson  if 'CONFIG_ARM_A64_DIS' in config_all_disas
7788b18cdbfSRichard Henderson    capstone_data.set('CAPSTONE_HAS_ARM64', '1')
7798b18cdbfSRichard Henderson    capstone_files += files(
7808b18cdbfSRichard Henderson      'capstone/arch/AArch64/AArch64BaseInfo.c',
7818b18cdbfSRichard Henderson      'capstone/arch/AArch64/AArch64Disassembler.c',
7828b18cdbfSRichard Henderson      'capstone/arch/AArch64/AArch64InstPrinter.c',
7838b18cdbfSRichard Henderson      'capstone/arch/AArch64/AArch64Mapping.c',
7848b18cdbfSRichard Henderson      'capstone/arch/AArch64/AArch64Module.c'
7858b18cdbfSRichard Henderson    )
7868b18cdbfSRichard Henderson  endif
7878b18cdbfSRichard Henderson
7888b18cdbfSRichard Henderson  if 'CONFIG_PPC_DIS' in config_all_disas
7898b18cdbfSRichard Henderson    capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
7908b18cdbfSRichard Henderson    capstone_files += files(
7918b18cdbfSRichard Henderson      'capstone/arch/PowerPC/PPCDisassembler.c',
7928b18cdbfSRichard Henderson      'capstone/arch/PowerPC/PPCInstPrinter.c',
7938b18cdbfSRichard Henderson      'capstone/arch/PowerPC/PPCMapping.c',
7948b18cdbfSRichard Henderson      'capstone/arch/PowerPC/PPCModule.c'
7958b18cdbfSRichard Henderson    )
7968b18cdbfSRichard Henderson  endif
7978b18cdbfSRichard Henderson
798*3d562845SRichard Henderson  if 'CONFIG_S390_DIS' in config_all_disas
799*3d562845SRichard Henderson    capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
800*3d562845SRichard Henderson    capstone_files += files(
801*3d562845SRichard Henderson      'capstone/arch/SystemZ/SystemZDisassembler.c',
802*3d562845SRichard Henderson      'capstone/arch/SystemZ/SystemZInstPrinter.c',
803*3d562845SRichard Henderson      'capstone/arch/SystemZ/SystemZMapping.c',
804*3d562845SRichard Henderson      'capstone/arch/SystemZ/SystemZModule.c',
805*3d562845SRichard Henderson      'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
806*3d562845SRichard Henderson    )
807*3d562845SRichard Henderson  endif
808*3d562845SRichard Henderson
8098b18cdbfSRichard Henderson  if 'CONFIG_I386_DIS' in config_all_disas
8108b18cdbfSRichard Henderson    capstone_data.set('CAPSTONE_HAS_X86', 1)
8118b18cdbfSRichard Henderson    capstone_files += files(
8128b18cdbfSRichard Henderson      'capstone/arch/X86/X86Disassembler.c',
8138b18cdbfSRichard Henderson      'capstone/arch/X86/X86DisassemblerDecoder.c',
8148b18cdbfSRichard Henderson      'capstone/arch/X86/X86ATTInstPrinter.c',
8158b18cdbfSRichard Henderson      'capstone/arch/X86/X86IntelInstPrinter.c',
816eef20e40SRichard Henderson      'capstone/arch/X86/X86InstPrinterCommon.c',
8178b18cdbfSRichard Henderson      'capstone/arch/X86/X86Mapping.c',
8188b18cdbfSRichard Henderson      'capstone/arch/X86/X86Module.c'
8198b18cdbfSRichard Henderson    )
8208b18cdbfSRichard Henderson  endif
8218b18cdbfSRichard Henderson
8228b18cdbfSRichard Henderson  configure_file(output: 'capstone-defs.h', configuration: capstone_data)
8238b18cdbfSRichard Henderson
8248b18cdbfSRichard Henderson  capstone_cargs = [
8258b18cdbfSRichard Henderson    # FIXME: There does not seem to be a way to completely replace the c_args
8268b18cdbfSRichard Henderson    # that come from add_project_arguments() -- we can only add to them.
8278b18cdbfSRichard Henderson    # So: disable all warnings with a big hammer.
8288b18cdbfSRichard Henderson    '-Wno-error', '-w',
8298b18cdbfSRichard Henderson
8308b18cdbfSRichard Henderson    # Include all configuration defines via a header file, which will wind up
8318b18cdbfSRichard Henderson    # as a dependency on the object file, and thus changes here will result
8328b18cdbfSRichard Henderson    # in a rebuild.
8338b18cdbfSRichard Henderson    '-include', 'capstone-defs.h'
8348b18cdbfSRichard Henderson  ]
8358b18cdbfSRichard Henderson
8368b18cdbfSRichard Henderson  libcapstone = static_library('capstone',
8378b18cdbfSRichard Henderson                               sources: capstone_files,
8388b18cdbfSRichard Henderson                               c_args: capstone_cargs,
8398b18cdbfSRichard Henderson                               include_directories: 'capstone/include')
8408b18cdbfSRichard Henderson  capstone = declare_dependency(link_with: libcapstone,
841eef20e40SRichard Henderson                                include_directories: 'capstone/include/capstone')
8428b18cdbfSRichard Hendersonendif
8438b18cdbfSRichard Hendersonconfig_host_data.set('CONFIG_CAPSTONE', capstone.found())
8448b18cdbfSRichard Henderson
8458b18cdbfSRichard Hendersongenh += configure_file(output: 'config-host.h', configuration: config_host_data)
8468b18cdbfSRichard Henderson
847a81df1b6SPaolo Bonzini# Generators
848a81df1b6SPaolo Bonzini
8493f885659SMarc-André Lureauhxtool = find_program('scripts/hxtool')
850650b5d54SMarc-André Lureaushaderinclude = find_program('scripts/shaderinclude.pl')
851a81df1b6SPaolo Bonziniqapi_gen = find_program('scripts/qapi-gen.py')
852a81df1b6SPaolo Bonziniqapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
853a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/commands.py',
854a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/common.py',
855a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/error.py',
856a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/events.py',
857a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/expr.py',
858a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/gen.py',
859a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/introspect.py',
860a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/parser.py',
861a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/schema.py',
862a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/source.py',
863a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/types.py',
864a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/visit.py',
865a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/common.py',
866a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi-gen.py'
867a81df1b6SPaolo Bonzini]
868a81df1b6SPaolo Bonzini
869a81df1b6SPaolo Bonzinitracetool = [
870a81df1b6SPaolo Bonzini  python, files('scripts/tracetool.py'),
871a81df1b6SPaolo Bonzini   '--backend=' + config_host['TRACE_BACKENDS']
872a81df1b6SPaolo Bonzini]
873a81df1b6SPaolo Bonzini
8742c273f32SMarc-André Lureauqemu_version_cmd = [find_program('scripts/qemu-version.sh'),
8752c273f32SMarc-André Lureau                    meson.current_source_dir(),
876859aef02SPaolo Bonzini                    config_host['PKGVERSION'], meson.project_version()]
8772c273f32SMarc-André Lureauqemu_version = custom_target('qemu-version.h',
8782c273f32SMarc-André Lureau                             output: 'qemu-version.h',
8792c273f32SMarc-André Lureau                             command: qemu_version_cmd,
8802c273f32SMarc-André Lureau                             capture: true,
8812c273f32SMarc-André Lureau                             build_by_default: true,
8822c273f32SMarc-André Lureau                             build_always_stale: true)
8832c273f32SMarc-André Lureaugenh += qemu_version
8842c273f32SMarc-André Lureau
8853f885659SMarc-André Lureauhxdep = []
8863f885659SMarc-André Lureauhx_headers = [
8873f885659SMarc-André Lureau  ['qemu-options.hx', 'qemu-options.def'],
8883f885659SMarc-André Lureau  ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
8893f885659SMarc-André Lureau]
8903f885659SMarc-André Lureauif have_system
8913f885659SMarc-André Lureau  hx_headers += [
8923f885659SMarc-André Lureau    ['hmp-commands.hx', 'hmp-commands.h'],
8933f885659SMarc-André Lureau    ['hmp-commands-info.hx', 'hmp-commands-info.h'],
8943f885659SMarc-André Lureau  ]
8953f885659SMarc-André Lureauendif
8963f885659SMarc-André Lureauforeach d : hx_headers
897b7c70bf2SMarc-André Lureau  hxdep += custom_target(d[1],
8983f885659SMarc-André Lureau                input: files(d[0]),
8993f885659SMarc-André Lureau                output: d[1],
9003f885659SMarc-André Lureau                capture: true,
9013f885659SMarc-André Lureau                build_by_default: true, # to be removed when added to a target
9023f885659SMarc-André Lureau                command: [hxtool, '-h', '@INPUT0@'])
9033f885659SMarc-André Lureauendforeach
9043f885659SMarc-André Lureaugenh += hxdep
9053f885659SMarc-André Lureau
906eb937365SPeter MaydellSPHINX_ARGS = [config_host['SPHINX_BUILD'],
907eb937365SPeter Maydell               '-Dversion=' + meson.project_version(),
908eb937365SPeter Maydell               '-Drelease=' + config_host['PKGVERSION']]
909eb937365SPeter Maydell
910eb937365SPeter Maydellif get_option('werror')
911eb937365SPeter Maydell  SPHINX_ARGS += [ '-W' ]
912eb937365SPeter Maydellendif
913eb937365SPeter Maydell
914b3f4830aSPeter Maydellsphinx_extn_depends = [ meson.source_root() / 'docs/sphinx/depfile.py',
915b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/hxtool.py',
916b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/kerneldoc.py',
917b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/kernellog.py',
918b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/qapidoc.py',
919b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/qmp_lexer.py',
920b3f4830aSPeter Maydell                        qapi_gen_depends ]
921b3f4830aSPeter Maydell
922a81df1b6SPaolo Bonzini# Collect sourcesets.
923a81df1b6SPaolo Bonzini
924a81df1b6SPaolo Bonziniutil_ss = ss.source_set()
925a81df1b6SPaolo Bonzinistub_ss = ss.source_set()
926a81df1b6SPaolo Bonzinitrace_ss = ss.source_set()
9273154fee4SMarc-André Lureaublock_ss = ss.source_set()
9284a96337dSPaolo Bonziniblockdev_ss = ss.source_set()
929ff219dcaSPaolo Bonziniqmp_ss = ss.source_set()
9302becc36aSPaolo Bonzinicommon_ss = ss.source_set()
9312becc36aSPaolo Bonzinisoftmmu_ss = ss.source_set()
9322becc36aSPaolo Bonziniuser_ss = ss.source_set()
9332becc36aSPaolo Bonzinibsd_user_ss = ss.source_set()
9342becc36aSPaolo Bonzinilinux_user_ss = ss.source_set()
9352becc36aSPaolo Bonzinispecific_ss = ss.source_set()
93664ed6f92SPaolo Bonzinispecific_fuzz_ss = ss.source_set()
9372becc36aSPaolo Bonzini
9383154fee4SMarc-André Lureaumodules = {}
9392becc36aSPaolo Bonzinihw_arch = {}
9402becc36aSPaolo Bonzinitarget_arch = {}
9412becc36aSPaolo Bonzinitarget_softmmu_arch = {}
942a81df1b6SPaolo Bonzini
943a81df1b6SPaolo Bonzini###############
944a81df1b6SPaolo Bonzini# Trace files #
945a81df1b6SPaolo Bonzini###############
946a81df1b6SPaolo Bonzini
947c9322ab5SMarc-André Lureau# TODO: add each directory to the subdirs from its own meson.build, once
948c9322ab5SMarc-André Lureau# we have those
949a81df1b6SPaolo Bonzinitrace_events_subdirs = [
950a81df1b6SPaolo Bonzini  'accel/kvm',
951a81df1b6SPaolo Bonzini  'accel/tcg',
952a81df1b6SPaolo Bonzini  'crypto',
953a81df1b6SPaolo Bonzini  'monitor',
954a81df1b6SPaolo Bonzini]
955a81df1b6SPaolo Bonziniif have_user
956a81df1b6SPaolo Bonzini  trace_events_subdirs += [ 'linux-user' ]
957a81df1b6SPaolo Bonziniendif
958a81df1b6SPaolo Bonziniif have_block
959a81df1b6SPaolo Bonzini  trace_events_subdirs += [
960a81df1b6SPaolo Bonzini    'authz',
961a81df1b6SPaolo Bonzini    'block',
962a81df1b6SPaolo Bonzini    'io',
963a81df1b6SPaolo Bonzini    'nbd',
964a81df1b6SPaolo Bonzini    'scsi',
965a81df1b6SPaolo Bonzini  ]
966a81df1b6SPaolo Bonziniendif
967a81df1b6SPaolo Bonziniif have_system
968a81df1b6SPaolo Bonzini  trace_events_subdirs += [
969a81df1b6SPaolo Bonzini    'audio',
970a81df1b6SPaolo Bonzini    'backends',
971a81df1b6SPaolo Bonzini    'backends/tpm',
972a81df1b6SPaolo Bonzini    'chardev',
973a81df1b6SPaolo Bonzini    'hw/9pfs',
974a81df1b6SPaolo Bonzini    'hw/acpi',
975a81df1b6SPaolo Bonzini    'hw/alpha',
976a81df1b6SPaolo Bonzini    'hw/arm',
977a81df1b6SPaolo Bonzini    'hw/audio',
978a81df1b6SPaolo Bonzini    'hw/block',
979a81df1b6SPaolo Bonzini    'hw/block/dataplane',
980a81df1b6SPaolo Bonzini    'hw/char',
981a81df1b6SPaolo Bonzini    'hw/display',
982a81df1b6SPaolo Bonzini    'hw/dma',
983a81df1b6SPaolo Bonzini    'hw/hppa',
984a81df1b6SPaolo Bonzini    'hw/hyperv',
985a81df1b6SPaolo Bonzini    'hw/i2c',
986a81df1b6SPaolo Bonzini    'hw/i386',
987a81df1b6SPaolo Bonzini    'hw/i386/xen',
988a81df1b6SPaolo Bonzini    'hw/ide',
989a81df1b6SPaolo Bonzini    'hw/input',
990a81df1b6SPaolo Bonzini    'hw/intc',
991a81df1b6SPaolo Bonzini    'hw/isa',
992a81df1b6SPaolo Bonzini    'hw/mem',
993a81df1b6SPaolo Bonzini    'hw/mips',
994a81df1b6SPaolo Bonzini    'hw/misc',
995a81df1b6SPaolo Bonzini    'hw/misc/macio',
996a81df1b6SPaolo Bonzini    'hw/net',
997a81df1b6SPaolo Bonzini    'hw/nvram',
998a81df1b6SPaolo Bonzini    'hw/pci',
999a81df1b6SPaolo Bonzini    'hw/pci-host',
1000a81df1b6SPaolo Bonzini    'hw/ppc',
1001a81df1b6SPaolo Bonzini    'hw/rdma',
1002a81df1b6SPaolo Bonzini    'hw/rdma/vmw',
1003a81df1b6SPaolo Bonzini    'hw/rtc',
1004a81df1b6SPaolo Bonzini    'hw/s390x',
1005a81df1b6SPaolo Bonzini    'hw/scsi',
1006a81df1b6SPaolo Bonzini    'hw/sd',
1007a81df1b6SPaolo Bonzini    'hw/sparc',
1008a81df1b6SPaolo Bonzini    'hw/sparc64',
1009a81df1b6SPaolo Bonzini    'hw/ssi',
1010a81df1b6SPaolo Bonzini    'hw/timer',
1011a81df1b6SPaolo Bonzini    'hw/tpm',
1012a81df1b6SPaolo Bonzini    'hw/usb',
1013a81df1b6SPaolo Bonzini    'hw/vfio',
1014a81df1b6SPaolo Bonzini    'hw/virtio',
1015a81df1b6SPaolo Bonzini    'hw/watchdog',
1016a81df1b6SPaolo Bonzini    'hw/xen',
1017a81df1b6SPaolo Bonzini    'hw/gpio',
1018a81df1b6SPaolo Bonzini    'migration',
1019a81df1b6SPaolo Bonzini    'net',
10208b7a5507SPhilippe Mathieu-Daudé    'softmmu',
1021a81df1b6SPaolo Bonzini    'ui',
1022a81df1b6SPaolo Bonzini  ]
1023a81df1b6SPaolo Bonziniendif
1024a81df1b6SPaolo Bonzinitrace_events_subdirs += [
1025a81df1b6SPaolo Bonzini  'hw/core',
1026a81df1b6SPaolo Bonzini  'qapi',
1027a81df1b6SPaolo Bonzini  'qom',
1028a81df1b6SPaolo Bonzini  'target/arm',
1029a81df1b6SPaolo Bonzini  'target/hppa',
1030a81df1b6SPaolo Bonzini  'target/i386',
1031a81df1b6SPaolo Bonzini  'target/mips',
1032a81df1b6SPaolo Bonzini  'target/ppc',
1033a81df1b6SPaolo Bonzini  'target/riscv',
1034a81df1b6SPaolo Bonzini  'target/s390x',
1035a81df1b6SPaolo Bonzini  'target/sparc',
1036a81df1b6SPaolo Bonzini  'util',
1037a81df1b6SPaolo Bonzini]
1038a81df1b6SPaolo Bonzini
1039a81df1b6SPaolo Bonzinisubdir('qapi')
1040a81df1b6SPaolo Bonzinisubdir('qobject')
1041a81df1b6SPaolo Bonzinisubdir('stubs')
1042a81df1b6SPaolo Bonzinisubdir('trace')
1043a81df1b6SPaolo Bonzinisubdir('util')
10445582c58fSMarc-André Lureausubdir('qom')
10455582c58fSMarc-André Lureausubdir('authz')
1046a81df1b6SPaolo Bonzinisubdir('crypto')
10472d78b56eSMarc-André Lureausubdir('ui')
1048a81df1b6SPaolo Bonzini
10493154fee4SMarc-André Lureau
10503154fee4SMarc-André Lureauif enable_modules
10513154fee4SMarc-André Lureau  libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
10523154fee4SMarc-André Lureau  modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
10533154fee4SMarc-André Lureauendif
10543154fee4SMarc-André Lureau
1055a81df1b6SPaolo Bonzini# Build targets from sourcesets
1056a81df1b6SPaolo Bonzini
10572becc36aSPaolo Bonzinistub_ss = stub_ss.apply(config_all, strict: false)
1058a81df1b6SPaolo Bonzini
1059a81df1b6SPaolo Bonziniutil_ss.add_all(trace_ss)
10602becc36aSPaolo Bonziniutil_ss = util_ss.apply(config_all, strict: false)
1061a81df1b6SPaolo Bonzinilibqemuutil = static_library('qemuutil',
1062a81df1b6SPaolo Bonzini                             sources: util_ss.sources() + stub_ss.sources() + genh,
1063aa087962SPaolo Bonzini                             dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
1064a81df1b6SPaolo Bonziniqemuutil = declare_dependency(link_with: libqemuutil,
106504c6f1e7SMarc-André Lureau                              sources: genh + version_res)
1066a81df1b6SPaolo Bonzini
1067abff1abfSPaolo Bonzinidecodetree = generator(find_program('scripts/decodetree.py'),
1068abff1abfSPaolo Bonzini                       output: 'decode-@BASENAME@.c.inc',
1069abff1abfSPaolo Bonzini                       arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1070abff1abfSPaolo Bonzini
1071478e943fSPaolo Bonzinisubdir('audio')
10727fcfd456SMarc-André Lureausubdir('io')
1073848e8ff6SMarc-André Lureausubdir('chardev')
1074ec0d5893SMarc-André Lureausubdir('fsdev')
1075abff1abfSPaolo Bonzinisubdir('libdecnumber')
1076d3b18480SMarc-André Lureausubdir('target')
1077708eab42SMarc-André Lureausubdir('dump')
1078ec0d5893SMarc-André Lureau
10795e5733e5SMarc-André Lureaublock_ss.add(files(
10805e5733e5SMarc-André Lureau  'block.c',
10815e5733e5SMarc-André Lureau  'blockjob.c',
10825e5733e5SMarc-André Lureau  'job.c',
10835e5733e5SMarc-André Lureau  'qemu-io-cmds.c',
10845e5733e5SMarc-André Lureau))
10855e5733e5SMarc-André Lureaublock_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
10865e5733e5SMarc-André Lureau
10875e5733e5SMarc-André Lureausubdir('nbd')
10885e5733e5SMarc-André Lureausubdir('scsi')
10895e5733e5SMarc-André Lureausubdir('block')
10905e5733e5SMarc-André Lureau
10914a96337dSPaolo Bonziniblockdev_ss.add(files(
10924a96337dSPaolo Bonzini  'blockdev.c',
10934a96337dSPaolo Bonzini  'blockdev-nbd.c',
10944a96337dSPaolo Bonzini  'iothread.c',
10954a96337dSPaolo Bonzini  'job-qmp.c',
10964a96337dSPaolo Bonzini))
10974a96337dSPaolo Bonzini
10984a96337dSPaolo Bonzini# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
10994a96337dSPaolo Bonzini# os-win32.c does not
11004a96337dSPaolo Bonziniblockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
11014a96337dSPaolo Bonzinisoftmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
11024a96337dSPaolo Bonzini
11034a96337dSPaolo Bonzinisoftmmu_ss.add_all(blockdev_ss)
11044a96337dSPaolo Bonzinisoftmmu_ss.add(files(
11054a96337dSPaolo Bonzini  'bootdevice.c',
11064a96337dSPaolo Bonzini  'dma-helpers.c',
11074a96337dSPaolo Bonzini  'qdev-monitor.c',
11084a96337dSPaolo Bonzini), sdl)
11094a96337dSPaolo Bonzini
11104a96337dSPaolo Bonzinisoftmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
11114a96337dSPaolo Bonzinisoftmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
11124a96337dSPaolo Bonzinisoftmmu_ss.add(when: ['CONFIG_FDT', fdt],  if_true: [files('device_tree.c')])
11134a96337dSPaolo Bonzini
11144a96337dSPaolo Bonzinicommon_ss.add(files('cpus-common.c'))
11154a96337dSPaolo Bonzini
11165d3ea0e1SPaolo Bonzinisubdir('softmmu')
1117c9322ab5SMarc-André Lureau
1118f343346bSRichard Hendersoncommon_ss.add(capstone)
1119c7c91a74SBruce Rogersspecific_ss.add(files('disas.c', 'exec.c', 'gdbstub.c'), capstone, libpmem, libdaxctl)
1120c9322ab5SMarc-André Lureauspecific_ss.add(files('exec-vary.c'))
1121c9322ab5SMarc-André Lureauspecific_ss.add(when: 'CONFIG_TCG', if_true: files(
1122c9322ab5SMarc-André Lureau  'fpu/softfloat.c',
1123c9322ab5SMarc-André Lureau  'tcg/optimize.c',
1124c9322ab5SMarc-André Lureau  'tcg/tcg-common.c',
1125c9322ab5SMarc-André Lureau  'tcg/tcg-op-gvec.c',
1126c9322ab5SMarc-André Lureau  'tcg/tcg-op-vec.c',
1127c9322ab5SMarc-André Lureau  'tcg/tcg-op.c',
1128c9322ab5SMarc-André Lureau  'tcg/tcg.c',
1129c9322ab5SMarc-André Lureau))
1130c9322ab5SMarc-André Lureauspecific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1131c9322ab5SMarc-André Lureau
1132ab318051SMarc-André Lureausubdir('backends')
1133c574e161SMarc-André Lureausubdir('disas')
113455166230SMarc-André Lureausubdir('migration')
1135ff219dcaSPaolo Bonzinisubdir('monitor')
1136cdaf0722SMarc-André Lureausubdir('net')
113717ef2af6SMarc-André Lureausubdir('replay')
1138582ea95fSMarc-André Lureausubdir('hw')
11391a82878aSMarc-André Lureausubdir('accel')
1140f556b4a1SPaolo Bonzinisubdir('plugins')
1141b309c321SMarc-André Lureausubdir('bsd-user')
11423a30446aSMarc-André Lureausubdir('linux-user')
11433a30446aSMarc-André Lureau
1144b309c321SMarc-André Lureaubsd_user_ss.add(files('gdbstub.c'))
1145b309c321SMarc-André Lureauspecific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1146b309c321SMarc-André Lureau
11473a30446aSMarc-André Lureaulinux_user_ss.add(files('gdbstub.c', 'thunk.c'))
11483a30446aSMarc-André Lureauspecific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
11495d3ea0e1SPaolo Bonzini
1150a2ce7dbdSPaolo Bonzini# needed for fuzzing binaries
1151a2ce7dbdSPaolo Bonzinisubdir('tests/qtest/libqos')
115264ed6f92SPaolo Bonzinisubdir('tests/qtest/fuzz')
1153a2ce7dbdSPaolo Bonzini
11543154fee4SMarc-André Lureaublock_mods = []
11553154fee4SMarc-André Lureausoftmmu_mods = []
11563154fee4SMarc-André Lureauforeach d, list : modules
11573154fee4SMarc-André Lureau  foreach m, module_ss : list
11583154fee4SMarc-André Lureau    if enable_modules and targetos != 'windows'
11593e292c51SGerd Hoffmann      module_ss = module_ss.apply(config_all, strict: false)
11603154fee4SMarc-André Lureau      sl = static_library(d + '-' + m, [genh, module_ss.sources()],
11613154fee4SMarc-André Lureau                          dependencies: [modulecommon, module_ss.dependencies()], pic: true)
11623154fee4SMarc-André Lureau      if d == 'block'
11633154fee4SMarc-André Lureau        block_mods += sl
11643154fee4SMarc-André Lureau      else
11653154fee4SMarc-André Lureau        softmmu_mods += sl
11663154fee4SMarc-André Lureau      endif
11673154fee4SMarc-André Lureau    else
11683154fee4SMarc-André Lureau      if d == 'block'
11693154fee4SMarc-André Lureau        block_ss.add_all(module_ss)
11703154fee4SMarc-André Lureau      else
11713154fee4SMarc-André Lureau        softmmu_ss.add_all(module_ss)
11723154fee4SMarc-André Lureau      endif
11733154fee4SMarc-André Lureau    endif
11743154fee4SMarc-André Lureau  endforeach
11753154fee4SMarc-André Lureauendforeach
11763154fee4SMarc-André Lureau
11773154fee4SMarc-André Lureaunm = find_program('nm')
1178604f3e4eSYonggang Luoundefsym = find_program('scripts/undefsym.py')
11793154fee4SMarc-André Lureaublock_syms = custom_target('block.syms', output: 'block.syms',
11803154fee4SMarc-André Lureau                             input: [libqemuutil, block_mods],
11813154fee4SMarc-André Lureau                             capture: true,
11823154fee4SMarc-André Lureau                             command: [undefsym, nm, '@INPUT@'])
11833154fee4SMarc-André Lureauqemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
11843154fee4SMarc-André Lureau                             input: [libqemuutil, softmmu_mods],
11853154fee4SMarc-André Lureau                             capture: true,
11863154fee4SMarc-André Lureau                             command: [undefsym, nm, '@INPUT@'])
11873154fee4SMarc-André Lureau
11885e5733e5SMarc-André Lureaublock_ss = block_ss.apply(config_host, strict: false)
11895e5733e5SMarc-André Lureaulibblock = static_library('block', block_ss.sources() + genh,
11905e5733e5SMarc-André Lureau                          dependencies: block_ss.dependencies(),
11915e5733e5SMarc-André Lureau                          link_depends: block_syms,
11925e5733e5SMarc-André Lureau                          name_suffix: 'fa',
11935e5733e5SMarc-André Lureau                          build_by_default: false)
11945e5733e5SMarc-André Lureau
11955e5733e5SMarc-André Lureaublock = declare_dependency(link_whole: [libblock],
1196b7c70bf2SMarc-André Lureau                           link_args: '@block.syms',
1197b7c70bf2SMarc-André Lureau                           dependencies: [crypto, io])
11985e5733e5SMarc-André Lureau
1199ff219dcaSPaolo Bonziniqmp_ss = qmp_ss.apply(config_host, strict: false)
1200ff219dcaSPaolo Bonzinilibqmp = static_library('qmp', qmp_ss.sources() + genh,
1201ff219dcaSPaolo Bonzini                        dependencies: qmp_ss.dependencies(),
1202ff219dcaSPaolo Bonzini                        name_suffix: 'fa',
1203ff219dcaSPaolo Bonzini                        build_by_default: false)
1204ff219dcaSPaolo Bonzini
1205ff219dcaSPaolo Bonziniqmp = declare_dependency(link_whole: [libqmp])
1206ff219dcaSPaolo Bonzini
12073154fee4SMarc-André Lureauforeach m : block_mods + softmmu_mods
12083154fee4SMarc-André Lureau  shared_module(m.name(),
12093154fee4SMarc-André Lureau                name_prefix: '',
12103154fee4SMarc-André Lureau                link_whole: m,
12113154fee4SMarc-André Lureau                install: true,
12123154fee4SMarc-André Lureau                install_dir: config_host['qemu_moddir'])
12133154fee4SMarc-André Lureauendforeach
12143154fee4SMarc-André Lureau
121564ed6f92SPaolo Bonzinisoftmmu_ss.add(authz, block, chardev, crypto, io, qmp)
121664ed6f92SPaolo Bonzinicommon_ss.add(qom, qemuutil)
121764ed6f92SPaolo Bonzini
121864ed6f92SPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
12192becc36aSPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
12202becc36aSPaolo Bonzini
12212becc36aSPaolo Bonzinicommon_all = common_ss.apply(config_all, strict: false)
12222becc36aSPaolo Bonzinicommon_all = static_library('common',
12232becc36aSPaolo Bonzini                            build_by_default: false,
12242becc36aSPaolo Bonzini                            sources: common_all.sources() + genh,
12252becc36aSPaolo Bonzini                            dependencies: common_all.dependencies(),
12262becc36aSPaolo Bonzini                            name_suffix: 'fa')
12272becc36aSPaolo Bonzini
1228c9322ab5SMarc-André Lureaufeature_to_c = find_program('scripts/feature_to_c.sh')
1229c9322ab5SMarc-André Lureau
1230fd5eef85SPaolo Bonziniemulators = {}
12312becc36aSPaolo Bonziniforeach target : target_dirs
12322becc36aSPaolo Bonzini  config_target = config_target_mak[target]
12332becc36aSPaolo Bonzini  target_name = config_target['TARGET_NAME']
12342becc36aSPaolo Bonzini  arch = config_target['TARGET_BASE_ARCH']
1235859aef02SPaolo Bonzini  arch_srcs = [config_target_h[target]]
123664ed6f92SPaolo Bonzini  arch_deps = []
123764ed6f92SPaolo Bonzini  c_args = ['-DNEED_CPU_H',
123864ed6f92SPaolo Bonzini            '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
123964ed6f92SPaolo Bonzini            '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
124064ed6f92SPaolo Bonzini  link_args = []
12412becc36aSPaolo Bonzini
1242859aef02SPaolo Bonzini  config_target += config_host
12432becc36aSPaolo Bonzini  target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
12442becc36aSPaolo Bonzini  if targetos == 'linux'
12452becc36aSPaolo Bonzini    target_inc += include_directories('linux-headers', is_system: true)
12462becc36aSPaolo Bonzini  endif
12472becc36aSPaolo Bonzini  if target.endswith('-softmmu')
12482becc36aSPaolo Bonzini    qemu_target_name = 'qemu-system-' + target_name
12492becc36aSPaolo Bonzini    target_type='system'
1250abff1abfSPaolo Bonzini    t = target_softmmu_arch[arch].apply(config_target, strict: false)
1251abff1abfSPaolo Bonzini    arch_srcs += t.sources()
125264ed6f92SPaolo Bonzini    arch_deps += t.dependencies()
1253abff1abfSPaolo Bonzini
12542c44220dSMarc-André Lureau    hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
12552c44220dSMarc-André Lureau    hw = hw_arch[hw_dir].apply(config_target, strict: false)
12562c44220dSMarc-André Lureau    arch_srcs += hw.sources()
125764ed6f92SPaolo Bonzini    arch_deps += hw.dependencies()
12582c44220dSMarc-André Lureau
12592becc36aSPaolo Bonzini    arch_srcs += config_devices_h[target]
126064ed6f92SPaolo Bonzini    link_args += ['@block.syms', '@qemu.syms']
12612becc36aSPaolo Bonzini  else
12623a30446aSMarc-André Lureau    abi = config_target['TARGET_ABI_DIR']
12632becc36aSPaolo Bonzini    target_type='user'
12642becc36aSPaolo Bonzini    qemu_target_name = 'qemu-' + target_name
12652becc36aSPaolo Bonzini    if 'CONFIG_LINUX_USER' in config_target
12662becc36aSPaolo Bonzini      base_dir = 'linux-user'
12672becc36aSPaolo Bonzini      target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
12682becc36aSPaolo Bonzini    else
12692becc36aSPaolo Bonzini      base_dir = 'bsd-user'
12702becc36aSPaolo Bonzini    endif
12712becc36aSPaolo Bonzini    target_inc += include_directories(
12722becc36aSPaolo Bonzini      base_dir,
12733a30446aSMarc-André Lureau      base_dir / abi,
12742becc36aSPaolo Bonzini    )
12753a30446aSMarc-André Lureau    if 'CONFIG_LINUX_USER' in config_target
12763a30446aSMarc-André Lureau      dir = base_dir / abi
12773a30446aSMarc-André Lureau      arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
12783a30446aSMarc-André Lureau      if config_target.has_key('TARGET_SYSTBL_ABI')
12793a30446aSMarc-André Lureau        arch_srcs += \
12803a30446aSMarc-André Lureau          syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
12813a30446aSMarc-André Lureau                                             extra_args : config_target['TARGET_SYSTBL_ABI'])
12823a30446aSMarc-André Lureau      endif
12833a30446aSMarc-André Lureau    endif
12842becc36aSPaolo Bonzini  endif
12852becc36aSPaolo Bonzini
1286c9322ab5SMarc-André Lureau  if 'TARGET_XML_FILES' in config_target
1287c9322ab5SMarc-André Lureau    gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1288c9322ab5SMarc-André Lureau                                output: target + '-gdbstub-xml.c',
1289c9322ab5SMarc-André Lureau                                input: files(config_target['TARGET_XML_FILES'].split()),
1290c9322ab5SMarc-André Lureau                                command: [feature_to_c, '@INPUT@'],
1291c9322ab5SMarc-André Lureau                                capture: true)
1292c9322ab5SMarc-André Lureau    arch_srcs += gdbstub_xml
1293c9322ab5SMarc-André Lureau  endif
1294c9322ab5SMarc-André Lureau
1295abff1abfSPaolo Bonzini  t = target_arch[arch].apply(config_target, strict: false)
1296abff1abfSPaolo Bonzini  arch_srcs += t.sources()
129764ed6f92SPaolo Bonzini  arch_deps += t.dependencies()
1298abff1abfSPaolo Bonzini
12992becc36aSPaolo Bonzini  target_common = common_ss.apply(config_target, strict: false)
13002becc36aSPaolo Bonzini  objects = common_all.extract_objects(target_common.sources())
130164ed6f92SPaolo Bonzini  deps = target_common.dependencies()
13022becc36aSPaolo Bonzini
13032becc36aSPaolo Bonzini  target_specific = specific_ss.apply(config_target, strict: false)
13042becc36aSPaolo Bonzini  arch_srcs += target_specific.sources()
130564ed6f92SPaolo Bonzini  arch_deps += target_specific.dependencies()
13062becc36aSPaolo Bonzini
130764ed6f92SPaolo Bonzini  lib = static_library('qemu-' + target,
1308859aef02SPaolo Bonzini                 sources: arch_srcs + genh,
1309b7612f45SPaolo Bonzini                 dependencies: arch_deps,
13102becc36aSPaolo Bonzini                 objects: objects,
13112becc36aSPaolo Bonzini                 include_directories: target_inc,
131264ed6f92SPaolo Bonzini                 c_args: c_args,
131364ed6f92SPaolo Bonzini                 build_by_default: false,
13142becc36aSPaolo Bonzini                 name_suffix: 'fa')
131564ed6f92SPaolo Bonzini
131664ed6f92SPaolo Bonzini  if target.endswith('-softmmu')
131764ed6f92SPaolo Bonzini    execs = [{
131864ed6f92SPaolo Bonzini      'name': 'qemu-system-' + target_name,
131964ed6f92SPaolo Bonzini      'gui': false,
132064ed6f92SPaolo Bonzini      'sources': files('softmmu/main.c'),
132164ed6f92SPaolo Bonzini      'dependencies': []
132264ed6f92SPaolo Bonzini    }]
132335be72baSPaolo Bonzini    if targetos == 'windows' and (sdl.found() or gtk.found())
132464ed6f92SPaolo Bonzini      execs += [{
132564ed6f92SPaolo Bonzini        'name': 'qemu-system-' + target_name + 'w',
132664ed6f92SPaolo Bonzini        'gui': true,
132764ed6f92SPaolo Bonzini        'sources': files('softmmu/main.c'),
132864ed6f92SPaolo Bonzini        'dependencies': []
132964ed6f92SPaolo Bonzini      }]
133064ed6f92SPaolo Bonzini    endif
133164ed6f92SPaolo Bonzini    if config_host.has_key('CONFIG_FUZZ')
133264ed6f92SPaolo Bonzini      specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
133364ed6f92SPaolo Bonzini      execs += [{
133464ed6f92SPaolo Bonzini        'name': 'qemu-fuzz-' + target_name,
133564ed6f92SPaolo Bonzini        'gui': false,
133664ed6f92SPaolo Bonzini        'sources': specific_fuzz.sources(),
133764ed6f92SPaolo Bonzini        'dependencies': specific_fuzz.dependencies(),
133864ed6f92SPaolo Bonzini      }]
133964ed6f92SPaolo Bonzini    endif
134064ed6f92SPaolo Bonzini  else
134164ed6f92SPaolo Bonzini    execs = [{
134264ed6f92SPaolo Bonzini      'name': 'qemu-' + target_name,
134364ed6f92SPaolo Bonzini      'gui': false,
134464ed6f92SPaolo Bonzini      'sources': [],
134564ed6f92SPaolo Bonzini      'dependencies': []
134664ed6f92SPaolo Bonzini    }]
134764ed6f92SPaolo Bonzini  endif
134864ed6f92SPaolo Bonzini  foreach exe: execs
1349fd5eef85SPaolo Bonzini    emulators += {exe['name']:
1350fd5eef85SPaolo Bonzini         executable(exe['name'], exe['sources'],
135164ed6f92SPaolo Bonzini               install: true,
135264ed6f92SPaolo Bonzini               c_args: c_args,
135364ed6f92SPaolo Bonzini               dependencies: arch_deps + deps + exe['dependencies'],
135464ed6f92SPaolo Bonzini               objects: lib.extract_all_objects(recursive: true),
135564ed6f92SPaolo Bonzini               link_language: link_language,
135664ed6f92SPaolo Bonzini               link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
135764ed6f92SPaolo Bonzini               link_args: link_args,
135864ed6f92SPaolo Bonzini               gui_app: exe['gui'])
1359fd5eef85SPaolo Bonzini    }
136010e1d263SMarc-André Lureau
136110e1d263SMarc-André Lureau    if 'CONFIG_TRACE_SYSTEMTAP' in config_host
136210e1d263SMarc-André Lureau      foreach stp: [
1363bd5f973aSStefan Hajnoczi        {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1364bd5f973aSStefan Hajnoczi        {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
136510e1d263SMarc-André Lureau        {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
136610e1d263SMarc-André Lureau        {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
136710e1d263SMarc-André Lureau      ]
1368bd5f973aSStefan Hajnoczi        custom_target(exe['name'] + stp['ext'],
136910e1d263SMarc-André Lureau                      input: trace_events_all,
1370bd5f973aSStefan Hajnoczi                      output: exe['name'] + stp['ext'],
137110e1d263SMarc-André Lureau                      capture: true,
137210e1d263SMarc-André Lureau                      install: stp['install'],
1373ab4c0996SMarc-André Lureau                      install_dir: qemu_datadir / '../systemtap/tapset',
137410e1d263SMarc-André Lureau                      command: [
137510e1d263SMarc-André Lureau                        tracetool, '--group=all', '--format=' + stp['fmt'],
137610e1d263SMarc-André Lureau                        '--binary=' + stp['bin'],
137710e1d263SMarc-André Lureau                        '--target-name=' + target_name,
137810e1d263SMarc-André Lureau                        '--target-type=' + target_type,
137910e1d263SMarc-André Lureau                        '--probe-prefix=qemu.' + target_type + '.' + target_name,
138010e1d263SMarc-André Lureau                        '@INPUT@',
138110e1d263SMarc-André Lureau                      ])
138210e1d263SMarc-André Lureau      endforeach
138310e1d263SMarc-André Lureau    endif
138464ed6f92SPaolo Bonzini  endforeach
13852becc36aSPaolo Bonziniendforeach
13862becc36aSPaolo Bonzini
1387931049b4SPaolo Bonzini# Other build targets
1388897b5afaSMarc-André Lureau
1389f556b4a1SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host
1390f556b4a1SPaolo Bonzini  install_headers('include/qemu/qemu-plugin.h')
1391f556b4a1SPaolo Bonziniendif
1392f556b4a1SPaolo Bonzini
1393f15bff25SPaolo Bonziniif 'CONFIG_GUEST_AGENT' in config_host
1394f15bff25SPaolo Bonzini  subdir('qga')
1395f15bff25SPaolo Bonziniendif
1396f15bff25SPaolo Bonzini
13979755c94aSLaurent Vivier# Don't build qemu-keymap if xkbcommon is not explicitly enabled
13989755c94aSLaurent Vivier# when we don't build tools or system
13994113f4cfSLaurent Vivierif xkbcommon.found()
140028742467SMarc-André Lureau  # used for the update-keymaps target, so include rules even if !have_tools
140128742467SMarc-André Lureau  qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
140228742467SMarc-André Lureau                           dependencies: [qemuutil, xkbcommon], install: have_tools)
140328742467SMarc-André Lureauendif
140428742467SMarc-André Lureau
1405931049b4SPaolo Bonziniif have_tools
1406b7c70bf2SMarc-André Lureau  qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1407b7c70bf2SMarc-André Lureau             dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1408b7c70bf2SMarc-André Lureau  qemu_io = executable('qemu-io', files('qemu-io.c'),
1409b7c70bf2SMarc-André Lureau             dependencies: [block, qemuutil], install: true)
1410b7c70bf2SMarc-André Lureau  qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
1411b7c70bf2SMarc-André Lureau               dependencies: [block, qemuutil], install: true)
1412b7c70bf2SMarc-André Lureau
14137c58bb76SPaolo Bonzini  subdir('storage-daemon')
1414a9c9727cSPaolo Bonzini  subdir('contrib/rdmacm-mux')
14151d7bb6abSMarc-André Lureau  subdir('contrib/elf2dmp')
1416a9c9727cSPaolo Bonzini
1417157e7b13SMarc-André Lureau  executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1418157e7b13SMarc-André Lureau             dependencies: qemuutil,
1419157e7b13SMarc-André Lureau             install: true)
1420157e7b13SMarc-André Lureau
1421931049b4SPaolo Bonzini  if 'CONFIG_VHOST_USER' in config_host
1422931049b4SPaolo Bonzini    subdir('contrib/libvhost-user')
14232d7ac0afSPaolo Bonzini    subdir('contrib/vhost-user-blk')
1424ea458960SMarc-André Lureau    subdir('contrib/vhost-user-gpu')
142532fcc624SMarc-André Lureau    subdir('contrib/vhost-user-input')
142699650b62SPaolo Bonzini    subdir('contrib/vhost-user-scsi')
1427931049b4SPaolo Bonzini  endif
14288f51e01cSMarc-André Lureau
14298f51e01cSMarc-André Lureau  if targetos == 'linux'
14308f51e01cSMarc-André Lureau    executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
14318f51e01cSMarc-André Lureau               dependencies: [qemuutil, libcap_ng],
14328f51e01cSMarc-André Lureau               install: true,
14338f51e01cSMarc-André Lureau               install_dir: get_option('libexecdir'))
1434897b5afaSMarc-André Lureau
1435897b5afaSMarc-André Lureau    executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1436897b5afaSMarc-André Lureau               dependencies: [authz, crypto, io, qom, qemuutil,
14376ec0e15dSPaolo Bonzini                              libcap_ng, mpathpersist],
1438897b5afaSMarc-André Lureau               install: true)
14398f51e01cSMarc-André Lureau  endif
14408f51e01cSMarc-André Lureau
14415ee24e78SMarc-André Lureau  if 'CONFIG_IVSHMEM' in config_host
14425ee24e78SMarc-André Lureau    subdir('contrib/ivshmem-client')
14435ee24e78SMarc-André Lureau    subdir('contrib/ivshmem-server')
14445ee24e78SMarc-André Lureau  endif
1445931049b4SPaolo Bonziniendif
1446931049b4SPaolo Bonzini
1447f5aa6320SMarc-André Lureausubdir('scripts')
14483f99cf57SPaolo Bonzinisubdir('tools')
1449bdcbea7aSMarc-André Lureausubdir('pc-bios')
1450ce1c1e7aSPaolo Bonzinisubdir('tests')
1451f8aa24eaSPaolo Bonzinisubdir('docs')
1452e8f3bd71SMarc-André Lureauif 'CONFIG_GTK' in config_host
1453e8f3bd71SMarc-André Lureau  subdir('po')
1454e8f3bd71SMarc-André Lureauendif
14553f99cf57SPaolo Bonzini
14568adfeba9SMarc-André Lureauif host_machine.system() == 'windows'
14578adfeba9SMarc-André Lureau  nsis_cmd = [
14588adfeba9SMarc-André Lureau    find_program('scripts/nsis.py'),
14598adfeba9SMarc-André Lureau    '@OUTPUT@',
14608adfeba9SMarc-André Lureau    get_option('prefix'),
14618adfeba9SMarc-André Lureau    meson.current_source_dir(),
14628adfeba9SMarc-André Lureau    host_machine.cpu_family(),
14638adfeba9SMarc-André Lureau    '--',
14648adfeba9SMarc-André Lureau    '-DDISPLAYVERSION=' + meson.project_version(),
14658adfeba9SMarc-André Lureau  ]
14668adfeba9SMarc-André Lureau  if build_docs
14678adfeba9SMarc-André Lureau    nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
14688adfeba9SMarc-André Lureau  endif
14698adfeba9SMarc-André Lureau  if 'CONFIG_GTK' in config_host
14708adfeba9SMarc-André Lureau    nsis_cmd += '-DCONFIG_GTK=y'
14718adfeba9SMarc-André Lureau  endif
14728adfeba9SMarc-André Lureau
14738adfeba9SMarc-André Lureau  nsis = custom_target('nsis',
14748adfeba9SMarc-André Lureau                       output: 'qemu-setup-' + meson.project_version() + '.exe',
14758adfeba9SMarc-André Lureau                       input: files('qemu.nsi'),
14768adfeba9SMarc-André Lureau                       build_always_stale: true,
14778adfeba9SMarc-André Lureau                       command: nsis_cmd + ['@INPUT@'])
14788adfeba9SMarc-André Lureau  alias_target('installer', nsis)
14798adfeba9SMarc-André Lureauendif
14808adfeba9SMarc-André Lureau
1481f9332757SPaolo Bonzinisummary_info = {}
1482f9332757SPaolo Bonzinisummary_info += {'Install prefix':    config_host['prefix']}
1483f9332757SPaolo Bonzinisummary_info += {'BIOS directory':    config_host['qemu_datadir']}
1484f9332757SPaolo Bonzinisummary_info += {'firmware path':     config_host['qemu_firmwarepath']}
1485f9332757SPaolo Bonzinisummary_info += {'binary directory':  config_host['bindir']}
1486f9332757SPaolo Bonzinisummary_info += {'library directory': config_host['libdir']}
1487f9332757SPaolo Bonzinisummary_info += {'module directory':  config_host['qemu_moddir']}
1488f9332757SPaolo Bonzinisummary_info += {'libexec directory': config_host['libexecdir']}
1489f9332757SPaolo Bonzinisummary_info += {'include directory': config_host['includedir']}
1490f9332757SPaolo Bonzinisummary_info += {'config directory':  config_host['sysconfdir']}
1491f9332757SPaolo Bonziniif targetos != 'windows'
1492f9332757SPaolo Bonzini  summary_info += {'local state directory': config_host['qemu_localstatedir']}
1493b81efab7SMarc-André Lureau  summary_info += {'Manual directory':      get_option('mandir')}
1494f9332757SPaolo Bonzinielse
1495f9332757SPaolo Bonzini  summary_info += {'local state directory': 'queried at runtime'}
1496f9332757SPaolo Bonziniendif
1497491e74c1SMarc-André Lureausummary_info += {'Doc directory':     get_option('docdir')}
1498f9332757SPaolo Bonzinisummary_info += {'Build directory':   meson.current_build_dir()}
1499f9332757SPaolo Bonzinisummary_info += {'Source path':       meson.current_source_dir()}
1500f9332757SPaolo Bonzinisummary_info += {'GIT binary':        config_host['GIT']}
1501f9332757SPaolo Bonzinisummary_info += {'GIT submodules':    config_host['GIT_SUBMODULES']}
1502f9332757SPaolo Bonzinisummary_info += {'C compiler':        meson.get_compiler('c').cmd_array()[0]}
1503f9332757SPaolo Bonzinisummary_info += {'Host C compiler':   meson.get_compiler('c', native: true).cmd_array()[0]}
1504f9332757SPaolo Bonziniif link_language == 'cpp'
1505f9332757SPaolo Bonzini  summary_info += {'C++ compiler':      meson.get_compiler('cpp').cmd_array()[0]}
1506f9332757SPaolo Bonzinielse
1507f9332757SPaolo Bonzini  summary_info += {'C++ compiler':      false}
1508f9332757SPaolo Bonziniendif
1509f9332757SPaolo Bonziniif targetos == 'darwin'
1510f9332757SPaolo Bonzini  summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1511f9332757SPaolo Bonziniendif
1512f9332757SPaolo Bonzinisummary_info += {'ARFLAGS':           config_host['ARFLAGS']}
1513f9332757SPaolo Bonzinisummary_info += {'CFLAGS':            config_host['CFLAGS']}
1514f9332757SPaolo Bonzinisummary_info += {'QEMU_CFLAGS':       config_host['QEMU_CFLAGS']}
1515f9332757SPaolo Bonzinisummary_info += {'QEMU_LDFLAGS':      config_host['QEMU_LDFLAGS']}
1516f9332757SPaolo Bonzinisummary_info += {'make':              config_host['MAKE']}
1517f9332757SPaolo Bonzinisummary_info += {'python':            '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1518f9332757SPaolo Bonzinisummary_info += {'sphinx-build':      config_host['SPHINX_BUILD']}
1519f9332757SPaolo Bonzinisummary_info += {'genisoimage':       config_host['GENISOIMAGE']}
1520f9332757SPaolo Bonzini# TODO: add back version
1521f9332757SPaolo Bonzinisummary_info += {'slirp support':     config_host.has_key('CONFIG_SLIRP')}
1522f9332757SPaolo Bonziniif config_host.has_key('CONFIG_SLIRP')
1523f9332757SPaolo Bonzini  summary_info += {'smbd':            config_host['CONFIG_SMBD_COMMAND']}
1524f9332757SPaolo Bonziniendif
1525f9332757SPaolo Bonzinisummary_info += {'module support':    config_host.has_key('CONFIG_MODULES')}
1526f9332757SPaolo Bonziniif config_host.has_key('CONFIG_MODULES')
1527f9332757SPaolo Bonzini  summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1528f9332757SPaolo Bonziniendif
1529f9332757SPaolo Bonzinisummary_info += {'host CPU':          cpu}
1530f9332757SPaolo Bonzinisummary_info += {'host endianness':   build_machine.endian()}
1531f9332757SPaolo Bonzinisummary_info += {'target list':       config_host['TARGET_DIRS']}
1532f9332757SPaolo Bonzinisummary_info += {'gprof enabled':     config_host.has_key('CONFIG_GPROF')}
1533f9332757SPaolo Bonzinisummary_info += {'sparse enabled':    meson.get_compiler('c').cmd_array().contains('cgcc')}
1534f9332757SPaolo Bonzinisummary_info += {'strip binaries':    get_option('strip')}
1535f9332757SPaolo Bonzinisummary_info += {'profiler':          config_host.has_key('CONFIG_PROFILER')}
15363e8529ddSLaurent Viviersummary_info += {'static build':      config_host.has_key('CONFIG_STATIC')}
1537f9332757SPaolo Bonziniif targetos == 'darwin'
1538f9332757SPaolo Bonzini  summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1539f9332757SPaolo Bonziniendif
1540f9332757SPaolo Bonzini# TODO: add back version
154135be72baSPaolo Bonzinisummary_info += {'SDL support':       sdl.found()}
154235be72baSPaolo Bonzinisummary_info += {'SDL image support': sdl_image.found()}
1543f9332757SPaolo Bonzini# TODO: add back version
1544f9332757SPaolo Bonzinisummary_info += {'GTK support':       config_host.has_key('CONFIG_GTK')}
1545f9332757SPaolo Bonzinisummary_info += {'GTK GL support':    config_host.has_key('CONFIG_GTK_GL')}
1546b7612f45SPaolo Bonzinisummary_info += {'pixman':            pixman.found()}
1547f9332757SPaolo Bonzini# TODO: add back version
1548f9332757SPaolo Bonzinisummary_info += {'VTE support':       config_host.has_key('CONFIG_VTE')}
1549f9332757SPaolo Bonzinisummary_info += {'TLS priority':      config_host['CONFIG_TLS_PRIORITY']}
1550f9332757SPaolo Bonzinisummary_info += {'GNUTLS support':    config_host.has_key('CONFIG_GNUTLS')}
1551f9332757SPaolo Bonzini# TODO: add back version
1552f9332757SPaolo Bonzinisummary_info += {'libgcrypt':         config_host.has_key('CONFIG_GCRYPT')}
1553f9332757SPaolo Bonziniif config_host.has_key('CONFIG_GCRYPT')
1554f9332757SPaolo Bonzini   summary_info += {'  hmac':            config_host.has_key('CONFIG_GCRYPT_HMAC')}
1555f9332757SPaolo Bonzini   summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1556f9332757SPaolo Bonziniendif
1557f9332757SPaolo Bonzini# TODO: add back version
1558f9332757SPaolo Bonzinisummary_info += {'nettle':            config_host.has_key('CONFIG_NETTLE')}
1559f9332757SPaolo Bonziniif config_host.has_key('CONFIG_NETTLE')
1560f9332757SPaolo Bonzini   summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1561f9332757SPaolo Bonziniendif
1562f9332757SPaolo Bonzinisummary_info += {'libtasn1':          config_host.has_key('CONFIG_TASN1')}
1563f9332757SPaolo Bonzinisummary_info += {'PAM':               config_host.has_key('CONFIG_AUTH_PAM')}
1564f9332757SPaolo Bonzinisummary_info += {'iconv support':     config_host.has_key('CONFIG_ICONV')}
1565f9332757SPaolo Bonzinisummary_info += {'curses support':    config_host.has_key('CONFIG_CURSES')}
1566f9332757SPaolo Bonzini# TODO: add back version
1567f9332757SPaolo Bonzinisummary_info += {'virgl support':     config_host.has_key('CONFIG_VIRGL')}
1568f9332757SPaolo Bonzinisummary_info += {'curl support':      config_host.has_key('CONFIG_CURL')}
1569f9332757SPaolo Bonzinisummary_info += {'mingw32 support':   targetos == 'windows'}
1570f9332757SPaolo Bonzinisummary_info += {'Audio drivers':     config_host['CONFIG_AUDIO_DRIVERS']}
1571f9332757SPaolo Bonzinisummary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1572f9332757SPaolo Bonzinisummary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1573f9332757SPaolo Bonzinisummary_info += {'VirtFS support':    config_host.has_key('CONFIG_VIRTFS')}
15746ec0e15dSPaolo Bonzinisummary_info += {'Multipath support': mpathpersist.found()}
1575a0b93237SPaolo Bonzinisummary_info += {'VNC support':       vnc.found()}
1576a0b93237SPaolo Bonziniif vnc.found()
1577a0b93237SPaolo Bonzini  summary_info += {'VNC SASL support':  sasl.found()}
1578a0b93237SPaolo Bonzini  summary_info += {'VNC JPEG support':  jpeg.found()}
1579a0b93237SPaolo Bonzini  summary_info += {'VNC PNG support':   png.found()}
1580f9332757SPaolo Bonziniendif
1581f9332757SPaolo Bonzinisummary_info += {'xen support':       config_host.has_key('CONFIG_XEN_BACKEND')}
1582f9332757SPaolo Bonziniif config_host.has_key('CONFIG_XEN_BACKEND')
1583f9332757SPaolo Bonzini  summary_info += {'xen ctrl version':  config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1584f9332757SPaolo Bonziniendif
1585f9332757SPaolo Bonzinisummary_info += {'brlapi support':    config_host.has_key('CONFIG_BRLAPI')}
1586f9332757SPaolo Bonzinisummary_info += {'Documentation':     config_host.has_key('BUILD_DOCS')}
1587f9332757SPaolo Bonzinisummary_info += {'PIE':               get_option('b_pie')}
1588f9332757SPaolo Bonzinisummary_info += {'vde support':       config_host.has_key('CONFIG_VDE')}
1589f9332757SPaolo Bonzinisummary_info += {'netmap support':    config_host.has_key('CONFIG_NETMAP')}
1590f9332757SPaolo Bonzinisummary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1591f9332757SPaolo Bonzinisummary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1592f9332757SPaolo Bonzinisummary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1593f9332757SPaolo Bonzinisummary_info += {'Install blobs':     config_host.has_key('INSTALL_BLOBS')}
159405512f55SPaolo Bonzinisummary_info += {'KVM support':       config_all.has_key('CONFIG_KVM')}
159505512f55SPaolo Bonzinisummary_info += {'HAX support':       config_all.has_key('CONFIG_HAX')}
159605512f55SPaolo Bonzinisummary_info += {'HVF support':       config_all.has_key('CONFIG_HVF')}
159705512f55SPaolo Bonzinisummary_info += {'WHPX support':      config_all.has_key('CONFIG_WHPX')}
159805512f55SPaolo Bonzinisummary_info += {'TCG support':       config_all.has_key('CONFIG_TCG')}
159905512f55SPaolo Bonziniif config_all.has_key('CONFIG_TCG')
160005512f55SPaolo Bonzini  summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
160105512f55SPaolo Bonzini  summary_info += {'TCG interpreter':   config_host.has_key('CONFIG_TCG_INTERPRETER')}
160205512f55SPaolo Bonziniendif
1603aa087962SPaolo Bonzinisummary_info += {'malloc trim support': has_malloc_trim}
1604f9332757SPaolo Bonzinisummary_info += {'RDMA support':      config_host.has_key('CONFIG_RDMA')}
1605f9332757SPaolo Bonzinisummary_info += {'PVRDMA support':    config_host.has_key('CONFIG_PVRDMA')}
1606f9332757SPaolo Bonzinisummary_info += {'fdt support':       config_host.has_key('CONFIG_FDT')}
1607f9332757SPaolo Bonzinisummary_info += {'membarrier':        config_host.has_key('CONFIG_MEMBARRIER')}
1608f9332757SPaolo Bonzinisummary_info += {'preadv support':    config_host.has_key('CONFIG_PREADV')}
1609f9332757SPaolo Bonzinisummary_info += {'fdatasync':         config_host.has_key('CONFIG_FDATASYNC')}
1610f9332757SPaolo Bonzinisummary_info += {'madvise':           config_host.has_key('CONFIG_MADVISE')}
1611f9332757SPaolo Bonzinisummary_info += {'posix_madvise':     config_host.has_key('CONFIG_POSIX_MADVISE')}
1612f9332757SPaolo Bonzinisummary_info += {'posix_memalign':    config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1613f9332757SPaolo Bonzinisummary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1614f9332757SPaolo Bonzinisummary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1615f9332757SPaolo Bonzinisummary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1616f9332757SPaolo Bonzinisummary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1617f9332757SPaolo Bonzinisummary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1618f9332757SPaolo Bonzinisummary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1619f9332757SPaolo Bonzinisummary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1620f9332757SPaolo Bonzinisummary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1621f9332757SPaolo Bonzinisummary_info += {'Trace backends':    config_host['TRACE_BACKENDS']}
1622f9332757SPaolo Bonziniif config_host['TRACE_BACKENDS'].split().contains('simple')
1623f9332757SPaolo Bonzini  summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1624f9332757SPaolo Bonziniendif
1625f9332757SPaolo Bonzini# TODO: add back protocol and server version
1626f9332757SPaolo Bonzinisummary_info += {'spice support':     config_host.has_key('CONFIG_SPICE')}
1627f9332757SPaolo Bonzinisummary_info += {'rbd support':       config_host.has_key('CONFIG_RBD')}
1628f9332757SPaolo Bonzinisummary_info += {'xfsctl support':    config_host.has_key('CONFIG_XFS')}
1629f9332757SPaolo Bonzinisummary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
16300a40bcb7SCésar Belleysummary_info += {'U2F support':       u2f.found()}
1631f9332757SPaolo Bonzinisummary_info += {'libusb':            config_host.has_key('CONFIG_USB_LIBUSB')}
1632f9332757SPaolo Bonzinisummary_info += {'usb net redir':     config_host.has_key('CONFIG_USB_REDIR')}
1633f9332757SPaolo Bonzinisummary_info += {'OpenGL support':    config_host.has_key('CONFIG_OPENGL')}
1634f9332757SPaolo Bonzinisummary_info += {'OpenGL dmabufs':    config_host.has_key('CONFIG_OPENGL_DMABUF')}
1635f9332757SPaolo Bonzinisummary_info += {'libiscsi support':  config_host.has_key('CONFIG_LIBISCSI')}
1636f9332757SPaolo Bonzinisummary_info += {'libnfs support':    config_host.has_key('CONFIG_LIBNFS')}
1637f9332757SPaolo Bonzinisummary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1638f9332757SPaolo Bonziniif targetos == 'windows'
1639f9332757SPaolo Bonzini  if 'WIN_SDK' in config_host
1640f9332757SPaolo Bonzini    summary_info += {'Windows SDK':       config_host['WIN_SDK']}
1641f9332757SPaolo Bonzini  endif
1642f9332757SPaolo Bonzini  summary_info += {'QGA VSS support':   config_host.has_key('CONFIG_QGA_VSS')}
1643f9332757SPaolo Bonzini  summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
16444bad7c3bSStefan Hajnoczi  summary_info += {'QGA MSI support':   config_host.has_key('CONFIG_QGA_MSI')}
1645f9332757SPaolo Bonziniendif
1646f9332757SPaolo Bonzinisummary_info += {'seccomp support':   config_host.has_key('CONFIG_SECCOMP')}
1647f9332757SPaolo Bonzinisummary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1648f9332757SPaolo Bonzinisummary_info += {'coroutine pool':    config_host['CONFIG_COROUTINE_POOL'] == '1'}
1649f9332757SPaolo Bonzinisummary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1650f9332757SPaolo Bonzinisummary_info += {'mutex debugging':   config_host.has_key('CONFIG_DEBUG_MUTEX')}
1651f9332757SPaolo Bonzinisummary_info += {'crypto afalg':      config_host.has_key('CONFIG_AF_ALG')}
1652f9332757SPaolo Bonzinisummary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1653bf0e56a3SMarc-André Lureausummary_info += {'gcov':              get_option('b_coverage')}
1654f9332757SPaolo Bonzinisummary_info += {'TPM support':       config_host.has_key('CONFIG_TPM')}
1655f9332757SPaolo Bonzinisummary_info += {'libssh support':    config_host.has_key('CONFIG_LIBSSH')}
1656f9332757SPaolo Bonzinisummary_info += {'QOM debugging':     config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1657f9332757SPaolo Bonzinisummary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1658f9332757SPaolo Bonzinisummary_info += {'lzo support':       config_host.has_key('CONFIG_LZO')}
1659f9332757SPaolo Bonzinisummary_info += {'snappy support':    config_host.has_key('CONFIG_SNAPPY')}
1660f9332757SPaolo Bonzinisummary_info += {'bzip2 support':     config_host.has_key('CONFIG_BZIP2')}
1661f9332757SPaolo Bonzinisummary_info += {'lzfse support':     config_host.has_key('CONFIG_LZFSE')}
1662f9332757SPaolo Bonzinisummary_info += {'zstd support':      config_host.has_key('CONFIG_ZSTD')}
1663f9332757SPaolo Bonzinisummary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1664f9332757SPaolo Bonzinisummary_info += {'libxml2':           config_host.has_key('CONFIG_LIBXML2')}
1665aa087962SPaolo Bonzinisummary_info += {'memory allocator':  get_option('malloc')}
1666f9332757SPaolo Bonzinisummary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1667f9332757SPaolo Bonzinisummary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1668f9332757SPaolo Bonzinisummary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1669f9332757SPaolo Bonzinisummary_info += {'bochs support':     config_host.has_key('CONFIG_BOCHS')}
1670f9332757SPaolo Bonzinisummary_info += {'cloop support':     config_host.has_key('CONFIG_CLOOP')}
1671f9332757SPaolo Bonzinisummary_info += {'dmg support':       config_host.has_key('CONFIG_DMG')}
1672f9332757SPaolo Bonzinisummary_info += {'qcow v1 support':   config_host.has_key('CONFIG_QCOW1')}
1673f9332757SPaolo Bonzinisummary_info += {'vdi support':       config_host.has_key('CONFIG_VDI')}
1674f9332757SPaolo Bonzinisummary_info += {'vvfat support':     config_host.has_key('CONFIG_VVFAT')}
1675f9332757SPaolo Bonzinisummary_info += {'qed support':       config_host.has_key('CONFIG_QED')}
1676f9332757SPaolo Bonzinisummary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1677f9332757SPaolo Bonzinisummary_info += {'sheepdog support':  config_host.has_key('CONFIG_SHEEPDOG')}
16788b18cdbfSRichard Hendersonsummary_info += {'capstone':          capstone_opt == 'disabled' ? false : capstone_opt}
1679f9332757SPaolo Bonzinisummary_info += {'libpmem support':   config_host.has_key('CONFIG_LIBPMEM')}
1680f9332757SPaolo Bonzinisummary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1681f01496a3SPaolo Bonzinisummary_info += {'libudev':           libudev.found()}
1682f9332757SPaolo Bonzinisummary_info += {'default devices':   config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1683f9332757SPaolo Bonzinisummary_info += {'plugin support':    config_host.has_key('CONFIG_PLUGIN')}
1684f9332757SPaolo Bonzinisummary_info += {'fuzzing support':   config_host.has_key('CONFIG_FUZZ')}
1685f9332757SPaolo Bonziniif config_host.has_key('HAVE_GDB_BIN')
1686f9332757SPaolo Bonzini  summary_info += {'gdb':             config_host['HAVE_GDB_BIN']}
1687f9332757SPaolo Bonziniendif
1688f9332757SPaolo Bonzinisummary_info += {'thread sanitizer':  config_host.has_key('CONFIG_TSAN')}
1689f9332757SPaolo Bonzinisummary_info += {'rng-none':          config_host.has_key('CONFIG_RNG_NONE')}
1690f9332757SPaolo Bonzinisummary_info += {'Linux keyring':     config_host.has_key('CONFIG_SECRET_KEYRING')}
1691f9332757SPaolo Bonzinisummary(summary_info, bool_yn: true)
1692f9332757SPaolo Bonzini
1693f9332757SPaolo Bonziniif not supported_cpus.contains(cpu)
1694f9332757SPaolo Bonzini  message()
1695f9332757SPaolo Bonzini  warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1696f9332757SPaolo Bonzini  message()
1697f9332757SPaolo Bonzini  message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1698f9332757SPaolo Bonzini  message('The QEMU project intends to remove support for this host CPU in')
1699f9332757SPaolo Bonzini  message('a future release if nobody volunteers to maintain it and to')
1700f9332757SPaolo Bonzini  message('provide a build host for our continuous integration setup.')
1701f9332757SPaolo Bonzini  message('configure has succeeded and you can continue to build, but')
1702f9332757SPaolo Bonzini  message('if you care about QEMU on this platform you should contact')
1703f9332757SPaolo Bonzini  message('us upstream at qemu-devel@nongnu.org.')
1704f9332757SPaolo Bonziniendif
1705f9332757SPaolo Bonzini
1706f9332757SPaolo Bonziniif not supported_oses.contains(targetos)
1707f9332757SPaolo Bonzini  message()
1708f9332757SPaolo Bonzini  warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1709f9332757SPaolo Bonzini  message()
1710f9332757SPaolo Bonzini  message('Host OS ' + targetos + 'support is not currently maintained.')
1711f9332757SPaolo Bonzini  message('The QEMU project intends to remove support for this host OS in')
1712f9332757SPaolo Bonzini  message('a future release if nobody volunteers to maintain it and to')
1713f9332757SPaolo Bonzini  message('provide a build host for our continuous integration setup.')
1714f9332757SPaolo Bonzini  message('configure has succeeded and you can continue to build, but')
1715f9332757SPaolo Bonzini  message('if you care about QEMU on this platform you should contact')
1716f9332757SPaolo Bonzini  message('us upstream at qemu-devel@nongnu.org.')
1717f9332757SPaolo Bonziniendif
1718