blob: 448a8dd2a4ba77ed125b862ad8eaed88fe112d1c [file] [log] [blame]
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001project('qemu', ['c'], meson_version: '>=0.59.3',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01002 default_options: ['warning_level=1', 'c_std=gnu11', 'cpp_std=gnu++11', 'b_colorout=auto',
Paolo Bonzini3d2f73e2021-02-11 06:15:12 -05003 'b_staticpic=false', 'stdsplit=false'],
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004 version: files('VERSION'))
Paolo Bonzinia5665052019-06-10 12:05:14 +02005
Thomas Huthe2870722022-03-10 08:50:48 +01006add_test_setup('quick', exclude_suites: ['slow', 'thorough'], is_default: true)
7add_test_setup('slow', exclude_suites: ['thorough'], env: ['G_TEST_SLOW=1', 'SPEED=slow'])
8add_test_setup('thorough', env: ['G_TEST_SLOW=1', 'SPEED=thorough'])
Paolo Bonzini3d2f73e2021-02-11 06:15:12 -05009
Paolo Bonzinia5665052019-06-10 12:05:14 +020010not_found = dependency('', required: false)
Paolo Bonzini654d6b02021-02-09 14:59:26 +010011keyval = import('keyval')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040012ss = import('sourceset')
Richard Henderson8b18cdb2020-09-13 12:19:25 -070013fs = import('fs')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040014
Paolo Bonzinice1c1e72020-01-28 16:41:44 +010015sh = find_program('sh')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040016cc = meson.get_compiler('c')
Paolo Bonzinia5665052019-06-10 12:05:14 +020017config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
Marc-André Lureau3154fee2019-08-29 22:07:01 +040018enable_modules = 'CONFIG_MODULES' in config_host
Paolo Bonzini35be72b2020-02-06 14:17:15 +010019enable_static = 'CONFIG_STATIC' in config_host
Yonggang Luoe3667662020-10-16 06:06:25 +080020
Paolo Bonzinid7dedf42021-01-26 11:15:33 +010021# Allow both shared and static libraries unless --enable-static
22static_kwargs = enable_static ? {'static': true} : {}
23
Yonggang Luoe3667662020-10-16 06:06:25 +080024# Temporary directory used for files created while
25# configure runs. Since it is in the build directory
26# we can safely blow away any previous version of it
27# (and we need not jump through hoops to try to delete
28# it when configure exits.)
29tmpdir = meson.current_build_dir() / 'meson-private/temp'
Marc-André Lureau8fe11232020-09-11 14:42:48 +020030
31if get_option('qemu_suffix').startswith('/')
32 error('qemu_suffix cannot start with a /')
33endif
34
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040035qemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
Marc-André Lureauab4c0992020-08-26 15:04:16 +040036qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
Marc-André Lureau491e74c2020-08-26 15:04:17 +040037qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040038qemu_moddir = get_option('libdir') / get_option('qemu_suffix')
39
40qemu_desktopdir = get_option('datadir') / 'applications'
41qemu_icondir = get_option('datadir') / 'icons'
42
Paolo Bonzini859aef02020-08-04 18:14:26 +020043config_host_data = configuration_data()
44genh = []
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +010045qapi_trace_events = []
Paolo Bonzinia5665052019-06-10 12:05:14 +020046
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +020047bsd_oses = ['gnu/kfreebsd', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'darwin']
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040048supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
Richard Hendersonba0e7332021-09-17 11:08:09 -070049supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv', 'x86', 'x86_64',
WANG Xueruidfcf9002021-12-21 13:41:04 +080050 'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc', 'sparc64']
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040051
52cpu = host_machine.cpu_family()
Richard Hendersonc94c2392021-11-16 10:50:42 +010053
54# Unify riscv* to a single family.
55if cpu in ['riscv32', 'riscv64']
56 cpu = 'riscv'
57endif
58
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040059targetos = host_machine.system()
60
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +020061target_dirs = config_host['TARGET_DIRS'].split()
62have_linux_user = false
63have_bsd_user = false
64have_system = false
65foreach target : target_dirs
66 have_linux_user = have_linux_user or target.endswith('linux-user')
67 have_bsd_user = have_bsd_user or target.endswith('bsd-user')
68 have_system = have_system or target.endswith('-softmmu')
69endforeach
70have_user = have_linux_user or have_bsd_user
71have_tools = get_option('tools') \
72 .disable_auto_if(not have_system) \
73 .allowed()
74have_ga = get_option('guest_agent') \
75 .disable_auto_if(not have_system and not have_tools) \
76 .require(targetos in ['sunos', 'linux', 'windows'],
77 error_message: 'unsupported OS for QEMU guest agent') \
78 .allowed()
79have_block = have_system or have_tools
80
81python = import('python').find_installation()
82
Paolo Bonzini823eb012021-11-08 14:18:17 +010083if cpu not in supported_cpus
84 host_arch = 'unknown'
85elif cpu == 'x86'
86 host_arch = 'i386'
Richard Henderson0e3ed772021-12-31 05:25:11 +000087elif cpu == 'mips64'
88 host_arch = 'mips'
Paolo Bonzini823eb012021-11-08 14:18:17 +010089else
90 host_arch = cpu
91endif
92
Paolo Bonzini8a199802020-09-18 05:37:01 -040093if cpu in ['x86', 'x86_64']
94 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
95elif cpu == 'aarch64'
96 kvm_targets = ['aarch64-softmmu']
97elif cpu == 's390x'
98 kvm_targets = ['s390x-softmmu']
99elif cpu in ['ppc', 'ppc64']
100 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
Huacai Chenfbc58842020-10-07 16:39:28 +0800101elif cpu in ['mips', 'mips64']
102 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Yifei Jiangfbf43c72022-01-12 16:13:29 +0800103elif cpu in ['riscv']
104 kvm_targets = ['riscv32-softmmu', 'riscv64-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -0400105else
106 kvm_targets = []
107endif
108
Igor Mammedov44d3d892021-10-27 11:10:12 -0400109kvm_targets_c = '""'
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100110if get_option('kvm').allowed() and targetos == 'linux'
Igor Mammedove741aff2021-09-02 07:35:38 -0400111 kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
112endif
113config_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
114
Paolo Bonzini8a199802020-09-18 05:37:01 -0400115accelerator_targets = { 'CONFIG_KVM': kvm_targets }
Alexander Graf844a06b2021-09-16 17:54:02 +0200116
117if cpu in ['aarch64']
118 accelerator_targets += {
119 'CONFIG_HVF': ['aarch64-softmmu']
120 }
121endif
122
Alex Bennée0c3e41d2020-11-10 19:23:09 +0000123if cpu in ['x86', 'x86_64', 'arm', 'aarch64']
Marc-André Lureau2a2d51b2021-09-14 16:30:45 +0400124 # i386 emulator provides xenpv machine type for multiple architectures
Alex Bennée0c3e41d2020-11-10 19:23:09 +0000125 accelerator_targets += {
126 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
127 }
128endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400129if cpu in ['x86', 'x86_64']
130 accelerator_targets += {
131 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -0400132 'CONFIG_HVF': ['x86_64-softmmu'],
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200133 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -0400134 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
135 }
136endif
137
Paolo Bonzinia1b176f2021-07-12 14:22:08 +0200138modular_tcg = []
139# Darwin does not support references to thread-local variables in modules
140if targetos != 'darwin'
141 modular_tcg = ['i386-softmmu', 'x86_64-softmmu']
142endif
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +0200143
Philippe Mathieu-Daudéeae9a1d2021-01-14 18:45:08 +0100144edk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ]
Paolo Bonzinie49c0ef2021-09-23 06:55:28 -0400145unpack_edk2_blobs = false
146foreach target : edk2_targets
147 if target in target_dirs
148 bzip2 = find_program('bzip2', required: get_option('install_blobs'))
149 unpack_edk2_blobs = bzip2.found()
150 break
151 endif
152endforeach
Philippe Mathieu-Daudé45b545d2021-01-14 18:45:09 +0100153
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200154dtrace = not_found
155stap = not_found
156if 'dtrace' in get_option('trace_backends')
157 dtrace = find_program('dtrace', required: true)
158 stap = find_program('stap', required: false)
159 if stap.found()
160 # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
161 # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
162 # instead. QEMU --enable-modules depends on this because the SystemTap
163 # semaphores are linked into the main binary and not the module's shared
164 # object.
165 add_global_arguments('-DSTAP_SDT_V2',
166 native: false, language: ['c', 'cpp', 'objc'])
167 endif
168endif
169
Paolo Bonzini40c909f2022-04-20 17:33:49 +0200170if get_option('iasl') == ''
171 iasl = find_program('iasl', required: false)
172else
173 iasl = find_program(get_option('iasl'), required: true)
174endif
175
Paolo Bonzini201e8ed2020-09-01 07:45:54 -0400176##################
177# Compiler flags #
178##################
179
Paolo Bonzini8cc2d232021-11-08 12:36:29 +0100180qemu_cflags = config_host['QEMU_CFLAGS'].split()
181qemu_cxxflags = config_host['QEMU_CXXFLAGS'].split()
Philippe Mathieu-Daudé4cb37d12022-02-15 16:15:13 +0100182qemu_objcflags = config_host['QEMU_OBJCFLAGS'].split()
Paolo Bonzini8cc2d232021-11-08 12:36:29 +0100183qemu_ldflags = config_host['QEMU_LDFLAGS'].split()
184
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +0200185if get_option('gprof')
186 qemu_cflags += ['-p']
187 qemu_cxxflags += ['-p']
Philippe Mathieu-Daudé4cb37d12022-02-15 16:15:13 +0100188 qemu_objcflags += ['-p']
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +0200189 qemu_ldflags += ['-p']
190endif
191
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400192# Specify linker-script with add_project_link_arguments so that it is not placed
193# within a linker --start-group/--end-group pair
Paolo Bonzini537b7242021-10-07 15:08:12 +0200194if get_option('fuzzing')
195 add_project_link_arguments(['-Wl,-T,',
196 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
197 native: false, language: ['c', 'cpp', 'objc'])
198
199 # Specify a filter to only instrument code that is directly related to
200 # virtual-devices.
201 configure_file(output: 'instrumentation-filter',
202 input: 'scripts/oss-fuzz/instrumentation-filter-template',
203 copy: true)
204 add_global_arguments(
205 cc.get_supported_arguments('-fsanitize-coverage-allowlist=instrumentation-filter'),
206 native: false, language: ['c', 'cpp', 'objc'])
207
208 if get_option('fuzzing_engine') == ''
209 # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
210 # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link
211 # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
212 # unable to bind the fuzzer-related callbacks added by instrumentation.
213 add_global_arguments('-fsanitize=fuzzer-no-link',
214 native: false, language: ['c', 'cpp', 'objc'])
215 add_global_link_arguments('-fsanitize=fuzzer-no-link',
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400216 native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzini537b7242021-10-07 15:08:12 +0200217 # For the actual fuzzer binaries, we need to link against the libfuzzer
218 # library. They need to be configurable, to support OSS-Fuzz
219 fuzz_exe_ldflags = ['-fsanitize=fuzzer']
220 else
221 # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and
222 # the needed CFLAGS have already been provided
223 fuzz_exe_ldflags = get_option('fuzzing_engine').split()
224 endif
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400225endif
226
Philippe Mathieu-Daudé4cb37d12022-02-15 16:15:13 +0100227add_global_arguments(qemu_cflags, native: false, language: ['c'])
Paolo Bonzini8cc2d232021-11-08 12:36:29 +0100228add_global_arguments(qemu_cxxflags, native: false, language: ['cpp'])
Philippe Mathieu-Daudé4cb37d12022-02-15 16:15:13 +0100229add_global_arguments(qemu_objcflags, native: false, language: ['objc'])
Paolo Bonzini8cc2d232021-11-08 12:36:29 +0100230add_global_link_arguments(qemu_ldflags, native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzinia5665052019-06-10 12:05:14 +0200231
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400232if targetos == 'linux'
233 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
234 '-isystem', 'linux-headers',
235 language: ['c', 'cpp'])
236endif
237
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100238add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400239 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400240 '-iquote', meson.current_source_dir() / 'include',
241 '-iquote', meson.current_source_dir() / 'disas/libvixl',
242 language: ['c', 'cpp', 'objc'])
Alexander Bulekovc46f76d2020-09-02 13:36:50 -0400243
Marc-André Lureaufc929892019-07-13 01:47:54 +0400244link_language = meson.get_external_property('link_language', 'cpp')
245if link_language == 'cpp'
246 add_languages('cpp', required: true, native: false)
Paolo Bonzini565174d2021-11-04 14:35:14 +0100247 cxx = meson.get_compiler('cpp')
248 linker = cxx
249else
250 linker = cc
Marc-André Lureaufc929892019-07-13 01:47:54 +0400251endif
Paolo Bonzinia5665052019-06-10 12:05:14 +0200252if host_machine.system() == 'darwin'
253 add_languages('objc', required: false, native: false)
254endif
255
Paolo Bonzinideb62372020-09-01 07:51:16 -0400256sparse = find_program('cgcc', required: get_option('sparse'))
257if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100258 run_target('sparse',
259 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400260 'compile_commands.json', sparse.full_path(), '-Wbitwise',
261 '-Wno-transparent-union', '-Wno-old-initializer',
262 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100263endif
264
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200265###########################################
266# Target-specific checks and dependencies #
267###########################################
268
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100269# Fuzzing
Paolo Bonzini537b7242021-10-07 15:08:12 +0200270if get_option('fuzzing') and get_option('fuzzing_engine') == '' and \
271 not cc.links('''
272 #include <stdint.h>
273 #include <sys/types.h>
274 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
275 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
276 ''',
277 args: ['-Werror', '-fsanitize=fuzzer'])
278 error('Your compiler does not support -fsanitize=fuzzer')
279endif
280
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100281# Tracing backends
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200282if 'ftrace' in get_option('trace_backends') and targetos != 'linux'
283 error('ftrace is supported only on Linux')
284endif
285if 'syslog' in get_option('trace_backends') and not cc.compiles('''
286 #include <syslog.h>
287 int main(void) {
288 openlog("qemu", LOG_PID, LOG_DAEMON);
289 syslog(LOG_INFO, "configure");
290 return 0;
291 }''')
292 error('syslog is not supported on this system')
293endif
294
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100295# Miscellaneous Linux-only features
Paolo Bonzinia436d6d2021-12-18 16:39:43 +0100296get_option('mpath') \
297 .require(targetos == 'linux', error_message: 'Multipath is supported only on Linux')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200298
Paolo Bonzinia436d6d2021-12-18 16:39:43 +0100299multiprocess_allowed = get_option('multiprocess') \
300 .require(targetos == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \
301 .allowed()
Paolo Bonzini106ad1f2021-02-17 16:24:25 +0100302
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +0100303have_tpm = get_option('tpm') \
304 .require(targetos != 'windows', error_message: 'TPM emulation only available on POSIX systems') \
305 .allowed()
306
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100307# Target-specific libraries and flags
Paolo Bonzini7fa1c632021-06-01 10:00:48 +0200308libm = cc.find_library('m', required: false)
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +0200309threads = dependency('threads')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400310util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200311winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400312socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400313version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400314coref = []
315iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400316emulator_link_args = []
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200317nvmm =not_found
Paolo Bonzini8a199802020-09-18 05:37:01 -0400318hvf = not_found
Marc-André Lureau23011f42022-02-01 12:55:21 +0400319midl = not_found
320widl = not_found
Paolo Bonzinia6305082021-10-07 15:08:15 +0200321host_dsosuf = '.so'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400322if targetos == 'windows'
Marc-André Lureau23011f42022-02-01 12:55:21 +0400323 midl = find_program('midl', required: false)
324 widl = find_program('widl', required: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400325 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200326 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400327
328 win = import('windows')
329 version_res = win.compile_resources('version.rc',
330 depend_files: files('pc-bios/qemu-nsis.ico'),
331 include_directories: include_directories('.'))
Paolo Bonzinia6305082021-10-07 15:08:15 +0200332 host_dsosuf = '.dll'
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400333elif targetos == 'darwin'
334 coref = dependency('appleframeworks', modules: 'CoreFoundation')
Joelle van Dyne14176c82021-03-15 11:03:38 -0700335 iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
Paolo Bonzinia6305082021-10-07 15:08:15 +0200336 host_dsosuf = '.dylib'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200337elif targetos == 'sunos'
338 socket = [cc.find_library('socket'),
339 cc.find_library('nsl'),
340 cc.find_library('resolv')]
341elif targetos == 'haiku'
342 socket = [cc.find_library('posix_error_mapper'),
343 cc.find_library('network'),
344 cc.find_library('bsd')]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400345elif targetos == 'openbsd'
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100346 if get_option('tcg').allowed() and target_dirs.length() > 0
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400347 # Disable OpenBSD W^X if available
348 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
349 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400350endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200351
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100352# Target-specific configuration of accelerators
Paolo Bonzini8a199802020-09-18 05:37:01 -0400353accelerators = []
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100354if get_option('kvm').allowed() and targetos == 'linux'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400355 accelerators += 'CONFIG_KVM'
356endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100357if get_option('whpx').allowed() and targetos == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000358 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400359 error('WHPX requires 64-bit host')
360 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
361 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
362 accelerators += 'CONFIG_WHPX'
363 endif
364endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100365if get_option('hvf').allowed()
Paolo Bonzini8a199802020-09-18 05:37:01 -0400366 hvf = dependency('appleframeworks', modules: 'Hypervisor',
367 required: get_option('hvf'))
368 if hvf.found()
369 accelerators += 'CONFIG_HVF'
370 endif
371endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100372if get_option('hax').allowed()
Paolo Bonzini8a199802020-09-18 05:37:01 -0400373 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
374 accelerators += 'CONFIG_HAX'
375 endif
376endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200377if targetos == 'netbsd'
nia0cc49652021-10-13 13:54:17 +0000378 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200379 if nvmm.found()
380 accelerators += 'CONFIG_NVMM'
381 endif
382endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100383
Paolo Bonzini823eb012021-11-08 14:18:17 +0100384tcg_arch = host_arch
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100385if get_option('tcg').allowed()
Paolo Bonzini823eb012021-11-08 14:18:17 +0100386 if host_arch == 'unknown'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100387 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +0100388 warning('Unsupported CPU @0@, will use TCG with TCI (slow)'.format(cpu))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400389 else
390 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
391 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100392 elif get_option('tcg_interpreter')
Philippe Mathieu-Daudé1c282da2021-05-21 12:34:23 +0200393 warning('Use of the TCG interpreter is not recommended on this host')
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100394 warning('architecture. There is a native TCG execution backend available')
395 warning('which provides substantially better performance and reliability.')
396 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
397 warning('configuration option on this architecture to use the native')
398 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400399 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100400 if get_option('tcg_interpreter')
401 tcg_arch = 'tci'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100402 elif host_arch == 'sparc64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100403 tcg_arch = 'sparc'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100404 elif host_arch == 'x86_64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100405 tcg_arch = 'i386'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100406 elif host_arch == 'ppc64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100407 tcg_arch = 'ppc'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100408 endif
409 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100410 language: ['c', 'cpp', 'objc'])
411
Paolo Bonzini8a199802020-09-18 05:37:01 -0400412 accelerators += 'CONFIG_TCG'
413 config_host += { 'CONFIG_TCG': 'y' }
414endif
415
416if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
417 error('KVM not available on this platform')
418endif
419if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
420 error('HVF not available on this platform')
421endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200422if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
423 error('NVMM not available on this platform')
424endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400425if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
426 error('WHPX not available on this platform')
427endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400428
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200429################
430# Dependencies #
431################
432
Paolo Bonzini215b0c22020-09-01 08:41:17 -0400433# The path to glib.h is added to all compilation commands. This was
434# grandfathered in from the QEMU Makefiles.
435add_project_arguments(config_host['GLIB_CFLAGS'].split(),
436 native: false, language: ['c', 'cpp', 'objc'])
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400437glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
Marc-André Lureaud83acfd2021-10-09 17:37:40 +0400438 link_args: config_host['GLIB_LIBS'].split(),
439 version: config_host['GLIB_VERSION'])
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400440# override glib dep with the configure results (for subprojects)
441meson.override_dependency('glib-2.0', glib)
442
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400443gio = not_found
Paolo Bonzini75440602022-04-20 17:33:44 +0200444gdbus_codegen = not_found
445if not get_option('gio').auto() or have_system
446 gio = dependency('gio-2.0', required: get_option('gio'),
447 method: 'pkg-config', kwargs: static_kwargs)
448 if gio.found() and not cc.links('''
449 #include <gio/gio.h>
450 int main(void)
451 {
452 g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
453 return 0;
454 }''', dependencies: [glib, gio])
455 if get_option('gio').enabled()
456 error('The installed libgio is broken for static linking')
457 endif
458 gio = not_found
459 endif
460 if gio.found()
461 gdbus_codegen = find_program(gio.get_variable('gdbus_codegen'),
462 required: get_option('gio'))
463 gio_unix = dependency('gio-unix-2.0', required: get_option('gio'),
464 method: 'pkg-config', kwargs: static_kwargs)
465 gio = declare_dependency(dependencies: [gio, gio_unix],
466 version: gio.version())
467 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400468endif
Paolo Bonzini75440602022-04-20 17:33:44 +0200469
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400470lttng = not_found
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200471if 'ust' in get_option('trace_backends')
Marc-André Lureaue32aaa52022-03-28 12:47:13 +0400472 lttng = dependency('lttng-ust', required: true, version: '>= 2.1',
473 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400474endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200475pixman = not_found
476if have_system or have_tools
477 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100478 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200479endif
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100480zlib = dependency('zlib', required: true, kwargs: static_kwargs)
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200481
Paolo Bonziniff66f3e2021-10-07 15:08:20 +0200482libaio = not_found
483if not get_option('linux_aio').auto() or have_block
484 libaio = cc.find_library('aio', has_headers: ['libaio.h'],
485 required: get_option('linux_aio'),
486 kwargs: static_kwargs)
487endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400488linux_io_uring = not_found
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200489if not get_option('linux_io_uring').auto() or have_block
Daniel P. Berrangéa41b4fd2022-01-05 13:49:38 +0000490 linux_io_uring = dependency('liburing', version: '>=0.3',
491 required: get_option('linux_io_uring'),
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200492 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400493endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400494libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +0100495if not get_option('libnfs').auto() or have_block
496 libnfs = dependency('libnfs', version: '>=1.9.3',
497 required: get_option('libnfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100498 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400499endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100500
501libattr_test = '''
502 #include <stddef.h>
503 #include <sys/types.h>
504 #ifdef CONFIG_LIBATTR
505 #include <attr/xattr.h>
506 #else
507 #include <sys/xattr.h>
508 #endif
509 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
510
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400511libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100512have_old_libattr = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100513if get_option('attr').allowed()
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100514 if cc.links(libattr_test)
515 libattr = declare_dependency()
516 else
517 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
518 required: get_option('attr'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100519 kwargs: static_kwargs)
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100520 if libattr.found() and not \
521 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
522 libattr = not_found
523 if get_option('attr').enabled()
524 error('could not link libattr')
525 else
526 warning('could not link libattr, disabling')
527 endif
528 else
529 have_old_libattr = libattr.found()
530 endif
531 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400532endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100533
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100534cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
535if cocoa.found() and get_option('sdl').enabled()
536 error('Cocoa and SDL cannot be enabled at the same time')
537endif
538if cocoa.found() and get_option('gtk').enabled()
539 error('Cocoa and GTK+ cannot be enabled at the same time')
540endif
541
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100542seccomp = not_found
Paolo Bonzini90835c22020-11-17 14:22:24 +0100543if not get_option('seccomp').auto() or have_system or have_tools
544 seccomp = dependency('libseccomp', version: '>=2.3.0',
545 required: get_option('seccomp'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100546 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100547endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100548
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100549libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100550if not get_option('cap_ng').auto() or have_system or have_tools
551 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
552 required: get_option('cap_ng'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100553 kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100554endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100555if libcap_ng.found() and not cc.links('''
556 #include <cap-ng.h>
557 int main(void)
558 {
559 capng_capability_to_name(CAPNG_EFFECTIVE);
560 return 0;
561 }''', dependencies: libcap_ng)
562 libcap_ng = not_found
563 if get_option('cap_ng').enabled()
564 error('could not link libcap-ng')
565 else
566 warning('could not link libcap-ng, disabling')
567 endif
568endif
569
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400570if get_option('xkbcommon').auto() and not have_system and not have_tools
571 xkbcommon = not_found
572else
573 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100574 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400575endif
Paolo Bonzinie1723992021-10-07 15:08:21 +0200576
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400577vde = not_found
Paolo Bonzinie1723992021-10-07 15:08:21 +0200578if not get_option('vde').auto() or have_system or have_tools
579 vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
580 required: get_option('vde'),
581 kwargs: static_kwargs)
582endif
583if vde.found() and not cc.links('''
584 #include <libvdeplug.h>
585 int main(void)
586 {
587 struct vde_open_args a = {0, 0, 0};
588 char s[] = "";
589 vde_open(s, s, &a);
590 return 0;
591 }''', dependencies: vde)
592 vde = not_found
593 if get_option('cap_ng').enabled()
594 error('could not link libvdeplug')
595 else
596 warning('could not link libvdeplug, disabling')
597 endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400598endif
Paolo Bonzini87430d52021-10-07 15:06:09 +0200599
Paolo Bonzini478e9432020-08-17 12:47:55 +0200600pulse = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200601if not get_option('pa').auto() or (targetos == 'linux' and have_system)
602 pulse = dependency('libpulse', required: get_option('pa'),
603 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini478e9432020-08-17 12:47:55 +0200604endif
605alsa = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200606if not get_option('alsa').auto() or (targetos == 'linux' and have_system)
607 alsa = dependency('alsa', required: get_option('alsa'),
608 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini478e9432020-08-17 12:47:55 +0200609endif
610jack = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200611if not get_option('jack').auto() or have_system
612 jack = dependency('jack', required: get_option('jack'),
613 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini478e9432020-08-17 12:47:55 +0200614endif
Paolo Bonzini87430d52021-10-07 15:06:09 +0200615
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200616spice_protocol = not_found
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +0200617if not get_option('spice_protocol').auto() or have_system
618 spice_protocol = dependency('spice-protocol', version: '>=0.12.3',
619 required: get_option('spice_protocol'),
620 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini26347332019-07-29 15:40:07 +0200621endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +0200622spice = not_found
623if not get_option('spice').auto() or have_system
624 spice = dependency('spice-server', version: '>=0.12.5',
625 required: get_option('spice'),
626 method: 'pkg-config', kwargs: static_kwargs)
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200627endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +0200628spice_headers = spice.partial_dependency(compile_args: true, includes: true)
629
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400630rt = cc.find_library('rt', required: false)
Paolo Bonzinia399f912021-11-15 14:29:13 +0000631
Paolo Bonzini99650b62019-06-10 12:21:14 +0200632libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +0100633if not get_option('libiscsi').auto() or have_block
634 libiscsi = dependency('libiscsi', version: '>=1.9.0',
635 required: get_option('libiscsi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100636 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini99650b62019-06-10 12:21:14 +0200637endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400638zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +0100639if not get_option('zstd').auto() or have_block
640 zstd = dependency('libzstd', version: '>=1.4.0',
641 required: get_option('zstd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100642 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400643endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400644virgl = not_found
Paolo Bonzini0265fe92021-12-17 12:36:26 +0100645
646have_vhost_user_gpu = have_tools and targetos == 'linux' and pixman.found()
647if not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
Paolo Bonzini587d59d2021-06-03 11:31:35 +0200648 virgl = dependency('virglrenderer',
649 method: 'pkg-config',
650 required: get_option('virglrenderer'),
651 kwargs: static_kwargs)
Marc-André Lureauea458962019-07-12 22:23:46 +0400652endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400653curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +0100654if not get_option('curl').auto() or have_block
655 curl = dependency('libcurl', version: '>=7.29.0',
656 method: 'pkg-config',
657 required: get_option('curl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100658 kwargs: static_kwargs)
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400659endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200660libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200661if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200662 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +0100663 method: 'pkg-config',
Paolo Bonzini5c530152020-10-15 06:09:27 -0400664 required: get_option('libudev'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100665 kwargs: static_kwargs)
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200666endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200667
Paolo Bonzini5c530152020-10-15 06:09:27 -0400668mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200669mpathpersist = not_found
670mpathpersist_new_api = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100671if targetos == 'linux' and have_tools and get_option('mpath').allowed()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200672 mpath_test_source_new = '''
673 #include <libudev.h>
674 #include <mpath_persist.h>
675 unsigned mpath_mx_alloc_len = 1024;
676 int logsink;
677 static struct config *multipath_conf;
678 extern struct udev *udev;
679 extern struct config *get_multipath_config(void);
680 extern void put_multipath_config(struct config *conf);
681 struct udev *udev;
682 struct config *get_multipath_config(void) { return multipath_conf; }
683 void put_multipath_config(struct config *conf) { }
684 int main(void) {
685 udev = udev_new();
686 multipath_conf = mpath_lib_init();
687 return 0;
688 }'''
689 mpath_test_source_old = '''
690 #include <libudev.h>
691 #include <mpath_persist.h>
692 unsigned mpath_mx_alloc_len = 1024;
693 int logsink;
694 int main(void) {
695 struct udev *udev = udev_new();
696 mpath_lib_init(udev);
697 return 0;
698 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -0400699 libmpathpersist = cc.find_library('mpathpersist',
700 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100701 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400702 if libmpathpersist.found()
703 mpathlibs += libmpathpersist
704 if enable_static
705 mpathlibs += cc.find_library('devmapper',
706 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100707 kwargs: static_kwargs)
Paolo Bonzini43b43a42020-09-17 12:25:09 +0200708 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -0400709 mpathlibs += cc.find_library('multipath',
710 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100711 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400712 foreach lib: mpathlibs
713 if not lib.found()
714 mpathlibs = []
715 break
716 endif
717 endforeach
718 if mpathlibs.length() == 0
719 msg = 'Dependencies missing for libmpathpersist'
720 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200721 mpathpersist = declare_dependency(dependencies: mpathlibs)
722 mpathpersist_new_api = true
723 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
724 mpathpersist = declare_dependency(dependencies: mpathlibs)
725 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400726 msg = 'Cannot detect libmpathpersist API'
727 endif
728 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200729 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -0400730 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200731 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400732 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200733 endif
734 endif
735 endif
736endif
737
Yonggang Luo5285e592020-10-13 07:43:48 +0800738iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800739curses = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100740if have_system and get_option('curses').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400741 curses_test = '''
Stefan Weilfbab8cc2021-11-17 21:53:55 +0100742 #if defined(__APPLE__) || defined(__OpenBSD__)
743 #define _XOPEN_SOURCE_EXTENDED 1
744 #endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400745 #include <locale.h>
746 #include <curses.h>
747 #include <wchar.h>
748 int main(void) {
749 wchar_t wch = L'w';
750 setlocale(LC_ALL, "");
751 resize_term(0, 0);
752 addwstr(L"wide chars\n");
753 addnwstr(&wch, 1);
754 add_wch(WACS_DEGREE);
755 return 0;
756 }'''
757
Yonggang Luoca31e302020-11-17 05:31:06 +0800758 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
759 foreach curses_dep : curses_dep_list
760 if not curses.found()
761 curses = dependency(curses_dep,
762 required: false,
763 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100764 kwargs: static_kwargs)
Yonggang Luoca31e302020-11-17 05:31:06 +0800765 endif
766 endforeach
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400767 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Stefan Weilfbab8cc2021-11-17 21:53:55 +0100768 curses_compile_args = ['-DNCURSES_WIDECHAR=1']
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400769 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500770 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
771 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400772 else
773 msg = 'curses package not usable'
774 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800775 endif
776 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400777 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400778 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
779 if targetos != 'windows' and not has_curses_h
780 message('Trying with /usr/include/ncursesw')
781 curses_compile_args += ['-I/usr/include/ncursesw']
782 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
783 endif
784 if has_curses_h
785 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
786 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +0800787 libcurses = cc.find_library(curses_libname,
788 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100789 kwargs: static_kwargs)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400790 if libcurses.found()
791 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
792 curses = declare_dependency(compile_args: curses_compile_args,
793 dependencies: [libcurses])
794 break
795 else
796 msg = 'curses library not usable'
797 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800798 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400799 endforeach
800 endif
801 endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100802 if get_option('iconv').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400803 foreach link_args : [ ['-liconv'], [] ]
804 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
805 # We need to use libiconv if available because mixing libiconv's headers with
806 # the system libc does not work.
807 # However, without adding glib to the dependencies -L/usr/local/lib will not be
808 # included in the command line and libiconv will not be found.
809 if cc.links('''
810 #include <iconv.h>
811 int main(void) {
812 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
813 return conv != (iconv_t) -1;
814 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
815 iconv = declare_dependency(link_args: link_args, dependencies: glib)
816 break
Yonggang Luo5285e592020-10-13 07:43:48 +0800817 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400818 endforeach
819 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400820 if curses.found() and not iconv.found()
821 if get_option('iconv').enabled()
822 error('iconv not available')
823 endif
824 msg = 'iconv required for curses UI but not available'
825 curses = not_found
826 endif
827 if not curses.found() and msg != ''
828 if get_option('curses').enabled()
829 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400830 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400831 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400832 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800833 endif
834endif
835
Paolo Bonzini26347332019-07-29 15:40:07 +0200836brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100837if not get_option('brlapi').auto() or have_system
838 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
839 required: get_option('brlapi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100840 kwargs: static_kwargs)
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100841 if brlapi.found() and not cc.links('''
842 #include <brlapi.h>
843 #include <stddef.h>
844 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
845 brlapi = not_found
846 if get_option('brlapi').enabled()
847 error('could not link brlapi')
848 else
849 warning('could not link brlapi, disabling')
850 endif
851 endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200852endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100853
Paolo Bonzini760e4322020-08-26 08:09:48 +0200854sdl = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100855if not get_option('sdl').auto() or (have_system and not cocoa.found())
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100856 sdl = dependency('sdl2', required: get_option('sdl'), kwargs: static_kwargs)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200857 sdl_image = not_found
858endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100859if sdl.found()
860 # work around 2.0.8 bug
861 sdl = declare_dependency(compile_args: '-Wno-undef',
862 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200863 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100864 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100865else
866 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +0100867 error('sdl-image required, but SDL was @0@'.format(
868 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100869 endif
870 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200871endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100872
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400873rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100874if not get_option('rbd').auto() or have_block
875 librados = cc.find_library('rados', required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100876 kwargs: static_kwargs)
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100877 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
878 required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100879 kwargs: static_kwargs)
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100880 if librados.found() and librbd.found()
881 if cc.links('''
882 #include <stdio.h>
883 #include <rbd/librbd.h>
884 int main(void) {
885 rados_t cluster;
886 rados_create(&cluster, NULL);
Peter Lieven48672ac2021-07-02 19:23:51 +0200887 #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
888 #error
889 #endif
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100890 return 0;
891 }''', dependencies: [librbd, librados])
892 rbd = declare_dependency(dependencies: [librbd, librados])
893 elif get_option('rbd').enabled()
Peter Lieven48672ac2021-07-02 19:23:51 +0200894 error('librbd >= 1.12.0 required')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100895 else
Peter Lieven48672ac2021-07-02 19:23:51 +0200896 warning('librbd >= 1.12.0 not found, disabling')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100897 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100898 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400899endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100900
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400901glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100902glusterfs_ftruncate_has_stat = false
903glusterfs_iocb_has_stat = false
904if not get_option('glusterfs').auto() or have_block
905 glusterfs = dependency('glusterfs-api', version: '>=3',
906 required: get_option('glusterfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100907 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100908 if glusterfs.found()
909 glusterfs_ftruncate_has_stat = cc.links('''
910 #include <glusterfs/api/glfs.h>
911
912 int
913 main(void)
914 {
915 /* new glfs_ftruncate() passes two additional args */
916 return glfs_ftruncate(NULL, 0, NULL, NULL);
917 }
918 ''', dependencies: glusterfs)
919 glusterfs_iocb_has_stat = cc.links('''
920 #include <glusterfs/api/glfs.h>
921
922 /* new glfs_io_cbk() passes two additional glfs_stat structs */
923 static void
924 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
925 {}
926
927 int
928 main(void)
929 {
930 glfs_io_cbk iocb = &glusterfs_iocb;
931 iocb(NULL, 0 , NULL, NULL, NULL);
932 return 0;
933 }
934 ''', dependencies: glusterfs)
935 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400936endif
Thomas Huthe6a52b32021-12-09 15:48:01 +0100937
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400938libssh = not_found
Thomas Huthe6a52b32021-12-09 15:48:01 +0100939if not get_option('libssh').auto() or have_block
940 libssh = dependency('libssh', version: '>=0.8.7',
941 method: 'pkg-config',
942 required: get_option('libssh'),
943 kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400944endif
Thomas Huthe6a52b32021-12-09 15:48:01 +0100945
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400946libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100947if not get_option('bzip2').auto() or have_block
948 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
949 required: get_option('bzip2'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100950 kwargs: static_kwargs)
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100951 if libbzip2.found() and not cc.links('''
952 #include <bzlib.h>
953 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
954 libbzip2 = not_found
955 if get_option('bzip2').enabled()
956 error('could not link libbzip2')
957 else
958 warning('could not link libbzip2, disabling')
959 endif
960 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400961endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100962
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400963liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +0100964if not get_option('lzfse').auto() or have_block
965 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
966 required: get_option('lzfse'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100967 kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400968endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100969if liblzfse.found() and not cc.links('''
970 #include <lzfse.h>
971 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
972 liblzfse = not_found
973 if get_option('lzfse').enabled()
974 error('could not link liblzfse')
975 else
976 warning('could not link liblzfse, disabling')
977 endif
978endif
979
Paolo Bonzini478e9432020-08-17 12:47:55 +0200980oss = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100981if get_option('oss').allowed() and have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +0200982 if not cc.has_header('sys/soundcard.h')
983 # not found
984 elif targetos == 'netbsd'
985 oss = cc.find_library('ossaudio', required: get_option('oss'),
986 kwargs: static_kwargs)
987 else
988 oss = declare_dependency()
989 endif
990
991 if not oss.found()
992 if get_option('oss').enabled()
993 error('OSS not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +0200994 endif
995 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200996endif
997dsound = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200998if not get_option('dsound').auto() or (targetos == 'windows' and have_system)
999 if cc.has_header('dsound.h')
1000 dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
1001 endif
1002
1003 if not dsound.found()
1004 if get_option('dsound').enabled()
1005 error('DirectSound not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001006 endif
1007 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001008endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001009
Paolo Bonzini478e9432020-08-17 12:47:55 +02001010coreaudio = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001011if not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system)
1012 coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
1013 required: get_option('coreaudio'))
Paolo Bonzini478e9432020-08-17 12:47:55 +02001014endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001015
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001016opengl = not_found
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001017if not get_option('opengl').auto() or have_system or have_vhost_user_gpu
1018 epoxy = dependency('epoxy', method: 'pkg-config',
1019 required: get_option('opengl'), kwargs: static_kwargs)
1020 if cc.has_header('epoxy/egl.h', dependencies: epoxy)
1021 opengl = epoxy
1022 elif get_option('opengl').enabled()
1023 error('epoxy/egl.h not found')
1024 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001025endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001026gbm = not_found
1027if (have_system or have_tools) and (virgl.found() or opengl.found())
1028 gbm = dependency('gbm', method: 'pkg-config', required: false,
1029 kwargs: static_kwargs)
1030endif
Paolo Bonzini0265fe92021-12-17 12:36:26 +01001031have_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and gbm.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001032
Paolo Bonzini57612512021-06-03 11:15:26 +02001033gnutls = not_found
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001034gnutls_crypto = not_found
Alyssa Rossabc14fd2021-08-06 14:49:47 +00001035if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001036 # For general TLS support our min gnutls matches
1037 # that implied by our platform support matrix
1038 #
1039 # For the crypto backends, we look for a newer
1040 # gnutls:
1041 #
1042 # Version 3.6.8 is needed to get XTS
1043 # Version 3.6.13 is needed to get PBKDF
1044 # Version 3.6.14 is needed to get HW accelerated XTS
1045 #
1046 # If newer enough gnutls isn't available, we can
1047 # still use a different crypto backend to satisfy
1048 # the platform support requirements
1049 gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
1050 method: 'pkg-config',
1051 required: false,
1052 kwargs: static_kwargs)
1053 if gnutls_crypto.found()
1054 gnutls = gnutls_crypto
1055 else
1056 # Our min version if all we need is TLS
1057 gnutls = dependency('gnutls', version: '>=3.5.18',
1058 method: 'pkg-config',
1059 required: get_option('gnutls'),
1060 kwargs: static_kwargs)
1061 endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001062endif
1063
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001064# We prefer use of gnutls for crypto, unless the options
1065# explicitly asked for nettle or gcrypt.
1066#
1067# If gnutls isn't available for crypto, then we'll prefer
1068# gcrypt over nettle for performance reasons.
Paolo Bonzini57612512021-06-03 11:15:26 +02001069gcrypt = not_found
1070nettle = not_found
Daniel P. Berrangé68014042021-07-02 17:00:32 +01001071xts = 'none'
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001072
Paolo Bonzini57612512021-06-03 11:15:26 +02001073if get_option('nettle').enabled() and get_option('gcrypt').enabled()
1074 error('Only one of gcrypt & nettle can be enabled')
Paolo Bonzini57612512021-06-03 11:15:26 +02001075endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001076
1077# Explicit nettle/gcrypt request, so ignore gnutls for crypto
1078if get_option('nettle').enabled() or get_option('gcrypt').enabled()
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001079 gnutls_crypto = not_found
1080endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001081
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001082if not gnutls_crypto.found()
1083 if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
1084 gcrypt = dependency('libgcrypt', version: '>=1.8',
1085 method: 'config-tool',
1086 required: get_option('gcrypt'),
1087 kwargs: static_kwargs)
1088 # Debian has removed -lgpg-error from libgcrypt-config
1089 # as it "spreads unnecessary dependencies" which in
1090 # turn breaks static builds...
1091 if gcrypt.found() and enable_static
1092 gcrypt = declare_dependency(dependencies: [
1093 gcrypt,
1094 cc.find_library('gpg-error', required: true, kwargs: static_kwargs)])
1095 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001096 endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001097 if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1098 nettle = dependency('nettle', version: '>=3.4',
1099 method: 'pkg-config',
1100 required: get_option('nettle'),
1101 kwargs: static_kwargs)
1102 if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1103 xts = 'private'
1104 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001105 endif
1106endif
1107
1108gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +01001109gtkx11 = not_found
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001110vte = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +01001111if not get_option('gtk').auto() or (have_system and not cocoa.found())
Paolo Bonzini1b695472021-01-07 14:02:29 +01001112 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
1113 method: 'pkg-config',
1114 required: get_option('gtk'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001115 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +01001116 if gtk.found()
1117 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
1118 method: 'pkg-config',
1119 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001120 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +01001121 gtk = declare_dependency(dependencies: [gtk, gtkx11])
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001122
1123 if not get_option('vte').auto() or have_system
1124 vte = dependency('vte-2.91',
1125 method: 'pkg-config',
1126 required: get_option('vte'),
1127 kwargs: static_kwargs)
1128 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001129 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001130endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001131
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001132x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +02001133if gtkx11.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001134 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001135 kwargs: static_kwargs)
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001136endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001137png = not_found
Kshitij Suri95f85102022-04-08 07:13:34 +00001138if get_option('png').allowed() and have_system
1139 png = dependency('libpng', required: get_option('png'),
1140 method: 'pkg-config', kwargs: static_kwargs)
1141endif
1142vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001143jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001144sasl = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001145if get_option('vnc').allowed() and have_system
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001146 vnc = declare_dependency() # dummy dependency
Paolo Bonzini8e242b32020-11-23 13:34:02 -05001147 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001148 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001149 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
1150 required: get_option('vnc_sasl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001151 kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001152 if sasl.found()
1153 sasl = declare_dependency(dependencies: sasl,
1154 compile_args: '-DSTRUCT_IOVEC_DEFINED')
1155 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001156endif
Paolo Bonzini241611e2020-11-17 13:32:34 +01001157
Paolo Bonzini05e391a2021-06-03 11:15:26 +02001158pam = not_found
1159if not get_option('auth_pam').auto() or have_system
1160 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
1161 required: get_option('auth_pam'),
1162 kwargs: static_kwargs)
1163endif
1164if pam.found() and not cc.links('''
1165 #include <stddef.h>
1166 #include <security/pam_appl.h>
1167 int main(void) {
1168 const char *service_name = "qemu";
1169 const char *user = "frank";
1170 const struct pam_conv pam_conv = { 0 };
1171 pam_handle_t *pamh = NULL;
1172 pam_start(service_name, user, &pam_conv, &pamh);
1173 return 0;
1174 }''', dependencies: pam)
1175 pam = not_found
1176 if get_option('auth_pam').enabled()
1177 error('could not link libpam')
1178 else
1179 warning('could not link libpam, disabling')
1180 endif
1181endif
1182
Marc-André Lureau708eab42019-09-03 16:59:33 +04001183snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +01001184if not get_option('snappy').auto() or have_system
1185 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
1186 required: get_option('snappy'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001187 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +04001188endif
Paolo Bonzini565174d2021-11-04 14:35:14 +01001189if snappy.found() and not linker.links('''
Paolo Bonzini241611e2020-11-17 13:32:34 +01001190 #include <snappy-c.h>
1191 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
1192 snappy = not_found
1193 if get_option('snappy').enabled()
1194 error('could not link libsnappy')
1195 else
1196 warning('could not link libsnappy, disabling')
1197 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +04001198endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001199
Marc-André Lureau708eab42019-09-03 16:59:33 +04001200lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001201if not get_option('lzo').auto() or have_system
1202 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
1203 required: get_option('lzo'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001204 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +04001205endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001206if lzo.found() and not cc.links('''
1207 #include <lzo/lzo1x.h>
1208 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
1209 lzo = not_found
1210 if get_option('lzo').enabled()
1211 error('could not link liblzo2')
1212 else
1213 warning('could not link liblzo2, disabling')
1214 endif
1215endif
1216
Paolo Bonzini488a8c72021-12-21 12:38:27 +01001217numa = not_found
1218if not get_option('numa').auto() or have_system or have_tools
1219 numa = cc.find_library('numa', has_headers: ['numa.h'],
1220 required: get_option('numa'),
1221 kwargs: static_kwargs)
1222endif
1223if numa.found() and not cc.links('''
1224 #include <numa.h>
1225 int main(void) { return numa_available(); }
1226 ''', dependencies: numa)
1227 numa = not_found
1228 if get_option('numa').enabled()
1229 error('could not link numa')
1230 else
1231 warning('could not link numa, disabling')
1232 endif
1233endif
1234
Marc-André Lureau55166232019-07-24 19:16:22 +04001235rdma = not_found
Paolo Bonzini3730a732022-04-20 17:33:41 +02001236if not get_option('rdma').auto() or have_system
1237 libumad = cc.find_library('ibumad', required: get_option('rdma'))
1238 rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'],
1239 required: get_option('rdma'),
1240 kwargs: static_kwargs),
1241 cc.find_library('ibverbs', required: get_option('rdma'),
1242 kwargs: static_kwargs),
1243 libumad]
1244 rdma = declare_dependency(dependencies: rdma_libs)
1245 foreach lib: rdma_libs
1246 if not lib.found()
1247 rdma = not_found
1248 endif
1249 endforeach
Marc-André Lureau55166232019-07-24 19:16:22 +04001250endif
Paolo Bonzini3730a732022-04-20 17:33:41 +02001251
Marc-André Lureau582ea952019-08-15 15:15:32 +04001252xen = not_found
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001253if get_option('xen').enabled() or (get_option('xen').auto() and have_system)
1254 xencontrol = dependency('xencontrol', required: false,
1255 method: 'pkg-config', kwargs: static_kwargs)
1256 if xencontrol.found()
1257 xen_pc = declare_dependency(version: xencontrol.version(),
1258 dependencies: [
1259 xencontrol,
1260 # disabler: true makes xen_pc.found() return false if any is not found
1261 dependency('xenstore', required: false,
1262 method: 'pkg-config', kwargs: static_kwargs,
1263 disabler: true),
1264 dependency('xenforeignmemory', required: false,
1265 method: 'pkg-config', kwargs: static_kwargs,
1266 disabler: true),
1267 dependency('xengnttab', required: false,
1268 method: 'pkg-config', kwargs: static_kwargs,
1269 disabler: true),
1270 dependency('xenevtchn', required: false,
1271 method: 'pkg-config', kwargs: static_kwargs,
1272 disabler: true),
1273 dependency('xendevicemodel', required: false,
1274 method: 'pkg-config', kwargs: static_kwargs,
1275 disabler: true),
1276 # optional, no "disabler: true"
1277 dependency('xentoolcore', required: false,
1278 method: 'pkg-config', kwargs: static_kwargs)])
1279 if xen_pc.found()
1280 xen = xen_pc
1281 endif
1282 endif
1283 if not xen.found()
1284 xen_tests = [ '4.11.0', '4.10.0', '4.9.0', '4.8.0', '4.7.1', '4.6.0', '4.5.0', '4.2.0' ]
1285 xen_libs = {
1286 '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
1287 '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
1288 '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
1289 '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
1290 '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
1291 '4.6.0': [ 'xenstore', 'xenctrl' ],
1292 '4.5.0': [ 'xenstore', 'xenctrl' ],
1293 '4.2.0': [ 'xenstore', 'xenctrl' ],
1294 }
1295 xen_deps = {}
1296 foreach ver: xen_tests
1297 # cache the various library tests to avoid polluting the logs
1298 xen_test_deps = []
1299 foreach l: xen_libs[ver]
1300 if l not in xen_deps
1301 xen_deps += { l: cc.find_library(l, required: false) }
1302 endif
1303 xen_test_deps += xen_deps[l]
1304 endforeach
1305
1306 # Use -D to pick just one of the test programs in scripts/xen-detect.c
1307 xen_version = ver.split('.')
1308 xen_ctrl_version = xen_version[0] + \
1309 ('0' + xen_version[1]).substring(-2) + \
1310 ('0' + xen_version[2]).substring(-2)
1311 if cc.links(files('scripts/xen-detect.c'),
1312 args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version,
1313 dependencies: xen_test_deps)
1314 xen = declare_dependency(version: ver, dependencies: xen_test_deps)
1315 break
1316 endif
1317 endforeach
1318 endif
1319 if xen.found()
1320 accelerators += 'CONFIG_XEN'
1321 elif get_option('xen').enabled()
1322 error('could not compile and link Xen test program')
1323 endif
Marc-André Lureau582ea952019-08-15 15:15:32 +04001324endif
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001325have_xen_pci_passthrough = get_option('xen_pci_passthrough') \
1326 .require(xen.found(),
1327 error_message: 'Xen PCI passthrough requested but Xen not enabled') \
1328 .require(targetos == 'linux',
1329 error_message: 'Xen PCI passthrough not available on this platform') \
1330 .allowed()
1331
1332
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001333cacard = not_found
Paolo Bonzini5f364c52021-06-03 11:15:26 +02001334if not get_option('smartcard').auto() or have_system
1335 cacard = dependency('libcacard', required: get_option('smartcard'),
1336 version: '>=2.5.1', method: 'pkg-config',
1337 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001338endif
César Belley0a40bcb2020-08-26 13:42:04 +02001339u2f = not_found
1340if have_system
1341 u2f = dependency('u2f-emu', required: get_option('u2f'),
1342 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001343 kwargs: static_kwargs)
César Belley0a40bcb2020-08-26 13:42:04 +02001344endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001345usbredir = not_found
Paolo Bonzini18f31e62021-06-03 11:15:26 +02001346if not get_option('usb_redir').auto() or have_system
1347 usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
1348 version: '>=0.6', method: 'pkg-config',
1349 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001350endif
1351libusb = not_found
Paolo Bonzini90540f32021-06-03 11:15:26 +02001352if not get_option('libusb').auto() or have_system
1353 libusb = dependency('libusb-1.0', required: get_option('libusb'),
1354 version: '>=1.0.13', method: 'pkg-config',
1355 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001356endif
Paolo Bonzini90540f32021-06-03 11:15:26 +02001357
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001358libpmem = not_found
Paolo Bonzinie36e8c72021-06-03 11:31:35 +02001359if not get_option('libpmem').auto() or have_system
1360 libpmem = dependency('libpmem', required: get_option('libpmem'),
1361 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001362endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001363libdaxctl = not_found
Paolo Bonzini83ef1682021-06-03 11:31:35 +02001364if not get_option('libdaxctl').auto() or have_system
1365 libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
1366 version: '>=57', method: 'pkg-config',
1367 kwargs: static_kwargs)
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001368endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001369tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +02001370if gnutls.found()
1371 tasn1 = dependency('libtasn1',
1372 method: 'pkg-config',
1373 kwargs: static_kwargs)
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001374endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001375keyutils = dependency('libkeyutils', required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001376 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001377
Marc-André Lureau3909def2020-08-28 15:07:33 +04001378has_gettid = cc.has_function('gettid')
1379
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06001380# libselinux
1381selinux = dependency('libselinux',
1382 required: get_option('selinux'),
1383 method: 'pkg-config', kwargs: static_kwargs)
1384
Paolo Bonziniaa087962020-09-01 11:15:30 -04001385# Malloc tests
1386
1387malloc = []
1388if get_option('malloc') == 'system'
1389 has_malloc_trim = \
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001390 get_option('malloc_trim').allowed() and \
Paolo Bonziniaa087962020-09-01 11:15:30 -04001391 cc.links('''#include <malloc.h>
1392 int main(void) { malloc_trim(0); return 0; }''')
1393else
1394 has_malloc_trim = false
1395 malloc = cc.find_library(get_option('malloc'), required: true)
1396endif
1397if not has_malloc_trim and get_option('malloc_trim').enabled()
1398 if get_option('malloc') == 'system'
1399 error('malloc_trim not available on this platform.')
1400 else
1401 error('malloc_trim not available with non-libc memory allocator')
1402 endif
1403endif
1404
Max Reitz84e319a2020-11-02 17:18:55 +01001405# Check whether the glibc provides statx()
1406
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001407gnu_source_prefix = '''
Max Reitz84e319a2020-11-02 17:18:55 +01001408 #ifndef _GNU_SOURCE
1409 #define _GNU_SOURCE
1410 #endif
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001411'''
1412statx_test = gnu_source_prefix + '''
Max Reitz84e319a2020-11-02 17:18:55 +01001413 #include <sys/stat.h>
1414 int main(void) {
1415 struct statx statxbuf;
1416 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
1417 return 0;
1418 }'''
1419
1420has_statx = cc.links(statx_test)
1421
Hanna Reitz4ce7a082022-02-23 10:23:40 +01001422# Check whether statx() provides mount ID information
1423
1424statx_mnt_id_test = gnu_source_prefix + '''
1425 #include <sys/stat.h>
1426 int main(void) {
1427 struct statx statxbuf;
1428 statx(0, "", 0, STATX_BASIC_STATS | STATX_MNT_ID, &statxbuf);
1429 return statxbuf.stx_mnt_id;
1430 }'''
1431
1432has_statx_mnt_id = cc.links(statx_mnt_id_test)
1433
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001434have_vhost_user_blk_server = get_option('vhost_user_blk_server') \
1435 .require(targetos == 'linux',
1436 error_message: 'vhost_user_blk_server requires linux') \
1437 .require('CONFIG_VHOST_USER' in config_host,
1438 error_message: 'vhost_user_blk_server requires vhost-user support') \
1439 .disable_auto_if(not have_system) \
1440 .allowed()
Daniele Buono9e62ba42020-12-04 18:06:14 -05001441
Max Reitzdf4ea702020-10-27 20:05:46 +01001442if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
1443 error('Cannot enable fuse-lseek while fuse is disabled')
1444endif
1445
Max Reitza484a712020-10-27 20:05:41 +01001446fuse = dependency('fuse3', required: get_option('fuse'),
1447 version: '>=3.1', method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001448 kwargs: static_kwargs)
Max Reitza484a712020-10-27 20:05:41 +01001449
Max Reitzdf4ea702020-10-27 20:05:46 +01001450fuse_lseek = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001451if get_option('fuse_lseek').allowed()
Max Reitzdf4ea702020-10-27 20:05:46 +01001452 if fuse.version().version_compare('>=3.8')
1453 # Dummy dependency
1454 fuse_lseek = declare_dependency()
1455 elif get_option('fuse_lseek').enabled()
1456 if fuse.found()
1457 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1458 else
1459 error('fuse-lseek requires libfuse, which was not found')
1460 endif
1461 endif
1462endif
1463
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001464# libbpf
1465libbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config')
1466if libbpf.found() and not cc.links('''
1467 #include <bpf/libbpf.h>
1468 int main(void)
1469 {
1470 bpf_object__destroy_skeleton(NULL);
1471 return 0;
1472 }''', dependencies: libbpf)
1473 libbpf = not_found
1474 if get_option('bpf').enabled()
1475 error('libbpf skeleton test failed')
1476 else
1477 warning('libbpf skeleton test failed, disabling')
1478 endif
1479endif
1480
Paolo Bonzini87430d52021-10-07 15:06:09 +02001481#################
1482# config-host.h #
1483#################
1484
1485audio_drivers_selected = []
1486if have_system
1487 audio_drivers_available = {
1488 'alsa': alsa.found(),
1489 'coreaudio': coreaudio.found(),
1490 'dsound': dsound.found(),
1491 'jack': jack.found(),
1492 'oss': oss.found(),
1493 'pa': pulse.found(),
1494 'sdl': sdl.found(),
1495 }
Paolo Bonzinie5424a22021-10-07 15:06:10 +02001496 foreach k, v: audio_drivers_available
1497 config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
1498 endforeach
Paolo Bonzini87430d52021-10-07 15:06:09 +02001499
1500 # Default to native drivers first, OSS second, SDL third
1501 audio_drivers_priority = \
1502 [ 'pa', 'coreaudio', 'dsound', 'oss' ] + \
1503 (targetos == 'linux' ? [] : [ 'sdl' ])
1504 audio_drivers_default = []
1505 foreach k: audio_drivers_priority
1506 if audio_drivers_available[k]
1507 audio_drivers_default += k
1508 endif
1509 endforeach
1510
1511 foreach k: get_option('audio_drv_list')
1512 if k == 'default'
1513 audio_drivers_selected += audio_drivers_default
1514 elif not audio_drivers_available[k]
1515 error('Audio driver "@0@" not available.'.format(k))
1516 else
1517 audio_drivers_selected += k
1518 endif
1519 endforeach
1520endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001521config_host_data.set('CONFIG_AUDIO_DRIVERS',
1522 '"' + '", "'.join(audio_drivers_selected) + '", ')
1523
Daniele Buono9e62ba42020-12-04 18:06:14 -05001524if get_option('cfi')
1525 cfi_flags=[]
1526 # Check for dependency on LTO
1527 if not get_option('b_lto')
1528 error('Selected Control-Flow Integrity but LTO is disabled')
1529 endif
1530 if config_host.has_key('CONFIG_MODULES')
1531 error('Selected Control-Flow Integrity is not compatible with modules')
1532 endif
1533 # Check for cfi flags. CFI requires LTO so we can't use
1534 # get_supported_arguments, but need a more complex "compiles" which allows
1535 # custom arguments
1536 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
1537 args: ['-flto', '-fsanitize=cfi-icall'] )
1538 cfi_flags += '-fsanitize=cfi-icall'
1539 else
1540 error('-fsanitize=cfi-icall is not supported by the compiler')
1541 endif
1542 if cc.compiles('int main () { return 0; }',
1543 name: '-fsanitize-cfi-icall-generalize-pointers',
1544 args: ['-flto', '-fsanitize=cfi-icall',
1545 '-fsanitize-cfi-icall-generalize-pointers'] )
1546 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
1547 else
1548 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
1549 endif
1550 if get_option('cfi_debug')
1551 if cc.compiles('int main () { return 0; }',
1552 name: '-fno-sanitize-trap=cfi-icall',
1553 args: ['-flto', '-fsanitize=cfi-icall',
1554 '-fno-sanitize-trap=cfi-icall'] )
1555 cfi_flags += '-fno-sanitize-trap=cfi-icall'
1556 else
1557 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
1558 endif
1559 endif
Marc-André Lureau5fc06172021-01-14 16:56:02 +04001560 add_global_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
1561 add_global_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
Daniele Buono9e62ba42020-12-04 18:06:14 -05001562endif
1563
Joelle van Dyne14176c82021-03-15 11:03:38 -07001564have_host_block_device = (targetos != 'darwin' or
1565 cc.has_header('IOKit/storage/IOMedia.h'))
1566
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001567# FIXME enable_modules shouldn't be necessary, but: https://github.com/mesonbuild/meson/issues/8333
1568dbus_display = get_option('dbus_display') \
1569 .require(gio.version().version_compare('>=2.64'),
1570 error_message: '-display dbus requires glib>=2.64') \
1571 .require(enable_modules,
1572 error_message: '-display dbus requires --enable-modules') \
Paolo Bonzini75440602022-04-20 17:33:44 +02001573 .require(gdbus_codegen.found(),
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001574 error_message: '-display dbus requires gdbus-codegen') \
1575 .allowed()
Marc-André Lureau142ca622021-07-15 11:53:53 +04001576
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001577have_virtfs = get_option('virtfs') \
Keno Fischer0fb1e192022-02-27 17:35:22 -05001578 .require(targetos == 'linux' or targetos == 'darwin',
1579 error_message: 'virtio-9p (virtfs) requires Linux or macOS') \
1580 .require(targetos == 'linux' or cc.has_function('pthread_fchdir_np'),
1581 error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \
1582 .require(targetos == 'darwin' or (libattr.found() and libcap_ng.found()),
1583 error_message: 'virtio-9p (virtfs) on Linux requires libcap-ng-devel and libattr-devel') \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001584 .disable_auto_if(not have_tools and not have_system) \
1585 .allowed()
Paolo Bonzini69202b42020-11-17 14:46:21 +01001586
Keno Fischer0fb1e192022-02-27 17:35:22 -05001587have_virtfs_proxy_helper = targetos != 'darwin' and have_virtfs and have_tools
Philippe Mathieu-Daudé3a489d32021-01-20 16:15:39 +01001588
Paolo Bonzini9c29b742021-10-07 15:08:14 +02001589foreach k : get_option('trace_backends')
1590 config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
1591endforeach
1592config_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
Paolo Bonzini40c909f2022-04-20 17:33:49 +02001593if iasl.found()
1594 config_host_data.set_quoted('CONFIG_IASL', iasl.full_path())
Paolo Bonzini5dc46182021-10-13 13:19:00 +02001595endif
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001596config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
1597config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
1598config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
1599config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
1600config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
1601config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
1602config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
1603config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
1604config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
1605config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
1606config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
1607config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
1608
Paolo Bonzini35acbb32021-10-13 13:43:36 +02001609have_slirp_smbd = get_option('slirp_smbd') \
1610 .require(targetos != 'windows', error_message: 'Host smbd not supported on this platform.') \
1611 .allowed()
1612if have_slirp_smbd
1613 smbd_path = get_option('smbd')
1614 if smbd_path == ''
1615 smbd_path = (targetos == 'solaris' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd')
1616 endif
1617 config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path)
1618endif
1619
Paolo Bonzini823eb012021-11-08 14:18:17 +01001620config_host_data.set('HOST_' + host_arch.to_upper(), 1)
1621
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02001622if get_option('module_upgrades') and not enable_modules
1623 error('Cannot enable module-upgrades as modules are not enabled')
1624endif
1625config_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades'))
1626
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001627config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02001628config_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001629config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04001630config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzini537b7242021-10-07 15:08:12 +02001631config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
Paolo Bonziniaf2bb992021-10-07 15:08:17 +02001632config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
Paolo Bonzinif01496a2020-09-16 17:54:14 +02001633config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001634config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001635config_host_data.set('CONFIG_MPATH', mpathpersist.found())
1636config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001637config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08001638config_host_data.set('CONFIG_CURSES', curses.found())
Thomas Huth8bc51842021-07-13 13:09:02 +02001639config_host_data.set('CONFIG_GBM', gbm.found())
Paolo Bonzini75440602022-04-20 17:33:44 +02001640config_host_data.set('CONFIG_GIO', gio.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001641config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
1642if glusterfs.found()
1643 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
1644 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
1645 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
1646 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
1647 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
1648 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
1649endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001650config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001651config_host_data.set('CONFIG_VTE', vte.found())
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001652config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001653config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001654config_host_data.set('CONFIG_EBPF', libbpf.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001655config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001656config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01001657config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Thomas Huthe6a52b32021-12-09 15:48:01 +01001658config_host_data.set('CONFIG_LIBSSH', libssh.found())
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02001659config_host_data.set('CONFIG_LINUX_AIO', libaio.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001660config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
1661config_host_data.set('CONFIG_LIBPMEM', libpmem.found())
Paolo Bonzini488a8c72021-12-21 12:38:27 +01001662config_host_data.set('CONFIG_NUMA', numa.found())
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001663config_host_data.set('CONFIG_OPENGL', opengl.found())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02001664config_host_data.set('CONFIG_PROFILER', get_option('profiler'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001665config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini3730a732022-04-20 17:33:41 +02001666config_host_data.set('CONFIG_RDMA', rdma.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001667config_host_data.set('CONFIG_SDL', sdl.found())
1668config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01001669config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01001670config_host_data.set('CONFIG_SNAPPY', snappy.found())
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01001671config_host_data.set('CONFIG_TPM', have_tpm)
Paolo Bonzini90540f32021-06-03 11:15:26 +02001672config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
Paolo Bonzinie1723992021-10-07 15:08:21 +02001673config_host_data.set('CONFIG_VDE', vde.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001674config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Kshitij Suri95f85102022-04-08 07:13:34 +00001675config_host_data.set('CONFIG_PNG', png.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001676config_host_data.set('CONFIG_VNC', vnc.found())
1677config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001678config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini69202b42020-11-17 14:46:21 +01001679config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001680config_host_data.set('CONFIG_VTE', vte.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001681config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001682config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04001683config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02001684config_host_data.set('CONFIG_GNUTLS', gnutls.found())
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001685config_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02001686config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
1687config_host_data.set('CONFIG_NETTLE', nettle.found())
1688config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04001689config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01001690config_host_data.set('CONFIG_STATX', has_statx)
Hanna Reitz4ce7a082022-02-23 10:23:40 +01001691config_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id)
Paolo Bonzinib1def332020-11-17 13:37:39 +01001692config_host_data.set('CONFIG_ZSTD', zstd.found())
Max Reitza484a712020-10-27 20:05:41 +01001693config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01001694config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001695config_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
Marc-André Lureauddece462021-10-06 14:18:09 +04001696if spice_protocol.found()
1697config_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0])
1698config_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1])
1699config_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2])
1700endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001701config_host_data.set('CONFIG_SPICE', spice.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01001702config_host_data.set('CONFIG_X11', x11.found())
Marc-André Lureau142ca622021-07-15 11:53:53 +04001703config_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display)
Daniele Buono9e62ba42020-12-04 18:06:14 -05001704config_host_data.set('CONFIG_CFI', get_option('cfi'))
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06001705config_host_data.set('CONFIG_SELINUX', selinux.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001706config_host_data.set('CONFIG_XEN_BACKEND', xen.found())
1707if xen.found()
1708 # protect from xen.version() having less than three components
1709 xen_version = xen.version().split('.') + ['0', '0']
1710 xen_ctrl_version = xen_version[0] + \
1711 ('0' + xen_version[1]).substring(-2) + \
1712 ('0' + xen_version[2]).substring(-2)
1713 config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version)
1714endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001715config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1716config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1717config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1718config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1719
Paolo Bonzinia6305082021-10-07 15:08:15 +02001720config_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001721config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
1722
Paolo Bonzini728c0a22021-10-13 11:52:03 +02001723have_coroutine_pool = get_option('coroutine_pool')
1724if get_option('debug_stack_usage') and have_coroutine_pool
1725 message('Disabling coroutine pool to measure stack usage')
1726 have_coroutine_pool = false
1727endif
1728config_host_data.set10('CONFIG_COROUTINE_POOL', have_coroutine_pool)
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02001729config_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex'))
Paolo Bonzini728c0a22021-10-13 11:52:03 +02001730config_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02001731config_host_data.set('CONFIG_GPROF', get_option('gprof'))
Paolo Bonzini406523f2021-10-13 11:43:54 +02001732config_host_data.set('CONFIG_LIVE_BLOCK_MIGRATION', get_option('live_block_migration').allowed())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02001733config_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug'))
Paolo Bonzini406523f2021-10-13 11:43:54 +02001734config_host_data.set('CONFIG_REPLICATION', get_option('live_block_migration').allowed())
1735
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001736# has_header
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001737config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02001738config_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
1739config_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
Thomas Huth48f670e2020-11-18 18:10:52 +01001740config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01001741config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01001742config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001743config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001744config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01001745config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001746
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001747# has_function
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001748config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001749config_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
1750config_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
1751config_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
1752config_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
Peter Maydell86983432022-02-26 18:07:19 +00001753# Note that we need to specify prefix: here to avoid incorrectly
1754# thinking that Windows has posix_memalign()
1755config_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>'))
Peter Maydell5c8c7142022-02-26 18:07:20 +00001756config_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc'))
Peter Maydell88454f82022-02-26 18:07:21 +00001757config_host_data.set('CONFIG_VALLOC', cc.has_function('valloc'))
1758config_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001759config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001760config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
Keno Fischer029ed1b2022-02-27 17:35:20 -05001761config_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001762config_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
1763config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
1764config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
1765config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
1766config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001767config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
Andrew Deason59e35c72022-04-26 14:55:22 -05001768config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001769config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02001770config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001771config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Li Zhijian911965a2021-09-10 15:02:55 +08001772if rdma.found()
1773 config_host_data.set('HAVE_IBV_ADVISE_MR',
1774 cc.has_function('ibv_advise_mr',
Paolo Bonzini3730a732022-04-20 17:33:41 +02001775 dependencies: rdma,
Li Zhijian911965a2021-09-10 15:02:55 +08001776 prefix: '#include <infiniband/verbs.h>'))
1777endif
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001778
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001779# has_header_symbol
1780config_host_data.set('CONFIG_BYTESWAP_H',
1781 cc.has_header_symbol('byteswap.h', 'bswap_32'))
1782config_host_data.set('CONFIG_EPOLL_CREATE1',
1783 cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
1784config_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
1785 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
1786 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
1787config_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
1788 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
1789config_host_data.set('CONFIG_FIEMAP',
1790 cc.has_header('linux/fiemap.h') and
1791 cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001792config_host_data.set('CONFIG_GETRANDOM',
1793 cc.has_function('getrandom') and
1794 cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001795config_host_data.set('CONFIG_INOTIFY',
1796 cc.has_header_symbol('sys/inotify.h', 'inotify_init'))
1797config_host_data.set('CONFIG_INOTIFY1',
1798 cc.has_header_symbol('sys/inotify.h', 'inotify_init1'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001799config_host_data.set('CONFIG_MACHINE_BSWAP_H',
1800 cc.has_header_symbol('machine/bswap.h', 'bswap32',
1801 prefix: '''#include <sys/endian.h>
1802 #include <sys/types.h>'''))
1803config_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
1804 cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001805config_host_data.set('CONFIG_RTNETLINK',
1806 cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
1807config_host_data.set('CONFIG_SYSMACROS',
1808 cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001809config_host_data.set('HAVE_OPTRESET',
1810 cc.has_header_symbol('getopt.h', 'optreset'))
Marc-André Lureau653163f2021-09-07 16:19:13 +04001811config_host_data.set('HAVE_IPPROTO_MPTCP',
1812 cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001813
1814# has_member
1815config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
1816 cc.has_member('struct sigevent', 'sigev_notify_thread_id',
1817 prefix: '#include <signal.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02001818config_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
1819 cc.has_member('struct stat', 'st_atim',
1820 prefix: '#include <sys/stat.h>'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001821
Paolo Bonzini6a23f812021-11-16 08:28:29 +01001822# has_type
1823config_host_data.set('CONFIG_IOVEC',
1824 cc.has_type('struct iovec',
1825 prefix: '#include <sys/uio.h>'))
1826config_host_data.set('HAVE_UTMPX',
1827 cc.has_type('struct utmpx',
1828 prefix: '#include <utmpx.h>'))
1829
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001830config_host_data.set('CONFIG_EVENTFD', cc.links('''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001831 #include <sys/eventfd.h>
1832 int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001833config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001834 #include <unistd.h>
1835 int main(void) {
1836 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
1837 return fdatasync(0);
1838 #else
1839 #error Not supported
1840 #endif
1841 }'''))
Andrew Deason8900c202022-03-15 22:52:25 -05001842
1843has_madvise = cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001844 #include <sys/types.h>
1845 #include <sys/mman.h>
1846 #include <stddef.h>
Andrew Deason8900c202022-03-15 22:52:25 -05001847 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')
1848missing_madvise_proto = false
1849if has_madvise
1850 # Some platforms (illumos and Solaris before Solaris 11) provide madvise()
1851 # but forget to prototype it. In this case, has_madvise will be true (the
1852 # test program links despite a compile warning). To detect the
1853 # missing-prototype case, we try again with a definitely-bogus prototype.
1854 # This will only compile if the system headers don't provide the prototype;
1855 # otherwise the conflicting prototypes will cause a compiler error.
1856 missing_madvise_proto = cc.links(gnu_source_prefix + '''
1857 #include <sys/types.h>
1858 #include <sys/mman.h>
1859 #include <stddef.h>
1860 extern int madvise(int);
1861 int main(void) { return madvise(0); }''')
1862endif
1863config_host_data.set('CONFIG_MADVISE', has_madvise)
1864config_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto)
1865
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001866config_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001867 #include <sys/mman.h>
1868 int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001869config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02001870 #include <fcntl.h>
1871 #if !defined(AT_EMPTY_PATH)
1872 # error missing definition
1873 #else
1874 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
1875 #endif'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001876config_host_data.set('CONFIG_PIPE2', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001877 #include <unistd.h>
1878 #include <fcntl.h>
1879
1880 int main(void)
1881 {
1882 int pipefd[2];
1883 return pipe2(pipefd, O_CLOEXEC);
1884 }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001885config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001886 #include <sys/mman.h>
1887 #include <stddef.h>
1888 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
Paolo Bonzini10f6b232021-10-07 15:08:19 +02001889
Paolo Bonzini6a23f812021-11-16 08:28:29 +01001890config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02001891 #include <pthread.h>
1892
1893 static void *f(void *p) { return NULL; }
1894 int main(void)
1895 {
1896 pthread_t thread;
1897 pthread_create(&thread, 0, f, 0);
1898 pthread_setname_np(thread, "QEMU");
1899 return 0;
1900 }''', dependencies: threads))
Paolo Bonzini6a23f812021-11-16 08:28:29 +01001901config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02001902 #include <pthread.h>
1903
1904 static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
1905 int main(void)
1906 {
1907 pthread_t thread;
1908 pthread_create(&thread, 0, f, 0);
1909 return 0;
1910 }''', dependencies: threads))
Longpeng(Mike)657ac982022-02-22 17:05:05 +08001911config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + '''
1912 #include <pthread.h>
1913 #include <time.h>
1914
1915 int main(void)
1916 {
1917 pthread_condattr_t attr
1918 pthread_condattr_init(&attr);
1919 pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
1920 return 0;
1921 }''', dependencies: threads))
Paolo Bonzini10f6b232021-10-07 15:08:19 +02001922
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001923config_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
Kacper Słomiński6bd17dc2021-09-05 03:16:22 +02001924 #include <sys/signalfd.h>
1925 #include <stddef.h>
1926 int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001927config_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001928 #include <unistd.h>
1929 #include <fcntl.h>
1930 #include <limits.h>
1931
1932 int main(void)
1933 {
1934 int len, fd = 0;
1935 len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
1936 splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
1937 return 0;
1938 }'''))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001939
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02001940config_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
1941 #include <sys/mman.h>
1942 int main(int argc, char *argv[]) {
1943 return mlockall(MCL_FUTURE);
1944 }'''))
1945
Thomas Hutheea94532021-10-28 20:59:08 +02001946have_l2tpv3 = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001947if get_option('l2tpv3').allowed() and have_system
Paolo Bonzini6a23f812021-11-16 08:28:29 +01001948 have_l2tpv3 = cc.has_type('struct mmsghdr',
1949 prefix: gnu_source_prefix + '''
1950 #include <sys/socket.h>
1951 #include <linux/ip.h>''')
Thomas Hutheea94532021-10-28 20:59:08 +02001952endif
1953config_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
1954
Paolo Bonzini837b84b2021-10-07 15:08:22 +02001955have_netmap = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001956if get_option('netmap').allowed() and have_system
Paolo Bonzini837b84b2021-10-07 15:08:22 +02001957 have_netmap = cc.compiles('''
1958 #include <inttypes.h>
1959 #include <net/if.h>
1960 #include <net/netmap.h>
1961 #include <net/netmap_user.h>
1962 #if (NETMAP_API < 11) || (NETMAP_API > 15)
1963 #error
1964 #endif
1965 int main(void) { return 0; }''')
1966 if not have_netmap and get_option('netmap').enabled()
1967 error('Netmap headers not available')
1968 endif
1969endif
1970config_host_data.set('CONFIG_NETMAP', have_netmap)
1971
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02001972# Work around a system header bug with some kernel/XFS header
1973# versions where they both try to define 'struct fsxattr':
1974# xfs headers will not try to redefine structs from linux headers
1975# if this macro is set.
1976config_host_data.set('HAVE_FSXATTR', cc.links('''
Paolo Bonzini6a23f812021-11-16 08:28:29 +01001977 #include <linux/fs.h>
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02001978 struct fsxattr foo;
1979 int main(void) {
1980 return 0;
1981 }'''))
1982
Paolo Bonzinie46bd552021-06-03 11:57:04 +02001983# Some versions of Mac OS X incorrectly define SIZE_MAX
1984config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
1985 #include <stdint.h>
1986 #include <stdio.h>
1987 int main(int argc, char *argv[]) {
1988 return printf("%zu", SIZE_MAX);
1989 }''', args: ['-Werror']))
1990
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04001991atomic_test = '''
Paolo Bonzinibd87a362021-10-07 15:08:25 +02001992 #include <stdint.h>
1993 int main(void)
1994 {
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04001995 @0@ x = 0, y = 0;
Paolo Bonzinibd87a362021-10-07 15:08:25 +02001996 y = __atomic_load_n(&x, __ATOMIC_RELAXED);
1997 __atomic_store_n(&x, y, __ATOMIC_RELAXED);
1998 __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
1999 __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
2000 __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
2001 return 0;
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002002 }'''
2003
2004# See if 64-bit atomic operations are supported.
2005# Note that without __atomic builtins, we can only
2006# assume atomic loads/stores max at pointer size.
2007config_host_data.set('CONFIG_ATOMIC64', cc.links(atomic_test.format('uint64_t')))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002008
Marc-André Lureau848126d2022-02-28 15:49:19 +04002009has_int128 = cc.links('''
2010 __int128_t a;
2011 __uint128_t b;
2012 int main (void) {
2013 a = a + b;
2014 b = a * b;
2015 a = a * a;
2016 return 0;
2017 }''')
2018
2019config_host_data.set('CONFIG_INT128', has_int128)
2020
2021if has_int128
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002022 # "do we have 128-bit atomics which are handled inline and specifically not
2023 # via libatomic". The reason we can't use libatomic is documented in the
2024 # comment starting "GCC is a house divided" in include/qemu/atomic128.h.
2025 has_atomic128 = cc.links(atomic_test.format('unsigned __int128'))
Marc-André Lureau848126d2022-02-28 15:49:19 +04002026
2027 config_host_data.set('CONFIG_ATOMIC128', has_atomic128)
2028
2029 if not has_atomic128
2030 has_cmpxchg128 = cc.links('''
2031 int main(void)
2032 {
2033 unsigned __int128 x = 0, y = 0;
2034 __sync_val_compare_and_swap_16(&x, y, x);
2035 return 0;
2036 }
2037 ''')
2038
2039 config_host_data.set('CONFIG_CMPXCHG128', has_cmpxchg128)
2040 endif
2041endif
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002042
2043config_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
2044 #include <sys/auxv.h>
2045 int main(void) {
2046 return getauxval(AT_HWCAP) == 0;
2047 }'''))
2048
Paolo Bonzini0dae95d2022-04-20 17:33:43 +02002049config_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles('''
2050 #include <linux/usbdevice_fs.h>
2051
2052 #ifndef USBDEVFS_GET_CAPABILITIES
2053 #error "USBDEVFS_GET_CAPABILITIES undefined"
2054 #endif
2055
2056 #ifndef USBDEVFS_DISCONNECT_CLAIM
2057 #error "USBDEVFS_DISCONNECT_CLAIM undefined"
2058 #endif
2059
2060 int main(void) { return 0; }'''))
2061
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02002062have_keyring = get_option('keyring') \
2063 .require(targetos == 'linux', error_message: 'keyring is only available on Linux') \
2064 .require(cc.compiles('''
2065 #include <errno.h>
2066 #include <asm/unistd.h>
2067 #include <linux/keyctl.h>
2068 #include <sys/syscall.h>
2069 #include <unistd.h>
2070 int main(void) {
2071 return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
2072 }'''), error_message: 'keyctl syscall not available on this system').allowed()
2073config_host_data.set('CONFIG_SECRET_KEYRING', have_keyring)
2074
Paolo Bonzini622753d2021-11-08 13:38:58 +01002075have_cpuid_h = cc.links('''
2076 #include <cpuid.h>
2077 int main(void) {
2078 unsigned a, b, c, d;
2079 unsigned max = __get_cpuid_max(0, 0);
2080
2081 if (max >= 1) {
2082 __cpuid(1, a, b, c, d);
2083 }
2084
2085 if (max >= 7) {
2086 __cpuid_count(7, 0, a, b, c, d);
2087 }
2088
2089 return 0;
2090 }''')
2091config_host_data.set('CONFIG_CPUID_H', have_cpuid_h)
2092
2093config_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \
2094 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \
2095 .require(cc.links('''
2096 #pragma GCC push_options
2097 #pragma GCC target("avx2")
2098 #include <cpuid.h>
2099 #include <immintrin.h>
2100 static int bar(void *a) {
2101 __m256i x = *(__m256i *)a;
2102 return _mm256_testz_si256(x, x);
2103 }
2104 int main(int argc, char *argv[]) { return bar(argv[0]); }
2105 '''), error_message: 'AVX2 not available').allowed())
2106
2107config_host_data.set('CONFIG_AVX512F_OPT', get_option('avx512f') \
2108 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512F') \
2109 .require(cc.links('''
2110 #pragma GCC push_options
2111 #pragma GCC target("avx512f")
2112 #include <cpuid.h>
2113 #include <immintrin.h>
2114 static int bar(void *a) {
2115 __m512i x = *(__m512i *)a;
2116 return _mm512_test_epi64_mask(x, x);
2117 }
2118 int main(int argc, char *argv[]) { return bar(argv[0]); }
2119 '''), error_message: 'AVX512F not available').allowed())
2120
Paolo Bonzini3730a732022-04-20 17:33:41 +02002121have_pvrdma = get_option('pvrdma') \
2122 .require(rdma.found(), error_message: 'PVRDMA requires OpenFabrics libraries') \
2123 .require(cc.compiles('''
2124 int main(void)
2125 {
2126 char buf = 0;
2127 void *addr = &buf;
2128 addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
2129
2130 return 0;
2131 }'''), error_message: 'PVRDMA requires mremap').allowed()
2132
2133if have_pvrdma
2134 config_host_data.set('LEGACY_RDMA_REG_MR', not cc.compiles('''
2135 #include <infiniband/verbs.h>
2136 int main(void)
2137 {
2138 struct ibv_mr *mr;
2139 struct ibv_pd *pd = NULL;
2140 size_t length = 10;
2141 uint64_t iova = 0;
2142 int access = 0;
2143 void *addr = NULL;
2144
2145 mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
2146 ibv_dereg_mr(mr);
2147 return 0;
2148 }'''))
2149endif
2150
Paolo Bonzinib87df902021-11-08 13:52:11 +01002151if get_option('membarrier').disabled()
2152 have_membarrier = false
2153elif targetos == 'windows'
2154 have_membarrier = true
2155elif targetos == 'linux'
2156 have_membarrier = cc.compiles('''
2157 #include <linux/membarrier.h>
2158 #include <sys/syscall.h>
2159 #include <unistd.h>
2160 #include <stdlib.h>
2161 int main(void) {
2162 syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
2163 syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
2164 exit(0);
2165 }''')
2166endif
2167config_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \
2168 .require(have_membarrier, error_message: 'membarrier system call not available') \
2169 .allowed())
2170
Paolo Bonzini34b52612021-11-08 14:02:42 +01002171have_afalg = get_option('crypto_afalg') \
2172 .require(cc.compiles(gnu_source_prefix + '''
2173 #include <errno.h>
2174 #include <sys/types.h>
2175 #include <sys/socket.h>
2176 #include <linux/if_alg.h>
2177 int main(void) {
2178 int sock;
2179 sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
2180 return sock;
2181 }
2182 '''), error_message: 'AF_ALG requested but could not be detected').allowed()
2183config_host_data.set('CONFIG_AF_ALG', have_afalg)
2184
Marc-André Lureau9d734b82022-04-01 15:50:05 +04002185config_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
2186 'linux/vm_sockets.h', 'AF_VSOCK',
2187 prefix: '#include <sys/socket.h>',
2188))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002189
Marc-André Lureau8821a382022-02-01 16:53:43 +04002190have_vss = false
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002191have_vss_sdk = false # old xp/2003 SDK
Marc-André Lureau8821a382022-02-01 16:53:43 +04002192if targetos == 'windows' and link_language == 'cpp'
2193 have_vss = cxx.compiles('''
2194 #define __MIDL_user_allocate_free_DEFINED__
Marc-André Lureau32478cb2022-02-22 23:40:01 +04002195 #include <vss.h>
Marc-André Lureau8821a382022-02-01 16:53:43 +04002196 int main(void) { return VSS_CTX_BACKUP; }''')
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002197 have_vss_sdk = cxx.has_header('vscoordint.h')
Marc-André Lureau8821a382022-02-01 16:53:43 +04002198endif
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002199config_host_data.set('HAVE_VSS_SDK', have_vss_sdk)
Marc-André Lureau8821a382022-02-01 16:53:43 +04002200
Paolo Bonzinia76a1f62021-10-13 10:04:24 +02002201ignored = ['CONFIG_QEMU_INTERP_PREFIX', # actually per-target
2202 'HAVE_GDB_BIN']
Paolo Bonzini87430d52021-10-07 15:06:09 +02002203arrays = ['CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
Paolo Bonzini859aef02020-08-04 18:14:26 +02002204foreach k, v: config_host
Paolo Bonzini765686d2020-09-18 06:37:21 -04002205 if ignored.contains(k)
2206 # do nothing
2207 elif arrays.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +02002208 if v != ''
2209 v = '"' + '", "'.join(v.split()) + '", '
2210 endif
2211 config_host_data.set(k, v)
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002212 elif k.startswith('CONFIG_')
Paolo Bonzini859aef02020-08-04 18:14:26 +02002213 config_host_data.set(k, v == 'y' ? 1 : v)
2214 endif
2215endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +02002216
Richard Henderson6391c772022-04-17 11:30:06 -07002217# Older versions of MinGW do not import _lock_file and _unlock_file properly.
2218# This was fixed for v6.0.0 with commit b48e3ac8969d.
2219if targetos == 'windows'
2220 config_host_data.set('HAVE__LOCK_FILE', cc.links('''
2221 #include <stdio.h>
2222 int main(void) {
2223 _lock_file(NULL);
2224 _unlock_file(NULL);
2225 return 0;
2226 }''', name: '_lock_file and _unlock_file'))
2227endif
2228
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002229########################
2230# Target configuration #
2231########################
2232
Paolo Bonzini2becc362020-02-03 11:42:03 +01002233minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -04002234config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04002235config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002236config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002237config_devices_mak_list = []
2238config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02002239config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002240config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002241
2242disassemblers = {
2243 'alpha' : ['CONFIG_ALPHA_DIS'],
2244 'arm' : ['CONFIG_ARM_DIS'],
2245 'avr' : ['CONFIG_AVR_DIS'],
2246 'cris' : ['CONFIG_CRIS_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06002247 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002248 'hppa' : ['CONFIG_HPPA_DIS'],
2249 'i386' : ['CONFIG_I386_DIS'],
2250 'x86_64' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002251 'm68k' : ['CONFIG_M68K_DIS'],
2252 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
2253 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002254 'nios2' : ['CONFIG_NIOS2_DIS'],
2255 'or1k' : ['CONFIG_OPENRISC_DIS'],
2256 'ppc' : ['CONFIG_PPC_DIS'],
2257 'riscv' : ['CONFIG_RISCV_DIS'],
2258 'rx' : ['CONFIG_RX_DIS'],
2259 's390' : ['CONFIG_S390_DIS'],
2260 'sh4' : ['CONFIG_SH4_DIS'],
2261 'sparc' : ['CONFIG_SPARC_DIS'],
2262 'xtensa' : ['CONFIG_XTENSA_DIS'],
2263}
2264if link_language == 'cpp'
2265 disassemblers += {
2266 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
2267 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
2268 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
2269 }
2270endif
2271
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002272have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
Paolo Bonzini0a189112020-11-17 14:58:32 +01002273host_kconfig = \
Paolo Bonzini537b7242021-10-07 15:08:12 +02002274 (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01002275 (have_tpm ? ['CONFIG_TPM=y'] : []) + \
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002276 (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
Paolo Bonziniccd250a2021-06-03 12:50:17 +02002277 (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
Paolo Bonzini88b6e612022-04-20 17:33:40 +02002278 (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01002279 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01002280 ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
2281 ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
2282 ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01002283 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01002284 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
Paolo Bonzini3730a732022-04-20 17:33:41 +02002285 (have_pvrdma ? ['CONFIG_PVRDMA=y'] : []) + \
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01002286 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01002287
Paolo Bonzinia9a74902020-09-21 05:11:01 -04002288ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002289
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002290default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
2291actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002292fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002293foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04002294 config_target = { 'TARGET_NAME': target.split('-')[0] }
2295 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002296 if targetos != 'linux'
2297 if default_targets
2298 continue
2299 endif
2300 error('Target @0@ is only available on a Linux host'.format(target))
2301 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04002302 config_target += { 'CONFIG_LINUX_USER': 'y' }
2303 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002304 if 'CONFIG_BSD' not in config_host
2305 if default_targets
2306 continue
2307 endif
2308 error('Target @0@ is only available on a BSD host'.format(target))
2309 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04002310 config_target += { 'CONFIG_BSD_USER': 'y' }
2311 elif target.endswith('softmmu')
2312 config_target += { 'CONFIG_SOFTMMU': 'y' }
2313 endif
2314 if target.endswith('-user')
2315 config_target += {
2316 'CONFIG_USER_ONLY': 'y',
2317 'CONFIG_QEMU_INTERP_PREFIX':
2318 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
2319 }
2320 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002321
Paolo Bonzini0a189112020-11-17 14:58:32 +01002322 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04002323 foreach sym: accelerators
2324 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
2325 config_target += { sym: 'y' }
2326 config_all += { sym: 'y' }
Paolo Bonzini23a77b22020-12-14 12:01:45 +01002327 if sym == 'CONFIG_TCG' and tcg_arch == 'tci'
2328 config_target += { 'CONFIG_TCG_INTERPRETER': 'y' }
Paolo Bonzini8a199802020-09-18 05:37:01 -04002329 endif
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02002330 if target in modular_tcg
2331 config_target += { 'CONFIG_TCG_MODULAR': 'y' }
2332 else
2333 config_target += { 'CONFIG_TCG_BUILTIN': 'y' }
2334 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01002335 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04002336 endif
2337 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01002338 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002339 if default_targets
2340 continue
2341 endif
2342 error('No accelerator available for target @0@'.format(target))
2343 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04002344
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002345 actual_target_dirs += target
Alex Bennée812b31d2021-07-07 14:17:43 +01002346 config_target += keyval.load('configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04002347 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04002348
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002349 if 'TARGET_NEED_FDT' in config_target
2350 fdt_required += target
2351 endif
2352
Paolo Bonzinifa731682020-09-21 05:19:07 -04002353 # Add default keys
2354 if 'TARGET_BASE_ARCH' not in config_target
2355 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
2356 endif
2357 if 'TARGET_ABI_DIR' not in config_target
2358 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
2359 endif
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04002360 if 'TARGET_BIG_ENDIAN' not in config_target
2361 config_target += {'TARGET_BIG_ENDIAN': 'n'}
2362 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002363
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002364 foreach k, v: disassemblers
Paolo Bonzini823eb012021-11-08 14:18:17 +01002365 if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002366 foreach sym: v
2367 config_target += { sym: 'y' }
2368 config_all_disas += { sym: 'y' }
2369 endforeach
2370 endif
2371 endforeach
2372
Paolo Bonzini859aef02020-08-04 18:14:26 +02002373 config_target_data = configuration_data()
2374 foreach k, v: config_target
2375 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
2376 # do nothing
2377 elif ignored.contains(k)
2378 # do nothing
2379 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04002380 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
2381 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02002382 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04002383 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02002384 config_target_data.set_quoted(k, v)
2385 elif v == 'y'
2386 config_target_data.set(k, 1)
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04002387 elif v == 'n'
2388 config_target_data.set(k, 0)
Paolo Bonzini859aef02020-08-04 18:14:26 +02002389 else
2390 config_target_data.set(k, v)
2391 endif
2392 endforeach
Peter Maydellcb2c5532021-07-30 11:59:43 +01002393 config_target_data.set('QEMU_ARCH',
2394 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
Paolo Bonzini859aef02020-08-04 18:14:26 +02002395 config_target_h += {target: configure_file(output: target + '-config-target.h',
2396 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002397
2398 if target.endswith('-softmmu')
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01002399 config_input = meson.get_external_property(target, 'default')
Paolo Bonzini2becc362020-02-03 11:42:03 +01002400 config_devices_mak = target + '-config-devices.mak'
2401 config_devices_mak = configure_file(
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01002402 input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01002403 output: config_devices_mak,
2404 depfile: config_devices_mak + '.d',
2405 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01002406 command: [minikconf,
2407 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01002408 config_devices_mak, '@DEPFILE@', '@INPUT@',
Philippe Mathieu-Daudéf4063f92021-07-07 14:17:40 +01002409 host_kconfig, accel_kconfig,
2410 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'])
Paolo Bonzini859aef02020-08-04 18:14:26 +02002411
2412 config_devices_data = configuration_data()
2413 config_devices = keyval.load(config_devices_mak)
2414 foreach k, v: config_devices
2415 config_devices_data.set(k, 1)
2416 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01002417 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02002418 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
2419 configuration: config_devices_data)}
2420 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04002421 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01002422 endif
2423 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002424endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002425target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002426
Paolo Bonzini2becc362020-02-03 11:42:03 +01002427# This configuration is used to build files that are shared by
2428# multiple binaries, and then extracted out of the "common"
2429# static_library target.
2430#
2431# We do not use all_sources()/all_dependencies(), because it would
2432# build literally all source files, including devices only used by
2433# targets that are not built for this compilation. The CONFIG_ALL
2434# pseudo symbol replaces it.
2435
Paolo Bonzini05512f52020-09-16 15:31:11 -04002436config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01002437config_all += config_host
2438config_all += config_all_disas
2439config_all += {
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002440 'CONFIG_XEN': xen.found(),
Paolo Bonzini2becc362020-02-03 11:42:03 +01002441 'CONFIG_SOFTMMU': have_system,
2442 'CONFIG_USER_ONLY': have_user,
2443 'CONFIG_ALL': true,
2444}
2445
Paolo Bonzinieed56e92021-11-10 11:01:26 +01002446target_configs_h = []
2447foreach target: target_dirs
2448 target_configs_h += config_target_h[target]
2449 target_configs_h += config_devices_h.get(target, [])
2450endforeach
2451genh += custom_target('config-poison.h',
2452 input: [target_configs_h],
2453 output: 'config-poison.h',
2454 capture: true,
2455 command: [find_program('scripts/make-config-poison.sh'),
2456 target_configs_h])
2457
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002458##############
2459# Submodules #
2460##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002461
2462capstone = not_found
2463capstone_opt = get_option('capstone')
2464if capstone_opt in ['enabled', 'auto', 'system']
2465 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
Richard Hendersonbcf36862020-09-21 09:46:16 -07002466 capstone = dependency('capstone', version: '>=4.0',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01002467 kwargs: static_kwargs, method: 'pkg-config',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002468 required: capstone_opt == 'system' or
2469 capstone_opt == 'enabled' and not have_internal)
Daniel P. Berrangé8f4aea72021-07-09 15:29:31 +01002470
2471 # Some versions of capstone have broken pkg-config file
2472 # that reports a wrong -I path, causing the #include to
2473 # fail later. If the system has such a broken version
2474 # do not use it.
2475 if capstone.found() and not cc.compiles('#include <capstone.h>',
2476 dependencies: [capstone])
2477 capstone = not_found
2478 if capstone_opt == 'system'
2479 error('system capstone requested, it does not appear to work')
2480 endif
2481 endif
2482
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002483 if capstone.found()
2484 capstone_opt = 'system'
2485 elif have_internal
2486 capstone_opt = 'internal'
2487 else
2488 capstone_opt = 'disabled'
2489 endif
2490endif
2491if capstone_opt == 'internal'
2492 capstone_data = configuration_data()
2493 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
2494
2495 capstone_files = files(
2496 'capstone/cs.c',
2497 'capstone/MCInst.c',
2498 'capstone/MCInstrDesc.c',
2499 'capstone/MCRegisterInfo.c',
2500 'capstone/SStream.c',
2501 'capstone/utils.c'
2502 )
2503
2504 if 'CONFIG_ARM_DIS' in config_all_disas
2505 capstone_data.set('CAPSTONE_HAS_ARM', '1')
2506 capstone_files += files(
2507 'capstone/arch/ARM/ARMDisassembler.c',
2508 'capstone/arch/ARM/ARMInstPrinter.c',
2509 'capstone/arch/ARM/ARMMapping.c',
2510 'capstone/arch/ARM/ARMModule.c'
2511 )
2512 endif
2513
2514 # FIXME: This config entry currently depends on a c++ compiler.
2515 # Which is needed for building libvixl, but not for capstone.
2516 if 'CONFIG_ARM_A64_DIS' in config_all_disas
2517 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
2518 capstone_files += files(
2519 'capstone/arch/AArch64/AArch64BaseInfo.c',
2520 'capstone/arch/AArch64/AArch64Disassembler.c',
2521 'capstone/arch/AArch64/AArch64InstPrinter.c',
2522 'capstone/arch/AArch64/AArch64Mapping.c',
2523 'capstone/arch/AArch64/AArch64Module.c'
2524 )
2525 endif
2526
2527 if 'CONFIG_PPC_DIS' in config_all_disas
2528 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
2529 capstone_files += files(
2530 'capstone/arch/PowerPC/PPCDisassembler.c',
2531 'capstone/arch/PowerPC/PPCInstPrinter.c',
2532 'capstone/arch/PowerPC/PPCMapping.c',
2533 'capstone/arch/PowerPC/PPCModule.c'
2534 )
2535 endif
2536
Richard Henderson3d562842020-01-04 07:24:59 +10002537 if 'CONFIG_S390_DIS' in config_all_disas
2538 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
2539 capstone_files += files(
2540 'capstone/arch/SystemZ/SystemZDisassembler.c',
2541 'capstone/arch/SystemZ/SystemZInstPrinter.c',
2542 'capstone/arch/SystemZ/SystemZMapping.c',
2543 'capstone/arch/SystemZ/SystemZModule.c',
2544 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
2545 )
2546 endif
2547
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002548 if 'CONFIG_I386_DIS' in config_all_disas
2549 capstone_data.set('CAPSTONE_HAS_X86', 1)
2550 capstone_files += files(
2551 'capstone/arch/X86/X86Disassembler.c',
2552 'capstone/arch/X86/X86DisassemblerDecoder.c',
2553 'capstone/arch/X86/X86ATTInstPrinter.c',
2554 'capstone/arch/X86/X86IntelInstPrinter.c',
Richard Hendersoneef20e42020-09-14 16:02:02 -07002555 'capstone/arch/X86/X86InstPrinterCommon.c',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002556 'capstone/arch/X86/X86Mapping.c',
2557 'capstone/arch/X86/X86Module.c'
2558 )
2559 endif
2560
2561 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
2562
2563 capstone_cargs = [
2564 # FIXME: There does not seem to be a way to completely replace the c_args
2565 # that come from add_project_arguments() -- we can only add to them.
2566 # So: disable all warnings with a big hammer.
2567 '-Wno-error', '-w',
2568
2569 # Include all configuration defines via a header file, which will wind up
2570 # as a dependency on the object file, and thus changes here will result
2571 # in a rebuild.
2572 '-include', 'capstone-defs.h'
2573 ]
2574
2575 libcapstone = static_library('capstone',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01002576 build_by_default: false,
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002577 sources: capstone_files,
2578 c_args: capstone_cargs,
2579 include_directories: 'capstone/include')
2580 capstone = declare_dependency(link_with: libcapstone,
Richard Hendersoneef20e42020-09-14 16:02:02 -07002581 include_directories: 'capstone/include/capstone')
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002582endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002583
2584slirp = not_found
2585slirp_opt = 'disabled'
2586if have_system
2587 slirp_opt = get_option('slirp')
2588 if slirp_opt in ['enabled', 'auto', 'system']
2589 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01002590 slirp = dependency('slirp', kwargs: static_kwargs,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002591 method: 'pkg-config',
2592 required: slirp_opt == 'system' or
2593 slirp_opt == 'enabled' and not have_internal)
2594 if slirp.found()
2595 slirp_opt = 'system'
2596 elif have_internal
2597 slirp_opt = 'internal'
2598 else
2599 slirp_opt = 'disabled'
2600 endif
2601 endif
2602 if slirp_opt == 'internal'
2603 slirp_deps = []
2604 if targetos == 'windows'
2605 slirp_deps = cc.find_library('iphlpapi')
Marc-André Lureau43f547b2021-05-18 19:51:11 +04002606 elif targetos == 'darwin'
2607 slirp_deps = cc.find_library('resolv')
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002608 endif
2609 slirp_conf = configuration_data()
2610 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
2611 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
2612 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
2613 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
2614 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
2615 slirp_files = [
2616 'slirp/src/arp_table.c',
2617 'slirp/src/bootp.c',
2618 'slirp/src/cksum.c',
2619 'slirp/src/dhcpv6.c',
2620 'slirp/src/dnssearch.c',
2621 'slirp/src/if.c',
2622 'slirp/src/ip6_icmp.c',
2623 'slirp/src/ip6_input.c',
2624 'slirp/src/ip6_output.c',
2625 'slirp/src/ip_icmp.c',
2626 'slirp/src/ip_input.c',
2627 'slirp/src/ip_output.c',
2628 'slirp/src/mbuf.c',
2629 'slirp/src/misc.c',
2630 'slirp/src/ncsi.c',
2631 'slirp/src/ndp_table.c',
2632 'slirp/src/sbuf.c',
2633 'slirp/src/slirp.c',
2634 'slirp/src/socket.c',
2635 'slirp/src/state.c',
2636 'slirp/src/stream.c',
2637 'slirp/src/tcp_input.c',
2638 'slirp/src/tcp_output.c',
2639 'slirp/src/tcp_subr.c',
2640 'slirp/src/tcp_timer.c',
2641 'slirp/src/tftp.c',
2642 'slirp/src/udp.c',
2643 'slirp/src/udp6.c',
2644 'slirp/src/util.c',
2645 'slirp/src/version.c',
2646 'slirp/src/vmstate.c',
2647 ]
2648
2649 configure_file(
2650 input : 'slirp/src/libslirp-version.h.in',
2651 output : 'libslirp-version.h',
2652 configuration: slirp_conf)
2653
2654 slirp_inc = include_directories('slirp', 'slirp/src')
2655 libslirp = static_library('slirp',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01002656 build_by_default: false,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002657 sources: slirp_files,
2658 c_args: slirp_cargs,
2659 include_directories: slirp_inc)
2660 slirp = declare_dependency(link_with: libslirp,
2661 dependencies: slirp_deps,
2662 include_directories: slirp_inc)
2663 endif
2664endif
2665
Daniele Buonoc7153432021-03-03 21:59:38 -05002666# For CFI, we need to compile slirp as a static library together with qemu.
2667# This is because we register slirp functions as callbacks for QEMU Timers.
2668# When using a system-wide shared libslirp, the type information for the
2669# callback is missing and the timer call produces a false positive with CFI.
2670#
2671# Now that slirp_opt has been defined, check if the selected slirp is compatible
2672# with control-flow integrity.
2673if get_option('cfi') and slirp_opt == 'system'
2674 error('Control-Flow Integrity is not compatible with system-wide slirp.' \
2675 + ' Please configure with --enable-slirp=git')
2676endif
2677
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002678fdt = not_found
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002679if have_system
Philippe Mathieu-Daudéc593d842022-02-08 11:19:46 +01002680 fdt_opt = get_option('fdt')
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002681 if fdt_opt in ['enabled', 'auto', 'system']
2682 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01002683 fdt = cc.find_library('fdt', kwargs: static_kwargs,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002684 required: fdt_opt == 'system' or
2685 fdt_opt == 'enabled' and not have_internal)
2686 if fdt.found() and cc.links('''
2687 #include <libfdt.h>
2688 #include <libfdt_env.h>
Thomas Huthde47b0f2022-01-18 18:05:48 +01002689 int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002690 dependencies: fdt)
2691 fdt_opt = 'system'
Thomas Huth6c228532021-08-27 14:09:00 +02002692 elif fdt_opt == 'system'
2693 error('system libfdt requested, but it is too old (1.5.1 or newer required)')
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002694 elif have_internal
2695 fdt_opt = 'internal'
2696 else
2697 fdt_opt = 'disabled'
Thomas Huth87daf892021-08-27 14:08:59 +02002698 fdt = not_found
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002699 endif
2700 endif
2701 if fdt_opt == 'internal'
2702 fdt_files = files(
2703 'dtc/libfdt/fdt.c',
2704 'dtc/libfdt/fdt_ro.c',
2705 'dtc/libfdt/fdt_wip.c',
2706 'dtc/libfdt/fdt_sw.c',
2707 'dtc/libfdt/fdt_rw.c',
2708 'dtc/libfdt/fdt_strerror.c',
2709 'dtc/libfdt/fdt_empty_tree.c',
2710 'dtc/libfdt/fdt_addresses.c',
2711 'dtc/libfdt/fdt_overlay.c',
2712 'dtc/libfdt/fdt_check.c',
2713 )
2714
2715 fdt_inc = include_directories('dtc/libfdt')
2716 libfdt = static_library('fdt',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01002717 build_by_default: false,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002718 sources: fdt_files,
2719 include_directories: fdt_inc)
2720 fdt = declare_dependency(link_with: libfdt,
2721 include_directories: fdt_inc)
2722 endif
Philippe Mathieu-Daudéc593d842022-02-08 11:19:46 +01002723else
2724 fdt_opt = 'disabled'
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002725endif
2726if not fdt.found() and fdt_required.length() > 0
2727 error('fdt not available but required by targets ' + ', '.join(fdt_required))
2728endif
2729
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002730config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002731config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002732config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002733
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002734#####################
2735# Generated sources #
2736#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002737
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002738genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002739
Marc-André Lureau3f885652019-07-15 18:06:04 +04002740hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04002741shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002742qapi_gen = find_program('scripts/qapi-gen.py')
Paolo Bonzini654d6b02021-02-09 14:59:26 +01002743qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
2744 meson.current_source_dir() / 'scripts/qapi/commands.py',
2745 meson.current_source_dir() / 'scripts/qapi/common.py',
2746 meson.current_source_dir() / 'scripts/qapi/error.py',
2747 meson.current_source_dir() / 'scripts/qapi/events.py',
2748 meson.current_source_dir() / 'scripts/qapi/expr.py',
2749 meson.current_source_dir() / 'scripts/qapi/gen.py',
2750 meson.current_source_dir() / 'scripts/qapi/introspect.py',
2751 meson.current_source_dir() / 'scripts/qapi/parser.py',
2752 meson.current_source_dir() / 'scripts/qapi/schema.py',
2753 meson.current_source_dir() / 'scripts/qapi/source.py',
2754 meson.current_source_dir() / 'scripts/qapi/types.py',
2755 meson.current_source_dir() / 'scripts/qapi/visit.py',
2756 meson.current_source_dir() / 'scripts/qapi/common.py',
2757 meson.current_source_dir() / 'scripts/qapi-gen.py'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002758]
2759
2760tracetool = [
2761 python, files('scripts/tracetool.py'),
Paolo Bonzini9c29b742021-10-07 15:08:14 +02002762 '--backend=' + ','.join(get_option('trace_backends'))
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002763]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002764tracetool_depends = files(
2765 'scripts/tracetool/backend/log.py',
2766 'scripts/tracetool/backend/__init__.py',
2767 'scripts/tracetool/backend/dtrace.py',
2768 'scripts/tracetool/backend/ftrace.py',
2769 'scripts/tracetool/backend/simple.py',
2770 'scripts/tracetool/backend/syslog.py',
2771 'scripts/tracetool/backend/ust.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002772 'scripts/tracetool/format/ust_events_c.py',
2773 'scripts/tracetool/format/ust_events_h.py',
2774 'scripts/tracetool/format/__init__.py',
2775 'scripts/tracetool/format/d.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002776 'scripts/tracetool/format/simpletrace_stap.py',
2777 'scripts/tracetool/format/c.py',
2778 'scripts/tracetool/format/h.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002779 'scripts/tracetool/format/log_stap.py',
2780 'scripts/tracetool/format/stap.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002781 'scripts/tracetool/__init__.py',
2782 'scripts/tracetool/transform.py',
2783 'scripts/tracetool/vcpu.py'
2784)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002785
Marc-André Lureau2c273f32019-07-15 17:10:19 +04002786qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
2787 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +02002788 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04002789qemu_version = custom_target('qemu-version.h',
2790 output: 'qemu-version.h',
2791 command: qemu_version_cmd,
2792 capture: true,
2793 build_by_default: true,
2794 build_always_stale: true)
2795genh += qemu_version
2796
Marc-André Lureau3f885652019-07-15 18:06:04 +04002797hxdep = []
2798hx_headers = [
2799 ['qemu-options.hx', 'qemu-options.def'],
2800 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
2801]
2802if have_system
2803 hx_headers += [
2804 ['hmp-commands.hx', 'hmp-commands.h'],
2805 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
2806 ]
2807endif
2808foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002809 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04002810 input: files(d[0]),
2811 output: d[1],
2812 capture: true,
2813 build_by_default: true, # to be removed when added to a target
2814 command: [hxtool, '-h', '@INPUT0@'])
2815endforeach
2816genh += hxdep
2817
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002818###################
2819# Collect sources #
2820###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002821
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02002822authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002823blockdev_ss = ss.source_set()
2824block_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002825chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002826common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02002827crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02002828hwcore_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02002829io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002830qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02002831qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002832softmmu_ss = ss.source_set()
2833specific_fuzz_ss = ss.source_set()
2834specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002835stub_ss = ss.source_set()
2836trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002837user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002838util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002839
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002840# accel modules
2841qtest_module_ss = ss.source_set()
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02002842tcg_module_ss = ss.source_set()
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002843
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002844modules = {}
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02002845target_modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002846hw_arch = {}
2847target_arch = {}
2848target_softmmu_arch = {}
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02002849target_user_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002850
2851###############
2852# Trace files #
2853###############
2854
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002855# TODO: add each directory to the subdirs from its own meson.build, once
2856# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002857trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002858 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01002859 'qapi',
2860 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002861 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01002862 'util',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002863]
Warner Losh6ddc1ab2022-01-08 17:37:23 -07002864if have_linux_user
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002865 trace_events_subdirs += [ 'linux-user' ]
2866endif
Warner Losh6ddc1ab2022-01-08 17:37:23 -07002867if have_bsd_user
2868 trace_events_subdirs += [ 'bsd-user' ]
2869endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002870if have_block
2871 trace_events_subdirs += [
2872 'authz',
2873 'block',
2874 'io',
2875 'nbd',
2876 'scsi',
2877 ]
2878endif
2879if have_system
2880 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002881 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002882 'audio',
2883 'backends',
2884 'backends/tpm',
2885 'chardev',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002886 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002887 'hw/9pfs',
2888 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08002889 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002890 'hw/alpha',
2891 'hw/arm',
2892 'hw/audio',
2893 'hw/block',
2894 'hw/block/dataplane',
2895 'hw/char',
2896 'hw/display',
2897 'hw/dma',
2898 'hw/hppa',
2899 'hw/hyperv',
2900 'hw/i2c',
2901 'hw/i386',
2902 'hw/i386/xen',
2903 'hw/ide',
2904 'hw/input',
2905 'hw/intc',
2906 'hw/isa',
2907 'hw/mem',
2908 'hw/mips',
2909 'hw/misc',
2910 'hw/misc/macio',
2911 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08002912 'hw/net/can',
Mark Cave-Aylandce0e6a22021-09-24 08:37:55 +01002913 'hw/nubus',
Klaus Jensen88eea452021-04-14 22:14:30 +02002914 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002915 'hw/nvram',
2916 'hw/pci',
2917 'hw/pci-host',
2918 'hw/ppc',
2919 'hw/rdma',
2920 'hw/rdma/vmw',
2921 'hw/rtc',
2922 'hw/s390x',
2923 'hw/scsi',
2924 'hw/sd',
BALATON Zoltanad52cfc2021-10-29 23:02:09 +02002925 'hw/sh4',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002926 'hw/sparc',
2927 'hw/sparc64',
2928 'hw/ssi',
2929 'hw/timer',
2930 'hw/tpm',
2931 'hw/usb',
2932 'hw/vfio',
2933 'hw/virtio',
2934 'hw/watchdog',
2935 'hw/xen',
2936 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002937 'migration',
2938 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02002939 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002940 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05002941 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002942 ]
2943endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002944if have_system or have_user
2945 trace_events_subdirs += [
2946 'accel/tcg',
2947 'hw/core',
2948 'target/arm',
Alexander Grafa1477da2021-09-16 17:53:58 +02002949 'target/arm/hvf',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002950 'target/hppa',
2951 'target/i386',
2952 'target/i386/kvm',
Philippe Mathieu-Daudé34b8ff22021-05-30 09:02:16 +02002953 'target/mips/tcg',
Richard Henderson6f83e272022-02-25 21:06:20 -10002954 'target/nios2',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002955 'target/ppc',
2956 'target/riscv',
2957 'target/s390x',
Cho, Yu-Chen67043602021-07-07 18:53:23 +08002958 'target/s390x/kvm',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002959 'target/sparc',
2960 ]
2961endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002962
Marc-André Lureau0df750e2020-11-25 14:06:37 +04002963vhost_user = not_found
Sergio Lopezeb9baec2022-03-04 11:08:53 +01002964if targetos == 'linux' and 'CONFIG_VHOST_USER' in config_host
Marc-André Lureau0df750e2020-11-25 14:06:37 +04002965 libvhost_user = subproject('libvhost-user')
2966 vhost_user = libvhost_user.get_variable('vhost_user_dep')
2967endif
2968
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +01002969# NOTE: the trace/ subdirectory needs the qapi_trace_events variable
2970# that is filled in by qapi/.
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002971subdir('qapi')
2972subdir('qobject')
2973subdir('stubs')
2974subdir('trace')
2975subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04002976subdir('qom')
2977subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002978subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04002979subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002980
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002981
2982if enable_modules
2983 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
2984 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
2985endif
2986
Paolo Bonzini2becc362020-02-03 11:42:03 +01002987stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002988
2989util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01002990util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002991libqemuutil = static_library('qemuutil',
2992 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +02002993 dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002994qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +04002995 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002996
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01002997if have_system or have_user
2998 decodetree = generator(find_program('scripts/decodetree.py'),
2999 output: 'decode-@BASENAME@.c.inc',
3000 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
3001 subdir('libdecnumber')
3002 subdir('target')
3003endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003004
Paolo Bonzini478e9432020-08-17 12:47:55 +02003005subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04003006subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04003007subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003008subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04003009subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003010
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003011if have_block
3012 block_ss.add(files(
3013 'block.c',
3014 'blockjob.c',
3015 'job.c',
3016 'qemu-io-cmds.c',
3017 ))
Paolo Bonzini406523f2021-10-13 11:43:54 +02003018 if config_host_data.get('CONFIG_REPLICATION')
3019 block_ss.add(files('replication.c'))
3020 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003021
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003022 subdir('nbd')
3023 subdir('scsi')
3024 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003025
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003026 blockdev_ss.add(files(
3027 'blockdev.c',
3028 'blockdev-nbd.c',
3029 'iothread.c',
3030 'job-qmp.c',
3031 ), gnutls)
Paolo Bonzini4a963372020-08-03 16:22:28 +02003032
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003033 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
3034 # os-win32.c does not
3035 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
3036 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
3037endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02003038
3039common_ss.add(files('cpus-common.c'))
3040
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02003041subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003042
Richard Hendersonf3433462020-09-12 10:47:33 -07003043common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02003044specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003045
Richard Henderson44b99a62021-03-22 12:24:26 +01003046# Work around a gcc bug/misfeature wherein constant propagation looks
3047# through an alias:
3048# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
3049# to guess that a const variable is always zero. Without lto, this is
3050# impossible, as the alias is restricted to page-vary-common.c. Indeed,
3051# without lto, not even the alias is required -- we simply use different
3052# declarations in different compilation units.
3053pagevary = files('page-vary-common.c')
3054if get_option('b_lto')
3055 pagevary_flags = ['-fno-lto']
3056 if get_option('cfi')
3057 pagevary_flags += '-fno-sanitize=cfi-icall'
3058 endif
Thomas Huth54c9b192022-03-30 13:48:08 +02003059 pagevary = static_library('page-vary-common', sources: pagevary + genh,
Richard Henderson44b99a62021-03-22 12:24:26 +01003060 c_args: pagevary_flags)
3061 pagevary = declare_dependency(link_with: pagevary)
3062endif
3063common_ss.add(pagevary)
Richard Henderson6670d4d2021-03-22 12:24:24 +01003064specific_ss.add(files('page-vary.c'))
3065
Marc-André Lureauab318052019-07-24 19:23:16 +04003066subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04003067subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04003068subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003069subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04003070subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04003071subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00003072subdir('semihosting')
Marc-André Lureau582ea952019-08-15 15:15:32 +04003073subdir('hw')
Richard Henderson104cc2c2021-03-08 12:04:33 -08003074subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08003075subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04003076subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003077subdir('plugins')
Richard Hendersonbbf15aa2021-11-17 16:14:00 +01003078subdir('ebpf')
3079
3080common_user_inc = []
3081
3082subdir('common-user')
Marc-André Lureaub309c322019-08-18 19:20:37 +04003083subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04003084subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003085
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003086# needed for fuzzing binaries
3087subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003088subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003089
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003090# accel modules
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02003091tcg_real_module_ss = ss.source_set()
3092tcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss)
3093specific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss)
3094target_modules += { 'accel' : { 'qtest': qtest_module_ss,
3095 'tcg': tcg_real_module_ss }}
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003096
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003097########################
3098# Library dependencies #
3099########################
3100
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003101modinfo_collect = find_program('scripts/modinfo-collect.py')
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003102modinfo_generate = find_program('scripts/modinfo-generate.py')
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003103modinfo_files = []
3104
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003105block_mods = []
3106softmmu_mods = []
3107foreach d, list : modules
3108 foreach m, module_ss : list
3109 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02003110 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003111 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
3112 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
3113 if d == 'block'
3114 block_mods += sl
3115 else
3116 softmmu_mods += sl
3117 endif
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003118 if module_ss.sources() != []
3119 # FIXME: Should use sl.extract_all_objects(recursive: true) as
3120 # input. Sources can be used multiple times but objects are
3121 # unique when it comes to lookup in compile_commands.json.
3122 # Depnds on a mesion version with
3123 # https://github.com/mesonbuild/meson/pull/8900
3124 modinfo_files += custom_target(d + '-' + m + '.modinfo',
3125 output: d + '-' + m + '.modinfo',
Paolo Bonziniac347112021-07-21 18:51:57 +02003126 input: module_ss.sources() + genh,
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003127 capture: true,
Paolo Bonziniac347112021-07-21 18:51:57 +02003128 command: [modinfo_collect, module_ss.sources()])
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003129 endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003130 else
3131 if d == 'block'
3132 block_ss.add_all(module_ss)
3133 else
3134 softmmu_ss.add_all(module_ss)
3135 endif
3136 endif
3137 endforeach
3138endforeach
3139
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003140foreach d, list : target_modules
3141 foreach m, module_ss : list
3142 if enable_modules and targetos != 'windows'
3143 foreach target : target_dirs
3144 if target.endswith('-softmmu')
3145 config_target = config_target_mak[target]
3146 config_target += config_host
3147 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
3148 c_args = ['-DNEED_CPU_H',
3149 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3150 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3151 target_module_ss = module_ss.apply(config_target, strict: false)
3152 if target_module_ss.sources() != []
3153 module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
3154 sl = static_library(module_name,
3155 [genh, target_module_ss.sources()],
3156 dependencies: [modulecommon, target_module_ss.dependencies()],
3157 include_directories: target_inc,
3158 c_args: c_args,
3159 pic: true)
3160 softmmu_mods += sl
3161 # FIXME: Should use sl.extract_all_objects(recursive: true) too.
3162 modinfo_files += custom_target(module_name + '.modinfo',
3163 output: module_name + '.modinfo',
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003164 input: target_module_ss.sources() + genh,
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003165 capture: true,
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003166 command: [modinfo_collect, '--target', target, target_module_ss.sources()])
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003167 endif
3168 endif
3169 endforeach
3170 else
3171 specific_ss.add_all(module_ss)
3172 endif
3173 endforeach
3174endforeach
3175
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003176if enable_modules
3177 modinfo_src = custom_target('modinfo.c',
3178 output: 'modinfo.c',
3179 input: modinfo_files,
3180 command: [modinfo_generate, '@INPUT@'],
3181 capture: true)
3182 modinfo_lib = static_library('modinfo', modinfo_src)
3183 modinfo_dep = declare_dependency(link_whole: modinfo_lib)
3184 softmmu_ss.add(modinfo_dep)
3185endif
3186
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003187nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08003188undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003189block_syms = custom_target('block.syms', output: 'block.syms',
3190 input: [libqemuutil, block_mods],
3191 capture: true,
3192 command: [undefsym, nm, '@INPUT@'])
3193qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
3194 input: [libqemuutil, softmmu_mods],
3195 capture: true,
3196 command: [undefsym, nm, '@INPUT@'])
3197
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02003198qom_ss = qom_ss.apply(config_host, strict: false)
3199libqom = static_library('qom', qom_ss.sources() + genh,
3200 dependencies: [qom_ss.dependencies()],
3201 name_suffix: 'fa')
3202
3203qom = declare_dependency(link_whole: libqom)
3204
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003205authz_ss = authz_ss.apply(config_host, strict: false)
3206libauthz = static_library('authz', authz_ss.sources() + genh,
3207 dependencies: [authz_ss.dependencies()],
3208 name_suffix: 'fa',
3209 build_by_default: false)
3210
3211authz = declare_dependency(link_whole: libauthz,
3212 dependencies: qom)
3213
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003214crypto_ss = crypto_ss.apply(config_host, strict: false)
3215libcrypto = static_library('crypto', crypto_ss.sources() + genh,
3216 dependencies: [crypto_ss.dependencies()],
3217 name_suffix: 'fa',
3218 build_by_default: false)
3219
3220crypto = declare_dependency(link_whole: libcrypto,
3221 dependencies: [authz, qom])
3222
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003223io_ss = io_ss.apply(config_host, strict: false)
3224libio = static_library('io', io_ss.sources() + genh,
3225 dependencies: [io_ss.dependencies()],
3226 link_with: libqemuutil,
3227 name_suffix: 'fa',
3228 build_by_default: false)
3229
3230io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
3231
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003232libmigration = static_library('migration', sources: migration_files + genh,
3233 name_suffix: 'fa',
3234 build_by_default: false)
3235migration = declare_dependency(link_with: libmigration,
3236 dependencies: [zlib, qom, io])
3237softmmu_ss.add(migration)
3238
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003239block_ss = block_ss.apply(config_host, strict: false)
3240libblock = static_library('block', block_ss.sources() + genh,
3241 dependencies: block_ss.dependencies(),
3242 link_depends: block_syms,
3243 name_suffix: 'fa',
3244 build_by_default: false)
3245
3246block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003247 link_args: '@block.syms',
3248 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003249
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003250blockdev_ss = blockdev_ss.apply(config_host, strict: false)
3251libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
3252 dependencies: blockdev_ss.dependencies(),
3253 name_suffix: 'fa',
3254 build_by_default: false)
3255
3256blockdev = declare_dependency(link_whole: [libblockdev],
3257 dependencies: [block])
3258
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003259qmp_ss = qmp_ss.apply(config_host, strict: false)
3260libqmp = static_library('qmp', qmp_ss.sources() + genh,
3261 dependencies: qmp_ss.dependencies(),
3262 name_suffix: 'fa',
3263 build_by_default: false)
3264
3265qmp = declare_dependency(link_whole: [libqmp])
3266
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003267libchardev = static_library('chardev', chardev_ss.sources() + genh,
3268 name_suffix: 'fa',
Marc-André Lureau22d1f7a2022-03-23 19:57:12 +04003269 dependencies: chardev_ss.dependencies(),
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003270 build_by_default: false)
3271
3272chardev = declare_dependency(link_whole: libchardev)
3273
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02003274hwcore_ss = hwcore_ss.apply(config_host, strict: false)
3275libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02003276 name_suffix: 'fa',
3277 build_by_default: false)
3278hwcore = declare_dependency(link_whole: libhwcore)
3279common_ss.add(hwcore)
3280
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02003281###########
3282# Targets #
3283###########
3284
Paolo Bonzinifb721762022-01-07 13:00:44 +01003285emulator_modules = []
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003286foreach m : block_mods + softmmu_mods
Paolo Bonzinifb721762022-01-07 13:00:44 +01003287 emulator_modules += shared_module(m.name(),
3288 build_by_default: true,
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003289 name_prefix: '',
3290 link_whole: m,
3291 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003292 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003293endforeach
3294
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003295softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003296common_ss.add(qom, qemuutil)
3297
3298common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01003299common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
3300
3301common_all = common_ss.apply(config_all, strict: false)
3302common_all = static_library('common',
3303 build_by_default: false,
3304 sources: common_all.sources() + genh,
Paolo Bonzini9d24fb72021-12-21 16:09:54 +01003305 include_directories: common_user_inc,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09003306 implicit_include_directories: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003307 dependencies: common_all.dependencies(),
3308 name_suffix: 'fa')
3309
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003310feature_to_c = find_program('scripts/feature_to_c.sh')
3311
Philippe Mathieu-Daudé30cfa502022-02-15 17:25:03 +01003312if targetos == 'darwin'
3313 entitlement = find_program('scripts/entitlement.sh')
3314endif
3315
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04003316emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003317foreach target : target_dirs
3318 config_target = config_target_mak[target]
3319 target_name = config_target['TARGET_NAME']
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003320 target_base_arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02003321 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003322 arch_deps = []
3323 c_args = ['-DNEED_CPU_H',
3324 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3325 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04003326 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01003327
Paolo Bonzini859aef02020-08-04 18:14:26 +02003328 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01003329 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
3330 if targetos == 'linux'
3331 target_inc += include_directories('linux-headers', is_system: true)
3332 endif
3333 if target.endswith('-softmmu')
3334 qemu_target_name = 'qemu-system-' + target_name
3335 target_type='system'
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003336 t = target_softmmu_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003337 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003338 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003339
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003340 hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch
Marc-André Lureau2c442202019-08-17 13:55:58 +04003341 hw = hw_arch[hw_dir].apply(config_target, strict: false)
3342 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003343 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04003344
Paolo Bonzini2becc362020-02-03 11:42:03 +01003345 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003346 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01003347 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04003348 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01003349 target_type='user'
Paolo Bonzinia3a576b2021-12-21 16:23:55 +01003350 target_inc += common_user_inc
Paolo Bonzini2becc362020-02-03 11:42:03 +01003351 qemu_target_name = 'qemu-' + target_name
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003352 if target_base_arch in target_user_arch
3353 t = target_user_arch[target_base_arch].apply(config_target, strict: false)
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02003354 arch_srcs += t.sources()
3355 arch_deps += t.dependencies()
3356 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01003357 if 'CONFIG_LINUX_USER' in config_target
3358 base_dir = 'linux-user'
Warner Loshe2a74722021-08-03 17:17:17 -06003359 endif
3360 if 'CONFIG_BSD_USER' in config_target
Paolo Bonzini2becc362020-02-03 11:42:03 +01003361 base_dir = 'bsd-user'
Warner Loshe2a74722021-08-03 17:17:17 -06003362 target_inc += include_directories('bsd-user/' / targetos)
Warner Losh85fc1b52022-01-08 17:27:34 -07003363 target_inc += include_directories('bsd-user/host/' / host_arch)
Warner Loshe2a74722021-08-03 17:17:17 -06003364 dir = base_dir / abi
Warner Losh19bf1292021-11-04 16:34:48 -06003365 arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003366 endif
3367 target_inc += include_directories(
3368 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04003369 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003370 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04003371 if 'CONFIG_LINUX_USER' in config_target
3372 dir = base_dir / abi
3373 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
3374 if config_target.has_key('TARGET_SYSTBL_ABI')
3375 arch_srcs += \
3376 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
3377 extra_args : config_target['TARGET_SYSTBL_ABI'])
3378 endif
3379 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01003380 endif
3381
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003382 if 'TARGET_XML_FILES' in config_target
3383 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
3384 output: target + '-gdbstub-xml.c',
3385 input: files(config_target['TARGET_XML_FILES'].split()),
3386 command: [feature_to_c, '@INPUT@'],
3387 capture: true)
3388 arch_srcs += gdbstub_xml
3389 endif
3390
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003391 t = target_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003392 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003393 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003394
Paolo Bonzini2becc362020-02-03 11:42:03 +01003395 target_common = common_ss.apply(config_target, strict: false)
3396 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003397 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01003398
Paolo Bonzini2becc362020-02-03 11:42:03 +01003399 target_specific = specific_ss.apply(config_target, strict: false)
3400 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003401 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01003402
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003403 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02003404 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02003405 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003406 objects: objects,
3407 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003408 c_args: c_args,
3409 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003410 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003411
3412 if target.endswith('-softmmu')
3413 execs = [{
3414 'name': 'qemu-system-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003415 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003416 'sources': files('softmmu/main.c'),
3417 'dependencies': []
3418 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01003419 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003420 execs += [{
3421 'name': 'qemu-system-' + target_name + 'w',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003422 'win_subsystem': 'windows',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003423 'sources': files('softmmu/main.c'),
3424 'dependencies': []
3425 }]
3426 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02003427 if get_option('fuzzing')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003428 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
3429 execs += [{
3430 'name': 'qemu-fuzz-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003431 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003432 'sources': specific_fuzz.sources(),
3433 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003434 }]
3435 endif
3436 else
3437 execs = [{
3438 'name': 'qemu-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003439 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003440 'sources': [],
3441 'dependencies': []
3442 }]
3443 endif
3444 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01003445 exe_name = exe['name']
John Arbuckle3983a762021-07-05 15:53:28 -04003446 if targetos == 'darwin'
Alexander Graf8a74ce62021-01-20 23:44:34 +01003447 exe_name += '-unsigned'
3448 endif
3449
3450 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09003451 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003452 c_args: c_args,
3453 dependencies: arch_deps + deps + exe['dependencies'],
3454 objects: lib.extract_all_objects(recursive: true),
3455 link_language: link_language,
3456 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
3457 link_args: link_args,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003458 win_subsystem: exe['win_subsystem'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01003459
John Arbuckle3983a762021-07-05 15:53:28 -04003460 if targetos == 'darwin'
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003461 icon = 'pc-bios/qemu.rsrc'
3462 build_input = [emulator, files(icon)]
3463 install_input = [
3464 get_option('bindir') / exe_name,
3465 meson.current_source_dir() / icon
3466 ]
3467 if 'CONFIG_HVF' in config_target
3468 entitlements = 'accel/hvf/entitlements.plist'
3469 build_input += files(entitlements)
3470 install_input += meson.current_source_dir() / entitlements
3471 endif
3472
Alexander Graf8a74ce62021-01-20 23:44:34 +01003473 emulators += {exe['name'] : custom_target(exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003474 input: build_input,
Alexander Graf8a74ce62021-01-20 23:44:34 +01003475 output: exe['name'],
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01003476 command: [entitlement, '@OUTPUT@', '@INPUT@'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01003477 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09003478
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01003479 meson.add_install_script(entitlement, '--install',
Akihiko Odaki237377a2021-02-25 09:06:14 +09003480 get_option('bindir') / exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003481 install_input)
Alexander Graf8a74ce62021-01-20 23:44:34 +01003482 else
3483 emulators += {exe['name']: emulator}
3484 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003485
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003486 if stap.found()
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003487 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003488 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
3489 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003490 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
3491 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
3492 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003493 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003494 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003495 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003496 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003497 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003498 command: [
3499 tracetool, '--group=all', '--format=' + stp['fmt'],
3500 '--binary=' + stp['bin'],
3501 '--target-name=' + target_name,
3502 '--target-type=' + target_type,
3503 '--probe-prefix=qemu.' + target_type + '.' + target_name,
Stefan Hajnoczic05012a2020-08-27 15:29:12 +01003504 '@INPUT@', '@OUTPUT@'
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003505 ],
3506 depend_files: tracetool_depends)
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003507 endforeach
3508 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003509 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01003510endforeach
3511
Paolo Bonzini931049b2020-02-05 09:44:24 +01003512# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003513
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003514if 'CONFIG_PLUGIN' in config_host
3515 install_headers('include/qemu/qemu-plugin.h')
3516endif
3517
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02003518subdir('qga')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02003519
Laurent Vivier9755c942020-08-24 17:24:30 +02003520# Don't build qemu-keymap if xkbcommon is not explicitly enabled
3521# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02003522if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04003523 # used for the update-keymaps target, so include rules even if !have_tools
3524 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
3525 dependencies: [qemuutil, xkbcommon], install: have_tools)
3526endif
3527
Paolo Bonzini931049b2020-02-05 09:44:24 +01003528if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003529 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
3530 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
3531 qemu_io = executable('qemu-io', files('qemu-io.c'),
3532 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01003533 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06003534 dependencies: [blockdev, qemuutil, gnutls, selinux],
3535 install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003536
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02003537 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02003538 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04003539 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02003540
Marc-André Lureau157e7b12019-07-15 14:50:58 +04003541 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
3542 dependencies: qemuutil,
3543 install: true)
3544
Paolo Bonzini931049b2020-02-05 09:44:24 +01003545 if 'CONFIG_VHOST_USER' in config_host
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02003546 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02003547 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04003548 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02003549 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01003550 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04003551
3552 if targetos == 'linux'
3553 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
3554 dependencies: [qemuutil, libcap_ng],
3555 install: true,
3556 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003557
3558 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
3559 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02003560 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003561 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04003562 endif
3563
Paolo Bonziniccd250a2021-06-03 12:50:17 +02003564 if have_ivshmem
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04003565 subdir('contrib/ivshmem-client')
3566 subdir('contrib/ivshmem-server')
3567 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01003568endif
3569
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04003570subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01003571subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04003572subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02003573subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08003574subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01003575if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04003576 subdir('po')
3577endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01003578
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003579if host_machine.system() == 'windows'
3580 nsis_cmd = [
3581 find_program('scripts/nsis.py'),
3582 '@OUTPUT@',
3583 get_option('prefix'),
3584 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01003585 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003586 '--',
3587 '-DDISPLAYVERSION=' + meson.project_version(),
3588 ]
3589 if build_docs
3590 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
3591 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01003592 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003593 nsis_cmd += '-DCONFIG_GTK=y'
3594 endif
3595
3596 nsis = custom_target('nsis',
3597 output: 'qemu-setup-' + meson.project_version() + '.exe',
3598 input: files('qemu.nsi'),
3599 build_always_stale: true,
3600 command: nsis_cmd + ['@INPUT@'])
3601 alias_target('installer', nsis)
3602endif
3603
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003604#########################
3605# Configuration summary #
3606#########################
3607
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01003608# Directories
Paolo Bonzinif9332752020-02-03 13:28:38 +01003609summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003610summary_info += {'Install prefix': get_option('prefix')}
3611summary_info += {'BIOS directory': qemu_datadir}
3612summary_info += {'firmware path': get_option('qemu_firmwarepath')}
3613summary_info += {'binary directory': get_option('bindir')}
3614summary_info += {'library directory': get_option('libdir')}
3615summary_info += {'module directory': qemu_moddir}
3616summary_info += {'libexec directory': get_option('libexecdir')}
3617summary_info += {'include directory': get_option('includedir')}
3618summary_info += {'config directory': get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003619if targetos != 'windows'
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003620 summary_info += {'local state directory': get_option('localstatedir')}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04003621 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003622else
3623 summary_info += {'local state directory': 'queried at runtime'}
3624endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04003625summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003626summary_info += {'Build directory': meson.current_build_dir()}
3627summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003628summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01003629summary(summary_info, bool_yn: true, section: 'Directories')
3630
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003631# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01003632summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003633summary_info += {'git': config_host['GIT']}
3634summary_info += {'make': config_host['MAKE']}
3635summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003636summary_info += {'sphinx-build': sphinx_build}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003637if config_host.has_key('HAVE_GDB_BIN')
3638 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
3639endif
Paolo Bonzini40c909f2022-04-20 17:33:49 +02003640summary_info += {'iasl': iasl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003641summary_info += {'genisoimage': config_host['GENISOIMAGE']}
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02003642if targetos == 'windows' and have_ga
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003643 summary_info += {'wixl': wixl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003644endif
Paolo Bonzini35acbb32021-10-13 13:43:36 +02003645if slirp_opt != 'disabled' and have_system
3646 summary_info += {'smbd': have_slirp_smbd ? smbd_path : false}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003647endif
3648summary(summary_info, bool_yn: true, section: 'Host binaries')
3649
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003650# Configurable features
3651summary_info = {}
3652summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003653summary_info += {'system-mode emulation': have_system}
3654summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003655summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003656summary_info += {'Install blobs': get_option('install_blobs')}
3657summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
3658if config_host.has_key('CONFIG_MODULES')
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02003659 summary_info += {'alternative module path': get_option('module_upgrades')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003660endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02003661summary_info += {'fuzzing support': get_option('fuzzing')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003662if have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02003663 summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003664endif
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003665summary_info += {'Trace backends': ','.join(get_option('trace_backends'))}
3666if 'simple' in get_option('trace_backends')
3667 summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003668endif
Marc-André Lureau142ca622021-07-15 11:53:53 +04003669summary_info += {'D-Bus display': dbus_display}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003670summary_info += {'QOM debugging': get_option('qom_cast_debug')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003671summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
3672summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
3673summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
3674summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
3675summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
3676summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
3677summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
3678summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
3679summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02003680summary_info += {'build guest agent': have_ga}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003681summary(summary_info, bool_yn: true, section: 'Configurable features')
3682
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003683# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003684summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003685summary_info += {'host CPU': cpu}
3686summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01003687summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
3688summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003689if link_language == 'cpp'
Alex Bennée63de9352021-05-27 17:03:15 +01003690 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003691else
3692 summary_info += {'C++ compiler': false}
3693endif
3694if targetos == 'darwin'
Alex Bennée63de9352021-05-27 17:03:15 +01003695 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003696endif
Paolo Bonzini47b30832020-09-23 05:26:17 -04003697summary_info += {'CFLAGS': ' '.join(get_option('c_args')
3698 + ['-O' + get_option('optimization')]
3699 + (get_option('debug') ? ['-g'] : []))}
3700if link_language == 'cpp'
3701 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
3702 + ['-O' + get_option('optimization')]
3703 + (get_option('debug') ? ['-g'] : []))}
3704endif
Philippe Mathieu-Daudée910c7d2022-01-08 22:38:55 +01003705if targetos == 'darwin'
3706 summary_info += {'OBJCFLAGS': ' '.join(get_option('objc_args')
3707 + ['-O' + get_option('optimization')]
3708 + (get_option('debug') ? ['-g'] : []))}
3709endif
Paolo Bonzini47b30832020-09-23 05:26:17 -04003710link_args = get_option(link_language + '_link_args')
3711if link_args.length() > 0
3712 summary_info += {'LDFLAGS': ' '.join(link_args)}
3713endif
Paolo Bonzinid0651772022-04-20 17:33:34 +02003714summary_info += {'QEMU_CFLAGS': ' '.join(qemu_cflags)}
3715summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_cxxflags)}
3716summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_objcflags)}
3717summary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003718summary_info += {'profiler': get_option('profiler')}
Daniele Buonocdad7812020-12-04 18:06:11 -05003719summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003720summary_info += {'PIE': get_option('b_pie')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02003721summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003722summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinib87df902021-11-08 13:52:11 +01003723summary_info += {'membarrier': have_membarrier}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02003724summary_info += {'debug stack usage': get_option('debug_stack_usage')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003725summary_info += {'mutex debugging': get_option('debug_mutex')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003726summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzini622753d2021-11-08 13:38:58 +01003727summary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
3728summary_info += {'avx512f optimization': config_host_data.get('CONFIG_AVX512F_OPT')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003729summary_info += {'gprof enabled': get_option('gprof')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003730summary_info += {'gcov': get_option('b_coverage')}
3731summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
3732summary_info += {'CFI support': get_option('cfi')}
3733if get_option('cfi')
3734 summary_info += {'CFI debug support': get_option('cfi_debug')}
3735endif
3736summary_info += {'strip binaries': get_option('strip')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003737summary_info += {'sparse': sparse}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003738summary_info += {'mingw32 support': targetos == 'windows'}
Alex Bennée49e85652021-02-22 10:14:50 +00003739
3740# snarf the cross-compilation information for tests
3741foreach target: target_dirs
3742 tcg_mak = meson.current_build_dir() / 'tests/tcg' / 'config-' + target + '.mak'
3743 if fs.exists(tcg_mak)
3744 config_cross_tcg = keyval.load(tcg_mak)
3745 target = config_cross_tcg['TARGET_NAME']
3746 compiler = ''
3747 if 'DOCKER_CROSS_CC_GUEST' in config_cross_tcg
3748 summary_info += {target + ' tests': config_cross_tcg['DOCKER_CROSS_CC_GUEST'] +
3749 ' via ' + config_cross_tcg['DOCKER_IMAGE']}
3750 elif 'CROSS_CC_GUEST' in config_cross_tcg
3751 summary_info += {target + ' tests'
3752 : config_cross_tcg['CROSS_CC_GUEST'] }
3753 endif
3754 endif
3755endforeach
3756
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003757summary(summary_info, bool_yn: true, section: 'Compilation')
3758
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003759# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003760summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003761if have_system
3762 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
3763 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
3764 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
3765 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
Reinoud Zandijk74a414a2021-04-02 22:25:32 +02003766 summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')}
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02003767 summary_info += {'Xen support': xen.found()}
3768 if xen.found()
3769 summary_info += {'xen ctrl version': xen.version()}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003770 endif
3771endif
3772summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
3773if config_all.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01003774 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +01003775 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'}
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01003776 else
3777 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
3778 endif
Alex Bennée029aa682021-07-09 15:29:53 +01003779 summary_info += {'TCG plugins': config_host.has_key('CONFIG_PLUGIN')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003780 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003781endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003782summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003783if have_system
3784 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01003785 summary_info += {'out of process emulation': multiprocess_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003786endif
3787summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
3788
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003789# Block layer
3790summary_info = {}
3791summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02003792summary_info += {'coroutine pool': have_coroutine_pool}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003793if have_block
3794 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
3795 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003796 summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003797 summary_info += {'VirtFS support': have_virtfs}
3798 summary_info += {'build virtiofs daemon': have_virtiofsd}
Paolo Bonzini406523f2021-10-13 11:43:54 +02003799 summary_info += {'Live block migration': config_host_data.get('CONFIG_LIVE_BLOCK_MIGRATION')}
3800 summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')}
Paolo Bonzinied793c22021-10-13 11:42:25 +02003801 summary_info += {'bochs support': get_option('bochs').allowed()}
3802 summary_info += {'cloop support': get_option('cloop').allowed()}
3803 summary_info += {'dmg support': get_option('dmg').allowed()}
3804 summary_info += {'qcow v1 support': get_option('qcow1').allowed()}
3805 summary_info += {'vdi support': get_option('vdi').allowed()}
3806 summary_info += {'vvfat support': get_option('vvfat').allowed()}
3807 summary_info += {'qed support': get_option('qed').allowed()}
3808 summary_info += {'parallels support': get_option('parallels').allowed()}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003809 summary_info += {'FUSE exports': fuse}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003810endif
3811summary(summary_info, bool_yn: true, section: 'Block layer support')
3812
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003813# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003814summary_info = {}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003815summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003816summary_info += {'GNUTLS support': gnutls}
3817if gnutls.found()
3818 summary_info += {' GNUTLS crypto': gnutls_crypto.found()}
3819endif
3820summary_info += {'libgcrypt': gcrypt}
3821summary_info += {'nettle': nettle}
Paolo Bonzini57612512021-06-03 11:15:26 +02003822if nettle.found()
3823 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003824endif
Paolo Bonzini34b52612021-11-08 14:02:42 +01003825summary_info += {'AF_ALG support': have_afalg}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003826summary_info += {'rng-none': get_option('rng_none')}
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02003827summary_info += {'Linux keyring': have_keyring}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003828summary(summary_info, bool_yn: true, section: 'Crypto')
3829
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01003830# Libraries
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003831summary_info = {}
3832if targetos == 'darwin'
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003833 summary_info += {'Cocoa support': cocoa}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003834endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003835summary_info += {'SDL support': sdl}
3836summary_info += {'SDL image support': sdl_image}
3837summary_info += {'GTK support': gtk}
3838summary_info += {'pixman': pixman}
3839summary_info += {'VTE support': vte}
3840summary_info += {'slirp support': slirp_opt == 'internal' ? slirp_opt : slirp}
3841summary_info += {'libtasn1': tasn1}
3842summary_info += {'PAM': pam}
3843summary_info += {'iconv support': iconv}
3844summary_info += {'curses support': curses}
3845summary_info += {'virgl support': virgl}
3846summary_info += {'curl support': curl}
3847summary_info += {'Multipath support': mpathpersist}
Kshitij Suri95f85102022-04-08 07:13:34 +00003848summary_info += {'PNG support': png}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003849summary_info += {'VNC support': vnc}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01003850if vnc.found()
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003851 summary_info += {'VNC SASL support': sasl}
3852 summary_info += {'VNC JPEG support': jpeg}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003853endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02003854if targetos not in ['darwin', 'haiku', 'windows']
3855 summary_info += {'OSS support': oss}
3856elif targetos == 'darwin'
3857 summary_info += {'CoreAudio support': coreaudio}
3858elif targetos == 'windows'
3859 summary_info += {'DirectSound support': dsound}
3860endif
3861if targetos == 'linux'
3862 summary_info += {'ALSA support': alsa}
3863 summary_info += {'PulseAudio support': pulse}
3864endif
3865summary_info += {'JACK support': jack}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003866summary_info += {'brlapi support': brlapi}
Paolo Bonzinie1723992021-10-07 15:08:21 +02003867summary_info += {'vde support': vde}
Paolo Bonzini837b84b2021-10-07 15:08:22 +02003868summary_info += {'netmap support': have_netmap}
Thomas Hutheea94532021-10-28 20:59:08 +02003869summary_info += {'l2tpv3 support': have_l2tpv3}
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02003870summary_info += {'Linux AIO support': libaio}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003871summary_info += {'Linux io_uring support': linux_io_uring}
3872summary_info += {'ATTR/XATTR support': libattr}
Paolo Bonzini3730a732022-04-20 17:33:41 +02003873summary_info += {'RDMA support': rdma}
3874summary_info += {'PVRDMA support': have_pvrdma}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003875summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003876summary_info += {'libcap-ng support': libcap_ng}
3877summary_info += {'bpf support': libbpf}
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02003878summary_info += {'spice protocol support': spice_protocol}
3879if spice_protocol.found()
3880 summary_info += {' spice server support': spice}
3881endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003882summary_info += {'rbd support': rbd}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003883summary_info += {'smartcard support': cacard}
3884summary_info += {'U2F support': u2f}
3885summary_info += {'libusb': libusb}
3886summary_info += {'usb net redir': usbredir}
Paolo Bonzini88b6e612022-04-20 17:33:40 +02003887summary_info += {'OpenGL support (epoxy)': opengl}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003888summary_info += {'GBM': gbm}
3889summary_info += {'libiscsi support': libiscsi}
3890summary_info += {'libnfs support': libnfs}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003891if targetos == 'windows'
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02003892 if have_ga
Marc-André Lureau8821a382022-02-01 16:53:43 +04003893 summary_info += {'QGA VSS support': have_qga_vss}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01003894 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01003895endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003896summary_info += {'seccomp support': seccomp}
3897summary_info += {'GlusterFS support': glusterfs}
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01003898summary_info += {'TPM support': have_tpm}
Thomas Huthe6a52b32021-12-09 15:48:01 +01003899summary_info += {'libssh support': libssh}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003900summary_info += {'lzo support': lzo}
3901summary_info += {'snappy support': snappy}
3902summary_info += {'bzip2 support': libbzip2}
3903summary_info += {'lzfse support': liblzfse}
3904summary_info += {'zstd support': zstd}
Paolo Bonzini488a8c72021-12-21 12:38:27 +01003905summary_info += {'NUMA host support': numa}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003906summary_info += {'capstone': capstone_opt == 'internal' ? capstone_opt : capstone}
3907summary_info += {'libpmem support': libpmem}
3908summary_info += {'libdaxctl support': libdaxctl}
3909summary_info += {'libudev': libudev}
3910# Dummy dependency, keep .found()
Max Reitzdf4ea702020-10-27 20:05:46 +01003911summary_info += {'FUSE lseek': fuse_lseek.found()}
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06003912summary_info += {'selinux': selinux}
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01003913summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01003914
3915if not supported_cpus.contains(cpu)
3916 message()
3917 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
3918 message()
3919 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
3920 message('The QEMU project intends to remove support for this host CPU in')
3921 message('a future release if nobody volunteers to maintain it and to')
3922 message('provide a build host for our continuous integration setup.')
3923 message('configure has succeeded and you can continue to build, but')
3924 message('if you care about QEMU on this platform you should contact')
3925 message('us upstream at qemu-devel@nongnu.org.')
3926endif
3927
3928if not supported_oses.contains(targetos)
3929 message()
3930 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
3931 message()
3932 message('Host OS ' + targetos + 'support is not currently maintained.')
3933 message('The QEMU project intends to remove support for this host OS in')
3934 message('a future release if nobody volunteers to maintain it and to')
3935 message('provide a build host for our continuous integration setup.')
3936 message('configure has succeeded and you can continue to build, but')
3937 message('if you care about QEMU on this platform you should contact')
3938 message('us upstream at qemu-devel@nongnu.org.')
3939endif