xref: /qemu/meson.build (revision 8fe11232)
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
20*8fe11232SMarc-André Lureau
21*8fe11232SMarc-André Lureauif get_option('qemu_suffix').startswith('/')
22*8fe11232SMarc-André Lureau  error('qemu_suffix cannot start with a /')
23*8fe11232SMarc-André Lureauendif
24*8fe11232SMarc-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
89a81df1b6SPaolo Bonzinim = cc.find_library('m', required: false)
90a81df1b6SPaolo Bonziniutil = cc.find_library('util', required: false)
914a96337dSPaolo Bonziniwinmm = []
92a81df1b6SPaolo Bonzinisocket = []
9304c6f1e7SMarc-André Lureauversion_res = []
94d92989aaSMarc-André Lureaucoref = []
95d92989aaSMarc-André Lureauiokit = []
96d92989aaSMarc-André Lureaucocoa = []
97d92989aaSMarc-André Lureauhvf = []
98a81df1b6SPaolo Bonziniif targetos == 'windows'
99a81df1b6SPaolo Bonzini  socket = cc.find_library('ws2_32')
1004a96337dSPaolo Bonzini  winmm = cc.find_library('winmm')
10104c6f1e7SMarc-André Lureau
10204c6f1e7SMarc-André Lureau  win = import('windows')
10304c6f1e7SMarc-André Lureau  version_res = win.compile_resources('version.rc',
10404c6f1e7SMarc-André Lureau                                      depend_files: files('pc-bios/qemu-nsis.ico'),
10504c6f1e7SMarc-André Lureau                                      include_directories: include_directories('.'))
106d92989aaSMarc-André Lureauelif targetos == 'darwin'
107d92989aaSMarc-André Lureau  coref = dependency('appleframeworks', modules: 'CoreFoundation')
108d92989aaSMarc-André Lureau  iokit = dependency('appleframeworks', modules: 'IOKit')
109d92989aaSMarc-André Lureau  cocoa = dependency('appleframeworks', modules: 'Cocoa')
110d92989aaSMarc-André Lureau  hvf = dependency('appleframeworks', modules: 'Hypervisor')
111cfad62f1SPaolo Bonzinielif targetos == 'sunos'
112cfad62f1SPaolo Bonzini  socket = [cc.find_library('socket'),
113cfad62f1SPaolo Bonzini            cc.find_library('nsl'),
114cfad62f1SPaolo Bonzini            cc.find_library('resolv')]
115cfad62f1SPaolo Bonzinielif targetos == 'haiku'
116cfad62f1SPaolo Bonzini  socket = [cc.find_library('posix_error_mapper'),
117cfad62f1SPaolo Bonzini            cc.find_library('network'),
118cfad62f1SPaolo Bonzini            cc.find_library('bsd')]
119a81df1b6SPaolo Bonziniendif
120215b0c2fSPaolo Bonzini# The path to glib.h is added to all compilation commands.  This was
121215b0c2fSPaolo Bonzini# grandfathered in from the QEMU Makefiles.
122215b0c2fSPaolo Bonziniadd_project_arguments(config_host['GLIB_CFLAGS'].split(),
123215b0c2fSPaolo Bonzini                      native: false, language: ['c', 'cpp', 'objc'])
124215b0c2fSPaolo Bonziniglib = declare_dependency(link_args: config_host['GLIB_LIBS'].split())
125a81df1b6SPaolo Bonzinigio = not_found
126a81df1b6SPaolo Bonziniif 'CONFIG_GIO' in config_host
127a81df1b6SPaolo Bonzini  gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
128a81df1b6SPaolo Bonzini                           link_args: config_host['GIO_LIBS'].split())
129a81df1b6SPaolo Bonziniendif
130a81df1b6SPaolo Bonzinilttng = not_found
131a81df1b6SPaolo Bonziniif 'CONFIG_TRACE_UST' in config_host
132a81df1b6SPaolo Bonzini  lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
133a81df1b6SPaolo Bonziniendif
134a81df1b6SPaolo Bonziniurcubp = not_found
135a81df1b6SPaolo Bonziniif 'CONFIG_TRACE_UST' in config_host
136a81df1b6SPaolo Bonzini  urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
137a81df1b6SPaolo Bonziniendif
13846859d93SDaniel P. Berrangégcrypt = not_found
13946859d93SDaniel P. Berrangéif 'CONFIG_GCRYPT' in config_host
14046859d93SDaniel P. Berrangé  gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
14146859d93SDaniel P. Berrangé                              link_args: config_host['GCRYPT_LIBS'].split())
14246859d93SDaniel P. Berrangéendif
143a81df1b6SPaolo Bonzininettle = not_found
144a81df1b6SPaolo Bonziniif 'CONFIG_NETTLE' in config_host
145a81df1b6SPaolo Bonzini  nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
146a81df1b6SPaolo Bonzini                              link_args: config_host['NETTLE_LIBS'].split())
147a81df1b6SPaolo Bonziniendif
148a81df1b6SPaolo Bonzinignutls = not_found
149a81df1b6SPaolo Bonziniif 'CONFIG_GNUTLS' in config_host
150a81df1b6SPaolo Bonzini  gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
151a81df1b6SPaolo Bonzini                              link_args: config_host['GNUTLS_LIBS'].split())
152a81df1b6SPaolo Bonziniendif
153b7612f45SPaolo Bonzinipixman = not_found
154b7612f45SPaolo Bonziniif have_system or have_tools
155b7612f45SPaolo Bonzini  pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
1561a94933fSPaolo Bonzini                      method: 'pkg-config', static: enable_static)
157b7612f45SPaolo Bonziniendif
1585e7fbd25SMarc-André Lureaupam = not_found
1595e7fbd25SMarc-André Lureauif 'CONFIG_AUTH_PAM' in config_host
1605e7fbd25SMarc-André Lureau  pam = cc.find_library('pam')
1615e7fbd25SMarc-André Lureauendif
1625e5733e5SMarc-André Lureaulibaio = cc.find_library('aio', required: false)
1631ffb3bbbSPaolo Bonzinizlib = dependency('zlib', required: true, static: enable_static)
1645e5733e5SMarc-André Lureaulinux_io_uring = not_found
1655e5733e5SMarc-André Lureauif 'CONFIG_LINUX_IO_URING' in config_host
1665e5733e5SMarc-André Lureau  linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
1675e5733e5SMarc-André Lureau                                      link_args: config_host['LINUX_IO_URING_LIBS'].split())
1685e5733e5SMarc-André Lureauendif
1695e5733e5SMarc-André Lureaulibxml2 = not_found
1705e5733e5SMarc-André Lureauif 'CONFIG_LIBXML2' in config_host
1715e5733e5SMarc-André Lureau  libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
1725e5733e5SMarc-André Lureau                               link_args: config_host['LIBXML2_LIBS'].split())
1735e5733e5SMarc-André Lureauendif
1745e5733e5SMarc-André Lureaulibnfs = not_found
1755e5733e5SMarc-André Lureauif 'CONFIG_LIBNFS' in config_host
1765e5733e5SMarc-André Lureau  libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
1775e5733e5SMarc-André Lureauendif
178ec0d5893SMarc-André Lureaulibattr = not_found
179ec0d5893SMarc-André Lureauif 'CONFIG_ATTR' in config_host
180ec0d5893SMarc-André Lureau  libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
181ec0d5893SMarc-André Lureauendif
1823f99cf57SPaolo Bonziniseccomp = not_found
1833f99cf57SPaolo Bonziniif 'CONFIG_SECCOMP' in config_host
1843f99cf57SPaolo Bonzini  seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
1853f99cf57SPaolo Bonzini                               link_args: config_host['SECCOMP_LIBS'].split())
1863f99cf57SPaolo Bonziniendif
1873f99cf57SPaolo Bonzinilibcap_ng = not_found
1883f99cf57SPaolo Bonziniif 'CONFIG_LIBCAP_NG' in config_host
1893f99cf57SPaolo Bonzini  libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
1903f99cf57SPaolo Bonziniendif
1911917ec6dSPaolo Bonziniif get_option('xkbcommon').auto() and not have_system and not have_tools
1921917ec6dSPaolo Bonzini  xkbcommon = not_found
1931917ec6dSPaolo Bonzinielse
1941917ec6dSPaolo Bonzini  xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
1951a94933fSPaolo Bonzini                         method: 'pkg-config', static: enable_static)
196ade60d4fSMarc-André Lureauendif
197cdaf0722SMarc-André Lureauslirp = not_found
198cdaf0722SMarc-André Lureauif config_host.has_key('CONFIG_SLIRP')
199cdaf0722SMarc-André Lureau  slirp = declare_dependency(compile_args: config_host['SLIRP_CFLAGS'].split(),
200cdaf0722SMarc-André Lureau                             link_args: config_host['SLIRP_LIBS'].split())
201cdaf0722SMarc-André Lureauendif
202cdaf0722SMarc-André Lureauvde = not_found
203cdaf0722SMarc-André Lureauif config_host.has_key('CONFIG_VDE')
204cdaf0722SMarc-André Lureau  vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
205cdaf0722SMarc-André Lureauendif
206478e943fSPaolo Bonzinipulse = not_found
207478e943fSPaolo Bonziniif 'CONFIG_LIBPULSE' in config_host
208478e943fSPaolo Bonzini  pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
209478e943fSPaolo Bonzini                             link_args: config_host['PULSE_LIBS'].split())
210478e943fSPaolo Bonziniendif
211478e943fSPaolo Bonzinialsa = not_found
212478e943fSPaolo Bonziniif 'CONFIG_ALSA' in config_host
213478e943fSPaolo Bonzini  alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
214478e943fSPaolo Bonzini                            link_args: config_host['ALSA_LIBS'].split())
215478e943fSPaolo Bonziniendif
216478e943fSPaolo Bonzinijack = not_found
217478e943fSPaolo Bonziniif 'CONFIG_LIBJACK' in config_host
218478e943fSPaolo Bonzini  jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
219478e943fSPaolo Bonziniendif
2202634733cSPaolo Bonzinispice = not_found
2212634733cSPaolo Bonziniif 'CONFIG_SPICE' in config_host
2222634733cSPaolo Bonzini  spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
2232634733cSPaolo Bonzini                             link_args: config_host['SPICE_LIBS'].split())
2242634733cSPaolo Bonziniendif
2255ee24e78SMarc-André Lureaurt = cc.find_library('rt', required: false)
226897b5afaSMarc-André Lureaulibmpathpersist = not_found
227897b5afaSMarc-André Lureauif config_host.has_key('CONFIG_MPATH')
228897b5afaSMarc-André Lureau  libmpathpersist = cc.find_library('mpathpersist')
229897b5afaSMarc-André Lureauendif
230ccf7afa5SPaolo Bonzinilibdl = not_found
231ccf7afa5SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host
232ccf7afa5SPaolo Bonzini  libdl = cc.find_library('dl', required: true)
233ccf7afa5SPaolo Bonziniendif
23499650b62SPaolo Bonzinilibiscsi = not_found
23599650b62SPaolo Bonziniif 'CONFIG_LIBISCSI' in config_host
23699650b62SPaolo Bonzini  libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
23799650b62SPaolo Bonzini                                link_args: config_host['LIBISCSI_LIBS'].split())
23899650b62SPaolo Bonziniendif
2395e5733e5SMarc-André Lureauzstd = not_found
2405e5733e5SMarc-André Lureauif 'CONFIG_ZSTD' in config_host
2415e5733e5SMarc-André Lureau  zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
2425e5733e5SMarc-André Lureau                            link_args: config_host['ZSTD_LIBS'].split())
2435e5733e5SMarc-André Lureauendif
244ea458960SMarc-André Lureaugbm = not_found
245ea458960SMarc-André Lureauif 'CONFIG_GBM' in config_host
246ea458960SMarc-André Lureau  gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
247ea458960SMarc-André Lureau                           link_args: config_host['GBM_LIBS'].split())
248ea458960SMarc-André Lureauendif
249ea458960SMarc-André Lureauvirgl = not_found
250ea458960SMarc-André Lureauif 'CONFIG_VIRGL' in config_host
251ea458960SMarc-André Lureau  virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
252ea458960SMarc-André Lureau                             link_args: config_host['VIRGL_LIBS'].split())
253ea458960SMarc-André Lureauendif
2541d7bb6abSMarc-André Lureaucurl = not_found
2551d7bb6abSMarc-André Lureauif 'CONFIG_CURL' in config_host
2561d7bb6abSMarc-André Lureau  curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
2571d7bb6abSMarc-André Lureau                            link_args: config_host['CURL_LIBS'].split())
2581d7bb6abSMarc-André Lureauendif
259f15bff25SPaolo Bonzinilibudev = not_found
260f15bff25SPaolo Bonziniif 'CONFIG_LIBUDEV' in config_host
261f15bff25SPaolo Bonzini  libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
262f15bff25SPaolo Bonziniendif
2632634733cSPaolo Bonzinibrlapi = not_found
2642634733cSPaolo Bonziniif 'CONFIG_BRLAPI' in config_host
2652634733cSPaolo Bonzini  brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
2662634733cSPaolo Bonziniendif
26735be72baSPaolo Bonzini
268760e4327SPaolo Bonzinisdl = not_found
269760e4327SPaolo Bonziniif have_system
270363743daSYonggang Luo  sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
27135be72baSPaolo Bonzini  sdl_image = not_found
272760e4327SPaolo Bonziniendif
27335be72baSPaolo Bonziniif sdl.found()
27435be72baSPaolo Bonzini  # work around 2.0.8 bug
27535be72baSPaolo Bonzini  sdl = declare_dependency(compile_args: '-Wno-undef',
27635be72baSPaolo Bonzini                           dependencies: sdl)
2777161a433SVolker Rümelin  sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
2781a94933fSPaolo Bonzini                         method: 'pkg-config', static: enable_static)
27935be72baSPaolo Bonzinielse
28035be72baSPaolo Bonzini  if get_option('sdl_image').enabled()
281a8dc2aceSSergei Trofimovich    error('sdl-image required, but SDL was @0@'.format(
282a8dc2aceSSergei Trofimovich          get_option('sdl').disabled() ? 'disabled' : 'not found'))
2832634733cSPaolo Bonzini  endif
28435be72baSPaolo Bonzini  sdl_image = not_found
28535be72baSPaolo Bonziniendif
28635be72baSPaolo Bonzini
2875e5733e5SMarc-André Lureaurbd = not_found
2885e5733e5SMarc-André Lureauif 'CONFIG_RBD' in config_host
2895e5733e5SMarc-André Lureau  rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
2905e5733e5SMarc-André Lureauendif
2915e5733e5SMarc-André Lureauglusterfs = not_found
2925e5733e5SMarc-André Lureauif 'CONFIG_GLUSTERFS' in config_host
2935e5733e5SMarc-André Lureau  glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
2945e5733e5SMarc-André Lureau                                 link_args: config_host['GLUSTERFS_LIBS'].split())
2955e5733e5SMarc-André Lureauendif
2965e5733e5SMarc-André Lureaulibssh = not_found
2975e5733e5SMarc-André Lureauif 'CONFIG_LIBSSH' in config_host
2985e5733e5SMarc-André Lureau  libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
2995e5733e5SMarc-André Lureau                              link_args: config_host['LIBSSH_LIBS'].split())
3005e5733e5SMarc-André Lureauendif
3015e5733e5SMarc-André Lureaulibbzip2 = not_found
3025e5733e5SMarc-André Lureauif 'CONFIG_BZIP2' in config_host
3035e5733e5SMarc-André Lureau  libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
3045e5733e5SMarc-André Lureauendif
3055e5733e5SMarc-André Lureauliblzfse = not_found
3065e5733e5SMarc-André Lureauif 'CONFIG_LZFSE' in config_host
3075e5733e5SMarc-André Lureau  liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
3085e5733e5SMarc-André Lureauendif
309478e943fSPaolo Bonzinioss = not_found
310478e943fSPaolo Bonziniif 'CONFIG_AUDIO_OSS' in config_host
311478e943fSPaolo Bonzini  oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
312478e943fSPaolo Bonziniendif
313478e943fSPaolo Bonzinidsound = not_found
314478e943fSPaolo Bonziniif 'CONFIG_AUDIO_DSOUND' in config_host
315478e943fSPaolo Bonzini  dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
316478e943fSPaolo Bonziniendif
317478e943fSPaolo Bonzinicoreaudio = not_found
318478e943fSPaolo Bonziniif 'CONFIG_AUDIO_COREAUDIO' in config_host
319478e943fSPaolo Bonzini  coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
320478e943fSPaolo Bonziniendif
3212b1ccdf4SMarc-André Lureauopengl = not_found
3222b1ccdf4SMarc-André Lureauif 'CONFIG_OPENGL' in config_host
323de2d3005SPaolo Bonzini  opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
324de2d3005SPaolo Bonzini                              link_args: config_host['OPENGL_LIBS'].split())
3252b1ccdf4SMarc-André Lureauendif
3262b1ccdf4SMarc-André Lureaugtk = not_found
3272b1ccdf4SMarc-André Lureauif 'CONFIG_GTK' in config_host
3282b1ccdf4SMarc-André Lureau  gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
3292b1ccdf4SMarc-André Lureau                              link_args: config_host['GTK_LIBS'].split())
3302b1ccdf4SMarc-André Lureauendif
3312b1ccdf4SMarc-André Lureauvte = not_found
3322b1ccdf4SMarc-André Lureauif 'CONFIG_VTE' in config_host
3332b1ccdf4SMarc-André Lureau  vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
3342b1ccdf4SMarc-André Lureau                           link_args: config_host['VTE_LIBS'].split())
3352b1ccdf4SMarc-André Lureauendif
3362b1ccdf4SMarc-André Lureaux11 = not_found
3372b1ccdf4SMarc-André Lureauif 'CONFIG_X11' in config_host
3382b1ccdf4SMarc-André Lureau  x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
3392b1ccdf4SMarc-André Lureau                           link_args: config_host['X11_LIBS'].split())
3402b1ccdf4SMarc-André Lureauendif
3412b1ccdf4SMarc-André Lureaucurses = not_found
3422b1ccdf4SMarc-André Lureauif 'CONFIG_CURSES' in config_host
3432b1ccdf4SMarc-André Lureau  curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
3442b1ccdf4SMarc-André Lureau                              link_args: config_host['CURSES_LIBS'].split())
3452b1ccdf4SMarc-André Lureauendif
3462b1ccdf4SMarc-André Lureauiconv = not_found
3472b1ccdf4SMarc-André Lureauif 'CONFIG_ICONV' in config_host
3482b1ccdf4SMarc-André Lureau  iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
3492b1ccdf4SMarc-André Lureau                             link_args: config_host['ICONV_LIBS'].split())
3502b1ccdf4SMarc-André Lureauendif
351a0b93237SPaolo Bonzinivnc = not_found
3522b1ccdf4SMarc-André Lureaupng = not_found
3532b1ccdf4SMarc-André Lureaujpeg = not_found
3542b1ccdf4SMarc-André Lureausasl = not_found
355a0b93237SPaolo Bonziniif get_option('vnc').enabled()
356a0b93237SPaolo Bonzini  vnc = declare_dependency() # dummy dependency
357a0b93237SPaolo Bonzini  png = dependency('libpng', required: get_option('vnc_png'),
3581a94933fSPaolo Bonzini                   method: 'pkg-config', static: enable_static)
359a0b93237SPaolo Bonzini  jpeg = cc.find_library('jpeg', has_headers: ['jpeglib.h'],
360a0b93237SPaolo Bonzini                         required: get_option('vnc_jpeg'),
361a0b93237SPaolo Bonzini                         static: enable_static)
362a0b93237SPaolo Bonzini  sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
363a0b93237SPaolo Bonzini                         required: get_option('vnc_sasl'),
364a0b93237SPaolo Bonzini                         static: enable_static)
365a0b93237SPaolo Bonzini  if sasl.found()
366a0b93237SPaolo Bonzini    sasl = declare_dependency(dependencies: sasl,
367a0b93237SPaolo Bonzini                              compile_args: '-DSTRUCT_IOVEC_DEFINED')
368a0b93237SPaolo Bonzini  endif
3692b1ccdf4SMarc-André Lureauendif
3704a96337dSPaolo Bonzinifdt = not_found
3714a96337dSPaolo Bonziniif 'CONFIG_FDT' in config_host
3724a96337dSPaolo Bonzini  fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
3734a96337dSPaolo Bonzini                           link_args: config_host['FDT_LIBS'].split())
3744a96337dSPaolo Bonziniendif
375708eab42SMarc-André Lureausnappy = not_found
376708eab42SMarc-André Lureauif 'CONFIG_SNAPPY' in config_host
377708eab42SMarc-André Lureau  snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
378708eab42SMarc-André Lureauendif
379708eab42SMarc-André Lureaulzo = not_found
380708eab42SMarc-André Lureauif 'CONFIG_LZO' in config_host
381708eab42SMarc-André Lureau  lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
382708eab42SMarc-André Lureauendif
38355166230SMarc-André Lureaurdma = not_found
38455166230SMarc-André Lureauif 'CONFIG_RDMA' in config_host
38555166230SMarc-André Lureau  rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
38655166230SMarc-André Lureauendif
387ab318051SMarc-André Lureaunuma = not_found
388ab318051SMarc-André Lureauif 'CONFIG_NUMA' in config_host
389ab318051SMarc-André Lureau  numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
390ab318051SMarc-André Lureauendif
391582ea95fSMarc-André Lureauxen = not_found
392582ea95fSMarc-André Lureauif 'CONFIG_XEN_BACKEND' in config_host
393582ea95fSMarc-André Lureau  xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
394582ea95fSMarc-André Lureau                           link_args: config_host['XEN_LIBS'].split())
395582ea95fSMarc-André Lureauendif
39606677ce1SPaolo Bonzinicacard = not_found
39706677ce1SPaolo Bonziniif 'CONFIG_SMARTCARD' in config_host
39806677ce1SPaolo Bonzini  cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
39906677ce1SPaolo Bonzini                              link_args: config_host['SMARTCARD_LIBS'].split())
40006677ce1SPaolo Bonziniendif
4010a40bcb7SCésar Belleyu2f = not_found
4020a40bcb7SCésar Belleyif have_system
4030a40bcb7SCésar Belley  u2f = dependency('u2f-emu', required: get_option('u2f'),
4040a40bcb7SCésar Belley                   method: 'pkg-config',
4050a40bcb7SCésar Belley                   static: enable_static)
4060a40bcb7SCésar Belleyendif
40706677ce1SPaolo Bonziniusbredir = not_found
40806677ce1SPaolo Bonziniif 'CONFIG_USB_REDIR' in config_host
40906677ce1SPaolo Bonzini  usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
41006677ce1SPaolo Bonzini                                link_args: config_host['USB_REDIR_LIBS'].split())
41106677ce1SPaolo Bonziniendif
41206677ce1SPaolo Bonzinilibusb = not_found
41306677ce1SPaolo Bonziniif 'CONFIG_USB_LIBUSB' in config_host
41406677ce1SPaolo Bonzini  libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
41506677ce1SPaolo Bonzini                              link_args: config_host['LIBUSB_LIBS'].split())
41606677ce1SPaolo Bonziniendif
417c9322ab5SMarc-André Lureaucapstone = not_found
418c9322ab5SMarc-André Lureauif 'CONFIG_CAPSTONE' in config_host
419c9322ab5SMarc-André Lureau  capstone = declare_dependency(compile_args: config_host['CAPSTONE_CFLAGS'].split(),
420c9322ab5SMarc-André Lureau                                link_args: config_host['CAPSTONE_LIBS'].split())
421c9322ab5SMarc-André Lureauendif
422c9322ab5SMarc-André Lureaulibpmem = not_found
423c9322ab5SMarc-André Lureauif 'CONFIG_LIBPMEM' in config_host
424c9322ab5SMarc-André Lureau  libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
425c9322ab5SMarc-André Lureau                               link_args: config_host['LIBPMEM_LIBS'].split())
426c9322ab5SMarc-André Lureauendif
427c7c91a74SBruce Rogerslibdaxctl = not_found
428c7c91a74SBruce Rogersif 'CONFIG_LIBDAXCTL' in config_host
429c7c91a74SBruce Rogers  libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
430c7c91a74SBruce Rogersendif
4318ce0a45fSMarc-André Lureautasn1 = not_found
4328ce0a45fSMarc-André Lureauif 'CONFIG_TASN1' in config_host
4338ce0a45fSMarc-André Lureau  tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
4348ce0a45fSMarc-André Lureau                             link_args: config_host['TASN1_LIBS'].split())
4358ce0a45fSMarc-André Lureauendif
436af04e89dSMarc-André Lureaukeyutils = dependency('libkeyutils', required: false,
437af04e89dSMarc-André Lureau                      method: 'pkg-config', static: enable_static)
438a81df1b6SPaolo Bonzini
4393909def8SMarc-André Lureauhas_gettid = cc.has_function('gettid')
4403909def8SMarc-André Lureau
441859aef02SPaolo Bonzini# Create config-host.h
442859aef02SPaolo Bonzini
44335be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL', sdl.found())
44435be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
445a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC', vnc.found())
446a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
447a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_PNG', png.found())
448a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_SASL', sasl.found())
4494113f4cfSLaurent Vivierconfig_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
450af04e89dSMarc-André Lureauconfig_host_data.set('CONFIG_KEYUTILS', keyutils.found())
4513909def8SMarc-André Lureauconfig_host_data.set('CONFIG_GETTID', has_gettid)
452859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
453859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
454859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
455859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
456859aef02SPaolo Bonzini
457859aef02SPaolo Bonziniarrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
458859aef02SPaolo Bonzinistrings = ['HOST_DSOSUF', 'CONFIG_IASL', 'qemu_confdir', 'qemu_datadir',
459859aef02SPaolo Bonzini           'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
460859aef02SPaolo Bonzini           'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath']
461859aef02SPaolo Bonziniforeach k, v: config_host
462859aef02SPaolo Bonzini  if arrays.contains(k)
463859aef02SPaolo Bonzini    if v != ''
464859aef02SPaolo Bonzini      v = '"' + '", "'.join(v.split()) + '", '
465859aef02SPaolo Bonzini    endif
466859aef02SPaolo Bonzini    config_host_data.set(k, v)
467859aef02SPaolo Bonzini  elif k == 'ARCH'
468859aef02SPaolo Bonzini    config_host_data.set('HOST_' + v.to_upper(), 1)
469859aef02SPaolo Bonzini  elif strings.contains(k)
470859aef02SPaolo Bonzini    if not k.startswith('CONFIG_')
471859aef02SPaolo Bonzini      k = 'CONFIG_' + k.to_upper()
472859aef02SPaolo Bonzini    endif
473859aef02SPaolo Bonzini    config_host_data.set_quoted(k, v)
474859aef02SPaolo Bonzini  elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
475859aef02SPaolo Bonzini    config_host_data.set(k, v == 'y' ? 1 : v)
476859aef02SPaolo Bonzini  endif
477859aef02SPaolo Bonziniendforeach
478859aef02SPaolo Bonzinigenh += configure_file(output: 'config-host.h', configuration: config_host_data)
479859aef02SPaolo Bonzini
4802becc36aSPaolo Bonziniminikconf = find_program('scripts/minikconf.py')
481a98006bcSPaolo Bonziniconfig_all_devices = {}
482ca0fc784SPaolo Bonziniconfig_all_disas = {}
4832becc36aSPaolo Bonziniconfig_devices_mak_list = []
4842becc36aSPaolo Bonziniconfig_devices_h = {}
485859aef02SPaolo Bonziniconfig_target_h = {}
4862becc36aSPaolo Bonziniconfig_target_mak = {}
487ca0fc784SPaolo Bonzini
488ca0fc784SPaolo Bonzinidisassemblers = {
489ca0fc784SPaolo Bonzini  'alpha' : ['CONFIG_ALPHA_DIS'],
490ca0fc784SPaolo Bonzini  'arm' : ['CONFIG_ARM_DIS'],
491ca0fc784SPaolo Bonzini  'avr' : ['CONFIG_AVR_DIS'],
492ca0fc784SPaolo Bonzini  'cris' : ['CONFIG_CRIS_DIS'],
493ca0fc784SPaolo Bonzini  'hppa' : ['CONFIG_HPPA_DIS'],
494ca0fc784SPaolo Bonzini  'i386' : ['CONFIG_I386_DIS'],
495ca0fc784SPaolo Bonzini  'x86_64' : ['CONFIG_I386_DIS'],
496ca0fc784SPaolo Bonzini  'x32' : ['CONFIG_I386_DIS'],
497ca0fc784SPaolo Bonzini  'lm32' : ['CONFIG_LM32_DIS'],
498ca0fc784SPaolo Bonzini  'm68k' : ['CONFIG_M68K_DIS'],
499ca0fc784SPaolo Bonzini  'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
500ca0fc784SPaolo Bonzini  'mips' : ['CONFIG_MIPS_DIS'],
501ca0fc784SPaolo Bonzini  'moxie' : ['CONFIG_MOXIE_DIS'],
502ca0fc784SPaolo Bonzini  'nios2' : ['CONFIG_NIOS2_DIS'],
503ca0fc784SPaolo Bonzini  'or1k' : ['CONFIG_OPENRISC_DIS'],
504ca0fc784SPaolo Bonzini  'ppc' : ['CONFIG_PPC_DIS'],
505ca0fc784SPaolo Bonzini  'riscv' : ['CONFIG_RISCV_DIS'],
506ca0fc784SPaolo Bonzini  'rx' : ['CONFIG_RX_DIS'],
507ca0fc784SPaolo Bonzini  's390' : ['CONFIG_S390_DIS'],
508ca0fc784SPaolo Bonzini  'sh4' : ['CONFIG_SH4_DIS'],
509ca0fc784SPaolo Bonzini  'sparc' : ['CONFIG_SPARC_DIS'],
510ca0fc784SPaolo Bonzini  'xtensa' : ['CONFIG_XTENSA_DIS'],
511ca0fc784SPaolo Bonzini}
512ca0fc784SPaolo Bonziniif link_language == 'cpp'
513ca0fc784SPaolo Bonzini  disassemblers += {
514ca0fc784SPaolo Bonzini    'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
515ca0fc784SPaolo Bonzini    'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
516ca0fc784SPaolo Bonzini    'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
517ca0fc784SPaolo Bonzini  }
518ca0fc784SPaolo Bonziniendif
519ca0fc784SPaolo Bonzini
5202becc36aSPaolo Bonzinikconfig_external_symbols = [
5212becc36aSPaolo Bonzini  'CONFIG_KVM',
5222becc36aSPaolo Bonzini  'CONFIG_XEN',
5232becc36aSPaolo Bonzini  'CONFIG_TPM',
5242becc36aSPaolo Bonzini  'CONFIG_SPICE',
5252becc36aSPaolo Bonzini  'CONFIG_IVSHMEM',
5262becc36aSPaolo Bonzini  'CONFIG_OPENGL',
5272becc36aSPaolo Bonzini  'CONFIG_X11',
5282becc36aSPaolo Bonzini  'CONFIG_VHOST_USER',
52940bc0ca9SLaurent Vivier  'CONFIG_VHOST_VDPA',
5302becc36aSPaolo Bonzini  'CONFIG_VHOST_KERNEL',
5312becc36aSPaolo Bonzini  'CONFIG_VIRTFS',
5322becc36aSPaolo Bonzini  'CONFIG_LINUX',
5332becc36aSPaolo Bonzini  'CONFIG_PVRDMA',
5342becc36aSPaolo Bonzini]
535859aef02SPaolo Bonziniignored = ['TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_DIRS']
536ca0fc784SPaolo Bonzini
537a81df1b6SPaolo Bonziniforeach target : target_dirs
538859aef02SPaolo Bonzini  config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak')
539859aef02SPaolo Bonzini
540ca0fc784SPaolo Bonzini  foreach k, v: disassemblers
541ca0fc784SPaolo Bonzini    if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
542ca0fc784SPaolo Bonzini      foreach sym: v
543ca0fc784SPaolo Bonzini        config_target += { sym: 'y' }
544ca0fc784SPaolo Bonzini        config_all_disas += { sym: 'y' }
545ca0fc784SPaolo Bonzini      endforeach
546ca0fc784SPaolo Bonzini    endif
547ca0fc784SPaolo Bonzini  endforeach
548ca0fc784SPaolo Bonzini
549859aef02SPaolo Bonzini  config_target_data = configuration_data()
550859aef02SPaolo Bonzini  foreach k, v: config_target
551859aef02SPaolo Bonzini    if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
552859aef02SPaolo Bonzini      # do nothing
553859aef02SPaolo Bonzini    elif ignored.contains(k)
554859aef02SPaolo Bonzini      # do nothing
555859aef02SPaolo Bonzini    elif k == 'TARGET_BASE_ARCH'
556859aef02SPaolo Bonzini      config_target_data.set('TARGET_' + v.to_upper(), 1)
557859aef02SPaolo Bonzini    elif k == 'TARGET_NAME'
558859aef02SPaolo Bonzini      config_target_data.set_quoted(k, v)
559859aef02SPaolo Bonzini    elif v == 'y'
560859aef02SPaolo Bonzini      config_target_data.set(k, 1)
561859aef02SPaolo Bonzini    else
562859aef02SPaolo Bonzini      config_target_data.set(k, v)
563859aef02SPaolo Bonzini    endif
564859aef02SPaolo Bonzini  endforeach
565859aef02SPaolo Bonzini  config_target_h += {target: configure_file(output: target + '-config-target.h',
566859aef02SPaolo Bonzini                                               configuration: config_target_data)}
5672becc36aSPaolo Bonzini
5682becc36aSPaolo Bonzini  if target.endswith('-softmmu')
5692becc36aSPaolo Bonzini    base_kconfig = []
5702becc36aSPaolo Bonzini    foreach sym : kconfig_external_symbols
571859aef02SPaolo Bonzini      if sym in config_target or sym in config_host
5722becc36aSPaolo Bonzini        base_kconfig += '@0@=y'.format(sym)
5732becc36aSPaolo Bonzini      endif
5742becc36aSPaolo Bonzini    endforeach
5752becc36aSPaolo Bonzini
5762becc36aSPaolo Bonzini    config_devices_mak = target + '-config-devices.mak'
5772becc36aSPaolo Bonzini    config_devices_mak = configure_file(
5782becc36aSPaolo Bonzini      input: ['default-configs' / target + '.mak', 'Kconfig'],
5792becc36aSPaolo Bonzini      output: config_devices_mak,
5802becc36aSPaolo Bonzini      depfile: config_devices_mak + '.d',
5812becc36aSPaolo Bonzini      capture: true,
5822becc36aSPaolo Bonzini      command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
5832becc36aSPaolo Bonzini                config_devices_mak, '@DEPFILE@', '@INPUT@',
5842becc36aSPaolo Bonzini                base_kconfig])
585859aef02SPaolo Bonzini
586859aef02SPaolo Bonzini    config_devices_data = configuration_data()
587859aef02SPaolo Bonzini    config_devices = keyval.load(config_devices_mak)
588859aef02SPaolo Bonzini    foreach k, v: config_devices
589859aef02SPaolo Bonzini      config_devices_data.set(k, 1)
590859aef02SPaolo Bonzini    endforeach
5912becc36aSPaolo Bonzini    config_devices_mak_list += config_devices_mak
592859aef02SPaolo Bonzini    config_devices_h += {target: configure_file(output: target + '-config-devices.h',
593859aef02SPaolo Bonzini                                                configuration: config_devices_data)}
594859aef02SPaolo Bonzini    config_target += config_devices
595a98006bcSPaolo Bonzini    config_all_devices += config_devices
5962becc36aSPaolo Bonzini  endif
5972becc36aSPaolo Bonzini  config_target_mak += {target: config_target}
598a81df1b6SPaolo Bonziniendforeach
599a81df1b6SPaolo Bonzini
6002becc36aSPaolo Bonzini# This configuration is used to build files that are shared by
6012becc36aSPaolo Bonzini# multiple binaries, and then extracted out of the "common"
6022becc36aSPaolo Bonzini# static_library target.
6032becc36aSPaolo Bonzini#
6042becc36aSPaolo Bonzini# We do not use all_sources()/all_dependencies(), because it would
6052becc36aSPaolo Bonzini# build literally all source files, including devices only used by
6062becc36aSPaolo Bonzini# targets that are not built for this compilation.  The CONFIG_ALL
6072becc36aSPaolo Bonzini# pseudo symbol replaces it.
6082becc36aSPaolo Bonzini
6092becc36aSPaolo Bonziniconfig_all = config_all_devices
6102becc36aSPaolo Bonziniconfig_all += config_host
6112becc36aSPaolo Bonziniconfig_all += config_all_disas
6122becc36aSPaolo Bonziniconfig_all += {
6132becc36aSPaolo Bonzini  'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
6142becc36aSPaolo Bonzini  'CONFIG_SOFTMMU': have_system,
6152becc36aSPaolo Bonzini  'CONFIG_USER_ONLY': have_user,
6162becc36aSPaolo Bonzini  'CONFIG_ALL': true,
6172becc36aSPaolo Bonzini}
6182becc36aSPaolo Bonzini
619a81df1b6SPaolo Bonzini# Generators
620a81df1b6SPaolo Bonzini
6213f885659SMarc-André Lureauhxtool = find_program('scripts/hxtool')
622650b5d54SMarc-André Lureaushaderinclude = find_program('scripts/shaderinclude.pl')
623a81df1b6SPaolo Bonziniqapi_gen = find_program('scripts/qapi-gen.py')
624a81df1b6SPaolo Bonziniqapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
625a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/commands.py',
626a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/common.py',
627a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/error.py',
628a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/events.py',
629a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/expr.py',
630a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/gen.py',
631a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/introspect.py',
632a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/parser.py',
633a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/schema.py',
634a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/source.py',
635a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/types.py',
636a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/visit.py',
637a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/common.py',
638a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi-gen.py'
639a81df1b6SPaolo Bonzini]
640a81df1b6SPaolo Bonzini
641a81df1b6SPaolo Bonzinitracetool = [
642a81df1b6SPaolo Bonzini  python, files('scripts/tracetool.py'),
643a81df1b6SPaolo Bonzini   '--backend=' + config_host['TRACE_BACKENDS']
644a81df1b6SPaolo Bonzini]
645a81df1b6SPaolo Bonzini
6462c273f32SMarc-André Lureauqemu_version_cmd = [find_program('scripts/qemu-version.sh'),
6472c273f32SMarc-André Lureau                    meson.current_source_dir(),
648859aef02SPaolo Bonzini                    config_host['PKGVERSION'], meson.project_version()]
6492c273f32SMarc-André Lureauqemu_version = custom_target('qemu-version.h',
6502c273f32SMarc-André Lureau                             output: 'qemu-version.h',
6512c273f32SMarc-André Lureau                             command: qemu_version_cmd,
6522c273f32SMarc-André Lureau                             capture: true,
6532c273f32SMarc-André Lureau                             build_by_default: true,
6542c273f32SMarc-André Lureau                             build_always_stale: true)
6552c273f32SMarc-André Lureaugenh += qemu_version
6562c273f32SMarc-André Lureau
6573f885659SMarc-André Lureauhxdep = []
6583f885659SMarc-André Lureauhx_headers = [
6593f885659SMarc-André Lureau  ['qemu-options.hx', 'qemu-options.def'],
6603f885659SMarc-André Lureau  ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
6613f885659SMarc-André Lureau]
6623f885659SMarc-André Lureauif have_system
6633f885659SMarc-André Lureau  hx_headers += [
6643f885659SMarc-André Lureau    ['hmp-commands.hx', 'hmp-commands.h'],
6653f885659SMarc-André Lureau    ['hmp-commands-info.hx', 'hmp-commands-info.h'],
6663f885659SMarc-André Lureau  ]
6673f885659SMarc-André Lureauendif
6683f885659SMarc-André Lureauforeach d : hx_headers
669b7c70bf2SMarc-André Lureau  hxdep += custom_target(d[1],
6703f885659SMarc-André Lureau                input: files(d[0]),
6713f885659SMarc-André Lureau                output: d[1],
6723f885659SMarc-André Lureau                capture: true,
6733f885659SMarc-André Lureau                build_by_default: true, # to be removed when added to a target
6743f885659SMarc-André Lureau                command: [hxtool, '-h', '@INPUT0@'])
6753f885659SMarc-André Lureauendforeach
6763f885659SMarc-André Lureaugenh += hxdep
6773f885659SMarc-André Lureau
678eb937365SPeter MaydellSPHINX_ARGS = [config_host['SPHINX_BUILD'],
679eb937365SPeter Maydell               '-Dversion=' + meson.project_version(),
680eb937365SPeter Maydell               '-Drelease=' + config_host['PKGVERSION']]
681eb937365SPeter Maydell
682eb937365SPeter Maydellif get_option('werror')
683eb937365SPeter Maydell  SPHINX_ARGS += [ '-W' ]
684eb937365SPeter Maydellendif
685eb937365SPeter Maydell
686b3f4830aSPeter Maydellsphinx_extn_depends = [ meson.source_root() / 'docs/sphinx/depfile.py',
687b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/hxtool.py',
688b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/kerneldoc.py',
689b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/kernellog.py',
690b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/qapidoc.py',
691b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/qmp_lexer.py',
692b3f4830aSPeter Maydell                        qapi_gen_depends ]
693b3f4830aSPeter Maydell
694a81df1b6SPaolo Bonzini# Collect sourcesets.
695a81df1b6SPaolo Bonzini
696a81df1b6SPaolo Bonziniutil_ss = ss.source_set()
697a81df1b6SPaolo Bonzinistub_ss = ss.source_set()
698a81df1b6SPaolo Bonzinitrace_ss = ss.source_set()
6993154fee4SMarc-André Lureaublock_ss = ss.source_set()
7004a96337dSPaolo Bonziniblockdev_ss = ss.source_set()
701ff219dcaSPaolo Bonziniqmp_ss = ss.source_set()
7022becc36aSPaolo Bonzinicommon_ss = ss.source_set()
7032becc36aSPaolo Bonzinisoftmmu_ss = ss.source_set()
7042becc36aSPaolo Bonziniuser_ss = ss.source_set()
7052becc36aSPaolo Bonzinibsd_user_ss = ss.source_set()
7062becc36aSPaolo Bonzinilinux_user_ss = ss.source_set()
7072becc36aSPaolo Bonzinispecific_ss = ss.source_set()
70864ed6f92SPaolo Bonzinispecific_fuzz_ss = ss.source_set()
7092becc36aSPaolo Bonzini
7103154fee4SMarc-André Lureaumodules = {}
7112becc36aSPaolo Bonzinihw_arch = {}
7122becc36aSPaolo Bonzinitarget_arch = {}
7132becc36aSPaolo Bonzinitarget_softmmu_arch = {}
714a81df1b6SPaolo Bonzini
715a81df1b6SPaolo Bonzini###############
716a81df1b6SPaolo Bonzini# Trace files #
717a81df1b6SPaolo Bonzini###############
718a81df1b6SPaolo Bonzini
719c9322ab5SMarc-André Lureau# TODO: add each directory to the subdirs from its own meson.build, once
720c9322ab5SMarc-André Lureau# we have those
721a81df1b6SPaolo Bonzinitrace_events_subdirs = [
722a81df1b6SPaolo Bonzini  'accel/kvm',
723a81df1b6SPaolo Bonzini  'accel/tcg',
724a81df1b6SPaolo Bonzini  'crypto',
725a81df1b6SPaolo Bonzini  'monitor',
726a81df1b6SPaolo Bonzini]
727a81df1b6SPaolo Bonziniif have_user
728a81df1b6SPaolo Bonzini  trace_events_subdirs += [ 'linux-user' ]
729a81df1b6SPaolo Bonziniendif
730a81df1b6SPaolo Bonziniif have_block
731a81df1b6SPaolo Bonzini  trace_events_subdirs += [
732a81df1b6SPaolo Bonzini    'authz',
733a81df1b6SPaolo Bonzini    'block',
734a81df1b6SPaolo Bonzini    'io',
735a81df1b6SPaolo Bonzini    'nbd',
736a81df1b6SPaolo Bonzini    'scsi',
737a81df1b6SPaolo Bonzini  ]
738a81df1b6SPaolo Bonziniendif
739a81df1b6SPaolo Bonziniif have_system
740a81df1b6SPaolo Bonzini  trace_events_subdirs += [
741a81df1b6SPaolo Bonzini    'audio',
742a81df1b6SPaolo Bonzini    'backends',
743a81df1b6SPaolo Bonzini    'backends/tpm',
744a81df1b6SPaolo Bonzini    'chardev',
745a81df1b6SPaolo Bonzini    'hw/9pfs',
746a81df1b6SPaolo Bonzini    'hw/acpi',
747a81df1b6SPaolo Bonzini    'hw/alpha',
748a81df1b6SPaolo Bonzini    'hw/arm',
749a81df1b6SPaolo Bonzini    'hw/audio',
750a81df1b6SPaolo Bonzini    'hw/block',
751a81df1b6SPaolo Bonzini    'hw/block/dataplane',
752a81df1b6SPaolo Bonzini    'hw/char',
753a81df1b6SPaolo Bonzini    'hw/display',
754a81df1b6SPaolo Bonzini    'hw/dma',
755a81df1b6SPaolo Bonzini    'hw/hppa',
756a81df1b6SPaolo Bonzini    'hw/hyperv',
757a81df1b6SPaolo Bonzini    'hw/i2c',
758a81df1b6SPaolo Bonzini    'hw/i386',
759a81df1b6SPaolo Bonzini    'hw/i386/xen',
760a81df1b6SPaolo Bonzini    'hw/ide',
761a81df1b6SPaolo Bonzini    'hw/input',
762a81df1b6SPaolo Bonzini    'hw/intc',
763a81df1b6SPaolo Bonzini    'hw/isa',
764a81df1b6SPaolo Bonzini    'hw/mem',
765a81df1b6SPaolo Bonzini    'hw/mips',
766a81df1b6SPaolo Bonzini    'hw/misc',
767a81df1b6SPaolo Bonzini    'hw/misc/macio',
768a81df1b6SPaolo Bonzini    'hw/net',
769a81df1b6SPaolo Bonzini    'hw/nvram',
770a81df1b6SPaolo Bonzini    'hw/pci',
771a81df1b6SPaolo Bonzini    'hw/pci-host',
772a81df1b6SPaolo Bonzini    'hw/ppc',
773a81df1b6SPaolo Bonzini    'hw/rdma',
774a81df1b6SPaolo Bonzini    'hw/rdma/vmw',
775a81df1b6SPaolo Bonzini    'hw/rtc',
776a81df1b6SPaolo Bonzini    'hw/s390x',
777a81df1b6SPaolo Bonzini    'hw/scsi',
778a81df1b6SPaolo Bonzini    'hw/sd',
779a81df1b6SPaolo Bonzini    'hw/sparc',
780a81df1b6SPaolo Bonzini    'hw/sparc64',
781a81df1b6SPaolo Bonzini    'hw/ssi',
782a81df1b6SPaolo Bonzini    'hw/timer',
783a81df1b6SPaolo Bonzini    'hw/tpm',
784a81df1b6SPaolo Bonzini    'hw/usb',
785a81df1b6SPaolo Bonzini    'hw/vfio',
786a81df1b6SPaolo Bonzini    'hw/virtio',
787a81df1b6SPaolo Bonzini    'hw/watchdog',
788a81df1b6SPaolo Bonzini    'hw/xen',
789a81df1b6SPaolo Bonzini    'hw/gpio',
790a81df1b6SPaolo Bonzini    'migration',
791a81df1b6SPaolo Bonzini    'net',
7928b7a5507SPhilippe Mathieu-Daudé    'softmmu',
793a81df1b6SPaolo Bonzini    'ui',
794a81df1b6SPaolo Bonzini  ]
795a81df1b6SPaolo Bonziniendif
796a81df1b6SPaolo Bonzinitrace_events_subdirs += [
797a81df1b6SPaolo Bonzini  'hw/core',
798a81df1b6SPaolo Bonzini  'qapi',
799a81df1b6SPaolo Bonzini  'qom',
800a81df1b6SPaolo Bonzini  'target/arm',
801a81df1b6SPaolo Bonzini  'target/hppa',
802a81df1b6SPaolo Bonzini  'target/i386',
803a81df1b6SPaolo Bonzini  'target/mips',
804a81df1b6SPaolo Bonzini  'target/ppc',
805a81df1b6SPaolo Bonzini  'target/riscv',
806a81df1b6SPaolo Bonzini  'target/s390x',
807a81df1b6SPaolo Bonzini  'target/sparc',
808a81df1b6SPaolo Bonzini  'util',
809a81df1b6SPaolo Bonzini]
810a81df1b6SPaolo Bonzini
811a81df1b6SPaolo Bonzinisubdir('qapi')
812a81df1b6SPaolo Bonzinisubdir('qobject')
813a81df1b6SPaolo Bonzinisubdir('stubs')
814a81df1b6SPaolo Bonzinisubdir('trace')
815a81df1b6SPaolo Bonzinisubdir('util')
8165582c58fSMarc-André Lureausubdir('qom')
8175582c58fSMarc-André Lureausubdir('authz')
818a81df1b6SPaolo Bonzinisubdir('crypto')
8192d78b56eSMarc-André Lureausubdir('ui')
820a81df1b6SPaolo Bonzini
8213154fee4SMarc-André Lureau
8223154fee4SMarc-André Lureauif enable_modules
8233154fee4SMarc-André Lureau  libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
8243154fee4SMarc-André Lureau  modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
8253154fee4SMarc-André Lureauendif
8263154fee4SMarc-André Lureau
827a81df1b6SPaolo Bonzini# Build targets from sourcesets
828a81df1b6SPaolo Bonzini
8292becc36aSPaolo Bonzinistub_ss = stub_ss.apply(config_all, strict: false)
830a81df1b6SPaolo Bonzini
831a81df1b6SPaolo Bonziniutil_ss.add_all(trace_ss)
8322becc36aSPaolo Bonziniutil_ss = util_ss.apply(config_all, strict: false)
833a81df1b6SPaolo Bonzinilibqemuutil = static_library('qemuutil',
834a81df1b6SPaolo Bonzini                             sources: util_ss.sources() + stub_ss.sources() + genh,
835a81df1b6SPaolo Bonzini                             dependencies: [util_ss.dependencies(), m, glib, socket])
836a81df1b6SPaolo Bonziniqemuutil = declare_dependency(link_with: libqemuutil,
83704c6f1e7SMarc-André Lureau                              sources: genh + version_res)
838a81df1b6SPaolo Bonzini
839abff1abfSPaolo Bonzinidecodetree = generator(find_program('scripts/decodetree.py'),
840abff1abfSPaolo Bonzini                       output: 'decode-@BASENAME@.c.inc',
841abff1abfSPaolo Bonzini                       arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
842abff1abfSPaolo Bonzini
843478e943fSPaolo Bonzinisubdir('audio')
8447fcfd456SMarc-André Lureausubdir('io')
845848e8ff6SMarc-André Lureausubdir('chardev')
846ec0d5893SMarc-André Lureausubdir('fsdev')
847abff1abfSPaolo Bonzinisubdir('libdecnumber')
848d3b18480SMarc-André Lureausubdir('target')
849708eab42SMarc-André Lureausubdir('dump')
850ec0d5893SMarc-André Lureau
8515e5733e5SMarc-André Lureaublock_ss.add(files(
8525e5733e5SMarc-André Lureau  'block.c',
8535e5733e5SMarc-André Lureau  'blockjob.c',
8545e5733e5SMarc-André Lureau  'job.c',
8555e5733e5SMarc-André Lureau  'qemu-io-cmds.c',
8565e5733e5SMarc-André Lureau))
8575e5733e5SMarc-André Lureaublock_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
8585e5733e5SMarc-André Lureau
8595e5733e5SMarc-André Lureausubdir('nbd')
8605e5733e5SMarc-André Lureausubdir('scsi')
8615e5733e5SMarc-André Lureausubdir('block')
8625e5733e5SMarc-André Lureau
8634a96337dSPaolo Bonziniblockdev_ss.add(files(
8644a96337dSPaolo Bonzini  'blockdev.c',
8654a96337dSPaolo Bonzini  'blockdev-nbd.c',
8664a96337dSPaolo Bonzini  'iothread.c',
8674a96337dSPaolo Bonzini  'job-qmp.c',
8684a96337dSPaolo Bonzini))
8694a96337dSPaolo Bonzini
8704a96337dSPaolo Bonzini# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
8714a96337dSPaolo Bonzini# os-win32.c does not
8724a96337dSPaolo Bonziniblockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
8734a96337dSPaolo Bonzinisoftmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
8744a96337dSPaolo Bonzini
8754a96337dSPaolo Bonzinisoftmmu_ss.add_all(blockdev_ss)
8764a96337dSPaolo Bonzinisoftmmu_ss.add(files(
8774a96337dSPaolo Bonzini  'bootdevice.c',
8784a96337dSPaolo Bonzini  'dma-helpers.c',
8794a96337dSPaolo Bonzini  'qdev-monitor.c',
8804a96337dSPaolo Bonzini), sdl)
8814a96337dSPaolo Bonzini
8824a96337dSPaolo Bonzinisoftmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
8834a96337dSPaolo Bonzinisoftmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
8844a96337dSPaolo Bonzinisoftmmu_ss.add(when: ['CONFIG_FDT', fdt],  if_true: [files('device_tree.c')])
8854a96337dSPaolo Bonzini
8864a96337dSPaolo Bonzinicommon_ss.add(files('cpus-common.c'))
8874a96337dSPaolo Bonzini
8885d3ea0e1SPaolo Bonzinisubdir('softmmu')
889c9322ab5SMarc-André Lureau
890c7c91a74SBruce Rogersspecific_ss.add(files('disas.c', 'exec.c', 'gdbstub.c'), capstone, libpmem, libdaxctl)
891c9322ab5SMarc-André Lureauspecific_ss.add(files('exec-vary.c'))
892c9322ab5SMarc-André Lureauspecific_ss.add(when: 'CONFIG_TCG', if_true: files(
893c9322ab5SMarc-André Lureau  'fpu/softfloat.c',
894c9322ab5SMarc-André Lureau  'tcg/optimize.c',
895c9322ab5SMarc-André Lureau  'tcg/tcg-common.c',
896c9322ab5SMarc-André Lureau  'tcg/tcg-op-gvec.c',
897c9322ab5SMarc-André Lureau  'tcg/tcg-op-vec.c',
898c9322ab5SMarc-André Lureau  'tcg/tcg-op.c',
899c9322ab5SMarc-André Lureau  'tcg/tcg.c',
900c9322ab5SMarc-André Lureau))
901c9322ab5SMarc-André Lureauspecific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
902c9322ab5SMarc-André Lureau
903ab318051SMarc-André Lureausubdir('backends')
904c574e161SMarc-André Lureausubdir('disas')
90555166230SMarc-André Lureausubdir('migration')
906ff219dcaSPaolo Bonzinisubdir('monitor')
907cdaf0722SMarc-André Lureausubdir('net')
90817ef2af6SMarc-André Lureausubdir('replay')
909582ea95fSMarc-André Lureausubdir('hw')
9101a82878aSMarc-André Lureausubdir('accel')
911f556b4a1SPaolo Bonzinisubdir('plugins')
912b309c321SMarc-André Lureausubdir('bsd-user')
9133a30446aSMarc-André Lureausubdir('linux-user')
9143a30446aSMarc-André Lureau
915b309c321SMarc-André Lureaubsd_user_ss.add(files('gdbstub.c'))
916b309c321SMarc-André Lureauspecific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
917b309c321SMarc-André Lureau
9183a30446aSMarc-André Lureaulinux_user_ss.add(files('gdbstub.c', 'thunk.c'))
9193a30446aSMarc-André Lureauspecific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
9205d3ea0e1SPaolo Bonzini
921a2ce7dbdSPaolo Bonzini# needed for fuzzing binaries
922a2ce7dbdSPaolo Bonzinisubdir('tests/qtest/libqos')
92364ed6f92SPaolo Bonzinisubdir('tests/qtest/fuzz')
924a2ce7dbdSPaolo Bonzini
9253154fee4SMarc-André Lureaublock_mods = []
9263154fee4SMarc-André Lureausoftmmu_mods = []
9273154fee4SMarc-André Lureauforeach d, list : modules
9283154fee4SMarc-André Lureau  foreach m, module_ss : list
9293154fee4SMarc-André Lureau    if enable_modules and targetos != 'windows'
9303e292c51SGerd Hoffmann      module_ss = module_ss.apply(config_all, strict: false)
9313154fee4SMarc-André Lureau      sl = static_library(d + '-' + m, [genh, module_ss.sources()],
9323154fee4SMarc-André Lureau                          dependencies: [modulecommon, module_ss.dependencies()], pic: true)
9333154fee4SMarc-André Lureau      if d == 'block'
9343154fee4SMarc-André Lureau        block_mods += sl
9353154fee4SMarc-André Lureau      else
9363154fee4SMarc-André Lureau        softmmu_mods += sl
9373154fee4SMarc-André Lureau      endif
9383154fee4SMarc-André Lureau    else
9393154fee4SMarc-André Lureau      if d == 'block'
9403154fee4SMarc-André Lureau        block_ss.add_all(module_ss)
9413154fee4SMarc-André Lureau      else
9423154fee4SMarc-André Lureau        softmmu_ss.add_all(module_ss)
9433154fee4SMarc-André Lureau      endif
9443154fee4SMarc-André Lureau    endif
9453154fee4SMarc-André Lureau  endforeach
9463154fee4SMarc-André Lureauendforeach
9473154fee4SMarc-André Lureau
9483154fee4SMarc-André Lureaunm = find_program('nm')
949604f3e4eSYonggang Luoundefsym = find_program('scripts/undefsym.py')
9503154fee4SMarc-André Lureaublock_syms = custom_target('block.syms', output: 'block.syms',
9513154fee4SMarc-André Lureau                             input: [libqemuutil, block_mods],
9523154fee4SMarc-André Lureau                             capture: true,
9533154fee4SMarc-André Lureau                             command: [undefsym, nm, '@INPUT@'])
9543154fee4SMarc-André Lureauqemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
9553154fee4SMarc-André Lureau                             input: [libqemuutil, softmmu_mods],
9563154fee4SMarc-André Lureau                             capture: true,
9573154fee4SMarc-André Lureau                             command: [undefsym, nm, '@INPUT@'])
9583154fee4SMarc-André Lureau
9595e5733e5SMarc-André Lureaublock_ss = block_ss.apply(config_host, strict: false)
9605e5733e5SMarc-André Lureaulibblock = static_library('block', block_ss.sources() + genh,
9615e5733e5SMarc-André Lureau                          dependencies: block_ss.dependencies(),
9625e5733e5SMarc-André Lureau                          link_depends: block_syms,
9635e5733e5SMarc-André Lureau                          name_suffix: 'fa',
9645e5733e5SMarc-André Lureau                          build_by_default: false)
9655e5733e5SMarc-André Lureau
9665e5733e5SMarc-André Lureaublock = declare_dependency(link_whole: [libblock],
967b7c70bf2SMarc-André Lureau                           link_args: '@block.syms',
968b7c70bf2SMarc-André Lureau                           dependencies: [crypto, io])
9695e5733e5SMarc-André Lureau
970ff219dcaSPaolo Bonziniqmp_ss = qmp_ss.apply(config_host, strict: false)
971ff219dcaSPaolo Bonzinilibqmp = static_library('qmp', qmp_ss.sources() + genh,
972ff219dcaSPaolo Bonzini                        dependencies: qmp_ss.dependencies(),
973ff219dcaSPaolo Bonzini                        name_suffix: 'fa',
974ff219dcaSPaolo Bonzini                        build_by_default: false)
975ff219dcaSPaolo Bonzini
976ff219dcaSPaolo Bonziniqmp = declare_dependency(link_whole: [libqmp])
977ff219dcaSPaolo Bonzini
9783154fee4SMarc-André Lureauforeach m : block_mods + softmmu_mods
9793154fee4SMarc-André Lureau  shared_module(m.name(),
9803154fee4SMarc-André Lureau                name_prefix: '',
9813154fee4SMarc-André Lureau                link_whole: m,
9823154fee4SMarc-André Lureau                install: true,
9833154fee4SMarc-André Lureau                install_dir: config_host['qemu_moddir'])
9843154fee4SMarc-André Lureauendforeach
9853154fee4SMarc-André Lureau
98664ed6f92SPaolo Bonzinisoftmmu_ss.add(authz, block, chardev, crypto, io, qmp)
98764ed6f92SPaolo Bonzinicommon_ss.add(qom, qemuutil)
98864ed6f92SPaolo Bonzini
98964ed6f92SPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
9902becc36aSPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
9912becc36aSPaolo Bonzini
9922becc36aSPaolo Bonzinicommon_all = common_ss.apply(config_all, strict: false)
9932becc36aSPaolo Bonzinicommon_all = static_library('common',
9942becc36aSPaolo Bonzini                            build_by_default: false,
9952becc36aSPaolo Bonzini                            sources: common_all.sources() + genh,
9962becc36aSPaolo Bonzini                            dependencies: common_all.dependencies(),
9972becc36aSPaolo Bonzini                            name_suffix: 'fa')
9982becc36aSPaolo Bonzini
999c9322ab5SMarc-André Lureaufeature_to_c = find_program('scripts/feature_to_c.sh')
1000c9322ab5SMarc-André Lureau
100164ed6f92SPaolo Bonziniemulators = []
10022becc36aSPaolo Bonziniforeach target : target_dirs
10032becc36aSPaolo Bonzini  config_target = config_target_mak[target]
10042becc36aSPaolo Bonzini  target_name = config_target['TARGET_NAME']
10052becc36aSPaolo Bonzini  arch = config_target['TARGET_BASE_ARCH']
1006859aef02SPaolo Bonzini  arch_srcs = [config_target_h[target]]
100764ed6f92SPaolo Bonzini  arch_deps = []
100864ed6f92SPaolo Bonzini  c_args = ['-DNEED_CPU_H',
100964ed6f92SPaolo Bonzini            '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
101064ed6f92SPaolo Bonzini            '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
101164ed6f92SPaolo Bonzini  link_args = []
10122becc36aSPaolo Bonzini
1013859aef02SPaolo Bonzini  config_target += config_host
10142becc36aSPaolo Bonzini  target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
10152becc36aSPaolo Bonzini  if targetos == 'linux'
10162becc36aSPaolo Bonzini    target_inc += include_directories('linux-headers', is_system: true)
10172becc36aSPaolo Bonzini  endif
10182becc36aSPaolo Bonzini  if target.endswith('-softmmu')
10192becc36aSPaolo Bonzini    qemu_target_name = 'qemu-system-' + target_name
10202becc36aSPaolo Bonzini    target_type='system'
1021abff1abfSPaolo Bonzini    t = target_softmmu_arch[arch].apply(config_target, strict: false)
1022abff1abfSPaolo Bonzini    arch_srcs += t.sources()
102364ed6f92SPaolo Bonzini    arch_deps += t.dependencies()
1024abff1abfSPaolo Bonzini
10252c44220dSMarc-André Lureau    hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
10262c44220dSMarc-André Lureau    hw = hw_arch[hw_dir].apply(config_target, strict: false)
10272c44220dSMarc-André Lureau    arch_srcs += hw.sources()
102864ed6f92SPaolo Bonzini    arch_deps += hw.dependencies()
10292c44220dSMarc-André Lureau
10302becc36aSPaolo Bonzini    arch_srcs += config_devices_h[target]
103164ed6f92SPaolo Bonzini    link_args += ['@block.syms', '@qemu.syms']
10322becc36aSPaolo Bonzini  else
10333a30446aSMarc-André Lureau    abi = config_target['TARGET_ABI_DIR']
10342becc36aSPaolo Bonzini    target_type='user'
10352becc36aSPaolo Bonzini    qemu_target_name = 'qemu-' + target_name
10362becc36aSPaolo Bonzini    if 'CONFIG_LINUX_USER' in config_target
10372becc36aSPaolo Bonzini      base_dir = 'linux-user'
10382becc36aSPaolo Bonzini      target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
10392becc36aSPaolo Bonzini    else
10402becc36aSPaolo Bonzini      base_dir = 'bsd-user'
10412becc36aSPaolo Bonzini    endif
10422becc36aSPaolo Bonzini    target_inc += include_directories(
10432becc36aSPaolo Bonzini      base_dir,
10443a30446aSMarc-André Lureau      base_dir / abi,
10452becc36aSPaolo Bonzini    )
10463a30446aSMarc-André Lureau    if 'CONFIG_LINUX_USER' in config_target
10473a30446aSMarc-André Lureau      dir = base_dir / abi
10483a30446aSMarc-André Lureau      arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
10493a30446aSMarc-André Lureau      if config_target.has_key('TARGET_SYSTBL_ABI')
10503a30446aSMarc-André Lureau        arch_srcs += \
10513a30446aSMarc-André Lureau          syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
10523a30446aSMarc-André Lureau                                             extra_args : config_target['TARGET_SYSTBL_ABI'])
10533a30446aSMarc-André Lureau      endif
10543a30446aSMarc-André Lureau    endif
10552becc36aSPaolo Bonzini  endif
10562becc36aSPaolo Bonzini
1057c9322ab5SMarc-André Lureau  if 'TARGET_XML_FILES' in config_target
1058c9322ab5SMarc-André Lureau    gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1059c9322ab5SMarc-André Lureau                                output: target + '-gdbstub-xml.c',
1060c9322ab5SMarc-André Lureau                                input: files(config_target['TARGET_XML_FILES'].split()),
1061c9322ab5SMarc-André Lureau                                command: [feature_to_c, '@INPUT@'],
1062c9322ab5SMarc-André Lureau                                capture: true)
1063c9322ab5SMarc-André Lureau    arch_srcs += gdbstub_xml
1064c9322ab5SMarc-André Lureau  endif
1065c9322ab5SMarc-André Lureau
1066abff1abfSPaolo Bonzini  t = target_arch[arch].apply(config_target, strict: false)
1067abff1abfSPaolo Bonzini  arch_srcs += t.sources()
106864ed6f92SPaolo Bonzini  arch_deps += t.dependencies()
1069abff1abfSPaolo Bonzini
10702becc36aSPaolo Bonzini  target_common = common_ss.apply(config_target, strict: false)
10712becc36aSPaolo Bonzini  objects = common_all.extract_objects(target_common.sources())
107264ed6f92SPaolo Bonzini  deps = target_common.dependencies()
10732becc36aSPaolo Bonzini
10742becc36aSPaolo Bonzini  target_specific = specific_ss.apply(config_target, strict: false)
10752becc36aSPaolo Bonzini  arch_srcs += target_specific.sources()
107664ed6f92SPaolo Bonzini  arch_deps += target_specific.dependencies()
10772becc36aSPaolo Bonzini
107864ed6f92SPaolo Bonzini  lib = static_library('qemu-' + target,
1079859aef02SPaolo Bonzini                 sources: arch_srcs + genh,
1080b7612f45SPaolo Bonzini                 dependencies: arch_deps,
10812becc36aSPaolo Bonzini                 objects: objects,
10822becc36aSPaolo Bonzini                 include_directories: target_inc,
108364ed6f92SPaolo Bonzini                 c_args: c_args,
108464ed6f92SPaolo Bonzini                 build_by_default: false,
10852becc36aSPaolo Bonzini                 name_suffix: 'fa')
108664ed6f92SPaolo Bonzini
108764ed6f92SPaolo Bonzini  if target.endswith('-softmmu')
108864ed6f92SPaolo Bonzini    execs = [{
108964ed6f92SPaolo Bonzini      'name': 'qemu-system-' + target_name,
109064ed6f92SPaolo Bonzini      'gui': false,
109164ed6f92SPaolo Bonzini      'sources': files('softmmu/main.c'),
109264ed6f92SPaolo Bonzini      'dependencies': []
109364ed6f92SPaolo Bonzini    }]
109435be72baSPaolo Bonzini    if targetos == 'windows' and (sdl.found() or gtk.found())
109564ed6f92SPaolo Bonzini      execs += [{
109664ed6f92SPaolo Bonzini        'name': 'qemu-system-' + target_name + 'w',
109764ed6f92SPaolo Bonzini        'gui': true,
109864ed6f92SPaolo Bonzini        'sources': files('softmmu/main.c'),
109964ed6f92SPaolo Bonzini        'dependencies': []
110064ed6f92SPaolo Bonzini      }]
110164ed6f92SPaolo Bonzini    endif
110264ed6f92SPaolo Bonzini    if config_host.has_key('CONFIG_FUZZ')
110364ed6f92SPaolo Bonzini      specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
110464ed6f92SPaolo Bonzini      execs += [{
110564ed6f92SPaolo Bonzini        'name': 'qemu-fuzz-' + target_name,
110664ed6f92SPaolo Bonzini        'gui': false,
110764ed6f92SPaolo Bonzini        'sources': specific_fuzz.sources(),
110864ed6f92SPaolo Bonzini        'dependencies': specific_fuzz.dependencies(),
110964ed6f92SPaolo Bonzini      }]
111064ed6f92SPaolo Bonzini    endif
111164ed6f92SPaolo Bonzini  else
111264ed6f92SPaolo Bonzini    execs = [{
111364ed6f92SPaolo Bonzini      'name': 'qemu-' + target_name,
111464ed6f92SPaolo Bonzini      'gui': false,
111564ed6f92SPaolo Bonzini      'sources': [],
111664ed6f92SPaolo Bonzini      'dependencies': []
111764ed6f92SPaolo Bonzini    }]
111864ed6f92SPaolo Bonzini  endif
111964ed6f92SPaolo Bonzini  foreach exe: execs
112064ed6f92SPaolo Bonzini    emulators += executable(exe['name'], exe['sources'],
112164ed6f92SPaolo Bonzini               install: true,
112264ed6f92SPaolo Bonzini               c_args: c_args,
112364ed6f92SPaolo Bonzini               dependencies: arch_deps + deps + exe['dependencies'],
112464ed6f92SPaolo Bonzini               objects: lib.extract_all_objects(recursive: true),
112564ed6f92SPaolo Bonzini               link_language: link_language,
112664ed6f92SPaolo Bonzini               link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
112764ed6f92SPaolo Bonzini               link_args: link_args,
112864ed6f92SPaolo Bonzini               gui_app: exe['gui'])
112910e1d263SMarc-André Lureau
113010e1d263SMarc-André Lureau    if 'CONFIG_TRACE_SYSTEMTAP' in config_host
113110e1d263SMarc-André Lureau      foreach stp: [
1132bd5f973aSStefan Hajnoczi        {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1133bd5f973aSStefan Hajnoczi        {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
113410e1d263SMarc-André Lureau        {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
113510e1d263SMarc-André Lureau        {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
113610e1d263SMarc-André Lureau      ]
1137bd5f973aSStefan Hajnoczi        custom_target(exe['name'] + stp['ext'],
113810e1d263SMarc-André Lureau                      input: trace_events_all,
1139bd5f973aSStefan Hajnoczi                      output: exe['name'] + stp['ext'],
114010e1d263SMarc-André Lureau                      capture: true,
114110e1d263SMarc-André Lureau                      install: stp['install'],
1142ab4c0996SMarc-André Lureau                      install_dir: qemu_datadir / '../systemtap/tapset',
114310e1d263SMarc-André Lureau                      command: [
114410e1d263SMarc-André Lureau                        tracetool, '--group=all', '--format=' + stp['fmt'],
114510e1d263SMarc-André Lureau                        '--binary=' + stp['bin'],
114610e1d263SMarc-André Lureau                        '--target-name=' + target_name,
114710e1d263SMarc-André Lureau                        '--target-type=' + target_type,
114810e1d263SMarc-André Lureau                        '--probe-prefix=qemu.' + target_type + '.' + target_name,
114910e1d263SMarc-André Lureau                        '@INPUT@',
115010e1d263SMarc-André Lureau                      ])
115110e1d263SMarc-André Lureau      endforeach
115210e1d263SMarc-André Lureau    endif
115364ed6f92SPaolo Bonzini  endforeach
11542becc36aSPaolo Bonziniendforeach
11552becc36aSPaolo Bonzini
1156931049b4SPaolo Bonzini# Other build targets
1157897b5afaSMarc-André Lureau
1158f556b4a1SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host
1159f556b4a1SPaolo Bonzini  install_headers('include/qemu/qemu-plugin.h')
1160f556b4a1SPaolo Bonziniendif
1161f556b4a1SPaolo Bonzini
1162f15bff25SPaolo Bonziniif 'CONFIG_GUEST_AGENT' in config_host
1163f15bff25SPaolo Bonzini  subdir('qga')
1164f15bff25SPaolo Bonziniendif
1165f15bff25SPaolo Bonzini
11669755c94aSLaurent Vivier# Don't build qemu-keymap if xkbcommon is not explicitly enabled
11679755c94aSLaurent Vivier# when we don't build tools or system
11684113f4cfSLaurent Vivierif xkbcommon.found()
116928742467SMarc-André Lureau  # used for the update-keymaps target, so include rules even if !have_tools
117028742467SMarc-André Lureau  qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
117128742467SMarc-André Lureau                           dependencies: [qemuutil, xkbcommon], install: have_tools)
117228742467SMarc-André Lureauendif
117328742467SMarc-André Lureau
11748855e8f0SPhilippe Mathieu-Daudéqemu_block_tools = []
1175931049b4SPaolo Bonziniif have_tools
1176b7c70bf2SMarc-André Lureau  qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1177b7c70bf2SMarc-André Lureau             dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1178b7c70bf2SMarc-André Lureau  qemu_io = executable('qemu-io', files('qemu-io.c'),
1179b7c70bf2SMarc-André Lureau             dependencies: [block, qemuutil], install: true)
1180b7c70bf2SMarc-André Lureau  qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
1181b7c70bf2SMarc-André Lureau               dependencies: [block, qemuutil], install: true)
1182b7c70bf2SMarc-André Lureau
11837c58bb76SPaolo Bonzini  subdir('storage-daemon')
1184a9c9727cSPaolo Bonzini  subdir('contrib/rdmacm-mux')
11851d7bb6abSMarc-André Lureau  subdir('contrib/elf2dmp')
1186a9c9727cSPaolo Bonzini
1187157e7b13SMarc-André Lureau  executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1188157e7b13SMarc-André Lureau             dependencies: qemuutil,
1189157e7b13SMarc-André Lureau             install: true)
1190157e7b13SMarc-André Lureau
1191931049b4SPaolo Bonzini  if 'CONFIG_VHOST_USER' in config_host
1192931049b4SPaolo Bonzini    subdir('contrib/libvhost-user')
11932d7ac0afSPaolo Bonzini    subdir('contrib/vhost-user-blk')
1194ea458960SMarc-André Lureau    subdir('contrib/vhost-user-gpu')
119532fcc624SMarc-André Lureau    subdir('contrib/vhost-user-input')
119699650b62SPaolo Bonzini    subdir('contrib/vhost-user-scsi')
1197931049b4SPaolo Bonzini  endif
11988f51e01cSMarc-André Lureau
11998f51e01cSMarc-André Lureau  if targetos == 'linux'
12008f51e01cSMarc-André Lureau    executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
12018f51e01cSMarc-André Lureau               dependencies: [qemuutil, libcap_ng],
12028f51e01cSMarc-André Lureau               install: true,
12038f51e01cSMarc-André Lureau               install_dir: get_option('libexecdir'))
1204897b5afaSMarc-André Lureau
1205897b5afaSMarc-André Lureau    executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1206897b5afaSMarc-André Lureau               dependencies: [authz, crypto, io, qom, qemuutil,
1207897b5afaSMarc-André Lureau                              libcap_ng, libudev, libmpathpersist],
1208897b5afaSMarc-André Lureau               install: true)
12098f51e01cSMarc-André Lureau  endif
12108f51e01cSMarc-André Lureau
12115ee24e78SMarc-André Lureau  if 'CONFIG_IVSHMEM' in config_host
12125ee24e78SMarc-André Lureau    subdir('contrib/ivshmem-client')
12135ee24e78SMarc-André Lureau    subdir('contrib/ivshmem-server')
12145ee24e78SMarc-André Lureau  endif
1215931049b4SPaolo Bonziniendif
1216931049b4SPaolo Bonzini
1217f5aa6320SMarc-André Lureausubdir('scripts')
12183f99cf57SPaolo Bonzinisubdir('tools')
1219bdcbea7aSMarc-André Lureausubdir('pc-bios')
1220ce1c1e7aSPaolo Bonzinisubdir('tests')
1221f8aa24eaSPaolo Bonzinisubdir('docs')
1222e8f3bd71SMarc-André Lureauif 'CONFIG_GTK' in config_host
1223e8f3bd71SMarc-André Lureau  subdir('po')
1224e8f3bd71SMarc-André Lureauendif
12253f99cf57SPaolo Bonzini
12268adfeba9SMarc-André Lureauif host_machine.system() == 'windows'
12278adfeba9SMarc-André Lureau  nsis_cmd = [
12288adfeba9SMarc-André Lureau    find_program('scripts/nsis.py'),
12298adfeba9SMarc-André Lureau    '@OUTPUT@',
12308adfeba9SMarc-André Lureau    get_option('prefix'),
12318adfeba9SMarc-André Lureau    meson.current_source_dir(),
12328adfeba9SMarc-André Lureau    host_machine.cpu_family(),
12338adfeba9SMarc-André Lureau    '--',
12348adfeba9SMarc-André Lureau    '-DDISPLAYVERSION=' + meson.project_version(),
12358adfeba9SMarc-André Lureau  ]
12368adfeba9SMarc-André Lureau  if build_docs
12378adfeba9SMarc-André Lureau    nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
12388adfeba9SMarc-André Lureau  endif
12398adfeba9SMarc-André Lureau  if 'CONFIG_GTK' in config_host
12408adfeba9SMarc-André Lureau    nsis_cmd += '-DCONFIG_GTK=y'
12418adfeba9SMarc-André Lureau  endif
12428adfeba9SMarc-André Lureau
12438adfeba9SMarc-André Lureau  nsis = custom_target('nsis',
12448adfeba9SMarc-André Lureau                       output: 'qemu-setup-' + meson.project_version() + '.exe',
12458adfeba9SMarc-André Lureau                       input: files('qemu.nsi'),
12468adfeba9SMarc-André Lureau                       build_always_stale: true,
12478adfeba9SMarc-André Lureau                       command: nsis_cmd + ['@INPUT@'])
12488adfeba9SMarc-André Lureau  alias_target('installer', nsis)
12498adfeba9SMarc-André Lureauendif
12508adfeba9SMarc-André Lureau
1251f9332757SPaolo Bonzinisummary_info = {}
1252f9332757SPaolo Bonzinisummary_info += {'Install prefix':    config_host['prefix']}
1253f9332757SPaolo Bonzinisummary_info += {'BIOS directory':    config_host['qemu_datadir']}
1254f9332757SPaolo Bonzinisummary_info += {'firmware path':     config_host['qemu_firmwarepath']}
1255f9332757SPaolo Bonzinisummary_info += {'binary directory':  config_host['bindir']}
1256f9332757SPaolo Bonzinisummary_info += {'library directory': config_host['libdir']}
1257f9332757SPaolo Bonzinisummary_info += {'module directory':  config_host['qemu_moddir']}
1258f9332757SPaolo Bonzinisummary_info += {'libexec directory': config_host['libexecdir']}
1259f9332757SPaolo Bonzinisummary_info += {'include directory': config_host['includedir']}
1260f9332757SPaolo Bonzinisummary_info += {'config directory':  config_host['sysconfdir']}
1261f9332757SPaolo Bonziniif targetos != 'windows'
1262f9332757SPaolo Bonzini  summary_info += {'local state directory': config_host['qemu_localstatedir']}
1263b81efab7SMarc-André Lureau  summary_info += {'Manual directory':      get_option('mandir')}
1264f9332757SPaolo Bonzinielse
1265f9332757SPaolo Bonzini  summary_info += {'local state directory': 'queried at runtime'}
1266f9332757SPaolo Bonziniendif
1267491e74c1SMarc-André Lureausummary_info += {'Doc directory':     get_option('docdir')}
1268f9332757SPaolo Bonzinisummary_info += {'Build directory':   meson.current_build_dir()}
1269f9332757SPaolo Bonzinisummary_info += {'Source path':       meson.current_source_dir()}
1270f9332757SPaolo Bonzinisummary_info += {'GIT binary':        config_host['GIT']}
1271f9332757SPaolo Bonzinisummary_info += {'GIT submodules':    config_host['GIT_SUBMODULES']}
1272f9332757SPaolo Bonzinisummary_info += {'C compiler':        meson.get_compiler('c').cmd_array()[0]}
1273f9332757SPaolo Bonzinisummary_info += {'Host C compiler':   meson.get_compiler('c', native: true).cmd_array()[0]}
1274f9332757SPaolo Bonziniif link_language == 'cpp'
1275f9332757SPaolo Bonzini  summary_info += {'C++ compiler':      meson.get_compiler('cpp').cmd_array()[0]}
1276f9332757SPaolo Bonzinielse
1277f9332757SPaolo Bonzini  summary_info += {'C++ compiler':      false}
1278f9332757SPaolo Bonziniendif
1279f9332757SPaolo Bonziniif targetos == 'darwin'
1280f9332757SPaolo Bonzini  summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1281f9332757SPaolo Bonziniendif
1282f9332757SPaolo Bonzinisummary_info += {'ARFLAGS':           config_host['ARFLAGS']}
1283f9332757SPaolo Bonzinisummary_info += {'CFLAGS':            config_host['CFLAGS']}
1284f9332757SPaolo Bonzinisummary_info += {'QEMU_CFLAGS':       config_host['QEMU_CFLAGS']}
1285f9332757SPaolo Bonzinisummary_info += {'QEMU_LDFLAGS':      config_host['QEMU_LDFLAGS']}
1286f9332757SPaolo Bonzinisummary_info += {'make':              config_host['MAKE']}
1287f9332757SPaolo Bonzinisummary_info += {'python':            '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1288f9332757SPaolo Bonzinisummary_info += {'sphinx-build':      config_host['SPHINX_BUILD']}
1289f9332757SPaolo Bonzinisummary_info += {'genisoimage':       config_host['GENISOIMAGE']}
1290f9332757SPaolo Bonzini# TODO: add back version
1291f9332757SPaolo Bonzinisummary_info += {'slirp support':     config_host.has_key('CONFIG_SLIRP')}
1292f9332757SPaolo Bonziniif config_host.has_key('CONFIG_SLIRP')
1293f9332757SPaolo Bonzini  summary_info += {'smbd':            config_host['CONFIG_SMBD_COMMAND']}
1294f9332757SPaolo Bonziniendif
1295f9332757SPaolo Bonzinisummary_info += {'module support':    config_host.has_key('CONFIG_MODULES')}
1296f9332757SPaolo Bonziniif config_host.has_key('CONFIG_MODULES')
1297f9332757SPaolo Bonzini  summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1298f9332757SPaolo Bonziniendif
1299f9332757SPaolo Bonzinisummary_info += {'host CPU':          cpu}
1300f9332757SPaolo Bonzinisummary_info += {'host endianness':   build_machine.endian()}
1301f9332757SPaolo Bonzinisummary_info += {'target list':       config_host['TARGET_DIRS']}
1302f9332757SPaolo Bonzinisummary_info += {'gprof enabled':     config_host.has_key('CONFIG_GPROF')}
1303f9332757SPaolo Bonzinisummary_info += {'sparse enabled':    meson.get_compiler('c').cmd_array().contains('cgcc')}
1304f9332757SPaolo Bonzinisummary_info += {'strip binaries':    get_option('strip')}
1305f9332757SPaolo Bonzinisummary_info += {'profiler':          config_host.has_key('CONFIG_PROFILER')}
13063e8529ddSLaurent Viviersummary_info += {'static build':      config_host.has_key('CONFIG_STATIC')}
1307f9332757SPaolo Bonziniif targetos == 'darwin'
1308f9332757SPaolo Bonzini  summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1309f9332757SPaolo Bonziniendif
1310f9332757SPaolo Bonzini# TODO: add back version
131135be72baSPaolo Bonzinisummary_info += {'SDL support':       sdl.found()}
131235be72baSPaolo Bonzinisummary_info += {'SDL image support': sdl_image.found()}
1313f9332757SPaolo Bonzini# TODO: add back version
1314f9332757SPaolo Bonzinisummary_info += {'GTK support':       config_host.has_key('CONFIG_GTK')}
1315f9332757SPaolo Bonzinisummary_info += {'GTK GL support':    config_host.has_key('CONFIG_GTK_GL')}
1316b7612f45SPaolo Bonzinisummary_info += {'pixman':            pixman.found()}
1317f9332757SPaolo Bonzini# TODO: add back version
1318f9332757SPaolo Bonzinisummary_info += {'VTE support':       config_host.has_key('CONFIG_VTE')}
1319f9332757SPaolo Bonzinisummary_info += {'TLS priority':      config_host['CONFIG_TLS_PRIORITY']}
1320f9332757SPaolo Bonzinisummary_info += {'GNUTLS support':    config_host.has_key('CONFIG_GNUTLS')}
1321f9332757SPaolo Bonzini# TODO: add back version
1322f9332757SPaolo Bonzinisummary_info += {'libgcrypt':         config_host.has_key('CONFIG_GCRYPT')}
1323f9332757SPaolo Bonziniif config_host.has_key('CONFIG_GCRYPT')
1324f9332757SPaolo Bonzini   summary_info += {'  hmac':            config_host.has_key('CONFIG_GCRYPT_HMAC')}
1325f9332757SPaolo Bonzini   summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1326f9332757SPaolo Bonziniendif
1327f9332757SPaolo Bonzini# TODO: add back version
1328f9332757SPaolo Bonzinisummary_info += {'nettle':            config_host.has_key('CONFIG_NETTLE')}
1329f9332757SPaolo Bonziniif config_host.has_key('CONFIG_NETTLE')
1330f9332757SPaolo Bonzini   summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1331f9332757SPaolo Bonziniendif
1332f9332757SPaolo Bonzinisummary_info += {'libtasn1':          config_host.has_key('CONFIG_TASN1')}
1333f9332757SPaolo Bonzinisummary_info += {'PAM':               config_host.has_key('CONFIG_AUTH_PAM')}
1334f9332757SPaolo Bonzinisummary_info += {'iconv support':     config_host.has_key('CONFIG_ICONV')}
1335f9332757SPaolo Bonzinisummary_info += {'curses support':    config_host.has_key('CONFIG_CURSES')}
1336f9332757SPaolo Bonzini# TODO: add back version
1337f9332757SPaolo Bonzinisummary_info += {'virgl support':     config_host.has_key('CONFIG_VIRGL')}
1338f9332757SPaolo Bonzinisummary_info += {'curl support':      config_host.has_key('CONFIG_CURL')}
1339f9332757SPaolo Bonzinisummary_info += {'mingw32 support':   targetos == 'windows'}
1340f9332757SPaolo Bonzinisummary_info += {'Audio drivers':     config_host['CONFIG_AUDIO_DRIVERS']}
1341f9332757SPaolo Bonzinisummary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1342f9332757SPaolo Bonzinisummary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1343f9332757SPaolo Bonzinisummary_info += {'VirtFS support':    config_host.has_key('CONFIG_VIRTFS')}
1344f9332757SPaolo Bonzinisummary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
1345a0b93237SPaolo Bonzinisummary_info += {'VNC support':       vnc.found()}
1346a0b93237SPaolo Bonziniif vnc.found()
1347a0b93237SPaolo Bonzini  summary_info += {'VNC SASL support':  sasl.found()}
1348a0b93237SPaolo Bonzini  summary_info += {'VNC JPEG support':  jpeg.found()}
1349a0b93237SPaolo Bonzini  summary_info += {'VNC PNG support':   png.found()}
1350f9332757SPaolo Bonziniendif
1351f9332757SPaolo Bonzinisummary_info += {'xen support':       config_host.has_key('CONFIG_XEN_BACKEND')}
1352f9332757SPaolo Bonziniif config_host.has_key('CONFIG_XEN_BACKEND')
1353f9332757SPaolo Bonzini  summary_info += {'xen ctrl version':  config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1354f9332757SPaolo Bonziniendif
1355f9332757SPaolo Bonzinisummary_info += {'brlapi support':    config_host.has_key('CONFIG_BRLAPI')}
1356f9332757SPaolo Bonzinisummary_info += {'Documentation':     config_host.has_key('BUILD_DOCS')}
1357f9332757SPaolo Bonzinisummary_info += {'PIE':               get_option('b_pie')}
1358f9332757SPaolo Bonzinisummary_info += {'vde support':       config_host.has_key('CONFIG_VDE')}
1359f9332757SPaolo Bonzinisummary_info += {'netmap support':    config_host.has_key('CONFIG_NETMAP')}
1360f9332757SPaolo Bonzinisummary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1361f9332757SPaolo Bonzinisummary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1362f9332757SPaolo Bonzinisummary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1363f9332757SPaolo Bonzinisummary_info += {'Install blobs':     config_host.has_key('INSTALL_BLOBS')}
1364f9332757SPaolo Bonzini# TODO: add back KVM/HAX/HVF/WHPX/TCG
1365f9332757SPaolo Bonzini#summary_info += {'KVM support':       have_kvm'}
1366f9332757SPaolo Bonzini#summary_info += {'HAX support':       have_hax'}
1367f9332757SPaolo Bonzini#summary_info += {'HVF support':       have_hvf'}
1368f9332757SPaolo Bonzini#summary_info += {'WHPX support':      have_whpx'}
1369f9332757SPaolo Bonzini#summary_info += {'TCG support':       have_tcg'}
1370f9332757SPaolo Bonzini#if get_option('tcg')
1371f9332757SPaolo Bonzini#  summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1372f9332757SPaolo Bonzini#  summary_info += {'TCG interpreter':   config_host.has_key('CONFIG_TCG_INTERPRETER')}
1373f9332757SPaolo Bonzini#endif
1374f9332757SPaolo Bonzinisummary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
1375f9332757SPaolo Bonzinisummary_info += {'RDMA support':      config_host.has_key('CONFIG_RDMA')}
1376f9332757SPaolo Bonzinisummary_info += {'PVRDMA support':    config_host.has_key('CONFIG_PVRDMA')}
1377f9332757SPaolo Bonzinisummary_info += {'fdt support':       config_host.has_key('CONFIG_FDT')}
1378f9332757SPaolo Bonzinisummary_info += {'membarrier':        config_host.has_key('CONFIG_MEMBARRIER')}
1379f9332757SPaolo Bonzinisummary_info += {'preadv support':    config_host.has_key('CONFIG_PREADV')}
1380f9332757SPaolo Bonzinisummary_info += {'fdatasync':         config_host.has_key('CONFIG_FDATASYNC')}
1381f9332757SPaolo Bonzinisummary_info += {'madvise':           config_host.has_key('CONFIG_MADVISE')}
1382f9332757SPaolo Bonzinisummary_info += {'posix_madvise':     config_host.has_key('CONFIG_POSIX_MADVISE')}
1383f9332757SPaolo Bonzinisummary_info += {'posix_memalign':    config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1384f9332757SPaolo Bonzinisummary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1385f9332757SPaolo Bonzinisummary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1386f9332757SPaolo Bonzinisummary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1387f9332757SPaolo Bonzinisummary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1388f9332757SPaolo Bonzinisummary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1389f9332757SPaolo Bonzinisummary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1390f9332757SPaolo Bonzinisummary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1391f9332757SPaolo Bonzinisummary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1392f9332757SPaolo Bonzinisummary_info += {'Trace backends':    config_host['TRACE_BACKENDS']}
1393f9332757SPaolo Bonziniif config_host['TRACE_BACKENDS'].split().contains('simple')
1394f9332757SPaolo Bonzini  summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1395f9332757SPaolo Bonziniendif
1396f9332757SPaolo Bonzini# TODO: add back protocol and server version
1397f9332757SPaolo Bonzinisummary_info += {'spice support':     config_host.has_key('CONFIG_SPICE')}
1398f9332757SPaolo Bonzinisummary_info += {'rbd support':       config_host.has_key('CONFIG_RBD')}
1399f9332757SPaolo Bonzinisummary_info += {'xfsctl support':    config_host.has_key('CONFIG_XFS')}
1400f9332757SPaolo Bonzinisummary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
14010a40bcb7SCésar Belleysummary_info += {'U2F support':       u2f.found()}
1402f9332757SPaolo Bonzinisummary_info += {'libusb':            config_host.has_key('CONFIG_USB_LIBUSB')}
1403f9332757SPaolo Bonzinisummary_info += {'usb net redir':     config_host.has_key('CONFIG_USB_REDIR')}
1404f9332757SPaolo Bonzinisummary_info += {'OpenGL support':    config_host.has_key('CONFIG_OPENGL')}
1405f9332757SPaolo Bonzinisummary_info += {'OpenGL dmabufs':    config_host.has_key('CONFIG_OPENGL_DMABUF')}
1406f9332757SPaolo Bonzinisummary_info += {'libiscsi support':  config_host.has_key('CONFIG_LIBISCSI')}
1407f9332757SPaolo Bonzinisummary_info += {'libnfs support':    config_host.has_key('CONFIG_LIBNFS')}
1408f9332757SPaolo Bonzinisummary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1409f9332757SPaolo Bonziniif targetos == 'windows'
1410f9332757SPaolo Bonzini  if 'WIN_SDK' in config_host
1411f9332757SPaolo Bonzini    summary_info += {'Windows SDK':       config_host['WIN_SDK']}
1412f9332757SPaolo Bonzini  endif
1413f9332757SPaolo Bonzini  summary_info += {'QGA VSS support':   config_host.has_key('CONFIG_QGA_VSS')}
1414f9332757SPaolo Bonzini  summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1415f9332757SPaolo Bonzini  summary_info += {'QGA MSI support':   config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1416f9332757SPaolo Bonziniendif
1417f9332757SPaolo Bonzinisummary_info += {'seccomp support':   config_host.has_key('CONFIG_SECCOMP')}
1418f9332757SPaolo Bonzinisummary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1419f9332757SPaolo Bonzinisummary_info += {'coroutine pool':    config_host['CONFIG_COROUTINE_POOL'] == '1'}
1420f9332757SPaolo Bonzinisummary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1421f9332757SPaolo Bonzinisummary_info += {'mutex debugging':   config_host.has_key('CONFIG_DEBUG_MUTEX')}
1422f9332757SPaolo Bonzinisummary_info += {'crypto afalg':      config_host.has_key('CONFIG_AF_ALG')}
1423f9332757SPaolo Bonzinisummary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1424bf0e56a3SMarc-André Lureausummary_info += {'gcov':              get_option('b_coverage')}
1425f9332757SPaolo Bonzinisummary_info += {'TPM support':       config_host.has_key('CONFIG_TPM')}
1426f9332757SPaolo Bonzinisummary_info += {'libssh support':    config_host.has_key('CONFIG_LIBSSH')}
1427f9332757SPaolo Bonzinisummary_info += {'QOM debugging':     config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1428f9332757SPaolo Bonzinisummary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1429f9332757SPaolo Bonzinisummary_info += {'lzo support':       config_host.has_key('CONFIG_LZO')}
1430f9332757SPaolo Bonzinisummary_info += {'snappy support':    config_host.has_key('CONFIG_SNAPPY')}
1431f9332757SPaolo Bonzinisummary_info += {'bzip2 support':     config_host.has_key('CONFIG_BZIP2')}
1432f9332757SPaolo Bonzinisummary_info += {'lzfse support':     config_host.has_key('CONFIG_LZFSE')}
1433f9332757SPaolo Bonzinisummary_info += {'zstd support':      config_host.has_key('CONFIG_ZSTD')}
1434f9332757SPaolo Bonzinisummary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1435f9332757SPaolo Bonzinisummary_info += {'libxml2':           config_host.has_key('CONFIG_LIBXML2')}
1436f9332757SPaolo Bonzinisummary_info += {'tcmalloc support':  config_host.has_key('CONFIG_TCMALLOC')}
1437f9332757SPaolo Bonzinisummary_info += {'jemalloc support':  config_host.has_key('CONFIG_JEMALLOC')}
1438f9332757SPaolo Bonzinisummary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1439f9332757SPaolo Bonzinisummary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1440f9332757SPaolo Bonzinisummary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1441f9332757SPaolo Bonzinisummary_info += {'bochs support':     config_host.has_key('CONFIG_BOCHS')}
1442f9332757SPaolo Bonzinisummary_info += {'cloop support':     config_host.has_key('CONFIG_CLOOP')}
1443f9332757SPaolo Bonzinisummary_info += {'dmg support':       config_host.has_key('CONFIG_DMG')}
1444f9332757SPaolo Bonzinisummary_info += {'qcow v1 support':   config_host.has_key('CONFIG_QCOW1')}
1445f9332757SPaolo Bonzinisummary_info += {'vdi support':       config_host.has_key('CONFIG_VDI')}
1446f9332757SPaolo Bonzinisummary_info += {'vvfat support':     config_host.has_key('CONFIG_VVFAT')}
1447f9332757SPaolo Bonzinisummary_info += {'qed support':       config_host.has_key('CONFIG_QED')}
1448f9332757SPaolo Bonzinisummary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1449f9332757SPaolo Bonzinisummary_info += {'sheepdog support':  config_host.has_key('CONFIG_SHEEPDOG')}
1450f9332757SPaolo Bonzinisummary_info += {'capstone':          config_host.has_key('CONFIG_CAPSTONE')}
1451f9332757SPaolo Bonzinisummary_info += {'libpmem support':   config_host.has_key('CONFIG_LIBPMEM')}
1452f9332757SPaolo Bonzinisummary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1453f9332757SPaolo Bonzinisummary_info += {'libudev':           config_host.has_key('CONFIG_LIBUDEV')}
1454f9332757SPaolo Bonzinisummary_info += {'default devices':   config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1455f9332757SPaolo Bonzinisummary_info += {'plugin support':    config_host.has_key('CONFIG_PLUGIN')}
1456f9332757SPaolo Bonzinisummary_info += {'fuzzing support':   config_host.has_key('CONFIG_FUZZ')}
1457f9332757SPaolo Bonziniif config_host.has_key('HAVE_GDB_BIN')
1458f9332757SPaolo Bonzini  summary_info += {'gdb':             config_host['HAVE_GDB_BIN']}
1459f9332757SPaolo Bonziniendif
1460f9332757SPaolo Bonzinisummary_info += {'thread sanitizer':  config_host.has_key('CONFIG_TSAN')}
1461f9332757SPaolo Bonzinisummary_info += {'rng-none':          config_host.has_key('CONFIG_RNG_NONE')}
1462f9332757SPaolo Bonzinisummary_info += {'Linux keyring':     config_host.has_key('CONFIG_SECRET_KEYRING')}
1463f9332757SPaolo Bonzinisummary(summary_info, bool_yn: true)
1464f9332757SPaolo Bonzini
1465f9332757SPaolo Bonziniif not supported_cpus.contains(cpu)
1466f9332757SPaolo Bonzini  message()
1467f9332757SPaolo Bonzini  warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1468f9332757SPaolo Bonzini  message()
1469f9332757SPaolo Bonzini  message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1470f9332757SPaolo Bonzini  message('The QEMU project intends to remove support for this host CPU in')
1471f9332757SPaolo Bonzini  message('a future release if nobody volunteers to maintain it and to')
1472f9332757SPaolo Bonzini  message('provide a build host for our continuous integration setup.')
1473f9332757SPaolo Bonzini  message('configure has succeeded and you can continue to build, but')
1474f9332757SPaolo Bonzini  message('if you care about QEMU on this platform you should contact')
1475f9332757SPaolo Bonzini  message('us upstream at qemu-devel@nongnu.org.')
1476f9332757SPaolo Bonziniendif
1477f9332757SPaolo Bonzini
1478f9332757SPaolo Bonziniif not supported_oses.contains(targetos)
1479f9332757SPaolo Bonzini  message()
1480f9332757SPaolo Bonzini  warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1481f9332757SPaolo Bonzini  message()
1482f9332757SPaolo Bonzini  message('Host OS ' + targetos + 'support is not currently maintained.')
1483f9332757SPaolo Bonzini  message('The QEMU project intends to remove support for this host OS in')
1484f9332757SPaolo Bonzini  message('a future release if nobody volunteers to maintain it and to')
1485f9332757SPaolo Bonzini  message('provide a build host for our continuous integration setup.')
1486f9332757SPaolo Bonzini  message('configure has succeeded and you can continue to build, but')
1487f9332757SPaolo Bonzini  message('if you care about QEMU on this platform you should contact')
1488f9332757SPaolo Bonzini  message('us upstream at qemu-devel@nongnu.org.')
1489f9332757SPaolo Bonziniendif
1490