xref: /qemu/meson.build (revision 34f983d8)
13b087f79SPaolo Bonziniproject('qemu', ['c'], meson_version: '>=0.63.0',
2654d6b04SPaolo Bonzini        default_options: ['warning_level=1', 'c_std=gnu11', 'cpp_std=gnu++11', 'b_colorout=auto',
30a31e3a0SPaolo Bonzini                          'b_staticpic=false', 'stdsplit=false', 'optimization=2', 'b_pie=true'],
4654d6b04SPaolo Bonzini        version: files('VERSION'))
5a5665051SPaolo Bonzini
6e287072bSThomas Huthadd_test_setup('quick', exclude_suites: ['slow', 'thorough'], is_default: true)
7e287072bSThomas Huthadd_test_setup('slow', exclude_suites: ['thorough'], env: ['G_TEST_SLOW=1', 'SPEED=slow'])
8e287072bSThomas Huthadd_test_setup('thorough', env: ['G_TEST_SLOW=1', 'SPEED=thorough'])
93d2f73efSPaolo Bonzini
10cf60ccc3SAkihiko Odakimeson.add_postconf_script(find_program('scripts/symlink-install-tree.py'))
11cf60ccc3SAkihiko Odaki
12a5665051SPaolo Bonzininot_found = dependency('', required: false)
13b29b40f4SPaolo Bonzinikeyval = import('keyval')
14a81df1b6SPaolo Bonziniss = import('sourceset')
158b18cdbfSRichard Hendersonfs = import('fs')
16a81df1b6SPaolo Bonzini
17e5134024SPaolo Bonzinitargetos = host_machine.system()
18ce1c1e7aSPaolo Bonzinish = find_program('sh')
19a5665051SPaolo Bonziniconfig_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
20d7dedf42SPaolo Bonzini
21e5134024SPaolo Bonzinicc = meson.get_compiler('c')
22e5134024SPaolo Bonziniall_languages = ['c']
23e5134024SPaolo Bonziniif add_languages('cpp', required: false, native: false)
24e5134024SPaolo Bonzini  all_languages += ['cpp']
25e5134024SPaolo Bonzini  cxx = meson.get_compiler('cpp')
26e5134024SPaolo Bonziniendif
27e5134024SPaolo Bonziniif targetos == 'darwin' and \
28e5134024SPaolo Bonzini   add_languages('objc', required: get_option('cocoa'), native: false)
29e5134024SPaolo Bonzini  all_languages += ['objc']
30e5134024SPaolo Bonzini  objc = meson.get_compiler('objc')
31e5134024SPaolo Bonziniendif
32e5134024SPaolo Bonzini
33e3667660SYonggang Luo# Temporary directory used for files created while
34e3667660SYonggang Luo# configure runs. Since it is in the build directory
35e3667660SYonggang Luo# we can safely blow away any previous version of it
36e3667660SYonggang Luo# (and we need not jump through hoops to try to delete
37e3667660SYonggang Luo# it when configure exits.)
38e3667660SYonggang Luotmpdir = meson.current_build_dir() / 'meson-private/temp'
398fe11232SMarc-André Lureau
408fe11232SMarc-André Lureauif get_option('qemu_suffix').startswith('/')
418fe11232SMarc-André Lureau  error('qemu_suffix cannot start with a /')
428fe11232SMarc-André Lureauendif
438fe11232SMarc-André Lureau
4416bf7a33SPaolo Bonziniqemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
45ab4c0996SMarc-André Lureauqemu_datadir = get_option('datadir') / get_option('qemu_suffix')
46491e74c1SMarc-André Lureauqemu_docdir = get_option('docdir') / get_option('qemu_suffix')
4716bf7a33SPaolo Bonziniqemu_moddir = get_option('libdir') / get_option('qemu_suffix')
4816bf7a33SPaolo Bonzini
4916bf7a33SPaolo Bonziniqemu_desktopdir = get_option('datadir') / 'applications'
5016bf7a33SPaolo Bonziniqemu_icondir = get_option('datadir') / 'icons'
5116bf7a33SPaolo Bonzini
52859aef02SPaolo Bonziniconfig_host_data = configuration_data()
53859aef02SPaolo Bonzinigenh = []
54b83a80e8SVladimir Sementsov-Ogievskiyqapi_trace_events = []
55a5665051SPaolo Bonzini
5620cf5cb4SPaolo Bonzinibsd_oses = ['gnu/kfreebsd', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'darwin']
57201e8ed7SPaolo Bonzinisupported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
58ba0e7333SRichard Hendersonsupported_cpus = ['ppc', 'ppc64', 's390x', 'riscv', 'x86', 'x86_64',
596d0b52edSRichard Henderson  'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc64']
60201e8ed7SPaolo Bonzini
61201e8ed7SPaolo Bonzinicpu = host_machine.cpu_family()
62c94c2394SRichard Henderson
63c94c2394SRichard Henderson# Unify riscv* to a single family.
64c94c2394SRichard Hendersonif cpu in ['riscv32', 'riscv64']
65c94c2394SRichard Henderson  cpu = 'riscv'
66c94c2394SRichard Hendersonendif
67c94c2394SRichard Henderson
6820cf5cb4SPaolo Bonzinitarget_dirs = config_host['TARGET_DIRS'].split()
6920cf5cb4SPaolo Bonzinihave_linux_user = false
7020cf5cb4SPaolo Bonzinihave_bsd_user = false
7120cf5cb4SPaolo Bonzinihave_system = false
7220cf5cb4SPaolo Bonziniforeach target : target_dirs
7320cf5cb4SPaolo Bonzini  have_linux_user = have_linux_user or target.endswith('linux-user')
7420cf5cb4SPaolo Bonzini  have_bsd_user = have_bsd_user or target.endswith('bsd-user')
7520cf5cb4SPaolo Bonzini  have_system = have_system or target.endswith('-softmmu')
7620cf5cb4SPaolo Bonziniendforeach
7720cf5cb4SPaolo Bonzinihave_user = have_linux_user or have_bsd_user
7820cf5cb4SPaolo Bonzinihave_tools = get_option('tools') \
7920cf5cb4SPaolo Bonzini  .disable_auto_if(not have_system) \
8020cf5cb4SPaolo Bonzini  .allowed()
8120cf5cb4SPaolo Bonzinihave_ga = get_option('guest_agent') \
8220cf5cb4SPaolo Bonzini  .disable_auto_if(not have_system and not have_tools) \
8328236ad8SBrad Smith  .require(targetos in ['sunos', 'linux', 'windows', 'freebsd', 'netbsd', 'openbsd'],
8420cf5cb4SPaolo Bonzini           error_message: 'unsupported OS for QEMU guest agent') \
8520cf5cb4SPaolo Bonzini  .allowed()
866002711cSPaolo Bonzinienable_modules = get_option('modules') \
876002711cSPaolo Bonzini  .require(targetos != 'windows',
886002711cSPaolo Bonzini           error_message: 'Modules are not available for Windows') \
896002711cSPaolo Bonzini  .require(not get_option('prefer_static'),
906002711cSPaolo Bonzini           error_message: 'Modules are incompatible with static linking') \
916002711cSPaolo Bonzini  .allowed()
9220cf5cb4SPaolo Bonzinihave_block = have_system or have_tools
9320cf5cb4SPaolo Bonzini
9420cf5cb4SPaolo Bonzinipython = import('python').find_installation()
9520cf5cb4SPaolo Bonzini
96823eb013SPaolo Bonziniif cpu not in supported_cpus
97823eb013SPaolo Bonzini  host_arch = 'unknown'
98823eb013SPaolo Bonzinielif cpu == 'x86'
99823eb013SPaolo Bonzini  host_arch = 'i386'
1000e3ed77dSRichard Hendersonelif cpu == 'mips64'
1010e3ed77dSRichard Henderson  host_arch = 'mips'
102823eb013SPaolo Bonzinielse
103823eb013SPaolo Bonzini  host_arch = cpu
104823eb013SPaolo Bonziniendif
105823eb013SPaolo Bonzini
1068a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64']
1078a19980eSPaolo Bonzini  kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
1088a19980eSPaolo Bonzinielif cpu == 'aarch64'
1098a19980eSPaolo Bonzini  kvm_targets = ['aarch64-softmmu']
1108a19980eSPaolo Bonzinielif cpu == 's390x'
1118a19980eSPaolo Bonzini  kvm_targets = ['s390x-softmmu']
1128a19980eSPaolo Bonzinielif cpu in ['ppc', 'ppc64']
1138a19980eSPaolo Bonzini  kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
114fbc5884cSHuacai Chenelif cpu in ['mips', 'mips64']
115fbc5884cSHuacai Chen  kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
116fbf43c7dSYifei Jiangelif cpu in ['riscv']
117fbf43c7dSYifei Jiang  kvm_targets = ['riscv32-softmmu', 'riscv64-softmmu']
1188a19980eSPaolo Bonzinielse
1198a19980eSPaolo Bonzini  kvm_targets = []
1208a19980eSPaolo Bonziniendif
1218a19980eSPaolo Bonzini
12244d3d898SIgor Mammedovkvm_targets_c = '""'
12343a363aeSPaolo Bonziniif get_option('kvm').allowed() and targetos == 'linux'
124e741aff0SIgor Mammedov  kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
125e741aff0SIgor Mammedovendif
126e741aff0SIgor Mammedovconfig_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
127e741aff0SIgor Mammedov
1288a19980eSPaolo Bonziniaccelerator_targets = { 'CONFIG_KVM': kvm_targets }
129844a06bbSAlexander Graf
130844a06bbSAlexander Grafif cpu in ['aarch64']
131844a06bbSAlexander Graf  accelerator_targets += {
132844a06bbSAlexander Graf    'CONFIG_HVF': ['aarch64-softmmu']
133844a06bbSAlexander Graf  }
134844a06bbSAlexander Grafendif
135844a06bbSAlexander Graf
1360c3e41d4SAlex Bennéeif cpu in ['x86', 'x86_64', 'arm', 'aarch64']
1372a2d51bcSMarc-André Lureau  # i386 emulator provides xenpv machine type for multiple architectures
1380c3e41d4SAlex Bennée  accelerator_targets += {
1390c3e41d4SAlex Bennée    'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
1400c3e41d4SAlex Bennée  }
1410c3e41d4SAlex Bennéeendif
1428a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64']
1438a19980eSPaolo Bonzini  accelerator_targets += {
1448a19980eSPaolo Bonzini    'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
1458a19980eSPaolo Bonzini    'CONFIG_HVF': ['x86_64-softmmu'],
14674a414a1SReinoud Zandijk    'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
1478a19980eSPaolo Bonzini    'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
1488a19980eSPaolo Bonzini  }
1498a19980eSPaolo Bonziniendif
1508a19980eSPaolo Bonzini
151a1b176f9SPaolo Bonzinimodular_tcg = []
152a1b176f9SPaolo Bonzini# Darwin does not support references to thread-local variables in modules
153a1b176f9SPaolo Bonziniif targetos != 'darwin'
154dae0ec15SGerd Hoffmann  modular_tcg = ['i386-softmmu', 'x86_64-softmmu']
155a1b176f9SPaolo Bonziniendif
156dae0ec15SGerd Hoffmann
157eae9a1d1SPhilippe Mathieu-Daudéedk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ]
158e49c0ef6SPaolo Bonziniunpack_edk2_blobs = false
159e49c0ef6SPaolo Bonziniforeach target : edk2_targets
160e49c0ef6SPaolo Bonzini  if target in target_dirs
161e49c0ef6SPaolo Bonzini    bzip2 = find_program('bzip2', required: get_option('install_blobs'))
162e49c0ef6SPaolo Bonzini    unpack_edk2_blobs = bzip2.found()
163e49c0ef6SPaolo Bonzini    break
164eae9a1d1SPhilippe Mathieu-Daudé  endif
165e49c0ef6SPaolo Bonziniendforeach
16645b545ddSPhilippe Mathieu-Daudé
1679c29b741SPaolo Bonzinidtrace = not_found
1689c29b741SPaolo Bonzinistap = not_found
1699c29b741SPaolo Bonziniif 'dtrace' in get_option('trace_backends')
1709c29b741SPaolo Bonzini  dtrace = find_program('dtrace', required: true)
1719c29b741SPaolo Bonzini  stap = find_program('stap', required: false)
1729c29b741SPaolo Bonzini  if stap.found()
1739c29b741SPaolo Bonzini    # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
1749c29b741SPaolo Bonzini    # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
1759c29b741SPaolo Bonzini    # instead. QEMU --enable-modules depends on this because the SystemTap
1769c29b741SPaolo Bonzini    # semaphores are linked into the main binary and not the module's shared
1779c29b741SPaolo Bonzini    # object.
1789c29b741SPaolo Bonzini    add_global_arguments('-DSTAP_SDT_V2',
179e5134024SPaolo Bonzini                         native: false, language: all_languages)
1809c29b741SPaolo Bonzini  endif
1819c29b741SPaolo Bonziniendif
1829c29b741SPaolo Bonzini
18340c909f5SPaolo Bonziniif get_option('iasl') == ''
18440c909f5SPaolo Bonzini  iasl = find_program('iasl', required: false)
18540c909f5SPaolo Bonzinielse
18640c909f5SPaolo Bonzini  iasl = find_program(get_option('iasl'), required: true)
18740c909f5SPaolo Bonziniendif
18840c909f5SPaolo Bonzini
189201e8ed7SPaolo Bonzini##################
190201e8ed7SPaolo Bonzini# Compiler flags #
191201e8ed7SPaolo Bonzini##################
192201e8ed7SPaolo Bonzini
193d67212d4SPaolo Bonziniqemu_common_flags = []
194d67212d4SPaolo Bonziniqemu_cflags = []
195d67212d4SPaolo Bonziniforeach arg : config_host['QEMU_CFLAGS'].split()
196d67212d4SPaolo Bonzini  if arg.startswith('-W')
197d67212d4SPaolo Bonzini    qemu_cflags += arg
198d67212d4SPaolo Bonzini  else
199d67212d4SPaolo Bonzini    qemu_common_flags += arg
200d67212d4SPaolo Bonzini  endif
201d67212d4SPaolo Bonziniendforeach
2024cb37d11SPhilippe Mathieu-Daudéqemu_objcflags = config_host['QEMU_OBJCFLAGS'].split()
2038cc2d231SPaolo Bonziniqemu_ldflags = config_host['QEMU_LDFLAGS'].split()
2048cc2d231SPaolo Bonzini
205d67212d4SPaolo Bonziniif get_option('gprof')
206d67212d4SPaolo Bonzini  qemu_common_flags += ['-p']
207d67212d4SPaolo Bonzini  qemu_ldflags += ['-p']
208d67212d4SPaolo Bonziniendif
209d67212d4SPaolo Bonzini
210a0cbd2e8SPaolo Bonziniif get_option('prefer_static')
211e4333d14SPaolo Bonzini  qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
212e4333d14SPaolo Bonziniendif
213e4333d14SPaolo Bonzini
21434f983d8SPaolo Bonziniif get_option('sanitizers')
21534f983d8SPaolo Bonzini  if cc.has_argument('-fsanitize=address')
21634f983d8SPaolo Bonzini    qemu_cflags = ['-fsanitize=address'] + qemu_cflags
21734f983d8SPaolo Bonzini    qemu_ldflags = ['-fsanitize=address'] + qemu_ldflags
21834f983d8SPaolo Bonzini  endif
21934f983d8SPaolo Bonzini
22034f983d8SPaolo Bonzini  # Detect static linking issue with ubsan - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
22134f983d8SPaolo Bonzini  if cc.links('int main(int argc, char **argv) { return argc + 1; }',
22234f983d8SPaolo Bonzini              args: [qemu_ldflags, '-fsanitize=undefined'])
22334f983d8SPaolo Bonzini    qemu_cflags = ['-fsanitize=undefined'] + qemu_cflags
22434f983d8SPaolo Bonzini    qemu_ldflags = ['-fsanitize=undefined'] + qemu_ldflags
22534f983d8SPaolo Bonzini  endif
22634f983d8SPaolo Bonziniendif
22734f983d8SPaolo Bonzini
22834f983d8SPaolo Bonzini# Thread sanitizer is, for now, much noisier than the other sanitizers;
22934f983d8SPaolo Bonzini# keep it separate until that is not the case.
23034f983d8SPaolo Bonziniif get_option('tsan')
23134f983d8SPaolo Bonzini  if get_option('sanitizers')
23234f983d8SPaolo Bonzini    error('TSAN is not supported with other sanitizers')
23334f983d8SPaolo Bonzini  endif
23434f983d8SPaolo Bonzini  if not cc.has_function('__tsan_create_fiber',
23534f983d8SPaolo Bonzini                         args: '-fsanitize=thread',
23634f983d8SPaolo Bonzini                         prefix: '#include <sanitizer/tsan_interface.h>')
23734f983d8SPaolo Bonzini    error('Cannot enable TSAN due to missing fiber annotation interface')
23834f983d8SPaolo Bonzini  endif
23934f983d8SPaolo Bonzini  qemu_cflags = ['-fsanitize=thread'] + qemu_cflags
24034f983d8SPaolo Bonzini  qemu_ldflags = ['-fsanitize=thread'] + qemu_ldflags
24134f983d8SPaolo Bonziniendif
24234f983d8SPaolo Bonzini
243e4333d14SPaolo Bonzini# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
244e4333d14SPaolo Bonzini# The combination is known as "full relro", because .got.plt is read-only too.
245e4333d14SPaolo Bonziniqemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now')
246e4333d14SPaolo Bonzini
247d2147e04SPaolo Bonziniif targetos == 'windows'
248d2147e04SPaolo Bonzini  qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat')
2492d73fa74SPaolo Bonzini  qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va')
250d2147e04SPaolo Bonziniendif
251d2147e04SPaolo Bonzini
252d67212d4SPaolo Bonzini# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
25334f983d8SPaolo Bonziniif targetos != 'sunos' and not get_option('tsan')
254d67212d4SPaolo Bonzini  qemu_ldflags += cc.get_supported_link_arguments('-Wl,--warn-common')
255c55cf6abSPaolo Bonziniendif
256c55cf6abSPaolo Bonzini
257ff9ed62bSAlexander Bulekov# Specify linker-script with add_project_link_arguments so that it is not placed
258ff9ed62bSAlexander Bulekov# within a linker --start-group/--end-group pair
259537b7248SPaolo Bonziniif get_option('fuzzing')
260537b7248SPaolo Bonzini  # Specify a filter to only instrument code that is directly related to
261537b7248SPaolo Bonzini  # virtual-devices.
262537b7248SPaolo Bonzini  configure_file(output: 'instrumentation-filter',
263537b7248SPaolo Bonzini                 input: 'scripts/oss-fuzz/instrumentation-filter-template',
264537b7248SPaolo Bonzini                 copy: true)
265aa4f3a3bSAlexander Bulekov
266aa4f3a3bSAlexander Bulekov  if cc.compiles('int main () { return 0; }',
267aa4f3a3bSAlexander Bulekov                  name: '-fsanitize-coverage-allowlist=/dev/null',
268e56d0970SAlexander Bulekov                 args: ['-fsanitize-coverage-allowlist=/dev/null',
269e56d0970SAlexander Bulekov                        '-fsanitize-coverage=trace-pc'] )
270d67212d4SPaolo Bonzini    qemu_common_flags += ['-fsanitize-coverage-allowlist=instrumentation-filter']
271aa4f3a3bSAlexander Bulekov  endif
272537b7248SPaolo Bonzini
273537b7248SPaolo Bonzini  if get_option('fuzzing_engine') == ''
274537b7248SPaolo Bonzini    # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
275537b7248SPaolo Bonzini    # compiled code.  To build non-fuzzer binaries with --enable-fuzzing, link
276537b7248SPaolo Bonzini    # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
277537b7248SPaolo Bonzini    # unable to bind the fuzzer-related callbacks added by instrumentation.
278d67212d4SPaolo Bonzini    qemu_common_flags += ['-fsanitize=fuzzer-no-link']
279d67212d4SPaolo Bonzini    qemu_ldflags += ['-fsanitize=fuzzer-no-link']
280537b7248SPaolo Bonzini    # For the actual fuzzer binaries, we need to link against the libfuzzer
281537b7248SPaolo Bonzini    # library. They need to be configurable, to support OSS-Fuzz
282537b7248SPaolo Bonzini    fuzz_exe_ldflags = ['-fsanitize=fuzzer']
283537b7248SPaolo Bonzini  else
284537b7248SPaolo Bonzini    # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and
285537b7248SPaolo Bonzini    # the needed CFLAGS have already been provided
286537b7248SPaolo Bonzini    fuzz_exe_ldflags = get_option('fuzzing_engine').split()
287537b7248SPaolo Bonzini  endif
288ff9ed62bSAlexander Bulekovendif
289ff9ed62bSAlexander Bulekov
290d67212d4SPaolo Bonziniadd_global_arguments(qemu_common_flags, native: false, language: all_languages)
291d67212d4SPaolo Bonziniadd_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
292d67212d4SPaolo Bonzini
293b485458eSPaolo Bonzini# Check that the C++ compiler exists and works with the C compiler.
294b485458eSPaolo Bonzinilink_language = 'c'
295b485458eSPaolo Bonzinilinker = cc
296b485458eSPaolo Bonziniqemu_cxxflags = []
297e5134024SPaolo Bonziniif 'cpp' in all_languages
298b485458eSPaolo Bonzini  add_global_arguments(['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'],
299b485458eSPaolo Bonzini                       native: false, language: 'cpp')
300b485458eSPaolo Bonzini  foreach k: qemu_cflags
301b485458eSPaolo Bonzini    if k not in ['-Wstrict-prototypes', '-Wmissing-prototypes', '-Wnested-externs',
302b485458eSPaolo Bonzini                 '-Wold-style-declaration', '-Wold-style-definition', '-Wredundant-decls']
303b485458eSPaolo Bonzini      qemu_cxxflags += [k]
304b485458eSPaolo Bonzini    endif
305b485458eSPaolo Bonzini  endforeach
306b485458eSPaolo Bonzini
307b485458eSPaolo Bonzini  if cxx.links(files('scripts/main.c'), args: qemu_cflags)
308b485458eSPaolo Bonzini    link_language = 'cpp'
309b485458eSPaolo Bonzini    linker = cxx
310b485458eSPaolo Bonzini  else
311b485458eSPaolo Bonzini    message('C++ compiler does not work with C compiler')
312b485458eSPaolo Bonzini    message('Disabling C++-specific optional code')
313b485458eSPaolo Bonzini  endif
314b485458eSPaolo Bonziniendif
315b485458eSPaolo Bonzini
31634f983d8SPaolo Bonzini# clang does not support glibc + FORTIFY_SOURCE (is it still true?)
31734f983d8SPaolo Bonziniif get_option('optimization') != '0' and targetos == 'linux'
31834f983d8SPaolo Bonzini  if cc.get_id() == 'gcc'
31934f983d8SPaolo Bonzini    qemu_cflags += ['-U_FORTIFY_SOURCE', '-D_FORTIFY_SOURCE=2']
32034f983d8SPaolo Bonzini  endif
32134f983d8SPaolo Bonzini  if 'cpp' in all_languages and cxx.get_id() == 'gcc'
32234f983d8SPaolo Bonzini    qemu_cxxflags += ['-U_FORTIFY_SOURCE', '-D_FORTIFY_SOURCE=2']
32334f983d8SPaolo Bonzini  endif
32434f983d8SPaolo Bonziniendif
32534f983d8SPaolo Bonzini
326d67212d4SPaolo Bonziniadd_project_arguments(qemu_cflags, native: false, language: 'c')
327d67212d4SPaolo Bonziniadd_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
328d67212d4SPaolo Bonziniadd_project_arguments(qemu_objcflags, native: false, language: 'objc')
3291e6e616dSPaolo Bonziniif targetos == 'linux'
3301e6e616dSPaolo Bonzini  add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
3311e6e616dSPaolo Bonzini                        '-isystem', 'linux-headers',
332e5134024SPaolo Bonzini                        language: all_languages)
3331e6e616dSPaolo Bonziniendif
3341e6e616dSPaolo Bonzini
33523a77b2dSPaolo Bonziniadd_project_arguments('-iquote', '.',
3361e6e616dSPaolo Bonzini                      '-iquote', meson.current_source_dir(),
3371e6e616dSPaolo Bonzini                      '-iquote', meson.current_source_dir() / 'include',
338e5134024SPaolo Bonzini                      language: all_languages)
339a5665051SPaolo Bonzini
340deb62371SPaolo Bonzinisparse = find_program('cgcc', required: get_option('sparse'))
341deb62371SPaolo Bonziniif sparse.found()
342968b4db3SPaolo Bonzini  run_target('sparse',
343968b4db3SPaolo Bonzini             command: [find_program('scripts/check_sparse.py'),
344deb62371SPaolo Bonzini                       'compile_commands.json', sparse.full_path(), '-Wbitwise',
345deb62371SPaolo Bonzini                       '-Wno-transparent-union', '-Wno-old-initializer',
346deb62371SPaolo Bonzini                       '-Wno-non-pointer-null'])
347968b4db3SPaolo Bonziniendif
348968b4db3SPaolo Bonzini
3496ec0e15dSPaolo Bonzini###########################################
3506ec0e15dSPaolo Bonzini# Target-specific checks and dependencies #
3516ec0e15dSPaolo Bonzini###########################################
3526ec0e15dSPaolo Bonzini
353b7a75c8cSPaolo Bonzini# Fuzzing
354537b7248SPaolo Bonziniif get_option('fuzzing') and get_option('fuzzing_engine') == '' and \
355537b7248SPaolo Bonzini    not cc.links('''
356537b7248SPaolo Bonzini          #include <stdint.h>
357537b7248SPaolo Bonzini          #include <sys/types.h>
358537b7248SPaolo Bonzini          int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
359537b7248SPaolo Bonzini          int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
360537b7248SPaolo Bonzini        ''',
361537b7248SPaolo Bonzini        args: ['-Werror', '-fsanitize=fuzzer'])
362537b7248SPaolo Bonzini  error('Your compiler does not support -fsanitize=fuzzer')
363537b7248SPaolo Bonziniendif
364537b7248SPaolo Bonzini
365b7a75c8cSPaolo Bonzini# Tracing backends
3669c29b741SPaolo Bonziniif 'ftrace' in get_option('trace_backends') and targetos != 'linux'
3679c29b741SPaolo Bonzini  error('ftrace is supported only on Linux')
3689c29b741SPaolo Bonziniendif
3699c29b741SPaolo Bonziniif 'syslog' in get_option('trace_backends') and not cc.compiles('''
3709c29b741SPaolo Bonzini    #include <syslog.h>
3719c29b741SPaolo Bonzini    int main(void) {
3729c29b741SPaolo Bonzini        openlog("qemu", LOG_PID, LOG_DAEMON);
3739c29b741SPaolo Bonzini        syslog(LOG_INFO, "configure");
3749c29b741SPaolo Bonzini        return 0;
3759c29b741SPaolo Bonzini    }''')
3769c29b741SPaolo Bonzini  error('syslog is not supported on this system')
3779c29b741SPaolo Bonziniendif
3789c29b741SPaolo Bonzini
379b7a75c8cSPaolo Bonzini# Miscellaneous Linux-only features
380a436d6d4SPaolo Bonziniget_option('mpath') \
381a436d6d4SPaolo Bonzini  .require(targetos == 'linux', error_message: 'Multipath is supported only on Linux')
3826ec0e15dSPaolo Bonzini
383a436d6d4SPaolo Bonzinimultiprocess_allowed = get_option('multiprocess') \
384a436d6d4SPaolo Bonzini  .require(targetos == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \
385a436d6d4SPaolo Bonzini  .allowed()
386106ad1f9SPaolo Bonzini
38755116968SJagannathan Ramanvfio_user_server_allowed = get_option('vfio_user_server') \
38855116968SJagannathan Raman  .require(targetos == 'linux', error_message: 'vfio-user server is supported only on Linux') \
38955116968SJagannathan Raman  .allowed()
39055116968SJagannathan Raman
3910d04c4c9SPaolo Bonzinihave_tpm = get_option('tpm') \
3920d04c4c9SPaolo Bonzini  .require(targetos != 'windows', error_message: 'TPM emulation only available on POSIX systems') \
3930d04c4c9SPaolo Bonzini  .allowed()
3940d04c4c9SPaolo Bonzini
3952a3129a3SPaolo Bonzini# vhost
3962df89d54SPaolo Bonzinihave_vhost_user = get_option('vhost_user') \
3972df89d54SPaolo Bonzini  .disable_auto_if(targetos != 'linux') \
3982df89d54SPaolo Bonzini  .require(targetos != 'windows',
3992df89d54SPaolo Bonzini           error_message: 'vhost-user is not available on Windows').allowed()
4002df89d54SPaolo Bonzinihave_vhost_vdpa = get_option('vhost_vdpa') \
4012df89d54SPaolo Bonzini  .require(targetos == 'linux',
4022df89d54SPaolo Bonzini           error_message: 'vhost-vdpa is only available on Linux').allowed()
4032df89d54SPaolo Bonzinihave_vhost_kernel = get_option('vhost_kernel') \
4042df89d54SPaolo Bonzini  .require(targetos == 'linux',
4052df89d54SPaolo Bonzini           error_message: 'vhost-kernel is only available on Linux').allowed()
4062df89d54SPaolo Bonzinihave_vhost_user_crypto = get_option('vhost_crypto') \
4072df89d54SPaolo Bonzini  .require(have_vhost_user,
4082df89d54SPaolo Bonzini           error_message: 'vhost-crypto requires vhost-user to be enabled').allowed()
4092df89d54SPaolo Bonzini
41043b6d7eeSPaolo Bonzinihave_vhost = have_vhost_user or have_vhost_vdpa or have_vhost_kernel
4112df89d54SPaolo Bonzini
4122df89d54SPaolo Bonzinihave_vhost_net_user = have_vhost_user and get_option('vhost_net').allowed()
4132df89d54SPaolo Bonzinihave_vhost_net_vdpa = have_vhost_vdpa and get_option('vhost_net').allowed()
4142df89d54SPaolo Bonzinihave_vhost_net_kernel = have_vhost_kernel and get_option('vhost_net').allowed()
4152df89d54SPaolo Bonzinihave_vhost_net = have_vhost_net_kernel or have_vhost_net_user or have_vhost_net_vdpa
4162a3129a3SPaolo Bonzini
417b7a75c8cSPaolo Bonzini# Target-specific libraries and flags
4187fa1c635SPaolo Bonzinilibm = cc.find_library('m', required: false)
4196d7c7c2dSPaolo Bonzinithreads = dependency('threads')
420a81df1b6SPaolo Bonziniutil = cc.find_library('util', required: false)
4214a96337dSPaolo Bonziniwinmm = []
422a81df1b6SPaolo Bonzinisocket = []
42304c6f1e7SMarc-André Lureauversion_res = []
424d92989aaSMarc-André Lureaucoref = []
425d92989aaSMarc-André Lureauiokit = []
426b6c7cfd4SPaolo Bonziniemulator_link_args = []
42774a414a1SReinoud Zandijknvmm =not_found
4288a19980eSPaolo Bonzinihvf = not_found
42923011f44SMarc-André Lureaumidl = not_found
43023011f44SMarc-André Lureauwidl = not_found
431cf60ccc3SAkihiko Odakipathcch = not_found
432a6305081SPaolo Bonzinihost_dsosuf = '.so'
433a81df1b6SPaolo Bonziniif targetos == 'windows'
43423011f44SMarc-André Lureau  midl = find_program('midl', required: false)
43523011f44SMarc-André Lureau  widl = find_program('widl', required: false)
436cf60ccc3SAkihiko Odaki  pathcch = cc.find_library('pathcch')
437a81df1b6SPaolo Bonzini  socket = cc.find_library('ws2_32')
4384a96337dSPaolo Bonzini  winmm = cc.find_library('winmm')
43904c6f1e7SMarc-André Lureau
44004c6f1e7SMarc-André Lureau  win = import('windows')
44104c6f1e7SMarc-André Lureau  version_res = win.compile_resources('version.rc',
44204c6f1e7SMarc-André Lureau                                      depend_files: files('pc-bios/qemu-nsis.ico'),
44304c6f1e7SMarc-André Lureau                                      include_directories: include_directories('.'))
444a6305081SPaolo Bonzini  host_dsosuf = '.dll'
445d92989aaSMarc-André Lureauelif targetos == 'darwin'
446d92989aaSMarc-André Lureau  coref = dependency('appleframeworks', modules: 'CoreFoundation')
44714176c8dSJoelle van Dyne  iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
448a6305081SPaolo Bonzini  host_dsosuf = '.dylib'
449cfad62f1SPaolo Bonzinielif targetos == 'sunos'
450cfad62f1SPaolo Bonzini  socket = [cc.find_library('socket'),
451cfad62f1SPaolo Bonzini            cc.find_library('nsl'),
452cfad62f1SPaolo Bonzini            cc.find_library('resolv')]
453cfad62f1SPaolo Bonzinielif targetos == 'haiku'
454cfad62f1SPaolo Bonzini  socket = [cc.find_library('posix_error_mapper'),
455cfad62f1SPaolo Bonzini            cc.find_library('network'),
456cfad62f1SPaolo Bonzini            cc.find_library('bsd')]
457b6c7cfd4SPaolo Bonzinielif targetos == 'openbsd'
45843a363aeSPaolo Bonzini  if get_option('tcg').allowed() and target_dirs.length() > 0
459b6c7cfd4SPaolo Bonzini    # Disable OpenBSD W^X if available
460b6c7cfd4SPaolo Bonzini    emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
461b6c7cfd4SPaolo Bonzini  endif
462a81df1b6SPaolo Bonziniendif
4636ec0e15dSPaolo Bonzini
464b7a75c8cSPaolo Bonzini# Target-specific configuration of accelerators
4658a19980eSPaolo Bonziniaccelerators = []
46643a363aeSPaolo Bonziniif get_option('kvm').allowed() and targetos == 'linux'
4678a19980eSPaolo Bonzini  accelerators += 'CONFIG_KVM'
4688a19980eSPaolo Bonziniendif
46943a363aeSPaolo Bonziniif get_option('whpx').allowed() and targetos == 'windows'
47057e2a1f8SSunil Muthuswamy  if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
4718a19980eSPaolo Bonzini    error('WHPX requires 64-bit host')
4728a19980eSPaolo Bonzini  elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
4738a19980eSPaolo Bonzini       cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
4748a19980eSPaolo Bonzini    accelerators += 'CONFIG_WHPX'
4758a19980eSPaolo Bonzini  endif
4768a19980eSPaolo Bonziniendif
47743a363aeSPaolo Bonziniif get_option('hvf').allowed()
4788a19980eSPaolo Bonzini  hvf = dependency('appleframeworks', modules: 'Hypervisor',
4798a19980eSPaolo Bonzini                   required: get_option('hvf'))
4808a19980eSPaolo Bonzini  if hvf.found()
4818a19980eSPaolo Bonzini    accelerators += 'CONFIG_HVF'
4828a19980eSPaolo Bonzini  endif
4838a19980eSPaolo Bonziniendif
48443a363aeSPaolo Bonziniif get_option('hax').allowed()
4858a19980eSPaolo Bonzini  if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
4868a19980eSPaolo Bonzini    accelerators += 'CONFIG_HAX'
4878a19980eSPaolo Bonzini  endif
4888a19980eSPaolo Bonziniendif
48974a414a1SReinoud Zandijkif targetos == 'netbsd'
49074a414a1SReinoud Zandijk  nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
49174a414a1SReinoud Zandijk  if nvmm.found()
49274a414a1SReinoud Zandijk    accelerators += 'CONFIG_NVMM'
49374a414a1SReinoud Zandijk  endif
49474a414a1SReinoud Zandijkendif
49523a77b2dSPaolo Bonzini
496823eb013SPaolo Bonzinitcg_arch = host_arch
49743a363aeSPaolo Bonziniif get_option('tcg').allowed()
498823eb013SPaolo Bonzini  if host_arch == 'unknown'
49923a77b2dSPaolo Bonzini    if get_option('tcg_interpreter')
500f1f727acSPhilippe Mathieu-Daudé      warning('Unsupported CPU @0@, will use TCG with TCI (slow)'.format(cpu))
5018a19980eSPaolo Bonzini    else
5028a19980eSPaolo Bonzini      error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
5038a19980eSPaolo Bonzini    endif
504fa2f7b0bSPhilippe Mathieu-Daudé  elif get_option('tcg_interpreter')
5051c282da3SPhilippe Mathieu-Daudé    warning('Use of the TCG interpreter is not recommended on this host')
506fa2f7b0bSPhilippe Mathieu-Daudé    warning('architecture. There is a native TCG execution backend available')
507fa2f7b0bSPhilippe Mathieu-Daudé    warning('which provides substantially better performance and reliability.')
508fa2f7b0bSPhilippe Mathieu-Daudé    warning('It is strongly recommended to remove the --enable-tcg-interpreter')
509fa2f7b0bSPhilippe Mathieu-Daudé    warning('configuration option on this architecture to use the native')
510fa2f7b0bSPhilippe Mathieu-Daudé    warning('backend.')
5118a19980eSPaolo Bonzini  endif
51223a77b2dSPaolo Bonzini  if get_option('tcg_interpreter')
51323a77b2dSPaolo Bonzini    tcg_arch = 'tci'
514ed145144SRichard Henderson    config_host += { 'CONFIG_TCG_INTERPRETER': 'y' }
515823eb013SPaolo Bonzini  elif host_arch == 'x86_64'
51623a77b2dSPaolo Bonzini    tcg_arch = 'i386'
517823eb013SPaolo Bonzini  elif host_arch == 'ppc64'
51823a77b2dSPaolo Bonzini    tcg_arch = 'ppc'
51923a77b2dSPaolo Bonzini  endif
52023a77b2dSPaolo Bonzini  add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
521e5134024SPaolo Bonzini                        language: all_languages)
52223a77b2dSPaolo Bonzini
5238a19980eSPaolo Bonzini  accelerators += 'CONFIG_TCG'
5248a19980eSPaolo Bonzini  config_host += { 'CONFIG_TCG': 'y' }
5258a19980eSPaolo Bonziniendif
5268a19980eSPaolo Bonzini
5278a19980eSPaolo Bonziniif 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
5288a19980eSPaolo Bonzini  error('KVM not available on this platform')
5298a19980eSPaolo Bonziniendif
5308a19980eSPaolo Bonziniif 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
5318a19980eSPaolo Bonzini  error('HVF not available on this platform')
5328a19980eSPaolo Bonziniendif
53374a414a1SReinoud Zandijkif 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
53474a414a1SReinoud Zandijk  error('NVMM not available on this platform')
53574a414a1SReinoud Zandijkendif
5368a19980eSPaolo Bonziniif 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
5378a19980eSPaolo Bonzini  error('WHPX not available on this platform')
5388a19980eSPaolo Bonziniendif
539b4e312e9SPaolo Bonzini
5406ec0e15dSPaolo Bonzini################
5416ec0e15dSPaolo Bonzini# Dependencies #
5426ec0e15dSPaolo Bonzini################
5436ec0e15dSPaolo Bonzini
544fc9a809eSPaolo Bonzini# When bumping glib minimum version, please check also whether to increase
545fc9a809eSPaolo Bonzini# the _WIN32_WINNT setting in osdep.h according to the value from glib
546fc9a809eSPaolo Bonziniglib_req_ver = '>=2.56.0'
547fc9a809eSPaolo Bonziniglib_pc = dependency('glib-2.0', version: glib_req_ver, required: true,
548fc9a809eSPaolo Bonzini                    method: 'pkg-config')
549fc9a809eSPaolo Bonziniglib_cflags = []
5506002711cSPaolo Bonziniif enable_modules
551fc9a809eSPaolo Bonzini  gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true,
552fc9a809eSPaolo Bonzini                       method: 'pkg-config')
553fc9a809eSPaolo Bonzinielif config_host.has_key('CONFIG_PLUGIN')
554fc9a809eSPaolo Bonzini  gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true,
555fc9a809eSPaolo Bonzini                       method: 'pkg-config')
556fc9a809eSPaolo Bonzinielse
557fc9a809eSPaolo Bonzini  gmodule = not_found
558e3feb2ccSEmilio Cotaendif
559953d5a9eSMarc-André Lureau
560fc9a809eSPaolo Bonzini# This workaround is required due to a bug in pkg-config file for glib as it
561fc9a809eSPaolo Bonzini# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
562fc9a809eSPaolo Bonziniif targetos == 'windows' and get_option('prefer_static')
563fc9a809eSPaolo Bonzini  glib_cflags += ['-DGLIB_STATIC_COMPILATION']
564fc9a809eSPaolo Bonziniendif
565fc9a809eSPaolo Bonzini
566fc9a809eSPaolo Bonzini# Sanity check that the current size_t matches the
567fc9a809eSPaolo Bonzini# size that glib thinks it should be. This catches
568fc9a809eSPaolo Bonzini# problems on multi-arch where people try to build
569fc9a809eSPaolo Bonzini# 32-bit QEMU while pointing at 64-bit glib headers
570fc9a809eSPaolo Bonzini
571fc9a809eSPaolo Bonziniif not cc.compiles('''
572fc9a809eSPaolo Bonzini  #include <glib.h>
573fc9a809eSPaolo Bonzini  #include <unistd.h>
574fc9a809eSPaolo Bonzini
575fc9a809eSPaolo Bonzini  #define QEMU_BUILD_BUG_ON(x) \
576fc9a809eSPaolo Bonzini  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
577fc9a809eSPaolo Bonzini
578fc9a809eSPaolo Bonzini  int main(void) {
579fc9a809eSPaolo Bonzini     QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
580fc9a809eSPaolo Bonzini     return 0;
581fc9a809eSPaolo Bonzini  }''', dependencies: glib_pc, args: glib_cflags)
582fc9a809eSPaolo Bonzini  error('''sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T.
583fc9a809eSPaolo Bonzini        You probably need to set PKG_CONFIG_LIBDIR" to point
584fc9a809eSPaolo Bonzini        to the right pkg-config files for your build target.''')
585fc9a809eSPaolo Bonziniendif
586fc9a809eSPaolo Bonzini
587fc9a809eSPaolo Bonzini# Silence clang warnings triggered by glib < 2.57.2
588fc9a809eSPaolo Bonziniif not cc.compiles('''
589fc9a809eSPaolo Bonzini  #include <glib.h>
590fc9a809eSPaolo Bonzini  typedef struct Foo {
591fc9a809eSPaolo Bonzini    int i;
592fc9a809eSPaolo Bonzini  } Foo;
593fc9a809eSPaolo Bonzini  static void foo_free(Foo *f)
594fc9a809eSPaolo Bonzini  {
595fc9a809eSPaolo Bonzini    g_free(f);
596fc9a809eSPaolo Bonzini  }
597fc9a809eSPaolo Bonzini  G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free)
598fc9a809eSPaolo Bonzini  int main(void) { return 0; }''', dependencies: glib_pc, args: ['-Werror'])
599fc9a809eSPaolo Bonzini  glib_cflags += cc.get_supported_arguments('-Wno-unused-function')
600fc9a809eSPaolo Bonziniendif
601fc9a809eSPaolo Bonziniglib = declare_dependency(dependencies: [glib_pc, gmodule],
602fc9a809eSPaolo Bonzini                          compile_args: glib_cflags,
603fc9a809eSPaolo Bonzini                          version: glib_pc.version())
604fc9a809eSPaolo Bonzini
605fc9a809eSPaolo Bonzini# Check whether glib has gslice, which we have to avoid for correctness.
606fc9a809eSPaolo Bonzini# TODO: remove this check and the corresponding workaround (qtree) when
607fc9a809eSPaolo Bonzini# the minimum supported glib is >= 2.75.3
608fc9a809eSPaolo Bonziniglib_has_gslice = glib.version().version_compare('<2.75.3')
609fc9a809eSPaolo Bonzini
610fc9a809eSPaolo Bonzini# override glib dep to include the above refinements
611fc9a809eSPaolo Bonzinimeson.override_dependency('glib-2.0', glib)
612fc9a809eSPaolo Bonzini
613fc9a809eSPaolo Bonzini# The path to glib.h is added to all compilation commands.
614fc9a809eSPaolo Bonziniadd_project_dependencies(glib.partial_dependency(compile_args: true, includes: true),
615fc9a809eSPaolo Bonzini                         native: false, language: all_languages)
616fc9a809eSPaolo Bonzini
617a81df1b6SPaolo Bonzinigio = not_found
6187544060eSPaolo Bonzinigdbus_codegen = not_found
619bb2dc4b7SPaolo Bonzinigdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio'
6207544060eSPaolo Bonziniif not get_option('gio').auto() or have_system
6217544060eSPaolo Bonzini  gio = dependency('gio-2.0', required: get_option('gio'),
622063d5119SPaolo Bonzini                   method: 'pkg-config')
6237544060eSPaolo Bonzini  if gio.found() and not cc.links('''
6247544060eSPaolo Bonzini    #include <gio/gio.h>
6257544060eSPaolo Bonzini    int main(void)
6267544060eSPaolo Bonzini    {
6277544060eSPaolo Bonzini      g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
6287544060eSPaolo Bonzini      return 0;
6297544060eSPaolo Bonzini    }''', dependencies: [glib, gio])
6307544060eSPaolo Bonzini    if get_option('gio').enabled()
6317544060eSPaolo Bonzini      error('The installed libgio is broken for static linking')
632a81df1b6SPaolo Bonzini    endif
6337544060eSPaolo Bonzini    gio = not_found
6347544060eSPaolo Bonzini  endif
6357544060eSPaolo Bonzini  if gio.found()
6367544060eSPaolo Bonzini    gdbus_codegen = find_program(gio.get_variable('gdbus_codegen'),
6377544060eSPaolo Bonzini                                 required: get_option('gio'))
6387544060eSPaolo Bonzini    gio_unix = dependency('gio-unix-2.0', required: get_option('gio'),
639063d5119SPaolo Bonzini                          method: 'pkg-config')
6407544060eSPaolo Bonzini    gio = declare_dependency(dependencies: [gio, gio_unix],
6417544060eSPaolo Bonzini                             version: gio.version())
6427544060eSPaolo Bonzini  endif
6437544060eSPaolo Bonziniendif
644bb2dc4b7SPaolo Bonziniif gdbus_codegen.found() and get_option('cfi')
645bb2dc4b7SPaolo Bonzini  gdbus_codegen = not_found
646bb2dc4b7SPaolo Bonzini  gdbus_codegen_error = '@0@ uses gdbus-codegen, which does not support control flow integrity'
647bb2dc4b7SPaolo Bonziniendif
6487544060eSPaolo Bonzini
649a81df1b6SPaolo Bonzinilttng = not_found
6509c29b741SPaolo Bonziniif 'ust' in get_option('trace_backends')
651e32aaa5aSMarc-André Lureau  lttng = dependency('lttng-ust', required: true, version: '>= 2.1',
652063d5119SPaolo Bonzini                     method: 'pkg-config')
653a81df1b6SPaolo Bonziniendif
654b7612f45SPaolo Bonzinipixman = not_found
655b7612f45SPaolo Bonziniif have_system or have_tools
656b7612f45SPaolo Bonzini  pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
657063d5119SPaolo Bonzini                      method: 'pkg-config')
658b7612f45SPaolo Bonziniendif
659063d5119SPaolo Bonzinizlib = dependency('zlib', required: true)
66053c22b68SPaolo Bonzini
661ff66f3e5SPaolo Bonzinilibaio = not_found
662ff66f3e5SPaolo Bonziniif not get_option('linux_aio').auto() or have_block
663ff66f3e5SPaolo Bonzini  libaio = cc.find_library('aio', has_headers: ['libaio.h'],
664063d5119SPaolo Bonzini                           required: get_option('linux_aio'))
665ff66f3e5SPaolo Bonziniendif
666354081d4SLeonardo Bras
667354081d4SLeonardo Braslinux_io_uring_test = '''
668354081d4SLeonardo Bras  #include <liburing.h>
669354081d4SLeonardo Bras  #include <linux/errqueue.h>
670354081d4SLeonardo Bras
671354081d4SLeonardo Bras  int main(void) { return 0; }'''
672354081d4SLeonardo Bras
6735e5733e5SMarc-André Lureaulinux_io_uring = not_found
67453c22b68SPaolo Bonziniif not get_option('linux_io_uring').auto() or have_block
675a41b4fdcSDaniel P. Berrangé  linux_io_uring = dependency('liburing', version: '>=0.3',
676a41b4fdcSDaniel P. Berrangé                              required: get_option('linux_io_uring'),
677063d5119SPaolo Bonzini                              method: 'pkg-config')
678354081d4SLeonardo Bras  if not cc.links(linux_io_uring_test)
679354081d4SLeonardo Bras    linux_io_uring = not_found
6805e5733e5SMarc-André Lureau  endif
681354081d4SLeonardo Brasendif
682354081d4SLeonardo Bras
6835e5733e5SMarc-André Lureaulibnfs = not_found
68430045c05SPaolo Bonziniif not get_option('libnfs').auto() or have_block
68530045c05SPaolo Bonzini  libnfs = dependency('libnfs', version: '>=1.9.3',
68630045c05SPaolo Bonzini                      required: get_option('libnfs'),
687063d5119SPaolo Bonzini                      method: 'pkg-config')
6885e5733e5SMarc-André Lureauendif
689f7f2d651SPaolo Bonzini
690f7f2d651SPaolo Bonzinilibattr_test = '''
691f7f2d651SPaolo Bonzini  #include <stddef.h>
692f7f2d651SPaolo Bonzini  #include <sys/types.h>
693f7f2d651SPaolo Bonzini  #ifdef CONFIG_LIBATTR
694f7f2d651SPaolo Bonzini  #include <attr/xattr.h>
695f7f2d651SPaolo Bonzini  #else
696f7f2d651SPaolo Bonzini  #include <sys/xattr.h>
697f7f2d651SPaolo Bonzini  #endif
698f7f2d651SPaolo Bonzini  int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
699f7f2d651SPaolo Bonzini
700ec0d5893SMarc-André Lureaulibattr = not_found
701f7f2d651SPaolo Bonzinihave_old_libattr = false
70243a363aeSPaolo Bonziniif get_option('attr').allowed()
703f7f2d651SPaolo Bonzini  if cc.links(libattr_test)
704f7f2d651SPaolo Bonzini    libattr = declare_dependency()
705f7f2d651SPaolo Bonzini  else
706f7f2d651SPaolo Bonzini    libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
707063d5119SPaolo Bonzini                              required: get_option('attr'))
708f7f2d651SPaolo Bonzini    if libattr.found() and not \
709f7f2d651SPaolo Bonzini      cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
710f7f2d651SPaolo Bonzini      libattr = not_found
711f7f2d651SPaolo Bonzini      if get_option('attr').enabled()
712f7f2d651SPaolo Bonzini        error('could not link libattr')
713f7f2d651SPaolo Bonzini      else
714f7f2d651SPaolo Bonzini        warning('could not link libattr, disabling')
715ec0d5893SMarc-André Lureau      endif
716f7f2d651SPaolo Bonzini    else
717f7f2d651SPaolo Bonzini      have_old_libattr = libattr.found()
718f7f2d651SPaolo Bonzini    endif
719f7f2d651SPaolo Bonzini  endif
720f7f2d651SPaolo Bonziniendif
721f7f2d651SPaolo Bonzini
72252eaefd3SAkihiko Odakicocoa = dependency('appleframeworks', modules: ['Cocoa', 'CoreVideo'],
72352eaefd3SAkihiko Odaki                   required: get_option('cocoa'))
724c1ec4941SPaolo Bonzini
725e2c1d78dSVladislav Yaroshchukvmnet = dependency('appleframeworks', modules: 'vmnet', required: get_option('vmnet'))
726e2c1d78dSVladislav Yaroshchukif vmnet.found() and not cc.has_header_symbol('vmnet/vmnet.h',
727e2c1d78dSVladislav Yaroshchuk                                              'VMNET_BRIDGED_MODE',
728e2c1d78dSVladislav Yaroshchuk                                              dependencies: vmnet)
729e2c1d78dSVladislav Yaroshchuk  vmnet = not_found
730e2c1d78dSVladislav Yaroshchuk  if get_option('vmnet').enabled()
731e2c1d78dSVladislav Yaroshchuk    error('vmnet.framework API is outdated')
732e2c1d78dSVladislav Yaroshchuk  else
733e2c1d78dSVladislav Yaroshchuk    warning('vmnet.framework API is outdated, disabling')
734e2c1d78dSVladislav Yaroshchuk  endif
735e2c1d78dSVladislav Yaroshchukendif
736e2c1d78dSVladislav Yaroshchuk
7373f99cf57SPaolo Bonziniseccomp = not_found
73873422d95SMichal Privoznikseccomp_has_sysrawrc = false
73990835c2bSPaolo Bonziniif not get_option('seccomp').auto() or have_system or have_tools
74090835c2bSPaolo Bonzini  seccomp = dependency('libseccomp', version: '>=2.3.0',
74190835c2bSPaolo Bonzini                       required: get_option('seccomp'),
742063d5119SPaolo Bonzini                       method: 'pkg-config')
74373422d95SMichal Privoznik  if seccomp.found()
74473422d95SMichal Privoznik    seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h',
74573422d95SMichal Privoznik                                                'SCMP_FLTATR_API_SYSRAWRC',
74673422d95SMichal Privoznik                                                dependencies: seccomp)
74773422d95SMichal Privoznik  endif
7483f99cf57SPaolo Bonziniendif
749727c8bb8SPaolo Bonzini
7503f99cf57SPaolo Bonzinilibcap_ng = not_found
751727c8bb8SPaolo Bonziniif not get_option('cap_ng').auto() or have_system or have_tools
752727c8bb8SPaolo Bonzini  libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
753063d5119SPaolo Bonzini                              required: get_option('cap_ng'))
7543f99cf57SPaolo Bonziniendif
755727c8bb8SPaolo Bonziniif libcap_ng.found() and not cc.links('''
756727c8bb8SPaolo Bonzini   #include <cap-ng.h>
757727c8bb8SPaolo Bonzini   int main(void)
758727c8bb8SPaolo Bonzini   {
759727c8bb8SPaolo Bonzini     capng_capability_to_name(CAPNG_EFFECTIVE);
760727c8bb8SPaolo Bonzini     return 0;
761727c8bb8SPaolo Bonzini   }''', dependencies: libcap_ng)
762727c8bb8SPaolo Bonzini  libcap_ng = not_found
763727c8bb8SPaolo Bonzini  if get_option('cap_ng').enabled()
764727c8bb8SPaolo Bonzini    error('could not link libcap-ng')
765727c8bb8SPaolo Bonzini  else
766727c8bb8SPaolo Bonzini    warning('could not link libcap-ng, disabling')
767727c8bb8SPaolo Bonzini  endif
768727c8bb8SPaolo Bonziniendif
769727c8bb8SPaolo Bonzini
7701917ec6dSPaolo Bonziniif get_option('xkbcommon').auto() and not have_system and not have_tools
7711917ec6dSPaolo Bonzini  xkbcommon = not_found
7721917ec6dSPaolo Bonzinielse
7731917ec6dSPaolo Bonzini  xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
774063d5119SPaolo Bonzini                         method: 'pkg-config')
775ade60d4fSMarc-André Lureauendif
776e1723999SPaolo Bonzini
7775890258aSThomas Huthslirp = not_found
7785890258aSThomas Huthif not get_option('slirp').auto() or have_system
7795890258aSThomas Huth  slirp = dependency('slirp', required: get_option('slirp'),
780063d5119SPaolo Bonzini                     method: 'pkg-config')
7815890258aSThomas Huth  # slirp < 4.7 is incompatible with CFI support in QEMU.  This is because
7825890258aSThomas Huth  # it passes function pointers within libslirp as callbacks for timers.
7835890258aSThomas Huth  # When using a system-wide shared libslirp, the type information for the
7845890258aSThomas Huth  # callback is missing and the timer call produces a false positive with CFI.
7855890258aSThomas Huth  # Do not use the "version" keyword argument to produce a better error.
7865890258aSThomas Huth  # with control-flow integrity.
7875890258aSThomas Huth  if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7')
7885890258aSThomas Huth    if get_option('slirp').enabled()
7895890258aSThomas Huth      error('Control-Flow Integrity requires libslirp 4.7.')
7905890258aSThomas Huth    else
7915890258aSThomas Huth      warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.')
7925890258aSThomas Huth      slirp = not_found
7935890258aSThomas Huth    endif
7945890258aSThomas Huth  endif
7955890258aSThomas Huthendif
7965890258aSThomas Huth
797cdaf0722SMarc-André Lureauvde = not_found
798e1723999SPaolo Bonziniif not get_option('vde').auto() or have_system or have_tools
799e1723999SPaolo Bonzini  vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
800063d5119SPaolo Bonzini                           required: get_option('vde'))
801e1723999SPaolo Bonziniendif
802e1723999SPaolo Bonziniif vde.found() and not cc.links('''
803e1723999SPaolo Bonzini   #include <libvdeplug.h>
804e1723999SPaolo Bonzini   int main(void)
805e1723999SPaolo Bonzini   {
806e1723999SPaolo Bonzini     struct vde_open_args a = {0, 0, 0};
807e1723999SPaolo Bonzini     char s[] = "";
808e1723999SPaolo Bonzini     vde_open(s, s, &a);
809e1723999SPaolo Bonzini     return 0;
810e1723999SPaolo Bonzini   }''', dependencies: vde)
811e1723999SPaolo Bonzini  vde = not_found
812e1723999SPaolo Bonzini  if get_option('cap_ng').enabled()
813e1723999SPaolo Bonzini    error('could not link libvdeplug')
814e1723999SPaolo Bonzini  else
815e1723999SPaolo Bonzini    warning('could not link libvdeplug, disabling')
816e1723999SPaolo Bonzini  endif
817cdaf0722SMarc-André Lureauendif
81887430d5bSPaolo Bonzini
819478e943fSPaolo Bonzinipulse = not_found
82087430d5bSPaolo Bonziniif not get_option('pa').auto() or (targetos == 'linux' and have_system)
82187430d5bSPaolo Bonzini  pulse = dependency('libpulse', required: get_option('pa'),
822063d5119SPaolo Bonzini                     method: 'pkg-config')
823478e943fSPaolo Bonziniendif
824478e943fSPaolo Bonzinialsa = not_found
82587430d5bSPaolo Bonziniif not get_option('alsa').auto() or (targetos == 'linux' and have_system)
82687430d5bSPaolo Bonzini  alsa = dependency('alsa', required: get_option('alsa'),
827063d5119SPaolo Bonzini                    method: 'pkg-config')
828478e943fSPaolo Bonziniendif
829478e943fSPaolo Bonzinijack = not_found
83087430d5bSPaolo Bonziniif not get_option('jack').auto() or have_system
83187430d5bSPaolo Bonzini  jack = dependency('jack', required: get_option('jack'),
832063d5119SPaolo Bonzini                    method: 'pkg-config')
833478e943fSPaolo Bonziniendif
834c2d3d1c2SDorinda Basseypipewire = not_found
835c2d3d1c2SDorinda Basseyif not get_option('pipewire').auto() or (targetos == 'linux' and have_system)
836c2d3d1c2SDorinda Bassey  pipewire = dependency('libpipewire-0.3', version: '>=0.3.60',
837c2d3d1c2SDorinda Bassey                    required: get_option('pipewire'),
838063d5119SPaolo Bonzini                    method: 'pkg-config')
839c2d3d1c2SDorinda Basseyendif
840663df1ccSAlexandre Ratchovsndio = not_found
841663df1ccSAlexandre Ratchovif not get_option('sndio').auto() or have_system
842663df1ccSAlexandre Ratchov  sndio = dependency('sndio', required: get_option('sndio'),
843063d5119SPaolo Bonzini                    method: 'pkg-config')
844663df1ccSAlexandre Ratchovendif
84587430d5bSPaolo Bonzini
84658d3f3ffSGerd Hoffmannspice_protocol = not_found
8473f0a5d55SMarc-André Lureauif not get_option('spice_protocol').auto() or have_system
8485c167b53SMarkus Armbruster  spice_protocol = dependency('spice-protocol', version: '>=0.14.0',
8493f0a5d55SMarc-André Lureau                              required: get_option('spice_protocol'),
850063d5119SPaolo Bonzini                              method: 'pkg-config')
8512634733cSPaolo Bonziniendif
8523f0a5d55SMarc-André Lureauspice = not_found
8533f0a5d55SMarc-André Lureauif not get_option('spice').auto() or have_system
85434d55725SMarkus Armbruster  spice = dependency('spice-server', version: '>=0.14.0',
8553f0a5d55SMarc-André Lureau                     required: get_option('spice'),
856063d5119SPaolo Bonzini                     method: 'pkg-config')
85758d3f3ffSGerd Hoffmannendif
8583f0a5d55SMarc-André Lureauspice_headers = spice.partial_dependency(compile_args: true, includes: true)
8593f0a5d55SMarc-André Lureau
8605ee24e78SMarc-André Lureaurt = cc.find_library('rt', required: false)
861a399f914SPaolo Bonzini
86299650b62SPaolo Bonzinilibiscsi = not_found
8639db405a3SPaolo Bonziniif not get_option('libiscsi').auto() or have_block
8649db405a3SPaolo Bonzini  libiscsi = dependency('libiscsi', version: '>=1.9.0',
8659db405a3SPaolo Bonzini                         required: get_option('libiscsi'),
866063d5119SPaolo Bonzini                         method: 'pkg-config')
86799650b62SPaolo Bonziniendif
8685e5733e5SMarc-André Lureauzstd = not_found
869b1def33dSPaolo Bonziniif not get_option('zstd').auto() or have_block
870b1def33dSPaolo Bonzini  zstd = dependency('libzstd', version: '>=1.4.0',
871b1def33dSPaolo Bonzini                    required: get_option('zstd'),
872063d5119SPaolo Bonzini                    method: 'pkg-config')
8735e5733e5SMarc-André Lureauendif
874ea458960SMarc-André Lureauvirgl = not_found
8750265fe9eSPaolo Bonzini
8760265fe9eSPaolo Bonzinihave_vhost_user_gpu = have_tools and targetos == 'linux' and pixman.found()
8770265fe9eSPaolo Bonziniif not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
878587d59d6SPaolo Bonzini  virgl = dependency('virglrenderer',
879587d59d6SPaolo Bonzini                     method: 'pkg-config',
880063d5119SPaolo Bonzini                     required: get_option('virglrenderer'))
881ea458960SMarc-André Lureauendif
882fd66dbd4SStefan Hajnocziblkio = not_found
883fd66dbd4SStefan Hajnocziif not get_option('blkio').auto() or have_block
884fd66dbd4SStefan Hajnoczi  blkio = dependency('blkio',
885fd66dbd4SStefan Hajnoczi                     method: 'pkg-config',
886063d5119SPaolo Bonzini                     required: get_option('blkio'))
887fd66dbd4SStefan Hajnocziendif
8881d7bb6abSMarc-André Lureaucurl = not_found
889f9cd86feSPaolo Bonziniif not get_option('curl').auto() or have_block
890f9cd86feSPaolo Bonzini  curl = dependency('libcurl', version: '>=7.29.0',
891f9cd86feSPaolo Bonzini                    method: 'pkg-config',
892063d5119SPaolo Bonzini                    required: get_option('curl'))
8931d7bb6abSMarc-André Lureauendif
894f15bff25SPaolo Bonzinilibudev = not_found
895f01496a3SPaolo Bonziniif targetos == 'linux' and (have_system or have_tools)
8966ec0e15dSPaolo Bonzini  libudev = dependency('libudev',
897a0fbbb6eSPaolo Bonzini                       method: 'pkg-config',
898063d5119SPaolo Bonzini                       required: get_option('libudev'))
899f15bff25SPaolo Bonziniendif
9006ec0e15dSPaolo Bonzini
9015c53015aSPaolo Bonzinimpathlibs = [libudev]
9026ec0e15dSPaolo Bonzinimpathpersist = not_found
9036ec0e15dSPaolo Bonzinimpathpersist_new_api = false
90443a363aeSPaolo Bonziniif targetos == 'linux' and have_tools and get_option('mpath').allowed()
9056ec0e15dSPaolo Bonzini  mpath_test_source_new = '''
9066ec0e15dSPaolo Bonzini    #include <libudev.h>
9076ec0e15dSPaolo Bonzini    #include <mpath_persist.h>
9086ec0e15dSPaolo Bonzini    unsigned mpath_mx_alloc_len = 1024;
9096ec0e15dSPaolo Bonzini    int logsink;
9106ec0e15dSPaolo Bonzini    static struct config *multipath_conf;
9116ec0e15dSPaolo Bonzini    extern struct udev *udev;
9126ec0e15dSPaolo Bonzini    extern struct config *get_multipath_config(void);
9136ec0e15dSPaolo Bonzini    extern void put_multipath_config(struct config *conf);
9146ec0e15dSPaolo Bonzini    struct udev *udev;
9156ec0e15dSPaolo Bonzini    struct config *get_multipath_config(void) { return multipath_conf; }
9166ec0e15dSPaolo Bonzini    void put_multipath_config(struct config *conf) { }
9176ec0e15dSPaolo Bonzini    int main(void) {
9186ec0e15dSPaolo Bonzini        udev = udev_new();
9196ec0e15dSPaolo Bonzini        multipath_conf = mpath_lib_init();
9206ec0e15dSPaolo Bonzini        return 0;
9216ec0e15dSPaolo Bonzini    }'''
9226ec0e15dSPaolo Bonzini  mpath_test_source_old = '''
9236ec0e15dSPaolo Bonzini      #include <libudev.h>
9246ec0e15dSPaolo Bonzini      #include <mpath_persist.h>
9256ec0e15dSPaolo Bonzini      unsigned mpath_mx_alloc_len = 1024;
9266ec0e15dSPaolo Bonzini      int logsink;
9276ec0e15dSPaolo Bonzini      int main(void) {
9286ec0e15dSPaolo Bonzini          struct udev *udev = udev_new();
9296ec0e15dSPaolo Bonzini          mpath_lib_init(udev);
9306ec0e15dSPaolo Bonzini          return 0;
9316ec0e15dSPaolo Bonzini      }'''
9325c53015aSPaolo Bonzini  libmpathpersist = cc.find_library('mpathpersist',
933063d5119SPaolo Bonzini                                    required: get_option('mpath'))
9345c53015aSPaolo Bonzini  if libmpathpersist.found()
9355c53015aSPaolo Bonzini    mpathlibs += libmpathpersist
936a0cbd2e8SPaolo Bonzini    if get_option('prefer_static')
93743b43a40SPaolo Bonzini      mpathlibs += cc.find_library('devmapper',
938063d5119SPaolo Bonzini                                     required: get_option('mpath'))
93943b43a40SPaolo Bonzini    endif
94043b43a40SPaolo Bonzini    mpathlibs += cc.find_library('multipath',
941063d5119SPaolo Bonzini                                 required: get_option('mpath'))
94243b43a40SPaolo Bonzini    foreach lib: mpathlibs
94343b43a40SPaolo Bonzini      if not lib.found()
94443b43a40SPaolo Bonzini        mpathlibs = []
94543b43a40SPaolo Bonzini        break
94643b43a40SPaolo Bonzini      endif
94743b43a40SPaolo Bonzini    endforeach
9485c53015aSPaolo Bonzini    if mpathlibs.length() == 0
9495c53015aSPaolo Bonzini      msg = 'Dependencies missing for libmpathpersist'
9505c53015aSPaolo Bonzini    elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
9516ec0e15dSPaolo Bonzini      mpathpersist = declare_dependency(dependencies: mpathlibs)
9526ec0e15dSPaolo Bonzini      mpathpersist_new_api = true
9536ec0e15dSPaolo Bonzini    elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
9546ec0e15dSPaolo Bonzini      mpathpersist = declare_dependency(dependencies: mpathlibs)
9556ec0e15dSPaolo Bonzini    else
9565c53015aSPaolo Bonzini      msg = 'Cannot detect libmpathpersist API'
9575c53015aSPaolo Bonzini    endif
9585c53015aSPaolo Bonzini    if not mpathpersist.found()
9596ec0e15dSPaolo Bonzini      if get_option('mpath').enabled()
9605c53015aSPaolo Bonzini        error(msg)
9616ec0e15dSPaolo Bonzini      else
9625c53015aSPaolo Bonzini        warning(msg + ', disabling')
9636ec0e15dSPaolo Bonzini      endif
9646ec0e15dSPaolo Bonzini    endif
9656ec0e15dSPaolo Bonzini  endif
9666ec0e15dSPaolo Bonziniendif
9676ec0e15dSPaolo Bonzini
9685285e593SYonggang Luoiconv = not_found
96930fe76b1SPaolo Bonzinicurses = not_found
97043a363aeSPaolo Bonziniif have_system and get_option('curses').allowed()
9715285e593SYonggang Luo  curses_test = '''
972fbab8cc2SStefan Weil    #if defined(__APPLE__) || defined(__OpenBSD__)
973fbab8cc2SStefan Weil    #define _XOPEN_SOURCE_EXTENDED 1
974fbab8cc2SStefan Weil    #endif
9755285e593SYonggang Luo    #include <locale.h>
9765285e593SYonggang Luo    #include <curses.h>
9775285e593SYonggang Luo    #include <wchar.h>
9785285e593SYonggang Luo    int main(void) {
9795285e593SYonggang Luo      wchar_t wch = L'w';
9805285e593SYonggang Luo      setlocale(LC_ALL, "");
9815285e593SYonggang Luo      resize_term(0, 0);
9825285e593SYonggang Luo      addwstr(L"wide chars\n");
9835285e593SYonggang Luo      addnwstr(&wch, 1);
9845285e593SYonggang Luo      add_wch(WACS_DEGREE);
9855285e593SYonggang Luo      return 0;
9865285e593SYonggang Luo    }'''
987925a40dfSPaolo Bonzini
988ca31e307SYonggang Luo  curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
9896d322635SPaolo Bonzini  curses = dependency(curses_dep_list,
9905285e593SYonggang Luo                      required: false,
991063d5119SPaolo Bonzini                      method: 'pkg-config')
992925a40dfSPaolo Bonzini  msg = get_option('curses').enabled() ? 'curses library not found' : ''
993fbab8cc2SStefan Weil  curses_compile_args = ['-DNCURSES_WIDECHAR=1']
994925a40dfSPaolo Bonzini  if curses.found()
9950dbce6efSPaolo Bonzini    if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
996bd3615d6SPaolo Bonzini      curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses],
997bd3615d6SPaolo Bonzini                                  version: curses.version())
998925a40dfSPaolo Bonzini    else
999925a40dfSPaolo Bonzini      msg = 'curses package not usable'
1000925a40dfSPaolo Bonzini      curses = not_found
10015285e593SYonggang Luo    endif
1002925a40dfSPaolo Bonzini  endif
1003925a40dfSPaolo Bonzini  if not curses.found()
1004925a40dfSPaolo Bonzini    has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
1005925a40dfSPaolo Bonzini    if targetos != 'windows' and not has_curses_h
1006925a40dfSPaolo Bonzini      message('Trying with /usr/include/ncursesw')
1007925a40dfSPaolo Bonzini      curses_compile_args += ['-I/usr/include/ncursesw']
1008925a40dfSPaolo Bonzini      has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
1009925a40dfSPaolo Bonzini    endif
1010925a40dfSPaolo Bonzini    if has_curses_h
1011925a40dfSPaolo Bonzini      curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
1012925a40dfSPaolo Bonzini      foreach curses_libname : curses_libname_list
10135285e593SYonggang Luo        libcurses = cc.find_library(curses_libname,
1014063d5119SPaolo Bonzini                                    required: false)
10155285e593SYonggang Luo        if libcurses.found()
1016925a40dfSPaolo Bonzini          if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
1017925a40dfSPaolo Bonzini            curses = declare_dependency(compile_args: curses_compile_args,
1018925a40dfSPaolo Bonzini                                        dependencies: [libcurses])
10195285e593SYonggang Luo            break
1020925a40dfSPaolo Bonzini          else
1021925a40dfSPaolo Bonzini            msg = 'curses library not usable'
10225285e593SYonggang Luo          endif
10235285e593SYonggang Luo        endif
10245285e593SYonggang Luo      endforeach
10255285e593SYonggang Luo    endif
102630fe76b1SPaolo Bonzini  endif
102743a363aeSPaolo Bonzini  if get_option('iconv').allowed()
1028925a40dfSPaolo Bonzini    foreach link_args : [ ['-liconv'], [] ]
1029925a40dfSPaolo Bonzini      # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
1030925a40dfSPaolo Bonzini      # We need to use libiconv if available because mixing libiconv's headers with
1031925a40dfSPaolo Bonzini      # the system libc does not work.
1032925a40dfSPaolo Bonzini      # However, without adding glib to the dependencies -L/usr/local/lib will not be
1033925a40dfSPaolo Bonzini      # included in the command line and libiconv will not be found.
1034925a40dfSPaolo Bonzini      if cc.links('''
1035925a40dfSPaolo Bonzini        #include <iconv.h>
1036925a40dfSPaolo Bonzini        int main(void) {
1037925a40dfSPaolo Bonzini          iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
1038925a40dfSPaolo Bonzini          return conv != (iconv_t) -1;
1039fc9a809eSPaolo Bonzini        }''', args: link_args, dependencies: glib)
1040925a40dfSPaolo Bonzini        iconv = declare_dependency(link_args: link_args, dependencies: glib)
1041925a40dfSPaolo Bonzini        break
1042925a40dfSPaolo Bonzini      endif
1043925a40dfSPaolo Bonzini    endforeach
1044925a40dfSPaolo Bonzini  endif
1045925a40dfSPaolo Bonzini  if curses.found() and not iconv.found()
1046925a40dfSPaolo Bonzini    if get_option('iconv').enabled()
1047925a40dfSPaolo Bonzini      error('iconv not available')
1048925a40dfSPaolo Bonzini    endif
1049925a40dfSPaolo Bonzini    msg = 'iconv required for curses UI but not available'
1050925a40dfSPaolo Bonzini    curses = not_found
1051925a40dfSPaolo Bonzini  endif
1052925a40dfSPaolo Bonzini  if not curses.found() and msg != ''
1053925a40dfSPaolo Bonzini    if get_option('curses').enabled()
1054925a40dfSPaolo Bonzini      error(msg)
10555285e593SYonggang Luo    else
1056925a40dfSPaolo Bonzini      warning(msg + ', disabling')
105730fe76b1SPaolo Bonzini    endif
10585285e593SYonggang Luo  endif
10595285e593SYonggang Luoendif
10605285e593SYonggang Luo
10612634733cSPaolo Bonzinibrlapi = not_found
10628c6d4ff4SPaolo Bonziniif not get_option('brlapi').auto() or have_system
10638c6d4ff4SPaolo Bonzini  brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
1064063d5119SPaolo Bonzini                         required: get_option('brlapi'))
10658c6d4ff4SPaolo Bonzini  if brlapi.found() and not cc.links('''
10668c6d4ff4SPaolo Bonzini     #include <brlapi.h>
10678c6d4ff4SPaolo Bonzini     #include <stddef.h>
10688c6d4ff4SPaolo Bonzini     int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
10698c6d4ff4SPaolo Bonzini    brlapi = not_found
10708c6d4ff4SPaolo Bonzini    if get_option('brlapi').enabled()
10718c6d4ff4SPaolo Bonzini      error('could not link brlapi')
10728c6d4ff4SPaolo Bonzini    else
10738c6d4ff4SPaolo Bonzini      warning('could not link brlapi, disabling')
10748c6d4ff4SPaolo Bonzini    endif
10758c6d4ff4SPaolo Bonzini  endif
10762634733cSPaolo Bonziniendif
107735be72baSPaolo Bonzini
1078760e4327SPaolo Bonzinisdl = not_found
107964d3fec7SAkihiko Odakiif not get_option('sdl').auto() or have_system
1080063d5119SPaolo Bonzini  sdl = dependency('sdl2', required: get_option('sdl'))
108135be72baSPaolo Bonzini  sdl_image = not_found
1082760e4327SPaolo Bonziniendif
108335be72baSPaolo Bonziniif sdl.found()
108435be72baSPaolo Bonzini  # work around 2.0.8 bug
108535be72baSPaolo Bonzini  sdl = declare_dependency(compile_args: '-Wno-undef',
1086bd3615d6SPaolo Bonzini                           dependencies: sdl,
1087bd3615d6SPaolo Bonzini                           version: sdl.version())
10887161a433SVolker Rümelin  sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
1089063d5119SPaolo Bonzini                         method: 'pkg-config')
109035be72baSPaolo Bonzinielse
109135be72baSPaolo Bonzini  if get_option('sdl_image').enabled()
1092a8dc2aceSSergei Trofimovich    error('sdl-image required, but SDL was @0@'.format(
1093a8dc2aceSSergei Trofimovich          get_option('sdl').disabled() ? 'disabled' : 'not found'))
10942634733cSPaolo Bonzini  endif
109535be72baSPaolo Bonzini  sdl_image = not_found
109635be72baSPaolo Bonziniendif
109735be72baSPaolo Bonzini
10985e5733e5SMarc-André Lureaurbd = not_found
1099fabd1e93SPaolo Bonziniif not get_option('rbd').auto() or have_block
1100063d5119SPaolo Bonzini  librados = cc.find_library('rados', required: get_option('rbd'))
1101fabd1e93SPaolo Bonzini  librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
1102063d5119SPaolo Bonzini                           required: get_option('rbd'))
1103c518d6c2SPaolo Bonzini  if librados.found() and librbd.found()
1104c518d6c2SPaolo Bonzini    if cc.links('''
1105fabd1e93SPaolo Bonzini      #include <stdio.h>
1106fabd1e93SPaolo Bonzini      #include <rbd/librbd.h>
1107fabd1e93SPaolo Bonzini      int main(void) {
1108fabd1e93SPaolo Bonzini        rados_t cluster;
1109fabd1e93SPaolo Bonzini        rados_create(&cluster, NULL);
111048672ac0SPeter Lieven        #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
111148672ac0SPeter Lieven        #error
111248672ac0SPeter Lieven        #endif
1113fabd1e93SPaolo Bonzini        return 0;
1114fabd1e93SPaolo Bonzini      }''', dependencies: [librbd, librados])
1115fabd1e93SPaolo Bonzini      rbd = declare_dependency(dependencies: [librbd, librados])
1116c518d6c2SPaolo Bonzini    elif get_option('rbd').enabled()
111748672ac0SPeter Lieven      error('librbd >= 1.12.0 required')
1118c518d6c2SPaolo Bonzini    else
111948672ac0SPeter Lieven      warning('librbd >= 1.12.0 not found, disabling')
1120c518d6c2SPaolo Bonzini    endif
11215e5733e5SMarc-André Lureau  endif
1122fabd1e93SPaolo Bonziniendif
1123fabd1e93SPaolo Bonzini
11245e5733e5SMarc-André Lureauglusterfs = not_found
112508821ca2SPaolo Bonziniglusterfs_ftruncate_has_stat = false
112608821ca2SPaolo Bonziniglusterfs_iocb_has_stat = false
112708821ca2SPaolo Bonziniif not get_option('glusterfs').auto() or have_block
112808821ca2SPaolo Bonzini  glusterfs = dependency('glusterfs-api', version: '>=3',
112908821ca2SPaolo Bonzini                         required: get_option('glusterfs'),
1130063d5119SPaolo Bonzini                         method: 'pkg-config')
113108821ca2SPaolo Bonzini  if glusterfs.found()
113208821ca2SPaolo Bonzini    glusterfs_ftruncate_has_stat = cc.links('''
113308821ca2SPaolo Bonzini      #include <glusterfs/api/glfs.h>
113408821ca2SPaolo Bonzini
113508821ca2SPaolo Bonzini      int
113608821ca2SPaolo Bonzini      main(void)
113708821ca2SPaolo Bonzini      {
113808821ca2SPaolo Bonzini          /* new glfs_ftruncate() passes two additional args */
113908821ca2SPaolo Bonzini          return glfs_ftruncate(NULL, 0, NULL, NULL);
114008821ca2SPaolo Bonzini      }
114108821ca2SPaolo Bonzini    ''', dependencies: glusterfs)
114208821ca2SPaolo Bonzini    glusterfs_iocb_has_stat = cc.links('''
114308821ca2SPaolo Bonzini      #include <glusterfs/api/glfs.h>
114408821ca2SPaolo Bonzini
114508821ca2SPaolo Bonzini      /* new glfs_io_cbk() passes two additional glfs_stat structs */
114608821ca2SPaolo Bonzini      static void
114708821ca2SPaolo Bonzini      glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
114808821ca2SPaolo Bonzini      {}
114908821ca2SPaolo Bonzini
115008821ca2SPaolo Bonzini      int
115108821ca2SPaolo Bonzini      main(void)
115208821ca2SPaolo Bonzini      {
115308821ca2SPaolo Bonzini          glfs_io_cbk iocb = &glusterfs_iocb;
115408821ca2SPaolo Bonzini          iocb(NULL, 0 , NULL, NULL, NULL);
115508821ca2SPaolo Bonzini          return 0;
115608821ca2SPaolo Bonzini      }
115708821ca2SPaolo Bonzini    ''', dependencies: glusterfs)
115808821ca2SPaolo Bonzini  endif
11595e5733e5SMarc-André Lureauendif
1160e6a52b36SThomas Huth
11615e5733e5SMarc-André Lureaulibssh = not_found
1162e6a52b36SThomas Huthif not get_option('libssh').auto() or have_block
1163e6a52b36SThomas Huth  libssh = dependency('libssh', version: '>=0.8.7',
1164e6a52b36SThomas Huth                    method: 'pkg-config',
1165063d5119SPaolo Bonzini                    required: get_option('libssh'))
11665e5733e5SMarc-André Lureauendif
1167e6a52b36SThomas Huth
11685e5733e5SMarc-André Lureaulibbzip2 = not_found
116929ba6116SPaolo Bonziniif not get_option('bzip2').auto() or have_block
117029ba6116SPaolo Bonzini  libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
1171063d5119SPaolo Bonzini                             required: get_option('bzip2'))
117229ba6116SPaolo Bonzini  if libbzip2.found() and not cc.links('''
117329ba6116SPaolo Bonzini     #include <bzlib.h>
117429ba6116SPaolo Bonzini     int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
117529ba6116SPaolo Bonzini    libbzip2 = not_found
117629ba6116SPaolo Bonzini    if get_option('bzip2').enabled()
117729ba6116SPaolo Bonzini      error('could not link libbzip2')
117829ba6116SPaolo Bonzini    else
117929ba6116SPaolo Bonzini      warning('could not link libbzip2, disabling')
11805e5733e5SMarc-André Lureau    endif
118129ba6116SPaolo Bonzini  endif
11825e5733e5SMarc-André Lureauendif
1183ecea3696SPaolo Bonzini
11845e5733e5SMarc-André Lureauliblzfse = not_found
1185ecea3696SPaolo Bonziniif not get_option('lzfse').auto() or have_block
1186ecea3696SPaolo Bonzini  liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
1187063d5119SPaolo Bonzini                             required: get_option('lzfse'))
11885e5733e5SMarc-André Lureauendif
1189ecea3696SPaolo Bonziniif liblzfse.found() and not cc.links('''
1190ecea3696SPaolo Bonzini   #include <lzfse.h>
1191ecea3696SPaolo Bonzini   int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
1192ecea3696SPaolo Bonzini  liblzfse = not_found
1193ecea3696SPaolo Bonzini  if get_option('lzfse').enabled()
1194ecea3696SPaolo Bonzini    error('could not link liblzfse')
1195ecea3696SPaolo Bonzini  else
1196ecea3696SPaolo Bonzini    warning('could not link liblzfse, disabling')
1197ecea3696SPaolo Bonzini  endif
1198ecea3696SPaolo Bonziniendif
1199ecea3696SPaolo Bonzini
1200478e943fSPaolo Bonzinioss = not_found
120143a363aeSPaolo Bonziniif get_option('oss').allowed() and have_system
120287430d5bSPaolo Bonzini  if not cc.has_header('sys/soundcard.h')
120387430d5bSPaolo Bonzini    # not found
120487430d5bSPaolo Bonzini  elif targetos == 'netbsd'
1205063d5119SPaolo Bonzini    oss = cc.find_library('ossaudio', required: get_option('oss'))
120687430d5bSPaolo Bonzini  else
120787430d5bSPaolo Bonzini    oss = declare_dependency()
120887430d5bSPaolo Bonzini  endif
120987430d5bSPaolo Bonzini
121087430d5bSPaolo Bonzini  if not oss.found()
121187430d5bSPaolo Bonzini    if get_option('oss').enabled()
121287430d5bSPaolo Bonzini      error('OSS not found')
121387430d5bSPaolo Bonzini    endif
121487430d5bSPaolo Bonzini  endif
1215478e943fSPaolo Bonziniendif
1216478e943fSPaolo Bonzinidsound = not_found
121787430d5bSPaolo Bonziniif not get_option('dsound').auto() or (targetos == 'windows' and have_system)
121887430d5bSPaolo Bonzini  if cc.has_header('dsound.h')
121987430d5bSPaolo Bonzini    dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
1220478e943fSPaolo Bonzini  endif
122187430d5bSPaolo Bonzini
122287430d5bSPaolo Bonzini  if not dsound.found()
122387430d5bSPaolo Bonzini    if get_option('dsound').enabled()
122487430d5bSPaolo Bonzini      error('DirectSound not found')
122587430d5bSPaolo Bonzini    endif
122687430d5bSPaolo Bonzini  endif
122787430d5bSPaolo Bonziniendif
122887430d5bSPaolo Bonzini
1229478e943fSPaolo Bonzinicoreaudio = not_found
123087430d5bSPaolo Bonziniif not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system)
123187430d5bSPaolo Bonzini  coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
123287430d5bSPaolo Bonzini                         required: get_option('coreaudio'))
1233478e943fSPaolo Bonziniendif
12348bc5184dSThomas Huth
12352b1ccdf4SMarc-André Lureauopengl = not_found
123688b6e618SPaolo Bonziniif not get_option('opengl').auto() or have_system or have_vhost_user_gpu
123788b6e618SPaolo Bonzini  epoxy = dependency('epoxy', method: 'pkg-config',
1238063d5119SPaolo Bonzini                      required: get_option('opengl'))
123988b6e618SPaolo Bonzini  if cc.has_header('epoxy/egl.h', dependencies: epoxy)
124088b6e618SPaolo Bonzini    opengl = epoxy
124188b6e618SPaolo Bonzini  elif get_option('opengl').enabled()
124288b6e618SPaolo Bonzini    error('epoxy/egl.h not found')
124388b6e618SPaolo Bonzini  endif
12442b1ccdf4SMarc-André Lureauendif
12458bc5184dSThomas Huthgbm = not_found
12468bc5184dSThomas Huthif (have_system or have_tools) and (virgl.found() or opengl.found())
1247063d5119SPaolo Bonzini  gbm = dependency('gbm', method: 'pkg-config', required: false)
12488bc5184dSThomas Huthendif
1249f0caba44SMarc-André Lureauhave_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found()
12501b695471SPaolo Bonzini
125157612511SPaolo Bonzinignutls = not_found
1252cc4c7c73SDaniel P. Berrangégnutls_crypto = not_found
1253abc14fd0SAlyssa Rossif get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
1254cc4c7c73SDaniel P. Berrangé  # For general TLS support our min gnutls matches
1255cc4c7c73SDaniel P. Berrangé  # that implied by our platform support matrix
1256cc4c7c73SDaniel P. Berrangé  #
1257cc4c7c73SDaniel P. Berrangé  # For the crypto backends, we look for a newer
1258cc4c7c73SDaniel P. Berrangé  # gnutls:
1259cc4c7c73SDaniel P. Berrangé  #
1260cc4c7c73SDaniel P. Berrangé  #   Version 3.6.8  is needed to get XTS
1261cc4c7c73SDaniel P. Berrangé  #   Version 3.6.13 is needed to get PBKDF
1262cc4c7c73SDaniel P. Berrangé  #   Version 3.6.14 is needed to get HW accelerated XTS
1263cc4c7c73SDaniel P. Berrangé  #
1264cc4c7c73SDaniel P. Berrangé  # If newer enough gnutls isn't available, we can
1265cc4c7c73SDaniel P. Berrangé  # still use a different crypto backend to satisfy
1266cc4c7c73SDaniel P. Berrangé  # the platform support requirements
1267cc4c7c73SDaniel P. Berrangé  gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
1268cc4c7c73SDaniel P. Berrangé                             method: 'pkg-config',
1269063d5119SPaolo Bonzini                             required: false)
1270cc4c7c73SDaniel P. Berrangé  if gnutls_crypto.found()
1271cc4c7c73SDaniel P. Berrangé    gnutls = gnutls_crypto
1272cc4c7c73SDaniel P. Berrangé  else
1273cc4c7c73SDaniel P. Berrangé    # Our min version if all we need is TLS
127457612511SPaolo Bonzini    gnutls = dependency('gnutls', version: '>=3.5.18',
127557612511SPaolo Bonzini                        method: 'pkg-config',
1276063d5119SPaolo Bonzini                        required: get_option('gnutls'))
127757612511SPaolo Bonzini  endif
1278cc4c7c73SDaniel P. Berrangéendif
127957612511SPaolo Bonzini
12808bd0931fSDaniel P. Berrangé# We prefer use of gnutls for crypto, unless the options
12818bd0931fSDaniel P. Berrangé# explicitly asked for nettle or gcrypt.
12828bd0931fSDaniel P. Berrangé#
12838bd0931fSDaniel P. Berrangé# If gnutls isn't available for crypto, then we'll prefer
12848bd0931fSDaniel P. Berrangé# gcrypt over nettle for performance reasons.
128557612511SPaolo Bonzinigcrypt = not_found
128657612511SPaolo Bonzininettle = not_found
12874c5e512eSLei Hehogweed = not_found
128868014044SDaniel P. Berrangéxts = 'none'
12898bd0931fSDaniel P. Berrangé
129057612511SPaolo Bonziniif get_option('nettle').enabled() and get_option('gcrypt').enabled()
129157612511SPaolo Bonzini  error('Only one of gcrypt & nettle can be enabled')
129257612511SPaolo Bonziniendif
12938bd0931fSDaniel P. Berrangé
12948bd0931fSDaniel P. Berrangé# Explicit nettle/gcrypt request, so ignore gnutls for crypto
12958bd0931fSDaniel P. Berrangéif get_option('nettle').enabled() or get_option('gcrypt').enabled()
12968bd0931fSDaniel P. Berrangé  gnutls_crypto = not_found
129757612511SPaolo Bonziniendif
12988bd0931fSDaniel P. Berrangé
12998bd0931fSDaniel P. Berrangéif not gnutls_crypto.found()
13008bd0931fSDaniel P. Berrangé  if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
13011741093bSDaniel P. Berrangé    gcrypt = dependency('libgcrypt', version: '>=1.8',
130257612511SPaolo Bonzini                        method: 'config-tool',
1303063d5119SPaolo Bonzini                        required: get_option('gcrypt'))
130457612511SPaolo Bonzini    # Debian has removed -lgpg-error from libgcrypt-config
130557612511SPaolo Bonzini    # as it "spreads unnecessary dependencies" which in
130657612511SPaolo Bonzini    # turn breaks static builds...
1307a0cbd2e8SPaolo Bonzini    if gcrypt.found() and get_option('prefer_static')
1308bd3615d6SPaolo Bonzini      gcrypt = declare_dependency(dependencies:
1309bd3615d6SPaolo Bonzini        [gcrypt,
1310bd3615d6SPaolo Bonzini         cc.find_library('gpg-error', required: true)],
1311bd3615d6SPaolo Bonzini        version: gcrypt.version())
131257612511SPaolo Bonzini    endif
131357612511SPaolo Bonzini  endif
1314260a13d4SDaniel P. Berrangé  if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1315260a13d4SDaniel P. Berrangé    nettle = dependency('nettle', version: '>=3.4',
1316260a13d4SDaniel P. Berrangé                        method: 'pkg-config',
1317063d5119SPaolo Bonzini                        required: get_option('nettle'))
1318260a13d4SDaniel P. Berrangé    if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1319260a13d4SDaniel P. Berrangé      xts = 'private'
1320260a13d4SDaniel P. Berrangé    endif
1321260a13d4SDaniel P. Berrangé  endif
1322cc4c7c73SDaniel P. Berrangéendif
132357612511SPaolo Bonzini
1324063d5119SPaolo Bonzinigmp = dependency('gmp', required: false, method: 'pkg-config')
13254c5e512eSLei Heif nettle.found() and gmp.found()
13264c5e512eSLei He  hogweed = dependency('hogweed', version: '>=3.4',
13274c5e512eSLei He                       method: 'pkg-config',
1328063d5119SPaolo Bonzini                       required: get_option('nettle'))
13294c5e512eSLei Heendif
13304c5e512eSLei He
13314c5e512eSLei He
13322b1ccdf4SMarc-André Lureaugtk = not_found
13331b695471SPaolo Bonzinigtkx11 = not_found
1334c23d7b4eSPaolo Bonzinivte = not_found
133529e0bfffSClaudio Fontanahave_gtk_clipboard = get_option('gtk_clipboard').enabled()
133629e0bfffSClaudio Fontana
133764d3fec7SAkihiko Odakiif not get_option('gtk').auto() or have_system
13381b695471SPaolo Bonzini  gtk = dependency('gtk+-3.0', version: '>=3.22.0',
13391b695471SPaolo Bonzini                   method: 'pkg-config',
1340063d5119SPaolo Bonzini                   required: get_option('gtk'))
13411b695471SPaolo Bonzini  if gtk.found()
13421b695471SPaolo Bonzini    gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
13431b695471SPaolo Bonzini                        method: 'pkg-config',
1344063d5119SPaolo Bonzini                        required: false)
1345bd3615d6SPaolo Bonzini    gtk = declare_dependency(dependencies: [gtk, gtkx11],
1346bd3615d6SPaolo Bonzini                             version: gtk.version())
1347c23d7b4eSPaolo Bonzini
1348c23d7b4eSPaolo Bonzini    if not get_option('vte').auto() or have_system
1349c23d7b4eSPaolo Bonzini      vte = dependency('vte-2.91',
1350c23d7b4eSPaolo Bonzini                       method: 'pkg-config',
1351063d5119SPaolo Bonzini                       required: get_option('vte'))
1352c23d7b4eSPaolo Bonzini    endif
135329e0bfffSClaudio Fontana  elif have_gtk_clipboard
135429e0bfffSClaudio Fontana    error('GTK clipboard requested, but GTK not found')
13552b1ccdf4SMarc-André Lureau  endif
13561b695471SPaolo Bonziniendif
13571b695471SPaolo Bonzini
13582b1ccdf4SMarc-André Lureaux11 = not_found
13599d49bcf6SMarkus Armbrusterif gtkx11.found()
1360063d5119SPaolo Bonzini  x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found())
13612b1ccdf4SMarc-André Lureauendif
13622b1ccdf4SMarc-André Lureaupng = not_found
136395f8510eSKshitij Suriif get_option('png').allowed() and have_system
13641ec8c2c0SThomas Huth   png = dependency('libpng', version: '>=1.6.34', required: get_option('png'),
1365063d5119SPaolo Bonzini                    method: 'pkg-config')
136695f8510eSKshitij Suriendif
136795f8510eSKshitij Surivnc = not_found
13682b1ccdf4SMarc-André Lureaujpeg = not_found
13692b1ccdf4SMarc-André Lureausasl = not_found
137043a363aeSPaolo Bonziniif get_option('vnc').allowed() and have_system
1371a0b93237SPaolo Bonzini  vnc = declare_dependency() # dummy dependency
13728e242b3cSPaolo Bonzini  jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
1373063d5119SPaolo Bonzini                    method: 'pkg-config')
1374a0b93237SPaolo Bonzini  sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
1375063d5119SPaolo Bonzini                         required: get_option('vnc_sasl'))
1376a0b93237SPaolo Bonzini  if sasl.found()
1377a0b93237SPaolo Bonzini    sasl = declare_dependency(dependencies: sasl,
1378a0b93237SPaolo Bonzini                              compile_args: '-DSTRUCT_IOVEC_DEFINED')
1379a0b93237SPaolo Bonzini  endif
13802b1ccdf4SMarc-André Lureauendif
1381241611eaSPaolo Bonzini
138205e391aeSPaolo Bonzinipam = not_found
138305e391aeSPaolo Bonziniif not get_option('auth_pam').auto() or have_system
138405e391aeSPaolo Bonzini  pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
1385063d5119SPaolo Bonzini                        required: get_option('auth_pam'))
138605e391aeSPaolo Bonziniendif
138705e391aeSPaolo Bonziniif pam.found() and not cc.links('''
138805e391aeSPaolo Bonzini   #include <stddef.h>
138905e391aeSPaolo Bonzini   #include <security/pam_appl.h>
139005e391aeSPaolo Bonzini   int main(void) {
139105e391aeSPaolo Bonzini     const char *service_name = "qemu";
139205e391aeSPaolo Bonzini     const char *user = "frank";
139305e391aeSPaolo Bonzini     const struct pam_conv pam_conv = { 0 };
139405e391aeSPaolo Bonzini     pam_handle_t *pamh = NULL;
139505e391aeSPaolo Bonzini     pam_start(service_name, user, &pam_conv, &pamh);
139605e391aeSPaolo Bonzini     return 0;
139705e391aeSPaolo Bonzini   }''', dependencies: pam)
139805e391aeSPaolo Bonzini  pam = not_found
139905e391aeSPaolo Bonzini  if get_option('auth_pam').enabled()
140005e391aeSPaolo Bonzini    error('could not link libpam')
140105e391aeSPaolo Bonzini  else
140205e391aeSPaolo Bonzini    warning('could not link libpam, disabling')
140305e391aeSPaolo Bonzini  endif
140405e391aeSPaolo Bonziniendif
140505e391aeSPaolo Bonzini
1406708eab42SMarc-André Lureausnappy = not_found
1407241611eaSPaolo Bonziniif not get_option('snappy').auto() or have_system
1408241611eaSPaolo Bonzini  snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
1409063d5119SPaolo Bonzini                           required: get_option('snappy'))
1410708eab42SMarc-André Lureauendif
1411565174d0SPaolo Bonziniif snappy.found() and not linker.links('''
1412241611eaSPaolo Bonzini   #include <snappy-c.h>
1413241611eaSPaolo Bonzini   int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
1414241611eaSPaolo Bonzini  snappy = not_found
1415241611eaSPaolo Bonzini  if get_option('snappy').enabled()
1416241611eaSPaolo Bonzini    error('could not link libsnappy')
1417241611eaSPaolo Bonzini  else
1418241611eaSPaolo Bonzini    warning('could not link libsnappy, disabling')
1419241611eaSPaolo Bonzini  endif
1420708eab42SMarc-André Lureauendif
14210c32a0aeSPaolo Bonzini
1422708eab42SMarc-André Lureaulzo = not_found
14230c32a0aeSPaolo Bonziniif not get_option('lzo').auto() or have_system
14240c32a0aeSPaolo Bonzini  lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
1425063d5119SPaolo Bonzini                        required: get_option('lzo'))
1426708eab42SMarc-André Lureauendif
14270c32a0aeSPaolo Bonziniif lzo.found() and not cc.links('''
14280c32a0aeSPaolo Bonzini   #include <lzo/lzo1x.h>
14290c32a0aeSPaolo Bonzini   int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
14300c32a0aeSPaolo Bonzini  lzo = not_found
14310c32a0aeSPaolo Bonzini  if get_option('lzo').enabled()
14320c32a0aeSPaolo Bonzini    error('could not link liblzo2')
14330c32a0aeSPaolo Bonzini  else
14340c32a0aeSPaolo Bonzini    warning('could not link liblzo2, disabling')
14350c32a0aeSPaolo Bonzini  endif
14360c32a0aeSPaolo Bonziniendif
14370c32a0aeSPaolo Bonzini
1438488a8c73SPaolo Bonzininuma = not_found
1439488a8c73SPaolo Bonziniif not get_option('numa').auto() or have_system or have_tools
1440488a8c73SPaolo Bonzini  numa = cc.find_library('numa', has_headers: ['numa.h'],
1441063d5119SPaolo Bonzini                              required: get_option('numa'))
1442488a8c73SPaolo Bonziniendif
1443488a8c73SPaolo Bonziniif numa.found() and not cc.links('''
1444488a8c73SPaolo Bonzini   #include <numa.h>
1445488a8c73SPaolo Bonzini   int main(void) { return numa_available(); }
1446488a8c73SPaolo Bonzini   ''', dependencies: numa)
1447488a8c73SPaolo Bonzini  numa = not_found
1448488a8c73SPaolo Bonzini  if get_option('numa').enabled()
1449488a8c73SPaolo Bonzini    error('could not link numa')
1450488a8c73SPaolo Bonzini  else
1451488a8c73SPaolo Bonzini    warning('could not link numa, disabling')
1452488a8c73SPaolo Bonzini  endif
1453488a8c73SPaolo Bonziniendif
1454488a8c73SPaolo Bonzini
145555166230SMarc-André Lureaurdma = not_found
14563730a734SPaolo Bonziniif not get_option('rdma').auto() or have_system
14573730a734SPaolo Bonzini  libumad = cc.find_library('ibumad', required: get_option('rdma'))
14583730a734SPaolo Bonzini  rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'],
1459063d5119SPaolo Bonzini                               required: get_option('rdma')),
1460063d5119SPaolo Bonzini               cc.find_library('ibverbs', required: get_option('rdma')),
14613730a734SPaolo Bonzini               libumad]
14623730a734SPaolo Bonzini  rdma = declare_dependency(dependencies: rdma_libs)
14633730a734SPaolo Bonzini  foreach lib: rdma_libs
14643730a734SPaolo Bonzini    if not lib.found()
14653730a734SPaolo Bonzini      rdma = not_found
146655166230SMarc-André Lureau    endif
14673730a734SPaolo Bonzini  endforeach
14683730a734SPaolo Bonziniendif
14693730a734SPaolo Bonzini
1470582ea95fSMarc-André Lureauxen = not_found
147114efd8d3SPaolo Bonziniif get_option('xen').enabled() or (get_option('xen').auto() and have_system)
147214efd8d3SPaolo Bonzini  xencontrol = dependency('xencontrol', required: false,
1473063d5119SPaolo Bonzini                          method: 'pkg-config')
147414efd8d3SPaolo Bonzini  if xencontrol.found()
147514efd8d3SPaolo Bonzini    xen_pc = declare_dependency(version: xencontrol.version(),
147614efd8d3SPaolo Bonzini      dependencies: [
147714efd8d3SPaolo Bonzini        xencontrol,
147814efd8d3SPaolo Bonzini        # disabler: true makes xen_pc.found() return false if any is not found
147914efd8d3SPaolo Bonzini        dependency('xenstore', required: false,
1480063d5119SPaolo Bonzini                   method: 'pkg-config',
148114efd8d3SPaolo Bonzini                   disabler: true),
148214efd8d3SPaolo Bonzini        dependency('xenforeignmemory', required: false,
1483063d5119SPaolo Bonzini                   method: 'pkg-config',
148414efd8d3SPaolo Bonzini                   disabler: true),
148514efd8d3SPaolo Bonzini        dependency('xengnttab', required: false,
1486063d5119SPaolo Bonzini                   method: 'pkg-config',
148714efd8d3SPaolo Bonzini                   disabler: true),
148814efd8d3SPaolo Bonzini        dependency('xenevtchn', required: false,
1489063d5119SPaolo Bonzini                   method: 'pkg-config',
149014efd8d3SPaolo Bonzini                   disabler: true),
149114efd8d3SPaolo Bonzini        dependency('xendevicemodel', required: false,
1492063d5119SPaolo Bonzini                   method: 'pkg-config',
149314efd8d3SPaolo Bonzini                   disabler: true),
149414efd8d3SPaolo Bonzini        # optional, no "disabler: true"
149514efd8d3SPaolo Bonzini        dependency('xentoolcore', required: false,
1496063d5119SPaolo Bonzini                   method: 'pkg-config')])
149714efd8d3SPaolo Bonzini    if xen_pc.found()
149814efd8d3SPaolo Bonzini      xen = xen_pc
1499582ea95fSMarc-André Lureau    endif
150014efd8d3SPaolo Bonzini  endif
150114efd8d3SPaolo Bonzini  if not xen.found()
150214efd8d3SPaolo Bonzini    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' ]
150314efd8d3SPaolo Bonzini    xen_libs = {
150414efd8d3SPaolo Bonzini      '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
150514efd8d3SPaolo Bonzini      '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
150614efd8d3SPaolo Bonzini      '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
150714efd8d3SPaolo Bonzini      '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
150814efd8d3SPaolo Bonzini      '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
150914efd8d3SPaolo Bonzini      '4.6.0': [ 'xenstore', 'xenctrl' ],
151014efd8d3SPaolo Bonzini      '4.5.0': [ 'xenstore', 'xenctrl' ],
151114efd8d3SPaolo Bonzini      '4.2.0': [ 'xenstore', 'xenctrl' ],
151214efd8d3SPaolo Bonzini    }
151314efd8d3SPaolo Bonzini    xen_deps = {}
151414efd8d3SPaolo Bonzini    foreach ver: xen_tests
151514efd8d3SPaolo Bonzini      # cache the various library tests to avoid polluting the logs
151614efd8d3SPaolo Bonzini      xen_test_deps = []
151714efd8d3SPaolo Bonzini      foreach l: xen_libs[ver]
151814efd8d3SPaolo Bonzini        if l not in xen_deps
151914efd8d3SPaolo Bonzini          xen_deps += { l: cc.find_library(l, required: false) }
152014efd8d3SPaolo Bonzini        endif
152114efd8d3SPaolo Bonzini        xen_test_deps += xen_deps[l]
152214efd8d3SPaolo Bonzini      endforeach
152314efd8d3SPaolo Bonzini
152414efd8d3SPaolo Bonzini      # Use -D to pick just one of the test programs in scripts/xen-detect.c
152514efd8d3SPaolo Bonzini      xen_version = ver.split('.')
152614efd8d3SPaolo Bonzini      xen_ctrl_version = xen_version[0] + \
152714efd8d3SPaolo Bonzini        ('0' + xen_version[1]).substring(-2) + \
152814efd8d3SPaolo Bonzini        ('0' + xen_version[2]).substring(-2)
152914efd8d3SPaolo Bonzini      if cc.links(files('scripts/xen-detect.c'),
153014efd8d3SPaolo Bonzini                  args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version,
153114efd8d3SPaolo Bonzini                  dependencies: xen_test_deps)
153214efd8d3SPaolo Bonzini        xen = declare_dependency(version: ver, dependencies: xen_test_deps)
153314efd8d3SPaolo Bonzini        break
153414efd8d3SPaolo Bonzini      endif
153514efd8d3SPaolo Bonzini    endforeach
153614efd8d3SPaolo Bonzini  endif
153714efd8d3SPaolo Bonzini  if xen.found()
153814efd8d3SPaolo Bonzini    accelerators += 'CONFIG_XEN'
153914efd8d3SPaolo Bonzini  elif get_option('xen').enabled()
154014efd8d3SPaolo Bonzini    error('could not compile and link Xen test program')
154114efd8d3SPaolo Bonzini  endif
154214efd8d3SPaolo Bonziniendif
154314efd8d3SPaolo Bonzinihave_xen_pci_passthrough = get_option('xen_pci_passthrough') \
154414efd8d3SPaolo Bonzini  .require(xen.found(),
154514efd8d3SPaolo Bonzini           error_message: 'Xen PCI passthrough requested but Xen not enabled') \
154614efd8d3SPaolo Bonzini  .require(targetos == 'linux',
154714efd8d3SPaolo Bonzini           error_message: 'Xen PCI passthrough not available on this platform') \
154814efd8d3SPaolo Bonzini  .allowed()
154914efd8d3SPaolo Bonzini
155014efd8d3SPaolo Bonzini
155106677ce1SPaolo Bonzinicacard = not_found
15525f364c57SPaolo Bonziniif not get_option('smartcard').auto() or have_system
15535f364c57SPaolo Bonzini  cacard = dependency('libcacard', required: get_option('smartcard'),
1554063d5119SPaolo Bonzini                      version: '>=2.5.1', method: 'pkg-config')
155506677ce1SPaolo Bonziniendif
15560a40bcb7SCésar Belleyu2f = not_found
15570a40bcb7SCésar Belleyif have_system
15580a40bcb7SCésar Belley  u2f = dependency('u2f-emu', required: get_option('u2f'),
1559063d5119SPaolo Bonzini                   method: 'pkg-config')
15600a40bcb7SCésar Belleyendif
15618caef850SHongren (Zenithal) Zhengcanokey = not_found
15628caef850SHongren (Zenithal) Zhengif have_system
15638caef850SHongren (Zenithal) Zheng  canokey = dependency('canokey-qemu', required: get_option('canokey'),
1564063d5119SPaolo Bonzini                   method: 'pkg-config')
15658caef850SHongren (Zenithal) Zhengendif
156606677ce1SPaolo Bonziniusbredir = not_found
156718f31e60SPaolo Bonziniif not get_option('usb_redir').auto() or have_system
156818f31e60SPaolo Bonzini  usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
1569063d5119SPaolo Bonzini                        version: '>=0.6', method: 'pkg-config')
157006677ce1SPaolo Bonziniendif
157106677ce1SPaolo Bonzinilibusb = not_found
157290540f32SPaolo Bonziniif not get_option('libusb').auto() or have_system
157390540f32SPaolo Bonzini  libusb = dependency('libusb-1.0', required: get_option('libusb'),
1574063d5119SPaolo Bonzini                      version: '>=1.0.13', method: 'pkg-config')
157506677ce1SPaolo Bonziniendif
157690540f32SPaolo Bonzini
1577c9322ab5SMarc-André Lureaulibpmem = not_found
1578e36e8c70SPaolo Bonziniif not get_option('libpmem').auto() or have_system
1579e36e8c70SPaolo Bonzini  libpmem = dependency('libpmem', required: get_option('libpmem'),
1580063d5119SPaolo Bonzini                       method: 'pkg-config')
1581c9322ab5SMarc-André Lureauendif
1582c7c91a74SBruce Rogerslibdaxctl = not_found
158383ef1682SPaolo Bonziniif not get_option('libdaxctl').auto() or have_system
158483ef1682SPaolo Bonzini  libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
1585063d5119SPaolo Bonzini                         version: '>=57', method: 'pkg-config')
1586c7c91a74SBruce Rogersendif
15878ce0a45fSMarc-André Lureautasn1 = not_found
1588ba7ed407SPaolo Bonziniif gnutls.found()
1589ba7ed407SPaolo Bonzini  tasn1 = dependency('libtasn1',
1590063d5119SPaolo Bonzini                     method: 'pkg-config')
15918ce0a45fSMarc-André Lureauendif
1592af04e89dSMarc-André Lureaukeyutils = dependency('libkeyutils', required: false,
1593063d5119SPaolo Bonzini                      method: 'pkg-config')
1594a81df1b6SPaolo Bonzini
15953909def8SMarc-André Lureauhas_gettid = cc.has_function('gettid')
15963909def8SMarc-André Lureau
15973d212b41SRichard W.M. Jones# libselinux
15983d212b41SRichard W.M. Jonesselinux = dependency('libselinux',
15993d212b41SRichard W.M. Jones                     required: get_option('selinux'),
1600063d5119SPaolo Bonzini                     method: 'pkg-config')
16013d212b41SRichard W.M. Jones
1602aa087962SPaolo Bonzini# Malloc tests
1603aa087962SPaolo Bonzini
1604aa087962SPaolo Bonzinimalloc = []
1605aa087962SPaolo Bonziniif get_option('malloc') == 'system'
1606aa087962SPaolo Bonzini  has_malloc_trim = \
160743a363aeSPaolo Bonzini    get_option('malloc_trim').allowed() and \
1608aa087962SPaolo Bonzini    cc.links('''#include <malloc.h>
1609aa087962SPaolo Bonzini                int main(void) { malloc_trim(0); return 0; }''')
1610aa087962SPaolo Bonzinielse
1611aa087962SPaolo Bonzini  has_malloc_trim = false
1612aa087962SPaolo Bonzini  malloc = cc.find_library(get_option('malloc'), required: true)
1613aa087962SPaolo Bonziniendif
1614aa087962SPaolo Bonziniif not has_malloc_trim and get_option('malloc_trim').enabled()
1615aa087962SPaolo Bonzini  if get_option('malloc') == 'system'
1616aa087962SPaolo Bonzini    error('malloc_trim not available on this platform.')
1617aa087962SPaolo Bonzini  else
1618aa087962SPaolo Bonzini    error('malloc_trim not available with non-libc memory allocator')
1619aa087962SPaolo Bonzini  endif
1620aa087962SPaolo Bonziniendif
1621aa087962SPaolo Bonzini
162284e319a5SMax Reitz# Check whether the glibc provides statx()
162384e319a5SMax Reitz
1624e66420acSPaolo Bonzinignu_source_prefix = '''
162584e319a5SMax Reitz  #ifndef _GNU_SOURCE
162684e319a5SMax Reitz  #define _GNU_SOURCE
162784e319a5SMax Reitz  #endif
1628e66420acSPaolo Bonzini'''
1629e66420acSPaolo Bonzinistatx_test = gnu_source_prefix + '''
163084e319a5SMax Reitz  #include <sys/stat.h>
163184e319a5SMax Reitz  int main(void) {
163284e319a5SMax Reitz    struct statx statxbuf;
163384e319a5SMax Reitz    statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
163484e319a5SMax Reitz    return 0;
163584e319a5SMax Reitz  }'''
163684e319a5SMax Reitz
163784e319a5SMax Reitzhas_statx = cc.links(statx_test)
163884e319a5SMax Reitz
16394ce7a08dSHanna Reitz# Check whether statx() provides mount ID information
16404ce7a08dSHanna Reitz
16414ce7a08dSHanna Reitzstatx_mnt_id_test = gnu_source_prefix + '''
16424ce7a08dSHanna Reitz  #include <sys/stat.h>
16434ce7a08dSHanna Reitz  int main(void) {
16444ce7a08dSHanna Reitz    struct statx statxbuf;
16454ce7a08dSHanna Reitz    statx(0, "", 0, STATX_BASIC_STATS | STATX_MNT_ID, &statxbuf);
16464ce7a08dSHanna Reitz    return statxbuf.stx_mnt_id;
16474ce7a08dSHanna Reitz  }'''
16484ce7a08dSHanna Reitz
16494ce7a08dSHanna Reitzhas_statx_mnt_id = cc.links(statx_mnt_id_test)
16504ce7a08dSHanna Reitz
1651a436d6d4SPaolo Bonzinihave_vhost_user_blk_server = get_option('vhost_user_blk_server') \
1652a436d6d4SPaolo Bonzini  .require(targetos == 'linux',
1653a436d6d4SPaolo Bonzini           error_message: 'vhost_user_blk_server requires linux') \
16542a3129a3SPaolo Bonzini  .require(have_vhost_user,
1655a436d6d4SPaolo Bonzini           error_message: 'vhost_user_blk_server requires vhost-user support') \
165626ed501bSAlex Bennée  .disable_auto_if(not have_tools and not have_system) \
1657a436d6d4SPaolo Bonzini  .allowed()
16589e62ba48SDaniele Buono
1659df4ea709SMax Reitzif get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
1660df4ea709SMax Reitz  error('Cannot enable fuse-lseek while fuse is disabled')
1661df4ea709SMax Reitzendif
1662df4ea709SMax Reitz
1663a484a719SMax Reitzfuse = dependency('fuse3', required: get_option('fuse'),
1664063d5119SPaolo Bonzini                  version: '>=3.1', method: 'pkg-config')
1665a484a719SMax Reitz
1666df4ea709SMax Reitzfuse_lseek = not_found
166743a363aeSPaolo Bonziniif get_option('fuse_lseek').allowed()
1668df4ea709SMax Reitz  if fuse.version().version_compare('>=3.8')
1669df4ea709SMax Reitz    # Dummy dependency
1670df4ea709SMax Reitz    fuse_lseek = declare_dependency()
1671df4ea709SMax Reitz  elif get_option('fuse_lseek').enabled()
1672df4ea709SMax Reitz    if fuse.found()
1673df4ea709SMax Reitz      error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1674df4ea709SMax Reitz    else
1675df4ea709SMax Reitz      error('fuse-lseek requires libfuse, which was not found')
1676df4ea709SMax Reitz    endif
1677df4ea709SMax Reitz  endif
1678df4ea709SMax Reitzendif
1679df4ea709SMax Reitz
1680a6caeee8SXie Yongjihave_libvduse = (targetos == 'linux')
1681a6caeee8SXie Yongjiif get_option('libvduse').enabled()
1682a6caeee8SXie Yongji    if targetos != 'linux'
1683a6caeee8SXie Yongji        error('libvduse requires linux')
1684a6caeee8SXie Yongji    endif
1685a6caeee8SXie Yongjielif get_option('libvduse').disabled()
1686a6caeee8SXie Yongji    have_libvduse = false
1687a6caeee8SXie Yongjiendif
1688a6caeee8SXie Yongji
16892a2359b8SXie Yongjihave_vduse_blk_export = (have_libvduse and targetos == 'linux')
16902a2359b8SXie Yongjiif get_option('vduse_blk_export').enabled()
16912a2359b8SXie Yongji    if targetos != 'linux'
16922a2359b8SXie Yongji        error('vduse_blk_export requires linux')
16932a2359b8SXie Yongji    elif not have_libvduse
16942a2359b8SXie Yongji        error('vduse_blk_export requires libvduse support')
16952a2359b8SXie Yongji    endif
16962a2359b8SXie Yongjielif get_option('vduse_blk_export').disabled()
16972a2359b8SXie Yongji    have_vduse_blk_export = false
16982a2359b8SXie Yongjiendif
16992a2359b8SXie Yongji
170046627f41SAndrew Melnychenko# libbpf
170146627f41SAndrew Melnychenkolibbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config')
170246627f41SAndrew Melnychenkoif libbpf.found() and not cc.links('''
170346627f41SAndrew Melnychenko   #include <bpf/libbpf.h>
170446627f41SAndrew Melnychenko   int main(void)
170546627f41SAndrew Melnychenko   {
170646627f41SAndrew Melnychenko     bpf_object__destroy_skeleton(NULL);
170746627f41SAndrew Melnychenko     return 0;
170846627f41SAndrew Melnychenko   }''', dependencies: libbpf)
170946627f41SAndrew Melnychenko  libbpf = not_found
171046627f41SAndrew Melnychenko  if get_option('bpf').enabled()
171146627f41SAndrew Melnychenko    error('libbpf skeleton test failed')
171246627f41SAndrew Melnychenko  else
171346627f41SAndrew Melnychenko    warning('libbpf skeleton test failed, disabling')
171446627f41SAndrew Melnychenko  endif
171546627f41SAndrew Melnychenkoendif
171646627f41SAndrew Melnychenko
17177c10cb38SIlya Leoshkevich# libdw
1718bc71d58fSIlya Leoshkevichlibdw = not_found
1719550c6d97SIlya Leoshkevichif not get_option('libdw').auto() or \
1720a0cbd2e8SPaolo Bonzini        (not get_option('prefer_static') and (have_system or have_user))
17217c10cb38SIlya Leoshkevich    libdw = dependency('libdw',
17227c10cb38SIlya Leoshkevich                       method: 'pkg-config',
1723bc71d58fSIlya Leoshkevich                       required: get_option('libdw'))
1724bc71d58fSIlya Leoshkevichendif
17257c10cb38SIlya Leoshkevich
172687430d5bSPaolo Bonzini#################
172787430d5bSPaolo Bonzini# config-host.h #
172887430d5bSPaolo Bonzini#################
172987430d5bSPaolo Bonzini
173087430d5bSPaolo Bonziniaudio_drivers_selected = []
173187430d5bSPaolo Bonziniif have_system
173287430d5bSPaolo Bonzini  audio_drivers_available = {
173387430d5bSPaolo Bonzini    'alsa': alsa.found(),
173487430d5bSPaolo Bonzini    'coreaudio': coreaudio.found(),
173587430d5bSPaolo Bonzini    'dsound': dsound.found(),
173687430d5bSPaolo Bonzini    'jack': jack.found(),
173787430d5bSPaolo Bonzini    'oss': oss.found(),
173887430d5bSPaolo Bonzini    'pa': pulse.found(),
1739c2d3d1c2SDorinda Bassey    'pipewire': pipewire.found(),
174087430d5bSPaolo Bonzini    'sdl': sdl.found(),
1741663df1ccSAlexandre Ratchov    'sndio': sndio.found(),
174287430d5bSPaolo Bonzini  }
1743e5424a29SPaolo Bonzini  foreach k, v: audio_drivers_available
1744e5424a29SPaolo Bonzini    config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
1745e5424a29SPaolo Bonzini  endforeach
174687430d5bSPaolo Bonzini
174787430d5bSPaolo Bonzini  # Default to native drivers first, OSS second, SDL third
174887430d5bSPaolo Bonzini  audio_drivers_priority = \
1749663df1ccSAlexandre Ratchov    [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \
175087430d5bSPaolo Bonzini    (targetos == 'linux' ? [] : [ 'sdl' ])
175187430d5bSPaolo Bonzini  audio_drivers_default = []
175287430d5bSPaolo Bonzini  foreach k: audio_drivers_priority
175387430d5bSPaolo Bonzini    if audio_drivers_available[k]
175487430d5bSPaolo Bonzini      audio_drivers_default += k
175587430d5bSPaolo Bonzini    endif
175687430d5bSPaolo Bonzini  endforeach
175787430d5bSPaolo Bonzini
175887430d5bSPaolo Bonzini  foreach k: get_option('audio_drv_list')
175987430d5bSPaolo Bonzini    if k == 'default'
176087430d5bSPaolo Bonzini      audio_drivers_selected += audio_drivers_default
176187430d5bSPaolo Bonzini    elif not audio_drivers_available[k]
176287430d5bSPaolo Bonzini      error('Audio driver "@0@" not available.'.format(k))
176387430d5bSPaolo Bonzini    else
176487430d5bSPaolo Bonzini      audio_drivers_selected += k
176587430d5bSPaolo Bonzini    endif
176687430d5bSPaolo Bonzini  endforeach
176787430d5bSPaolo Bonziniendif
176887430d5bSPaolo Bonziniconfig_host_data.set('CONFIG_AUDIO_DRIVERS',
176987430d5bSPaolo Bonzini                     '"' + '", "'.join(audio_drivers_selected) + '", ')
177087430d5bSPaolo Bonzini
17719e62ba48SDaniele Buonoif get_option('cfi')
17729e62ba48SDaniele Buono  cfi_flags=[]
17739e62ba48SDaniele Buono  # Check for dependency on LTO
17749e62ba48SDaniele Buono  if not get_option('b_lto')
17759e62ba48SDaniele Buono    error('Selected Control-Flow Integrity but LTO is disabled')
17769e62ba48SDaniele Buono  endif
17776002711cSPaolo Bonzini  if enable_modules
17789e62ba48SDaniele Buono    error('Selected Control-Flow Integrity is not compatible with modules')
17799e62ba48SDaniele Buono  endif
17809e62ba48SDaniele Buono  # Check for cfi flags. CFI requires LTO so we can't use
17819e62ba48SDaniele Buono  # get_supported_arguments, but need a more complex "compiles" which allows
17829e62ba48SDaniele Buono  # custom arguments
17839e62ba48SDaniele Buono  if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
17849e62ba48SDaniele Buono                 args: ['-flto', '-fsanitize=cfi-icall'] )
17859e62ba48SDaniele Buono    cfi_flags += '-fsanitize=cfi-icall'
17869e62ba48SDaniele Buono  else
17879e62ba48SDaniele Buono    error('-fsanitize=cfi-icall is not supported by the compiler')
17889e62ba48SDaniele Buono  endif
17899e62ba48SDaniele Buono  if cc.compiles('int main () { return 0; }',
17909e62ba48SDaniele Buono                 name: '-fsanitize-cfi-icall-generalize-pointers',
17919e62ba48SDaniele Buono                 args: ['-flto', '-fsanitize=cfi-icall',
17929e62ba48SDaniele Buono                        '-fsanitize-cfi-icall-generalize-pointers'] )
17939e62ba48SDaniele Buono    cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
17949e62ba48SDaniele Buono  else
17959e62ba48SDaniele Buono    error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
17969e62ba48SDaniele Buono  endif
17979e62ba48SDaniele Buono  if get_option('cfi_debug')
17989e62ba48SDaniele Buono    if cc.compiles('int main () { return 0; }',
17999e62ba48SDaniele Buono                   name: '-fno-sanitize-trap=cfi-icall',
18009e62ba48SDaniele Buono                   args: ['-flto', '-fsanitize=cfi-icall',
18019e62ba48SDaniele Buono                          '-fno-sanitize-trap=cfi-icall'] )
18029e62ba48SDaniele Buono      cfi_flags += '-fno-sanitize-trap=cfi-icall'
18039e62ba48SDaniele Buono    else
18049e62ba48SDaniele Buono      error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
18059e62ba48SDaniele Buono    endif
18069e62ba48SDaniele Buono  endif
1807e5134024SPaolo Bonzini  add_global_arguments(cfi_flags, native: false, language: all_languages)
1808e5134024SPaolo Bonzini  add_global_link_arguments(cfi_flags, native: false, language: all_languages)
18099e62ba48SDaniele Buonoendif
18109e62ba48SDaniele Buono
181114176c8dSJoelle van Dynehave_host_block_device = (targetos != 'darwin' or
181214176c8dSJoelle van Dyne    cc.has_header('IOKit/storage/IOMedia.h'))
181314176c8dSJoelle van Dyne
1814a436d6d4SPaolo Bonzinidbus_display = get_option('dbus_display') \
1815a436d6d4SPaolo Bonzini  .require(gio.version().version_compare('>=2.64'),
1816a436d6d4SPaolo Bonzini           error_message: '-display dbus requires glib>=2.64') \
18177544060eSPaolo Bonzini  .require(gdbus_codegen.found(),
1818bb2dc4b7SPaolo Bonzini           error_message: gdbus_codegen_error.format('-display dbus')) \
181984a0a2efSMarc-André Lureau  .require(targetos != 'windows',
182084a0a2efSMarc-André Lureau           error_message: '-display dbus is not available on Windows') \
1821a436d6d4SPaolo Bonzini  .allowed()
1822142ca628SMarc-André Lureau
1823a436d6d4SPaolo Bonzinihave_virtfs = get_option('virtfs') \
18240fb1e19dSKeno Fischer    .require(targetos == 'linux' or targetos == 'darwin',
18250fb1e19dSKeno Fischer             error_message: 'virtio-9p (virtfs) requires Linux or macOS') \
18260fb1e19dSKeno Fischer    .require(targetos == 'linux' or cc.has_function('pthread_fchdir_np'),
18270fb1e19dSKeno Fischer             error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \
18281a67e07fSPeter Foley    .require(targetos == 'darwin' or libattr.found(),
18291a67e07fSPeter Foley             error_message: 'virtio-9p (virtfs) on Linux requires libattr-devel') \
1830a436d6d4SPaolo Bonzini    .disable_auto_if(not have_tools and not have_system) \
1831a436d6d4SPaolo Bonzini    .allowed()
183269202b40SPaolo Bonzini
18331a67e07fSPeter Foleyhave_virtfs_proxy_helper = get_option('virtfs_proxy_helper') \
18341a67e07fSPeter Foley    .require(targetos != 'darwin', error_message: 'the virtfs proxy helper is incompatible with macOS') \
18351a67e07fSPeter Foley    .require(have_virtfs, error_message: 'the virtfs proxy helper requires that virtfs is enabled') \
18361a67e07fSPeter Foley    .disable_auto_if(not have_tools) \
18371a67e07fSPeter Foley    .require(libcap_ng.found(), error_message: 'the virtfs proxy helper requires libcap-ng') \
18381a67e07fSPeter Foley    .allowed()
18393a489d38SPhilippe Mathieu-Daudé
1840622d64ffSPaolo Bonziniif get_option('block_drv_ro_whitelist') == ''
1841622d64ffSPaolo Bonzini  config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '')
1842622d64ffSPaolo Bonzinielse
1843622d64ffSPaolo Bonzini  config_host_data.set('CONFIG_BDRV_RO_WHITELIST',
1844622d64ffSPaolo Bonzini        '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ')
1845622d64ffSPaolo Bonziniendif
1846622d64ffSPaolo Bonziniif get_option('block_drv_rw_whitelist') == ''
1847622d64ffSPaolo Bonzini  config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '')
1848622d64ffSPaolo Bonzinielse
1849622d64ffSPaolo Bonzini  config_host_data.set('CONFIG_BDRV_RW_WHITELIST',
1850622d64ffSPaolo Bonzini        '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ')
1851622d64ffSPaolo Bonziniendif
1852622d64ffSPaolo Bonzini
18539c29b741SPaolo Bonziniforeach k : get_option('trace_backends')
18549c29b741SPaolo Bonzini  config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
18559c29b741SPaolo Bonziniendforeach
18569c29b741SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
185741f2ae28SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority'))
185840c909f5SPaolo Bonziniif iasl.found()
185940c909f5SPaolo Bonzini  config_host_data.set_quoted('CONFIG_IASL', iasl.full_path())
18605dc4618eSPaolo Bonziniendif
186116bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
186216bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
186316bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
186416bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
186516bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
18668154f5e6SAkihiko Odaki
18678154f5e6SAkihiko Odakiqemu_firmwarepath = ''
18688154f5e6SAkihiko Odakiforeach k : get_option('qemu_firmwarepath')
18698154f5e6SAkihiko Odaki  qemu_firmwarepath += '"' + get_option('prefix') / k + '", '
18708154f5e6SAkihiko Odakiendforeach
18718154f5e6SAkihiko Odakiconfig_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath)
18728154f5e6SAkihiko Odaki
187316bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
187416bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
187516bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
187616bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
187716bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
187816bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
187916bf7a33SPaolo Bonzini
18806002711cSPaolo Bonziniif enable_modules
1881b0b4323eSPaolo Bonzini  config_host_data.set('CONFIG_STAMP', run_command(
1882b0b4323eSPaolo Bonzini      meson.current_source_dir() / 'scripts/qemu-stamp.py',
1883b0b4323eSPaolo Bonzini      meson.project_version(), get_option('pkgversion'), '--',
1884b0b4323eSPaolo Bonzini      meson.current_source_dir() / 'configure',
1885b0b4323eSPaolo Bonzini      capture: true, check: true).stdout().strip())
1886b0b4323eSPaolo Bonziniendif
1887b0b4323eSPaolo Bonzini
188835acbb30SPaolo Bonzinihave_slirp_smbd = get_option('slirp_smbd') \
188935acbb30SPaolo Bonzini  .require(targetos != 'windows', error_message: 'Host smbd not supported on this platform.') \
189035acbb30SPaolo Bonzini  .allowed()
189135acbb30SPaolo Bonziniif have_slirp_smbd
189235acbb30SPaolo Bonzini  smbd_path = get_option('smbd')
189335acbb30SPaolo Bonzini  if smbd_path == ''
189435acbb30SPaolo Bonzini    smbd_path = (targetos == 'solaris' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd')
189535acbb30SPaolo Bonzini  endif
189635acbb30SPaolo Bonzini  config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path)
189735acbb30SPaolo Bonziniendif
189835acbb30SPaolo Bonzini
1899823eb013SPaolo Bonziniconfig_host_data.set('HOST_' + host_arch.to_upper(), 1)
1900823eb013SPaolo Bonzini
19012cb2f580SPaolo Bonziniif get_option('module_upgrades') and not enable_modules
19022cb2f580SPaolo Bonzini  error('Cannot enable module-upgrades as modules are not enabled')
19032cb2f580SPaolo Bonziniendif
19042cb2f580SPaolo Bonziniconfig_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades'))
19052cb2f580SPaolo Bonzini
1906f7f2d651SPaolo Bonziniconfig_host_data.set('CONFIG_ATTR', libattr.found())
1907c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools'))
19088c6d4ff4SPaolo Bonziniconfig_host_data.set('CONFIG_BRLAPI', brlapi.found())
1909b4e312e9SPaolo Bonziniconfig_host_data.set('CONFIG_COCOA', cocoa.found())
1910537b7248SPaolo Bonziniconfig_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
1911af2bb99bSPaolo Bonziniconfig_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
1912f01496a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBUDEV', libudev.found())
19130c32a0aeSPaolo Bonziniconfig_host_data.set('CONFIG_LZO', lzo.found())
19146ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH', mpathpersist.found())
19156ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
1916fd66dbd4SStefan Hajnocziconfig_host_data.set('CONFIG_BLKIO', blkio.found())
1917f9cd86feSPaolo Bonziniconfig_host_data.set('CONFIG_CURL', curl.found())
19185285e593SYonggang Luoconfig_host_data.set('CONFIG_CURSES', curses.found())
19198bc5184dSThomas Huthconfig_host_data.set('CONFIG_GBM', gbm.found())
19207544060eSPaolo Bonziniconfig_host_data.set('CONFIG_GIO', gio.found())
192108821ca2SPaolo Bonziniconfig_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
192208821ca2SPaolo Bonziniif glusterfs.found()
192308821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
192408821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
192508821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
192608821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
192708821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
192808821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
192908821ca2SPaolo Bonziniendif
19301b695471SPaolo Bonziniconfig_host_data.set('CONFIG_GTK', gtk.found())
1931c23d7b4eSPaolo Bonziniconfig_host_data.set('CONFIG_VTE', vte.found())
193229e0bfffSClaudio Fontanaconfig_host_data.set('CONFIG_GTK_CLIPBOARD', have_gtk_clipboard)
1933f7f2d651SPaolo Bonziniconfig_host_data.set('CONFIG_LIBATTR', have_old_libattr)
1934727c8bb8SPaolo Bonziniconfig_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
193546627f41SAndrew Melnychenkoconfig_host_data.set('CONFIG_EBPF', libbpf.found())
193663a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
19379db405a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
193830045c05SPaolo Bonziniconfig_host_data.set('CONFIG_LIBNFS', libnfs.found())
1939e6a52b36SThomas Huthconfig_host_data.set('CONFIG_LIBSSH', libssh.found())
1940ff66f3e5SPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_AIO', libaio.found())
194163a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
194263a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LIBPMEM', libpmem.found())
19436002711cSPaolo Bonziniconfig_host_data.set('CONFIG_MODULES', enable_modules)
1944488a8c73SPaolo Bonziniconfig_host_data.set('CONFIG_NUMA', numa.found())
19456bb613f0SMichal Privoznikif numa.found()
19466bb613f0SMichal Privoznik  config_host_data.set('HAVE_NUMA_HAS_PREFERRED_MANY',
19476bb613f0SMichal Privoznik                       cc.has_function('numa_has_preferred_many',
19486bb613f0SMichal Privoznik                                       dependencies: numa))
19496bb613f0SMichal Privoznikendif
195088b6e618SPaolo Bonziniconfig_host_data.set('CONFIG_OPENGL', opengl.found())
1951c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_PROFILER', get_option('profiler'))
1952fabd1e93SPaolo Bonziniconfig_host_data.set('CONFIG_RBD', rbd.found())
19533730a734SPaolo Bonziniconfig_host_data.set('CONFIG_RDMA', rdma.found())
195435be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL', sdl.found())
195535be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
195690835c2bSPaolo Bonziniconfig_host_data.set('CONFIG_SECCOMP', seccomp.found())
195773422d95SMichal Privoznikif seccomp.found()
195873422d95SMichal Privoznik  config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc)
195973422d95SMichal Privoznikendif
1960241611eaSPaolo Bonziniconfig_host_data.set('CONFIG_SNAPPY', snappy.found())
19610d04c4c9SPaolo Bonziniconfig_host_data.set('CONFIG_TPM', have_tpm)
196234f983d8SPaolo Bonziniconfig_host_data.set('CONFIG_TSAN', get_option('tsan'))
196390540f32SPaolo Bonziniconfig_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
1964e1723999SPaolo Bonziniconfig_host_data.set('CONFIG_VDE', vde.found())
19652df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET', have_vhost_net)
19662df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user)
19672df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa)
19682df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel)
19692df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_USER', have_vhost_user)
19702df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto)
19712df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa)
1972e2c1d78dSVladislav Yaroshchukconfig_host_data.set('CONFIG_VMNET', vmnet.found())
1973e5e856c1SStefan Hajnocziconfig_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
19742a2359b8SXie Yongjiconfig_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export)
197595f8510eSKshitij Suriconfig_host_data.set('CONFIG_PNG', png.found())
1976a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC', vnc.found())
1977a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
1978a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_SASL', sasl.found())
197969202b40SPaolo Bonziniconfig_host_data.set('CONFIG_VIRTFS', have_virtfs)
198063a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_VTE', vte.found())
19814113f4cfSLaurent Vivierconfig_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
1982af04e89dSMarc-André Lureauconfig_host_data.set('CONFIG_KEYUTILS', keyutils.found())
19833909def8SMarc-André Lureauconfig_host_data.set('CONFIG_GETTID', has_gettid)
198457612511SPaolo Bonziniconfig_host_data.set('CONFIG_GNUTLS', gnutls.found())
1985cc4c7c73SDaniel P. Berrangéconfig_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
1986d47b83b1SDaniel P. Berrangéconfig_host_data.set('CONFIG_TASN1', tasn1.found())
198757612511SPaolo Bonziniconfig_host_data.set('CONFIG_GCRYPT', gcrypt.found())
198857612511SPaolo Bonziniconfig_host_data.set('CONFIG_NETTLE', nettle.found())
19894c5e512eSLei Heconfig_host_data.set('CONFIG_HOGWEED', hogweed.found())
199057612511SPaolo Bonziniconfig_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
1991aa087962SPaolo Bonziniconfig_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
199284e319a5SMax Reitzconfig_host_data.set('CONFIG_STATX', has_statx)
19934ce7a08dSHanna Reitzconfig_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id)
1994b1def33dSPaolo Bonziniconfig_host_data.set('CONFIG_ZSTD', zstd.found())
1995a484a719SMax Reitzconfig_host_data.set('CONFIG_FUSE', fuse.found())
1996df4ea709SMax Reitzconfig_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
19973f0a5d55SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
1998ddece465SMarc-André Lureauif spice_protocol.found()
1999ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0])
2000ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1])
2001ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2])
2002ddece465SMarc-André Lureauendif
20033f0a5d55SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE', spice.found())
20049d71037fSPaolo Bonziniconfig_host_data.set('CONFIG_X11', x11.found())
2005142ca628SMarc-André Lureauconfig_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display)
20069e62ba48SDaniele Buonoconfig_host_data.set('CONFIG_CFI', get_option('cfi'))
20073d212b41SRichard W.M. Jonesconfig_host_data.set('CONFIG_SELINUX', selinux.found())
200814efd8d3SPaolo Bonziniconfig_host_data.set('CONFIG_XEN_BACKEND', xen.found())
20097c10cb38SIlya Leoshkevichconfig_host_data.set('CONFIG_LIBDW', libdw.found())
201014efd8d3SPaolo Bonziniif xen.found()
201114efd8d3SPaolo Bonzini  # protect from xen.version() having less than three components
201214efd8d3SPaolo Bonzini  xen_version = xen.version().split('.') + ['0', '0']
201314efd8d3SPaolo Bonzini  xen_ctrl_version = xen_version[0] + \
201414efd8d3SPaolo Bonzini    ('0' + xen_version[1]).substring(-2) + \
201514efd8d3SPaolo Bonzini    ('0' + xen_version[2]).substring(-2)
201614efd8d3SPaolo Bonzini  config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version)
201714efd8d3SPaolo Bonziniendif
2018859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
2019859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
2020859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
2021859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
2022859aef02SPaolo Bonzini
2023a6305081SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
202469d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
202569d8de7aSPaolo Bonzini
2026728c0a2fSPaolo Bonzinihave_coroutine_pool = get_option('coroutine_pool')
2027728c0a2fSPaolo Bonziniif get_option('debug_stack_usage') and have_coroutine_pool
2028728c0a2fSPaolo Bonzini  message('Disabling coroutine pool to measure stack usage')
2029728c0a2fSPaolo Bonzini  have_coroutine_pool = false
2030728c0a2fSPaolo Bonziniendif
2031728c0a2fSPaolo Bonziniconfig_host_data.set10('CONFIG_COROUTINE_POOL', have_coroutine_pool)
203258a2e3f5SStefan Hajnocziconfig_host_data.set('CONFIG_DEBUG_GRAPH_LOCK', get_option('debug_graph_lock'))
2033c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex'))
2034728c0a2fSPaolo Bonziniconfig_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage'))
2035c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_GPROF', get_option('gprof'))
2036406523f6SPaolo Bonziniconfig_host_data.set('CONFIG_LIVE_BLOCK_MIGRATION', get_option('live_block_migration').allowed())
2037c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug'))
2038abad185cSJuan Quintelaconfig_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed())
2039406523f6SPaolo Bonzini
204069d8de7aSPaolo Bonzini# has_header
2041e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
2042d47a8b3bSPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
2043d47a8b3bSPaolo Bonziniconfig_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
204448f670ecSThomas Huthconfig_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
20452964be52SThomas Huthconfig_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
20462802d91dSThomas Huthconfig_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
204769d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
2048ded5d78cSThomas Huthconfig_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
20494a9d5f89SThomas Huthconfig_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
2050d409373bSBin Mengif targetos == 'windows'
2051d409373bSBin Meng  config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h'))
2052d409373bSBin Mengendif
2053ded5d78cSThomas Huth
205469d8de7aSPaolo Bonzini# has_function
2055c891c24bSClaudio Imbrendaconfig_host_data.set('CONFIG_CLOSE_RANGE', cc.has_function('close_range'))
2056a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
2057e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
2058e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
2059e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
2060e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
20618698343bSPeter Maydell# Note that we need to specify prefix: here to avoid incorrectly
20628698343bSPeter Maydell# thinking that Windows has posix_memalign()
20638698343bSPeter Maydellconfig_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>'))
20645c8c714aSPeter Maydellconfig_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc'))
206588454f84SPeter Maydellconfig_host_data.set('CONFIG_VALLOC', cc.has_function('valloc'))
206688454f84SPeter Maydellconfig_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign'))
2067e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
20682b9f74efSPeter Maydellconfig_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
2069029ed1bdSKeno Fischerconfig_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np'))
2070e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
2071e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
2072e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
2073e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
2074e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
2075be7e89f6SPaolo Bonziniconfig_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
207659e35c7bSAndrew Deasonconfig_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
2077fc9a809eSPaolo Bonziniconfig_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice)
2078e66420acSPaolo Bonziniconfig_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
2079ed3b3f17SPaolo Bonziniconfig_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
208069d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
208166dc5f96SStefano Garzarellaif rbd.found()
208266dc5f96SStefano Garzarella  config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS',
208366dc5f96SStefano Garzarella                       cc.has_function('rbd_namespace_exists',
208466dc5f96SStefano Garzarella                                       dependencies: rbd,
208566dc5f96SStefano Garzarella                                       prefix: '#include <rbd/librbd.h>'))
208666dc5f96SStefano Garzarellaendif
2087911965acSLi Zhijianif rdma.found()
2088911965acSLi Zhijian  config_host_data.set('HAVE_IBV_ADVISE_MR',
2089911965acSLi Zhijian                       cc.has_function('ibv_advise_mr',
20903730a734SPaolo Bonzini                                       dependencies: rdma,
2091911965acSLi Zhijian                                       prefix: '#include <infiniband/verbs.h>'))
2092911965acSLi Zhijianendif
20932b9f74efSPeter Maydell
209434f983d8SPaolo Bonzinihave_asan_fiber = false
209534f983d8SPaolo Bonziniif get_option('sanitizers') and \
209634f983d8SPaolo Bonzini   not cc.has_function('__sanitizer_start_switch_fiber',
209734f983d8SPaolo Bonzini                         args: '-fsanitize=address',
209834f983d8SPaolo Bonzini                         prefix: '#include <sanitizer/asan_interface.h>')
209934f983d8SPaolo Bonzini  warning('Missing ASAN due to missing fiber annotation interface')
210034f983d8SPaolo Bonzini  warning('Without code annotation, the report may be inferior.')
210134f983d8SPaolo Bonzinielse
210234f983d8SPaolo Bonzini  have_asan_fiber = true
210334f983d8SPaolo Bonziniendif
210434f983d8SPaolo Bonziniconfig_host_data.set('CONFIG_ASAN_IFACE_FIBER', have_asan_fiber)
210534f983d8SPaolo Bonzini
2106e66420acSPaolo Bonzini# has_header_symbol
21076d43eaa3SSam Liconfig_host_data.set('CONFIG_BLKZONED',
21086d43eaa3SSam Li                     cc.has_header_symbol('linux/blkzoned.h', 'BLKOPENZONE'))
2109e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_EPOLL_CREATE1',
2110e66420acSPaolo Bonzini                     cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
2111e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
2112e66420acSPaolo Bonzini                     cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
2113e66420acSPaolo Bonzini                     cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
2114e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
2115e66420acSPaolo Bonzini                     cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
2116e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FIEMAP',
2117e66420acSPaolo Bonzini                     cc.has_header('linux/fiemap.h') and
2118e66420acSPaolo Bonzini                     cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
2119be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_GETRANDOM',
2120be7e89f6SPaolo Bonzini                     cc.has_function('getrandom') and
2121be7e89f6SPaolo Bonzini                     cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
2122a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_INOTIFY',
2123a620fbe9SPaolo Bonzini                     cc.has_header_symbol('sys/inotify.h', 'inotify_init'))
2124a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_INOTIFY1',
2125a620fbe9SPaolo Bonzini                     cc.has_header_symbol('sys/inotify.h', 'inotify_init1'))
2126e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
2127e66420acSPaolo Bonzini                     cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
2128be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_RTNETLINK',
2129be7e89f6SPaolo Bonzini                     cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
2130be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_SYSMACROS',
2131be7e89f6SPaolo Bonzini                     cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
2132e1fbd2c4SPaolo Bonziniconfig_host_data.set('HAVE_OPTRESET',
2133e1fbd2c4SPaolo Bonzini                     cc.has_header_symbol('getopt.h', 'optreset'))
2134653163fcSMarc-André Lureauconfig_host_data.set('HAVE_IPPROTO_MPTCP',
2135653163fcSMarc-André Lureau                     cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
2136e66420acSPaolo Bonzini
2137e66420acSPaolo Bonzini# has_member
2138e66420acSPaolo Bonziniconfig_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
2139e66420acSPaolo Bonzini                     cc.has_member('struct sigevent', 'sigev_notify_thread_id',
2140e66420acSPaolo Bonzini                                   prefix: '#include <signal.h>'))
2141ed3b3f17SPaolo Bonziniconfig_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
2142ed3b3f17SPaolo Bonzini                     cc.has_member('struct stat', 'st_atim',
2143ed3b3f17SPaolo Bonzini                                   prefix: '#include <sys/stat.h>'))
21446d43eaa3SSam Liconfig_host_data.set('HAVE_BLK_ZONE_REP_CAPACITY',
21456d43eaa3SSam Li                     cc.has_member('struct blk_zone', 'capacity',
21466d43eaa3SSam Li                                   prefix: '#include <linux/blkzoned.h>'))
2147e66420acSPaolo Bonzini
21486a23f819SPaolo Bonzini# has_type
21496a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_IOVEC',
21506a23f819SPaolo Bonzini                     cc.has_type('struct iovec',
21516a23f819SPaolo Bonzini                                 prefix: '#include <sys/uio.h>'))
21526a23f819SPaolo Bonziniconfig_host_data.set('HAVE_UTMPX',
21536a23f819SPaolo Bonzini                     cc.has_type('struct utmpx',
21546a23f819SPaolo Bonzini                                 prefix: '#include <utmpx.h>'))
21556a23f819SPaolo Bonzini
2156904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_EVENTFD', cc.links('''
2157e1fbd2c4SPaolo Bonzini  #include <sys/eventfd.h>
2158e1fbd2c4SPaolo Bonzini  int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
2159904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
2160e1fbd2c4SPaolo Bonzini  #include <unistd.h>
2161e1fbd2c4SPaolo Bonzini  int main(void) {
2162e1fbd2c4SPaolo Bonzini  #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
2163e1fbd2c4SPaolo Bonzini  return fdatasync(0);
2164e1fbd2c4SPaolo Bonzini  #else
2165e1fbd2c4SPaolo Bonzini  #error Not supported
2166e1fbd2c4SPaolo Bonzini  #endif
2167e1fbd2c4SPaolo Bonzini  }'''))
21688900c204SAndrew Deason
21698900c204SAndrew Deasonhas_madvise = cc.links(gnu_source_prefix + '''
2170e1fbd2c4SPaolo Bonzini  #include <sys/types.h>
2171e1fbd2c4SPaolo Bonzini  #include <sys/mman.h>
2172e1fbd2c4SPaolo Bonzini  #include <stddef.h>
21738900c204SAndrew Deason  int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')
21748900c204SAndrew Deasonmissing_madvise_proto = false
21758900c204SAndrew Deasonif has_madvise
21768900c204SAndrew Deason  # Some platforms (illumos and Solaris before Solaris 11) provide madvise()
21778900c204SAndrew Deason  # but forget to prototype it. In this case, has_madvise will be true (the
21788900c204SAndrew Deason  # test program links despite a compile warning). To detect the
21798900c204SAndrew Deason  # missing-prototype case, we try again with a definitely-bogus prototype.
21808900c204SAndrew Deason  # This will only compile if the system headers don't provide the prototype;
21818900c204SAndrew Deason  # otherwise the conflicting prototypes will cause a compiler error.
21828900c204SAndrew Deason  missing_madvise_proto = cc.links(gnu_source_prefix + '''
21838900c204SAndrew Deason    #include <sys/types.h>
21848900c204SAndrew Deason    #include <sys/mman.h>
21858900c204SAndrew Deason    #include <stddef.h>
21868900c204SAndrew Deason    extern int madvise(int);
21878900c204SAndrew Deason    int main(void) { return madvise(0); }''')
21888900c204SAndrew Deasonendif
21898900c204SAndrew Deasonconfig_host_data.set('CONFIG_MADVISE', has_madvise)
21908900c204SAndrew Deasonconfig_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto)
21918900c204SAndrew Deason
2192904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
2193e1fbd2c4SPaolo Bonzini  #include <sys/mman.h>
2194e1fbd2c4SPaolo Bonzini  int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
2195904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
2196d47a8b3bSPaolo Bonzini  #include <fcntl.h>
2197d47a8b3bSPaolo Bonzini  #if !defined(AT_EMPTY_PATH)
2198d47a8b3bSPaolo Bonzini  # error missing definition
2199d47a8b3bSPaolo Bonzini  #else
2200d47a8b3bSPaolo Bonzini  int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
2201d47a8b3bSPaolo Bonzini  #endif'''))
2202904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
2203e1fbd2c4SPaolo Bonzini  #include <sys/mman.h>
2204e1fbd2c4SPaolo Bonzini  #include <stddef.h>
2205e1fbd2c4SPaolo Bonzini  int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
220610f6b231SPaolo Bonzini
22076a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + '''
220810f6b231SPaolo Bonzini  #include <pthread.h>
220910f6b231SPaolo Bonzini
221010f6b231SPaolo Bonzini  static void *f(void *p) { return NULL; }
221110f6b231SPaolo Bonzini  int main(void)
221210f6b231SPaolo Bonzini  {
221310f6b231SPaolo Bonzini    pthread_t thread;
221410f6b231SPaolo Bonzini    pthread_create(&thread, 0, f, 0);
221510f6b231SPaolo Bonzini    pthread_setname_np(thread, "QEMU");
221610f6b231SPaolo Bonzini    return 0;
221710f6b231SPaolo Bonzini  }''', dependencies: threads))
22186a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + '''
221910f6b231SPaolo Bonzini  #include <pthread.h>
222010f6b231SPaolo Bonzini
222110f6b231SPaolo Bonzini  static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
222210f6b231SPaolo Bonzini  int main(void)
222310f6b231SPaolo Bonzini  {
222410f6b231SPaolo Bonzini    pthread_t thread;
222510f6b231SPaolo Bonzini    pthread_create(&thread, 0, f, 0);
222610f6b231SPaolo Bonzini    return 0;
222710f6b231SPaolo Bonzini  }''', dependencies: threads))
22283ada67a3SBrad Smithconfig_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(gnu_source_prefix + '''
22293ada67a3SBrad Smith  #include <pthread.h>
22303ada67a3SBrad Smith  #include <pthread_np.h>
22313ada67a3SBrad Smith
22323ada67a3SBrad Smith  static void *f(void *p) { return NULL; }
22333ada67a3SBrad Smith  int main(void)
22343ada67a3SBrad Smith  {
22353ada67a3SBrad Smith    pthread_t thread;
22363ada67a3SBrad Smith    pthread_create(&thread, 0, f, 0);
22373ada67a3SBrad Smith    pthread_set_name_np(thread, "QEMU");
22383ada67a3SBrad Smith    return 0;
22393ada67a3SBrad Smith  }''', dependencies: threads))
2240657ac98bSLongpeng(Mike)config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + '''
2241657ac98bSLongpeng(Mike)  #include <pthread.h>
2242657ac98bSLongpeng(Mike)  #include <time.h>
2243657ac98bSLongpeng(Mike)
2244657ac98bSLongpeng(Mike)  int main(void)
2245657ac98bSLongpeng(Mike)  {
2246657ac98bSLongpeng(Mike)    pthread_condattr_t attr
2247657ac98bSLongpeng(Mike)    pthread_condattr_init(&attr);
2248657ac98bSLongpeng(Mike)    pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
2249657ac98bSLongpeng(Mike)    return 0;
2250657ac98bSLongpeng(Mike)  }''', dependencies: threads))
22517730f32cSDavid Hildenbrandconfig_host_data.set('CONFIG_PTHREAD_AFFINITY_NP', cc.links(gnu_source_prefix + '''
22527730f32cSDavid Hildenbrand  #include <pthread.h>
225310f6b231SPaolo Bonzini
22547730f32cSDavid Hildenbrand  static void *f(void *p) { return NULL; }
22557730f32cSDavid Hildenbrand  int main(void)
22567730f32cSDavid Hildenbrand  {
22577730f32cSDavid Hildenbrand    int setsize = CPU_ALLOC_SIZE(64);
22587730f32cSDavid Hildenbrand    pthread_t thread;
22597730f32cSDavid Hildenbrand    cpu_set_t *cpuset;
22607730f32cSDavid Hildenbrand    pthread_create(&thread, 0, f, 0);
22617730f32cSDavid Hildenbrand    cpuset = CPU_ALLOC(64);
22627730f32cSDavid Hildenbrand    CPU_ZERO_S(setsize, cpuset);
22637730f32cSDavid Hildenbrand    pthread_setaffinity_np(thread, setsize, cpuset);
22647730f32cSDavid Hildenbrand    pthread_getaffinity_np(thread, setsize, cpuset);
22657730f32cSDavid Hildenbrand    CPU_FREE(cpuset);
22667730f32cSDavid Hildenbrand    return 0;
22677730f32cSDavid Hildenbrand  }''', dependencies: threads))
2268904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
22696bd17dccSKacper Słomiński  #include <sys/signalfd.h>
22706bd17dccSKacper Słomiński  #include <stddef.h>
22716bd17dccSKacper Słomiński  int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
2272904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
2273a620fbe9SPaolo Bonzini  #include <unistd.h>
2274a620fbe9SPaolo Bonzini  #include <fcntl.h>
2275a620fbe9SPaolo Bonzini  #include <limits.h>
2276a620fbe9SPaolo Bonzini
2277a620fbe9SPaolo Bonzini  int main(void)
2278a620fbe9SPaolo Bonzini  {
2279a620fbe9SPaolo Bonzini    int len, fd = 0;
2280a620fbe9SPaolo Bonzini    len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
2281a620fbe9SPaolo Bonzini    splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
2282a620fbe9SPaolo Bonzini    return 0;
2283a620fbe9SPaolo Bonzini  }'''))
2284e1fbd2c4SPaolo Bonzini
228596a63aebSPaolo Bonziniconfig_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
228696a63aebSPaolo Bonzini  #include <sys/mman.h>
2287b5d3dac1SPaolo Bonzini  int main(void) {
228896a63aebSPaolo Bonzini    return mlockall(MCL_FUTURE);
228996a63aebSPaolo Bonzini  }'''))
229096a63aebSPaolo Bonzini
2291eea9453aSThomas Huthhave_l2tpv3 = false
229243a363aeSPaolo Bonziniif get_option('l2tpv3').allowed() and have_system
22936a23f819SPaolo Bonzini  have_l2tpv3 = cc.has_type('struct mmsghdr',
22946a23f819SPaolo Bonzini    prefix: gnu_source_prefix + '''
22956a23f819SPaolo Bonzini      #include <sys/socket.h>
22966a23f819SPaolo Bonzini      #include <linux/ip.h>''')
2297eea9453aSThomas Huthendif
2298eea9453aSThomas Huthconfig_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
2299eea9453aSThomas Huth
2300837b84b1SPaolo Bonzinihave_netmap = false
230143a363aeSPaolo Bonziniif get_option('netmap').allowed() and have_system
2302837b84b1SPaolo Bonzini  have_netmap = cc.compiles('''
2303837b84b1SPaolo Bonzini    #include <inttypes.h>
2304837b84b1SPaolo Bonzini    #include <net/if.h>
2305837b84b1SPaolo Bonzini    #include <net/netmap.h>
2306837b84b1SPaolo Bonzini    #include <net/netmap_user.h>
2307837b84b1SPaolo Bonzini    #if (NETMAP_API < 11) || (NETMAP_API > 15)
2308837b84b1SPaolo Bonzini    #error
2309837b84b1SPaolo Bonzini    #endif
2310837b84b1SPaolo Bonzini    int main(void) { return 0; }''')
2311837b84b1SPaolo Bonzini  if not have_netmap and get_option('netmap').enabled()
2312837b84b1SPaolo Bonzini    error('Netmap headers not available')
2313837b84b1SPaolo Bonzini  endif
2314837b84b1SPaolo Bonziniendif
2315837b84b1SPaolo Bonziniconfig_host_data.set('CONFIG_NETMAP', have_netmap)
2316837b84b1SPaolo Bonzini
231796a63aebSPaolo Bonzini# Work around a system header bug with some kernel/XFS header
231896a63aebSPaolo Bonzini# versions where they both try to define 'struct fsxattr':
231996a63aebSPaolo Bonzini# xfs headers will not try to redefine structs from linux headers
232096a63aebSPaolo Bonzini# if this macro is set.
232196a63aebSPaolo Bonziniconfig_host_data.set('HAVE_FSXATTR', cc.links('''
23226a23f819SPaolo Bonzini  #include <linux/fs.h>
232396a63aebSPaolo Bonzini  struct fsxattr foo;
232496a63aebSPaolo Bonzini  int main(void) {
232596a63aebSPaolo Bonzini    return 0;
232696a63aebSPaolo Bonzini  }'''))
232796a63aebSPaolo Bonzini
2328e46bd55dSPaolo Bonzini# Some versions of Mac OS X incorrectly define SIZE_MAX
2329e46bd55dSPaolo Bonziniconfig_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
2330e46bd55dSPaolo Bonzini    #include <stdint.h>
2331e46bd55dSPaolo Bonzini    #include <stdio.h>
2332b5d3dac1SPaolo Bonzini    int main(void) {
2333e46bd55dSPaolo Bonzini        return printf("%zu", SIZE_MAX);
2334e46bd55dSPaolo Bonzini    }''', args: ['-Werror']))
2335e46bd55dSPaolo Bonzini
2336e61f1efeSRichard Henderson# See if 64-bit atomic operations are supported.
2337e61f1efeSRichard Henderson# Note that without __atomic builtins, we can only
2338e61f1efeSRichard Henderson# assume atomic loads/stores max at pointer size.
2339e61f1efeSRichard Hendersonconfig_host_data.set('CONFIG_ATOMIC64', cc.links('''
2340bd87a367SPaolo Bonzini  #include <stdint.h>
2341bd87a367SPaolo Bonzini  int main(void)
2342bd87a367SPaolo Bonzini  {
2343e61f1efeSRichard Henderson    uint64_t x = 0, y = 0;
2344bd87a367SPaolo Bonzini    y = __atomic_load_n(&x, __ATOMIC_RELAXED);
2345bd87a367SPaolo Bonzini    __atomic_store_n(&x, y, __ATOMIC_RELAXED);
2346bd87a367SPaolo Bonzini    __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2347bd87a367SPaolo Bonzini    __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
2348bd87a367SPaolo Bonzini    __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
2349bd87a367SPaolo Bonzini    return 0;
2350e61f1efeSRichard Henderson  }'''))
2351bd87a367SPaolo Bonzini
2352848126d1SMarc-André Lureauhas_int128 = cc.links('''
2353848126d1SMarc-André Lureau  __int128_t a;
2354848126d1SMarc-André Lureau  __uint128_t b;
2355848126d1SMarc-André Lureau  int main (void) {
2356848126d1SMarc-André Lureau    a = a + b;
2357848126d1SMarc-André Lureau    b = a * b;
2358848126d1SMarc-André Lureau    a = a * a;
2359848126d1SMarc-André Lureau    return 0;
2360848126d1SMarc-André Lureau  }''')
2361848126d1SMarc-André Lureau
2362848126d1SMarc-André Lureauconfig_host_data.set('CONFIG_INT128', has_int128)
2363848126d1SMarc-André Lureau
2364848126d1SMarc-André Lureauif has_int128
2365d2958fb0SMarc-André Lureau  # "do we have 128-bit atomics which are handled inline and specifically not
2366d2958fb0SMarc-André Lureau  # via libatomic". The reason we can't use libatomic is documented in the
2367d2958fb0SMarc-André Lureau  # comment starting "GCC is a house divided" in include/qemu/atomic128.h.
2368e61f1efeSRichard Henderson  # We only care about these operations on 16-byte aligned pointers, so
2369e61f1efeSRichard Henderson  # force 16-byte alignment of the pointer, which may be greater than
2370e61f1efeSRichard Henderson  # __alignof(unsigned __int128) for the host.
2371e61f1efeSRichard Henderson  atomic_test_128 = '''
2372e61f1efeSRichard Henderson    int main(int ac, char **av) {
2373e61f1efeSRichard Henderson      unsigned __int128 *p = __builtin_assume_aligned(av[ac - 1], sizeof(16));
2374e61f1efeSRichard Henderson      p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED);
2375e61f1efeSRichard Henderson      __atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED);
2376e61f1efeSRichard Henderson      __atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2377e61f1efeSRichard Henderson      return 0;
2378e61f1efeSRichard Henderson    }'''
2379e61f1efeSRichard Henderson  has_atomic128 = cc.links(atomic_test_128)
2380848126d1SMarc-André Lureau
2381848126d1SMarc-André Lureau  config_host_data.set('CONFIG_ATOMIC128', has_atomic128)
2382848126d1SMarc-André Lureau
2383848126d1SMarc-André Lureau  if not has_atomic128
2384e61f1efeSRichard Henderson    # Even with __builtin_assume_aligned, the above test may have failed
2385e61f1efeSRichard Henderson    # without optimization enabled.  Try again with optimizations locally
2386e61f1efeSRichard Henderson    # enabled for the function.  See
2387e61f1efeSRichard Henderson    #   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107389
2388e61f1efeSRichard Henderson    has_atomic128_opt = cc.links('__attribute__((optimize("O1")))' + atomic_test_128)
2389e61f1efeSRichard Henderson    config_host_data.set('CONFIG_ATOMIC128_OPT', has_atomic128_opt)
2390e61f1efeSRichard Henderson
2391e61f1efeSRichard Henderson    if not has_atomic128_opt
2392e61f1efeSRichard Henderson      config_host_data.set('CONFIG_CMPXCHG128', cc.links('''
2393848126d1SMarc-André Lureau        int main(void)
2394848126d1SMarc-André Lureau        {
2395848126d1SMarc-André Lureau          unsigned __int128 x = 0, y = 0;
2396848126d1SMarc-André Lureau          __sync_val_compare_and_swap_16(&x, y, x);
2397848126d1SMarc-André Lureau          return 0;
2398848126d1SMarc-André Lureau        }
2399e61f1efeSRichard Henderson      '''))
2400e61f1efeSRichard Henderson    endif
2401848126d1SMarc-André Lureau  endif
2402848126d1SMarc-André Lureauendif
2403bd87a367SPaolo Bonzini
2404bd87a367SPaolo Bonziniconfig_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
2405bd87a367SPaolo Bonzini  #include <sys/auxv.h>
2406bd87a367SPaolo Bonzini  int main(void) {
2407bd87a367SPaolo Bonzini    return getauxval(AT_HWCAP) == 0;
2408bd87a367SPaolo Bonzini  }'''))
2409bd87a367SPaolo Bonzini
24100dae95d4SPaolo Bonziniconfig_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles('''
24110dae95d4SPaolo Bonzini  #include <linux/usbdevice_fs.h>
24120dae95d4SPaolo Bonzini
24130dae95d4SPaolo Bonzini  #ifndef USBDEVFS_GET_CAPABILITIES
24140dae95d4SPaolo Bonzini  #error "USBDEVFS_GET_CAPABILITIES undefined"
24150dae95d4SPaolo Bonzini  #endif
24160dae95d4SPaolo Bonzini
24170dae95d4SPaolo Bonzini  #ifndef USBDEVFS_DISCONNECT_CLAIM
24180dae95d4SPaolo Bonzini  #error "USBDEVFS_DISCONNECT_CLAIM undefined"
24190dae95d4SPaolo Bonzini  #endif
24200dae95d4SPaolo Bonzini
24210dae95d4SPaolo Bonzini  int main(void) { return 0; }'''))
24220dae95d4SPaolo Bonzini
24232edd2c04SPaolo Bonzinihave_keyring = get_option('keyring') \
24242edd2c04SPaolo Bonzini  .require(targetos == 'linux', error_message: 'keyring is only available on Linux') \
24252edd2c04SPaolo Bonzini  .require(cc.compiles('''
24262edd2c04SPaolo Bonzini    #include <errno.h>
24272edd2c04SPaolo Bonzini    #include <asm/unistd.h>
24282edd2c04SPaolo Bonzini    #include <linux/keyctl.h>
24292edd2c04SPaolo Bonzini    #include <sys/syscall.h>
24302edd2c04SPaolo Bonzini    #include <unistd.h>
24312edd2c04SPaolo Bonzini    int main(void) {
24322edd2c04SPaolo Bonzini        return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
24332edd2c04SPaolo Bonzini    }'''), error_message: 'keyctl syscall not available on this system').allowed()
24342edd2c04SPaolo Bonziniconfig_host_data.set('CONFIG_SECRET_KEYRING', have_keyring)
24352edd2c04SPaolo Bonzini
2436622753d2SPaolo Bonzinihave_cpuid_h = cc.links('''
2437622753d2SPaolo Bonzini  #include <cpuid.h>
2438622753d2SPaolo Bonzini  int main(void) {
2439622753d2SPaolo Bonzini    unsigned a, b, c, d;
2440622753d2SPaolo Bonzini    unsigned max = __get_cpuid_max(0, 0);
2441622753d2SPaolo Bonzini
2442622753d2SPaolo Bonzini    if (max >= 1) {
2443622753d2SPaolo Bonzini        __cpuid(1, a, b, c, d);
2444622753d2SPaolo Bonzini    }
2445622753d2SPaolo Bonzini
2446622753d2SPaolo Bonzini    if (max >= 7) {
2447622753d2SPaolo Bonzini        __cpuid_count(7, 0, a, b, c, d);
2448622753d2SPaolo Bonzini    }
2449622753d2SPaolo Bonzini
2450622753d2SPaolo Bonzini    return 0;
2451622753d2SPaolo Bonzini  }''')
2452622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_CPUID_H', have_cpuid_h)
2453622753d2SPaolo Bonzini
2454622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \
2455622753d2SPaolo Bonzini  .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \
2456622753d2SPaolo Bonzini  .require(cc.links('''
2457622753d2SPaolo Bonzini    #include <cpuid.h>
2458622753d2SPaolo Bonzini    #include <immintrin.h>
2459701ea587SRichard Henderson    static int __attribute__((target("avx2"))) bar(void *a) {
2460622753d2SPaolo Bonzini      __m256i x = *(__m256i *)a;
2461622753d2SPaolo Bonzini      return _mm256_testz_si256(x, x);
2462622753d2SPaolo Bonzini    }
2463b5d3dac1SPaolo Bonzini    int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
2464622753d2SPaolo Bonzini  '''), error_message: 'AVX2 not available').allowed())
2465622753d2SPaolo Bonzini
2466622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_AVX512F_OPT', get_option('avx512f') \
2467622753d2SPaolo Bonzini  .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512F') \
2468622753d2SPaolo Bonzini  .require(cc.links('''
2469622753d2SPaolo Bonzini    #include <cpuid.h>
2470622753d2SPaolo Bonzini    #include <immintrin.h>
2471701ea587SRichard Henderson    static int __attribute__((target("avx512f"))) bar(void *a) {
2472622753d2SPaolo Bonzini      __m512i x = *(__m512i *)a;
2473622753d2SPaolo Bonzini      return _mm512_test_epi64_mask(x, x);
2474622753d2SPaolo Bonzini    }
2475b5d3dac1SPaolo Bonzini    int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
2476622753d2SPaolo Bonzini  '''), error_message: 'AVX512F not available').allowed())
2477622753d2SPaolo Bonzini
247804ffce13Sling xuconfig_host_data.set('CONFIG_AVX512BW_OPT', get_option('avx512bw') \
247904ffce13Sling xu  .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512BW') \
248004ffce13Sling xu  .require(cc.links('''
248104ffce13Sling xu    #include <cpuid.h>
248204ffce13Sling xu    #include <immintrin.h>
2483dc165fcdSRichard Henderson    static int __attribute__((target("avx512bw"))) bar(void *a) {
248404ffce13Sling xu      __m512i *x = a;
248504ffce13Sling xu      __m512i res= _mm512_abs_epi8(*x);
248604ffce13Sling xu      return res[1];
248704ffce13Sling xu    }
248804ffce13Sling xu    int main(int argc, char *argv[]) { return bar(argv[0]); }
248904ffce13Sling xu  '''), error_message: 'AVX512BW not available').allowed())
249004ffce13Sling xu
24913730a734SPaolo Bonzinihave_pvrdma = get_option('pvrdma') \
24923730a734SPaolo Bonzini  .require(rdma.found(), error_message: 'PVRDMA requires OpenFabrics libraries') \
2493354d2d9bSJuan Quintela  .require(cc.compiles(gnu_source_prefix + '''
2494354d2d9bSJuan Quintela    #include <sys/mman.h>
24953730a734SPaolo Bonzini    int main(void)
24963730a734SPaolo Bonzini    {
24973730a734SPaolo Bonzini      char buf = 0;
24983730a734SPaolo Bonzini      void *addr = &buf;
24993730a734SPaolo Bonzini      addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
25003730a734SPaolo Bonzini
25013730a734SPaolo Bonzini      return 0;
25023730a734SPaolo Bonzini    }'''), error_message: 'PVRDMA requires mremap').allowed()
25033730a734SPaolo Bonzini
25043730a734SPaolo Bonziniif have_pvrdma
2505354d2d9bSJuan Quintela  config_host_data.set('LEGACY_RDMA_REG_MR', not cc.links('''
25063730a734SPaolo Bonzini    #include <infiniband/verbs.h>
25073730a734SPaolo Bonzini    int main(void)
25083730a734SPaolo Bonzini    {
25093730a734SPaolo Bonzini      struct ibv_mr *mr;
25103730a734SPaolo Bonzini      struct ibv_pd *pd = NULL;
25113730a734SPaolo Bonzini      size_t length = 10;
25123730a734SPaolo Bonzini      uint64_t iova = 0;
25133730a734SPaolo Bonzini      int access = 0;
25143730a734SPaolo Bonzini      void *addr = NULL;
25153730a734SPaolo Bonzini
25163730a734SPaolo Bonzini      mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
25173730a734SPaolo Bonzini      ibv_dereg_mr(mr);
25183730a734SPaolo Bonzini      return 0;
25193730a734SPaolo Bonzini    }'''))
25203730a734SPaolo Bonziniendif
25213730a734SPaolo Bonzini
2522b87df904SPaolo Bonziniif get_option('membarrier').disabled()
2523b87df904SPaolo Bonzini  have_membarrier = false
2524b87df904SPaolo Bonzinielif targetos == 'windows'
2525b87df904SPaolo Bonzini  have_membarrier = true
2526b87df904SPaolo Bonzinielif targetos == 'linux'
2527b87df904SPaolo Bonzini  have_membarrier = cc.compiles('''
2528b87df904SPaolo Bonzini    #include <linux/membarrier.h>
2529b87df904SPaolo Bonzini    #include <sys/syscall.h>
2530b87df904SPaolo Bonzini    #include <unistd.h>
2531b87df904SPaolo Bonzini    #include <stdlib.h>
2532b87df904SPaolo Bonzini    int main(void) {
2533b87df904SPaolo Bonzini        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
2534b87df904SPaolo Bonzini        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
2535b87df904SPaolo Bonzini        exit(0);
2536b87df904SPaolo Bonzini    }''')
2537b87df904SPaolo Bonziniendif
2538b87df904SPaolo Bonziniconfig_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \
2539b87df904SPaolo Bonzini  .require(have_membarrier, error_message: 'membarrier system call not available') \
2540b87df904SPaolo Bonzini  .allowed())
2541b87df904SPaolo Bonzini
254234b52615SPaolo Bonzinihave_afalg = get_option('crypto_afalg') \
254334b52615SPaolo Bonzini  .require(cc.compiles(gnu_source_prefix + '''
254434b52615SPaolo Bonzini    #include <errno.h>
254534b52615SPaolo Bonzini    #include <sys/types.h>
254634b52615SPaolo Bonzini    #include <sys/socket.h>
254734b52615SPaolo Bonzini    #include <linux/if_alg.h>
254834b52615SPaolo Bonzini    int main(void) {
254934b52615SPaolo Bonzini      int sock;
255034b52615SPaolo Bonzini      sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
255134b52615SPaolo Bonzini      return sock;
255234b52615SPaolo Bonzini    }
255334b52615SPaolo Bonzini  '''), error_message: 'AF_ALG requested but could not be detected').allowed()
255434b52615SPaolo Bonziniconfig_host_data.set('CONFIG_AF_ALG', have_afalg)
255534b52615SPaolo Bonzini
25569d734b85SMarc-André Lureauconfig_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
25579d734b85SMarc-André Lureau  'linux/vm_sockets.h', 'AF_VSOCK',
25589d734b85SMarc-André Lureau  prefix: '#include <sys/socket.h>',
25599d734b85SMarc-André Lureau))
2560bd87a367SPaolo Bonzini
25618821a389SMarc-André Lureauhave_vss = false
2562872b69e6SMarc-André Lureauhave_vss_sdk = false # old xp/2003 SDK
25638821a389SMarc-André Lureauif targetos == 'windows' and link_language == 'cpp'
25648821a389SMarc-André Lureau  have_vss = cxx.compiles('''
25658821a389SMarc-André Lureau    #define __MIDL_user_allocate_free_DEFINED__
256632478cb6SMarc-André Lureau    #include <vss.h>
25678821a389SMarc-André Lureau    int main(void) { return VSS_CTX_BACKUP; }''')
2568872b69e6SMarc-André Lureau  have_vss_sdk = cxx.has_header('vscoordint.h')
25698821a389SMarc-André Lureauendif
2570872b69e6SMarc-André Lureauconfig_host_data.set('HAVE_VSS_SDK', have_vss_sdk)
25718821a389SMarc-André Lureau
2572859aef02SPaolo Bonziniforeach k, v: config_host
2573ce6119dcSPaolo Bonzini  if k.startswith('CONFIG_')
2574859aef02SPaolo Bonzini    config_host_data.set(k, v == 'y' ? 1 : v)
2575859aef02SPaolo Bonzini  endif
2576859aef02SPaolo Bonziniendforeach
2577859aef02SPaolo Bonzini
25786391c772SRichard Henderson# Older versions of MinGW do not import _lock_file and _unlock_file properly.
25796391c772SRichard Henderson# This was fixed for v6.0.0 with commit b48e3ac8969d.
25806391c772SRichard Hendersonif targetos == 'windows'
25816391c772SRichard Henderson  config_host_data.set('HAVE__LOCK_FILE', cc.links('''
25826391c772SRichard Henderson    #include <stdio.h>
25836391c772SRichard Henderson    int main(void) {
25846391c772SRichard Henderson      _lock_file(NULL);
25856391c772SRichard Henderson      _unlock_file(NULL);
25866391c772SRichard Henderson      return 0;
25876391c772SRichard Henderson    }''', name: '_lock_file and _unlock_file'))
25886391c772SRichard Hendersonendif
25896391c772SRichard Henderson
2590dbd672c8SPierrick Bouvierif targetos == 'windows'
2591dbd672c8SPierrick Bouvier  mingw_has_setjmp_longjmp = cc.links('''
2592dbd672c8SPierrick Bouvier    #include <setjmp.h>
2593dbd672c8SPierrick Bouvier    int main(void) {
2594dbd672c8SPierrick Bouvier      /*
2595dbd672c8SPierrick Bouvier       * These functions are not available in setjmp header, but may be
2596dbd672c8SPierrick Bouvier       * available at link time, from libmingwex.a.
2597dbd672c8SPierrick Bouvier       */
2598dbd672c8SPierrick Bouvier      extern int __mingw_setjmp(jmp_buf);
2599dbd672c8SPierrick Bouvier      extern void __attribute__((noreturn)) __mingw_longjmp(jmp_buf, int);
2600dbd672c8SPierrick Bouvier      jmp_buf env;
2601dbd672c8SPierrick Bouvier      __mingw_setjmp(env);
2602dbd672c8SPierrick Bouvier      __mingw_longjmp(env, 0);
2603dbd672c8SPierrick Bouvier    }
2604dbd672c8SPierrick Bouvier  ''', name: 'mingw setjmp and longjmp')
2605dbd672c8SPierrick Bouvier
2606dbd672c8SPierrick Bouvier  if cpu == 'aarch64' and not mingw_has_setjmp_longjmp
2607dbd672c8SPierrick Bouvier    error('mingw must provide setjmp/longjmp for windows-arm64')
2608dbd672c8SPierrick Bouvier  endif
2609dbd672c8SPierrick Bouvierendif
2610dbd672c8SPierrick Bouvier
2611a0c9162cSPaolo Bonzini########################
2612a0c9162cSPaolo Bonzini# Target configuration #
2613a0c9162cSPaolo Bonzini########################
2614a0c9162cSPaolo Bonzini
26152becc36aSPaolo Bonziniminikconf = find_program('scripts/minikconf.py')
261605512f55SPaolo Bonziniconfig_all = {}
2617a98006bcSPaolo Bonziniconfig_all_devices = {}
2618ca0fc784SPaolo Bonziniconfig_all_disas = {}
26192becc36aSPaolo Bonziniconfig_devices_mak_list = []
26202becc36aSPaolo Bonziniconfig_devices_h = {}
2621859aef02SPaolo Bonziniconfig_target_h = {}
26222becc36aSPaolo Bonziniconfig_target_mak = {}
2623ca0fc784SPaolo Bonzini
2624ca0fc784SPaolo Bonzinidisassemblers = {
2625ca0fc784SPaolo Bonzini  'alpha' : ['CONFIG_ALPHA_DIS'],
2626ca0fc784SPaolo Bonzini  'avr' : ['CONFIG_AVR_DIS'],
2627ca0fc784SPaolo Bonzini  'cris' : ['CONFIG_CRIS_DIS'],
26283e7a84eeSTaylor Simpson  'hexagon' : ['CONFIG_HEXAGON_DIS'],
2629ca0fc784SPaolo Bonzini  'hppa' : ['CONFIG_HPPA_DIS'],
2630ca0fc784SPaolo Bonzini  'i386' : ['CONFIG_I386_DIS'],
2631ca0fc784SPaolo Bonzini  'x86_64' : ['CONFIG_I386_DIS'],
2632ca0fc784SPaolo Bonzini  'm68k' : ['CONFIG_M68K_DIS'],
2633ca0fc784SPaolo Bonzini  'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
2634ca0fc784SPaolo Bonzini  'mips' : ['CONFIG_MIPS_DIS'],
2635ca0fc784SPaolo Bonzini  'nios2' : ['CONFIG_NIOS2_DIS'],
2636ca0fc784SPaolo Bonzini  'or1k' : ['CONFIG_OPENRISC_DIS'],
2637ca0fc784SPaolo Bonzini  'ppc' : ['CONFIG_PPC_DIS'],
2638ca0fc784SPaolo Bonzini  'riscv' : ['CONFIG_RISCV_DIS'],
2639ca0fc784SPaolo Bonzini  'rx' : ['CONFIG_RX_DIS'],
2640ca0fc784SPaolo Bonzini  's390' : ['CONFIG_S390_DIS'],
2641ca0fc784SPaolo Bonzini  'sh4' : ['CONFIG_SH4_DIS'],
2642ca0fc784SPaolo Bonzini  'sparc' : ['CONFIG_SPARC_DIS'],
2643ca0fc784SPaolo Bonzini  'xtensa' : ['CONFIG_XTENSA_DIS'],
2644aae1746cSSong Gao  'loongarch' : ['CONFIG_LOONGARCH_DIS'],
2645ca0fc784SPaolo Bonzini}
2646ca0fc784SPaolo Bonzini
2647e1fbd2c4SPaolo Bonzinihave_ivshmem = config_host_data.get('CONFIG_EVENTFD')
26480a189110SPaolo Bonzinihost_kconfig = \
2649537b7248SPaolo Bonzini  (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
26500d04c4c9SPaolo Bonzini  (have_tpm ? ['CONFIG_TPM=y'] : []) + \
26513f0a5d55SMarc-André Lureau  (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
2652ccd250aaSPaolo Bonzini  (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
265388b6e618SPaolo Bonzini  (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \
26549d71037fSPaolo Bonzini  (x11.found() ? ['CONFIG_X11=y'] : []) + \
26552a3129a3SPaolo Bonzini  (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \
26562a3129a3SPaolo Bonzini  (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \
26572a3129a3SPaolo Bonzini  (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
265869202b40SPaolo Bonzini  (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
26590a189110SPaolo Bonzini  ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
26603730a734SPaolo Bonzini  (have_pvrdma ? ['CONFIG_PVRDMA=y'] : []) + \
266155116968SJagannathan Raman  (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \
266255116968SJagannathan Raman  (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : [])
26630a189110SPaolo Bonzini
2664a9a74907SPaolo Bonziniignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
2665ca0fc784SPaolo Bonzini
2666fdb75aefSPaolo Bonzinidefault_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
2667fdb75aefSPaolo Bonziniactual_target_dirs = []
2668fbb4121dSPaolo Bonzinifdt_required = []
2669a81df1b6SPaolo Bonziniforeach target : target_dirs
2670765686d6SPaolo Bonzini  config_target = { 'TARGET_NAME': target.split('-')[0] }
2671765686d6SPaolo Bonzini  if target.endswith('linux-user')
2672fdb75aefSPaolo Bonzini    if targetos != 'linux'
2673fdb75aefSPaolo Bonzini      if default_targets
2674fdb75aefSPaolo Bonzini        continue
2675fdb75aefSPaolo Bonzini      endif
2676fdb75aefSPaolo Bonzini      error('Target @0@ is only available on a Linux host'.format(target))
2677fdb75aefSPaolo Bonzini    endif
2678765686d6SPaolo Bonzini    config_target += { 'CONFIG_LINUX_USER': 'y' }
2679765686d6SPaolo Bonzini  elif target.endswith('bsd-user')
2680fdb75aefSPaolo Bonzini    if 'CONFIG_BSD' not in config_host
2681fdb75aefSPaolo Bonzini      if default_targets
2682fdb75aefSPaolo Bonzini        continue
2683fdb75aefSPaolo Bonzini      endif
2684fdb75aefSPaolo Bonzini      error('Target @0@ is only available on a BSD host'.format(target))
2685fdb75aefSPaolo Bonzini    endif
2686765686d6SPaolo Bonzini    config_target += { 'CONFIG_BSD_USER': 'y' }
2687765686d6SPaolo Bonzini  elif target.endswith('softmmu')
2688765686d6SPaolo Bonzini    config_target += { 'CONFIG_SOFTMMU': 'y' }
2689765686d6SPaolo Bonzini  endif
2690765686d6SPaolo Bonzini  if target.endswith('-user')
2691765686d6SPaolo Bonzini    config_target += {
2692765686d6SPaolo Bonzini      'CONFIG_USER_ONLY': 'y',
2693765686d6SPaolo Bonzini      'CONFIG_QEMU_INTERP_PREFIX':
2694ce6119dcSPaolo Bonzini        get_option('interp_prefix').replace('%M', config_target['TARGET_NAME'])
2695765686d6SPaolo Bonzini    }
2696765686d6SPaolo Bonzini  endif
2697859aef02SPaolo Bonzini
26980a189110SPaolo Bonzini  accel_kconfig = []
26998a19980eSPaolo Bonzini  foreach sym: accelerators
27008a19980eSPaolo Bonzini    if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
27018a19980eSPaolo Bonzini      config_target += { sym: 'y' }
27028a19980eSPaolo Bonzini      config_all += { sym: 'y' }
2703dae0ec15SGerd Hoffmann      if target in modular_tcg
2704dae0ec15SGerd Hoffmann        config_target += { 'CONFIG_TCG_MODULAR': 'y' }
2705dae0ec15SGerd Hoffmann      else
2706dae0ec15SGerd Hoffmann        config_target += { 'CONFIG_TCG_BUILTIN': 'y' }
2707dae0ec15SGerd Hoffmann      endif
27080a189110SPaolo Bonzini      accel_kconfig += [ sym + '=y' ]
27098a19980eSPaolo Bonzini    endif
27108a19980eSPaolo Bonzini  endforeach
27110a189110SPaolo Bonzini  if accel_kconfig.length() == 0
2712fdb75aefSPaolo Bonzini    if default_targets
2713fdb75aefSPaolo Bonzini      continue
2714fdb75aefSPaolo Bonzini    endif
2715fdb75aefSPaolo Bonzini    error('No accelerator available for target @0@'.format(target))
2716fdb75aefSPaolo Bonzini  endif
27178a19980eSPaolo Bonzini
2718fdb75aefSPaolo Bonzini  actual_target_dirs += target
2719812b31d3SAlex Bennée  config_target += keyval.load('configs/targets' / target + '.mak')
2720a9a74907SPaolo Bonzini  config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
2721765686d6SPaolo Bonzini
2722fbb4121dSPaolo Bonzini  if 'TARGET_NEED_FDT' in config_target
2723fbb4121dSPaolo Bonzini    fdt_required += target
2724fbb4121dSPaolo Bonzini  endif
2725fbb4121dSPaolo Bonzini
2726fa73168bSPaolo Bonzini  # Add default keys
2727fa73168bSPaolo Bonzini  if 'TARGET_BASE_ARCH' not in config_target
2728fa73168bSPaolo Bonzini    config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
2729fa73168bSPaolo Bonzini  endif
2730fa73168bSPaolo Bonzini  if 'TARGET_ABI_DIR' not in config_target
2731fa73168bSPaolo Bonzini    config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
2732fa73168bSPaolo Bonzini  endif
2733ee3eb3a7SMarc-André Lureau  if 'TARGET_BIG_ENDIAN' not in config_target
2734ee3eb3a7SMarc-André Lureau    config_target += {'TARGET_BIG_ENDIAN': 'n'}
2735ee3eb3a7SMarc-André Lureau  endif
2736859aef02SPaolo Bonzini
2737ca0fc784SPaolo Bonzini  foreach k, v: disassemblers
2738823eb013SPaolo Bonzini    if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
2739ca0fc784SPaolo Bonzini      foreach sym: v
2740ca0fc784SPaolo Bonzini        config_target += { sym: 'y' }
2741ca0fc784SPaolo Bonzini        config_all_disas += { sym: 'y' }
2742ca0fc784SPaolo Bonzini      endforeach
2743ca0fc784SPaolo Bonzini    endif
2744ca0fc784SPaolo Bonzini  endforeach
2745ca0fc784SPaolo Bonzini
2746859aef02SPaolo Bonzini  config_target_data = configuration_data()
2747859aef02SPaolo Bonzini  foreach k, v: config_target
2748859aef02SPaolo Bonzini    if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
2749859aef02SPaolo Bonzini      # do nothing
2750859aef02SPaolo Bonzini    elif ignored.contains(k)
2751859aef02SPaolo Bonzini      # do nothing
2752859aef02SPaolo Bonzini    elif k == 'TARGET_BASE_ARCH'
2753a9a74907SPaolo Bonzini      # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
2754a9a74907SPaolo Bonzini      # not used to select files from sourcesets.
2755859aef02SPaolo Bonzini      config_target_data.set('TARGET_' + v.to_upper(), 1)
2756765686d6SPaolo Bonzini    elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
2757859aef02SPaolo Bonzini      config_target_data.set_quoted(k, v)
2758859aef02SPaolo Bonzini    elif v == 'y'
2759859aef02SPaolo Bonzini      config_target_data.set(k, 1)
2760ee3eb3a7SMarc-André Lureau    elif v == 'n'
2761ee3eb3a7SMarc-André Lureau      config_target_data.set(k, 0)
2762859aef02SPaolo Bonzini    else
2763859aef02SPaolo Bonzini      config_target_data.set(k, v)
2764859aef02SPaolo Bonzini    endif
2765859aef02SPaolo Bonzini  endforeach
2766cb2c5531SPeter Maydell  config_target_data.set('QEMU_ARCH',
2767cb2c5531SPeter Maydell                         'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
2768859aef02SPaolo Bonzini  config_target_h += {target: configure_file(output: target + '-config-target.h',
2769859aef02SPaolo Bonzini                                               configuration: config_target_data)}
27702becc36aSPaolo Bonzini
27712becc36aSPaolo Bonzini  if target.endswith('-softmmu')
2772d1d5e9eeSAlex Bennée    config_input = meson.get_external_property(target, 'default')
27732becc36aSPaolo Bonzini    config_devices_mak = target + '-config-devices.mak'
27742becc36aSPaolo Bonzini    config_devices_mak = configure_file(
2775d1d5e9eeSAlex Bennée      input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
27762becc36aSPaolo Bonzini      output: config_devices_mak,
27772becc36aSPaolo Bonzini      depfile: config_devices_mak + '.d',
27782becc36aSPaolo Bonzini      capture: true,
27797bc3ca7fSPaolo Bonzini      command: [minikconf,
27807bc3ca7fSPaolo Bonzini                get_option('default_devices') ? '--defconfig' : '--allnoconfig',
27812becc36aSPaolo Bonzini                config_devices_mak, '@DEPFILE@', '@INPUT@',
2782f4063f9cSPhilippe Mathieu-Daudé                host_kconfig, accel_kconfig,
2783f4063f9cSPhilippe Mathieu-Daudé                'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'])
2784859aef02SPaolo Bonzini
2785859aef02SPaolo Bonzini    config_devices_data = configuration_data()
2786859aef02SPaolo Bonzini    config_devices = keyval.load(config_devices_mak)
2787859aef02SPaolo Bonzini    foreach k, v: config_devices
2788859aef02SPaolo Bonzini      config_devices_data.set(k, 1)
2789859aef02SPaolo Bonzini    endforeach
27902becc36aSPaolo Bonzini    config_devices_mak_list += config_devices_mak
2791859aef02SPaolo Bonzini    config_devices_h += {target: configure_file(output: target + '-config-devices.h',
2792859aef02SPaolo Bonzini                                                configuration: config_devices_data)}
2793859aef02SPaolo Bonzini    config_target += config_devices
2794a98006bcSPaolo Bonzini    config_all_devices += config_devices
27952becc36aSPaolo Bonzini  endif
27962becc36aSPaolo Bonzini  config_target_mak += {target: config_target}
2797a81df1b6SPaolo Bonziniendforeach
2798fdb75aefSPaolo Bonzinitarget_dirs = actual_target_dirs
2799a81df1b6SPaolo Bonzini
28002becc36aSPaolo Bonzini# This configuration is used to build files that are shared by
28012becc36aSPaolo Bonzini# multiple binaries, and then extracted out of the "common"
28022becc36aSPaolo Bonzini# static_library target.
28032becc36aSPaolo Bonzini#
28042becc36aSPaolo Bonzini# We do not use all_sources()/all_dependencies(), because it would
28052becc36aSPaolo Bonzini# build literally all source files, including devices only used by
28062becc36aSPaolo Bonzini# targets that are not built for this compilation.  The CONFIG_ALL
28072becc36aSPaolo Bonzini# pseudo symbol replaces it.
28082becc36aSPaolo Bonzini
280905512f55SPaolo Bonziniconfig_all += config_all_devices
28102becc36aSPaolo Bonziniconfig_all += config_host
28112becc36aSPaolo Bonziniconfig_all += config_all_disas
28122becc36aSPaolo Bonziniconfig_all += {
281314efd8d3SPaolo Bonzini  'CONFIG_XEN': xen.found(),
28142becc36aSPaolo Bonzini  'CONFIG_SOFTMMU': have_system,
28152becc36aSPaolo Bonzini  'CONFIG_USER_ONLY': have_user,
28162becc36aSPaolo Bonzini  'CONFIG_ALL': true,
28172becc36aSPaolo Bonzini}
28182becc36aSPaolo Bonzini
2819eed56e9aSPaolo Bonzinitarget_configs_h = []
2820eed56e9aSPaolo Bonziniforeach target: target_dirs
2821eed56e9aSPaolo Bonzini  target_configs_h += config_target_h[target]
2822eed56e9aSPaolo Bonzini  target_configs_h += config_devices_h.get(target, [])
2823eed56e9aSPaolo Bonziniendforeach
2824eed56e9aSPaolo Bonzinigenh += custom_target('config-poison.h',
2825eed56e9aSPaolo Bonzini                      input: [target_configs_h],
2826eed56e9aSPaolo Bonzini                      output: 'config-poison.h',
2827eed56e9aSPaolo Bonzini                      capture: true,
2828eed56e9aSPaolo Bonzini                      command: [find_program('scripts/make-config-poison.sh'),
2829eed56e9aSPaolo Bonzini                                target_configs_h])
2830eed56e9aSPaolo Bonzini
2831a0c9162cSPaolo Bonzini##############
2832a0c9162cSPaolo Bonzini# Submodules #
2833a0c9162cSPaolo Bonzini##############
28348b18cdbfSRichard Henderson
28358b18cdbfSRichard Hendersoncapstone = not_found
283683602083SThomas Huthif not get_option('capstone').auto() or have_system or have_user
283743ecd166SThomas Huth  capstone = dependency('capstone', version: '>=3.0.5',
2838063d5119SPaolo Bonzini                        method: 'pkg-config',
283983602083SThomas Huth                        required: get_option('capstone'))
28408f4aea71SDaniel P. Berrangé
28418f4aea71SDaniel P. Berrangé  # Some versions of capstone have broken pkg-config file
28428f4aea71SDaniel P. Berrangé  # that reports a wrong -I path, causing the #include to
28438f4aea71SDaniel P. Berrangé  # fail later. If the system has such a broken version
28448f4aea71SDaniel P. Berrangé  # do not use it.
28458f4aea71SDaniel P. Berrangé  if capstone.found() and not cc.compiles('#include <capstone.h>',
28468f4aea71SDaniel P. Berrangé                                          dependencies: [capstone])
28478f4aea71SDaniel P. Berrangé    capstone = not_found
284883602083SThomas Huth    if get_option('capstone').enabled()
284983602083SThomas Huth      error('capstone requested, but it does not appear to work')
28508f4aea71SDaniel P. Berrangé    endif
28518f4aea71SDaniel P. Berrangé  endif
28528b18cdbfSRichard Hendersonendif
28534d34a86bSPaolo Bonzini
285455116968SJagannathan Ramanlibvfio_user_dep = not_found
285555116968SJagannathan Ramanif have_system and vfio_user_server_allowed
285655116968SJagannathan Raman  have_internal = fs.exists(meson.current_source_dir() / 'subprojects/libvfio-user/meson.build')
285755116968SJagannathan Raman
285855116968SJagannathan Raman  if not have_internal
285955116968SJagannathan Raman    error('libvfio-user source not found - please pull git submodule')
286055116968SJagannathan Raman  endif
286155116968SJagannathan Raman
286255116968SJagannathan Raman  libvfio_user_proj = subproject('libvfio-user')
286355116968SJagannathan Raman
28645328353cSPaolo Bonzini  libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep')
286555116968SJagannathan Ramanendif
286655116968SJagannathan Raman
2867fbb4121dSPaolo Bonzinifdt = not_found
2868fbb4121dSPaolo Bonziniif have_system
2869c593d841SPhilippe Mathieu-Daudé  fdt_opt = get_option('fdt')
2870fbb4121dSPaolo Bonzini  if fdt_opt in ['enabled', 'auto', 'system']
2871fbb4121dSPaolo Bonzini    have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
2872063d5119SPaolo Bonzini    fdt = cc.find_library('fdt',
2873fbb4121dSPaolo Bonzini                          required: fdt_opt == 'system' or
2874fbb4121dSPaolo Bonzini                                    fdt_opt == 'enabled' and not have_internal)
2875fbb4121dSPaolo Bonzini    if fdt.found() and cc.links('''
2876fbb4121dSPaolo Bonzini       #include <libfdt.h>
2877fbb4121dSPaolo Bonzini       #include <libfdt_env.h>
2878de47b0ffSThomas Huth       int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
2879fbb4121dSPaolo Bonzini         dependencies: fdt)
2880fbb4121dSPaolo Bonzini      fdt_opt = 'system'
28816c22853cSThomas Huth    elif fdt_opt == 'system'
28826c22853cSThomas Huth       error('system libfdt requested, but it is too old (1.5.1 or newer required)')
2883fbb4121dSPaolo Bonzini    elif have_internal
2884fbb4121dSPaolo Bonzini      fdt_opt = 'internal'
2885fbb4121dSPaolo Bonzini    else
2886fbb4121dSPaolo Bonzini      fdt_opt = 'disabled'
288787daf898SThomas Huth      fdt = not_found
2888fbb4121dSPaolo Bonzini    endif
2889fbb4121dSPaolo Bonzini  endif
2890fbb4121dSPaolo Bonzini  if fdt_opt == 'internal'
2891fbb4121dSPaolo Bonzini    fdt_files = files(
2892fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt.c',
2893fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_ro.c',
2894fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_wip.c',
2895fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_sw.c',
2896fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_rw.c',
2897fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_strerror.c',
2898fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_empty_tree.c',
2899fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_addresses.c',
2900fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_overlay.c',
2901fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_check.c',
2902fbb4121dSPaolo Bonzini    )
2903fbb4121dSPaolo Bonzini
2904fbb4121dSPaolo Bonzini    fdt_inc = include_directories('dtc/libfdt')
2905fbb4121dSPaolo Bonzini    libfdt = static_library('fdt',
2906610e7e0eSPhilippe Mathieu-Daudé                            build_by_default: false,
2907fbb4121dSPaolo Bonzini                            sources: fdt_files,
2908fbb4121dSPaolo Bonzini                            include_directories: fdt_inc)
2909fbb4121dSPaolo Bonzini    fdt = declare_dependency(link_with: libfdt,
2910fbb4121dSPaolo Bonzini                             include_directories: fdt_inc)
2911fbb4121dSPaolo Bonzini  endif
2912c593d841SPhilippe Mathieu-Daudéelse
2913c593d841SPhilippe Mathieu-Daudé  fdt_opt = 'disabled'
2914fbb4121dSPaolo Bonziniendif
2915fbb4121dSPaolo Bonziniif not fdt.found() and fdt_required.length() > 0
2916fbb4121dSPaolo Bonzini  error('fdt not available but required by targets ' + ', '.join(fdt_required))
2917fbb4121dSPaolo Bonziniendif
2918fbb4121dSPaolo Bonzini
29198b18cdbfSRichard Hendersonconfig_host_data.set('CONFIG_CAPSTONE', capstone.found())
2920fbb4121dSPaolo Bonziniconfig_host_data.set('CONFIG_FDT', fdt.found())
29214d34a86bSPaolo Bonziniconfig_host_data.set('CONFIG_SLIRP', slirp.found())
29228b18cdbfSRichard Henderson
2923a0c9162cSPaolo Bonzini#####################
2924a0c9162cSPaolo Bonzini# Generated sources #
2925a0c9162cSPaolo Bonzini#####################
29268b18cdbfSRichard Henderson
2927a0c9162cSPaolo Bonzinigenh += configure_file(output: 'config-host.h', configuration: config_host_data)
2928a81df1b6SPaolo Bonzini
29293f885659SMarc-André Lureauhxtool = find_program('scripts/hxtool')
2930e2c4012bSMarc-André Lureaushaderinclude = find_program('scripts/shaderinclude.py')
2931a81df1b6SPaolo Bonziniqapi_gen = find_program('scripts/qapi-gen.py')
2932654d6b04SPaolo Bonziniqapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
2933654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/commands.py',
2934654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/common.py',
2935654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/error.py',
2936654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/events.py',
2937654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/expr.py',
2938654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/gen.py',
2939654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/introspect.py',
294088d357d2SMarkus Armbruster                     meson.current_source_dir() / 'scripts/qapi/main.py',
2941654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/parser.py',
2942654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/schema.py',
2943654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/source.py',
2944654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/types.py',
2945654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/visit.py',
2946654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi-gen.py'
2947a81df1b6SPaolo Bonzini]
2948a81df1b6SPaolo Bonzini
2949a81df1b6SPaolo Bonzinitracetool = [
2950a81df1b6SPaolo Bonzini  python, files('scripts/tracetool.py'),
29519c29b741SPaolo Bonzini   '--backend=' + ','.join(get_option('trace_backends'))
2952a81df1b6SPaolo Bonzini]
29530572d6cdSStefan Hajnoczitracetool_depends = files(
29540572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/log.py',
29550572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/__init__.py',
29560572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/dtrace.py',
29570572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/ftrace.py',
29580572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/simple.py',
29590572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/syslog.py',
29600572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/ust.py',
29610572d6cdSStefan Hajnoczi  'scripts/tracetool/format/ust_events_c.py',
29620572d6cdSStefan Hajnoczi  'scripts/tracetool/format/ust_events_h.py',
29630572d6cdSStefan Hajnoczi  'scripts/tracetool/format/__init__.py',
29640572d6cdSStefan Hajnoczi  'scripts/tracetool/format/d.py',
29650572d6cdSStefan Hajnoczi  'scripts/tracetool/format/simpletrace_stap.py',
29660572d6cdSStefan Hajnoczi  'scripts/tracetool/format/c.py',
29670572d6cdSStefan Hajnoczi  'scripts/tracetool/format/h.py',
29680572d6cdSStefan Hajnoczi  'scripts/tracetool/format/log_stap.py',
29690572d6cdSStefan Hajnoczi  'scripts/tracetool/format/stap.py',
29700572d6cdSStefan Hajnoczi  'scripts/tracetool/__init__.py',
29710572d6cdSStefan Hajnoczi  'scripts/tracetool/vcpu.py'
29720572d6cdSStefan Hajnoczi)
2973a81df1b6SPaolo Bonzini
29742c273f32SMarc-André Lureauqemu_version_cmd = [find_program('scripts/qemu-version.sh'),
29752c273f32SMarc-André Lureau                    meson.current_source_dir(),
2976b0b4323eSPaolo Bonzini                    get_option('pkgversion'), meson.project_version()]
29772c273f32SMarc-André Lureauqemu_version = custom_target('qemu-version.h',
29782c273f32SMarc-André Lureau                             output: 'qemu-version.h',
29792c273f32SMarc-André Lureau                             command: qemu_version_cmd,
29802c273f32SMarc-André Lureau                             capture: true,
29812c273f32SMarc-André Lureau                             build_by_default: true,
29822c273f32SMarc-André Lureau                             build_always_stale: true)
29832c273f32SMarc-André Lureaugenh += qemu_version
29842c273f32SMarc-André Lureau
29853f885659SMarc-André Lureauhxdep = []
29863f885659SMarc-André Lureauhx_headers = [
29873f885659SMarc-André Lureau  ['qemu-options.hx', 'qemu-options.def'],
29883f885659SMarc-André Lureau  ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
29893f885659SMarc-André Lureau]
29903f885659SMarc-André Lureauif have_system
29913f885659SMarc-André Lureau  hx_headers += [
29923f885659SMarc-André Lureau    ['hmp-commands.hx', 'hmp-commands.h'],
29933f885659SMarc-André Lureau    ['hmp-commands-info.hx', 'hmp-commands-info.h'],
29943f885659SMarc-André Lureau  ]
29953f885659SMarc-André Lureauendif
29963f885659SMarc-André Lureauforeach d : hx_headers
2997b7c70bf2SMarc-André Lureau  hxdep += custom_target(d[1],
29983f885659SMarc-André Lureau                input: files(d[0]),
29993f885659SMarc-André Lureau                output: d[1],
30003f885659SMarc-André Lureau                capture: true,
30013f885659SMarc-André Lureau                build_by_default: true, # to be removed when added to a target
30023f885659SMarc-André Lureau                command: [hxtool, '-h', '@INPUT0@'])
30033f885659SMarc-André Lureauendforeach
30043f885659SMarc-André Lureaugenh += hxdep
30053f885659SMarc-André Lureau
3006a0c9162cSPaolo Bonzini###################
3007a0c9162cSPaolo Bonzini# Collect sources #
3008a0c9162cSPaolo Bonzini###################
3009a81df1b6SPaolo Bonzini
301055567891SPhilippe Mathieu-Daudéauthz_ss = ss.source_set()
30117e2b888fSPhilippe Mathieu-Daudéblockdev_ss = ss.source_set()
30127e2b888fSPhilippe Mathieu-Daudéblock_ss = ss.source_set()
3013c2306d71SPhilippe Mathieu-Daudéchardev_ss = ss.source_set()
30147e2b888fSPhilippe Mathieu-Daudécommon_ss = ss.source_set()
30152389304aSPhilippe Mathieu-Daudécrypto_ss = ss.source_set()
3016f73fb063SPhilippe Mathieu-Daudéhwcore_ss = ss.source_set()
3017f78536b1SPhilippe Mathieu-Daudéio_ss = ss.source_set()
30187e2b888fSPhilippe Mathieu-Daudéqmp_ss = ss.source_set()
3019da33fc09SPhilippe Mathieu-Daudéqom_ss = ss.source_set()
30207e2b888fSPhilippe Mathieu-Daudésoftmmu_ss = ss.source_set()
30217e2b888fSPhilippe Mathieu-Daudéspecific_fuzz_ss = ss.source_set()
30227e2b888fSPhilippe Mathieu-Daudéspecific_ss = ss.source_set()
3023a81df1b6SPaolo Bonzinistub_ss = ss.source_set()
3024a81df1b6SPaolo Bonzinitrace_ss = ss.source_set()
30252becc36aSPaolo Bonziniuser_ss = ss.source_set()
30267e2b888fSPhilippe Mathieu-Daudéutil_ss = ss.source_set()
30272becc36aSPaolo Bonzini
3028c94a7b88SGerd Hoffmann# accel modules
3029c94a7b88SGerd Hoffmannqtest_module_ss = ss.source_set()
3030dae0ec15SGerd Hoffmanntcg_module_ss = ss.source_set()
3031c94a7b88SGerd Hoffmann
30323154fee4SMarc-André Lureaumodules = {}
3033db2e89dfSGerd Hoffmanntarget_modules = {}
30342becc36aSPaolo Bonzinihw_arch = {}
30352becc36aSPaolo Bonzinitarget_arch = {}
30362becc36aSPaolo Bonzinitarget_softmmu_arch = {}
303746369b50SPhilippe Mathieu-Daudétarget_user_arch = {}
3038a81df1b6SPaolo Bonzini
3039a81df1b6SPaolo Bonzini###############
3040a81df1b6SPaolo Bonzini# Trace files #
3041a81df1b6SPaolo Bonzini###############
3042a81df1b6SPaolo Bonzini
3043c9322ab5SMarc-André Lureau# TODO: add each directory to the subdirs from its own meson.build, once
3044c9322ab5SMarc-André Lureau# we have those
3045a81df1b6SPaolo Bonzinitrace_events_subdirs = [
3046a81df1b6SPaolo Bonzini  'crypto',
304769ff4d0aSPhilippe Mathieu-Daudé  'qapi',
304869ff4d0aSPhilippe Mathieu-Daudé  'qom',
3049a81df1b6SPaolo Bonzini  'monitor',
305069ff4d0aSPhilippe Mathieu-Daudé  'util',
3051842b42dfSAlex Bennée  'gdbstub',
3052a81df1b6SPaolo Bonzini]
30536ddc1abeSWarner Loshif have_linux_user
3054a81df1b6SPaolo Bonzini  trace_events_subdirs += [ 'linux-user' ]
3055a81df1b6SPaolo Bonziniendif
30566ddc1abeSWarner Loshif have_bsd_user
30576ddc1abeSWarner Losh  trace_events_subdirs += [ 'bsd-user' ]
30586ddc1abeSWarner Loshendif
3059a81df1b6SPaolo Bonziniif have_block
3060a81df1b6SPaolo Bonzini  trace_events_subdirs += [
3061a81df1b6SPaolo Bonzini    'authz',
3062a81df1b6SPaolo Bonzini    'block',
3063a81df1b6SPaolo Bonzini    'io',
3064a81df1b6SPaolo Bonzini    'nbd',
3065a81df1b6SPaolo Bonzini    'scsi',
3066a81df1b6SPaolo Bonzini  ]
3067a81df1b6SPaolo Bonziniendif
3068a81df1b6SPaolo Bonziniif have_system
3069a81df1b6SPaolo Bonzini  trace_events_subdirs += [
30708985db26SPhilippe Mathieu-Daudé    'accel/kvm',
3071a81df1b6SPaolo Bonzini    'audio',
3072a81df1b6SPaolo Bonzini    'backends',
3073a81df1b6SPaolo Bonzini    'backends/tpm',
3074a81df1b6SPaolo Bonzini    'chardev',
307546627f41SAndrew Melnychenko    'ebpf',
3076a81df1b6SPaolo Bonzini    'hw/9pfs',
3077a81df1b6SPaolo Bonzini    'hw/acpi',
307877c05b0bSHao Wu    'hw/adc',
3079a81df1b6SPaolo Bonzini    'hw/alpha',
3080a81df1b6SPaolo Bonzini    'hw/arm',
3081a81df1b6SPaolo Bonzini    'hw/audio',
3082a81df1b6SPaolo Bonzini    'hw/block',
3083a81df1b6SPaolo Bonzini    'hw/block/dataplane',
3084a81df1b6SPaolo Bonzini    'hw/char',
3085a81df1b6SPaolo Bonzini    'hw/display',
3086a81df1b6SPaolo Bonzini    'hw/dma',
3087a81df1b6SPaolo Bonzini    'hw/hyperv',
3088a81df1b6SPaolo Bonzini    'hw/i2c',
3089a81df1b6SPaolo Bonzini    'hw/i386',
3090a81df1b6SPaolo Bonzini    'hw/i386/xen',
3091aa98ee38SDavid Woodhouse    'hw/i386/kvm',
3092a81df1b6SPaolo Bonzini    'hw/ide',
3093a81df1b6SPaolo Bonzini    'hw/input',
3094a81df1b6SPaolo Bonzini    'hw/intc',
3095a81df1b6SPaolo Bonzini    'hw/isa',
3096a81df1b6SPaolo Bonzini    'hw/mem',
3097a81df1b6SPaolo Bonzini    'hw/mips',
3098a81df1b6SPaolo Bonzini    'hw/misc',
3099a81df1b6SPaolo Bonzini    'hw/misc/macio',
3100a81df1b6SPaolo Bonzini    'hw/net',
310198e5d7a2SVikram Garhwal    'hw/net/can',
3102ce0e6a2cSMark Cave-Ayland    'hw/nubus',
310388eea45cSKlaus Jensen    'hw/nvme',
3104a81df1b6SPaolo Bonzini    'hw/nvram',
3105a81df1b6SPaolo Bonzini    'hw/pci',
3106a81df1b6SPaolo Bonzini    'hw/pci-host',
3107a81df1b6SPaolo Bonzini    'hw/ppc',
3108a81df1b6SPaolo Bonzini    'hw/rdma',
3109a81df1b6SPaolo Bonzini    'hw/rdma/vmw',
3110a81df1b6SPaolo Bonzini    'hw/rtc',
3111a81df1b6SPaolo Bonzini    'hw/s390x',
3112a81df1b6SPaolo Bonzini    'hw/scsi',
3113a81df1b6SPaolo Bonzini    'hw/sd',
3114ad52cfc1SBALATON Zoltan    'hw/sh4',
3115a81df1b6SPaolo Bonzini    'hw/sparc',
3116a81df1b6SPaolo Bonzini    'hw/sparc64',
3117a81df1b6SPaolo Bonzini    'hw/ssi',
3118a81df1b6SPaolo Bonzini    'hw/timer',
3119a81df1b6SPaolo Bonzini    'hw/tpm',
3120a81df1b6SPaolo Bonzini    'hw/usb',
3121a81df1b6SPaolo Bonzini    'hw/vfio',
3122a81df1b6SPaolo Bonzini    'hw/virtio',
3123a81df1b6SPaolo Bonzini    'hw/watchdog',
3124a81df1b6SPaolo Bonzini    'hw/xen',
3125a81df1b6SPaolo Bonzini    'hw/gpio',
3126a81df1b6SPaolo Bonzini    'migration',
3127a81df1b6SPaolo Bonzini    'net',
31288b7a5507SPhilippe Mathieu-Daudé    'softmmu',
3129a81df1b6SPaolo Bonzini    'ui',
3130ad22c308SElena Ufimtseva    'hw/remote',
3131a81df1b6SPaolo Bonzini  ]
3132a81df1b6SPaolo Bonziniendif
31338985db26SPhilippe Mathieu-Daudéif have_system or have_user
31348985db26SPhilippe Mathieu-Daudé  trace_events_subdirs += [
31358985db26SPhilippe Mathieu-Daudé    'accel/tcg',
31368985db26SPhilippe Mathieu-Daudé    'hw/core',
31378985db26SPhilippe Mathieu-Daudé    'target/arm',
3138a1477da3SAlexander Graf    'target/arm/hvf',
31398985db26SPhilippe Mathieu-Daudé    'target/hppa',
31408985db26SPhilippe Mathieu-Daudé    'target/i386',
31418985db26SPhilippe Mathieu-Daudé    'target/i386/kvm',
314234b8ff25SPhilippe Mathieu-Daudé    'target/mips/tcg',
31436f83e277SRichard Henderson    'target/nios2',
31448985db26SPhilippe Mathieu-Daudé    'target/ppc',
31458985db26SPhilippe Mathieu-Daudé    'target/riscv',
31468985db26SPhilippe Mathieu-Daudé    'target/s390x',
314767043607SCho, Yu-Chen    'target/s390x/kvm',
31488985db26SPhilippe Mathieu-Daudé    'target/sparc',
31498985db26SPhilippe Mathieu-Daudé  ]
31508985db26SPhilippe Mathieu-Daudéendif
3151a81df1b6SPaolo Bonzini
31520df750e9SMarc-André Lureauvhost_user = not_found
31532a3129a3SPaolo Bonziniif targetos == 'linux' and have_vhost_user
31540df750e9SMarc-André Lureau  libvhost_user = subproject('libvhost-user')
31550df750e9SMarc-André Lureau  vhost_user = libvhost_user.get_variable('vhost_user_dep')
31560df750e9SMarc-André Lureauendif
31570df750e9SMarc-André Lureau
3158a6caeee8SXie Yongjilibvduse = not_found
3159a6caeee8SXie Yongjiif have_libvduse
3160a6caeee8SXie Yongji  libvduse_proj = subproject('libvduse')
3161a6caeee8SXie Yongji  libvduse = libvduse_proj.get_variable('libvduse_dep')
3162a6caeee8SXie Yongjiendif
3163a6caeee8SXie Yongji
3164b83a80e8SVladimir Sementsov-Ogievskiy# NOTE: the trace/ subdirectory needs the qapi_trace_events variable
3165b83a80e8SVladimir Sementsov-Ogievskiy# that is filled in by qapi/.
3166a81df1b6SPaolo Bonzinisubdir('qapi')
3167a81df1b6SPaolo Bonzinisubdir('qobject')
3168a81df1b6SPaolo Bonzinisubdir('stubs')
3169a81df1b6SPaolo Bonzinisubdir('trace')
3170a81df1b6SPaolo Bonzinisubdir('util')
31715582c58fSMarc-André Lureausubdir('qom')
31725582c58fSMarc-André Lureausubdir('authz')
3173a81df1b6SPaolo Bonzinisubdir('crypto')
31742d78b56eSMarc-André Lureausubdir('ui')
31757d5983e3SNicolas Saenz Juliennesubdir('hw')
3176842b42dfSAlex Bennéesubdir('gdbstub')
3177a81df1b6SPaolo Bonzini
31783154fee4SMarc-André Lureauif enable_modules
31793154fee4SMarc-André Lureau  libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
31803154fee4SMarc-André Lureau  modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
31813154fee4SMarc-André Lureauendif
31823154fee4SMarc-André Lureau
31837d5983e3SNicolas Saenz Julienneqom_ss = qom_ss.apply(config_host, strict: false)
31847d5983e3SNicolas Saenz Juliennelibqom = static_library('qom', qom_ss.sources() + genh,
31857d5983e3SNicolas Saenz Julienne                        dependencies: [qom_ss.dependencies()],
31867d5983e3SNicolas Saenz Julienne                        name_suffix: 'fa')
31877d5983e3SNicolas Saenz Julienneqom = declare_dependency(link_whole: libqom)
31887d5983e3SNicolas Saenz Julienne
31897d5983e3SNicolas Saenz Julienneevent_loop_base = files('event-loop-base.c')
31907d5983e3SNicolas Saenz Julienneevent_loop_base = static_library('event-loop-base', sources: event_loop_base + genh,
31917d5983e3SNicolas Saenz Julienne                                 build_by_default: true)
31927d5983e3SNicolas Saenz Julienneevent_loop_base = declare_dependency(link_whole: event_loop_base,
31937d5983e3SNicolas Saenz Julienne                                     dependencies: [qom])
31947d5983e3SNicolas Saenz Julienne
31952becc36aSPaolo Bonzinistub_ss = stub_ss.apply(config_all, strict: false)
3196a81df1b6SPaolo Bonzini
3197a81df1b6SPaolo Bonziniutil_ss.add_all(trace_ss)
31982becc36aSPaolo Bonziniutil_ss = util_ss.apply(config_all, strict: false)
3199a81df1b6SPaolo Bonzinilibqemuutil = static_library('qemuutil',
3200a81df1b6SPaolo Bonzini                             sources: util_ss.sources() + stub_ss.sources() + genh,
32016d7c7c2dSPaolo Bonzini                             dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman])
3202a81df1b6SPaolo Bonziniqemuutil = declare_dependency(link_with: libqemuutil,
320370ac26b9SNicolas Saenz Julienne                              sources: genh + version_res,
320470ac26b9SNicolas Saenz Julienne                              dependencies: [event_loop_base])
3205a81df1b6SPaolo Bonzini
3206957b31f6SPhilippe Mathieu-Daudéif have_system or have_user
3207abff1abfSPaolo Bonzini  decodetree = generator(find_program('scripts/decodetree.py'),
3208abff1abfSPaolo Bonzini                         output: 'decode-@BASENAME@.c.inc',
3209abff1abfSPaolo Bonzini                         arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
3210957b31f6SPhilippe Mathieu-Daudé  subdir('libdecnumber')
3211957b31f6SPhilippe Mathieu-Daudé  subdir('target')
3212957b31f6SPhilippe Mathieu-Daudéendif
3213abff1abfSPaolo Bonzini
3214478e943fSPaolo Bonzinisubdir('audio')
32157fcfd456SMarc-André Lureausubdir('io')
3216848e8ff6SMarc-André Lureausubdir('chardev')
3217ec0d5893SMarc-André Lureausubdir('fsdev')
3218708eab42SMarc-André Lureausubdir('dump')
3219ec0d5893SMarc-André Lureau
3220f285bd3fSPhilippe Mathieu-Daudéif have_block
32215e5733e5SMarc-André Lureau  block_ss.add(files(
32225e5733e5SMarc-André Lureau    'block.c',
32235e5733e5SMarc-André Lureau    'blockjob.c',
32245e5733e5SMarc-André Lureau    'job.c',
32255e5733e5SMarc-André Lureau    'qemu-io-cmds.c',
32265e5733e5SMarc-André Lureau  ))
3227406523f6SPaolo Bonzini  if config_host_data.get('CONFIG_REPLICATION')
3228406523f6SPaolo Bonzini    block_ss.add(files('replication.c'))
3229406523f6SPaolo Bonzini  endif
32305e5733e5SMarc-André Lureau
32315e5733e5SMarc-André Lureau  subdir('nbd')
32325e5733e5SMarc-André Lureau  subdir('scsi')
32335e5733e5SMarc-André Lureau  subdir('block')
32345e5733e5SMarc-André Lureau
32354a96337dSPaolo Bonzini  blockdev_ss.add(files(
32364a96337dSPaolo Bonzini    'blockdev.c',
3237cbc20bfbSStefan Hajnoczi    'blockdev-nbd.c',
32384a96337dSPaolo Bonzini    'iothread.c',
32394a96337dSPaolo Bonzini    'job-qmp.c',
32403eacf70bSRoman Bolshakov  ), gnutls)
32414a96337dSPaolo Bonzini
32424a96337dSPaolo Bonzini  # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
32434a96337dSPaolo Bonzini  # os-win32.c does not
32444a96337dSPaolo Bonzini  blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
32454a96337dSPaolo Bonzini  softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
3246f285bd3fSPhilippe Mathieu-Daudéendif
32474a96337dSPaolo Bonzini
32484a96337dSPaolo Bonzinicommon_ss.add(files('cpus-common.c'))
324931ffa2aaSPhilippe Mathieu-Daudéspecific_ss.add(files('cpu.c'))
32504a96337dSPaolo Bonzini
32515d3ea0e1SPaolo Bonzinisubdir('softmmu')
3252c9322ab5SMarc-André Lureau
325344b99a6dSRichard Henderson# Work around a gcc bug/misfeature wherein constant propagation looks
325444b99a6dSRichard Henderson# through an alias:
325544b99a6dSRichard Henderson#   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
325644b99a6dSRichard Henderson# to guess that a const variable is always zero.  Without lto, this is
325744b99a6dSRichard Henderson# impossible, as the alias is restricted to page-vary-common.c.  Indeed,
325844b99a6dSRichard Henderson# without lto, not even the alias is required -- we simply use different
325944b99a6dSRichard Henderson# declarations in different compilation units.
326044b99a6dSRichard Hendersonpagevary = files('page-vary-common.c')
326144b99a6dSRichard Hendersonif get_option('b_lto')
326244b99a6dSRichard Henderson  pagevary_flags = ['-fno-lto']
326344b99a6dSRichard Henderson  if get_option('cfi')
326444b99a6dSRichard Henderson    pagevary_flags += '-fno-sanitize=cfi-icall'
326544b99a6dSRichard Henderson  endif
326654c9b194SThomas Huth  pagevary = static_library('page-vary-common', sources: pagevary + genh,
326744b99a6dSRichard Henderson                            c_args: pagevary_flags)
326844b99a6dSRichard Henderson  pagevary = declare_dependency(link_with: pagevary)
326944b99a6dSRichard Hendersonendif
327044b99a6dSRichard Hendersoncommon_ss.add(pagevary)
32716670d4d0SRichard Hendersonspecific_ss.add(files('page-vary.c'))
32726670d4d0SRichard Henderson
3273ab318051SMarc-André Lureausubdir('backends')
3274c574e161SMarc-André Lureausubdir('disas')
327555166230SMarc-André Lureausubdir('migration')
3276ff219dcaSPaolo Bonzinisubdir('monitor')
3277cdaf0722SMarc-André Lureausubdir('net')
327817ef2af6SMarc-André Lureausubdir('replay')
32798df9f0c3SPhilippe Mathieu-Daudésubdir('semihosting')
3280aa09b3d5SMarkus Armbrustersubdir('stats')
3281104cc2c0SRichard Hendersonsubdir('tcg')
3282c6347541SRichard Hendersonsubdir('fpu')
32831a82878aSMarc-André Lureausubdir('accel')
3284f556b4a1SPaolo Bonzinisubdir('plugins')
3285bbf15aafSRichard Hendersonsubdir('ebpf')
3286bbf15aafSRichard Henderson
3287bbf15aafSRichard Hendersoncommon_user_inc = []
3288bbf15aafSRichard Henderson
3289bbf15aafSRichard Hendersonsubdir('common-user')
3290b309c321SMarc-André Lureausubdir('bsd-user')
32913a30446aSMarc-André Lureausubdir('linux-user')
329246627f41SAndrew Melnychenko
3293a2ce7dbdSPaolo Bonzini# needed for fuzzing binaries
3294a2ce7dbdSPaolo Bonzinisubdir('tests/qtest/libqos')
329564ed6f92SPaolo Bonzinisubdir('tests/qtest/fuzz')
3296a2ce7dbdSPaolo Bonzini
3297c94a7b88SGerd Hoffmann# accel modules
3298dae0ec15SGerd Hoffmanntcg_real_module_ss = ss.source_set()
3299dae0ec15SGerd Hoffmanntcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss)
3300dae0ec15SGerd Hoffmannspecific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss)
3301dae0ec15SGerd Hoffmanntarget_modules += { 'accel' : { 'qtest': qtest_module_ss,
3302dae0ec15SGerd Hoffmann                                'tcg': tcg_real_module_ss }}
3303c94a7b88SGerd Hoffmann
3304a0c9162cSPaolo Bonzini########################
3305a0c9162cSPaolo Bonzini# Library dependencies #
3306a0c9162cSPaolo Bonzini########################
3307a0c9162cSPaolo Bonzini
3308f5723ab6SGerd Hoffmannmodinfo_collect = find_program('scripts/modinfo-collect.py')
33095ebbfeccSGerd Hoffmannmodinfo_generate = find_program('scripts/modinfo-generate.py')
3310f5723ab6SGerd Hoffmannmodinfo_files = []
3311f5723ab6SGerd Hoffmann
33123154fee4SMarc-André Lureaublock_mods = []
33133154fee4SMarc-André Lureausoftmmu_mods = []
33143154fee4SMarc-André Lureauforeach d, list : modules
3315ef709860SPaolo Bonzini  if not (d == 'block' ? have_block : have_system)
3316ef709860SPaolo Bonzini    continue
3317ef709860SPaolo Bonzini  endif
3318ef709860SPaolo Bonzini
33193154fee4SMarc-André Lureau  foreach m, module_ss : list
33206002711cSPaolo Bonzini    if enable_modules
33213e292c51SGerd Hoffmann      module_ss = module_ss.apply(config_all, strict: false)
33223154fee4SMarc-André Lureau      sl = static_library(d + '-' + m, [genh, module_ss.sources()],
33233154fee4SMarc-André Lureau                          dependencies: [modulecommon, module_ss.dependencies()], pic: true)
33243154fee4SMarc-André Lureau      if d == 'block'
33253154fee4SMarc-André Lureau        block_mods += sl
33263154fee4SMarc-André Lureau      else
33273154fee4SMarc-André Lureau        softmmu_mods += sl
33283154fee4SMarc-André Lureau      endif
3329f5723ab6SGerd Hoffmann      if module_ss.sources() != []
3330f5723ab6SGerd Hoffmann        # FIXME: Should use sl.extract_all_objects(recursive: true) as
3331f5723ab6SGerd Hoffmann        # input. Sources can be used multiple times but objects are
3332f5723ab6SGerd Hoffmann        # unique when it comes to lookup in compile_commands.json.
3333f5723ab6SGerd Hoffmann        # Depnds on a mesion version with
3334f5723ab6SGerd Hoffmann        # https://github.com/mesonbuild/meson/pull/8900
3335f5723ab6SGerd Hoffmann        modinfo_files += custom_target(d + '-' + m + '.modinfo',
3336f5723ab6SGerd Hoffmann                                       output: d + '-' + m + '.modinfo',
3337ac347111SPaolo Bonzini                                       input: module_ss.sources() + genh,
3338f5723ab6SGerd Hoffmann                                       capture: true,
3339ac347111SPaolo Bonzini                                       command: [modinfo_collect, module_ss.sources()])
3340f5723ab6SGerd Hoffmann      endif
33413154fee4SMarc-André Lureau    else
33423154fee4SMarc-André Lureau      if d == 'block'
33433154fee4SMarc-André Lureau        block_ss.add_all(module_ss)
33443154fee4SMarc-André Lureau      else
33453154fee4SMarc-André Lureau        softmmu_ss.add_all(module_ss)
33463154fee4SMarc-André Lureau      endif
33473154fee4SMarc-André Lureau    endif
33483154fee4SMarc-André Lureau  endforeach
33493154fee4SMarc-André Lureauendforeach
33503154fee4SMarc-André Lureau
3351db2e89dfSGerd Hoffmannforeach d, list : target_modules
3352db2e89dfSGerd Hoffmann  foreach m, module_ss : list
33536002711cSPaolo Bonzini    if enable_modules
3354db2e89dfSGerd Hoffmann      foreach target : target_dirs
3355db2e89dfSGerd Hoffmann        if target.endswith('-softmmu')
3356db2e89dfSGerd Hoffmann          config_target = config_target_mak[target]
3357db2e89dfSGerd Hoffmann          config_target += config_host
3358db2e89dfSGerd Hoffmann          target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
3359db2e89dfSGerd Hoffmann          c_args = ['-DNEED_CPU_H',
3360db2e89dfSGerd Hoffmann                    '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3361db2e89dfSGerd Hoffmann                    '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3362db2e89dfSGerd Hoffmann          target_module_ss = module_ss.apply(config_target, strict: false)
3363db2e89dfSGerd Hoffmann          if target_module_ss.sources() != []
3364db2e89dfSGerd Hoffmann            module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
3365db2e89dfSGerd Hoffmann            sl = static_library(module_name,
3366db2e89dfSGerd Hoffmann                                [genh, target_module_ss.sources()],
3367db2e89dfSGerd Hoffmann                                dependencies: [modulecommon, target_module_ss.dependencies()],
3368db2e89dfSGerd Hoffmann                                include_directories: target_inc,
3369db2e89dfSGerd Hoffmann                                c_args: c_args,
3370db2e89dfSGerd Hoffmann                                pic: true)
3371db2e89dfSGerd Hoffmann            softmmu_mods += sl
3372db2e89dfSGerd Hoffmann            # FIXME: Should use sl.extract_all_objects(recursive: true) too.
3373db2e89dfSGerd Hoffmann            modinfo_files += custom_target(module_name + '.modinfo',
3374db2e89dfSGerd Hoffmann                                           output: module_name + '.modinfo',
3375917ddc27SGerd Hoffmann                                           input: target_module_ss.sources() + genh,
3376db2e89dfSGerd Hoffmann                                           capture: true,
3377917ddc27SGerd Hoffmann                                           command: [modinfo_collect, '--target', target, target_module_ss.sources()])
3378db2e89dfSGerd Hoffmann          endif
3379db2e89dfSGerd Hoffmann        endif
3380db2e89dfSGerd Hoffmann      endforeach
3381db2e89dfSGerd Hoffmann    else
3382db2e89dfSGerd Hoffmann      specific_ss.add_all(module_ss)
3383db2e89dfSGerd Hoffmann    endif
3384db2e89dfSGerd Hoffmann  endforeach
3385db2e89dfSGerd Hoffmannendforeach
3386db2e89dfSGerd Hoffmann
33875ebbfeccSGerd Hoffmannif enable_modules
338805d6814cSJose R. Ziviani  foreach target : target_dirs
338905d6814cSJose R. Ziviani    if target.endswith('-softmmu')
339005d6814cSJose R. Ziviani      config_target = config_target_mak[target]
339105d6814cSJose R. Ziviani      config_devices_mak = target + '-config-devices.mak'
339205d6814cSJose R. Ziviani      modinfo_src = custom_target('modinfo-' + target + '.c',
339305d6814cSJose R. Ziviani                                  output: 'modinfo-' + target + '.c',
33945ebbfeccSGerd Hoffmann                                  input: modinfo_files,
339505d6814cSJose R. Ziviani                                  command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'],
33965ebbfeccSGerd Hoffmann                                  capture: true)
339705d6814cSJose R. Ziviani
339805d6814cSJose R. Ziviani      modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src)
339905d6814cSJose R. Ziviani      modinfo_dep = declare_dependency(link_with: modinfo_lib)
340005d6814cSJose R. Ziviani
340105d6814cSJose R. Ziviani      arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH']
340205d6814cSJose R. Ziviani      hw_arch[arch].add(modinfo_dep)
340305d6814cSJose R. Ziviani    endif
340405d6814cSJose R. Ziviani  endforeach
34055ebbfeccSGerd Hoffmannendif
34065ebbfeccSGerd Hoffmann
34073154fee4SMarc-André Lureaunm = find_program('nm')
3408604f3e4eSYonggang Luoundefsym = find_program('scripts/undefsym.py')
34093154fee4SMarc-André Lureaublock_syms = custom_target('block.syms', output: 'block.syms',
34103154fee4SMarc-André Lureau                             input: [libqemuutil, block_mods],
34113154fee4SMarc-André Lureau                             capture: true,
34123154fee4SMarc-André Lureau                             command: [undefsym, nm, '@INPUT@'])
34133154fee4SMarc-André Lureauqemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
34143154fee4SMarc-André Lureau                             input: [libqemuutil, softmmu_mods],
34153154fee4SMarc-André Lureau                             capture: true,
34163154fee4SMarc-André Lureau                             command: [undefsym, nm, '@INPUT@'])
34173154fee4SMarc-André Lureau
341855567891SPhilippe Mathieu-Daudéauthz_ss = authz_ss.apply(config_host, strict: false)
341955567891SPhilippe Mathieu-Daudélibauthz = static_library('authz', authz_ss.sources() + genh,
342055567891SPhilippe Mathieu-Daudé                          dependencies: [authz_ss.dependencies()],
342155567891SPhilippe Mathieu-Daudé                          name_suffix: 'fa',
342255567891SPhilippe Mathieu-Daudé                          build_by_default: false)
342355567891SPhilippe Mathieu-Daudé
342455567891SPhilippe Mathieu-Daudéauthz = declare_dependency(link_whole: libauthz,
342555567891SPhilippe Mathieu-Daudé                           dependencies: qom)
342655567891SPhilippe Mathieu-Daudé
34272389304aSPhilippe Mathieu-Daudécrypto_ss = crypto_ss.apply(config_host, strict: false)
34282389304aSPhilippe Mathieu-Daudélibcrypto = static_library('crypto', crypto_ss.sources() + genh,
34292389304aSPhilippe Mathieu-Daudé                           dependencies: [crypto_ss.dependencies()],
34302389304aSPhilippe Mathieu-Daudé                           name_suffix: 'fa',
34312389304aSPhilippe Mathieu-Daudé                           build_by_default: false)
34322389304aSPhilippe Mathieu-Daudé
34332389304aSPhilippe Mathieu-Daudécrypto = declare_dependency(link_whole: libcrypto,
34342389304aSPhilippe Mathieu-Daudé                            dependencies: [authz, qom])
34352389304aSPhilippe Mathieu-Daudé
3436f78536b1SPhilippe Mathieu-Daudéio_ss = io_ss.apply(config_host, strict: false)
3437f78536b1SPhilippe Mathieu-Daudélibio = static_library('io', io_ss.sources() + genh,
3438f78536b1SPhilippe Mathieu-Daudé                       dependencies: [io_ss.dependencies()],
3439f78536b1SPhilippe Mathieu-Daudé                       link_with: libqemuutil,
3440f78536b1SPhilippe Mathieu-Daudé                       name_suffix: 'fa',
3441f78536b1SPhilippe Mathieu-Daudé                       build_by_default: false)
3442f78536b1SPhilippe Mathieu-Daudé
3443f78536b1SPhilippe Mathieu-Daudéio = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
3444f78536b1SPhilippe Mathieu-Daudé
34457e6edef3SPhilippe Mathieu-Daudélibmigration = static_library('migration', sources: migration_files + genh,
34467e6edef3SPhilippe Mathieu-Daudé                              name_suffix: 'fa',
34477e6edef3SPhilippe Mathieu-Daudé                              build_by_default: false)
34487e6edef3SPhilippe Mathieu-Daudémigration = declare_dependency(link_with: libmigration,
34497e6edef3SPhilippe Mathieu-Daudé                               dependencies: [zlib, qom, io])
34507e6edef3SPhilippe Mathieu-Daudésoftmmu_ss.add(migration)
34517e6edef3SPhilippe Mathieu-Daudé
34525e5733e5SMarc-André Lureaublock_ss = block_ss.apply(config_host, strict: false)
34535e5733e5SMarc-André Lureaulibblock = static_library('block', block_ss.sources() + genh,
34545e5733e5SMarc-André Lureau                          dependencies: block_ss.dependencies(),
34555e5733e5SMarc-André Lureau                          link_depends: block_syms,
34565e5733e5SMarc-André Lureau                          name_suffix: 'fa',
34575e5733e5SMarc-André Lureau                          build_by_default: false)
34585e5733e5SMarc-André Lureau
34595e5733e5SMarc-André Lureaublock = declare_dependency(link_whole: [libblock],
3460b7c70bf2SMarc-André Lureau                           link_args: '@block.syms',
3461b7c70bf2SMarc-André Lureau                           dependencies: [crypto, io])
34625e5733e5SMarc-André Lureau
34634fb9071fSStefan Hajnocziblockdev_ss = blockdev_ss.apply(config_host, strict: false)
34644fb9071fSStefan Hajnoczilibblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
34654fb9071fSStefan Hajnoczi                             dependencies: blockdev_ss.dependencies(),
34664fb9071fSStefan Hajnoczi                             name_suffix: 'fa',
34674fb9071fSStefan Hajnoczi                             build_by_default: false)
34684fb9071fSStefan Hajnoczi
34694fb9071fSStefan Hajnocziblockdev = declare_dependency(link_whole: [libblockdev],
34707d5983e3SNicolas Saenz Julienne                              dependencies: [block, event_loop_base])
34714fb9071fSStefan Hajnoczi
3472ff219dcaSPaolo Bonziniqmp_ss = qmp_ss.apply(config_host, strict: false)
3473ff219dcaSPaolo Bonzinilibqmp = static_library('qmp', qmp_ss.sources() + genh,
3474ff219dcaSPaolo Bonzini                        dependencies: qmp_ss.dependencies(),
3475ff219dcaSPaolo Bonzini                        name_suffix: 'fa',
3476ff219dcaSPaolo Bonzini                        build_by_default: false)
3477ff219dcaSPaolo Bonzini
3478ff219dcaSPaolo Bonziniqmp = declare_dependency(link_whole: [libqmp])
3479ff219dcaSPaolo Bonzini
3480c2306d71SPhilippe Mathieu-Daudélibchardev = static_library('chardev', chardev_ss.sources() + genh,
3481c2306d71SPhilippe Mathieu-Daudé                            name_suffix: 'fa',
348222d1f7a8SMarc-André Lureau                            dependencies: chardev_ss.dependencies(),
3483c2306d71SPhilippe Mathieu-Daudé                            build_by_default: false)
3484c2306d71SPhilippe Mathieu-Daudé
3485c2306d71SPhilippe Mathieu-Daudéchardev = declare_dependency(link_whole: libchardev)
3486c2306d71SPhilippe Mathieu-Daudé
3487f73fb063SPhilippe Mathieu-Daudéhwcore_ss = hwcore_ss.apply(config_host, strict: false)
3488f73fb063SPhilippe Mathieu-Daudélibhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
3489e28ab096SPhilippe Mathieu-Daudé                           name_suffix: 'fa',
3490e28ab096SPhilippe Mathieu-Daudé                           build_by_default: false)
3491e28ab096SPhilippe Mathieu-Daudéhwcore = declare_dependency(link_whole: libhwcore)
3492e28ab096SPhilippe Mathieu-Daudécommon_ss.add(hwcore)
3493e28ab096SPhilippe Mathieu-Daudé
3494064f8ee7SPhilippe Mathieu-Daudé###########
3495064f8ee7SPhilippe Mathieu-Daudé# Targets #
3496064f8ee7SPhilippe Mathieu-Daudé###########
3497064f8ee7SPhilippe Mathieu-Daudé
3498fb72176bSPaolo Bonziniemulator_modules = []
34993154fee4SMarc-André Lureauforeach m : block_mods + softmmu_mods
3500fb72176bSPaolo Bonzini  emulator_modules += shared_module(m.name(),
3501fb72176bSPaolo Bonzini                build_by_default: true,
35023154fee4SMarc-André Lureau                name_prefix: '',
35033154fee4SMarc-André Lureau                link_whole: m,
35043154fee4SMarc-André Lureau                install: true,
350516bf7a33SPaolo Bonzini                install_dir: qemu_moddir)
35063154fee4SMarc-André Lureauendforeach
3507d8f3a609SPaolo Bonziniif emulator_modules.length() > 0
3508d8f3a609SPaolo Bonzini  alias_target('modules', emulator_modules)
3509d8f3a609SPaolo Bonziniendif
35103154fee4SMarc-André Lureau
35114fb9071fSStefan Hajnoczisoftmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
351264ed6f92SPaolo Bonzinicommon_ss.add(qom, qemuutil)
351364ed6f92SPaolo Bonzini
351464ed6f92SPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
35152becc36aSPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
35162becc36aSPaolo Bonzini
35172becc36aSPaolo Bonzinicommon_all = common_ss.apply(config_all, strict: false)
35182becc36aSPaolo Bonzinicommon_all = static_library('common',
35192becc36aSPaolo Bonzini                            build_by_default: false,
35202becc36aSPaolo Bonzini                            sources: common_all.sources() + genh,
35219d24fb73SPaolo Bonzini                            include_directories: common_user_inc,
352275eebe0bSKatsuhiro Ueno                            implicit_include_directories: false,
35232becc36aSPaolo Bonzini                            dependencies: common_all.dependencies(),
35242becc36aSPaolo Bonzini                            name_suffix: 'fa')
35252becc36aSPaolo Bonzini
3526c9322ab5SMarc-André Lureaufeature_to_c = find_program('scripts/feature_to_c.sh')
3527c9322ab5SMarc-André Lureau
352830cfa50dSPhilippe Mathieu-Daudéif targetos == 'darwin'
352930cfa50dSPhilippe Mathieu-Daudé  entitlement = find_program('scripts/entitlement.sh')
353030cfa50dSPhilippe Mathieu-Daudéendif
353130cfa50dSPhilippe Mathieu-Daudé
3532fd5eef85SPaolo Bonziniemulators = {}
35332becc36aSPaolo Bonziniforeach target : target_dirs
35342becc36aSPaolo Bonzini  config_target = config_target_mak[target]
35352becc36aSPaolo Bonzini  target_name = config_target['TARGET_NAME']
3536ffb91f68SPaolo Bonzini  target_base_arch = config_target['TARGET_BASE_ARCH']
3537859aef02SPaolo Bonzini  arch_srcs = [config_target_h[target]]
353864ed6f92SPaolo Bonzini  arch_deps = []
353964ed6f92SPaolo Bonzini  c_args = ['-DNEED_CPU_H',
354064ed6f92SPaolo Bonzini            '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
354164ed6f92SPaolo Bonzini            '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3542b6c7cfd4SPaolo Bonzini  link_args = emulator_link_args
35432becc36aSPaolo Bonzini
3544859aef02SPaolo Bonzini  config_target += config_host
35452becc36aSPaolo Bonzini  target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
35462becc36aSPaolo Bonzini  if targetos == 'linux'
35472becc36aSPaolo Bonzini    target_inc += include_directories('linux-headers', is_system: true)
35482becc36aSPaolo Bonzini  endif
35492becc36aSPaolo Bonzini  if target.endswith('-softmmu')
35502becc36aSPaolo Bonzini    target_type='system'
3551ffb91f68SPaolo Bonzini    t = target_softmmu_arch[target_base_arch].apply(config_target, strict: false)
3552abff1abfSPaolo Bonzini    arch_srcs += t.sources()
355364ed6f92SPaolo Bonzini    arch_deps += t.dependencies()
3554abff1abfSPaolo Bonzini
3555ffb91f68SPaolo Bonzini    hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch
35562c44220dSMarc-André Lureau    hw = hw_arch[hw_dir].apply(config_target, strict: false)
35572c44220dSMarc-André Lureau    arch_srcs += hw.sources()
355864ed6f92SPaolo Bonzini    arch_deps += hw.dependencies()
35592c44220dSMarc-André Lureau
35602becc36aSPaolo Bonzini    arch_srcs += config_devices_h[target]
356164ed6f92SPaolo Bonzini    link_args += ['@block.syms', '@qemu.syms']
35622becc36aSPaolo Bonzini  else
35633a30446aSMarc-André Lureau    abi = config_target['TARGET_ABI_DIR']
35642becc36aSPaolo Bonzini    target_type='user'
3565a3a576b0SPaolo Bonzini    target_inc += common_user_inc
3566ffb91f68SPaolo Bonzini    if target_base_arch in target_user_arch
3567ffb91f68SPaolo Bonzini      t = target_user_arch[target_base_arch].apply(config_target, strict: false)
356846369b50SPhilippe Mathieu-Daudé      arch_srcs += t.sources()
356946369b50SPhilippe Mathieu-Daudé      arch_deps += t.dependencies()
357046369b50SPhilippe Mathieu-Daudé    endif
35712becc36aSPaolo Bonzini    if 'CONFIG_LINUX_USER' in config_target
35722becc36aSPaolo Bonzini      base_dir = 'linux-user'
3573e2a74729SWarner Losh    endif
3574e2a74729SWarner Losh    if 'CONFIG_BSD_USER' in config_target
35752becc36aSPaolo Bonzini      base_dir = 'bsd-user'
3576e2a74729SWarner Losh      target_inc += include_directories('bsd-user/' / targetos)
357785fc1b5dSWarner Losh      target_inc += include_directories('bsd-user/host/' / host_arch)
3578e2a74729SWarner Losh      dir = base_dir / abi
357919bf129fSWarner Losh      arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c')
35802becc36aSPaolo Bonzini    endif
35812becc36aSPaolo Bonzini    target_inc += include_directories(
35822becc36aSPaolo Bonzini      base_dir,
35833a30446aSMarc-André Lureau      base_dir / abi,
35842becc36aSPaolo Bonzini    )
35853a30446aSMarc-André Lureau    if 'CONFIG_LINUX_USER' in config_target
35863a30446aSMarc-André Lureau      dir = base_dir / abi
35873a30446aSMarc-André Lureau      arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
35883a30446aSMarc-André Lureau      if config_target.has_key('TARGET_SYSTBL_ABI')
35893a30446aSMarc-André Lureau        arch_srcs += \
35903a30446aSMarc-André Lureau          syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
35913a30446aSMarc-André Lureau                                             extra_args : config_target['TARGET_SYSTBL_ABI'])
35923a30446aSMarc-André Lureau      endif
35933a30446aSMarc-André Lureau    endif
35942becc36aSPaolo Bonzini  endif
35952becc36aSPaolo Bonzini
3596c9322ab5SMarc-André Lureau  if 'TARGET_XML_FILES' in config_target
3597c9322ab5SMarc-André Lureau    gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
3598c9322ab5SMarc-André Lureau                                output: target + '-gdbstub-xml.c',
3599c9322ab5SMarc-André Lureau                                input: files(config_target['TARGET_XML_FILES'].split()),
3600c9322ab5SMarc-André Lureau                                command: [feature_to_c, '@INPUT@'],
3601c9322ab5SMarc-André Lureau                                capture: true)
3602c9322ab5SMarc-André Lureau    arch_srcs += gdbstub_xml
3603c9322ab5SMarc-André Lureau  endif
3604c9322ab5SMarc-André Lureau
3605ffb91f68SPaolo Bonzini  t = target_arch[target_base_arch].apply(config_target, strict: false)
3606abff1abfSPaolo Bonzini  arch_srcs += t.sources()
360764ed6f92SPaolo Bonzini  arch_deps += t.dependencies()
3608abff1abfSPaolo Bonzini
36092becc36aSPaolo Bonzini  target_common = common_ss.apply(config_target, strict: false)
36102becc36aSPaolo Bonzini  objects = common_all.extract_objects(target_common.sources())
361164ed6f92SPaolo Bonzini  deps = target_common.dependencies()
36122becc36aSPaolo Bonzini
36132becc36aSPaolo Bonzini  target_specific = specific_ss.apply(config_target, strict: false)
36142becc36aSPaolo Bonzini  arch_srcs += target_specific.sources()
361564ed6f92SPaolo Bonzini  arch_deps += target_specific.dependencies()
36162becc36aSPaolo Bonzini
361764ed6f92SPaolo Bonzini  lib = static_library('qemu-' + target,
3618859aef02SPaolo Bonzini                 sources: arch_srcs + genh,
3619b7612f45SPaolo Bonzini                 dependencies: arch_deps,
36202becc36aSPaolo Bonzini                 objects: objects,
36212becc36aSPaolo Bonzini                 include_directories: target_inc,
362264ed6f92SPaolo Bonzini                 c_args: c_args,
362364ed6f92SPaolo Bonzini                 build_by_default: false,
36242becc36aSPaolo Bonzini                 name_suffix: 'fa')
362564ed6f92SPaolo Bonzini
362664ed6f92SPaolo Bonzini  if target.endswith('-softmmu')
362764ed6f92SPaolo Bonzini    execs = [{
362864ed6f92SPaolo Bonzini      'name': 'qemu-system-' + target_name,
3629654d6b04SPaolo Bonzini      'win_subsystem': 'console',
363064ed6f92SPaolo Bonzini      'sources': files('softmmu/main.c'),
363164ed6f92SPaolo Bonzini      'dependencies': []
363264ed6f92SPaolo Bonzini    }]
363335be72baSPaolo Bonzini    if targetos == 'windows' and (sdl.found() or gtk.found())
363464ed6f92SPaolo Bonzini      execs += [{
363564ed6f92SPaolo Bonzini        'name': 'qemu-system-' + target_name + 'w',
3636654d6b04SPaolo Bonzini        'win_subsystem': 'windows',
363764ed6f92SPaolo Bonzini        'sources': files('softmmu/main.c'),
363864ed6f92SPaolo Bonzini        'dependencies': []
363964ed6f92SPaolo Bonzini      }]
364064ed6f92SPaolo Bonzini    endif
3641537b7248SPaolo Bonzini    if get_option('fuzzing')
364264ed6f92SPaolo Bonzini      specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
364364ed6f92SPaolo Bonzini      execs += [{
364464ed6f92SPaolo Bonzini        'name': 'qemu-fuzz-' + target_name,
3645654d6b04SPaolo Bonzini        'win_subsystem': 'console',
364664ed6f92SPaolo Bonzini        'sources': specific_fuzz.sources(),
364764ed6f92SPaolo Bonzini        'dependencies': specific_fuzz.dependencies(),
364864ed6f92SPaolo Bonzini      }]
364964ed6f92SPaolo Bonzini    endif
365064ed6f92SPaolo Bonzini  else
365164ed6f92SPaolo Bonzini    execs = [{
365264ed6f92SPaolo Bonzini      'name': 'qemu-' + target_name,
3653654d6b04SPaolo Bonzini      'win_subsystem': 'console',
365464ed6f92SPaolo Bonzini      'sources': [],
365564ed6f92SPaolo Bonzini      'dependencies': []
365664ed6f92SPaolo Bonzini    }]
365764ed6f92SPaolo Bonzini  endif
365864ed6f92SPaolo Bonzini  foreach exe: execs
36598a74ce61SAlexander Graf    exe_name = exe['name']
36603983a767SJohn Arbuckle    if targetos == 'darwin'
36618a74ce61SAlexander Graf      exe_name += '-unsigned'
36628a74ce61SAlexander Graf    endif
36638a74ce61SAlexander Graf
36648a74ce61SAlexander Graf    emulator = executable(exe_name, exe['sources'],
3665237377acSAkihiko Odaki               install: true,
366664ed6f92SPaolo Bonzini               c_args: c_args,
366764ed6f92SPaolo Bonzini               dependencies: arch_deps + deps + exe['dependencies'],
366864ed6f92SPaolo Bonzini               objects: lib.extract_all_objects(recursive: true),
366964ed6f92SPaolo Bonzini               link_language: link_language,
367064ed6f92SPaolo Bonzini               link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
367164ed6f92SPaolo Bonzini               link_args: link_args,
3672654d6b04SPaolo Bonzini               win_subsystem: exe['win_subsystem'])
36738a74ce61SAlexander Graf
36743983a767SJohn Arbuckle    if targetos == 'darwin'
3675411ad8ddSAkihiko Odaki      icon = 'pc-bios/qemu.rsrc'
3676411ad8ddSAkihiko Odaki      build_input = [emulator, files(icon)]
3677411ad8ddSAkihiko Odaki      install_input = [
3678411ad8ddSAkihiko Odaki        get_option('bindir') / exe_name,
3679411ad8ddSAkihiko Odaki        meson.current_source_dir() / icon
3680411ad8ddSAkihiko Odaki      ]
3681411ad8ddSAkihiko Odaki      if 'CONFIG_HVF' in config_target
3682411ad8ddSAkihiko Odaki        entitlements = 'accel/hvf/entitlements.plist'
3683411ad8ddSAkihiko Odaki        build_input += files(entitlements)
3684411ad8ddSAkihiko Odaki        install_input += meson.current_source_dir() / entitlements
3685411ad8ddSAkihiko Odaki      endif
3686411ad8ddSAkihiko Odaki
36878a74ce61SAlexander Graf      emulators += {exe['name'] : custom_target(exe['name'],
3688411ad8ddSAkihiko Odaki                   input: build_input,
36898a74ce61SAlexander Graf                   output: exe['name'],
3690235b523dSPhilippe Mathieu-Daudé                   command: [entitlement, '@OUTPUT@', '@INPUT@'])
3691fd5eef85SPaolo Bonzini      }
3692237377acSAkihiko Odaki
3693235b523dSPhilippe Mathieu-Daudé      meson.add_install_script(entitlement, '--install',
3694237377acSAkihiko Odaki                               get_option('bindir') / exe['name'],
3695411ad8ddSAkihiko Odaki                               install_input)
36968a74ce61SAlexander Graf    else
36978a74ce61SAlexander Graf      emulators += {exe['name']: emulator}
36988a74ce61SAlexander Graf    endif
369910e1d263SMarc-André Lureau
37009c29b741SPaolo Bonzini    if stap.found()
370110e1d263SMarc-André Lureau      foreach stp: [
3702bd5f973aSStefan Hajnoczi        {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
3703bd5f973aSStefan Hajnoczi        {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
370410e1d263SMarc-André Lureau        {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
370510e1d263SMarc-André Lureau        {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
370610e1d263SMarc-André Lureau      ]
3707bd5f973aSStefan Hajnoczi        custom_target(exe['name'] + stp['ext'],
370810e1d263SMarc-André Lureau                      input: trace_events_all,
3709bd5f973aSStefan Hajnoczi                      output: exe['name'] + stp['ext'],
371010e1d263SMarc-André Lureau                      install: stp['install'],
371116bf7a33SPaolo Bonzini                      install_dir: get_option('datadir') / 'systemtap/tapset',
371210e1d263SMarc-André Lureau                      command: [
371310e1d263SMarc-André Lureau                        tracetool, '--group=all', '--format=' + stp['fmt'],
371410e1d263SMarc-André Lureau                        '--binary=' + stp['bin'],
371510e1d263SMarc-André Lureau                        '--target-name=' + target_name,
371610e1d263SMarc-André Lureau                        '--target-type=' + target_type,
371710e1d263SMarc-André Lureau                        '--probe-prefix=qemu.' + target_type + '.' + target_name,
3718c05012a3SStefan Hajnoczi                        '@INPUT@', '@OUTPUT@'
37190572d6cdSStefan Hajnoczi                      ],
37200572d6cdSStefan Hajnoczi                      depend_files: tracetool_depends)
372110e1d263SMarc-André Lureau      endforeach
372210e1d263SMarc-André Lureau    endif
372364ed6f92SPaolo Bonzini  endforeach
37242becc36aSPaolo Bonziniendforeach
37252becc36aSPaolo Bonzini
3726931049b4SPaolo Bonzini# Other build targets
3727897b5afaSMarc-André Lureau
3728f556b4a1SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host
3729f556b4a1SPaolo Bonzini  install_headers('include/qemu/qemu-plugin.h')
3730f556b4a1SPaolo Bonziniendif
3731f556b4a1SPaolo Bonzini
3732f15bff25SPaolo Bonzinisubdir('qga')
3733f15bff25SPaolo Bonzini
37349755c94aSLaurent Vivier# Don't build qemu-keymap if xkbcommon is not explicitly enabled
37359755c94aSLaurent Vivier# when we don't build tools or system
37364113f4cfSLaurent Vivierif xkbcommon.found()
373728742467SMarc-André Lureau  # used for the update-keymaps target, so include rules even if !have_tools
373828742467SMarc-André Lureau  qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
373928742467SMarc-André Lureau                           dependencies: [qemuutil, xkbcommon], install: have_tools)
374028742467SMarc-André Lureauendif
374128742467SMarc-André Lureau
3742931049b4SPaolo Bonziniif have_tools
3743b7c70bf2SMarc-André Lureau  qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
3744b7c70bf2SMarc-André Lureau             dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
3745b7c70bf2SMarc-André Lureau  qemu_io = executable('qemu-io', files('qemu-io.c'),
3746b7c70bf2SMarc-André Lureau             dependencies: [block, qemuutil], install: true)
3747b7c70bf2SMarc-André Lureau  qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
37483d212b41SRichard W.M. Jones               dependencies: [blockdev, qemuutil, gnutls, selinux],
37493d212b41SRichard W.M. Jones               install: true)
3750b7c70bf2SMarc-André Lureau
37517c58bb76SPaolo Bonzini  subdir('storage-daemon')
3752a9c9727cSPaolo Bonzini  subdir('contrib/rdmacm-mux')
37531d7bb6abSMarc-André Lureau  subdir('contrib/elf2dmp')
3754a9c9727cSPaolo Bonzini
3755157e7b13SMarc-André Lureau  executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
3756157e7b13SMarc-André Lureau             dependencies: qemuutil,
3757157e7b13SMarc-André Lureau             install: true)
3758157e7b13SMarc-André Lureau
37592a3129a3SPaolo Bonzini  if have_vhost_user
37602d7ac0afSPaolo Bonzini    subdir('contrib/vhost-user-blk')
3761ea458960SMarc-André Lureau    subdir('contrib/vhost-user-gpu')
376232fcc624SMarc-André Lureau    subdir('contrib/vhost-user-input')
376399650b62SPaolo Bonzini    subdir('contrib/vhost-user-scsi')
3764931049b4SPaolo Bonzini  endif
37658f51e01cSMarc-André Lureau
37668f51e01cSMarc-André Lureau  if targetos == 'linux'
37678f51e01cSMarc-André Lureau    executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
37688f51e01cSMarc-André Lureau               dependencies: [qemuutil, libcap_ng],
37698f51e01cSMarc-André Lureau               install: true,
37708f51e01cSMarc-André Lureau               install_dir: get_option('libexecdir'))
3771897b5afaSMarc-André Lureau
3772897b5afaSMarc-André Lureau    executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
3773897b5afaSMarc-André Lureau               dependencies: [authz, crypto, io, qom, qemuutil,
37746ec0e15dSPaolo Bonzini                              libcap_ng, mpathpersist],
3775897b5afaSMarc-André Lureau               install: true)
37768f51e01cSMarc-André Lureau  endif
37778f51e01cSMarc-André Lureau
3778ccd250aaSPaolo Bonzini  if have_ivshmem
37795ee24e78SMarc-André Lureau    subdir('contrib/ivshmem-client')
37805ee24e78SMarc-André Lureau    subdir('contrib/ivshmem-server')
37815ee24e78SMarc-André Lureau  endif
3782931049b4SPaolo Bonziniendif
3783931049b4SPaolo Bonzini
3784f5aa6320SMarc-André Lureausubdir('scripts')
37853f99cf57SPaolo Bonzinisubdir('tools')
3786bdcbea7aSMarc-André Lureausubdir('pc-bios')
3787f8aa24eaSPaolo Bonzinisubdir('docs')
3788e3667660SYonggang Luosubdir('tests')
37891b695471SPaolo Bonziniif gtk.found()
3790e8f3bd71SMarc-André Lureau  subdir('po')
3791e8f3bd71SMarc-André Lureauendif
37923f99cf57SPaolo Bonzini
37938adfeba9SMarc-André Lureauif host_machine.system() == 'windows'
37948adfeba9SMarc-André Lureau  nsis_cmd = [
37958adfeba9SMarc-André Lureau    find_program('scripts/nsis.py'),
37968adfeba9SMarc-André Lureau    '@OUTPUT@',
37978adfeba9SMarc-André Lureau    get_option('prefix'),
37988adfeba9SMarc-André Lureau    meson.current_source_dir(),
3799fc9a809eSPaolo Bonzini    glib_pc.get_variable('bindir'),
380024bdcc96SStefan Weil    host_machine.cpu(),
38018adfeba9SMarc-André Lureau    '--',
38028adfeba9SMarc-André Lureau    '-DDISPLAYVERSION=' + meson.project_version(),
38038adfeba9SMarc-André Lureau  ]
38048adfeba9SMarc-André Lureau  if build_docs
38058adfeba9SMarc-André Lureau    nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
38068adfeba9SMarc-André Lureau  endif
38071b695471SPaolo Bonzini  if gtk.found()
38088adfeba9SMarc-André Lureau    nsis_cmd += '-DCONFIG_GTK=y'
38098adfeba9SMarc-André Lureau  endif
38108adfeba9SMarc-André Lureau
38118adfeba9SMarc-André Lureau  nsis = custom_target('nsis',
38128adfeba9SMarc-André Lureau                       output: 'qemu-setup-' + meson.project_version() + '.exe',
38138adfeba9SMarc-André Lureau                       input: files('qemu.nsi'),
38148adfeba9SMarc-André Lureau                       build_always_stale: true,
38158adfeba9SMarc-André Lureau                       command: nsis_cmd + ['@INPUT@'])
38168adfeba9SMarc-André Lureau  alias_target('installer', nsis)
38178adfeba9SMarc-André Lureauendif
38188adfeba9SMarc-André Lureau
3819a0c9162cSPaolo Bonzini#########################
3820a0c9162cSPaolo Bonzini# Configuration summary #
3821a0c9162cSPaolo Bonzini#########################
3822a0c9162cSPaolo Bonzini
3823983d0a75SPhilippe Mathieu-Daudé# Directories
3824f9332757SPaolo Bonzinisummary_info = {}
382516bf7a33SPaolo Bonzinisummary_info += {'Install prefix':    get_option('prefix')}
382616bf7a33SPaolo Bonzinisummary_info += {'BIOS directory':    qemu_datadir}
38278154f5e6SAkihiko Odakipathsep = targetos == 'windows' ? ';' : ':'
38288154f5e6SAkihiko Odakisummary_info += {'firmware path':     pathsep.join(get_option('qemu_firmwarepath'))}
3829f7fb6c6aSPaolo Bonzinisummary_info += {'binary directory':  get_option('prefix') / get_option('bindir')}
3830f7fb6c6aSPaolo Bonzinisummary_info += {'library directory': get_option('prefix') / get_option('libdir')}
383116bf7a33SPaolo Bonzinisummary_info += {'module directory':  qemu_moddir}
3832f7fb6c6aSPaolo Bonzinisummary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')}
3833f7fb6c6aSPaolo Bonzinisummary_info += {'include directory': get_option('prefix') / get_option('includedir')}
3834f7fb6c6aSPaolo Bonzinisummary_info += {'config directory':  get_option('prefix') / get_option('sysconfdir')}
3835f9332757SPaolo Bonziniif targetos != 'windows'
3836f7fb6c6aSPaolo Bonzini  summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')}
3837f7fb6c6aSPaolo Bonzini  summary_info += {'Manual directory':      get_option('prefix') / get_option('mandir')}
3838f9332757SPaolo Bonzinielse
3839f9332757SPaolo Bonzini  summary_info += {'local state directory': 'queried at runtime'}
3840f9332757SPaolo Bonziniendif
3841f7fb6c6aSPaolo Bonzinisummary_info += {'Doc directory':     get_option('prefix') / get_option('docdir')}
3842f9332757SPaolo Bonzinisummary_info += {'Build directory':   meson.current_build_dir()}
3843f9332757SPaolo Bonzinisummary_info += {'Source path':       meson.current_source_dir()}
3844f9332757SPaolo Bonzinisummary_info += {'GIT submodules':    config_host['GIT_SUBMODULES']}
3845983d0a75SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Directories')
3846983d0a75SPhilippe Mathieu-Daudé
3847e11a0e17SPhilippe Mathieu-Daudé# Host binaries
3848983d0a75SPhilippe Mathieu-Daudésummary_info = {}
3849e11a0e17SPhilippe Mathieu-Daudésummary_info += {'git':               config_host['GIT']}
3850e11a0e17SPhilippe Mathieu-Daudésummary_info += {'make':              config_host['MAKE']}
3851e11a0e17SPhilippe Mathieu-Daudésummary_info += {'python':            '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
3852bb647c49SPaolo Bonzinisummary_info += {'sphinx-build':      sphinx_build}
3853e11a0e17SPhilippe Mathieu-Daudéif config_host.has_key('HAVE_GDB_BIN')
3854e11a0e17SPhilippe Mathieu-Daudé  summary_info += {'gdb':             config_host['HAVE_GDB_BIN']}
3855e11a0e17SPhilippe Mathieu-Daudéendif
385640c909f5SPaolo Bonzinisummary_info += {'iasl':              iasl}
3857e11a0e17SPhilippe Mathieu-Daudésummary_info += {'genisoimage':       config_host['GENISOIMAGE']}
385820cf5cb4SPaolo Bonziniif targetos == 'windows' and have_ga
3859bb647c49SPaolo Bonzini  summary_info += {'wixl':            wixl}
3860e11a0e17SPhilippe Mathieu-Daudéendif
38615890258aSThomas Huthif slirp.found() and have_system
386235acbb30SPaolo Bonzini  summary_info += {'smbd':            have_slirp_smbd ? smbd_path : false}
3863e11a0e17SPhilippe Mathieu-Daudéendif
3864e11a0e17SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Host binaries')
3865e11a0e17SPhilippe Mathieu-Daudé
38661d718865SPhilippe Mathieu-Daudé# Configurable features
38671d718865SPhilippe Mathieu-Daudésummary_info = {}
38681d718865SPhilippe Mathieu-Daudésummary_info += {'Documentation':     build_docs}
3869aa3ca634SPhilippe Mathieu-Daudésummary_info += {'system-mode emulation': have_system}
3870aa3ca634SPhilippe Mathieu-Daudésummary_info += {'user-mode emulation': have_user}
3871813803aaSPhilippe Mathieu-Daudésummary_info += {'block layer':       have_block}
38721d718865SPhilippe Mathieu-Daudésummary_info += {'Install blobs':     get_option('install_blobs')}
38736002711cSPaolo Bonzinisummary_info += {'module support':    enable_modules}
38746002711cSPaolo Bonziniif enable_modules
38752cb2f580SPaolo Bonzini  summary_info += {'alternative module path': get_option('module_upgrades')}
38761d718865SPhilippe Mathieu-Daudéendif
3877537b7248SPaolo Bonzinisummary_info += {'fuzzing support':   get_option('fuzzing')}
38781d718865SPhilippe Mathieu-Daudéif have_system
387987430d5bSPaolo Bonzini  summary_info += {'Audio drivers':     ' '.join(audio_drivers_selected)}
38801d718865SPhilippe Mathieu-Daudéendif
38819c29b741SPaolo Bonzinisummary_info += {'Trace backends':    ','.join(get_option('trace_backends'))}
38829c29b741SPaolo Bonziniif 'simple' in get_option('trace_backends')
38839c29b741SPaolo Bonzini  summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
38841d718865SPhilippe Mathieu-Daudéendif
3885142ca628SMarc-André Lureausummary_info += {'D-Bus display':     dbus_display}
3886c55cf6abSPaolo Bonzinisummary_info += {'QOM debugging':     get_option('qom_cast_debug')}
38872a3129a3SPaolo Bonzinisummary_info += {'vhost-kernel support': have_vhost_kernel}
38882a3129a3SPaolo Bonzinisummary_info += {'vhost-net support': have_vhost_net}
38892a3129a3SPaolo Bonzinisummary_info += {'vhost-user support': have_vhost_user}
38902a3129a3SPaolo Bonzinisummary_info += {'vhost-user-crypto support': have_vhost_user_crypto}
38911d718865SPhilippe Mathieu-Daudésummary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
38922a3129a3SPaolo Bonzinisummary_info += {'vhost-vdpa support': have_vhost_vdpa}
389320cf5cb4SPaolo Bonzinisummary_info += {'build guest agent': have_ga}
38941d718865SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Configurable features')
38951d718865SPhilippe Mathieu-Daudé
38962e864b8bSPhilippe Mathieu-Daudé# Compilation information
3897e11a0e17SPhilippe Mathieu-Daudésummary_info = {}
38982e864b8bSPhilippe Mathieu-Daudésummary_info += {'host CPU':          cpu}
38992e864b8bSPhilippe Mathieu-Daudésummary_info += {'host endianness':   build_machine.endian()}
390063de9353SAlex Bennéesummary_info += {'C compiler':        ' '.join(meson.get_compiler('c').cmd_array())}
390163de9353SAlex Bennéesummary_info += {'Host C compiler':   ' '.join(meson.get_compiler('c', native: true).cmd_array())}
3902f9332757SPaolo Bonziniif link_language == 'cpp'
390363de9353SAlex Bennée  summary_info += {'C++ compiler':    ' '.join(meson.get_compiler('cpp').cmd_array())}
3904f9332757SPaolo Bonzinielse
3905f9332757SPaolo Bonzini  summary_info += {'C++ compiler':      false}
3906f9332757SPaolo Bonziniendif
3907f9332757SPaolo Bonziniif targetos == 'darwin'
390863de9353SAlex Bennée  summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
3909f9332757SPaolo Bonziniendif
39106a97f393SPaolo Bonzinioption_cflags = (get_option('debug') ? ['-g'] : [])
39116a97f393SPaolo Bonziniif get_option('optimization') != 'plain'
39126a97f393SPaolo Bonzini  option_cflags += ['-O' + get_option('optimization')]
39136a97f393SPaolo Bonziniendif
39146a97f393SPaolo Bonzinisummary_info += {'CFLAGS':            ' '.join(get_option('c_args') + option_cflags)}
391547b30835SPaolo Bonziniif link_language == 'cpp'
39166a97f393SPaolo Bonzini  summary_info += {'CXXFLAGS':        ' '.join(get_option('cpp_args') + option_cflags)}
391747b30835SPaolo Bonziniendif
3918e910c7d9SPhilippe Mathieu-Daudéif targetos == 'darwin'
39196a97f393SPaolo Bonzini  summary_info += {'OBJCFLAGS':       ' '.join(get_option('objc_args') + option_cflags)}
3920e910c7d9SPhilippe Mathieu-Daudéendif
392147b30835SPaolo Bonzinilink_args = get_option(link_language + '_link_args')
392247b30835SPaolo Bonziniif link_args.length() > 0
392347b30835SPaolo Bonzini  summary_info += {'LDFLAGS':         ' '.join(link_args)}
392447b30835SPaolo Bonziniendif
3925d67212d4SPaolo Bonzinisummary_info += {'QEMU_CFLAGS':       ' '.join(qemu_common_flags + qemu_cflags)}
3926e5134024SPaolo Bonziniif 'cpp' in all_languages
3927d67212d4SPaolo Bonzini  summary_info += {'QEMU_CXXFLAGS':     ' '.join(qemu_common_flags + qemu_cxxflags)}
3928e5134024SPaolo Bonziniendif
3929e5134024SPaolo Bonziniif 'objc' in all_languages
3930d67212d4SPaolo Bonzini  summary_info += {'QEMU_OBJCFLAGS':    ' '.join(qemu_common_flags + qemu_objcflags)}
3931e5134024SPaolo Bonziniendif
3932d065177eSPaolo Bonzinisummary_info += {'QEMU_LDFLAGS':      ' '.join(qemu_ldflags)}
3933c55cf6abSPaolo Bonzinisummary_info += {'profiler':          get_option('profiler')}
3934cdad781dSDaniele Buonosummary_info += {'link-time optimization (LTO)': get_option('b_lto')}
39352e864b8bSPhilippe Mathieu-Daudésummary_info += {'PIE':               get_option('b_pie')}
39363e8529ddSLaurent Viviersummary_info += {'static build':      config_host.has_key('CONFIG_STATIC')}
39372e864b8bSPhilippe Mathieu-Daudésummary_info += {'malloc trim support': has_malloc_trim}
3938b87df904SPaolo Bonzinisummary_info += {'membarrier':        have_membarrier}
393958a2e3f5SStefan Hajnoczisummary_info += {'debug graph lock':  get_option('debug_graph_lock')}
3940728c0a2fSPaolo Bonzinisummary_info += {'debug stack usage': get_option('debug_stack_usage')}
3941c55cf6abSPaolo Bonzinisummary_info += {'mutex debugging':   get_option('debug_mutex')}
39422e864b8bSPhilippe Mathieu-Daudésummary_info += {'memory allocator':  get_option('malloc')}
3943622753d2SPaolo Bonzinisummary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
394404ffce13Sling xusummary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')}
3945622753d2SPaolo Bonzinisummary_info += {'avx512f optimization': config_host_data.get('CONFIG_AVX512F_OPT')}
3946bb9ecae7SAlex Bennéeif get_option('gprof')
3947bb9ecae7SAlex Bennée  gprof_info = 'YES (deprecated)'
3948bb9ecae7SAlex Bennéeelse
3949bb9ecae7SAlex Bennée  gprof_info = get_option('gprof')
3950bb9ecae7SAlex Bennéeendif
3951bb9ecae7SAlex Bennéesummary_info += {'gprof':             gprof_info}
39522e864b8bSPhilippe Mathieu-Daudésummary_info += {'gcov':              get_option('b_coverage')}
395334f983d8SPaolo Bonzinisummary_info += {'thread sanitizer':  get_option('tsan')}
39542e864b8bSPhilippe Mathieu-Daudésummary_info += {'CFI support':       get_option('cfi')}
39552e864b8bSPhilippe Mathieu-Daudéif get_option('cfi')
39562e864b8bSPhilippe Mathieu-Daudé  summary_info += {'CFI debug support': get_option('cfi_debug')}
39572e864b8bSPhilippe Mathieu-Daudéendif
39582e864b8bSPhilippe Mathieu-Daudésummary_info += {'strip binaries':    get_option('strip')}
3959bb647c49SPaolo Bonzinisummary_info += {'sparse':            sparse}
39602e864b8bSPhilippe Mathieu-Daudésummary_info += {'mingw32 support':   targetos == 'windows'}
396112640f05SPaolo Bonzinisummary(summary_info, bool_yn: true, section: 'Compilation')
396249e8565bSAlex Bennée
396349e8565bSAlex Bennée# snarf the cross-compilation information for tests
396412640f05SPaolo Bonzinisummary_info = {}
396512640f05SPaolo Bonzinihave_cross = false
396649e8565bSAlex Bennéeforeach target: target_dirs
3967c7022a70SPaolo Bonzini  tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak'
396849e8565bSAlex Bennée  if fs.exists(tcg_mak)
396949e8565bSAlex Bennée    config_cross_tcg = keyval.load(tcg_mak)
397085b141eaSAlex Bennée    if 'CC' in config_cross_tcg
397112640f05SPaolo Bonzini      summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']}
397212640f05SPaolo Bonzini      have_cross = true
397349e8565bSAlex Bennée    endif
397449e8565bSAlex Bennée  endif
397549e8565bSAlex Bennéeendforeach
397612640f05SPaolo Bonziniif have_cross
397712640f05SPaolo Bonzini  summary(summary_info, bool_yn: true, section: 'Cross compilers')
397812640f05SPaolo Bonziniendif
39792e864b8bSPhilippe Mathieu-Daudé
3980aa3ca634SPhilippe Mathieu-Daudé# Targets and accelerators
39812e864b8bSPhilippe Mathieu-Daudésummary_info = {}
3982aa3ca634SPhilippe Mathieu-Daudéif have_system
3983aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'KVM support':       config_all.has_key('CONFIG_KVM')}
3984aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'HAX support':       config_all.has_key('CONFIG_HAX')}
3985aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'HVF support':       config_all.has_key('CONFIG_HVF')}
3986aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'WHPX support':      config_all.has_key('CONFIG_WHPX')}
398774a414a1SReinoud Zandijk  summary_info += {'NVMM support':      config_all.has_key('CONFIG_NVMM')}
398814efd8d3SPaolo Bonzini  summary_info += {'Xen support':       xen.found()}
398914efd8d3SPaolo Bonzini  if xen.found()
399014efd8d3SPaolo Bonzini    summary_info += {'xen ctrl version':  xen.version()}
3991aa3ca634SPhilippe Mathieu-Daudé  endif
3992820c1abaSDavid Woodhouse  summary_info += {'Xen emulation':     config_all.has_key('CONFIG_XEN_EMU')}
3993aa3ca634SPhilippe Mathieu-Daudéendif
3994aa3ca634SPhilippe Mathieu-Daudésummary_info += {'TCG support':       config_all.has_key('CONFIG_TCG')}
3995aa3ca634SPhilippe Mathieu-Daudéif config_all.has_key('CONFIG_TCG')
399639687acaSPhilippe Mathieu-Daudé  if get_option('tcg_interpreter')
3997f1f727acSPhilippe Mathieu-Daudé    summary_info += {'TCG backend':   'TCI (TCG with bytecode interpreter, slow)'}
399839687acaSPhilippe Mathieu-Daudé  else
399939687acaSPhilippe Mathieu-Daudé    summary_info += {'TCG backend':   'native (@0@)'.format(cpu)}
400039687acaSPhilippe Mathieu-Daudé  endif
4001029aa68fSAlex Bennée  summary_info += {'TCG plugins': config_host.has_key('CONFIG_PLUGIN')}
4002aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
4003aa3ca634SPhilippe Mathieu-Daudéendif
40042e864b8bSPhilippe Mathieu-Daudésummary_info += {'target list':       ' '.join(target_dirs)}
4005aa3ca634SPhilippe Mathieu-Daudéif have_system
4006aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'default devices':   get_option('default_devices')}
4007106ad1f9SPaolo Bonzini  summary_info += {'out of process emulation': multiprocess_allowed}
400855116968SJagannathan Raman  summary_info += {'vfio-user server': vfio_user_server_allowed}
4009aa3ca634SPhilippe Mathieu-Daudéendif
4010aa3ca634SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Targets and accelerators')
4011aa3ca634SPhilippe Mathieu-Daudé
4012813803aaSPhilippe Mathieu-Daudé# Block layer
4013813803aaSPhilippe Mathieu-Daudésummary_info = {}
4014813803aaSPhilippe Mathieu-Daudésummary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
4015728c0a2fSPaolo Bonzinisummary_info += {'coroutine pool':    have_coroutine_pool}
4016813803aaSPhilippe Mathieu-Daudéif have_block
4017622d64ffSPaolo Bonzini  summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')}
4018622d64ffSPaolo Bonzini  summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')}
4019c55cf6abSPaolo Bonzini  summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')}
40203887702eSChristian Schoenebeck  summary_info += {'VirtFS (9P) support':    have_virtfs}
40213887702eSChristian Schoenebeck  summary_info += {'VirtFS (9P) Proxy Helper support': have_virtfs_proxy_helper}
4022406523f6SPaolo Bonzini  summary_info += {'Live block migration': config_host_data.get('CONFIG_LIVE_BLOCK_MIGRATION')}
4023406523f6SPaolo Bonzini  summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')}
4024ed793c2cSPaolo Bonzini  summary_info += {'bochs support':     get_option('bochs').allowed()}
4025ed793c2cSPaolo Bonzini  summary_info += {'cloop support':     get_option('cloop').allowed()}
4026ed793c2cSPaolo Bonzini  summary_info += {'dmg support':       get_option('dmg').allowed()}
4027ed793c2cSPaolo Bonzini  summary_info += {'qcow v1 support':   get_option('qcow1').allowed()}
4028ed793c2cSPaolo Bonzini  summary_info += {'vdi support':       get_option('vdi').allowed()}
402911cea42eSVladimir Sementsov-Ogievskiy  summary_info += {'vhdx support':      get_option('vhdx').allowed()}
403011cea42eSVladimir Sementsov-Ogievskiy  summary_info += {'vmdk support':      get_option('vmdk').allowed()}
403111cea42eSVladimir Sementsov-Ogievskiy  summary_info += {'vpc support':       get_option('vpc').allowed()}
4032ed793c2cSPaolo Bonzini  summary_info += {'vvfat support':     get_option('vvfat').allowed()}
4033ed793c2cSPaolo Bonzini  summary_info += {'qed support':       get_option('qed').allowed()}
4034ed793c2cSPaolo Bonzini  summary_info += {'parallels support': get_option('parallels').allowed()}
4035bb647c49SPaolo Bonzini  summary_info += {'FUSE exports':      fuse}
40362a2359b8SXie Yongji  summary_info += {'VDUSE block exports': have_vduse_blk_export}
4037813803aaSPhilippe Mathieu-Daudéendif
4038813803aaSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Block layer support')
4039813803aaSPhilippe Mathieu-Daudé
4040aa58028aSPhilippe Mathieu-Daudé# Crypto
4041aa3ca634SPhilippe Mathieu-Daudésummary_info = {}
404241f2ae28SPaolo Bonzinisummary_info += {'TLS priority':      get_option('tls_priority')}
4043bb647c49SPaolo Bonzinisummary_info += {'GNUTLS support':    gnutls}
4044bb647c49SPaolo Bonziniif gnutls.found()
4045cc4c7c73SDaniel P. Berrangé  summary_info += {'  GNUTLS crypto':   gnutls_crypto.found()}
4046bb647c49SPaolo Bonziniendif
4047bb647c49SPaolo Bonzinisummary_info += {'libgcrypt':         gcrypt}
4048bb647c49SPaolo Bonzinisummary_info += {'nettle':            nettle}
404957612511SPaolo Bonziniif nettle.found()
405057612511SPaolo Bonzini   summary_info += {'  XTS':             xts != 'private'}
4051f9332757SPaolo Bonziniendif
405234b52615SPaolo Bonzinisummary_info += {'AF_ALG support':    have_afalg}
4053c55cf6abSPaolo Bonzinisummary_info += {'rng-none':          get_option('rng_none')}
40542edd2c04SPaolo Bonzinisummary_info += {'Linux keyring':     have_keyring}
4055aa58028aSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Crypto')
4056aa58028aSPhilippe Mathieu-Daudé
405769a78cceSPhilippe Mathieu-Daudé# Libraries
4058aa58028aSPhilippe Mathieu-Daudésummary_info = {}
4059aa58028aSPhilippe Mathieu-Daudéif targetos == 'darwin'
4060bb647c49SPaolo Bonzini  summary_info += {'Cocoa support':           cocoa}
4061e2c1d78dSVladislav Yaroshchuk  summary_info += {'vmnet.framework support': vmnet}
4062aa58028aSPhilippe Mathieu-Daudéendif
4063bb647c49SPaolo Bonzinisummary_info += {'SDL support':       sdl}
4064bb647c49SPaolo Bonzinisummary_info += {'SDL image support': sdl_image}
4065bb647c49SPaolo Bonzinisummary_info += {'GTK support':       gtk}
4066bb647c49SPaolo Bonzinisummary_info += {'pixman':            pixman}
4067bb647c49SPaolo Bonzinisummary_info += {'VTE support':       vte}
40685890258aSThomas Huthsummary_info += {'slirp support':     slirp}
4069bb647c49SPaolo Bonzinisummary_info += {'libtasn1':          tasn1}
4070bb647c49SPaolo Bonzinisummary_info += {'PAM':               pam}
4071bb647c49SPaolo Bonzinisummary_info += {'iconv support':     iconv}
4072bb647c49SPaolo Bonzinisummary_info += {'curses support':    curses}
4073bb647c49SPaolo Bonzinisummary_info += {'virgl support':     virgl}
4074fd66dbd4SStefan Hajnoczisummary_info += {'blkio support':     blkio}
4075bb647c49SPaolo Bonzinisummary_info += {'curl support':      curl}
4076bb647c49SPaolo Bonzinisummary_info += {'Multipath support': mpathpersist}
407795f8510eSKshitij Surisummary_info += {'PNG support':       png}
4078bb647c49SPaolo Bonzinisummary_info += {'VNC support':       vnc}
4079a0b93237SPaolo Bonziniif vnc.found()
4080bb647c49SPaolo Bonzini  summary_info += {'VNC SASL support':  sasl}
4081bb647c49SPaolo Bonzini  summary_info += {'VNC JPEG support':  jpeg}
4082f9332757SPaolo Bonziniendif
408387430d5bSPaolo Bonziniif targetos not in ['darwin', 'haiku', 'windows']
408487430d5bSPaolo Bonzini  summary_info += {'OSS support':     oss}
4085663df1ccSAlexandre Ratchov  summary_info += {'sndio support':   sndio}
408687430d5bSPaolo Bonzinielif targetos == 'darwin'
408787430d5bSPaolo Bonzini  summary_info += {'CoreAudio support': coreaudio}
408887430d5bSPaolo Bonzinielif targetos == 'windows'
408987430d5bSPaolo Bonzini  summary_info += {'DirectSound support': dsound}
409087430d5bSPaolo Bonziniendif
409187430d5bSPaolo Bonziniif targetos == 'linux'
409287430d5bSPaolo Bonzini  summary_info += {'ALSA support':    alsa}
409387430d5bSPaolo Bonzini  summary_info += {'PulseAudio support': pulse}
409487430d5bSPaolo Bonziniendif
4095c2d3d1c2SDorinda Basseysummary_info += {'Pipewire support':   pipewire}
409687430d5bSPaolo Bonzinisummary_info += {'JACK support':      jack}
4097bb647c49SPaolo Bonzinisummary_info += {'brlapi support':    brlapi}
4098e1723999SPaolo Bonzinisummary_info += {'vde support':       vde}
4099837b84b1SPaolo Bonzinisummary_info += {'netmap support':    have_netmap}
4100eea9453aSThomas Huthsummary_info += {'l2tpv3 support':    have_l2tpv3}
4101ff66f3e5SPaolo Bonzinisummary_info += {'Linux AIO support': libaio}
4102bb647c49SPaolo Bonzinisummary_info += {'Linux io_uring support': linux_io_uring}
4103bb647c49SPaolo Bonzinisummary_info += {'ATTR/XATTR support': libattr}
41043730a734SPaolo Bonzinisummary_info += {'RDMA support':      rdma}
41053730a734SPaolo Bonzinisummary_info += {'PVRDMA support':    have_pvrdma}
4106fbb4121dSPaolo Bonzinisummary_info += {'fdt support':       fdt_opt == 'disabled' ? false : fdt_opt}
4107bb647c49SPaolo Bonzinisummary_info += {'libcap-ng support': libcap_ng}
4108bb647c49SPaolo Bonzinisummary_info += {'bpf support':       libbpf}
41093f0a5d55SMarc-André Lureausummary_info += {'spice protocol support': spice_protocol}
41103f0a5d55SMarc-André Lureauif spice_protocol.found()
41113f0a5d55SMarc-André Lureau  summary_info += {'  spice server support': spice}
41123f0a5d55SMarc-André Lureauendif
4113bb647c49SPaolo Bonzinisummary_info += {'rbd support':       rbd}
4114bb647c49SPaolo Bonzinisummary_info += {'smartcard support': cacard}
4115bb647c49SPaolo Bonzinisummary_info += {'U2F support':       u2f}
4116bb647c49SPaolo Bonzinisummary_info += {'libusb':            libusb}
4117bb647c49SPaolo Bonzinisummary_info += {'usb net redir':     usbredir}
411888b6e618SPaolo Bonzinisummary_info += {'OpenGL support (epoxy)': opengl}
4119bb647c49SPaolo Bonzinisummary_info += {'GBM':               gbm}
4120bb647c49SPaolo Bonzinisummary_info += {'libiscsi support':  libiscsi}
4121bb647c49SPaolo Bonzinisummary_info += {'libnfs support':    libnfs}
4122f9332757SPaolo Bonziniif targetos == 'windows'
412320cf5cb4SPaolo Bonzini  if have_ga
41248821a389SMarc-André Lureau    summary_info += {'QGA VSS support':   have_qga_vss}
4125b846ab7cSPaolo Bonzini  endif
4126f9332757SPaolo Bonziniendif
4127bb647c49SPaolo Bonzinisummary_info += {'seccomp support':   seccomp}
4128bb647c49SPaolo Bonzinisummary_info += {'GlusterFS support': glusterfs}
41290d04c4c9SPaolo Bonzinisummary_info += {'TPM support':       have_tpm}
4130e6a52b36SThomas Huthsummary_info += {'libssh support':    libssh}
4131bb647c49SPaolo Bonzinisummary_info += {'lzo support':       lzo}
4132bb647c49SPaolo Bonzinisummary_info += {'snappy support':    snappy}
4133bb647c49SPaolo Bonzinisummary_info += {'bzip2 support':     libbzip2}
4134bb647c49SPaolo Bonzinisummary_info += {'lzfse support':     liblzfse}
4135bb647c49SPaolo Bonzinisummary_info += {'zstd support':      zstd}
4136488a8c73SPaolo Bonzinisummary_info += {'NUMA host support': numa}
413783602083SThomas Huthsummary_info += {'capstone':          capstone}
4138bb647c49SPaolo Bonzinisummary_info += {'libpmem support':   libpmem}
4139bb647c49SPaolo Bonzinisummary_info += {'libdaxctl support': libdaxctl}
4140bb647c49SPaolo Bonzinisummary_info += {'libudev':           libudev}
4141bb647c49SPaolo Bonzini# Dummy dependency, keep .found()
4142df4ea709SMax Reitzsummary_info += {'FUSE lseek':        fuse_lseek.found()}
41433d212b41SRichard W.M. Jonessummary_info += {'selinux':           selinux}
41447c10cb38SIlya Leoshkevichsummary_info += {'libdw':             libdw}
414569a78cceSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Dependencies')
4146f9332757SPaolo Bonzini
4147f9332757SPaolo Bonziniif not supported_cpus.contains(cpu)
4148f9332757SPaolo Bonzini  message()
4149f9332757SPaolo Bonzini  warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
4150f9332757SPaolo Bonzini  message()
4151f9332757SPaolo Bonzini  message('CPU host architecture ' + cpu + ' support is not currently maintained.')
4152f9332757SPaolo Bonzini  message('The QEMU project intends to remove support for this host CPU in')
4153f9332757SPaolo Bonzini  message('a future release if nobody volunteers to maintain it and to')
4154f9332757SPaolo Bonzini  message('provide a build host for our continuous integration setup.')
4155f9332757SPaolo Bonzini  message('configure has succeeded and you can continue to build, but')
4156f9332757SPaolo Bonzini  message('if you care about QEMU on this platform you should contact')
4157f9332757SPaolo Bonzini  message('us upstream at qemu-devel@nongnu.org.')
4158f9332757SPaolo Bonziniendif
4159f9332757SPaolo Bonzini
4160f9332757SPaolo Bonziniif not supported_oses.contains(targetos)
4161f9332757SPaolo Bonzini  message()
4162f9332757SPaolo Bonzini  warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
4163f9332757SPaolo Bonzini  message()
4164f9332757SPaolo Bonzini  message('Host OS ' + targetos + 'support is not currently maintained.')
4165f9332757SPaolo Bonzini  message('The QEMU project intends to remove support for this host OS in')
4166f9332757SPaolo Bonzini  message('a future release if nobody volunteers to maintain it and to')
4167f9332757SPaolo Bonzini  message('provide a build host for our continuous integration setup.')
4168f9332757SPaolo Bonzini  message('configure has succeeded and you can continue to build, but')
4169f9332757SPaolo Bonzini  message('if you care about QEMU on this platform you should contact')
4170f9332757SPaolo Bonzini  message('us upstream at qemu-devel@nongnu.org.')
4171f9332757SPaolo Bonziniendif
4172