xref: /openbmc/qemu/meson.build (revision b4e312e9)
1a5665051SPaolo Bonziniproject('qemu', ['c'], meson_version: '>=0.55.0',
290756b2fSGerd Hoffmann        default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11',
33e0e5190SPaolo Bonzini                          'b_colorout=auto'],
4a5665051SPaolo Bonzini        version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
5a5665051SPaolo Bonzini
6a5665051SPaolo Bonzininot_found = dependency('', required: false)
7b29b40f4SPaolo Bonziniif meson.version().version_compare('>=0.56.0')
8b29b40f4SPaolo Bonzini  keyval = import('keyval')
9b29b40f4SPaolo Bonzinielse
10a5665051SPaolo Bonzini  keyval = import('unstable-keyval')
11b29b40f4SPaolo Bonziniendif
12a81df1b6SPaolo Bonziniss = import('sourceset')
13a81df1b6SPaolo Bonzini
14ce1c1e7aSPaolo Bonzinish = find_program('sh')
15a81df1b6SPaolo Bonzinicc = meson.get_compiler('c')
16a5665051SPaolo Bonziniconfig_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
173154fee4SMarc-André Lureauenable_modules = 'CONFIG_MODULES' in config_host
1835be72baSPaolo Bonzinienable_static = 'CONFIG_STATIC' in config_host
19f8aa24eaSPaolo Bonzinibuild_docs = 'BUILD_DOCS' in config_host
208fe11232SMarc-André Lureau
218fe11232SMarc-André Lureauif get_option('qemu_suffix').startswith('/')
228fe11232SMarc-André Lureau  error('qemu_suffix cannot start with a /')
238fe11232SMarc-André Lureauendif
248fe11232SMarc-André Lureau
25ab4c0996SMarc-André Lureauqemu_datadir = get_option('datadir') / get_option('qemu_suffix')
26491e74c1SMarc-André Lureauqemu_docdir = get_option('docdir') / get_option('qemu_suffix')
27859aef02SPaolo Bonziniconfig_host_data = configuration_data()
28859aef02SPaolo Bonzinigenh = []
29a5665051SPaolo Bonzini
30760e4327SPaolo Bonzinitarget_dirs = config_host['TARGET_DIRS'].split()
31760e4327SPaolo Bonzinihave_user = false
32760e4327SPaolo Bonzinihave_system = false
33760e4327SPaolo Bonziniforeach target : target_dirs
34760e4327SPaolo Bonzini  have_user = have_user or target.endswith('-user')
35760e4327SPaolo Bonzini  have_system = have_system or target.endswith('-softmmu')
36760e4327SPaolo Bonziniendforeach
37760e4327SPaolo Bonzinihave_tools = 'CONFIG_TOOLS' in config_host
38760e4327SPaolo Bonzinihave_block = have_system or have_tools
39760e4327SPaolo Bonzini
40201e8ed7SPaolo Bonzinipython = import('python').find_installation()
41201e8ed7SPaolo Bonzini
42201e8ed7SPaolo Bonzinisupported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
43201e8ed7SPaolo Bonzinisupported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
44201e8ed7SPaolo Bonzini  'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
45201e8ed7SPaolo Bonzini
46201e8ed7SPaolo Bonzinicpu = host_machine.cpu_family()
47201e8ed7SPaolo Bonzinitargetos = host_machine.system()
48201e8ed7SPaolo Bonzini
49201e8ed7SPaolo Bonziniconfigure_file(input: files('scripts/ninjatool.py'),
50201e8ed7SPaolo Bonzini               output: 'ninjatool',
51201e8ed7SPaolo Bonzini               configuration: config_host)
52201e8ed7SPaolo Bonzini
53201e8ed7SPaolo Bonzini##################
54201e8ed7SPaolo Bonzini# Compiler flags #
55201e8ed7SPaolo Bonzini##################
56201e8ed7SPaolo Bonzini
57a5665051SPaolo Bonziniadd_project_arguments(config_host['QEMU_CFLAGS'].split(),
58a5665051SPaolo Bonzini                      native: false, language: ['c', 'objc'])
59a5665051SPaolo Bonziniadd_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
60a5665051SPaolo Bonzini                      native: false, language: 'cpp')
61a5665051SPaolo Bonziniadd_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
62a5665051SPaolo Bonzini                           native: false, language: ['c', 'cpp', 'objc'])
63a5665051SPaolo Bonziniadd_project_arguments(config_host['QEMU_INCLUDES'].split(),
64a5665051SPaolo Bonzini                      language: ['c', 'cpp', 'objc'])
65a5665051SPaolo Bonzini
66c46f76d1SAlexander Bulekov# Specify linker-script with add_project_link_arguments so that it is not placed
67c46f76d1SAlexander Bulekov# within a linker --start-group/--end-group pair
68c46f76d1SAlexander Bulekovif 'CONFIG_FUZZ' in config_host
69c46f76d1SAlexander Bulekov   add_project_link_arguments(['-Wl,-T,',
70c46f76d1SAlexander Bulekov                               (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
71c46f76d1SAlexander Bulekov                              native: false, language: ['c', 'cpp', 'objc'])
72c46f76d1SAlexander Bulekovendif
73c46f76d1SAlexander Bulekov
74fc929892SMarc-André Lureaulink_language = meson.get_external_property('link_language', 'cpp')
75fc929892SMarc-André Lureauif link_language == 'cpp'
76fc929892SMarc-André Lureau  add_languages('cpp', required: true, native: false)
77fc929892SMarc-André Lureauendif
78a5665051SPaolo Bonziniif host_machine.system() == 'darwin'
79a5665051SPaolo Bonzini  add_languages('objc', required: false, native: false)
80a5665051SPaolo Bonziniendif
81a5665051SPaolo Bonzini
82968b4db3SPaolo Bonziniif 'SPARSE_CFLAGS' in config_host
83968b4db3SPaolo Bonzini  run_target('sparse',
84968b4db3SPaolo Bonzini             command: [find_program('scripts/check_sparse.py'),
85968b4db3SPaolo Bonzini                       config_host['SPARSE_CFLAGS'].split(),
86968b4db3SPaolo Bonzini                       'compile_commands.json'])
87968b4db3SPaolo Bonziniendif
88968b4db3SPaolo Bonzini
896ec0e15dSPaolo Bonzini###########################################
906ec0e15dSPaolo Bonzini# Target-specific checks and dependencies #
916ec0e15dSPaolo Bonzini###########################################
926ec0e15dSPaolo Bonzini
936ec0e15dSPaolo Bonziniif targetos != 'linux' and get_option('mpath').enabled()
946ec0e15dSPaolo Bonzini  error('Multipath is supported only on Linux')
956ec0e15dSPaolo Bonziniendif
966ec0e15dSPaolo Bonzini
97a81df1b6SPaolo Bonzinim = cc.find_library('m', required: false)
98a81df1b6SPaolo Bonziniutil = cc.find_library('util', required: false)
994a96337dSPaolo Bonziniwinmm = []
100a81df1b6SPaolo Bonzinisocket = []
10104c6f1e7SMarc-André Lureauversion_res = []
102d92989aaSMarc-André Lureaucoref = []
103d92989aaSMarc-André Lureauiokit = []
104*b4e312e9SPaolo Bonzinicocoa = not_found
105d92989aaSMarc-André Lureauhvf = []
106a81df1b6SPaolo Bonziniif targetos == 'windows'
107a81df1b6SPaolo Bonzini  socket = cc.find_library('ws2_32')
1084a96337dSPaolo Bonzini  winmm = cc.find_library('winmm')
10904c6f1e7SMarc-André Lureau
11004c6f1e7SMarc-André Lureau  win = import('windows')
11104c6f1e7SMarc-André Lureau  version_res = win.compile_resources('version.rc',
11204c6f1e7SMarc-André Lureau                                      depend_files: files('pc-bios/qemu-nsis.ico'),
11304c6f1e7SMarc-André Lureau                                      include_directories: include_directories('.'))
114d92989aaSMarc-André Lureauelif targetos == 'darwin'
115d92989aaSMarc-André Lureau  coref = dependency('appleframeworks', modules: 'CoreFoundation')
116d92989aaSMarc-André Lureau  iokit = dependency('appleframeworks', modules: 'IOKit')
117*b4e312e9SPaolo Bonzini  cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
118d92989aaSMarc-André Lureau  hvf = dependency('appleframeworks', modules: 'Hypervisor')
119cfad62f1SPaolo Bonzinielif targetos == 'sunos'
120cfad62f1SPaolo Bonzini  socket = [cc.find_library('socket'),
121cfad62f1SPaolo Bonzini            cc.find_library('nsl'),
122cfad62f1SPaolo Bonzini            cc.find_library('resolv')]
123cfad62f1SPaolo Bonzinielif targetos == 'haiku'
124cfad62f1SPaolo Bonzini  socket = [cc.find_library('posix_error_mapper'),
125cfad62f1SPaolo Bonzini            cc.find_library('network'),
126cfad62f1SPaolo Bonzini            cc.find_library('bsd')]
127a81df1b6SPaolo Bonziniendif
1286ec0e15dSPaolo Bonzini
129*b4e312e9SPaolo Bonziniif not cocoa.found() and get_option('cocoa').enabled()
130*b4e312e9SPaolo Bonzini  error('Cocoa not available on this platform')
131*b4e312e9SPaolo Bonziniendif
132*b4e312e9SPaolo Bonzini
1336ec0e15dSPaolo Bonzini################
1346ec0e15dSPaolo Bonzini# Dependencies #
1356ec0e15dSPaolo Bonzini################
1366ec0e15dSPaolo Bonzini
137215b0c2fSPaolo Bonzini# The path to glib.h is added to all compilation commands.  This was
138215b0c2fSPaolo Bonzini# grandfathered in from the QEMU Makefiles.
139215b0c2fSPaolo Bonziniadd_project_arguments(config_host['GLIB_CFLAGS'].split(),
140215b0c2fSPaolo Bonzini                      native: false, language: ['c', 'cpp', 'objc'])
141215b0c2fSPaolo Bonziniglib = declare_dependency(link_args: config_host['GLIB_LIBS'].split())
142a81df1b6SPaolo Bonzinigio = not_found
143a81df1b6SPaolo Bonziniif 'CONFIG_GIO' in config_host
144a81df1b6SPaolo Bonzini  gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
145a81df1b6SPaolo Bonzini                           link_args: config_host['GIO_LIBS'].split())
146a81df1b6SPaolo Bonziniendif
147a81df1b6SPaolo Bonzinilttng = not_found
148a81df1b6SPaolo Bonziniif 'CONFIG_TRACE_UST' in config_host
149a81df1b6SPaolo Bonzini  lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
150a81df1b6SPaolo Bonziniendif
151a81df1b6SPaolo Bonziniurcubp = not_found
152a81df1b6SPaolo Bonziniif 'CONFIG_TRACE_UST' in config_host
153a81df1b6SPaolo Bonzini  urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
154a81df1b6SPaolo Bonziniendif
15546859d93SDaniel P. Berrangégcrypt = not_found
15646859d93SDaniel P. Berrangéif 'CONFIG_GCRYPT' in config_host
15746859d93SDaniel P. Berrangé  gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
15846859d93SDaniel P. Berrangé                              link_args: config_host['GCRYPT_LIBS'].split())
15946859d93SDaniel P. Berrangéendif
160a81df1b6SPaolo Bonzininettle = not_found
161a81df1b6SPaolo Bonziniif 'CONFIG_NETTLE' in config_host
162a81df1b6SPaolo Bonzini  nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
163a81df1b6SPaolo Bonzini                              link_args: config_host['NETTLE_LIBS'].split())
164a81df1b6SPaolo Bonziniendif
165a81df1b6SPaolo Bonzinignutls = not_found
166a81df1b6SPaolo Bonziniif 'CONFIG_GNUTLS' in config_host
167a81df1b6SPaolo Bonzini  gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
168a81df1b6SPaolo Bonzini                              link_args: config_host['GNUTLS_LIBS'].split())
169a81df1b6SPaolo Bonziniendif
170b7612f45SPaolo Bonzinipixman = not_found
171b7612f45SPaolo Bonziniif have_system or have_tools
172b7612f45SPaolo Bonzini  pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
1731a94933fSPaolo Bonzini                      method: 'pkg-config', static: enable_static)
174b7612f45SPaolo Bonziniendif
1755e7fbd25SMarc-André Lureaupam = not_found
1765e7fbd25SMarc-André Lureauif 'CONFIG_AUTH_PAM' in config_host
1775e7fbd25SMarc-André Lureau  pam = cc.find_library('pam')
1785e7fbd25SMarc-André Lureauendif
1795e5733e5SMarc-André Lureaulibaio = cc.find_library('aio', required: false)
1801ffb3bbbSPaolo Bonzinizlib = dependency('zlib', required: true, static: enable_static)
1815e5733e5SMarc-André Lureaulinux_io_uring = not_found
1825e5733e5SMarc-André Lureauif 'CONFIG_LINUX_IO_URING' in config_host
1835e5733e5SMarc-André Lureau  linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
1845e5733e5SMarc-André Lureau                                      link_args: config_host['LINUX_IO_URING_LIBS'].split())
1855e5733e5SMarc-André Lureauendif
1865e5733e5SMarc-André Lureaulibxml2 = not_found
1875e5733e5SMarc-André Lureauif 'CONFIG_LIBXML2' in config_host
1885e5733e5SMarc-André Lureau  libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
1895e5733e5SMarc-André Lureau                               link_args: config_host['LIBXML2_LIBS'].split())
1905e5733e5SMarc-André Lureauendif
1915e5733e5SMarc-André Lureaulibnfs = not_found
1925e5733e5SMarc-André Lureauif 'CONFIG_LIBNFS' in config_host
1935e5733e5SMarc-André Lureau  libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
1945e5733e5SMarc-André Lureauendif
195ec0d5893SMarc-André Lureaulibattr = not_found
196ec0d5893SMarc-André Lureauif 'CONFIG_ATTR' in config_host
197ec0d5893SMarc-André Lureau  libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
198ec0d5893SMarc-André Lureauendif
1993f99cf57SPaolo Bonziniseccomp = not_found
2003f99cf57SPaolo Bonziniif 'CONFIG_SECCOMP' in config_host
2013f99cf57SPaolo Bonzini  seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
2023f99cf57SPaolo Bonzini                               link_args: config_host['SECCOMP_LIBS'].split())
2033f99cf57SPaolo Bonziniendif
2043f99cf57SPaolo Bonzinilibcap_ng = not_found
2053f99cf57SPaolo Bonziniif 'CONFIG_LIBCAP_NG' in config_host
2063f99cf57SPaolo Bonzini  libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
2073f99cf57SPaolo Bonziniendif
2081917ec6dSPaolo Bonziniif get_option('xkbcommon').auto() and not have_system and not have_tools
2091917ec6dSPaolo Bonzini  xkbcommon = not_found
2101917ec6dSPaolo Bonzinielse
2111917ec6dSPaolo Bonzini  xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
2121a94933fSPaolo Bonzini                         method: 'pkg-config', static: enable_static)
213ade60d4fSMarc-André Lureauendif
214cdaf0722SMarc-André Lureauslirp = not_found
215cdaf0722SMarc-André Lureauif config_host.has_key('CONFIG_SLIRP')
216cdaf0722SMarc-André Lureau  slirp = declare_dependency(compile_args: config_host['SLIRP_CFLAGS'].split(),
217cdaf0722SMarc-André Lureau                             link_args: config_host['SLIRP_LIBS'].split())
218cdaf0722SMarc-André Lureauendif
219cdaf0722SMarc-André Lureauvde = not_found
220cdaf0722SMarc-André Lureauif config_host.has_key('CONFIG_VDE')
221cdaf0722SMarc-André Lureau  vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
222cdaf0722SMarc-André Lureauendif
223478e943fSPaolo Bonzinipulse = not_found
224478e943fSPaolo Bonziniif 'CONFIG_LIBPULSE' in config_host
225478e943fSPaolo Bonzini  pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
226478e943fSPaolo Bonzini                             link_args: config_host['PULSE_LIBS'].split())
227478e943fSPaolo Bonziniendif
228478e943fSPaolo Bonzinialsa = not_found
229478e943fSPaolo Bonziniif 'CONFIG_ALSA' in config_host
230478e943fSPaolo Bonzini  alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
231478e943fSPaolo Bonzini                            link_args: config_host['ALSA_LIBS'].split())
232478e943fSPaolo Bonziniendif
233478e943fSPaolo Bonzinijack = not_found
234478e943fSPaolo Bonziniif 'CONFIG_LIBJACK' in config_host
235478e943fSPaolo Bonzini  jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
236478e943fSPaolo Bonziniendif
2372634733cSPaolo Bonzinispice = not_found
2382634733cSPaolo Bonziniif 'CONFIG_SPICE' in config_host
2392634733cSPaolo Bonzini  spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
2402634733cSPaolo Bonzini                             link_args: config_host['SPICE_LIBS'].split())
2412634733cSPaolo Bonziniendif
2425ee24e78SMarc-André Lureaurt = cc.find_library('rt', required: false)
243ccf7afa5SPaolo Bonzinilibdl = not_found
244ccf7afa5SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host
245ccf7afa5SPaolo Bonzini  libdl = cc.find_library('dl', required: true)
246ccf7afa5SPaolo Bonziniendif
24799650b62SPaolo Bonzinilibiscsi = not_found
24899650b62SPaolo Bonziniif 'CONFIG_LIBISCSI' in config_host
24999650b62SPaolo Bonzini  libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
25099650b62SPaolo Bonzini                                link_args: config_host['LIBISCSI_LIBS'].split())
25199650b62SPaolo Bonziniendif
2525e5733e5SMarc-André Lureauzstd = not_found
2535e5733e5SMarc-André Lureauif 'CONFIG_ZSTD' in config_host
2545e5733e5SMarc-André Lureau  zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
2555e5733e5SMarc-André Lureau                            link_args: config_host['ZSTD_LIBS'].split())
2565e5733e5SMarc-André Lureauendif
257ea458960SMarc-André Lureaugbm = not_found
258ea458960SMarc-André Lureauif 'CONFIG_GBM' in config_host
259ea458960SMarc-André Lureau  gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
260ea458960SMarc-André Lureau                           link_args: config_host['GBM_LIBS'].split())
261ea458960SMarc-André Lureauendif
262ea458960SMarc-André Lureauvirgl = not_found
263ea458960SMarc-André Lureauif 'CONFIG_VIRGL' in config_host
264ea458960SMarc-André Lureau  virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
265ea458960SMarc-André Lureau                             link_args: config_host['VIRGL_LIBS'].split())
266ea458960SMarc-André Lureauendif
2671d7bb6abSMarc-André Lureaucurl = not_found
2681d7bb6abSMarc-André Lureauif 'CONFIG_CURL' in config_host
2691d7bb6abSMarc-André Lureau  curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
2701d7bb6abSMarc-André Lureau                            link_args: config_host['CURL_LIBS'].split())
2711d7bb6abSMarc-André Lureauendif
272f15bff25SPaolo Bonzinilibudev = not_found
273f01496a3SPaolo Bonziniif targetos == 'linux' and (have_system or have_tools)
2746ec0e15dSPaolo Bonzini  libudev = dependency('libudev',
2756ec0e15dSPaolo Bonzini                       required: get_option('mpath').enabled(),
2766ec0e15dSPaolo Bonzini                       static: enable_static)
277f15bff25SPaolo Bonziniendif
2786ec0e15dSPaolo Bonzini
2796ec0e15dSPaolo Bonzinimpathpersist = not_found
2806ec0e15dSPaolo Bonzinimpathpersist_new_api = false
2816ec0e15dSPaolo Bonziniif targetos == 'linux' and have_tools and not get_option('mpath').disabled()
2826ec0e15dSPaolo Bonzini  mpath_test_source_new = '''
2836ec0e15dSPaolo Bonzini    #include <libudev.h>
2846ec0e15dSPaolo Bonzini    #include <mpath_persist.h>
2856ec0e15dSPaolo Bonzini    unsigned mpath_mx_alloc_len = 1024;
2866ec0e15dSPaolo Bonzini    int logsink;
2876ec0e15dSPaolo Bonzini    static struct config *multipath_conf;
2886ec0e15dSPaolo Bonzini    extern struct udev *udev;
2896ec0e15dSPaolo Bonzini    extern struct config *get_multipath_config(void);
2906ec0e15dSPaolo Bonzini    extern void put_multipath_config(struct config *conf);
2916ec0e15dSPaolo Bonzini    struct udev *udev;
2926ec0e15dSPaolo Bonzini    struct config *get_multipath_config(void) { return multipath_conf; }
2936ec0e15dSPaolo Bonzini    void put_multipath_config(struct config *conf) { }
2946ec0e15dSPaolo Bonzini    int main(void) {
2956ec0e15dSPaolo Bonzini        udev = udev_new();
2966ec0e15dSPaolo Bonzini        multipath_conf = mpath_lib_init();
2976ec0e15dSPaolo Bonzini        return 0;
2986ec0e15dSPaolo Bonzini    }'''
2996ec0e15dSPaolo Bonzini  mpath_test_source_old = '''
3006ec0e15dSPaolo Bonzini      #include <libudev.h>
3016ec0e15dSPaolo Bonzini      #include <mpath_persist.h>
3026ec0e15dSPaolo Bonzini      unsigned mpath_mx_alloc_len = 1024;
3036ec0e15dSPaolo Bonzini      int logsink;
3046ec0e15dSPaolo Bonzini      int main(void) {
3056ec0e15dSPaolo Bonzini          struct udev *udev = udev_new();
3066ec0e15dSPaolo Bonzini          mpath_lib_init(udev);
3076ec0e15dSPaolo Bonzini          return 0;
3086ec0e15dSPaolo Bonzini      }'''
30943b43a40SPaolo Bonzini  mpathlibs = [libudev]
31043b43a40SPaolo Bonzini  if enable_static
31143b43a40SPaolo Bonzini    mpathlibs += cc.find_library('devmapper',
3126ec0e15dSPaolo Bonzini                                   required: get_option('mpath'),
3136ec0e15dSPaolo Bonzini                                   static: enable_static)
31443b43a40SPaolo Bonzini  endif
31543b43a40SPaolo Bonzini  mpathlibs += cc.find_library('multipath',
3166ec0e15dSPaolo Bonzini                               required: get_option('mpath'),
3176ec0e15dSPaolo Bonzini                               static: enable_static)
31843b43a40SPaolo Bonzini  mpathlibs += cc.find_library('mpathpersist',
31943b43a40SPaolo Bonzini                               required: get_option('mpath'),
32043b43a40SPaolo Bonzini                               static: enable_static)
32143b43a40SPaolo Bonzini  foreach lib: mpathlibs
32243b43a40SPaolo Bonzini    if not lib.found()
32343b43a40SPaolo Bonzini      mpathlibs = []
32443b43a40SPaolo Bonzini      break
32543b43a40SPaolo Bonzini    endif
32643b43a40SPaolo Bonzini  endforeach
32743b43a40SPaolo Bonzini  if mpathlibs.length() > 0
3286ec0e15dSPaolo Bonzini    if cc.links(mpath_test_source_new, dependencies: mpathlibs)
3296ec0e15dSPaolo Bonzini      mpathpersist = declare_dependency(dependencies: mpathlibs)
3306ec0e15dSPaolo Bonzini      mpathpersist_new_api = true
3316ec0e15dSPaolo Bonzini    elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
3326ec0e15dSPaolo Bonzini      mpathpersist = declare_dependency(dependencies: mpathlibs)
3336ec0e15dSPaolo Bonzini    else
3346ec0e15dSPaolo Bonzini      if get_option('mpath').enabled()
3356ec0e15dSPaolo Bonzini        error('Cannot detect libmpathpersist API')
3366ec0e15dSPaolo Bonzini      else
3376ec0e15dSPaolo Bonzini        warning('Cannot detect libmpathpersist API, disabling')
3386ec0e15dSPaolo Bonzini      endif
3396ec0e15dSPaolo Bonzini    endif
3406ec0e15dSPaolo Bonzini  endif
3416ec0e15dSPaolo Bonziniendif
3426ec0e15dSPaolo Bonzini
3432634733cSPaolo Bonzinibrlapi = not_found
3442634733cSPaolo Bonziniif 'CONFIG_BRLAPI' in config_host
3452634733cSPaolo Bonzini  brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
3462634733cSPaolo Bonziniendif
34735be72baSPaolo Bonzini
348760e4327SPaolo Bonzinisdl = not_found
349760e4327SPaolo Bonziniif have_system
350363743daSYonggang Luo  sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
35135be72baSPaolo Bonzini  sdl_image = not_found
352760e4327SPaolo Bonziniendif
35335be72baSPaolo Bonziniif sdl.found()
35435be72baSPaolo Bonzini  # work around 2.0.8 bug
35535be72baSPaolo Bonzini  sdl = declare_dependency(compile_args: '-Wno-undef',
35635be72baSPaolo Bonzini                           dependencies: sdl)
3577161a433SVolker Rümelin  sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
3581a94933fSPaolo Bonzini                         method: 'pkg-config', static: enable_static)
35935be72baSPaolo Bonzinielse
36035be72baSPaolo Bonzini  if get_option('sdl_image').enabled()
361a8dc2aceSSergei Trofimovich    error('sdl-image required, but SDL was @0@'.format(
362a8dc2aceSSergei Trofimovich          get_option('sdl').disabled() ? 'disabled' : 'not found'))
3632634733cSPaolo Bonzini  endif
36435be72baSPaolo Bonzini  sdl_image = not_found
36535be72baSPaolo Bonziniendif
36635be72baSPaolo Bonzini
3675e5733e5SMarc-André Lureaurbd = not_found
3685e5733e5SMarc-André Lureauif 'CONFIG_RBD' in config_host
3695e5733e5SMarc-André Lureau  rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
3705e5733e5SMarc-André Lureauendif
3715e5733e5SMarc-André Lureauglusterfs = not_found
3725e5733e5SMarc-André Lureauif 'CONFIG_GLUSTERFS' in config_host
3735e5733e5SMarc-André Lureau  glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
3745e5733e5SMarc-André Lureau                                 link_args: config_host['GLUSTERFS_LIBS'].split())
3755e5733e5SMarc-André Lureauendif
3765e5733e5SMarc-André Lureaulibssh = not_found
3775e5733e5SMarc-André Lureauif 'CONFIG_LIBSSH' in config_host
3785e5733e5SMarc-André Lureau  libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
3795e5733e5SMarc-André Lureau                              link_args: config_host['LIBSSH_LIBS'].split())
3805e5733e5SMarc-André Lureauendif
3815e5733e5SMarc-André Lureaulibbzip2 = not_found
3825e5733e5SMarc-André Lureauif 'CONFIG_BZIP2' in config_host
3835e5733e5SMarc-André Lureau  libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
3845e5733e5SMarc-André Lureauendif
3855e5733e5SMarc-André Lureauliblzfse = not_found
3865e5733e5SMarc-André Lureauif 'CONFIG_LZFSE' in config_host
3875e5733e5SMarc-André Lureau  liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
3885e5733e5SMarc-André Lureauendif
389478e943fSPaolo Bonzinioss = not_found
390478e943fSPaolo Bonziniif 'CONFIG_AUDIO_OSS' in config_host
391478e943fSPaolo Bonzini  oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
392478e943fSPaolo Bonziniendif
393478e943fSPaolo Bonzinidsound = not_found
394478e943fSPaolo Bonziniif 'CONFIG_AUDIO_DSOUND' in config_host
395478e943fSPaolo Bonzini  dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
396478e943fSPaolo Bonziniendif
397478e943fSPaolo Bonzinicoreaudio = not_found
398478e943fSPaolo Bonziniif 'CONFIG_AUDIO_COREAUDIO' in config_host
399478e943fSPaolo Bonzini  coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
400478e943fSPaolo Bonziniendif
4012b1ccdf4SMarc-André Lureauopengl = not_found
4022b1ccdf4SMarc-André Lureauif 'CONFIG_OPENGL' in config_host
403de2d3005SPaolo Bonzini  opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
404de2d3005SPaolo Bonzini                              link_args: config_host['OPENGL_LIBS'].split())
4052b1ccdf4SMarc-André Lureauendif
4062b1ccdf4SMarc-André Lureaugtk = not_found
4072b1ccdf4SMarc-André Lureauif 'CONFIG_GTK' in config_host
4082b1ccdf4SMarc-André Lureau  gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
4092b1ccdf4SMarc-André Lureau                              link_args: config_host['GTK_LIBS'].split())
4102b1ccdf4SMarc-André Lureauendif
4112b1ccdf4SMarc-André Lureauvte = not_found
4122b1ccdf4SMarc-André Lureauif 'CONFIG_VTE' in config_host
4132b1ccdf4SMarc-André Lureau  vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
4142b1ccdf4SMarc-André Lureau                           link_args: config_host['VTE_LIBS'].split())
4152b1ccdf4SMarc-André Lureauendif
4162b1ccdf4SMarc-André Lureaux11 = not_found
4172b1ccdf4SMarc-André Lureauif 'CONFIG_X11' in config_host
4182b1ccdf4SMarc-André Lureau  x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
4192b1ccdf4SMarc-André Lureau                           link_args: config_host['X11_LIBS'].split())
4202b1ccdf4SMarc-André Lureauendif
4212b1ccdf4SMarc-André Lureaucurses = not_found
4222b1ccdf4SMarc-André Lureauif 'CONFIG_CURSES' in config_host
4232b1ccdf4SMarc-André Lureau  curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
4242b1ccdf4SMarc-André Lureau                              link_args: config_host['CURSES_LIBS'].split())
4252b1ccdf4SMarc-André Lureauendif
4262b1ccdf4SMarc-André Lureauiconv = not_found
4272b1ccdf4SMarc-André Lureauif 'CONFIG_ICONV' in config_host
4282b1ccdf4SMarc-André Lureau  iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
4292b1ccdf4SMarc-André Lureau                             link_args: config_host['ICONV_LIBS'].split())
4302b1ccdf4SMarc-André Lureauendif
431a0b93237SPaolo Bonzinivnc = not_found
4322b1ccdf4SMarc-André Lureaupng = not_found
4332b1ccdf4SMarc-André Lureaujpeg = not_found
4342b1ccdf4SMarc-André Lureausasl = not_found
435a0b93237SPaolo Bonziniif get_option('vnc').enabled()
436a0b93237SPaolo Bonzini  vnc = declare_dependency() # dummy dependency
437a0b93237SPaolo Bonzini  png = dependency('libpng', required: get_option('vnc_png'),
4381a94933fSPaolo Bonzini                   method: 'pkg-config', static: enable_static)
439a0b93237SPaolo Bonzini  jpeg = cc.find_library('jpeg', has_headers: ['jpeglib.h'],
440a0b93237SPaolo Bonzini                         required: get_option('vnc_jpeg'),
441a0b93237SPaolo Bonzini                         static: enable_static)
442a0b93237SPaolo Bonzini  sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
443a0b93237SPaolo Bonzini                         required: get_option('vnc_sasl'),
444a0b93237SPaolo Bonzini                         static: enable_static)
445a0b93237SPaolo Bonzini  if sasl.found()
446a0b93237SPaolo Bonzini    sasl = declare_dependency(dependencies: sasl,
447a0b93237SPaolo Bonzini                              compile_args: '-DSTRUCT_IOVEC_DEFINED')
448a0b93237SPaolo Bonzini  endif
4492b1ccdf4SMarc-André Lureauendif
4504a96337dSPaolo Bonzinifdt = not_found
4514a96337dSPaolo Bonziniif 'CONFIG_FDT' in config_host
4524a96337dSPaolo Bonzini  fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
4534a96337dSPaolo Bonzini                           link_args: config_host['FDT_LIBS'].split())
4544a96337dSPaolo Bonziniendif
455708eab42SMarc-André Lureausnappy = not_found
456708eab42SMarc-André Lureauif 'CONFIG_SNAPPY' in config_host
457708eab42SMarc-André Lureau  snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
458708eab42SMarc-André Lureauendif
459708eab42SMarc-André Lureaulzo = not_found
460708eab42SMarc-André Lureauif 'CONFIG_LZO' in config_host
461708eab42SMarc-André Lureau  lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
462708eab42SMarc-André Lureauendif
46355166230SMarc-André Lureaurdma = not_found
46455166230SMarc-André Lureauif 'CONFIG_RDMA' in config_host
46555166230SMarc-André Lureau  rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
46655166230SMarc-André Lureauendif
467ab318051SMarc-André Lureaunuma = not_found
468ab318051SMarc-André Lureauif 'CONFIG_NUMA' in config_host
469ab318051SMarc-André Lureau  numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
470ab318051SMarc-André Lureauendif
471582ea95fSMarc-André Lureauxen = not_found
472582ea95fSMarc-André Lureauif 'CONFIG_XEN_BACKEND' in config_host
473582ea95fSMarc-André Lureau  xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
474582ea95fSMarc-André Lureau                           link_args: config_host['XEN_LIBS'].split())
475582ea95fSMarc-André Lureauendif
47606677ce1SPaolo Bonzinicacard = not_found
47706677ce1SPaolo Bonziniif 'CONFIG_SMARTCARD' in config_host
47806677ce1SPaolo Bonzini  cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
47906677ce1SPaolo Bonzini                              link_args: config_host['SMARTCARD_LIBS'].split())
48006677ce1SPaolo Bonziniendif
4810a40bcb7SCésar Belleyu2f = not_found
4820a40bcb7SCésar Belleyif have_system
4830a40bcb7SCésar Belley  u2f = dependency('u2f-emu', required: get_option('u2f'),
4840a40bcb7SCésar Belley                   method: 'pkg-config',
4850a40bcb7SCésar Belley                   static: enable_static)
4860a40bcb7SCésar Belleyendif
48706677ce1SPaolo Bonziniusbredir = not_found
48806677ce1SPaolo Bonziniif 'CONFIG_USB_REDIR' in config_host
48906677ce1SPaolo Bonzini  usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
49006677ce1SPaolo Bonzini                                link_args: config_host['USB_REDIR_LIBS'].split())
49106677ce1SPaolo Bonziniendif
49206677ce1SPaolo Bonzinilibusb = not_found
49306677ce1SPaolo Bonziniif 'CONFIG_USB_LIBUSB' in config_host
49406677ce1SPaolo Bonzini  libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
49506677ce1SPaolo Bonzini                              link_args: config_host['LIBUSB_LIBS'].split())
49606677ce1SPaolo Bonziniendif
497c9322ab5SMarc-André Lureaucapstone = not_found
498c9322ab5SMarc-André Lureauif 'CONFIG_CAPSTONE' in config_host
499c9322ab5SMarc-André Lureau  capstone = declare_dependency(compile_args: config_host['CAPSTONE_CFLAGS'].split(),
500c9322ab5SMarc-André Lureau                                link_args: config_host['CAPSTONE_LIBS'].split())
501c9322ab5SMarc-André Lureauendif
502c9322ab5SMarc-André Lureaulibpmem = not_found
503c9322ab5SMarc-André Lureauif 'CONFIG_LIBPMEM' in config_host
504c9322ab5SMarc-André Lureau  libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
505c9322ab5SMarc-André Lureau                               link_args: config_host['LIBPMEM_LIBS'].split())
506c9322ab5SMarc-André Lureauendif
507c7c91a74SBruce Rogerslibdaxctl = not_found
508c7c91a74SBruce Rogersif 'CONFIG_LIBDAXCTL' in config_host
509c7c91a74SBruce Rogers  libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
510c7c91a74SBruce Rogersendif
5118ce0a45fSMarc-André Lureautasn1 = not_found
5128ce0a45fSMarc-André Lureauif 'CONFIG_TASN1' in config_host
5138ce0a45fSMarc-André Lureau  tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
5148ce0a45fSMarc-André Lureau                             link_args: config_host['TASN1_LIBS'].split())
5158ce0a45fSMarc-André Lureauendif
516af04e89dSMarc-André Lureaukeyutils = dependency('libkeyutils', required: false,
517af04e89dSMarc-André Lureau                      method: 'pkg-config', static: enable_static)
518a81df1b6SPaolo Bonzini
5193909def8SMarc-André Lureauhas_gettid = cc.has_function('gettid')
5203909def8SMarc-André Lureau
521aa087962SPaolo Bonzini# Malloc tests
522aa087962SPaolo Bonzini
523aa087962SPaolo Bonzinimalloc = []
524aa087962SPaolo Bonziniif get_option('malloc') == 'system'
525aa087962SPaolo Bonzini  has_malloc_trim = \
526aa087962SPaolo Bonzini    not get_option('malloc_trim').disabled() and \
527aa087962SPaolo Bonzini    cc.links('''#include <malloc.h>
528aa087962SPaolo Bonzini                int main(void) { malloc_trim(0); return 0; }''')
529aa087962SPaolo Bonzinielse
530aa087962SPaolo Bonzini  has_malloc_trim = false
531aa087962SPaolo Bonzini  malloc = cc.find_library(get_option('malloc'), required: true)
532aa087962SPaolo Bonziniendif
533aa087962SPaolo Bonziniif not has_malloc_trim and get_option('malloc_trim').enabled()
534aa087962SPaolo Bonzini  if get_option('malloc') == 'system'
535aa087962SPaolo Bonzini    error('malloc_trim not available on this platform.')
536aa087962SPaolo Bonzini  else
537aa087962SPaolo Bonzini    error('malloc_trim not available with non-libc memory allocator')
538aa087962SPaolo Bonzini  endif
539aa087962SPaolo Bonziniendif
540aa087962SPaolo Bonzini
541859aef02SPaolo Bonzini# Create config-host.h
542859aef02SPaolo Bonzini
543*b4e312e9SPaolo Bonziniconfig_host_data.set('CONFIG_COCOA', cocoa.found())
544f01496a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBUDEV', libudev.found())
5456ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH', mpathpersist.found())
5466ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
54735be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL', sdl.found())
54835be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
549a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC', vnc.found())
550a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
551a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_PNG', png.found())
552a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_SASL', sasl.found())
5534113f4cfSLaurent Vivierconfig_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
554af04e89dSMarc-André Lureauconfig_host_data.set('CONFIG_KEYUTILS', keyutils.found())
5553909def8SMarc-André Lureauconfig_host_data.set('CONFIG_GETTID', has_gettid)
556aa087962SPaolo Bonziniconfig_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
557859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
558859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
559859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
560859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
561859aef02SPaolo Bonzini
562859aef02SPaolo Bonziniarrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
563859aef02SPaolo Bonzinistrings = ['HOST_DSOSUF', 'CONFIG_IASL', 'qemu_confdir', 'qemu_datadir',
564859aef02SPaolo Bonzini           'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
565859aef02SPaolo Bonzini           'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath']
566859aef02SPaolo Bonziniforeach k, v: config_host
567859aef02SPaolo Bonzini  if arrays.contains(k)
568859aef02SPaolo Bonzini    if v != ''
569859aef02SPaolo Bonzini      v = '"' + '", "'.join(v.split()) + '", '
570859aef02SPaolo Bonzini    endif
571859aef02SPaolo Bonzini    config_host_data.set(k, v)
572859aef02SPaolo Bonzini  elif k == 'ARCH'
573859aef02SPaolo Bonzini    config_host_data.set('HOST_' + v.to_upper(), 1)
574859aef02SPaolo Bonzini  elif strings.contains(k)
575859aef02SPaolo Bonzini    if not k.startswith('CONFIG_')
576859aef02SPaolo Bonzini      k = 'CONFIG_' + k.to_upper()
577859aef02SPaolo Bonzini    endif
578859aef02SPaolo Bonzini    config_host_data.set_quoted(k, v)
579859aef02SPaolo Bonzini  elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
580859aef02SPaolo Bonzini    config_host_data.set(k, v == 'y' ? 1 : v)
581859aef02SPaolo Bonzini  endif
582859aef02SPaolo Bonziniendforeach
583859aef02SPaolo Bonzinigenh += configure_file(output: 'config-host.h', configuration: config_host_data)
584859aef02SPaolo Bonzini
5852becc36aSPaolo Bonziniminikconf = find_program('scripts/minikconf.py')
586a98006bcSPaolo Bonziniconfig_all_devices = {}
587ca0fc784SPaolo Bonziniconfig_all_disas = {}
5882becc36aSPaolo Bonziniconfig_devices_mak_list = []
5892becc36aSPaolo Bonziniconfig_devices_h = {}
590859aef02SPaolo Bonziniconfig_target_h = {}
5912becc36aSPaolo Bonziniconfig_target_mak = {}
592ca0fc784SPaolo Bonzini
593ca0fc784SPaolo Bonzinidisassemblers = {
594ca0fc784SPaolo Bonzini  'alpha' : ['CONFIG_ALPHA_DIS'],
595ca0fc784SPaolo Bonzini  'arm' : ['CONFIG_ARM_DIS'],
596ca0fc784SPaolo Bonzini  'avr' : ['CONFIG_AVR_DIS'],
597ca0fc784SPaolo Bonzini  'cris' : ['CONFIG_CRIS_DIS'],
598ca0fc784SPaolo Bonzini  'hppa' : ['CONFIG_HPPA_DIS'],
599ca0fc784SPaolo Bonzini  'i386' : ['CONFIG_I386_DIS'],
600ca0fc784SPaolo Bonzini  'x86_64' : ['CONFIG_I386_DIS'],
601ca0fc784SPaolo Bonzini  'x32' : ['CONFIG_I386_DIS'],
602ca0fc784SPaolo Bonzini  'lm32' : ['CONFIG_LM32_DIS'],
603ca0fc784SPaolo Bonzini  'm68k' : ['CONFIG_M68K_DIS'],
604ca0fc784SPaolo Bonzini  'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
605ca0fc784SPaolo Bonzini  'mips' : ['CONFIG_MIPS_DIS'],
606ca0fc784SPaolo Bonzini  'moxie' : ['CONFIG_MOXIE_DIS'],
607ca0fc784SPaolo Bonzini  'nios2' : ['CONFIG_NIOS2_DIS'],
608ca0fc784SPaolo Bonzini  'or1k' : ['CONFIG_OPENRISC_DIS'],
609ca0fc784SPaolo Bonzini  'ppc' : ['CONFIG_PPC_DIS'],
610ca0fc784SPaolo Bonzini  'riscv' : ['CONFIG_RISCV_DIS'],
611ca0fc784SPaolo Bonzini  'rx' : ['CONFIG_RX_DIS'],
612ca0fc784SPaolo Bonzini  's390' : ['CONFIG_S390_DIS'],
613ca0fc784SPaolo Bonzini  'sh4' : ['CONFIG_SH4_DIS'],
614ca0fc784SPaolo Bonzini  'sparc' : ['CONFIG_SPARC_DIS'],
615ca0fc784SPaolo Bonzini  'xtensa' : ['CONFIG_XTENSA_DIS'],
616ca0fc784SPaolo Bonzini}
617ca0fc784SPaolo Bonziniif link_language == 'cpp'
618ca0fc784SPaolo Bonzini  disassemblers += {
619ca0fc784SPaolo Bonzini    'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
620ca0fc784SPaolo Bonzini    'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
621ca0fc784SPaolo Bonzini    'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
622ca0fc784SPaolo Bonzini  }
623ca0fc784SPaolo Bonziniendif
624ca0fc784SPaolo Bonzini
6252becc36aSPaolo Bonzinikconfig_external_symbols = [
6262becc36aSPaolo Bonzini  'CONFIG_KVM',
6272becc36aSPaolo Bonzini  'CONFIG_XEN',
6282becc36aSPaolo Bonzini  'CONFIG_TPM',
6292becc36aSPaolo Bonzini  'CONFIG_SPICE',
6302becc36aSPaolo Bonzini  'CONFIG_IVSHMEM',
6312becc36aSPaolo Bonzini  'CONFIG_OPENGL',
6322becc36aSPaolo Bonzini  'CONFIG_X11',
6332becc36aSPaolo Bonzini  'CONFIG_VHOST_USER',
63440bc0ca9SLaurent Vivier  'CONFIG_VHOST_VDPA',
6352becc36aSPaolo Bonzini  'CONFIG_VHOST_KERNEL',
6362becc36aSPaolo Bonzini  'CONFIG_VIRTFS',
6372becc36aSPaolo Bonzini  'CONFIG_LINUX',
6382becc36aSPaolo Bonzini  'CONFIG_PVRDMA',
6392becc36aSPaolo Bonzini]
640859aef02SPaolo Bonziniignored = ['TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_DIRS']
641ca0fc784SPaolo Bonzini
642a81df1b6SPaolo Bonziniforeach target : target_dirs
643859aef02SPaolo Bonzini  config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak')
644859aef02SPaolo Bonzini
645ca0fc784SPaolo Bonzini  foreach k, v: disassemblers
646ca0fc784SPaolo Bonzini    if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
647ca0fc784SPaolo Bonzini      foreach sym: v
648ca0fc784SPaolo Bonzini        config_target += { sym: 'y' }
649ca0fc784SPaolo Bonzini        config_all_disas += { sym: 'y' }
650ca0fc784SPaolo Bonzini      endforeach
651ca0fc784SPaolo Bonzini    endif
652ca0fc784SPaolo Bonzini  endforeach
653ca0fc784SPaolo Bonzini
654859aef02SPaolo Bonzini  config_target_data = configuration_data()
655859aef02SPaolo Bonzini  foreach k, v: config_target
656859aef02SPaolo Bonzini    if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
657859aef02SPaolo Bonzini      # do nothing
658859aef02SPaolo Bonzini    elif ignored.contains(k)
659859aef02SPaolo Bonzini      # do nothing
660859aef02SPaolo Bonzini    elif k == 'TARGET_BASE_ARCH'
661859aef02SPaolo Bonzini      config_target_data.set('TARGET_' + v.to_upper(), 1)
662859aef02SPaolo Bonzini    elif k == 'TARGET_NAME'
663859aef02SPaolo Bonzini      config_target_data.set_quoted(k, v)
664859aef02SPaolo Bonzini    elif v == 'y'
665859aef02SPaolo Bonzini      config_target_data.set(k, 1)
666859aef02SPaolo Bonzini    else
667859aef02SPaolo Bonzini      config_target_data.set(k, v)
668859aef02SPaolo Bonzini    endif
669859aef02SPaolo Bonzini  endforeach
670859aef02SPaolo Bonzini  config_target_h += {target: configure_file(output: target + '-config-target.h',
671859aef02SPaolo Bonzini                                               configuration: config_target_data)}
6722becc36aSPaolo Bonzini
6732becc36aSPaolo Bonzini  if target.endswith('-softmmu')
6742becc36aSPaolo Bonzini    base_kconfig = []
6752becc36aSPaolo Bonzini    foreach sym : kconfig_external_symbols
676859aef02SPaolo Bonzini      if sym in config_target or sym in config_host
6772becc36aSPaolo Bonzini        base_kconfig += '@0@=y'.format(sym)
6782becc36aSPaolo Bonzini      endif
6792becc36aSPaolo Bonzini    endforeach
6802becc36aSPaolo Bonzini
6812becc36aSPaolo Bonzini    config_devices_mak = target + '-config-devices.mak'
6822becc36aSPaolo Bonzini    config_devices_mak = configure_file(
6832becc36aSPaolo Bonzini      input: ['default-configs' / target + '.mak', 'Kconfig'],
6842becc36aSPaolo Bonzini      output: config_devices_mak,
6852becc36aSPaolo Bonzini      depfile: config_devices_mak + '.d',
6862becc36aSPaolo Bonzini      capture: true,
6872becc36aSPaolo Bonzini      command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
6882becc36aSPaolo Bonzini                config_devices_mak, '@DEPFILE@', '@INPUT@',
6892becc36aSPaolo Bonzini                base_kconfig])
690859aef02SPaolo Bonzini
691859aef02SPaolo Bonzini    config_devices_data = configuration_data()
692859aef02SPaolo Bonzini    config_devices = keyval.load(config_devices_mak)
693859aef02SPaolo Bonzini    foreach k, v: config_devices
694859aef02SPaolo Bonzini      config_devices_data.set(k, 1)
695859aef02SPaolo Bonzini    endforeach
6962becc36aSPaolo Bonzini    config_devices_mak_list += config_devices_mak
697859aef02SPaolo Bonzini    config_devices_h += {target: configure_file(output: target + '-config-devices.h',
698859aef02SPaolo Bonzini                                                configuration: config_devices_data)}
699859aef02SPaolo Bonzini    config_target += config_devices
700a98006bcSPaolo Bonzini    config_all_devices += config_devices
7012becc36aSPaolo Bonzini  endif
7022becc36aSPaolo Bonzini  config_target_mak += {target: config_target}
703a81df1b6SPaolo Bonziniendforeach
704a81df1b6SPaolo Bonzini
7052becc36aSPaolo Bonzini# This configuration is used to build files that are shared by
7062becc36aSPaolo Bonzini# multiple binaries, and then extracted out of the "common"
7072becc36aSPaolo Bonzini# static_library target.
7082becc36aSPaolo Bonzini#
7092becc36aSPaolo Bonzini# We do not use all_sources()/all_dependencies(), because it would
7102becc36aSPaolo Bonzini# build literally all source files, including devices only used by
7112becc36aSPaolo Bonzini# targets that are not built for this compilation.  The CONFIG_ALL
7122becc36aSPaolo Bonzini# pseudo symbol replaces it.
7132becc36aSPaolo Bonzini
7142becc36aSPaolo Bonziniconfig_all = config_all_devices
7152becc36aSPaolo Bonziniconfig_all += config_host
7162becc36aSPaolo Bonziniconfig_all += config_all_disas
7172becc36aSPaolo Bonziniconfig_all += {
7182becc36aSPaolo Bonzini  'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
7192becc36aSPaolo Bonzini  'CONFIG_SOFTMMU': have_system,
7202becc36aSPaolo Bonzini  'CONFIG_USER_ONLY': have_user,
7212becc36aSPaolo Bonzini  'CONFIG_ALL': true,
7222becc36aSPaolo Bonzini}
7232becc36aSPaolo Bonzini
724a81df1b6SPaolo Bonzini# Generators
725a81df1b6SPaolo Bonzini
7263f885659SMarc-André Lureauhxtool = find_program('scripts/hxtool')
727650b5d54SMarc-André Lureaushaderinclude = find_program('scripts/shaderinclude.pl')
728a81df1b6SPaolo Bonziniqapi_gen = find_program('scripts/qapi-gen.py')
729a81df1b6SPaolo Bonziniqapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
730a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/commands.py',
731a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/common.py',
732a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/error.py',
733a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/events.py',
734a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/expr.py',
735a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/gen.py',
736a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/introspect.py',
737a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/parser.py',
738a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/schema.py',
739a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/source.py',
740a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/types.py',
741a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/visit.py',
742a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/common.py',
743a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi-gen.py'
744a81df1b6SPaolo Bonzini]
745a81df1b6SPaolo Bonzini
746a81df1b6SPaolo Bonzinitracetool = [
747a81df1b6SPaolo Bonzini  python, files('scripts/tracetool.py'),
748a81df1b6SPaolo Bonzini   '--backend=' + config_host['TRACE_BACKENDS']
749a81df1b6SPaolo Bonzini]
750a81df1b6SPaolo Bonzini
7512c273f32SMarc-André Lureauqemu_version_cmd = [find_program('scripts/qemu-version.sh'),
7522c273f32SMarc-André Lureau                    meson.current_source_dir(),
753859aef02SPaolo Bonzini                    config_host['PKGVERSION'], meson.project_version()]
7542c273f32SMarc-André Lureauqemu_version = custom_target('qemu-version.h',
7552c273f32SMarc-André Lureau                             output: 'qemu-version.h',
7562c273f32SMarc-André Lureau                             command: qemu_version_cmd,
7572c273f32SMarc-André Lureau                             capture: true,
7582c273f32SMarc-André Lureau                             build_by_default: true,
7592c273f32SMarc-André Lureau                             build_always_stale: true)
7602c273f32SMarc-André Lureaugenh += qemu_version
7612c273f32SMarc-André Lureau
7623f885659SMarc-André Lureauhxdep = []
7633f885659SMarc-André Lureauhx_headers = [
7643f885659SMarc-André Lureau  ['qemu-options.hx', 'qemu-options.def'],
7653f885659SMarc-André Lureau  ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
7663f885659SMarc-André Lureau]
7673f885659SMarc-André Lureauif have_system
7683f885659SMarc-André Lureau  hx_headers += [
7693f885659SMarc-André Lureau    ['hmp-commands.hx', 'hmp-commands.h'],
7703f885659SMarc-André Lureau    ['hmp-commands-info.hx', 'hmp-commands-info.h'],
7713f885659SMarc-André Lureau  ]
7723f885659SMarc-André Lureauendif
7733f885659SMarc-André Lureauforeach d : hx_headers
774b7c70bf2SMarc-André Lureau  hxdep += custom_target(d[1],
7753f885659SMarc-André Lureau                input: files(d[0]),
7763f885659SMarc-André Lureau                output: d[1],
7773f885659SMarc-André Lureau                capture: true,
7783f885659SMarc-André Lureau                build_by_default: true, # to be removed when added to a target
7793f885659SMarc-André Lureau                command: [hxtool, '-h', '@INPUT0@'])
7803f885659SMarc-André Lureauendforeach
7813f885659SMarc-André Lureaugenh += hxdep
7823f885659SMarc-André Lureau
783eb937365SPeter MaydellSPHINX_ARGS = [config_host['SPHINX_BUILD'],
784eb937365SPeter Maydell               '-Dversion=' + meson.project_version(),
785eb937365SPeter Maydell               '-Drelease=' + config_host['PKGVERSION']]
786eb937365SPeter Maydell
787eb937365SPeter Maydellif get_option('werror')
788eb937365SPeter Maydell  SPHINX_ARGS += [ '-W' ]
789eb937365SPeter Maydellendif
790eb937365SPeter Maydell
791b3f4830aSPeter Maydellsphinx_extn_depends = [ meson.source_root() / 'docs/sphinx/depfile.py',
792b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/hxtool.py',
793b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/kerneldoc.py',
794b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/kernellog.py',
795b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/qapidoc.py',
796b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/qmp_lexer.py',
797b3f4830aSPeter Maydell                        qapi_gen_depends ]
798b3f4830aSPeter Maydell
799a81df1b6SPaolo Bonzini# Collect sourcesets.
800a81df1b6SPaolo Bonzini
801a81df1b6SPaolo Bonziniutil_ss = ss.source_set()
802a81df1b6SPaolo Bonzinistub_ss = ss.source_set()
803a81df1b6SPaolo Bonzinitrace_ss = ss.source_set()
8043154fee4SMarc-André Lureaublock_ss = ss.source_set()
8054a96337dSPaolo Bonziniblockdev_ss = ss.source_set()
806ff219dcaSPaolo Bonziniqmp_ss = ss.source_set()
8072becc36aSPaolo Bonzinicommon_ss = ss.source_set()
8082becc36aSPaolo Bonzinisoftmmu_ss = ss.source_set()
8092becc36aSPaolo Bonziniuser_ss = ss.source_set()
8102becc36aSPaolo Bonzinibsd_user_ss = ss.source_set()
8112becc36aSPaolo Bonzinilinux_user_ss = ss.source_set()
8122becc36aSPaolo Bonzinispecific_ss = ss.source_set()
81364ed6f92SPaolo Bonzinispecific_fuzz_ss = ss.source_set()
8142becc36aSPaolo Bonzini
8153154fee4SMarc-André Lureaumodules = {}
8162becc36aSPaolo Bonzinihw_arch = {}
8172becc36aSPaolo Bonzinitarget_arch = {}
8182becc36aSPaolo Bonzinitarget_softmmu_arch = {}
819a81df1b6SPaolo Bonzini
820a81df1b6SPaolo Bonzini###############
821a81df1b6SPaolo Bonzini# Trace files #
822a81df1b6SPaolo Bonzini###############
823a81df1b6SPaolo Bonzini
824c9322ab5SMarc-André Lureau# TODO: add each directory to the subdirs from its own meson.build, once
825c9322ab5SMarc-André Lureau# we have those
826a81df1b6SPaolo Bonzinitrace_events_subdirs = [
827a81df1b6SPaolo Bonzini  'accel/kvm',
828a81df1b6SPaolo Bonzini  'accel/tcg',
829a81df1b6SPaolo Bonzini  'crypto',
830a81df1b6SPaolo Bonzini  'monitor',
831a81df1b6SPaolo Bonzini]
832a81df1b6SPaolo Bonziniif have_user
833a81df1b6SPaolo Bonzini  trace_events_subdirs += [ 'linux-user' ]
834a81df1b6SPaolo Bonziniendif
835a81df1b6SPaolo Bonziniif have_block
836a81df1b6SPaolo Bonzini  trace_events_subdirs += [
837a81df1b6SPaolo Bonzini    'authz',
838a81df1b6SPaolo Bonzini    'block',
839a81df1b6SPaolo Bonzini    'io',
840a81df1b6SPaolo Bonzini    'nbd',
841a81df1b6SPaolo Bonzini    'scsi',
842a81df1b6SPaolo Bonzini  ]
843a81df1b6SPaolo Bonziniendif
844a81df1b6SPaolo Bonziniif have_system
845a81df1b6SPaolo Bonzini  trace_events_subdirs += [
846a81df1b6SPaolo Bonzini    'audio',
847a81df1b6SPaolo Bonzini    'backends',
848a81df1b6SPaolo Bonzini    'backends/tpm',
849a81df1b6SPaolo Bonzini    'chardev',
850a81df1b6SPaolo Bonzini    'hw/9pfs',
851a81df1b6SPaolo Bonzini    'hw/acpi',
852a81df1b6SPaolo Bonzini    'hw/alpha',
853a81df1b6SPaolo Bonzini    'hw/arm',
854a81df1b6SPaolo Bonzini    'hw/audio',
855a81df1b6SPaolo Bonzini    'hw/block',
856a81df1b6SPaolo Bonzini    'hw/block/dataplane',
857a81df1b6SPaolo Bonzini    'hw/char',
858a81df1b6SPaolo Bonzini    'hw/display',
859a81df1b6SPaolo Bonzini    'hw/dma',
860a81df1b6SPaolo Bonzini    'hw/hppa',
861a81df1b6SPaolo Bonzini    'hw/hyperv',
862a81df1b6SPaolo Bonzini    'hw/i2c',
863a81df1b6SPaolo Bonzini    'hw/i386',
864a81df1b6SPaolo Bonzini    'hw/i386/xen',
865a81df1b6SPaolo Bonzini    'hw/ide',
866a81df1b6SPaolo Bonzini    'hw/input',
867a81df1b6SPaolo Bonzini    'hw/intc',
868a81df1b6SPaolo Bonzini    'hw/isa',
869a81df1b6SPaolo Bonzini    'hw/mem',
870a81df1b6SPaolo Bonzini    'hw/mips',
871a81df1b6SPaolo Bonzini    'hw/misc',
872a81df1b6SPaolo Bonzini    'hw/misc/macio',
873a81df1b6SPaolo Bonzini    'hw/net',
874a81df1b6SPaolo Bonzini    'hw/nvram',
875a81df1b6SPaolo Bonzini    'hw/pci',
876a81df1b6SPaolo Bonzini    'hw/pci-host',
877a81df1b6SPaolo Bonzini    'hw/ppc',
878a81df1b6SPaolo Bonzini    'hw/rdma',
879a81df1b6SPaolo Bonzini    'hw/rdma/vmw',
880a81df1b6SPaolo Bonzini    'hw/rtc',
881a81df1b6SPaolo Bonzini    'hw/s390x',
882a81df1b6SPaolo Bonzini    'hw/scsi',
883a81df1b6SPaolo Bonzini    'hw/sd',
884a81df1b6SPaolo Bonzini    'hw/sparc',
885a81df1b6SPaolo Bonzini    'hw/sparc64',
886a81df1b6SPaolo Bonzini    'hw/ssi',
887a81df1b6SPaolo Bonzini    'hw/timer',
888a81df1b6SPaolo Bonzini    'hw/tpm',
889a81df1b6SPaolo Bonzini    'hw/usb',
890a81df1b6SPaolo Bonzini    'hw/vfio',
891a81df1b6SPaolo Bonzini    'hw/virtio',
892a81df1b6SPaolo Bonzini    'hw/watchdog',
893a81df1b6SPaolo Bonzini    'hw/xen',
894a81df1b6SPaolo Bonzini    'hw/gpio',
895a81df1b6SPaolo Bonzini    'migration',
896a81df1b6SPaolo Bonzini    'net',
8978b7a5507SPhilippe Mathieu-Daudé    'softmmu',
898a81df1b6SPaolo Bonzini    'ui',
899a81df1b6SPaolo Bonzini  ]
900a81df1b6SPaolo Bonziniendif
901a81df1b6SPaolo Bonzinitrace_events_subdirs += [
902a81df1b6SPaolo Bonzini  'hw/core',
903a81df1b6SPaolo Bonzini  'qapi',
904a81df1b6SPaolo Bonzini  'qom',
905a81df1b6SPaolo Bonzini  'target/arm',
906a81df1b6SPaolo Bonzini  'target/hppa',
907a81df1b6SPaolo Bonzini  'target/i386',
908a81df1b6SPaolo Bonzini  'target/mips',
909a81df1b6SPaolo Bonzini  'target/ppc',
910a81df1b6SPaolo Bonzini  'target/riscv',
911a81df1b6SPaolo Bonzini  'target/s390x',
912a81df1b6SPaolo Bonzini  'target/sparc',
913a81df1b6SPaolo Bonzini  'util',
914a81df1b6SPaolo Bonzini]
915a81df1b6SPaolo Bonzini
916a81df1b6SPaolo Bonzinisubdir('qapi')
917a81df1b6SPaolo Bonzinisubdir('qobject')
918a81df1b6SPaolo Bonzinisubdir('stubs')
919a81df1b6SPaolo Bonzinisubdir('trace')
920a81df1b6SPaolo Bonzinisubdir('util')
9215582c58fSMarc-André Lureausubdir('qom')
9225582c58fSMarc-André Lureausubdir('authz')
923a81df1b6SPaolo Bonzinisubdir('crypto')
9242d78b56eSMarc-André Lureausubdir('ui')
925a81df1b6SPaolo Bonzini
9263154fee4SMarc-André Lureau
9273154fee4SMarc-André Lureauif enable_modules
9283154fee4SMarc-André Lureau  libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
9293154fee4SMarc-André Lureau  modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
9303154fee4SMarc-André Lureauendif
9313154fee4SMarc-André Lureau
932a81df1b6SPaolo Bonzini# Build targets from sourcesets
933a81df1b6SPaolo Bonzini
9342becc36aSPaolo Bonzinistub_ss = stub_ss.apply(config_all, strict: false)
935a81df1b6SPaolo Bonzini
936a81df1b6SPaolo Bonziniutil_ss.add_all(trace_ss)
9372becc36aSPaolo Bonziniutil_ss = util_ss.apply(config_all, strict: false)
938a81df1b6SPaolo Bonzinilibqemuutil = static_library('qemuutil',
939a81df1b6SPaolo Bonzini                             sources: util_ss.sources() + stub_ss.sources() + genh,
940aa087962SPaolo Bonzini                             dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
941a81df1b6SPaolo Bonziniqemuutil = declare_dependency(link_with: libqemuutil,
94204c6f1e7SMarc-André Lureau                              sources: genh + version_res)
943a81df1b6SPaolo Bonzini
944abff1abfSPaolo Bonzinidecodetree = generator(find_program('scripts/decodetree.py'),
945abff1abfSPaolo Bonzini                       output: 'decode-@BASENAME@.c.inc',
946abff1abfSPaolo Bonzini                       arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
947abff1abfSPaolo Bonzini
948478e943fSPaolo Bonzinisubdir('audio')
9497fcfd456SMarc-André Lureausubdir('io')
950848e8ff6SMarc-André Lureausubdir('chardev')
951ec0d5893SMarc-André Lureausubdir('fsdev')
952abff1abfSPaolo Bonzinisubdir('libdecnumber')
953d3b18480SMarc-André Lureausubdir('target')
954708eab42SMarc-André Lureausubdir('dump')
955ec0d5893SMarc-André Lureau
9565e5733e5SMarc-André Lureaublock_ss.add(files(
9575e5733e5SMarc-André Lureau  'block.c',
9585e5733e5SMarc-André Lureau  'blockjob.c',
9595e5733e5SMarc-André Lureau  'job.c',
9605e5733e5SMarc-André Lureau  'qemu-io-cmds.c',
9615e5733e5SMarc-André Lureau))
9625e5733e5SMarc-André Lureaublock_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
9635e5733e5SMarc-André Lureau
9645e5733e5SMarc-André Lureausubdir('nbd')
9655e5733e5SMarc-André Lureausubdir('scsi')
9665e5733e5SMarc-André Lureausubdir('block')
9675e5733e5SMarc-André Lureau
9684a96337dSPaolo Bonziniblockdev_ss.add(files(
9694a96337dSPaolo Bonzini  'blockdev.c',
9704a96337dSPaolo Bonzini  'blockdev-nbd.c',
9714a96337dSPaolo Bonzini  'iothread.c',
9724a96337dSPaolo Bonzini  'job-qmp.c',
9734a96337dSPaolo Bonzini))
9744a96337dSPaolo Bonzini
9754a96337dSPaolo Bonzini# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
9764a96337dSPaolo Bonzini# os-win32.c does not
9774a96337dSPaolo Bonziniblockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
9784a96337dSPaolo Bonzinisoftmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
9794a96337dSPaolo Bonzini
9804a96337dSPaolo Bonzinisoftmmu_ss.add_all(blockdev_ss)
9814a96337dSPaolo Bonzinisoftmmu_ss.add(files(
9824a96337dSPaolo Bonzini  'bootdevice.c',
9834a96337dSPaolo Bonzini  'dma-helpers.c',
9844a96337dSPaolo Bonzini  'qdev-monitor.c',
9854a96337dSPaolo Bonzini), sdl)
9864a96337dSPaolo Bonzini
9874a96337dSPaolo Bonzinisoftmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
9884a96337dSPaolo Bonzinisoftmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
9894a96337dSPaolo Bonzinisoftmmu_ss.add(when: ['CONFIG_FDT', fdt],  if_true: [files('device_tree.c')])
9904a96337dSPaolo Bonzini
9914a96337dSPaolo Bonzinicommon_ss.add(files('cpus-common.c'))
9924a96337dSPaolo Bonzini
9935d3ea0e1SPaolo Bonzinisubdir('softmmu')
994c9322ab5SMarc-André Lureau
995c7c91a74SBruce Rogersspecific_ss.add(files('disas.c', 'exec.c', 'gdbstub.c'), capstone, libpmem, libdaxctl)
996c9322ab5SMarc-André Lureauspecific_ss.add(files('exec-vary.c'))
997c9322ab5SMarc-André Lureauspecific_ss.add(when: 'CONFIG_TCG', if_true: files(
998c9322ab5SMarc-André Lureau  'fpu/softfloat.c',
999c9322ab5SMarc-André Lureau  'tcg/optimize.c',
1000c9322ab5SMarc-André Lureau  'tcg/tcg-common.c',
1001c9322ab5SMarc-André Lureau  'tcg/tcg-op-gvec.c',
1002c9322ab5SMarc-André Lureau  'tcg/tcg-op-vec.c',
1003c9322ab5SMarc-André Lureau  'tcg/tcg-op.c',
1004c9322ab5SMarc-André Lureau  'tcg/tcg.c',
1005c9322ab5SMarc-André Lureau))
1006c9322ab5SMarc-André Lureauspecific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1007c9322ab5SMarc-André Lureau
1008ab318051SMarc-André Lureausubdir('backends')
1009c574e161SMarc-André Lureausubdir('disas')
101055166230SMarc-André Lureausubdir('migration')
1011ff219dcaSPaolo Bonzinisubdir('monitor')
1012cdaf0722SMarc-André Lureausubdir('net')
101317ef2af6SMarc-André Lureausubdir('replay')
1014582ea95fSMarc-André Lureausubdir('hw')
10151a82878aSMarc-André Lureausubdir('accel')
1016f556b4a1SPaolo Bonzinisubdir('plugins')
1017b309c321SMarc-André Lureausubdir('bsd-user')
10183a30446aSMarc-André Lureausubdir('linux-user')
10193a30446aSMarc-André Lureau
1020b309c321SMarc-André Lureaubsd_user_ss.add(files('gdbstub.c'))
1021b309c321SMarc-André Lureauspecific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1022b309c321SMarc-André Lureau
10233a30446aSMarc-André Lureaulinux_user_ss.add(files('gdbstub.c', 'thunk.c'))
10243a30446aSMarc-André Lureauspecific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
10255d3ea0e1SPaolo Bonzini
1026a2ce7dbdSPaolo Bonzini# needed for fuzzing binaries
1027a2ce7dbdSPaolo Bonzinisubdir('tests/qtest/libqos')
102864ed6f92SPaolo Bonzinisubdir('tests/qtest/fuzz')
1029a2ce7dbdSPaolo Bonzini
10303154fee4SMarc-André Lureaublock_mods = []
10313154fee4SMarc-André Lureausoftmmu_mods = []
10323154fee4SMarc-André Lureauforeach d, list : modules
10333154fee4SMarc-André Lureau  foreach m, module_ss : list
10343154fee4SMarc-André Lureau    if enable_modules and targetos != 'windows'
10353e292c51SGerd Hoffmann      module_ss = module_ss.apply(config_all, strict: false)
10363154fee4SMarc-André Lureau      sl = static_library(d + '-' + m, [genh, module_ss.sources()],
10373154fee4SMarc-André Lureau                          dependencies: [modulecommon, module_ss.dependencies()], pic: true)
10383154fee4SMarc-André Lureau      if d == 'block'
10393154fee4SMarc-André Lureau        block_mods += sl
10403154fee4SMarc-André Lureau      else
10413154fee4SMarc-André Lureau        softmmu_mods += sl
10423154fee4SMarc-André Lureau      endif
10433154fee4SMarc-André Lureau    else
10443154fee4SMarc-André Lureau      if d == 'block'
10453154fee4SMarc-André Lureau        block_ss.add_all(module_ss)
10463154fee4SMarc-André Lureau      else
10473154fee4SMarc-André Lureau        softmmu_ss.add_all(module_ss)
10483154fee4SMarc-André Lureau      endif
10493154fee4SMarc-André Lureau    endif
10503154fee4SMarc-André Lureau  endforeach
10513154fee4SMarc-André Lureauendforeach
10523154fee4SMarc-André Lureau
10533154fee4SMarc-André Lureaunm = find_program('nm')
1054604f3e4eSYonggang Luoundefsym = find_program('scripts/undefsym.py')
10553154fee4SMarc-André Lureaublock_syms = custom_target('block.syms', output: 'block.syms',
10563154fee4SMarc-André Lureau                             input: [libqemuutil, block_mods],
10573154fee4SMarc-André Lureau                             capture: true,
10583154fee4SMarc-André Lureau                             command: [undefsym, nm, '@INPUT@'])
10593154fee4SMarc-André Lureauqemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
10603154fee4SMarc-André Lureau                             input: [libqemuutil, softmmu_mods],
10613154fee4SMarc-André Lureau                             capture: true,
10623154fee4SMarc-André Lureau                             command: [undefsym, nm, '@INPUT@'])
10633154fee4SMarc-André Lureau
10645e5733e5SMarc-André Lureaublock_ss = block_ss.apply(config_host, strict: false)
10655e5733e5SMarc-André Lureaulibblock = static_library('block', block_ss.sources() + genh,
10665e5733e5SMarc-André Lureau                          dependencies: block_ss.dependencies(),
10675e5733e5SMarc-André Lureau                          link_depends: block_syms,
10685e5733e5SMarc-André Lureau                          name_suffix: 'fa',
10695e5733e5SMarc-André Lureau                          build_by_default: false)
10705e5733e5SMarc-André Lureau
10715e5733e5SMarc-André Lureaublock = declare_dependency(link_whole: [libblock],
1072b7c70bf2SMarc-André Lureau                           link_args: '@block.syms',
1073b7c70bf2SMarc-André Lureau                           dependencies: [crypto, io])
10745e5733e5SMarc-André Lureau
1075ff219dcaSPaolo Bonziniqmp_ss = qmp_ss.apply(config_host, strict: false)
1076ff219dcaSPaolo Bonzinilibqmp = static_library('qmp', qmp_ss.sources() + genh,
1077ff219dcaSPaolo Bonzini                        dependencies: qmp_ss.dependencies(),
1078ff219dcaSPaolo Bonzini                        name_suffix: 'fa',
1079ff219dcaSPaolo Bonzini                        build_by_default: false)
1080ff219dcaSPaolo Bonzini
1081ff219dcaSPaolo Bonziniqmp = declare_dependency(link_whole: [libqmp])
1082ff219dcaSPaolo Bonzini
10833154fee4SMarc-André Lureauforeach m : block_mods + softmmu_mods
10843154fee4SMarc-André Lureau  shared_module(m.name(),
10853154fee4SMarc-André Lureau                name_prefix: '',
10863154fee4SMarc-André Lureau                link_whole: m,
10873154fee4SMarc-André Lureau                install: true,
10883154fee4SMarc-André Lureau                install_dir: config_host['qemu_moddir'])
10893154fee4SMarc-André Lureauendforeach
10903154fee4SMarc-André Lureau
109164ed6f92SPaolo Bonzinisoftmmu_ss.add(authz, block, chardev, crypto, io, qmp)
109264ed6f92SPaolo Bonzinicommon_ss.add(qom, qemuutil)
109364ed6f92SPaolo Bonzini
109464ed6f92SPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
10952becc36aSPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
10962becc36aSPaolo Bonzini
10972becc36aSPaolo Bonzinicommon_all = common_ss.apply(config_all, strict: false)
10982becc36aSPaolo Bonzinicommon_all = static_library('common',
10992becc36aSPaolo Bonzini                            build_by_default: false,
11002becc36aSPaolo Bonzini                            sources: common_all.sources() + genh,
11012becc36aSPaolo Bonzini                            dependencies: common_all.dependencies(),
11022becc36aSPaolo Bonzini                            name_suffix: 'fa')
11032becc36aSPaolo Bonzini
1104c9322ab5SMarc-André Lureaufeature_to_c = find_program('scripts/feature_to_c.sh')
1105c9322ab5SMarc-André Lureau
110664ed6f92SPaolo Bonziniemulators = []
11072becc36aSPaolo Bonziniforeach target : target_dirs
11082becc36aSPaolo Bonzini  config_target = config_target_mak[target]
11092becc36aSPaolo Bonzini  target_name = config_target['TARGET_NAME']
11102becc36aSPaolo Bonzini  arch = config_target['TARGET_BASE_ARCH']
1111859aef02SPaolo Bonzini  arch_srcs = [config_target_h[target]]
111264ed6f92SPaolo Bonzini  arch_deps = []
111364ed6f92SPaolo Bonzini  c_args = ['-DNEED_CPU_H',
111464ed6f92SPaolo Bonzini            '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
111564ed6f92SPaolo Bonzini            '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
111664ed6f92SPaolo Bonzini  link_args = []
11172becc36aSPaolo Bonzini
1118859aef02SPaolo Bonzini  config_target += config_host
11192becc36aSPaolo Bonzini  target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
11202becc36aSPaolo Bonzini  if targetos == 'linux'
11212becc36aSPaolo Bonzini    target_inc += include_directories('linux-headers', is_system: true)
11222becc36aSPaolo Bonzini  endif
11232becc36aSPaolo Bonzini  if target.endswith('-softmmu')
11242becc36aSPaolo Bonzini    qemu_target_name = 'qemu-system-' + target_name
11252becc36aSPaolo Bonzini    target_type='system'
1126abff1abfSPaolo Bonzini    t = target_softmmu_arch[arch].apply(config_target, strict: false)
1127abff1abfSPaolo Bonzini    arch_srcs += t.sources()
112864ed6f92SPaolo Bonzini    arch_deps += t.dependencies()
1129abff1abfSPaolo Bonzini
11302c44220dSMarc-André Lureau    hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
11312c44220dSMarc-André Lureau    hw = hw_arch[hw_dir].apply(config_target, strict: false)
11322c44220dSMarc-André Lureau    arch_srcs += hw.sources()
113364ed6f92SPaolo Bonzini    arch_deps += hw.dependencies()
11342c44220dSMarc-André Lureau
11352becc36aSPaolo Bonzini    arch_srcs += config_devices_h[target]
113664ed6f92SPaolo Bonzini    link_args += ['@block.syms', '@qemu.syms']
11372becc36aSPaolo Bonzini  else
11383a30446aSMarc-André Lureau    abi = config_target['TARGET_ABI_DIR']
11392becc36aSPaolo Bonzini    target_type='user'
11402becc36aSPaolo Bonzini    qemu_target_name = 'qemu-' + target_name
11412becc36aSPaolo Bonzini    if 'CONFIG_LINUX_USER' in config_target
11422becc36aSPaolo Bonzini      base_dir = 'linux-user'
11432becc36aSPaolo Bonzini      target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
11442becc36aSPaolo Bonzini    else
11452becc36aSPaolo Bonzini      base_dir = 'bsd-user'
11462becc36aSPaolo Bonzini    endif
11472becc36aSPaolo Bonzini    target_inc += include_directories(
11482becc36aSPaolo Bonzini      base_dir,
11493a30446aSMarc-André Lureau      base_dir / abi,
11502becc36aSPaolo Bonzini    )
11513a30446aSMarc-André Lureau    if 'CONFIG_LINUX_USER' in config_target
11523a30446aSMarc-André Lureau      dir = base_dir / abi
11533a30446aSMarc-André Lureau      arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
11543a30446aSMarc-André Lureau      if config_target.has_key('TARGET_SYSTBL_ABI')
11553a30446aSMarc-André Lureau        arch_srcs += \
11563a30446aSMarc-André Lureau          syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
11573a30446aSMarc-André Lureau                                             extra_args : config_target['TARGET_SYSTBL_ABI'])
11583a30446aSMarc-André Lureau      endif
11593a30446aSMarc-André Lureau    endif
11602becc36aSPaolo Bonzini  endif
11612becc36aSPaolo Bonzini
1162c9322ab5SMarc-André Lureau  if 'TARGET_XML_FILES' in config_target
1163c9322ab5SMarc-André Lureau    gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1164c9322ab5SMarc-André Lureau                                output: target + '-gdbstub-xml.c',
1165c9322ab5SMarc-André Lureau                                input: files(config_target['TARGET_XML_FILES'].split()),
1166c9322ab5SMarc-André Lureau                                command: [feature_to_c, '@INPUT@'],
1167c9322ab5SMarc-André Lureau                                capture: true)
1168c9322ab5SMarc-André Lureau    arch_srcs += gdbstub_xml
1169c9322ab5SMarc-André Lureau  endif
1170c9322ab5SMarc-André Lureau
1171abff1abfSPaolo Bonzini  t = target_arch[arch].apply(config_target, strict: false)
1172abff1abfSPaolo Bonzini  arch_srcs += t.sources()
117364ed6f92SPaolo Bonzini  arch_deps += t.dependencies()
1174abff1abfSPaolo Bonzini
11752becc36aSPaolo Bonzini  target_common = common_ss.apply(config_target, strict: false)
11762becc36aSPaolo Bonzini  objects = common_all.extract_objects(target_common.sources())
117764ed6f92SPaolo Bonzini  deps = target_common.dependencies()
11782becc36aSPaolo Bonzini
11792becc36aSPaolo Bonzini  target_specific = specific_ss.apply(config_target, strict: false)
11802becc36aSPaolo Bonzini  arch_srcs += target_specific.sources()
118164ed6f92SPaolo Bonzini  arch_deps += target_specific.dependencies()
11822becc36aSPaolo Bonzini
118364ed6f92SPaolo Bonzini  lib = static_library('qemu-' + target,
1184859aef02SPaolo Bonzini                 sources: arch_srcs + genh,
1185b7612f45SPaolo Bonzini                 dependencies: arch_deps,
11862becc36aSPaolo Bonzini                 objects: objects,
11872becc36aSPaolo Bonzini                 include_directories: target_inc,
118864ed6f92SPaolo Bonzini                 c_args: c_args,
118964ed6f92SPaolo Bonzini                 build_by_default: false,
11902becc36aSPaolo Bonzini                 name_suffix: 'fa')
119164ed6f92SPaolo Bonzini
119264ed6f92SPaolo Bonzini  if target.endswith('-softmmu')
119364ed6f92SPaolo Bonzini    execs = [{
119464ed6f92SPaolo Bonzini      'name': 'qemu-system-' + target_name,
119564ed6f92SPaolo Bonzini      'gui': false,
119664ed6f92SPaolo Bonzini      'sources': files('softmmu/main.c'),
119764ed6f92SPaolo Bonzini      'dependencies': []
119864ed6f92SPaolo Bonzini    }]
119935be72baSPaolo Bonzini    if targetos == 'windows' and (sdl.found() or gtk.found())
120064ed6f92SPaolo Bonzini      execs += [{
120164ed6f92SPaolo Bonzini        'name': 'qemu-system-' + target_name + 'w',
120264ed6f92SPaolo Bonzini        'gui': true,
120364ed6f92SPaolo Bonzini        'sources': files('softmmu/main.c'),
120464ed6f92SPaolo Bonzini        'dependencies': []
120564ed6f92SPaolo Bonzini      }]
120664ed6f92SPaolo Bonzini    endif
120764ed6f92SPaolo Bonzini    if config_host.has_key('CONFIG_FUZZ')
120864ed6f92SPaolo Bonzini      specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
120964ed6f92SPaolo Bonzini      execs += [{
121064ed6f92SPaolo Bonzini        'name': 'qemu-fuzz-' + target_name,
121164ed6f92SPaolo Bonzini        'gui': false,
121264ed6f92SPaolo Bonzini        'sources': specific_fuzz.sources(),
121364ed6f92SPaolo Bonzini        'dependencies': specific_fuzz.dependencies(),
121464ed6f92SPaolo Bonzini      }]
121564ed6f92SPaolo Bonzini    endif
121664ed6f92SPaolo Bonzini  else
121764ed6f92SPaolo Bonzini    execs = [{
121864ed6f92SPaolo Bonzini      'name': 'qemu-' + target_name,
121964ed6f92SPaolo Bonzini      'gui': false,
122064ed6f92SPaolo Bonzini      'sources': [],
122164ed6f92SPaolo Bonzini      'dependencies': []
122264ed6f92SPaolo Bonzini    }]
122364ed6f92SPaolo Bonzini  endif
122464ed6f92SPaolo Bonzini  foreach exe: execs
122564ed6f92SPaolo Bonzini    emulators += executable(exe['name'], exe['sources'],
122664ed6f92SPaolo Bonzini               install: true,
122764ed6f92SPaolo Bonzini               c_args: c_args,
122864ed6f92SPaolo Bonzini               dependencies: arch_deps + deps + exe['dependencies'],
122964ed6f92SPaolo Bonzini               objects: lib.extract_all_objects(recursive: true),
123064ed6f92SPaolo Bonzini               link_language: link_language,
123164ed6f92SPaolo Bonzini               link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
123264ed6f92SPaolo Bonzini               link_args: link_args,
123364ed6f92SPaolo Bonzini               gui_app: exe['gui'])
123410e1d263SMarc-André Lureau
123510e1d263SMarc-André Lureau    if 'CONFIG_TRACE_SYSTEMTAP' in config_host
123610e1d263SMarc-André Lureau      foreach stp: [
1237bd5f973aSStefan Hajnoczi        {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1238bd5f973aSStefan Hajnoczi        {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
123910e1d263SMarc-André Lureau        {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
124010e1d263SMarc-André Lureau        {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
124110e1d263SMarc-André Lureau      ]
1242bd5f973aSStefan Hajnoczi        custom_target(exe['name'] + stp['ext'],
124310e1d263SMarc-André Lureau                      input: trace_events_all,
1244bd5f973aSStefan Hajnoczi                      output: exe['name'] + stp['ext'],
124510e1d263SMarc-André Lureau                      capture: true,
124610e1d263SMarc-André Lureau                      install: stp['install'],
1247ab4c0996SMarc-André Lureau                      install_dir: qemu_datadir / '../systemtap/tapset',
124810e1d263SMarc-André Lureau                      command: [
124910e1d263SMarc-André Lureau                        tracetool, '--group=all', '--format=' + stp['fmt'],
125010e1d263SMarc-André Lureau                        '--binary=' + stp['bin'],
125110e1d263SMarc-André Lureau                        '--target-name=' + target_name,
125210e1d263SMarc-André Lureau                        '--target-type=' + target_type,
125310e1d263SMarc-André Lureau                        '--probe-prefix=qemu.' + target_type + '.' + target_name,
125410e1d263SMarc-André Lureau                        '@INPUT@',
125510e1d263SMarc-André Lureau                      ])
125610e1d263SMarc-André Lureau      endforeach
125710e1d263SMarc-André Lureau    endif
125864ed6f92SPaolo Bonzini  endforeach
12592becc36aSPaolo Bonziniendforeach
12602becc36aSPaolo Bonzini
1261931049b4SPaolo Bonzini# Other build targets
1262897b5afaSMarc-André Lureau
1263f556b4a1SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host
1264f556b4a1SPaolo Bonzini  install_headers('include/qemu/qemu-plugin.h')
1265f556b4a1SPaolo Bonziniendif
1266f556b4a1SPaolo Bonzini
1267f15bff25SPaolo Bonziniif 'CONFIG_GUEST_AGENT' in config_host
1268f15bff25SPaolo Bonzini  subdir('qga')
1269f15bff25SPaolo Bonziniendif
1270f15bff25SPaolo Bonzini
12719755c94aSLaurent Vivier# Don't build qemu-keymap if xkbcommon is not explicitly enabled
12729755c94aSLaurent Vivier# when we don't build tools or system
12734113f4cfSLaurent Vivierif xkbcommon.found()
127428742467SMarc-André Lureau  # used for the update-keymaps target, so include rules even if !have_tools
127528742467SMarc-André Lureau  qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
127628742467SMarc-André Lureau                           dependencies: [qemuutil, xkbcommon], install: have_tools)
127728742467SMarc-André Lureauendif
127828742467SMarc-André Lureau
12798855e8f0SPhilippe Mathieu-Daudéqemu_block_tools = []
1280931049b4SPaolo Bonziniif have_tools
1281b7c70bf2SMarc-André Lureau  qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1282b7c70bf2SMarc-André Lureau             dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1283b7c70bf2SMarc-André Lureau  qemu_io = executable('qemu-io', files('qemu-io.c'),
1284b7c70bf2SMarc-André Lureau             dependencies: [block, qemuutil], install: true)
1285b7c70bf2SMarc-André Lureau  qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
1286b7c70bf2SMarc-André Lureau               dependencies: [block, qemuutil], install: true)
1287b7c70bf2SMarc-André Lureau
12887c58bb76SPaolo Bonzini  subdir('storage-daemon')
1289a9c9727cSPaolo Bonzini  subdir('contrib/rdmacm-mux')
12901d7bb6abSMarc-André Lureau  subdir('contrib/elf2dmp')
1291a9c9727cSPaolo Bonzini
1292157e7b13SMarc-André Lureau  executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1293157e7b13SMarc-André Lureau             dependencies: qemuutil,
1294157e7b13SMarc-André Lureau             install: true)
1295157e7b13SMarc-André Lureau
1296931049b4SPaolo Bonzini  if 'CONFIG_VHOST_USER' in config_host
1297931049b4SPaolo Bonzini    subdir('contrib/libvhost-user')
12982d7ac0afSPaolo Bonzini    subdir('contrib/vhost-user-blk')
1299ea458960SMarc-André Lureau    subdir('contrib/vhost-user-gpu')
130032fcc624SMarc-André Lureau    subdir('contrib/vhost-user-input')
130199650b62SPaolo Bonzini    subdir('contrib/vhost-user-scsi')
1302931049b4SPaolo Bonzini  endif
13038f51e01cSMarc-André Lureau
13048f51e01cSMarc-André Lureau  if targetos == 'linux'
13058f51e01cSMarc-André Lureau    executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
13068f51e01cSMarc-André Lureau               dependencies: [qemuutil, libcap_ng],
13078f51e01cSMarc-André Lureau               install: true,
13088f51e01cSMarc-André Lureau               install_dir: get_option('libexecdir'))
1309897b5afaSMarc-André Lureau
1310897b5afaSMarc-André Lureau    executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1311897b5afaSMarc-André Lureau               dependencies: [authz, crypto, io, qom, qemuutil,
13126ec0e15dSPaolo Bonzini                              libcap_ng, mpathpersist],
1313897b5afaSMarc-André Lureau               install: true)
13148f51e01cSMarc-André Lureau  endif
13158f51e01cSMarc-André Lureau
13165ee24e78SMarc-André Lureau  if 'CONFIG_IVSHMEM' in config_host
13175ee24e78SMarc-André Lureau    subdir('contrib/ivshmem-client')
13185ee24e78SMarc-André Lureau    subdir('contrib/ivshmem-server')
13195ee24e78SMarc-André Lureau  endif
1320931049b4SPaolo Bonziniendif
1321931049b4SPaolo Bonzini
1322f5aa6320SMarc-André Lureausubdir('scripts')
13233f99cf57SPaolo Bonzinisubdir('tools')
1324bdcbea7aSMarc-André Lureausubdir('pc-bios')
1325ce1c1e7aSPaolo Bonzinisubdir('tests')
1326f8aa24eaSPaolo Bonzinisubdir('docs')
1327e8f3bd71SMarc-André Lureauif 'CONFIG_GTK' in config_host
1328e8f3bd71SMarc-André Lureau  subdir('po')
1329e8f3bd71SMarc-André Lureauendif
13303f99cf57SPaolo Bonzini
13318adfeba9SMarc-André Lureauif host_machine.system() == 'windows'
13328adfeba9SMarc-André Lureau  nsis_cmd = [
13338adfeba9SMarc-André Lureau    find_program('scripts/nsis.py'),
13348adfeba9SMarc-André Lureau    '@OUTPUT@',
13358adfeba9SMarc-André Lureau    get_option('prefix'),
13368adfeba9SMarc-André Lureau    meson.current_source_dir(),
13378adfeba9SMarc-André Lureau    host_machine.cpu_family(),
13388adfeba9SMarc-André Lureau    '--',
13398adfeba9SMarc-André Lureau    '-DDISPLAYVERSION=' + meson.project_version(),
13408adfeba9SMarc-André Lureau  ]
13418adfeba9SMarc-André Lureau  if build_docs
13428adfeba9SMarc-André Lureau    nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
13438adfeba9SMarc-André Lureau  endif
13448adfeba9SMarc-André Lureau  if 'CONFIG_GTK' in config_host
13458adfeba9SMarc-André Lureau    nsis_cmd += '-DCONFIG_GTK=y'
13468adfeba9SMarc-André Lureau  endif
13478adfeba9SMarc-André Lureau
13488adfeba9SMarc-André Lureau  nsis = custom_target('nsis',
13498adfeba9SMarc-André Lureau                       output: 'qemu-setup-' + meson.project_version() + '.exe',
13508adfeba9SMarc-André Lureau                       input: files('qemu.nsi'),
13518adfeba9SMarc-André Lureau                       build_always_stale: true,
13528adfeba9SMarc-André Lureau                       command: nsis_cmd + ['@INPUT@'])
13538adfeba9SMarc-André Lureau  alias_target('installer', nsis)
13548adfeba9SMarc-André Lureauendif
13558adfeba9SMarc-André Lureau
1356f9332757SPaolo Bonzinisummary_info = {}
1357f9332757SPaolo Bonzinisummary_info += {'Install prefix':    config_host['prefix']}
1358f9332757SPaolo Bonzinisummary_info += {'BIOS directory':    config_host['qemu_datadir']}
1359f9332757SPaolo Bonzinisummary_info += {'firmware path':     config_host['qemu_firmwarepath']}
1360f9332757SPaolo Bonzinisummary_info += {'binary directory':  config_host['bindir']}
1361f9332757SPaolo Bonzinisummary_info += {'library directory': config_host['libdir']}
1362f9332757SPaolo Bonzinisummary_info += {'module directory':  config_host['qemu_moddir']}
1363f9332757SPaolo Bonzinisummary_info += {'libexec directory': config_host['libexecdir']}
1364f9332757SPaolo Bonzinisummary_info += {'include directory': config_host['includedir']}
1365f9332757SPaolo Bonzinisummary_info += {'config directory':  config_host['sysconfdir']}
1366f9332757SPaolo Bonziniif targetos != 'windows'
1367f9332757SPaolo Bonzini  summary_info += {'local state directory': config_host['qemu_localstatedir']}
1368b81efab7SMarc-André Lureau  summary_info += {'Manual directory':      get_option('mandir')}
1369f9332757SPaolo Bonzinielse
1370f9332757SPaolo Bonzini  summary_info += {'local state directory': 'queried at runtime'}
1371f9332757SPaolo Bonziniendif
1372491e74c1SMarc-André Lureausummary_info += {'Doc directory':     get_option('docdir')}
1373f9332757SPaolo Bonzinisummary_info += {'Build directory':   meson.current_build_dir()}
1374f9332757SPaolo Bonzinisummary_info += {'Source path':       meson.current_source_dir()}
1375f9332757SPaolo Bonzinisummary_info += {'GIT binary':        config_host['GIT']}
1376f9332757SPaolo Bonzinisummary_info += {'GIT submodules':    config_host['GIT_SUBMODULES']}
1377f9332757SPaolo Bonzinisummary_info += {'C compiler':        meson.get_compiler('c').cmd_array()[0]}
1378f9332757SPaolo Bonzinisummary_info += {'Host C compiler':   meson.get_compiler('c', native: true).cmd_array()[0]}
1379f9332757SPaolo Bonziniif link_language == 'cpp'
1380f9332757SPaolo Bonzini  summary_info += {'C++ compiler':      meson.get_compiler('cpp').cmd_array()[0]}
1381f9332757SPaolo Bonzinielse
1382f9332757SPaolo Bonzini  summary_info += {'C++ compiler':      false}
1383f9332757SPaolo Bonziniendif
1384f9332757SPaolo Bonziniif targetos == 'darwin'
1385f9332757SPaolo Bonzini  summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1386f9332757SPaolo Bonziniendif
1387f9332757SPaolo Bonzinisummary_info += {'ARFLAGS':           config_host['ARFLAGS']}
1388f9332757SPaolo Bonzinisummary_info += {'CFLAGS':            config_host['CFLAGS']}
1389f9332757SPaolo Bonzinisummary_info += {'QEMU_CFLAGS':       config_host['QEMU_CFLAGS']}
1390f9332757SPaolo Bonzinisummary_info += {'QEMU_LDFLAGS':      config_host['QEMU_LDFLAGS']}
1391f9332757SPaolo Bonzinisummary_info += {'make':              config_host['MAKE']}
1392f9332757SPaolo Bonzinisummary_info += {'python':            '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1393f9332757SPaolo Bonzinisummary_info += {'sphinx-build':      config_host['SPHINX_BUILD']}
1394f9332757SPaolo Bonzinisummary_info += {'genisoimage':       config_host['GENISOIMAGE']}
1395f9332757SPaolo Bonzini# TODO: add back version
1396f9332757SPaolo Bonzinisummary_info += {'slirp support':     config_host.has_key('CONFIG_SLIRP')}
1397f9332757SPaolo Bonziniif config_host.has_key('CONFIG_SLIRP')
1398f9332757SPaolo Bonzini  summary_info += {'smbd':            config_host['CONFIG_SMBD_COMMAND']}
1399f9332757SPaolo Bonziniendif
1400f9332757SPaolo Bonzinisummary_info += {'module support':    config_host.has_key('CONFIG_MODULES')}
1401f9332757SPaolo Bonziniif config_host.has_key('CONFIG_MODULES')
1402f9332757SPaolo Bonzini  summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1403f9332757SPaolo Bonziniendif
1404f9332757SPaolo Bonzinisummary_info += {'host CPU':          cpu}
1405f9332757SPaolo Bonzinisummary_info += {'host endianness':   build_machine.endian()}
1406f9332757SPaolo Bonzinisummary_info += {'target list':       config_host['TARGET_DIRS']}
1407f9332757SPaolo Bonzinisummary_info += {'gprof enabled':     config_host.has_key('CONFIG_GPROF')}
1408f9332757SPaolo Bonzinisummary_info += {'sparse enabled':    meson.get_compiler('c').cmd_array().contains('cgcc')}
1409f9332757SPaolo Bonzinisummary_info += {'strip binaries':    get_option('strip')}
1410f9332757SPaolo Bonzinisummary_info += {'profiler':          config_host.has_key('CONFIG_PROFILER')}
14113e8529ddSLaurent Viviersummary_info += {'static build':      config_host.has_key('CONFIG_STATIC')}
1412f9332757SPaolo Bonziniif targetos == 'darwin'
1413f9332757SPaolo Bonzini  summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1414f9332757SPaolo Bonziniendif
1415f9332757SPaolo Bonzini# TODO: add back version
141635be72baSPaolo Bonzinisummary_info += {'SDL support':       sdl.found()}
141735be72baSPaolo Bonzinisummary_info += {'SDL image support': sdl_image.found()}
1418f9332757SPaolo Bonzini# TODO: add back version
1419f9332757SPaolo Bonzinisummary_info += {'GTK support':       config_host.has_key('CONFIG_GTK')}
1420f9332757SPaolo Bonzinisummary_info += {'GTK GL support':    config_host.has_key('CONFIG_GTK_GL')}
1421b7612f45SPaolo Bonzinisummary_info += {'pixman':            pixman.found()}
1422f9332757SPaolo Bonzini# TODO: add back version
1423f9332757SPaolo Bonzinisummary_info += {'VTE support':       config_host.has_key('CONFIG_VTE')}
1424f9332757SPaolo Bonzinisummary_info += {'TLS priority':      config_host['CONFIG_TLS_PRIORITY']}
1425f9332757SPaolo Bonzinisummary_info += {'GNUTLS support':    config_host.has_key('CONFIG_GNUTLS')}
1426f9332757SPaolo Bonzini# TODO: add back version
1427f9332757SPaolo Bonzinisummary_info += {'libgcrypt':         config_host.has_key('CONFIG_GCRYPT')}
1428f9332757SPaolo Bonziniif config_host.has_key('CONFIG_GCRYPT')
1429f9332757SPaolo Bonzini   summary_info += {'  hmac':            config_host.has_key('CONFIG_GCRYPT_HMAC')}
1430f9332757SPaolo Bonzini   summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1431f9332757SPaolo Bonziniendif
1432f9332757SPaolo Bonzini# TODO: add back version
1433f9332757SPaolo Bonzinisummary_info += {'nettle':            config_host.has_key('CONFIG_NETTLE')}
1434f9332757SPaolo Bonziniif config_host.has_key('CONFIG_NETTLE')
1435f9332757SPaolo Bonzini   summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1436f9332757SPaolo Bonziniendif
1437f9332757SPaolo Bonzinisummary_info += {'libtasn1':          config_host.has_key('CONFIG_TASN1')}
1438f9332757SPaolo Bonzinisummary_info += {'PAM':               config_host.has_key('CONFIG_AUTH_PAM')}
1439f9332757SPaolo Bonzinisummary_info += {'iconv support':     config_host.has_key('CONFIG_ICONV')}
1440f9332757SPaolo Bonzinisummary_info += {'curses support':    config_host.has_key('CONFIG_CURSES')}
1441f9332757SPaolo Bonzini# TODO: add back version
1442f9332757SPaolo Bonzinisummary_info += {'virgl support':     config_host.has_key('CONFIG_VIRGL')}
1443f9332757SPaolo Bonzinisummary_info += {'curl support':      config_host.has_key('CONFIG_CURL')}
1444f9332757SPaolo Bonzinisummary_info += {'mingw32 support':   targetos == 'windows'}
1445f9332757SPaolo Bonzinisummary_info += {'Audio drivers':     config_host['CONFIG_AUDIO_DRIVERS']}
1446f9332757SPaolo Bonzinisummary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1447f9332757SPaolo Bonzinisummary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1448f9332757SPaolo Bonzinisummary_info += {'VirtFS support':    config_host.has_key('CONFIG_VIRTFS')}
14496ec0e15dSPaolo Bonzinisummary_info += {'Multipath support': mpathpersist.found()}
1450a0b93237SPaolo Bonzinisummary_info += {'VNC support':       vnc.found()}
1451a0b93237SPaolo Bonziniif vnc.found()
1452a0b93237SPaolo Bonzini  summary_info += {'VNC SASL support':  sasl.found()}
1453a0b93237SPaolo Bonzini  summary_info += {'VNC JPEG support':  jpeg.found()}
1454a0b93237SPaolo Bonzini  summary_info += {'VNC PNG support':   png.found()}
1455f9332757SPaolo Bonziniendif
1456f9332757SPaolo Bonzinisummary_info += {'xen support':       config_host.has_key('CONFIG_XEN_BACKEND')}
1457f9332757SPaolo Bonziniif config_host.has_key('CONFIG_XEN_BACKEND')
1458f9332757SPaolo Bonzini  summary_info += {'xen ctrl version':  config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1459f9332757SPaolo Bonziniendif
1460f9332757SPaolo Bonzinisummary_info += {'brlapi support':    config_host.has_key('CONFIG_BRLAPI')}
1461f9332757SPaolo Bonzinisummary_info += {'Documentation':     config_host.has_key('BUILD_DOCS')}
1462f9332757SPaolo Bonzinisummary_info += {'PIE':               get_option('b_pie')}
1463f9332757SPaolo Bonzinisummary_info += {'vde support':       config_host.has_key('CONFIG_VDE')}
1464f9332757SPaolo Bonzinisummary_info += {'netmap support':    config_host.has_key('CONFIG_NETMAP')}
1465f9332757SPaolo Bonzinisummary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1466f9332757SPaolo Bonzinisummary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1467f9332757SPaolo Bonzinisummary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1468f9332757SPaolo Bonzinisummary_info += {'Install blobs':     config_host.has_key('INSTALL_BLOBS')}
1469f9332757SPaolo Bonzini# TODO: add back KVM/HAX/HVF/WHPX/TCG
1470f9332757SPaolo Bonzini#summary_info += {'KVM support':       have_kvm'}
1471f9332757SPaolo Bonzini#summary_info += {'HAX support':       have_hax'}
1472f9332757SPaolo Bonzini#summary_info += {'HVF support':       have_hvf'}
1473f9332757SPaolo Bonzini#summary_info += {'WHPX support':      have_whpx'}
1474f9332757SPaolo Bonzini#summary_info += {'TCG support':       have_tcg'}
1475f9332757SPaolo Bonzini#if get_option('tcg')
1476f9332757SPaolo Bonzini#  summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1477f9332757SPaolo Bonzini#  summary_info += {'TCG interpreter':   config_host.has_key('CONFIG_TCG_INTERPRETER')}
1478f9332757SPaolo Bonzini#endif
1479aa087962SPaolo Bonzinisummary_info += {'malloc trim support': has_malloc_trim}
1480f9332757SPaolo Bonzinisummary_info += {'RDMA support':      config_host.has_key('CONFIG_RDMA')}
1481f9332757SPaolo Bonzinisummary_info += {'PVRDMA support':    config_host.has_key('CONFIG_PVRDMA')}
1482f9332757SPaolo Bonzinisummary_info += {'fdt support':       config_host.has_key('CONFIG_FDT')}
1483f9332757SPaolo Bonzinisummary_info += {'membarrier':        config_host.has_key('CONFIG_MEMBARRIER')}
1484f9332757SPaolo Bonzinisummary_info += {'preadv support':    config_host.has_key('CONFIG_PREADV')}
1485f9332757SPaolo Bonzinisummary_info += {'fdatasync':         config_host.has_key('CONFIG_FDATASYNC')}
1486f9332757SPaolo Bonzinisummary_info += {'madvise':           config_host.has_key('CONFIG_MADVISE')}
1487f9332757SPaolo Bonzinisummary_info += {'posix_madvise':     config_host.has_key('CONFIG_POSIX_MADVISE')}
1488f9332757SPaolo Bonzinisummary_info += {'posix_memalign':    config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1489f9332757SPaolo Bonzinisummary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1490f9332757SPaolo Bonzinisummary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1491f9332757SPaolo Bonzinisummary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1492f9332757SPaolo Bonzinisummary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1493f9332757SPaolo Bonzinisummary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1494f9332757SPaolo Bonzinisummary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1495f9332757SPaolo Bonzinisummary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1496f9332757SPaolo Bonzinisummary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1497f9332757SPaolo Bonzinisummary_info += {'Trace backends':    config_host['TRACE_BACKENDS']}
1498f9332757SPaolo Bonziniif config_host['TRACE_BACKENDS'].split().contains('simple')
1499f9332757SPaolo Bonzini  summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1500f9332757SPaolo Bonziniendif
1501f9332757SPaolo Bonzini# TODO: add back protocol and server version
1502f9332757SPaolo Bonzinisummary_info += {'spice support':     config_host.has_key('CONFIG_SPICE')}
1503f9332757SPaolo Bonzinisummary_info += {'rbd support':       config_host.has_key('CONFIG_RBD')}
1504f9332757SPaolo Bonzinisummary_info += {'xfsctl support':    config_host.has_key('CONFIG_XFS')}
1505f9332757SPaolo Bonzinisummary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
15060a40bcb7SCésar Belleysummary_info += {'U2F support':       u2f.found()}
1507f9332757SPaolo Bonzinisummary_info += {'libusb':            config_host.has_key('CONFIG_USB_LIBUSB')}
1508f9332757SPaolo Bonzinisummary_info += {'usb net redir':     config_host.has_key('CONFIG_USB_REDIR')}
1509f9332757SPaolo Bonzinisummary_info += {'OpenGL support':    config_host.has_key('CONFIG_OPENGL')}
1510f9332757SPaolo Bonzinisummary_info += {'OpenGL dmabufs':    config_host.has_key('CONFIG_OPENGL_DMABUF')}
1511f9332757SPaolo Bonzinisummary_info += {'libiscsi support':  config_host.has_key('CONFIG_LIBISCSI')}
1512f9332757SPaolo Bonzinisummary_info += {'libnfs support':    config_host.has_key('CONFIG_LIBNFS')}
1513f9332757SPaolo Bonzinisummary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1514f9332757SPaolo Bonziniif targetos == 'windows'
1515f9332757SPaolo Bonzini  if 'WIN_SDK' in config_host
1516f9332757SPaolo Bonzini    summary_info += {'Windows SDK':       config_host['WIN_SDK']}
1517f9332757SPaolo Bonzini  endif
1518f9332757SPaolo Bonzini  summary_info += {'QGA VSS support':   config_host.has_key('CONFIG_QGA_VSS')}
1519f9332757SPaolo Bonzini  summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
15204bad7c3bSStefan Hajnoczi  summary_info += {'QGA MSI support':   config_host.has_key('CONFIG_QGA_MSI')}
1521f9332757SPaolo Bonziniendif
1522f9332757SPaolo Bonzinisummary_info += {'seccomp support':   config_host.has_key('CONFIG_SECCOMP')}
1523f9332757SPaolo Bonzinisummary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1524f9332757SPaolo Bonzinisummary_info += {'coroutine pool':    config_host['CONFIG_COROUTINE_POOL'] == '1'}
1525f9332757SPaolo Bonzinisummary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1526f9332757SPaolo Bonzinisummary_info += {'mutex debugging':   config_host.has_key('CONFIG_DEBUG_MUTEX')}
1527f9332757SPaolo Bonzinisummary_info += {'crypto afalg':      config_host.has_key('CONFIG_AF_ALG')}
1528f9332757SPaolo Bonzinisummary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1529bf0e56a3SMarc-André Lureausummary_info += {'gcov':              get_option('b_coverage')}
1530f9332757SPaolo Bonzinisummary_info += {'TPM support':       config_host.has_key('CONFIG_TPM')}
1531f9332757SPaolo Bonzinisummary_info += {'libssh support':    config_host.has_key('CONFIG_LIBSSH')}
1532f9332757SPaolo Bonzinisummary_info += {'QOM debugging':     config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1533f9332757SPaolo Bonzinisummary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1534f9332757SPaolo Bonzinisummary_info += {'lzo support':       config_host.has_key('CONFIG_LZO')}
1535f9332757SPaolo Bonzinisummary_info += {'snappy support':    config_host.has_key('CONFIG_SNAPPY')}
1536f9332757SPaolo Bonzinisummary_info += {'bzip2 support':     config_host.has_key('CONFIG_BZIP2')}
1537f9332757SPaolo Bonzinisummary_info += {'lzfse support':     config_host.has_key('CONFIG_LZFSE')}
1538f9332757SPaolo Bonzinisummary_info += {'zstd support':      config_host.has_key('CONFIG_ZSTD')}
1539f9332757SPaolo Bonzinisummary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1540f9332757SPaolo Bonzinisummary_info += {'libxml2':           config_host.has_key('CONFIG_LIBXML2')}
1541aa087962SPaolo Bonzinisummary_info += {'memory allocator':  get_option('malloc')}
1542f9332757SPaolo Bonzinisummary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1543f9332757SPaolo Bonzinisummary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1544f9332757SPaolo Bonzinisummary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1545f9332757SPaolo Bonzinisummary_info += {'bochs support':     config_host.has_key('CONFIG_BOCHS')}
1546f9332757SPaolo Bonzinisummary_info += {'cloop support':     config_host.has_key('CONFIG_CLOOP')}
1547f9332757SPaolo Bonzinisummary_info += {'dmg support':       config_host.has_key('CONFIG_DMG')}
1548f9332757SPaolo Bonzinisummary_info += {'qcow v1 support':   config_host.has_key('CONFIG_QCOW1')}
1549f9332757SPaolo Bonzinisummary_info += {'vdi support':       config_host.has_key('CONFIG_VDI')}
1550f9332757SPaolo Bonzinisummary_info += {'vvfat support':     config_host.has_key('CONFIG_VVFAT')}
1551f9332757SPaolo Bonzinisummary_info += {'qed support':       config_host.has_key('CONFIG_QED')}
1552f9332757SPaolo Bonzinisummary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1553f9332757SPaolo Bonzinisummary_info += {'sheepdog support':  config_host.has_key('CONFIG_SHEEPDOG')}
1554f9332757SPaolo Bonzinisummary_info += {'capstone':          config_host.has_key('CONFIG_CAPSTONE')}
1555f9332757SPaolo Bonzinisummary_info += {'libpmem support':   config_host.has_key('CONFIG_LIBPMEM')}
1556f9332757SPaolo Bonzinisummary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1557f01496a3SPaolo Bonzinisummary_info += {'libudev':           libudev.found()}
1558f9332757SPaolo Bonzinisummary_info += {'default devices':   config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1559f9332757SPaolo Bonzinisummary_info += {'plugin support':    config_host.has_key('CONFIG_PLUGIN')}
1560f9332757SPaolo Bonzinisummary_info += {'fuzzing support':   config_host.has_key('CONFIG_FUZZ')}
1561f9332757SPaolo Bonziniif config_host.has_key('HAVE_GDB_BIN')
1562f9332757SPaolo Bonzini  summary_info += {'gdb':             config_host['HAVE_GDB_BIN']}
1563f9332757SPaolo Bonziniendif
1564f9332757SPaolo Bonzinisummary_info += {'thread sanitizer':  config_host.has_key('CONFIG_TSAN')}
1565f9332757SPaolo Bonzinisummary_info += {'rng-none':          config_host.has_key('CONFIG_RNG_NONE')}
1566f9332757SPaolo Bonzinisummary_info += {'Linux keyring':     config_host.has_key('CONFIG_SECRET_KEYRING')}
1567f9332757SPaolo Bonzinisummary(summary_info, bool_yn: true)
1568f9332757SPaolo Bonzini
1569f9332757SPaolo Bonziniif not supported_cpus.contains(cpu)
1570f9332757SPaolo Bonzini  message()
1571f9332757SPaolo Bonzini  warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1572f9332757SPaolo Bonzini  message()
1573f9332757SPaolo Bonzini  message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1574f9332757SPaolo Bonzini  message('The QEMU project intends to remove support for this host CPU in')
1575f9332757SPaolo Bonzini  message('a future release if nobody volunteers to maintain it and to')
1576f9332757SPaolo Bonzini  message('provide a build host for our continuous integration setup.')
1577f9332757SPaolo Bonzini  message('configure has succeeded and you can continue to build, but')
1578f9332757SPaolo Bonzini  message('if you care about QEMU on this platform you should contact')
1579f9332757SPaolo Bonzini  message('us upstream at qemu-devel@nongnu.org.')
1580f9332757SPaolo Bonziniendif
1581f9332757SPaolo Bonzini
1582f9332757SPaolo Bonziniif not supported_oses.contains(targetos)
1583f9332757SPaolo Bonzini  message()
1584f9332757SPaolo Bonzini  warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1585f9332757SPaolo Bonzini  message()
1586f9332757SPaolo Bonzini  message('Host OS ' + targetos + 'support is not currently maintained.')
1587f9332757SPaolo Bonzini  message('The QEMU project intends to remove support for this host OS in')
1588f9332757SPaolo Bonzini  message('a future release if nobody volunteers to maintain it and to')
1589f9332757SPaolo Bonzini  message('provide a build host for our continuous integration setup.')
1590f9332757SPaolo Bonzini  message('configure has succeeded and you can continue to build, but')
1591f9332757SPaolo Bonzini  message('if you care about QEMU on this platform you should contact')
1592f9332757SPaolo Bonzini  message('us upstream at qemu-devel@nongnu.org.')
1593f9332757SPaolo Bonziniendif
1594