meson: move summary to meson.build
[qemu.git] / meson.build
1 project('qemu', ['c'], meson_version: '>=0.55.0',
2         default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11', 'b_lundef=false'],
3         version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
4
5 not_found = dependency('', required: false)
6 keyval = import('unstable-keyval')
7 config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
8
9 add_project_arguments(config_host['QEMU_CFLAGS'].split(),
10                       native: false, language: ['c', 'objc'])
11 add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
12                       native: false, language: 'cpp')
13 add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
14                            native: false, language: ['c', 'cpp', 'objc'])
15 add_project_arguments(config_host['QEMU_INCLUDES'].split(),
16                       language: ['c', 'cpp', 'objc'])
17
18 python = import('python').find_installation()
19
20 link_language = meson.get_external_property('link_language', 'cpp')
21 if link_language == 'cpp'
22   add_languages('cpp', required: true, native: false)
23 endif
24 if host_machine.system() == 'darwin'
25   add_languages('objc', required: false, native: false)
26 endif
27
28 configure_file(input: files('scripts/ninjatool.py'),
29                output: 'ninjatool',
30                configuration: config_host)
31
32 supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
33 supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
34   'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
35
36 cpu = host_machine.cpu_family()
37 targetos = host_machine.system()
38
39 summary_info = {}
40 summary_info += {'Install prefix':    config_host['prefix']}
41 summary_info += {'BIOS directory':    config_host['qemu_datadir']}
42 summary_info += {'firmware path':     config_host['qemu_firmwarepath']}
43 summary_info += {'binary directory':  config_host['bindir']}
44 summary_info += {'library directory': config_host['libdir']}
45 summary_info += {'module directory':  config_host['qemu_moddir']}
46 summary_info += {'libexec directory': config_host['libexecdir']}
47 summary_info += {'include directory': config_host['includedir']}
48 summary_info += {'config directory':  config_host['sysconfdir']}
49 if targetos != 'windows'
50   summary_info += {'local state directory': config_host['qemu_localstatedir']}
51   summary_info += {'Manual directory':      config_host['mandir']}
52 else
53   summary_info += {'local state directory': 'queried at runtime'}
54 endif
55 summary_info += {'Build directory':   meson.current_build_dir()}
56 summary_info += {'Source path':       meson.current_source_dir()}
57 summary_info += {'GIT binary':        config_host['GIT']}
58 summary_info += {'GIT submodules':    config_host['GIT_SUBMODULES']}
59 summary_info += {'C compiler':        meson.get_compiler('c').cmd_array()[0]}
60 summary_info += {'Host C compiler':   meson.get_compiler('c', native: true).cmd_array()[0]}
61 if link_language == 'cpp'
62   summary_info += {'C++ compiler':      meson.get_compiler('cpp').cmd_array()[0]}
63 else
64   summary_info += {'C++ compiler':      false}
65 endif
66 if targetos == 'darwin'
67   summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
68 endif
69 summary_info += {'ARFLAGS':           config_host['ARFLAGS']}
70 summary_info += {'CFLAGS':            config_host['CFLAGS']}
71 summary_info += {'QEMU_CFLAGS':       config_host['QEMU_CFLAGS']}
72 summary_info += {'QEMU_LDFLAGS':      config_host['QEMU_LDFLAGS']}
73 summary_info += {'make':              config_host['MAKE']}
74 summary_info += {'install':           config_host['INSTALL']}
75 summary_info += {'python':            '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
76 summary_info += {'sphinx-build':      config_host['SPHINX_BUILD']}
77 summary_info += {'genisoimage':       config_host['GENISOIMAGE']}
78 # TODO: add back version
79 summary_info += {'slirp support':     config_host.has_key('CONFIG_SLIRP')}
80 if config_host.has_key('CONFIG_SLIRP')
81   summary_info += {'smbd':            config_host['CONFIG_SMBD_COMMAND']}
82 endif
83 summary_info += {'module support':    config_host.has_key('CONFIG_MODULES')}
84 if config_host.has_key('CONFIG_MODULES')
85   summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
86 endif
87 summary_info += {'host CPU':          cpu}
88 summary_info += {'host endianness':   build_machine.endian()}
89 summary_info += {'target list':       config_host['TARGET_DIRS']}
90 summary_info += {'gprof enabled':     config_host.has_key('CONFIG_GPROF')}
91 summary_info += {'sparse enabled':    meson.get_compiler('c').cmd_array().contains('cgcc')}
92 summary_info += {'strip binaries':    get_option('strip')}
93 summary_info += {'profiler':          config_host.has_key('CONFIG_PROFILER')}
94 summary_info += {'static build':      config_host.has_key('CONFIG_TOOLS')}
95 if targetos == 'darwin'
96   summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
97 endif
98 # TODO: add back version
99 summary_info += {'SDL support':       config_host.has_key('CONFIG_SDL')}
100 summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
101 # TODO: add back version
102 summary_info += {'GTK support':       config_host.has_key('CONFIG_GTK')}
103 summary_info += {'GTK GL support':    config_host.has_key('CONFIG_GTK_GL')}
104 # TODO: add back version
105 summary_info += {'VTE support':       config_host.has_key('CONFIG_VTE')}
106 summary_info += {'TLS priority':      config_host['CONFIG_TLS_PRIORITY']}
107 summary_info += {'GNUTLS support':    config_host.has_key('CONFIG_GNUTLS')}
108 # TODO: add back version
109 summary_info += {'libgcrypt':         config_host.has_key('CONFIG_GCRYPT')}
110 if config_host.has_key('CONFIG_GCRYPT')
111    summary_info += {'  hmac':            config_host.has_key('CONFIG_GCRYPT_HMAC')}
112    summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
113 endif
114 # TODO: add back version
115 summary_info += {'nettle':            config_host.has_key('CONFIG_NETTLE')}
116 if config_host.has_key('CONFIG_NETTLE')
117    summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
118 endif
119 summary_info += {'libtasn1':          config_host.has_key('CONFIG_TASN1')}
120 summary_info += {'PAM':               config_host.has_key('CONFIG_AUTH_PAM')}
121 summary_info += {'iconv support':     config_host.has_key('CONFIG_ICONV')}
122 summary_info += {'curses support':    config_host.has_key('CONFIG_CURSES')}
123 # TODO: add back version
124 summary_info += {'virgl support':     config_host.has_key('CONFIG_VIRGL')}
125 summary_info += {'curl support':      config_host.has_key('CONFIG_CURL')}
126 summary_info += {'mingw32 support':   targetos == 'windows'}
127 summary_info += {'Audio drivers':     config_host['CONFIG_AUDIO_DRIVERS']}
128 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
129 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
130 summary_info += {'VirtFS support':    config_host.has_key('CONFIG_VIRTFS')}
131 summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
132 summary_info += {'VNC support':       config_host.has_key('CONFIG_VNC')}
133 if config_host.has_key('CONFIG_VNC')
134   summary_info += {'VNC SASL support':  config_host.has_key('CONFIG_VNC_SASL')}
135   summary_info += {'VNC JPEG support':  config_host.has_key('CONFIG_VNC_JPEG')}
136   summary_info += {'VNC PNG support':   config_host.has_key('CONFIG_VNC_PNG')}
137 endif
138 summary_info += {'xen support':       config_host.has_key('CONFIG_XEN_BACKEND')}
139 if config_host.has_key('CONFIG_XEN_BACKEND')
140   summary_info += {'xen ctrl version':  config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
141 endif
142 summary_info += {'brlapi support':    config_host.has_key('CONFIG_BRLAPI')}
143 summary_info += {'Documentation':     config_host.has_key('BUILD_DOCS')}
144 summary_info += {'PIE':               get_option('b_pie')}
145 summary_info += {'vde support':       config_host.has_key('CONFIG_VDE')}
146 summary_info += {'netmap support':    config_host.has_key('CONFIG_NETMAP')}
147 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
148 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
149 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
150 summary_info += {'Install blobs':     config_host.has_key('INSTALL_BLOBS')}
151 # TODO: add back KVM/HAX/HVF/WHPX/TCG
152 #summary_info += {'KVM support':       have_kvm'}
153 #summary_info += {'HAX support':       have_hax'}
154 #summary_info += {'HVF support':       have_hvf'}
155 #summary_info += {'WHPX support':      have_whpx'}
156 #summary_info += {'TCG support':       have_tcg'}
157 #if get_option('tcg')
158 #  summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
159 #  summary_info += {'TCG interpreter':   config_host.has_key('CONFIG_TCG_INTERPRETER')}
160 #endif
161 summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
162 summary_info += {'RDMA support':      config_host.has_key('CONFIG_RDMA')}
163 summary_info += {'PVRDMA support':    config_host.has_key('CONFIG_PVRDMA')}
164 summary_info += {'fdt support':       config_host.has_key('CONFIG_FDT')}
165 summary_info += {'membarrier':        config_host.has_key('CONFIG_MEMBARRIER')}
166 summary_info += {'preadv support':    config_host.has_key('CONFIG_PREADV')}
167 summary_info += {'fdatasync':         config_host.has_key('CONFIG_FDATASYNC')}
168 summary_info += {'madvise':           config_host.has_key('CONFIG_MADVISE')}
169 summary_info += {'posix_madvise':     config_host.has_key('CONFIG_POSIX_MADVISE')}
170 summary_info += {'posix_memalign':    config_host.has_key('CONFIG_POSIX_MEMALIGN')}
171 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
172 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
173 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
174 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
175 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
176 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
177 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
178 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
179 summary_info += {'Trace backends':    config_host['TRACE_BACKENDS']}
180 if config_host['TRACE_BACKENDS'].split().contains('simple')
181   summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
182 endif
183 # TODO: add back protocol and server version
184 summary_info += {'spice support':     config_host.has_key('CONFIG_SPICE')}
185 summary_info += {'rbd support':       config_host.has_key('CONFIG_RBD')}
186 summary_info += {'xfsctl support':    config_host.has_key('CONFIG_XFS')}
187 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
188 summary_info += {'libusb':            config_host.has_key('CONFIG_USB_LIBUSB')}
189 summary_info += {'usb net redir':     config_host.has_key('CONFIG_USB_REDIR')}
190 summary_info += {'OpenGL support':    config_host.has_key('CONFIG_OPENGL')}
191 summary_info += {'OpenGL dmabufs':    config_host.has_key('CONFIG_OPENGL_DMABUF')}
192 summary_info += {'libiscsi support':  config_host.has_key('CONFIG_LIBISCSI')}
193 summary_info += {'libnfs support':    config_host.has_key('CONFIG_LIBNFS')}
194 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
195 if targetos == 'windows'
196   if 'WIN_SDK' in config_host
197     summary_info += {'Windows SDK':       config_host['WIN_SDK']}
198   endif
199   summary_info += {'QGA VSS support':   config_host.has_key('CONFIG_QGA_VSS')}
200   summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
201   summary_info += {'QGA MSI support':   config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
202 endif
203 summary_info += {'seccomp support':   config_host.has_key('CONFIG_SECCOMP')}
204 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
205 summary_info += {'coroutine pool':    config_host['CONFIG_COROUTINE_POOL'] == '1'}
206 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
207 summary_info += {'mutex debugging':   config_host.has_key('CONFIG_DEBUG_MUTEX')}
208 summary_info += {'crypto afalg':      config_host.has_key('CONFIG_AF_ALG')}
209 summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
210 summary_info += {'gcov':              config_host.has_key('CONFIG_GCOV')}
211 summary_info += {'TPM support':       config_host.has_key('CONFIG_TPM')}
212 summary_info += {'libssh support':    config_host.has_key('CONFIG_LIBSSH')}
213 summary_info += {'QOM debugging':     config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
214 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
215 summary_info += {'lzo support':       config_host.has_key('CONFIG_LZO')}
216 summary_info += {'snappy support':    config_host.has_key('CONFIG_SNAPPY')}
217 summary_info += {'bzip2 support':     config_host.has_key('CONFIG_BZIP2')}
218 summary_info += {'lzfse support':     config_host.has_key('CONFIG_LZFSE')}
219 summary_info += {'zstd support':      config_host.has_key('CONFIG_ZSTD')}
220 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
221 summary_info += {'libxml2':           config_host.has_key('CONFIG_LIBXML2')}
222 summary_info += {'tcmalloc support':  config_host.has_key('CONFIG_TCMALLOC')}
223 summary_info += {'jemalloc support':  config_host.has_key('CONFIG_JEMALLOC')}
224 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
225 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
226 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
227 summary_info += {'bochs support':     config_host.has_key('CONFIG_BOCHS')}
228 summary_info += {'cloop support':     config_host.has_key('CONFIG_CLOOP')}
229 summary_info += {'dmg support':       config_host.has_key('CONFIG_DMG')}
230 summary_info += {'qcow v1 support':   config_host.has_key('CONFIG_QCOW1')}
231 summary_info += {'vdi support':       config_host.has_key('CONFIG_VDI')}
232 summary_info += {'vvfat support':     config_host.has_key('CONFIG_VVFAT')}
233 summary_info += {'qed support':       config_host.has_key('CONFIG_QED')}
234 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
235 summary_info += {'sheepdog support':  config_host.has_key('CONFIG_SHEEPDOG')}
236 summary_info += {'capstone':          config_host.has_key('CONFIG_CAPSTONE')}
237 summary_info += {'libpmem support':   config_host.has_key('CONFIG_LIBPMEM')}
238 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
239 summary_info += {'libudev':           config_host.has_key('CONFIG_LIBUDEV')}
240 summary_info += {'default devices':   config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
241 summary_info += {'plugin support':    config_host.has_key('CONFIG_PLUGIN')}
242 summary_info += {'fuzzing support':   config_host.has_key('CONFIG_FUZZ')}
243 if config_host.has_key('HAVE_GDB_BIN')
244   summary_info += {'gdb':             config_host['HAVE_GDB_BIN']}
245 endif
246 summary_info += {'thread sanitizer':  config_host.has_key('CONFIG_TSAN')}
247 summary_info += {'rng-none':          config_host.has_key('CONFIG_RNG_NONE')}
248 summary_info += {'Linux keyring':     config_host.has_key('CONFIG_SECRET_KEYRING')}
249 summary(summary_info, bool_yn: true)
250
251 if not supported_cpus.contains(cpu)
252   message()
253   warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
254   message()
255   message('CPU host architecture ' + cpu + ' support is not currently maintained.')
256   message('The QEMU project intends to remove support for this host CPU in')
257   message('a future release if nobody volunteers to maintain it and to')
258   message('provide a build host for our continuous integration setup.')
259   message('configure has succeeded and you can continue to build, but')
260   message('if you care about QEMU on this platform you should contact')
261   message('us upstream at qemu-devel@nongnu.org.')
262 endif
263
264 if not supported_oses.contains(targetos)
265   message()
266   warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
267   message()
268   message('Host OS ' + targetos + 'support is not currently maintained.')
269   message('The QEMU project intends to remove support for this host OS in')
270   message('a future release if nobody volunteers to maintain it and to')
271   message('provide a build host for our continuous integration setup.')
272   message('configure has succeeded and you can continue to build, but')
273   message('if you care about QEMU on this platform you should contact')
274   message('us upstream at qemu-devel@nongnu.org.')
275 endif