xref: /qemu/meson.build (revision fc9a809e)
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')
203154fee4SMarc-André Lureauenable_modules = 'CONFIG_MODULES' in config_host
21d7dedf42SPaolo Bonzini
22e5134024SPaolo Bonzinicc = meson.get_compiler('c')
23e5134024SPaolo Bonziniall_languages = ['c']
24e5134024SPaolo Bonziniif add_languages('cpp', required: false, native: false)
25e5134024SPaolo Bonzini  all_languages += ['cpp']
26e5134024SPaolo Bonzini  cxx = meson.get_compiler('cpp')
27e5134024SPaolo Bonziniendif
28e5134024SPaolo Bonziniif targetos == 'darwin' and \
29e5134024SPaolo Bonzini   add_languages('objc', required: get_option('cocoa'), native: false)
30e5134024SPaolo Bonzini  all_languages += ['objc']
31e5134024SPaolo Bonzini  objc = meson.get_compiler('objc')
32e5134024SPaolo Bonziniendif
33e5134024SPaolo Bonzini
34e3667660SYonggang Luo# Temporary directory used for files created while
35e3667660SYonggang Luo# configure runs. Since it is in the build directory
36e3667660SYonggang Luo# we can safely blow away any previous version of it
37e3667660SYonggang Luo# (and we need not jump through hoops to try to delete
38e3667660SYonggang Luo# it when configure exits.)
39e3667660SYonggang Luotmpdir = meson.current_build_dir() / 'meson-private/temp'
408fe11232SMarc-André Lureau
418fe11232SMarc-André Lureauif get_option('qemu_suffix').startswith('/')
428fe11232SMarc-André Lureau  error('qemu_suffix cannot start with a /')
438fe11232SMarc-André Lureauendif
448fe11232SMarc-André Lureau
4516bf7a33SPaolo Bonziniqemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
46ab4c0996SMarc-André Lureauqemu_datadir = get_option('datadir') / get_option('qemu_suffix')
47491e74c1SMarc-André Lureauqemu_docdir = get_option('docdir') / get_option('qemu_suffix')
4816bf7a33SPaolo Bonziniqemu_moddir = get_option('libdir') / get_option('qemu_suffix')
4916bf7a33SPaolo Bonzini
5016bf7a33SPaolo Bonziniqemu_desktopdir = get_option('datadir') / 'applications'
5116bf7a33SPaolo Bonziniqemu_icondir = get_option('datadir') / 'icons'
5216bf7a33SPaolo Bonzini
53859aef02SPaolo Bonziniconfig_host_data = configuration_data()
54859aef02SPaolo Bonzinigenh = []
55b83a80e8SVladimir Sementsov-Ogievskiyqapi_trace_events = []
56a5665051SPaolo Bonzini
5720cf5cb4SPaolo Bonzinibsd_oses = ['gnu/kfreebsd', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'darwin']
58201e8ed7SPaolo Bonzinisupported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
59ba0e7333SRichard Hendersonsupported_cpus = ['ppc', 'ppc64', 's390x', 'riscv', 'x86', 'x86_64',
606d0b52edSRichard Henderson  'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc64']
61201e8ed7SPaolo Bonzini
62201e8ed7SPaolo Bonzinicpu = host_machine.cpu_family()
63c94c2394SRichard Henderson
64c94c2394SRichard Henderson# Unify riscv* to a single family.
65c94c2394SRichard Hendersonif cpu in ['riscv32', 'riscv64']
66c94c2394SRichard Henderson  cpu = 'riscv'
67c94c2394SRichard Hendersonendif
68c94c2394SRichard Henderson
6920cf5cb4SPaolo Bonzinitarget_dirs = config_host['TARGET_DIRS'].split()
7020cf5cb4SPaolo Bonzinihave_linux_user = false
7120cf5cb4SPaolo Bonzinihave_bsd_user = false
7220cf5cb4SPaolo Bonzinihave_system = false
7320cf5cb4SPaolo Bonziniforeach target : target_dirs
7420cf5cb4SPaolo Bonzini  have_linux_user = have_linux_user or target.endswith('linux-user')
7520cf5cb4SPaolo Bonzini  have_bsd_user = have_bsd_user or target.endswith('bsd-user')
7620cf5cb4SPaolo Bonzini  have_system = have_system or target.endswith('-softmmu')
7720cf5cb4SPaolo Bonziniendforeach
7820cf5cb4SPaolo Bonzinihave_user = have_linux_user or have_bsd_user
7920cf5cb4SPaolo Bonzinihave_tools = get_option('tools') \
8020cf5cb4SPaolo Bonzini  .disable_auto_if(not have_system) \
8120cf5cb4SPaolo Bonzini  .allowed()
8220cf5cb4SPaolo Bonzinihave_ga = get_option('guest_agent') \
8320cf5cb4SPaolo Bonzini  .disable_auto_if(not have_system and not have_tools) \
8428236ad8SBrad Smith  .require(targetos in ['sunos', 'linux', 'windows', 'freebsd', 'netbsd', 'openbsd'],
8520cf5cb4SPaolo Bonzini           error_message: 'unsupported OS for QEMU guest agent') \
8620cf5cb4SPaolo Bonzini  .allowed()
8720cf5cb4SPaolo Bonzinihave_block = have_system or have_tools
8820cf5cb4SPaolo Bonzini
8920cf5cb4SPaolo Bonzinipython = import('python').find_installation()
9020cf5cb4SPaolo Bonzini
91823eb013SPaolo Bonziniif cpu not in supported_cpus
92823eb013SPaolo Bonzini  host_arch = 'unknown'
93823eb013SPaolo Bonzinielif cpu == 'x86'
94823eb013SPaolo Bonzini  host_arch = 'i386'
950e3ed77dSRichard Hendersonelif cpu == 'mips64'
960e3ed77dSRichard Henderson  host_arch = 'mips'
97823eb013SPaolo Bonzinielse
98823eb013SPaolo Bonzini  host_arch = cpu
99823eb013SPaolo Bonziniendif
100823eb013SPaolo Bonzini
1018a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64']
1028a19980eSPaolo Bonzini  kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
1038a19980eSPaolo Bonzinielif cpu == 'aarch64'
1048a19980eSPaolo Bonzini  kvm_targets = ['aarch64-softmmu']
1058a19980eSPaolo Bonzinielif cpu == 's390x'
1068a19980eSPaolo Bonzini  kvm_targets = ['s390x-softmmu']
1078a19980eSPaolo Bonzinielif cpu in ['ppc', 'ppc64']
1088a19980eSPaolo Bonzini  kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
109fbc5884cSHuacai Chenelif cpu in ['mips', 'mips64']
110fbc5884cSHuacai Chen  kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
111fbf43c7dSYifei Jiangelif cpu in ['riscv']
112fbf43c7dSYifei Jiang  kvm_targets = ['riscv32-softmmu', 'riscv64-softmmu']
1138a19980eSPaolo Bonzinielse
1148a19980eSPaolo Bonzini  kvm_targets = []
1158a19980eSPaolo Bonziniendif
1168a19980eSPaolo Bonzini
11744d3d898SIgor Mammedovkvm_targets_c = '""'
11843a363aeSPaolo Bonziniif get_option('kvm').allowed() and targetos == 'linux'
119e741aff0SIgor Mammedov  kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
120e741aff0SIgor Mammedovendif
121e741aff0SIgor Mammedovconfig_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
122e741aff0SIgor Mammedov
1238a19980eSPaolo Bonziniaccelerator_targets = { 'CONFIG_KVM': kvm_targets }
124844a06bbSAlexander Graf
125844a06bbSAlexander Grafif cpu in ['aarch64']
126844a06bbSAlexander Graf  accelerator_targets += {
127844a06bbSAlexander Graf    'CONFIG_HVF': ['aarch64-softmmu']
128844a06bbSAlexander Graf  }
129844a06bbSAlexander Grafendif
130844a06bbSAlexander Graf
1310c3e41d4SAlex Bennéeif cpu in ['x86', 'x86_64', 'arm', 'aarch64']
1322a2d51bcSMarc-André Lureau  # i386 emulator provides xenpv machine type for multiple architectures
1330c3e41d4SAlex Bennée  accelerator_targets += {
1340c3e41d4SAlex Bennée    'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
1350c3e41d4SAlex Bennée  }
1360c3e41d4SAlex Bennéeendif
1378a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64']
1388a19980eSPaolo Bonzini  accelerator_targets += {
1398a19980eSPaolo Bonzini    'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
1408a19980eSPaolo Bonzini    'CONFIG_HVF': ['x86_64-softmmu'],
14174a414a1SReinoud Zandijk    'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
1428a19980eSPaolo Bonzini    'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
1438a19980eSPaolo Bonzini  }
1448a19980eSPaolo Bonziniendif
1458a19980eSPaolo Bonzini
146a1b176f9SPaolo Bonzinimodular_tcg = []
147a1b176f9SPaolo Bonzini# Darwin does not support references to thread-local variables in modules
148a1b176f9SPaolo Bonziniif targetos != 'darwin'
149dae0ec15SGerd Hoffmann  modular_tcg = ['i386-softmmu', 'x86_64-softmmu']
150a1b176f9SPaolo Bonziniendif
151dae0ec15SGerd Hoffmann
152eae9a1d1SPhilippe Mathieu-Daudéedk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ]
153e49c0ef6SPaolo Bonziniunpack_edk2_blobs = false
154e49c0ef6SPaolo Bonziniforeach target : edk2_targets
155e49c0ef6SPaolo Bonzini  if target in target_dirs
156e49c0ef6SPaolo Bonzini    bzip2 = find_program('bzip2', required: get_option('install_blobs'))
157e49c0ef6SPaolo Bonzini    unpack_edk2_blobs = bzip2.found()
158e49c0ef6SPaolo Bonzini    break
159eae9a1d1SPhilippe Mathieu-Daudé  endif
160e49c0ef6SPaolo Bonziniendforeach
16145b545ddSPhilippe Mathieu-Daudé
1629c29b741SPaolo Bonzinidtrace = not_found
1639c29b741SPaolo Bonzinistap = not_found
1649c29b741SPaolo Bonziniif 'dtrace' in get_option('trace_backends')
1659c29b741SPaolo Bonzini  dtrace = find_program('dtrace', required: true)
1669c29b741SPaolo Bonzini  stap = find_program('stap', required: false)
1679c29b741SPaolo Bonzini  if stap.found()
1689c29b741SPaolo Bonzini    # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
1699c29b741SPaolo Bonzini    # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
1709c29b741SPaolo Bonzini    # instead. QEMU --enable-modules depends on this because the SystemTap
1719c29b741SPaolo Bonzini    # semaphores are linked into the main binary and not the module's shared
1729c29b741SPaolo Bonzini    # object.
1739c29b741SPaolo Bonzini    add_global_arguments('-DSTAP_SDT_V2',
174e5134024SPaolo Bonzini                         native: false, language: all_languages)
1759c29b741SPaolo Bonzini  endif
1769c29b741SPaolo Bonziniendif
1779c29b741SPaolo Bonzini
17840c909f5SPaolo Bonziniif get_option('iasl') == ''
17940c909f5SPaolo Bonzini  iasl = find_program('iasl', required: false)
18040c909f5SPaolo Bonzinielse
18140c909f5SPaolo Bonzini  iasl = find_program(get_option('iasl'), required: true)
18240c909f5SPaolo Bonziniendif
18340c909f5SPaolo Bonzini
184201e8ed7SPaolo Bonzini##################
185201e8ed7SPaolo Bonzini# Compiler flags #
186201e8ed7SPaolo Bonzini##################
187201e8ed7SPaolo Bonzini
1888cc2d231SPaolo Bonziniqemu_cflags = config_host['QEMU_CFLAGS'].split()
1894cb37d11SPhilippe Mathieu-Daudéqemu_objcflags = config_host['QEMU_OBJCFLAGS'].split()
1908cc2d231SPaolo Bonziniqemu_ldflags = config_host['QEMU_LDFLAGS'].split()
1918cc2d231SPaolo Bonzini
192a0cbd2e8SPaolo Bonziniif get_option('prefer_static')
193e4333d14SPaolo Bonzini  qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
194e4333d14SPaolo Bonziniendif
195e4333d14SPaolo Bonzini
196e4333d14SPaolo Bonzini# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
197e4333d14SPaolo Bonzini# The combination is known as "full relro", because .got.plt is read-only too.
198e4333d14SPaolo Bonziniqemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now')
199e4333d14SPaolo Bonzini
200d2147e04SPaolo Bonziniif targetos == 'windows'
201d2147e04SPaolo Bonzini  qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat')
2022d73fa74SPaolo Bonzini  qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va')
203d2147e04SPaolo Bonziniendif
204d2147e04SPaolo Bonzini
205c55cf6abSPaolo Bonziniif get_option('gprof')
206c55cf6abSPaolo Bonzini  qemu_cflags += ['-p']
2074cb37d11SPhilippe Mathieu-Daudé  qemu_objcflags += ['-p']
208c55cf6abSPaolo Bonzini  qemu_ldflags += ['-p']
209c55cf6abSPaolo Bonziniendif
210c55cf6abSPaolo Bonzini
211ff9ed62bSAlexander Bulekov# Specify linker-script with add_project_link_arguments so that it is not placed
212ff9ed62bSAlexander Bulekov# within a linker --start-group/--end-group pair
213537b7248SPaolo Bonziniif get_option('fuzzing')
214537b7248SPaolo Bonzini  # Specify a filter to only instrument code that is directly related to
215537b7248SPaolo Bonzini  # virtual-devices.
216537b7248SPaolo Bonzini  configure_file(output: 'instrumentation-filter',
217537b7248SPaolo Bonzini                 input: 'scripts/oss-fuzz/instrumentation-filter-template',
218537b7248SPaolo Bonzini                 copy: true)
219aa4f3a3bSAlexander Bulekov
220aa4f3a3bSAlexander Bulekov  if cc.compiles('int main () { return 0; }',
221aa4f3a3bSAlexander Bulekov                  name: '-fsanitize-coverage-allowlist=/dev/null',
222e56d0970SAlexander Bulekov                 args: ['-fsanitize-coverage-allowlist=/dev/null',
223e56d0970SAlexander Bulekov                        '-fsanitize-coverage=trace-pc'] )
224aa4f3a3bSAlexander Bulekov    add_global_arguments('-fsanitize-coverage-allowlist=instrumentation-filter',
225e5134024SPaolo Bonzini                         native: false, language: all_languages)
226aa4f3a3bSAlexander Bulekov  endif
227537b7248SPaolo Bonzini
228537b7248SPaolo Bonzini  if get_option('fuzzing_engine') == ''
229537b7248SPaolo Bonzini    # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
230537b7248SPaolo Bonzini    # compiled code.  To build non-fuzzer binaries with --enable-fuzzing, link
231537b7248SPaolo Bonzini    # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
232537b7248SPaolo Bonzini    # unable to bind the fuzzer-related callbacks added by instrumentation.
233537b7248SPaolo Bonzini    add_global_arguments('-fsanitize=fuzzer-no-link',
234e5134024SPaolo Bonzini                         native: false, language: all_languages)
235537b7248SPaolo Bonzini    add_global_link_arguments('-fsanitize=fuzzer-no-link',
236e5134024SPaolo Bonzini                              native: false, language: all_languages)
237537b7248SPaolo Bonzini    # For the actual fuzzer binaries, we need to link against the libfuzzer
238537b7248SPaolo Bonzini    # library. They need to be configurable, to support OSS-Fuzz
239537b7248SPaolo Bonzini    fuzz_exe_ldflags = ['-fsanitize=fuzzer']
240537b7248SPaolo Bonzini  else
241537b7248SPaolo Bonzini    # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and
242537b7248SPaolo Bonzini    # the needed CFLAGS have already been provided
243537b7248SPaolo Bonzini    fuzz_exe_ldflags = get_option('fuzzing_engine').split()
244537b7248SPaolo Bonzini  endif
245ff9ed62bSAlexander Bulekovendif
246ff9ed62bSAlexander Bulekov
247b485458eSPaolo Bonzini# Check that the C++ compiler exists and works with the C compiler.
248b485458eSPaolo Bonzinilink_language = 'c'
249b485458eSPaolo Bonzinilinker = cc
250b485458eSPaolo Bonziniqemu_cxxflags = []
251e5134024SPaolo Bonziniif 'cpp' in all_languages
252b485458eSPaolo Bonzini  add_global_arguments(['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'],
253b485458eSPaolo Bonzini                       native: false, language: 'cpp')
254b485458eSPaolo Bonzini  foreach k: qemu_cflags
255b485458eSPaolo Bonzini    if k not in ['-Wstrict-prototypes', '-Wmissing-prototypes', '-Wnested-externs',
256b485458eSPaolo Bonzini                 '-Wold-style-declaration', '-Wold-style-definition', '-Wredundant-decls']
257b485458eSPaolo Bonzini      qemu_cxxflags += [k]
258b485458eSPaolo Bonzini    endif
259b485458eSPaolo Bonzini  endforeach
260b485458eSPaolo Bonzini
261b485458eSPaolo Bonzini  if cxx.links(files('scripts/main.c'), args: qemu_cflags)
262b485458eSPaolo Bonzini    link_language = 'cpp'
263b485458eSPaolo Bonzini    linker = cxx
264b485458eSPaolo Bonzini  else
265b485458eSPaolo Bonzini    message('C++ compiler does not work with C compiler')
266b485458eSPaolo Bonzini    message('Disabling C++-specific optional code')
267b485458eSPaolo Bonzini  endif
268b485458eSPaolo Bonziniendif
269b485458eSPaolo Bonzini
270e4333d14SPaolo Bonzini# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
271e4333d14SPaolo Bonziniif targetos != 'sunos' and not config_host.has_key('CONFIG_TSAN')
272e4333d14SPaolo Bonzini  qemu_ldflags += linker.get_supported_link_arguments('-Wl,--warn-common')
273e4333d14SPaolo Bonziniendif
274e4333d14SPaolo Bonzini
275e5134024SPaolo Bonziniadd_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
276a5665051SPaolo Bonzini
277e5134024SPaolo Bonziniadd_global_arguments(qemu_cflags, native: false, language: 'c')
278e5134024SPaolo Bonziniadd_global_arguments(qemu_cxxflags, native: false, language: 'cpp')
279e5134024SPaolo Bonziniadd_global_arguments(qemu_objcflags, native: false, language: 'objc')
2801e6e616dSPaolo Bonziniif targetos == 'linux'
2811e6e616dSPaolo Bonzini  add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
2821e6e616dSPaolo Bonzini                        '-isystem', 'linux-headers',
283e5134024SPaolo Bonzini                        language: all_languages)
2841e6e616dSPaolo Bonziniendif
2851e6e616dSPaolo Bonzini
28623a77b2dSPaolo Bonziniadd_project_arguments('-iquote', '.',
2871e6e616dSPaolo Bonzini                      '-iquote', meson.current_source_dir(),
2881e6e616dSPaolo Bonzini                      '-iquote', meson.current_source_dir() / 'include',
289e5134024SPaolo Bonzini                      language: all_languages)
290a5665051SPaolo Bonzini
291deb62371SPaolo Bonzinisparse = find_program('cgcc', required: get_option('sparse'))
292deb62371SPaolo Bonziniif sparse.found()
293968b4db3SPaolo Bonzini  run_target('sparse',
294968b4db3SPaolo Bonzini             command: [find_program('scripts/check_sparse.py'),
295deb62371SPaolo Bonzini                       'compile_commands.json', sparse.full_path(), '-Wbitwise',
296deb62371SPaolo Bonzini                       '-Wno-transparent-union', '-Wno-old-initializer',
297deb62371SPaolo Bonzini                       '-Wno-non-pointer-null'])
298968b4db3SPaolo Bonziniendif
299968b4db3SPaolo Bonzini
3006ec0e15dSPaolo Bonzini###########################################
3016ec0e15dSPaolo Bonzini# Target-specific checks and dependencies #
3026ec0e15dSPaolo Bonzini###########################################
3036ec0e15dSPaolo Bonzini
304b7a75c8cSPaolo Bonzini# Fuzzing
305537b7248SPaolo Bonziniif get_option('fuzzing') and get_option('fuzzing_engine') == '' and \
306537b7248SPaolo Bonzini    not cc.links('''
307537b7248SPaolo Bonzini          #include <stdint.h>
308537b7248SPaolo Bonzini          #include <sys/types.h>
309537b7248SPaolo Bonzini          int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
310537b7248SPaolo Bonzini          int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
311537b7248SPaolo Bonzini        ''',
312537b7248SPaolo Bonzini        args: ['-Werror', '-fsanitize=fuzzer'])
313537b7248SPaolo Bonzini  error('Your compiler does not support -fsanitize=fuzzer')
314537b7248SPaolo Bonziniendif
315537b7248SPaolo Bonzini
316b7a75c8cSPaolo Bonzini# Tracing backends
3179c29b741SPaolo Bonziniif 'ftrace' in get_option('trace_backends') and targetos != 'linux'
3189c29b741SPaolo Bonzini  error('ftrace is supported only on Linux')
3199c29b741SPaolo Bonziniendif
3209c29b741SPaolo Bonziniif 'syslog' in get_option('trace_backends') and not cc.compiles('''
3219c29b741SPaolo Bonzini    #include <syslog.h>
3229c29b741SPaolo Bonzini    int main(void) {
3239c29b741SPaolo Bonzini        openlog("qemu", LOG_PID, LOG_DAEMON);
3249c29b741SPaolo Bonzini        syslog(LOG_INFO, "configure");
3259c29b741SPaolo Bonzini        return 0;
3269c29b741SPaolo Bonzini    }''')
3279c29b741SPaolo Bonzini  error('syslog is not supported on this system')
3289c29b741SPaolo Bonziniendif
3299c29b741SPaolo Bonzini
330b7a75c8cSPaolo Bonzini# Miscellaneous Linux-only features
331a436d6d4SPaolo Bonziniget_option('mpath') \
332a436d6d4SPaolo Bonzini  .require(targetos == 'linux', error_message: 'Multipath is supported only on Linux')
3336ec0e15dSPaolo Bonzini
334a436d6d4SPaolo Bonzinimultiprocess_allowed = get_option('multiprocess') \
335a436d6d4SPaolo Bonzini  .require(targetos == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \
336a436d6d4SPaolo Bonzini  .allowed()
337106ad1f9SPaolo Bonzini
33855116968SJagannathan Ramanvfio_user_server_allowed = get_option('vfio_user_server') \
33955116968SJagannathan Raman  .require(targetos == 'linux', error_message: 'vfio-user server is supported only on Linux') \
34055116968SJagannathan Raman  .allowed()
34155116968SJagannathan Raman
3420d04c4c9SPaolo Bonzinihave_tpm = get_option('tpm') \
3430d04c4c9SPaolo Bonzini  .require(targetos != 'windows', error_message: 'TPM emulation only available on POSIX systems') \
3440d04c4c9SPaolo Bonzini  .allowed()
3450d04c4c9SPaolo Bonzini
3462a3129a3SPaolo Bonzini# vhost
3472df89d54SPaolo Bonzinihave_vhost_user = get_option('vhost_user') \
3482df89d54SPaolo Bonzini  .disable_auto_if(targetos != 'linux') \
3492df89d54SPaolo Bonzini  .require(targetos != 'windows',
3502df89d54SPaolo Bonzini           error_message: 'vhost-user is not available on Windows').allowed()
3512df89d54SPaolo Bonzinihave_vhost_vdpa = get_option('vhost_vdpa') \
3522df89d54SPaolo Bonzini  .require(targetos == 'linux',
3532df89d54SPaolo Bonzini           error_message: 'vhost-vdpa is only available on Linux').allowed()
3542df89d54SPaolo Bonzinihave_vhost_kernel = get_option('vhost_kernel') \
3552df89d54SPaolo Bonzini  .require(targetos == 'linux',
3562df89d54SPaolo Bonzini           error_message: 'vhost-kernel is only available on Linux').allowed()
3572df89d54SPaolo Bonzinihave_vhost_user_crypto = get_option('vhost_crypto') \
3582df89d54SPaolo Bonzini  .require(have_vhost_user,
3592df89d54SPaolo Bonzini           error_message: 'vhost-crypto requires vhost-user to be enabled').allowed()
3602df89d54SPaolo Bonzini
36143b6d7eeSPaolo Bonzinihave_vhost = have_vhost_user or have_vhost_vdpa or have_vhost_kernel
3622df89d54SPaolo Bonzini
3632df89d54SPaolo Bonzinihave_vhost_net_user = have_vhost_user and get_option('vhost_net').allowed()
3642df89d54SPaolo Bonzinihave_vhost_net_vdpa = have_vhost_vdpa and get_option('vhost_net').allowed()
3652df89d54SPaolo Bonzinihave_vhost_net_kernel = have_vhost_kernel and get_option('vhost_net').allowed()
3662df89d54SPaolo Bonzinihave_vhost_net = have_vhost_net_kernel or have_vhost_net_user or have_vhost_net_vdpa
3672a3129a3SPaolo Bonzini
368b7a75c8cSPaolo Bonzini# Target-specific libraries and flags
3697fa1c635SPaolo Bonzinilibm = cc.find_library('m', required: false)
3706d7c7c2dSPaolo Bonzinithreads = dependency('threads')
371a81df1b6SPaolo Bonziniutil = cc.find_library('util', required: false)
3724a96337dSPaolo Bonziniwinmm = []
373a81df1b6SPaolo Bonzinisocket = []
37404c6f1e7SMarc-André Lureauversion_res = []
375d92989aaSMarc-André Lureaucoref = []
376d92989aaSMarc-André Lureauiokit = []
377b6c7cfd4SPaolo Bonziniemulator_link_args = []
37874a414a1SReinoud Zandijknvmm =not_found
3798a19980eSPaolo Bonzinihvf = not_found
38023011f44SMarc-André Lureaumidl = not_found
38123011f44SMarc-André Lureauwidl = not_found
382cf60ccc3SAkihiko Odakipathcch = not_found
383a6305081SPaolo Bonzinihost_dsosuf = '.so'
384a81df1b6SPaolo Bonziniif targetos == 'windows'
38523011f44SMarc-André Lureau  midl = find_program('midl', required: false)
38623011f44SMarc-André Lureau  widl = find_program('widl', required: false)
387cf60ccc3SAkihiko Odaki  pathcch = cc.find_library('pathcch')
388a81df1b6SPaolo Bonzini  socket = cc.find_library('ws2_32')
3894a96337dSPaolo Bonzini  winmm = cc.find_library('winmm')
39004c6f1e7SMarc-André Lureau
39104c6f1e7SMarc-André Lureau  win = import('windows')
39204c6f1e7SMarc-André Lureau  version_res = win.compile_resources('version.rc',
39304c6f1e7SMarc-André Lureau                                      depend_files: files('pc-bios/qemu-nsis.ico'),
39404c6f1e7SMarc-André Lureau                                      include_directories: include_directories('.'))
395a6305081SPaolo Bonzini  host_dsosuf = '.dll'
396d92989aaSMarc-André Lureauelif targetos == 'darwin'
397d92989aaSMarc-André Lureau  coref = dependency('appleframeworks', modules: 'CoreFoundation')
39814176c8dSJoelle van Dyne  iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
399a6305081SPaolo Bonzini  host_dsosuf = '.dylib'
400cfad62f1SPaolo Bonzinielif targetos == 'sunos'
401cfad62f1SPaolo Bonzini  socket = [cc.find_library('socket'),
402cfad62f1SPaolo Bonzini            cc.find_library('nsl'),
403cfad62f1SPaolo Bonzini            cc.find_library('resolv')]
404cfad62f1SPaolo Bonzinielif targetos == 'haiku'
405cfad62f1SPaolo Bonzini  socket = [cc.find_library('posix_error_mapper'),
406cfad62f1SPaolo Bonzini            cc.find_library('network'),
407cfad62f1SPaolo Bonzini            cc.find_library('bsd')]
408b6c7cfd4SPaolo Bonzinielif targetos == 'openbsd'
40943a363aeSPaolo Bonzini  if get_option('tcg').allowed() and target_dirs.length() > 0
410b6c7cfd4SPaolo Bonzini    # Disable OpenBSD W^X if available
411b6c7cfd4SPaolo Bonzini    emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
412b6c7cfd4SPaolo Bonzini  endif
413a81df1b6SPaolo Bonziniendif
4146ec0e15dSPaolo Bonzini
415b7a75c8cSPaolo Bonzini# Target-specific configuration of accelerators
4168a19980eSPaolo Bonziniaccelerators = []
41743a363aeSPaolo Bonziniif get_option('kvm').allowed() and targetos == 'linux'
4188a19980eSPaolo Bonzini  accelerators += 'CONFIG_KVM'
4198a19980eSPaolo Bonziniendif
42043a363aeSPaolo Bonziniif get_option('whpx').allowed() and targetos == 'windows'
42157e2a1f8SSunil Muthuswamy  if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
4228a19980eSPaolo Bonzini    error('WHPX requires 64-bit host')
4238a19980eSPaolo Bonzini  elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
4248a19980eSPaolo Bonzini       cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
4258a19980eSPaolo Bonzini    accelerators += 'CONFIG_WHPX'
4268a19980eSPaolo Bonzini  endif
4278a19980eSPaolo Bonziniendif
42843a363aeSPaolo Bonziniif get_option('hvf').allowed()
4298a19980eSPaolo Bonzini  hvf = dependency('appleframeworks', modules: 'Hypervisor',
4308a19980eSPaolo Bonzini                   required: get_option('hvf'))
4318a19980eSPaolo Bonzini  if hvf.found()
4328a19980eSPaolo Bonzini    accelerators += 'CONFIG_HVF'
4338a19980eSPaolo Bonzini  endif
4348a19980eSPaolo Bonziniendif
43543a363aeSPaolo Bonziniif get_option('hax').allowed()
4368a19980eSPaolo Bonzini  if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
4378a19980eSPaolo Bonzini    accelerators += 'CONFIG_HAX'
4388a19980eSPaolo Bonzini  endif
4398a19980eSPaolo Bonziniendif
44074a414a1SReinoud Zandijkif targetos == 'netbsd'
44174a414a1SReinoud Zandijk  nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
44274a414a1SReinoud Zandijk  if nvmm.found()
44374a414a1SReinoud Zandijk    accelerators += 'CONFIG_NVMM'
44474a414a1SReinoud Zandijk  endif
44574a414a1SReinoud Zandijkendif
44623a77b2dSPaolo Bonzini
447823eb013SPaolo Bonzinitcg_arch = host_arch
44843a363aeSPaolo Bonziniif get_option('tcg').allowed()
449823eb013SPaolo Bonzini  if host_arch == 'unknown'
45023a77b2dSPaolo Bonzini    if get_option('tcg_interpreter')
451f1f727acSPhilippe Mathieu-Daudé      warning('Unsupported CPU @0@, will use TCG with TCI (slow)'.format(cpu))
4528a19980eSPaolo Bonzini    else
4538a19980eSPaolo Bonzini      error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
4548a19980eSPaolo Bonzini    endif
455fa2f7b0bSPhilippe Mathieu-Daudé  elif get_option('tcg_interpreter')
4561c282da3SPhilippe Mathieu-Daudé    warning('Use of the TCG interpreter is not recommended on this host')
457fa2f7b0bSPhilippe Mathieu-Daudé    warning('architecture. There is a native TCG execution backend available')
458fa2f7b0bSPhilippe Mathieu-Daudé    warning('which provides substantially better performance and reliability.')
459fa2f7b0bSPhilippe Mathieu-Daudé    warning('It is strongly recommended to remove the --enable-tcg-interpreter')
460fa2f7b0bSPhilippe Mathieu-Daudé    warning('configuration option on this architecture to use the native')
461fa2f7b0bSPhilippe Mathieu-Daudé    warning('backend.')
4628a19980eSPaolo Bonzini  endif
46323a77b2dSPaolo Bonzini  if get_option('tcg_interpreter')
46423a77b2dSPaolo Bonzini    tcg_arch = 'tci'
465ed145144SRichard Henderson    config_host += { 'CONFIG_TCG_INTERPRETER': 'y' }
466823eb013SPaolo Bonzini  elif host_arch == 'x86_64'
46723a77b2dSPaolo Bonzini    tcg_arch = 'i386'
468823eb013SPaolo Bonzini  elif host_arch == 'ppc64'
46923a77b2dSPaolo Bonzini    tcg_arch = 'ppc'
47023a77b2dSPaolo Bonzini  endif
47123a77b2dSPaolo Bonzini  add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
472e5134024SPaolo Bonzini                        language: all_languages)
47323a77b2dSPaolo Bonzini
4748a19980eSPaolo Bonzini  accelerators += 'CONFIG_TCG'
4758a19980eSPaolo Bonzini  config_host += { 'CONFIG_TCG': 'y' }
4768a19980eSPaolo Bonziniendif
4778a19980eSPaolo Bonzini
4788a19980eSPaolo Bonziniif 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
4798a19980eSPaolo Bonzini  error('KVM not available on this platform')
4808a19980eSPaolo Bonziniendif
4818a19980eSPaolo Bonziniif 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
4828a19980eSPaolo Bonzini  error('HVF not available on this platform')
4838a19980eSPaolo Bonziniendif
48474a414a1SReinoud Zandijkif 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
48574a414a1SReinoud Zandijk  error('NVMM not available on this platform')
48674a414a1SReinoud Zandijkendif
4878a19980eSPaolo Bonziniif 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
4888a19980eSPaolo Bonzini  error('WHPX not available on this platform')
4898a19980eSPaolo Bonziniendif
490b4e312e9SPaolo Bonzini
4916ec0e15dSPaolo Bonzini################
4926ec0e15dSPaolo Bonzini# Dependencies #
4936ec0e15dSPaolo Bonzini################
4946ec0e15dSPaolo Bonzini
495*fc9a809eSPaolo Bonzini# When bumping glib minimum version, please check also whether to increase
496*fc9a809eSPaolo Bonzini# the _WIN32_WINNT setting in osdep.h according to the value from glib
497*fc9a809eSPaolo Bonziniglib_req_ver = '>=2.56.0'
498*fc9a809eSPaolo Bonziniglib_pc = dependency('glib-2.0', version: glib_req_ver, required: true,
499*fc9a809eSPaolo Bonzini                    method: 'pkg-config')
500*fc9a809eSPaolo Bonziniglib_cflags = []
501*fc9a809eSPaolo Bonziniif config_host.has_key('CONFIG_MODULES')
502*fc9a809eSPaolo Bonzini  gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true,
503*fc9a809eSPaolo Bonzini                       method: 'pkg-config')
504*fc9a809eSPaolo Bonzinielif config_host.has_key('CONFIG_PLUGIN')
505*fc9a809eSPaolo Bonzini  gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true,
506*fc9a809eSPaolo Bonzini                       method: 'pkg-config')
507*fc9a809eSPaolo Bonzinielse
508*fc9a809eSPaolo Bonzini  gmodule = not_found
509e3feb2ccSEmilio Cotaendif
510953d5a9eSMarc-André Lureau
511*fc9a809eSPaolo Bonzini# This workaround is required due to a bug in pkg-config file for glib as it
512*fc9a809eSPaolo Bonzini# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
513*fc9a809eSPaolo Bonziniif targetos == 'windows' and get_option('prefer_static')
514*fc9a809eSPaolo Bonzini  glib_cflags += ['-DGLIB_STATIC_COMPILATION']
515*fc9a809eSPaolo Bonziniendif
516*fc9a809eSPaolo Bonzini
517*fc9a809eSPaolo Bonzini# Sanity check that the current size_t matches the
518*fc9a809eSPaolo Bonzini# size that glib thinks it should be. This catches
519*fc9a809eSPaolo Bonzini# problems on multi-arch where people try to build
520*fc9a809eSPaolo Bonzini# 32-bit QEMU while pointing at 64-bit glib headers
521*fc9a809eSPaolo Bonzini
522*fc9a809eSPaolo Bonziniif not cc.compiles('''
523*fc9a809eSPaolo Bonzini  #include <glib.h>
524*fc9a809eSPaolo Bonzini  #include <unistd.h>
525*fc9a809eSPaolo Bonzini
526*fc9a809eSPaolo Bonzini  #define QEMU_BUILD_BUG_ON(x) \
527*fc9a809eSPaolo Bonzini  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
528*fc9a809eSPaolo Bonzini
529*fc9a809eSPaolo Bonzini  int main(void) {
530*fc9a809eSPaolo Bonzini     QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
531*fc9a809eSPaolo Bonzini     return 0;
532*fc9a809eSPaolo Bonzini  }''', dependencies: glib_pc, args: glib_cflags)
533*fc9a809eSPaolo Bonzini  error('''sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T.
534*fc9a809eSPaolo Bonzini        You probably need to set PKG_CONFIG_LIBDIR" to point
535*fc9a809eSPaolo Bonzini        to the right pkg-config files for your build target.''')
536*fc9a809eSPaolo Bonziniendif
537*fc9a809eSPaolo Bonzini
538*fc9a809eSPaolo Bonzini# Silence clang warnings triggered by glib < 2.57.2
539*fc9a809eSPaolo Bonziniif not cc.compiles('''
540*fc9a809eSPaolo Bonzini  #include <glib.h>
541*fc9a809eSPaolo Bonzini  typedef struct Foo {
542*fc9a809eSPaolo Bonzini    int i;
543*fc9a809eSPaolo Bonzini  } Foo;
544*fc9a809eSPaolo Bonzini  static void foo_free(Foo *f)
545*fc9a809eSPaolo Bonzini  {
546*fc9a809eSPaolo Bonzini    g_free(f);
547*fc9a809eSPaolo Bonzini  }
548*fc9a809eSPaolo Bonzini  G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free)
549*fc9a809eSPaolo Bonzini  int main(void) { return 0; }''', dependencies: glib_pc, args: ['-Werror'])
550*fc9a809eSPaolo Bonzini  glib_cflags += cc.get_supported_arguments('-Wno-unused-function')
551*fc9a809eSPaolo Bonziniendif
552*fc9a809eSPaolo Bonziniglib = declare_dependency(dependencies: [glib_pc, gmodule],
553*fc9a809eSPaolo Bonzini                          compile_args: glib_cflags,
554*fc9a809eSPaolo Bonzini                          version: glib_pc.version())
555*fc9a809eSPaolo Bonzini
556*fc9a809eSPaolo Bonzini# Check whether glib has gslice, which we have to avoid for correctness.
557*fc9a809eSPaolo Bonzini# TODO: remove this check and the corresponding workaround (qtree) when
558*fc9a809eSPaolo Bonzini# the minimum supported glib is >= 2.75.3
559*fc9a809eSPaolo Bonziniglib_has_gslice = glib.version().version_compare('<2.75.3')
560*fc9a809eSPaolo Bonzini
561*fc9a809eSPaolo Bonzini# override glib dep to include the above refinements
562*fc9a809eSPaolo Bonzinimeson.override_dependency('glib-2.0', glib)
563*fc9a809eSPaolo Bonzini
564*fc9a809eSPaolo Bonzini# The path to glib.h is added to all compilation commands.
565*fc9a809eSPaolo Bonziniadd_project_dependencies(glib.partial_dependency(compile_args: true, includes: true),
566*fc9a809eSPaolo Bonzini                         native: false, language: all_languages)
567*fc9a809eSPaolo Bonzini
568a81df1b6SPaolo Bonzinigio = not_found
5697544060eSPaolo Bonzinigdbus_codegen = not_found
570bb2dc4b7SPaolo Bonzinigdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio'
5717544060eSPaolo Bonziniif not get_option('gio').auto() or have_system
5727544060eSPaolo Bonzini  gio = dependency('gio-2.0', required: get_option('gio'),
573063d5119SPaolo Bonzini                   method: 'pkg-config')
5747544060eSPaolo Bonzini  if gio.found() and not cc.links('''
5757544060eSPaolo Bonzini    #include <gio/gio.h>
5767544060eSPaolo Bonzini    int main(void)
5777544060eSPaolo Bonzini    {
5787544060eSPaolo Bonzini      g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
5797544060eSPaolo Bonzini      return 0;
5807544060eSPaolo Bonzini    }''', dependencies: [glib, gio])
5817544060eSPaolo Bonzini    if get_option('gio').enabled()
5827544060eSPaolo Bonzini      error('The installed libgio is broken for static linking')
583a81df1b6SPaolo Bonzini    endif
5847544060eSPaolo Bonzini    gio = not_found
5857544060eSPaolo Bonzini  endif
5867544060eSPaolo Bonzini  if gio.found()
5877544060eSPaolo Bonzini    gdbus_codegen = find_program(gio.get_variable('gdbus_codegen'),
5887544060eSPaolo Bonzini                                 required: get_option('gio'))
5897544060eSPaolo Bonzini    gio_unix = dependency('gio-unix-2.0', required: get_option('gio'),
590063d5119SPaolo Bonzini                          method: 'pkg-config')
5917544060eSPaolo Bonzini    gio = declare_dependency(dependencies: [gio, gio_unix],
5927544060eSPaolo Bonzini                             version: gio.version())
5937544060eSPaolo Bonzini  endif
5947544060eSPaolo Bonziniendif
595bb2dc4b7SPaolo Bonziniif gdbus_codegen.found() and get_option('cfi')
596bb2dc4b7SPaolo Bonzini  gdbus_codegen = not_found
597bb2dc4b7SPaolo Bonzini  gdbus_codegen_error = '@0@ uses gdbus-codegen, which does not support control flow integrity'
598bb2dc4b7SPaolo Bonziniendif
5997544060eSPaolo Bonzini
600a81df1b6SPaolo Bonzinilttng = not_found
6019c29b741SPaolo Bonziniif 'ust' in get_option('trace_backends')
602e32aaa5aSMarc-André Lureau  lttng = dependency('lttng-ust', required: true, version: '>= 2.1',
603063d5119SPaolo Bonzini                     method: 'pkg-config')
604a81df1b6SPaolo Bonziniendif
605b7612f45SPaolo Bonzinipixman = not_found
606b7612f45SPaolo Bonziniif have_system or have_tools
607b7612f45SPaolo Bonzini  pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
608063d5119SPaolo Bonzini                      method: 'pkg-config')
609b7612f45SPaolo Bonziniendif
610063d5119SPaolo Bonzinizlib = dependency('zlib', required: true)
61153c22b68SPaolo Bonzini
612ff66f3e5SPaolo Bonzinilibaio = not_found
613ff66f3e5SPaolo Bonziniif not get_option('linux_aio').auto() or have_block
614ff66f3e5SPaolo Bonzini  libaio = cc.find_library('aio', has_headers: ['libaio.h'],
615063d5119SPaolo Bonzini                           required: get_option('linux_aio'))
616ff66f3e5SPaolo Bonziniendif
617354081d4SLeonardo Bras
618354081d4SLeonardo Braslinux_io_uring_test = '''
619354081d4SLeonardo Bras  #include <liburing.h>
620354081d4SLeonardo Bras  #include <linux/errqueue.h>
621354081d4SLeonardo Bras
622354081d4SLeonardo Bras  int main(void) { return 0; }'''
623354081d4SLeonardo Bras
6245e5733e5SMarc-André Lureaulinux_io_uring = not_found
62553c22b68SPaolo Bonziniif not get_option('linux_io_uring').auto() or have_block
626a41b4fdcSDaniel P. Berrangé  linux_io_uring = dependency('liburing', version: '>=0.3',
627a41b4fdcSDaniel P. Berrangé                              required: get_option('linux_io_uring'),
628063d5119SPaolo Bonzini                              method: 'pkg-config')
629354081d4SLeonardo Bras  if not cc.links(linux_io_uring_test)
630354081d4SLeonardo Bras    linux_io_uring = not_found
6315e5733e5SMarc-André Lureau  endif
632354081d4SLeonardo Brasendif
633354081d4SLeonardo Bras
6345e5733e5SMarc-André Lureaulibnfs = not_found
63530045c05SPaolo Bonziniif not get_option('libnfs').auto() or have_block
63630045c05SPaolo Bonzini  libnfs = dependency('libnfs', version: '>=1.9.3',
63730045c05SPaolo Bonzini                      required: get_option('libnfs'),
638063d5119SPaolo Bonzini                      method: 'pkg-config')
6395e5733e5SMarc-André Lureauendif
640f7f2d651SPaolo Bonzini
641f7f2d651SPaolo Bonzinilibattr_test = '''
642f7f2d651SPaolo Bonzini  #include <stddef.h>
643f7f2d651SPaolo Bonzini  #include <sys/types.h>
644f7f2d651SPaolo Bonzini  #ifdef CONFIG_LIBATTR
645f7f2d651SPaolo Bonzini  #include <attr/xattr.h>
646f7f2d651SPaolo Bonzini  #else
647f7f2d651SPaolo Bonzini  #include <sys/xattr.h>
648f7f2d651SPaolo Bonzini  #endif
649f7f2d651SPaolo Bonzini  int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
650f7f2d651SPaolo Bonzini
651ec0d5893SMarc-André Lureaulibattr = not_found
652f7f2d651SPaolo Bonzinihave_old_libattr = false
65343a363aeSPaolo Bonziniif get_option('attr').allowed()
654f7f2d651SPaolo Bonzini  if cc.links(libattr_test)
655f7f2d651SPaolo Bonzini    libattr = declare_dependency()
656f7f2d651SPaolo Bonzini  else
657f7f2d651SPaolo Bonzini    libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
658063d5119SPaolo Bonzini                              required: get_option('attr'))
659f7f2d651SPaolo Bonzini    if libattr.found() and not \
660f7f2d651SPaolo Bonzini      cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
661f7f2d651SPaolo Bonzini      libattr = not_found
662f7f2d651SPaolo Bonzini      if get_option('attr').enabled()
663f7f2d651SPaolo Bonzini        error('could not link libattr')
664f7f2d651SPaolo Bonzini      else
665f7f2d651SPaolo Bonzini        warning('could not link libattr, disabling')
666ec0d5893SMarc-André Lureau      endif
667f7f2d651SPaolo Bonzini    else
668f7f2d651SPaolo Bonzini      have_old_libattr = libattr.found()
669f7f2d651SPaolo Bonzini    endif
670f7f2d651SPaolo Bonzini  endif
671f7f2d651SPaolo Bonziniendif
672f7f2d651SPaolo Bonzini
67352eaefd3SAkihiko Odakicocoa = dependency('appleframeworks', modules: ['Cocoa', 'CoreVideo'],
67452eaefd3SAkihiko Odaki                   required: get_option('cocoa'))
675c1ec4941SPaolo Bonzini
676e2c1d78dSVladislav Yaroshchukvmnet = dependency('appleframeworks', modules: 'vmnet', required: get_option('vmnet'))
677e2c1d78dSVladislav Yaroshchukif vmnet.found() and not cc.has_header_symbol('vmnet/vmnet.h',
678e2c1d78dSVladislav Yaroshchuk                                              'VMNET_BRIDGED_MODE',
679e2c1d78dSVladislav Yaroshchuk                                              dependencies: vmnet)
680e2c1d78dSVladislav Yaroshchuk  vmnet = not_found
681e2c1d78dSVladislav Yaroshchuk  if get_option('vmnet').enabled()
682e2c1d78dSVladislav Yaroshchuk    error('vmnet.framework API is outdated')
683e2c1d78dSVladislav Yaroshchuk  else
684e2c1d78dSVladislav Yaroshchuk    warning('vmnet.framework API is outdated, disabling')
685e2c1d78dSVladislav Yaroshchuk  endif
686e2c1d78dSVladislav Yaroshchukendif
687e2c1d78dSVladislav Yaroshchuk
6883f99cf57SPaolo Bonziniseccomp = not_found
68973422d95SMichal Privoznikseccomp_has_sysrawrc = false
69090835c2bSPaolo Bonziniif not get_option('seccomp').auto() or have_system or have_tools
69190835c2bSPaolo Bonzini  seccomp = dependency('libseccomp', version: '>=2.3.0',
69290835c2bSPaolo Bonzini                       required: get_option('seccomp'),
693063d5119SPaolo Bonzini                       method: 'pkg-config')
69473422d95SMichal Privoznik  if seccomp.found()
69573422d95SMichal Privoznik    seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h',
69673422d95SMichal Privoznik                                                'SCMP_FLTATR_API_SYSRAWRC',
69773422d95SMichal Privoznik                                                dependencies: seccomp)
69873422d95SMichal Privoznik  endif
6993f99cf57SPaolo Bonziniendif
700727c8bb8SPaolo Bonzini
7013f99cf57SPaolo Bonzinilibcap_ng = not_found
702727c8bb8SPaolo Bonziniif not get_option('cap_ng').auto() or have_system or have_tools
703727c8bb8SPaolo Bonzini  libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
704063d5119SPaolo Bonzini                              required: get_option('cap_ng'))
7053f99cf57SPaolo Bonziniendif
706727c8bb8SPaolo Bonziniif libcap_ng.found() and not cc.links('''
707727c8bb8SPaolo Bonzini   #include <cap-ng.h>
708727c8bb8SPaolo Bonzini   int main(void)
709727c8bb8SPaolo Bonzini   {
710727c8bb8SPaolo Bonzini     capng_capability_to_name(CAPNG_EFFECTIVE);
711727c8bb8SPaolo Bonzini     return 0;
712727c8bb8SPaolo Bonzini   }''', dependencies: libcap_ng)
713727c8bb8SPaolo Bonzini  libcap_ng = not_found
714727c8bb8SPaolo Bonzini  if get_option('cap_ng').enabled()
715727c8bb8SPaolo Bonzini    error('could not link libcap-ng')
716727c8bb8SPaolo Bonzini  else
717727c8bb8SPaolo Bonzini    warning('could not link libcap-ng, disabling')
718727c8bb8SPaolo Bonzini  endif
719727c8bb8SPaolo Bonziniendif
720727c8bb8SPaolo Bonzini
7211917ec6dSPaolo Bonziniif get_option('xkbcommon').auto() and not have_system and not have_tools
7221917ec6dSPaolo Bonzini  xkbcommon = not_found
7231917ec6dSPaolo Bonzinielse
7241917ec6dSPaolo Bonzini  xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
725063d5119SPaolo Bonzini                         method: 'pkg-config')
726ade60d4fSMarc-André Lureauendif
727e1723999SPaolo Bonzini
7285890258aSThomas Huthslirp = not_found
7295890258aSThomas Huthif not get_option('slirp').auto() or have_system
7305890258aSThomas Huth  slirp = dependency('slirp', required: get_option('slirp'),
731063d5119SPaolo Bonzini                     method: 'pkg-config')
7325890258aSThomas Huth  # slirp < 4.7 is incompatible with CFI support in QEMU.  This is because
7335890258aSThomas Huth  # it passes function pointers within libslirp as callbacks for timers.
7345890258aSThomas Huth  # When using a system-wide shared libslirp, the type information for the
7355890258aSThomas Huth  # callback is missing and the timer call produces a false positive with CFI.
7365890258aSThomas Huth  # Do not use the "version" keyword argument to produce a better error.
7375890258aSThomas Huth  # with control-flow integrity.
7385890258aSThomas Huth  if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7')
7395890258aSThomas Huth    if get_option('slirp').enabled()
7405890258aSThomas Huth      error('Control-Flow Integrity requires libslirp 4.7.')
7415890258aSThomas Huth    else
7425890258aSThomas Huth      warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.')
7435890258aSThomas Huth      slirp = not_found
7445890258aSThomas Huth    endif
7455890258aSThomas Huth  endif
7465890258aSThomas Huthendif
7475890258aSThomas Huth
748cdaf0722SMarc-André Lureauvde = not_found
749e1723999SPaolo Bonziniif not get_option('vde').auto() or have_system or have_tools
750e1723999SPaolo Bonzini  vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
751063d5119SPaolo Bonzini                           required: get_option('vde'))
752e1723999SPaolo Bonziniendif
753e1723999SPaolo Bonziniif vde.found() and not cc.links('''
754e1723999SPaolo Bonzini   #include <libvdeplug.h>
755e1723999SPaolo Bonzini   int main(void)
756e1723999SPaolo Bonzini   {
757e1723999SPaolo Bonzini     struct vde_open_args a = {0, 0, 0};
758e1723999SPaolo Bonzini     char s[] = "";
759e1723999SPaolo Bonzini     vde_open(s, s, &a);
760e1723999SPaolo Bonzini     return 0;
761e1723999SPaolo Bonzini   }''', dependencies: vde)
762e1723999SPaolo Bonzini  vde = not_found
763e1723999SPaolo Bonzini  if get_option('cap_ng').enabled()
764e1723999SPaolo Bonzini    error('could not link libvdeplug')
765e1723999SPaolo Bonzini  else
766e1723999SPaolo Bonzini    warning('could not link libvdeplug, disabling')
767e1723999SPaolo Bonzini  endif
768cdaf0722SMarc-André Lureauendif
76987430d5bSPaolo Bonzini
770478e943fSPaolo Bonzinipulse = not_found
77187430d5bSPaolo Bonziniif not get_option('pa').auto() or (targetos == 'linux' and have_system)
77287430d5bSPaolo Bonzini  pulse = dependency('libpulse', required: get_option('pa'),
773063d5119SPaolo Bonzini                     method: 'pkg-config')
774478e943fSPaolo Bonziniendif
775478e943fSPaolo Bonzinialsa = not_found
77687430d5bSPaolo Bonziniif not get_option('alsa').auto() or (targetos == 'linux' and have_system)
77787430d5bSPaolo Bonzini  alsa = dependency('alsa', required: get_option('alsa'),
778063d5119SPaolo Bonzini                    method: 'pkg-config')
779478e943fSPaolo Bonziniendif
780478e943fSPaolo Bonzinijack = not_found
78187430d5bSPaolo Bonziniif not get_option('jack').auto() or have_system
78287430d5bSPaolo Bonzini  jack = dependency('jack', required: get_option('jack'),
783063d5119SPaolo Bonzini                    method: 'pkg-config')
784478e943fSPaolo Bonziniendif
785c2d3d1c2SDorinda Basseypipewire = not_found
786c2d3d1c2SDorinda Basseyif not get_option('pipewire').auto() or (targetos == 'linux' and have_system)
787c2d3d1c2SDorinda Bassey  pipewire = dependency('libpipewire-0.3', version: '>=0.3.60',
788c2d3d1c2SDorinda Bassey                    required: get_option('pipewire'),
789063d5119SPaolo Bonzini                    method: 'pkg-config')
790c2d3d1c2SDorinda Basseyendif
791663df1ccSAlexandre Ratchovsndio = not_found
792663df1ccSAlexandre Ratchovif not get_option('sndio').auto() or have_system
793663df1ccSAlexandre Ratchov  sndio = dependency('sndio', required: get_option('sndio'),
794063d5119SPaolo Bonzini                    method: 'pkg-config')
795663df1ccSAlexandre Ratchovendif
79687430d5bSPaolo Bonzini
79758d3f3ffSGerd Hoffmannspice_protocol = not_found
7983f0a5d55SMarc-André Lureauif not get_option('spice_protocol').auto() or have_system
7995c167b53SMarkus Armbruster  spice_protocol = dependency('spice-protocol', version: '>=0.14.0',
8003f0a5d55SMarc-André Lureau                              required: get_option('spice_protocol'),
801063d5119SPaolo Bonzini                              method: 'pkg-config')
8022634733cSPaolo Bonziniendif
8033f0a5d55SMarc-André Lureauspice = not_found
8043f0a5d55SMarc-André Lureauif not get_option('spice').auto() or have_system
80534d55725SMarkus Armbruster  spice = dependency('spice-server', version: '>=0.14.0',
8063f0a5d55SMarc-André Lureau                     required: get_option('spice'),
807063d5119SPaolo Bonzini                     method: 'pkg-config')
80858d3f3ffSGerd Hoffmannendif
8093f0a5d55SMarc-André Lureauspice_headers = spice.partial_dependency(compile_args: true, includes: true)
8103f0a5d55SMarc-André Lureau
8115ee24e78SMarc-André Lureaurt = cc.find_library('rt', required: false)
812a399f914SPaolo Bonzini
81399650b62SPaolo Bonzinilibiscsi = not_found
8149db405a3SPaolo Bonziniif not get_option('libiscsi').auto() or have_block
8159db405a3SPaolo Bonzini  libiscsi = dependency('libiscsi', version: '>=1.9.0',
8169db405a3SPaolo Bonzini                         required: get_option('libiscsi'),
817063d5119SPaolo Bonzini                         method: 'pkg-config')
81899650b62SPaolo Bonziniendif
8195e5733e5SMarc-André Lureauzstd = not_found
820b1def33dSPaolo Bonziniif not get_option('zstd').auto() or have_block
821b1def33dSPaolo Bonzini  zstd = dependency('libzstd', version: '>=1.4.0',
822b1def33dSPaolo Bonzini                    required: get_option('zstd'),
823063d5119SPaolo Bonzini                    method: 'pkg-config')
8245e5733e5SMarc-André Lureauendif
825ea458960SMarc-André Lureauvirgl = not_found
8260265fe9eSPaolo Bonzini
8270265fe9eSPaolo Bonzinihave_vhost_user_gpu = have_tools and targetos == 'linux' and pixman.found()
8280265fe9eSPaolo Bonziniif not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
829587d59d6SPaolo Bonzini  virgl = dependency('virglrenderer',
830587d59d6SPaolo Bonzini                     method: 'pkg-config',
831063d5119SPaolo Bonzini                     required: get_option('virglrenderer'))
832ea458960SMarc-André Lureauendif
833fd66dbd4SStefan Hajnocziblkio = not_found
834fd66dbd4SStefan Hajnocziif not get_option('blkio').auto() or have_block
835fd66dbd4SStefan Hajnoczi  blkio = dependency('blkio',
836fd66dbd4SStefan Hajnoczi                     method: 'pkg-config',
837063d5119SPaolo Bonzini                     required: get_option('blkio'))
838fd66dbd4SStefan Hajnocziendif
8391d7bb6abSMarc-André Lureaucurl = not_found
840f9cd86feSPaolo Bonziniif not get_option('curl').auto() or have_block
841f9cd86feSPaolo Bonzini  curl = dependency('libcurl', version: '>=7.29.0',
842f9cd86feSPaolo Bonzini                    method: 'pkg-config',
843063d5119SPaolo Bonzini                    required: get_option('curl'))
8441d7bb6abSMarc-André Lureauendif
845f15bff25SPaolo Bonzinilibudev = not_found
846f01496a3SPaolo Bonziniif targetos == 'linux' and (have_system or have_tools)
8476ec0e15dSPaolo Bonzini  libudev = dependency('libudev',
848a0fbbb6eSPaolo Bonzini                       method: 'pkg-config',
849063d5119SPaolo Bonzini                       required: get_option('libudev'))
850f15bff25SPaolo Bonziniendif
8516ec0e15dSPaolo Bonzini
8525c53015aSPaolo Bonzinimpathlibs = [libudev]
8536ec0e15dSPaolo Bonzinimpathpersist = not_found
8546ec0e15dSPaolo Bonzinimpathpersist_new_api = false
85543a363aeSPaolo Bonziniif targetos == 'linux' and have_tools and get_option('mpath').allowed()
8566ec0e15dSPaolo Bonzini  mpath_test_source_new = '''
8576ec0e15dSPaolo Bonzini    #include <libudev.h>
8586ec0e15dSPaolo Bonzini    #include <mpath_persist.h>
8596ec0e15dSPaolo Bonzini    unsigned mpath_mx_alloc_len = 1024;
8606ec0e15dSPaolo Bonzini    int logsink;
8616ec0e15dSPaolo Bonzini    static struct config *multipath_conf;
8626ec0e15dSPaolo Bonzini    extern struct udev *udev;
8636ec0e15dSPaolo Bonzini    extern struct config *get_multipath_config(void);
8646ec0e15dSPaolo Bonzini    extern void put_multipath_config(struct config *conf);
8656ec0e15dSPaolo Bonzini    struct udev *udev;
8666ec0e15dSPaolo Bonzini    struct config *get_multipath_config(void) { return multipath_conf; }
8676ec0e15dSPaolo Bonzini    void put_multipath_config(struct config *conf) { }
8686ec0e15dSPaolo Bonzini    int main(void) {
8696ec0e15dSPaolo Bonzini        udev = udev_new();
8706ec0e15dSPaolo Bonzini        multipath_conf = mpath_lib_init();
8716ec0e15dSPaolo Bonzini        return 0;
8726ec0e15dSPaolo Bonzini    }'''
8736ec0e15dSPaolo Bonzini  mpath_test_source_old = '''
8746ec0e15dSPaolo Bonzini      #include <libudev.h>
8756ec0e15dSPaolo Bonzini      #include <mpath_persist.h>
8766ec0e15dSPaolo Bonzini      unsigned mpath_mx_alloc_len = 1024;
8776ec0e15dSPaolo Bonzini      int logsink;
8786ec0e15dSPaolo Bonzini      int main(void) {
8796ec0e15dSPaolo Bonzini          struct udev *udev = udev_new();
8806ec0e15dSPaolo Bonzini          mpath_lib_init(udev);
8816ec0e15dSPaolo Bonzini          return 0;
8826ec0e15dSPaolo Bonzini      }'''
8835c53015aSPaolo Bonzini  libmpathpersist = cc.find_library('mpathpersist',
884063d5119SPaolo Bonzini                                    required: get_option('mpath'))
8855c53015aSPaolo Bonzini  if libmpathpersist.found()
8865c53015aSPaolo Bonzini    mpathlibs += libmpathpersist
887a0cbd2e8SPaolo Bonzini    if get_option('prefer_static')
88843b43a40SPaolo Bonzini      mpathlibs += cc.find_library('devmapper',
889063d5119SPaolo Bonzini                                     required: get_option('mpath'))
89043b43a40SPaolo Bonzini    endif
89143b43a40SPaolo Bonzini    mpathlibs += cc.find_library('multipath',
892063d5119SPaolo Bonzini                                 required: get_option('mpath'))
89343b43a40SPaolo Bonzini    foreach lib: mpathlibs
89443b43a40SPaolo Bonzini      if not lib.found()
89543b43a40SPaolo Bonzini        mpathlibs = []
89643b43a40SPaolo Bonzini        break
89743b43a40SPaolo Bonzini      endif
89843b43a40SPaolo Bonzini    endforeach
8995c53015aSPaolo Bonzini    if mpathlibs.length() == 0
9005c53015aSPaolo Bonzini      msg = 'Dependencies missing for libmpathpersist'
9015c53015aSPaolo Bonzini    elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
9026ec0e15dSPaolo Bonzini      mpathpersist = declare_dependency(dependencies: mpathlibs)
9036ec0e15dSPaolo Bonzini      mpathpersist_new_api = true
9046ec0e15dSPaolo Bonzini    elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
9056ec0e15dSPaolo Bonzini      mpathpersist = declare_dependency(dependencies: mpathlibs)
9066ec0e15dSPaolo Bonzini    else
9075c53015aSPaolo Bonzini      msg = 'Cannot detect libmpathpersist API'
9085c53015aSPaolo Bonzini    endif
9095c53015aSPaolo Bonzini    if not mpathpersist.found()
9106ec0e15dSPaolo Bonzini      if get_option('mpath').enabled()
9115c53015aSPaolo Bonzini        error(msg)
9126ec0e15dSPaolo Bonzini      else
9135c53015aSPaolo Bonzini        warning(msg + ', disabling')
9146ec0e15dSPaolo Bonzini      endif
9156ec0e15dSPaolo Bonzini    endif
9166ec0e15dSPaolo Bonzini  endif
9176ec0e15dSPaolo Bonziniendif
9186ec0e15dSPaolo Bonzini
9195285e593SYonggang Luoiconv = not_found
92030fe76b1SPaolo Bonzinicurses = not_found
92143a363aeSPaolo Bonziniif have_system and get_option('curses').allowed()
9225285e593SYonggang Luo  curses_test = '''
923fbab8cc2SStefan Weil    #if defined(__APPLE__) || defined(__OpenBSD__)
924fbab8cc2SStefan Weil    #define _XOPEN_SOURCE_EXTENDED 1
925fbab8cc2SStefan Weil    #endif
9265285e593SYonggang Luo    #include <locale.h>
9275285e593SYonggang Luo    #include <curses.h>
9285285e593SYonggang Luo    #include <wchar.h>
9295285e593SYonggang Luo    int main(void) {
9305285e593SYonggang Luo      wchar_t wch = L'w';
9315285e593SYonggang Luo      setlocale(LC_ALL, "");
9325285e593SYonggang Luo      resize_term(0, 0);
9335285e593SYonggang Luo      addwstr(L"wide chars\n");
9345285e593SYonggang Luo      addnwstr(&wch, 1);
9355285e593SYonggang Luo      add_wch(WACS_DEGREE);
9365285e593SYonggang Luo      return 0;
9375285e593SYonggang Luo    }'''
938925a40dfSPaolo Bonzini
939ca31e307SYonggang Luo  curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
9406d322635SPaolo Bonzini  curses = dependency(curses_dep_list,
9415285e593SYonggang Luo                      required: false,
942063d5119SPaolo Bonzini                      method: 'pkg-config')
943925a40dfSPaolo Bonzini  msg = get_option('curses').enabled() ? 'curses library not found' : ''
944fbab8cc2SStefan Weil  curses_compile_args = ['-DNCURSES_WIDECHAR=1']
945925a40dfSPaolo Bonzini  if curses.found()
9460dbce6efSPaolo Bonzini    if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
947bd3615d6SPaolo Bonzini      curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses],
948bd3615d6SPaolo Bonzini                                  version: curses.version())
949925a40dfSPaolo Bonzini    else
950925a40dfSPaolo Bonzini      msg = 'curses package not usable'
951925a40dfSPaolo Bonzini      curses = not_found
9525285e593SYonggang Luo    endif
953925a40dfSPaolo Bonzini  endif
954925a40dfSPaolo Bonzini  if not curses.found()
955925a40dfSPaolo Bonzini    has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
956925a40dfSPaolo Bonzini    if targetos != 'windows' and not has_curses_h
957925a40dfSPaolo Bonzini      message('Trying with /usr/include/ncursesw')
958925a40dfSPaolo Bonzini      curses_compile_args += ['-I/usr/include/ncursesw']
959925a40dfSPaolo Bonzini      has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
960925a40dfSPaolo Bonzini    endif
961925a40dfSPaolo Bonzini    if has_curses_h
962925a40dfSPaolo Bonzini      curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
963925a40dfSPaolo Bonzini      foreach curses_libname : curses_libname_list
9645285e593SYonggang Luo        libcurses = cc.find_library(curses_libname,
965063d5119SPaolo Bonzini                                    required: false)
9665285e593SYonggang Luo        if libcurses.found()
967925a40dfSPaolo Bonzini          if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
968925a40dfSPaolo Bonzini            curses = declare_dependency(compile_args: curses_compile_args,
969925a40dfSPaolo Bonzini                                        dependencies: [libcurses])
9705285e593SYonggang Luo            break
971925a40dfSPaolo Bonzini          else
972925a40dfSPaolo Bonzini            msg = 'curses library not usable'
9735285e593SYonggang Luo          endif
9745285e593SYonggang Luo        endif
9755285e593SYonggang Luo      endforeach
9765285e593SYonggang Luo    endif
97730fe76b1SPaolo Bonzini  endif
97843a363aeSPaolo Bonzini  if get_option('iconv').allowed()
979925a40dfSPaolo Bonzini    foreach link_args : [ ['-liconv'], [] ]
980925a40dfSPaolo Bonzini      # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
981925a40dfSPaolo Bonzini      # We need to use libiconv if available because mixing libiconv's headers with
982925a40dfSPaolo Bonzini      # the system libc does not work.
983925a40dfSPaolo Bonzini      # However, without adding glib to the dependencies -L/usr/local/lib will not be
984925a40dfSPaolo Bonzini      # included in the command line and libiconv will not be found.
985925a40dfSPaolo Bonzini      if cc.links('''
986925a40dfSPaolo Bonzini        #include <iconv.h>
987925a40dfSPaolo Bonzini        int main(void) {
988925a40dfSPaolo Bonzini          iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
989925a40dfSPaolo Bonzini          return conv != (iconv_t) -1;
990*fc9a809eSPaolo Bonzini        }''', args: link_args, dependencies: glib)
991925a40dfSPaolo Bonzini        iconv = declare_dependency(link_args: link_args, dependencies: glib)
992925a40dfSPaolo Bonzini        break
993925a40dfSPaolo Bonzini      endif
994925a40dfSPaolo Bonzini    endforeach
995925a40dfSPaolo Bonzini  endif
996925a40dfSPaolo Bonzini  if curses.found() and not iconv.found()
997925a40dfSPaolo Bonzini    if get_option('iconv').enabled()
998925a40dfSPaolo Bonzini      error('iconv not available')
999925a40dfSPaolo Bonzini    endif
1000925a40dfSPaolo Bonzini    msg = 'iconv required for curses UI but not available'
1001925a40dfSPaolo Bonzini    curses = not_found
1002925a40dfSPaolo Bonzini  endif
1003925a40dfSPaolo Bonzini  if not curses.found() and msg != ''
1004925a40dfSPaolo Bonzini    if get_option('curses').enabled()
1005925a40dfSPaolo Bonzini      error(msg)
10065285e593SYonggang Luo    else
1007925a40dfSPaolo Bonzini      warning(msg + ', disabling')
100830fe76b1SPaolo Bonzini    endif
10095285e593SYonggang Luo  endif
10105285e593SYonggang Luoendif
10115285e593SYonggang Luo
10122634733cSPaolo Bonzinibrlapi = not_found
10138c6d4ff4SPaolo Bonziniif not get_option('brlapi').auto() or have_system
10148c6d4ff4SPaolo Bonzini  brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
1015063d5119SPaolo Bonzini                         required: get_option('brlapi'))
10168c6d4ff4SPaolo Bonzini  if brlapi.found() and not cc.links('''
10178c6d4ff4SPaolo Bonzini     #include <brlapi.h>
10188c6d4ff4SPaolo Bonzini     #include <stddef.h>
10198c6d4ff4SPaolo Bonzini     int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
10208c6d4ff4SPaolo Bonzini    brlapi = not_found
10218c6d4ff4SPaolo Bonzini    if get_option('brlapi').enabled()
10228c6d4ff4SPaolo Bonzini      error('could not link brlapi')
10238c6d4ff4SPaolo Bonzini    else
10248c6d4ff4SPaolo Bonzini      warning('could not link brlapi, disabling')
10258c6d4ff4SPaolo Bonzini    endif
10268c6d4ff4SPaolo Bonzini  endif
10272634733cSPaolo Bonziniendif
102835be72baSPaolo Bonzini
1029760e4327SPaolo Bonzinisdl = not_found
103064d3fec7SAkihiko Odakiif not get_option('sdl').auto() or have_system
1031063d5119SPaolo Bonzini  sdl = dependency('sdl2', required: get_option('sdl'))
103235be72baSPaolo Bonzini  sdl_image = not_found
1033760e4327SPaolo Bonziniendif
103435be72baSPaolo Bonziniif sdl.found()
103535be72baSPaolo Bonzini  # work around 2.0.8 bug
103635be72baSPaolo Bonzini  sdl = declare_dependency(compile_args: '-Wno-undef',
1037bd3615d6SPaolo Bonzini                           dependencies: sdl,
1038bd3615d6SPaolo Bonzini                           version: sdl.version())
10397161a433SVolker Rümelin  sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
1040063d5119SPaolo Bonzini                         method: 'pkg-config')
104135be72baSPaolo Bonzinielse
104235be72baSPaolo Bonzini  if get_option('sdl_image').enabled()
1043a8dc2aceSSergei Trofimovich    error('sdl-image required, but SDL was @0@'.format(
1044a8dc2aceSSergei Trofimovich          get_option('sdl').disabled() ? 'disabled' : 'not found'))
10452634733cSPaolo Bonzini  endif
104635be72baSPaolo Bonzini  sdl_image = not_found
104735be72baSPaolo Bonziniendif
104835be72baSPaolo Bonzini
10495e5733e5SMarc-André Lureaurbd = not_found
1050fabd1e93SPaolo Bonziniif not get_option('rbd').auto() or have_block
1051063d5119SPaolo Bonzini  librados = cc.find_library('rados', required: get_option('rbd'))
1052fabd1e93SPaolo Bonzini  librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
1053063d5119SPaolo Bonzini                           required: get_option('rbd'))
1054c518d6c2SPaolo Bonzini  if librados.found() and librbd.found()
1055c518d6c2SPaolo Bonzini    if cc.links('''
1056fabd1e93SPaolo Bonzini      #include <stdio.h>
1057fabd1e93SPaolo Bonzini      #include <rbd/librbd.h>
1058fabd1e93SPaolo Bonzini      int main(void) {
1059fabd1e93SPaolo Bonzini        rados_t cluster;
1060fabd1e93SPaolo Bonzini        rados_create(&cluster, NULL);
106148672ac0SPeter Lieven        #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
106248672ac0SPeter Lieven        #error
106348672ac0SPeter Lieven        #endif
1064fabd1e93SPaolo Bonzini        return 0;
1065fabd1e93SPaolo Bonzini      }''', dependencies: [librbd, librados])
1066fabd1e93SPaolo Bonzini      rbd = declare_dependency(dependencies: [librbd, librados])
1067c518d6c2SPaolo Bonzini    elif get_option('rbd').enabled()
106848672ac0SPeter Lieven      error('librbd >= 1.12.0 required')
1069c518d6c2SPaolo Bonzini    else
107048672ac0SPeter Lieven      warning('librbd >= 1.12.0 not found, disabling')
1071c518d6c2SPaolo Bonzini    endif
10725e5733e5SMarc-André Lureau  endif
1073fabd1e93SPaolo Bonziniendif
1074fabd1e93SPaolo Bonzini
10755e5733e5SMarc-André Lureauglusterfs = not_found
107608821ca2SPaolo Bonziniglusterfs_ftruncate_has_stat = false
107708821ca2SPaolo Bonziniglusterfs_iocb_has_stat = false
107808821ca2SPaolo Bonziniif not get_option('glusterfs').auto() or have_block
107908821ca2SPaolo Bonzini  glusterfs = dependency('glusterfs-api', version: '>=3',
108008821ca2SPaolo Bonzini                         required: get_option('glusterfs'),
1081063d5119SPaolo Bonzini                         method: 'pkg-config')
108208821ca2SPaolo Bonzini  if glusterfs.found()
108308821ca2SPaolo Bonzini    glusterfs_ftruncate_has_stat = cc.links('''
108408821ca2SPaolo Bonzini      #include <glusterfs/api/glfs.h>
108508821ca2SPaolo Bonzini
108608821ca2SPaolo Bonzini      int
108708821ca2SPaolo Bonzini      main(void)
108808821ca2SPaolo Bonzini      {
108908821ca2SPaolo Bonzini          /* new glfs_ftruncate() passes two additional args */
109008821ca2SPaolo Bonzini          return glfs_ftruncate(NULL, 0, NULL, NULL);
109108821ca2SPaolo Bonzini      }
109208821ca2SPaolo Bonzini    ''', dependencies: glusterfs)
109308821ca2SPaolo Bonzini    glusterfs_iocb_has_stat = cc.links('''
109408821ca2SPaolo Bonzini      #include <glusterfs/api/glfs.h>
109508821ca2SPaolo Bonzini
109608821ca2SPaolo Bonzini      /* new glfs_io_cbk() passes two additional glfs_stat structs */
109708821ca2SPaolo Bonzini      static void
109808821ca2SPaolo Bonzini      glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
109908821ca2SPaolo Bonzini      {}
110008821ca2SPaolo Bonzini
110108821ca2SPaolo Bonzini      int
110208821ca2SPaolo Bonzini      main(void)
110308821ca2SPaolo Bonzini      {
110408821ca2SPaolo Bonzini          glfs_io_cbk iocb = &glusterfs_iocb;
110508821ca2SPaolo Bonzini          iocb(NULL, 0 , NULL, NULL, NULL);
110608821ca2SPaolo Bonzini          return 0;
110708821ca2SPaolo Bonzini      }
110808821ca2SPaolo Bonzini    ''', dependencies: glusterfs)
110908821ca2SPaolo Bonzini  endif
11105e5733e5SMarc-André Lureauendif
1111e6a52b36SThomas Huth
11125e5733e5SMarc-André Lureaulibssh = not_found
1113e6a52b36SThomas Huthif not get_option('libssh').auto() or have_block
1114e6a52b36SThomas Huth  libssh = dependency('libssh', version: '>=0.8.7',
1115e6a52b36SThomas Huth                    method: 'pkg-config',
1116063d5119SPaolo Bonzini                    required: get_option('libssh'))
11175e5733e5SMarc-André Lureauendif
1118e6a52b36SThomas Huth
11195e5733e5SMarc-André Lureaulibbzip2 = not_found
112029ba6116SPaolo Bonziniif not get_option('bzip2').auto() or have_block
112129ba6116SPaolo Bonzini  libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
1122063d5119SPaolo Bonzini                             required: get_option('bzip2'))
112329ba6116SPaolo Bonzini  if libbzip2.found() and not cc.links('''
112429ba6116SPaolo Bonzini     #include <bzlib.h>
112529ba6116SPaolo Bonzini     int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
112629ba6116SPaolo Bonzini    libbzip2 = not_found
112729ba6116SPaolo Bonzini    if get_option('bzip2').enabled()
112829ba6116SPaolo Bonzini      error('could not link libbzip2')
112929ba6116SPaolo Bonzini    else
113029ba6116SPaolo Bonzini      warning('could not link libbzip2, disabling')
11315e5733e5SMarc-André Lureau    endif
113229ba6116SPaolo Bonzini  endif
11335e5733e5SMarc-André Lureauendif
1134ecea3696SPaolo Bonzini
11355e5733e5SMarc-André Lureauliblzfse = not_found
1136ecea3696SPaolo Bonziniif not get_option('lzfse').auto() or have_block
1137ecea3696SPaolo Bonzini  liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
1138063d5119SPaolo Bonzini                             required: get_option('lzfse'))
11395e5733e5SMarc-André Lureauendif
1140ecea3696SPaolo Bonziniif liblzfse.found() and not cc.links('''
1141ecea3696SPaolo Bonzini   #include <lzfse.h>
1142ecea3696SPaolo Bonzini   int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
1143ecea3696SPaolo Bonzini  liblzfse = not_found
1144ecea3696SPaolo Bonzini  if get_option('lzfse').enabled()
1145ecea3696SPaolo Bonzini    error('could not link liblzfse')
1146ecea3696SPaolo Bonzini  else
1147ecea3696SPaolo Bonzini    warning('could not link liblzfse, disabling')
1148ecea3696SPaolo Bonzini  endif
1149ecea3696SPaolo Bonziniendif
1150ecea3696SPaolo Bonzini
1151478e943fSPaolo Bonzinioss = not_found
115243a363aeSPaolo Bonziniif get_option('oss').allowed() and have_system
115387430d5bSPaolo Bonzini  if not cc.has_header('sys/soundcard.h')
115487430d5bSPaolo Bonzini    # not found
115587430d5bSPaolo Bonzini  elif targetos == 'netbsd'
1156063d5119SPaolo Bonzini    oss = cc.find_library('ossaudio', required: get_option('oss'))
115787430d5bSPaolo Bonzini  else
115887430d5bSPaolo Bonzini    oss = declare_dependency()
115987430d5bSPaolo Bonzini  endif
116087430d5bSPaolo Bonzini
116187430d5bSPaolo Bonzini  if not oss.found()
116287430d5bSPaolo Bonzini    if get_option('oss').enabled()
116387430d5bSPaolo Bonzini      error('OSS not found')
116487430d5bSPaolo Bonzini    endif
116587430d5bSPaolo Bonzini  endif
1166478e943fSPaolo Bonziniendif
1167478e943fSPaolo Bonzinidsound = not_found
116887430d5bSPaolo Bonziniif not get_option('dsound').auto() or (targetos == 'windows' and have_system)
116987430d5bSPaolo Bonzini  if cc.has_header('dsound.h')
117087430d5bSPaolo Bonzini    dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
1171478e943fSPaolo Bonzini  endif
117287430d5bSPaolo Bonzini
117387430d5bSPaolo Bonzini  if not dsound.found()
117487430d5bSPaolo Bonzini    if get_option('dsound').enabled()
117587430d5bSPaolo Bonzini      error('DirectSound not found')
117687430d5bSPaolo Bonzini    endif
117787430d5bSPaolo Bonzini  endif
117887430d5bSPaolo Bonziniendif
117987430d5bSPaolo Bonzini
1180478e943fSPaolo Bonzinicoreaudio = not_found
118187430d5bSPaolo Bonziniif not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system)
118287430d5bSPaolo Bonzini  coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
118387430d5bSPaolo Bonzini                         required: get_option('coreaudio'))
1184478e943fSPaolo Bonziniendif
11858bc5184dSThomas Huth
11862b1ccdf4SMarc-André Lureauopengl = not_found
118788b6e618SPaolo Bonziniif not get_option('opengl').auto() or have_system or have_vhost_user_gpu
118888b6e618SPaolo Bonzini  epoxy = dependency('epoxy', method: 'pkg-config',
1189063d5119SPaolo Bonzini                      required: get_option('opengl'))
119088b6e618SPaolo Bonzini  if cc.has_header('epoxy/egl.h', dependencies: epoxy)
119188b6e618SPaolo Bonzini    opengl = epoxy
119288b6e618SPaolo Bonzini  elif get_option('opengl').enabled()
119388b6e618SPaolo Bonzini    error('epoxy/egl.h not found')
119488b6e618SPaolo Bonzini  endif
11952b1ccdf4SMarc-André Lureauendif
11968bc5184dSThomas Huthgbm = not_found
11978bc5184dSThomas Huthif (have_system or have_tools) and (virgl.found() or opengl.found())
1198063d5119SPaolo Bonzini  gbm = dependency('gbm', method: 'pkg-config', required: false)
11998bc5184dSThomas Huthendif
1200f0caba44SMarc-André Lureauhave_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found()
12011b695471SPaolo Bonzini
120257612511SPaolo Bonzinignutls = not_found
1203cc4c7c73SDaniel P. Berrangégnutls_crypto = not_found
1204abc14fd0SAlyssa Rossif get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
1205cc4c7c73SDaniel P. Berrangé  # For general TLS support our min gnutls matches
1206cc4c7c73SDaniel P. Berrangé  # that implied by our platform support matrix
1207cc4c7c73SDaniel P. Berrangé  #
1208cc4c7c73SDaniel P. Berrangé  # For the crypto backends, we look for a newer
1209cc4c7c73SDaniel P. Berrangé  # gnutls:
1210cc4c7c73SDaniel P. Berrangé  #
1211cc4c7c73SDaniel P. Berrangé  #   Version 3.6.8  is needed to get XTS
1212cc4c7c73SDaniel P. Berrangé  #   Version 3.6.13 is needed to get PBKDF
1213cc4c7c73SDaniel P. Berrangé  #   Version 3.6.14 is needed to get HW accelerated XTS
1214cc4c7c73SDaniel P. Berrangé  #
1215cc4c7c73SDaniel P. Berrangé  # If newer enough gnutls isn't available, we can
1216cc4c7c73SDaniel P. Berrangé  # still use a different crypto backend to satisfy
1217cc4c7c73SDaniel P. Berrangé  # the platform support requirements
1218cc4c7c73SDaniel P. Berrangé  gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
1219cc4c7c73SDaniel P. Berrangé                             method: 'pkg-config',
1220063d5119SPaolo Bonzini                             required: false)
1221cc4c7c73SDaniel P. Berrangé  if gnutls_crypto.found()
1222cc4c7c73SDaniel P. Berrangé    gnutls = gnutls_crypto
1223cc4c7c73SDaniel P. Berrangé  else
1224cc4c7c73SDaniel P. Berrangé    # Our min version if all we need is TLS
122557612511SPaolo Bonzini    gnutls = dependency('gnutls', version: '>=3.5.18',
122657612511SPaolo Bonzini                        method: 'pkg-config',
1227063d5119SPaolo Bonzini                        required: get_option('gnutls'))
122857612511SPaolo Bonzini  endif
1229cc4c7c73SDaniel P. Berrangéendif
123057612511SPaolo Bonzini
12318bd0931fSDaniel P. Berrangé# We prefer use of gnutls for crypto, unless the options
12328bd0931fSDaniel P. Berrangé# explicitly asked for nettle or gcrypt.
12338bd0931fSDaniel P. Berrangé#
12348bd0931fSDaniel P. Berrangé# If gnutls isn't available for crypto, then we'll prefer
12358bd0931fSDaniel P. Berrangé# gcrypt over nettle for performance reasons.
123657612511SPaolo Bonzinigcrypt = not_found
123757612511SPaolo Bonzininettle = not_found
12384c5e512eSLei Hehogweed = not_found
123968014044SDaniel P. Berrangéxts = 'none'
12408bd0931fSDaniel P. Berrangé
124157612511SPaolo Bonziniif get_option('nettle').enabled() and get_option('gcrypt').enabled()
124257612511SPaolo Bonzini  error('Only one of gcrypt & nettle can be enabled')
124357612511SPaolo Bonziniendif
12448bd0931fSDaniel P. Berrangé
12458bd0931fSDaniel P. Berrangé# Explicit nettle/gcrypt request, so ignore gnutls for crypto
12468bd0931fSDaniel P. Berrangéif get_option('nettle').enabled() or get_option('gcrypt').enabled()
12478bd0931fSDaniel P. Berrangé  gnutls_crypto = not_found
124857612511SPaolo Bonziniendif
12498bd0931fSDaniel P. Berrangé
12508bd0931fSDaniel P. Berrangéif not gnutls_crypto.found()
12518bd0931fSDaniel P. Berrangé  if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
12521741093bSDaniel P. Berrangé    gcrypt = dependency('libgcrypt', version: '>=1.8',
125357612511SPaolo Bonzini                        method: 'config-tool',
1254063d5119SPaolo Bonzini                        required: get_option('gcrypt'))
125557612511SPaolo Bonzini    # Debian has removed -lgpg-error from libgcrypt-config
125657612511SPaolo Bonzini    # as it "spreads unnecessary dependencies" which in
125757612511SPaolo Bonzini    # turn breaks static builds...
1258a0cbd2e8SPaolo Bonzini    if gcrypt.found() and get_option('prefer_static')
1259bd3615d6SPaolo Bonzini      gcrypt = declare_dependency(dependencies:
1260bd3615d6SPaolo Bonzini        [gcrypt,
1261bd3615d6SPaolo Bonzini         cc.find_library('gpg-error', required: true)],
1262bd3615d6SPaolo Bonzini        version: gcrypt.version())
126357612511SPaolo Bonzini    endif
126457612511SPaolo Bonzini  endif
1265260a13d4SDaniel P. Berrangé  if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1266260a13d4SDaniel P. Berrangé    nettle = dependency('nettle', version: '>=3.4',
1267260a13d4SDaniel P. Berrangé                        method: 'pkg-config',
1268063d5119SPaolo Bonzini                        required: get_option('nettle'))
1269260a13d4SDaniel P. Berrangé    if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1270260a13d4SDaniel P. Berrangé      xts = 'private'
1271260a13d4SDaniel P. Berrangé    endif
1272260a13d4SDaniel P. Berrangé  endif
1273cc4c7c73SDaniel P. Berrangéendif
127457612511SPaolo Bonzini
1275063d5119SPaolo Bonzinigmp = dependency('gmp', required: false, method: 'pkg-config')
12764c5e512eSLei Heif nettle.found() and gmp.found()
12774c5e512eSLei He  hogweed = dependency('hogweed', version: '>=3.4',
12784c5e512eSLei He                       method: 'pkg-config',
1279063d5119SPaolo Bonzini                       required: get_option('nettle'))
12804c5e512eSLei Heendif
12814c5e512eSLei He
12824c5e512eSLei He
12832b1ccdf4SMarc-André Lureaugtk = not_found
12841b695471SPaolo Bonzinigtkx11 = not_found
1285c23d7b4eSPaolo Bonzinivte = not_found
128629e0bfffSClaudio Fontanahave_gtk_clipboard = get_option('gtk_clipboard').enabled()
128729e0bfffSClaudio Fontana
128864d3fec7SAkihiko Odakiif not get_option('gtk').auto() or have_system
12891b695471SPaolo Bonzini  gtk = dependency('gtk+-3.0', version: '>=3.22.0',
12901b695471SPaolo Bonzini                   method: 'pkg-config',
1291063d5119SPaolo Bonzini                   required: get_option('gtk'))
12921b695471SPaolo Bonzini  if gtk.found()
12931b695471SPaolo Bonzini    gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
12941b695471SPaolo Bonzini                        method: 'pkg-config',
1295063d5119SPaolo Bonzini                        required: false)
1296bd3615d6SPaolo Bonzini    gtk = declare_dependency(dependencies: [gtk, gtkx11],
1297bd3615d6SPaolo Bonzini                             version: gtk.version())
1298c23d7b4eSPaolo Bonzini
1299c23d7b4eSPaolo Bonzini    if not get_option('vte').auto() or have_system
1300c23d7b4eSPaolo Bonzini      vte = dependency('vte-2.91',
1301c23d7b4eSPaolo Bonzini                       method: 'pkg-config',
1302063d5119SPaolo Bonzini                       required: get_option('vte'))
1303c23d7b4eSPaolo Bonzini    endif
130429e0bfffSClaudio Fontana  elif have_gtk_clipboard
130529e0bfffSClaudio Fontana    error('GTK clipboard requested, but GTK not found')
13062b1ccdf4SMarc-André Lureau  endif
13071b695471SPaolo Bonziniendif
13081b695471SPaolo Bonzini
13092b1ccdf4SMarc-André Lureaux11 = not_found
13109d49bcf6SMarkus Armbrusterif gtkx11.found()
1311063d5119SPaolo Bonzini  x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found())
13122b1ccdf4SMarc-André Lureauendif
13132b1ccdf4SMarc-André Lureaupng = not_found
131495f8510eSKshitij Suriif get_option('png').allowed() and have_system
13151ec8c2c0SThomas Huth   png = dependency('libpng', version: '>=1.6.34', required: get_option('png'),
1316063d5119SPaolo Bonzini                    method: 'pkg-config')
131795f8510eSKshitij Suriendif
131895f8510eSKshitij Surivnc = not_found
13192b1ccdf4SMarc-André Lureaujpeg = not_found
13202b1ccdf4SMarc-André Lureausasl = not_found
132143a363aeSPaolo Bonziniif get_option('vnc').allowed() and have_system
1322a0b93237SPaolo Bonzini  vnc = declare_dependency() # dummy dependency
13238e242b3cSPaolo Bonzini  jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
1324063d5119SPaolo Bonzini                    method: 'pkg-config')
1325a0b93237SPaolo Bonzini  sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
1326063d5119SPaolo Bonzini                         required: get_option('vnc_sasl'))
1327a0b93237SPaolo Bonzini  if sasl.found()
1328a0b93237SPaolo Bonzini    sasl = declare_dependency(dependencies: sasl,
1329a0b93237SPaolo Bonzini                              compile_args: '-DSTRUCT_IOVEC_DEFINED')
1330a0b93237SPaolo Bonzini  endif
13312b1ccdf4SMarc-André Lureauendif
1332241611eaSPaolo Bonzini
133305e391aeSPaolo Bonzinipam = not_found
133405e391aeSPaolo Bonziniif not get_option('auth_pam').auto() or have_system
133505e391aeSPaolo Bonzini  pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
1336063d5119SPaolo Bonzini                        required: get_option('auth_pam'))
133705e391aeSPaolo Bonziniendif
133805e391aeSPaolo Bonziniif pam.found() and not cc.links('''
133905e391aeSPaolo Bonzini   #include <stddef.h>
134005e391aeSPaolo Bonzini   #include <security/pam_appl.h>
134105e391aeSPaolo Bonzini   int main(void) {
134205e391aeSPaolo Bonzini     const char *service_name = "qemu";
134305e391aeSPaolo Bonzini     const char *user = "frank";
134405e391aeSPaolo Bonzini     const struct pam_conv pam_conv = { 0 };
134505e391aeSPaolo Bonzini     pam_handle_t *pamh = NULL;
134605e391aeSPaolo Bonzini     pam_start(service_name, user, &pam_conv, &pamh);
134705e391aeSPaolo Bonzini     return 0;
134805e391aeSPaolo Bonzini   }''', dependencies: pam)
134905e391aeSPaolo Bonzini  pam = not_found
135005e391aeSPaolo Bonzini  if get_option('auth_pam').enabled()
135105e391aeSPaolo Bonzini    error('could not link libpam')
135205e391aeSPaolo Bonzini  else
135305e391aeSPaolo Bonzini    warning('could not link libpam, disabling')
135405e391aeSPaolo Bonzini  endif
135505e391aeSPaolo Bonziniendif
135605e391aeSPaolo Bonzini
1357708eab42SMarc-André Lureausnappy = not_found
1358241611eaSPaolo Bonziniif not get_option('snappy').auto() or have_system
1359241611eaSPaolo Bonzini  snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
1360063d5119SPaolo Bonzini                           required: get_option('snappy'))
1361708eab42SMarc-André Lureauendif
1362565174d0SPaolo Bonziniif snappy.found() and not linker.links('''
1363241611eaSPaolo Bonzini   #include <snappy-c.h>
1364241611eaSPaolo Bonzini   int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
1365241611eaSPaolo Bonzini  snappy = not_found
1366241611eaSPaolo Bonzini  if get_option('snappy').enabled()
1367241611eaSPaolo Bonzini    error('could not link libsnappy')
1368241611eaSPaolo Bonzini  else
1369241611eaSPaolo Bonzini    warning('could not link libsnappy, disabling')
1370241611eaSPaolo Bonzini  endif
1371708eab42SMarc-André Lureauendif
13720c32a0aeSPaolo Bonzini
1373708eab42SMarc-André Lureaulzo = not_found
13740c32a0aeSPaolo Bonziniif not get_option('lzo').auto() or have_system
13750c32a0aeSPaolo Bonzini  lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
1376063d5119SPaolo Bonzini                        required: get_option('lzo'))
1377708eab42SMarc-André Lureauendif
13780c32a0aeSPaolo Bonziniif lzo.found() and not cc.links('''
13790c32a0aeSPaolo Bonzini   #include <lzo/lzo1x.h>
13800c32a0aeSPaolo Bonzini   int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
13810c32a0aeSPaolo Bonzini  lzo = not_found
13820c32a0aeSPaolo Bonzini  if get_option('lzo').enabled()
13830c32a0aeSPaolo Bonzini    error('could not link liblzo2')
13840c32a0aeSPaolo Bonzini  else
13850c32a0aeSPaolo Bonzini    warning('could not link liblzo2, disabling')
13860c32a0aeSPaolo Bonzini  endif
13870c32a0aeSPaolo Bonziniendif
13880c32a0aeSPaolo Bonzini
1389488a8c73SPaolo Bonzininuma = not_found
1390488a8c73SPaolo Bonziniif not get_option('numa').auto() or have_system or have_tools
1391488a8c73SPaolo Bonzini  numa = cc.find_library('numa', has_headers: ['numa.h'],
1392063d5119SPaolo Bonzini                              required: get_option('numa'))
1393488a8c73SPaolo Bonziniendif
1394488a8c73SPaolo Bonziniif numa.found() and not cc.links('''
1395488a8c73SPaolo Bonzini   #include <numa.h>
1396488a8c73SPaolo Bonzini   int main(void) { return numa_available(); }
1397488a8c73SPaolo Bonzini   ''', dependencies: numa)
1398488a8c73SPaolo Bonzini  numa = not_found
1399488a8c73SPaolo Bonzini  if get_option('numa').enabled()
1400488a8c73SPaolo Bonzini    error('could not link numa')
1401488a8c73SPaolo Bonzini  else
1402488a8c73SPaolo Bonzini    warning('could not link numa, disabling')
1403488a8c73SPaolo Bonzini  endif
1404488a8c73SPaolo Bonziniendif
1405488a8c73SPaolo Bonzini
140655166230SMarc-André Lureaurdma = not_found
14073730a734SPaolo Bonziniif not get_option('rdma').auto() or have_system
14083730a734SPaolo Bonzini  libumad = cc.find_library('ibumad', required: get_option('rdma'))
14093730a734SPaolo Bonzini  rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'],
1410063d5119SPaolo Bonzini                               required: get_option('rdma')),
1411063d5119SPaolo Bonzini               cc.find_library('ibverbs', required: get_option('rdma')),
14123730a734SPaolo Bonzini               libumad]
14133730a734SPaolo Bonzini  rdma = declare_dependency(dependencies: rdma_libs)
14143730a734SPaolo Bonzini  foreach lib: rdma_libs
14153730a734SPaolo Bonzini    if not lib.found()
14163730a734SPaolo Bonzini      rdma = not_found
141755166230SMarc-André Lureau    endif
14183730a734SPaolo Bonzini  endforeach
14193730a734SPaolo Bonziniendif
14203730a734SPaolo Bonzini
1421582ea95fSMarc-André Lureauxen = not_found
142214efd8d3SPaolo Bonziniif get_option('xen').enabled() or (get_option('xen').auto() and have_system)
142314efd8d3SPaolo Bonzini  xencontrol = dependency('xencontrol', required: false,
1424063d5119SPaolo Bonzini                          method: 'pkg-config')
142514efd8d3SPaolo Bonzini  if xencontrol.found()
142614efd8d3SPaolo Bonzini    xen_pc = declare_dependency(version: xencontrol.version(),
142714efd8d3SPaolo Bonzini      dependencies: [
142814efd8d3SPaolo Bonzini        xencontrol,
142914efd8d3SPaolo Bonzini        # disabler: true makes xen_pc.found() return false if any is not found
143014efd8d3SPaolo Bonzini        dependency('xenstore', required: false,
1431063d5119SPaolo Bonzini                   method: 'pkg-config',
143214efd8d3SPaolo Bonzini                   disabler: true),
143314efd8d3SPaolo Bonzini        dependency('xenforeignmemory', required: false,
1434063d5119SPaolo Bonzini                   method: 'pkg-config',
143514efd8d3SPaolo Bonzini                   disabler: true),
143614efd8d3SPaolo Bonzini        dependency('xengnttab', required: false,
1437063d5119SPaolo Bonzini                   method: 'pkg-config',
143814efd8d3SPaolo Bonzini                   disabler: true),
143914efd8d3SPaolo Bonzini        dependency('xenevtchn', required: false,
1440063d5119SPaolo Bonzini                   method: 'pkg-config',
144114efd8d3SPaolo Bonzini                   disabler: true),
144214efd8d3SPaolo Bonzini        dependency('xendevicemodel', required: false,
1443063d5119SPaolo Bonzini                   method: 'pkg-config',
144414efd8d3SPaolo Bonzini                   disabler: true),
144514efd8d3SPaolo Bonzini        # optional, no "disabler: true"
144614efd8d3SPaolo Bonzini        dependency('xentoolcore', required: false,
1447063d5119SPaolo Bonzini                   method: 'pkg-config')])
144814efd8d3SPaolo Bonzini    if xen_pc.found()
144914efd8d3SPaolo Bonzini      xen = xen_pc
1450582ea95fSMarc-André Lureau    endif
145114efd8d3SPaolo Bonzini  endif
145214efd8d3SPaolo Bonzini  if not xen.found()
145314efd8d3SPaolo 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' ]
145414efd8d3SPaolo Bonzini    xen_libs = {
145514efd8d3SPaolo Bonzini      '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
145614efd8d3SPaolo Bonzini      '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
145714efd8d3SPaolo Bonzini      '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
145814efd8d3SPaolo Bonzini      '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
145914efd8d3SPaolo Bonzini      '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
146014efd8d3SPaolo Bonzini      '4.6.0': [ 'xenstore', 'xenctrl' ],
146114efd8d3SPaolo Bonzini      '4.5.0': [ 'xenstore', 'xenctrl' ],
146214efd8d3SPaolo Bonzini      '4.2.0': [ 'xenstore', 'xenctrl' ],
146314efd8d3SPaolo Bonzini    }
146414efd8d3SPaolo Bonzini    xen_deps = {}
146514efd8d3SPaolo Bonzini    foreach ver: xen_tests
146614efd8d3SPaolo Bonzini      # cache the various library tests to avoid polluting the logs
146714efd8d3SPaolo Bonzini      xen_test_deps = []
146814efd8d3SPaolo Bonzini      foreach l: xen_libs[ver]
146914efd8d3SPaolo Bonzini        if l not in xen_deps
147014efd8d3SPaolo Bonzini          xen_deps += { l: cc.find_library(l, required: false) }
147114efd8d3SPaolo Bonzini        endif
147214efd8d3SPaolo Bonzini        xen_test_deps += xen_deps[l]
147314efd8d3SPaolo Bonzini      endforeach
147414efd8d3SPaolo Bonzini
147514efd8d3SPaolo Bonzini      # Use -D to pick just one of the test programs in scripts/xen-detect.c
147614efd8d3SPaolo Bonzini      xen_version = ver.split('.')
147714efd8d3SPaolo Bonzini      xen_ctrl_version = xen_version[0] + \
147814efd8d3SPaolo Bonzini        ('0' + xen_version[1]).substring(-2) + \
147914efd8d3SPaolo Bonzini        ('0' + xen_version[2]).substring(-2)
148014efd8d3SPaolo Bonzini      if cc.links(files('scripts/xen-detect.c'),
148114efd8d3SPaolo Bonzini                  args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version,
148214efd8d3SPaolo Bonzini                  dependencies: xen_test_deps)
148314efd8d3SPaolo Bonzini        xen = declare_dependency(version: ver, dependencies: xen_test_deps)
148414efd8d3SPaolo Bonzini        break
148514efd8d3SPaolo Bonzini      endif
148614efd8d3SPaolo Bonzini    endforeach
148714efd8d3SPaolo Bonzini  endif
148814efd8d3SPaolo Bonzini  if xen.found()
148914efd8d3SPaolo Bonzini    accelerators += 'CONFIG_XEN'
149014efd8d3SPaolo Bonzini  elif get_option('xen').enabled()
149114efd8d3SPaolo Bonzini    error('could not compile and link Xen test program')
149214efd8d3SPaolo Bonzini  endif
149314efd8d3SPaolo Bonziniendif
149414efd8d3SPaolo Bonzinihave_xen_pci_passthrough = get_option('xen_pci_passthrough') \
149514efd8d3SPaolo Bonzini  .require(xen.found(),
149614efd8d3SPaolo Bonzini           error_message: 'Xen PCI passthrough requested but Xen not enabled') \
149714efd8d3SPaolo Bonzini  .require(targetos == 'linux',
149814efd8d3SPaolo Bonzini           error_message: 'Xen PCI passthrough not available on this platform') \
149914efd8d3SPaolo Bonzini  .allowed()
150014efd8d3SPaolo Bonzini
150114efd8d3SPaolo Bonzini
150206677ce1SPaolo Bonzinicacard = not_found
15035f364c57SPaolo Bonziniif not get_option('smartcard').auto() or have_system
15045f364c57SPaolo Bonzini  cacard = dependency('libcacard', required: get_option('smartcard'),
1505063d5119SPaolo Bonzini                      version: '>=2.5.1', method: 'pkg-config')
150606677ce1SPaolo Bonziniendif
15070a40bcb7SCésar Belleyu2f = not_found
15080a40bcb7SCésar Belleyif have_system
15090a40bcb7SCésar Belley  u2f = dependency('u2f-emu', required: get_option('u2f'),
1510063d5119SPaolo Bonzini                   method: 'pkg-config')
15110a40bcb7SCésar Belleyendif
15128caef850SHongren (Zenithal) Zhengcanokey = not_found
15138caef850SHongren (Zenithal) Zhengif have_system
15148caef850SHongren (Zenithal) Zheng  canokey = dependency('canokey-qemu', required: get_option('canokey'),
1515063d5119SPaolo Bonzini                   method: 'pkg-config')
15168caef850SHongren (Zenithal) Zhengendif
151706677ce1SPaolo Bonziniusbredir = not_found
151818f31e60SPaolo Bonziniif not get_option('usb_redir').auto() or have_system
151918f31e60SPaolo Bonzini  usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
1520063d5119SPaolo Bonzini                        version: '>=0.6', method: 'pkg-config')
152106677ce1SPaolo Bonziniendif
152206677ce1SPaolo Bonzinilibusb = not_found
152390540f32SPaolo Bonziniif not get_option('libusb').auto() or have_system
152490540f32SPaolo Bonzini  libusb = dependency('libusb-1.0', required: get_option('libusb'),
1525063d5119SPaolo Bonzini                      version: '>=1.0.13', method: 'pkg-config')
152606677ce1SPaolo Bonziniendif
152790540f32SPaolo Bonzini
1528c9322ab5SMarc-André Lureaulibpmem = not_found
1529e36e8c70SPaolo Bonziniif not get_option('libpmem').auto() or have_system
1530e36e8c70SPaolo Bonzini  libpmem = dependency('libpmem', required: get_option('libpmem'),
1531063d5119SPaolo Bonzini                       method: 'pkg-config')
1532c9322ab5SMarc-André Lureauendif
1533c7c91a74SBruce Rogerslibdaxctl = not_found
153483ef1682SPaolo Bonziniif not get_option('libdaxctl').auto() or have_system
153583ef1682SPaolo Bonzini  libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
1536063d5119SPaolo Bonzini                         version: '>=57', method: 'pkg-config')
1537c7c91a74SBruce Rogersendif
15388ce0a45fSMarc-André Lureautasn1 = not_found
1539ba7ed407SPaolo Bonziniif gnutls.found()
1540ba7ed407SPaolo Bonzini  tasn1 = dependency('libtasn1',
1541063d5119SPaolo Bonzini                     method: 'pkg-config')
15428ce0a45fSMarc-André Lureauendif
1543af04e89dSMarc-André Lureaukeyutils = dependency('libkeyutils', required: false,
1544063d5119SPaolo Bonzini                      method: 'pkg-config')
1545a81df1b6SPaolo Bonzini
15463909def8SMarc-André Lureauhas_gettid = cc.has_function('gettid')
15473909def8SMarc-André Lureau
15483d212b41SRichard W.M. Jones# libselinux
15493d212b41SRichard W.M. Jonesselinux = dependency('libselinux',
15503d212b41SRichard W.M. Jones                     required: get_option('selinux'),
1551063d5119SPaolo Bonzini                     method: 'pkg-config')
15523d212b41SRichard W.M. Jones
1553aa087962SPaolo Bonzini# Malloc tests
1554aa087962SPaolo Bonzini
1555aa087962SPaolo Bonzinimalloc = []
1556aa087962SPaolo Bonziniif get_option('malloc') == 'system'
1557aa087962SPaolo Bonzini  has_malloc_trim = \
155843a363aeSPaolo Bonzini    get_option('malloc_trim').allowed() and \
1559aa087962SPaolo Bonzini    cc.links('''#include <malloc.h>
1560aa087962SPaolo Bonzini                int main(void) { malloc_trim(0); return 0; }''')
1561aa087962SPaolo Bonzinielse
1562aa087962SPaolo Bonzini  has_malloc_trim = false
1563aa087962SPaolo Bonzini  malloc = cc.find_library(get_option('malloc'), required: true)
1564aa087962SPaolo Bonziniendif
1565aa087962SPaolo Bonziniif not has_malloc_trim and get_option('malloc_trim').enabled()
1566aa087962SPaolo Bonzini  if get_option('malloc') == 'system'
1567aa087962SPaolo Bonzini    error('malloc_trim not available on this platform.')
1568aa087962SPaolo Bonzini  else
1569aa087962SPaolo Bonzini    error('malloc_trim not available with non-libc memory allocator')
1570aa087962SPaolo Bonzini  endif
1571aa087962SPaolo Bonziniendif
1572aa087962SPaolo Bonzini
157384e319a5SMax Reitz# Check whether the glibc provides statx()
157484e319a5SMax Reitz
1575e66420acSPaolo Bonzinignu_source_prefix = '''
157684e319a5SMax Reitz  #ifndef _GNU_SOURCE
157784e319a5SMax Reitz  #define _GNU_SOURCE
157884e319a5SMax Reitz  #endif
1579e66420acSPaolo Bonzini'''
1580e66420acSPaolo Bonzinistatx_test = gnu_source_prefix + '''
158184e319a5SMax Reitz  #include <sys/stat.h>
158284e319a5SMax Reitz  int main(void) {
158384e319a5SMax Reitz    struct statx statxbuf;
158484e319a5SMax Reitz    statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
158584e319a5SMax Reitz    return 0;
158684e319a5SMax Reitz  }'''
158784e319a5SMax Reitz
158884e319a5SMax Reitzhas_statx = cc.links(statx_test)
158984e319a5SMax Reitz
15904ce7a08dSHanna Reitz# Check whether statx() provides mount ID information
15914ce7a08dSHanna Reitz
15924ce7a08dSHanna Reitzstatx_mnt_id_test = gnu_source_prefix + '''
15934ce7a08dSHanna Reitz  #include <sys/stat.h>
15944ce7a08dSHanna Reitz  int main(void) {
15954ce7a08dSHanna Reitz    struct statx statxbuf;
15964ce7a08dSHanna Reitz    statx(0, "", 0, STATX_BASIC_STATS | STATX_MNT_ID, &statxbuf);
15974ce7a08dSHanna Reitz    return statxbuf.stx_mnt_id;
15984ce7a08dSHanna Reitz  }'''
15994ce7a08dSHanna Reitz
16004ce7a08dSHanna Reitzhas_statx_mnt_id = cc.links(statx_mnt_id_test)
16014ce7a08dSHanna Reitz
1602a436d6d4SPaolo Bonzinihave_vhost_user_blk_server = get_option('vhost_user_blk_server') \
1603a436d6d4SPaolo Bonzini  .require(targetos == 'linux',
1604a436d6d4SPaolo Bonzini           error_message: 'vhost_user_blk_server requires linux') \
16052a3129a3SPaolo Bonzini  .require(have_vhost_user,
1606a436d6d4SPaolo Bonzini           error_message: 'vhost_user_blk_server requires vhost-user support') \
160726ed501bSAlex Bennée  .disable_auto_if(not have_tools and not have_system) \
1608a436d6d4SPaolo Bonzini  .allowed()
16099e62ba48SDaniele Buono
1610df4ea709SMax Reitzif get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
1611df4ea709SMax Reitz  error('Cannot enable fuse-lseek while fuse is disabled')
1612df4ea709SMax Reitzendif
1613df4ea709SMax Reitz
1614a484a719SMax Reitzfuse = dependency('fuse3', required: get_option('fuse'),
1615063d5119SPaolo Bonzini                  version: '>=3.1', method: 'pkg-config')
1616a484a719SMax Reitz
1617df4ea709SMax Reitzfuse_lseek = not_found
161843a363aeSPaolo Bonziniif get_option('fuse_lseek').allowed()
1619df4ea709SMax Reitz  if fuse.version().version_compare('>=3.8')
1620df4ea709SMax Reitz    # Dummy dependency
1621df4ea709SMax Reitz    fuse_lseek = declare_dependency()
1622df4ea709SMax Reitz  elif get_option('fuse_lseek').enabled()
1623df4ea709SMax Reitz    if fuse.found()
1624df4ea709SMax Reitz      error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1625df4ea709SMax Reitz    else
1626df4ea709SMax Reitz      error('fuse-lseek requires libfuse, which was not found')
1627df4ea709SMax Reitz    endif
1628df4ea709SMax Reitz  endif
1629df4ea709SMax Reitzendif
1630df4ea709SMax Reitz
1631a6caeee8SXie Yongjihave_libvduse = (targetos == 'linux')
1632a6caeee8SXie Yongjiif get_option('libvduse').enabled()
1633a6caeee8SXie Yongji    if targetos != 'linux'
1634a6caeee8SXie Yongji        error('libvduse requires linux')
1635a6caeee8SXie Yongji    endif
1636a6caeee8SXie Yongjielif get_option('libvduse').disabled()
1637a6caeee8SXie Yongji    have_libvduse = false
1638a6caeee8SXie Yongjiendif
1639a6caeee8SXie Yongji
16402a2359b8SXie Yongjihave_vduse_blk_export = (have_libvduse and targetos == 'linux')
16412a2359b8SXie Yongjiif get_option('vduse_blk_export').enabled()
16422a2359b8SXie Yongji    if targetos != 'linux'
16432a2359b8SXie Yongji        error('vduse_blk_export requires linux')
16442a2359b8SXie Yongji    elif not have_libvduse
16452a2359b8SXie Yongji        error('vduse_blk_export requires libvduse support')
16462a2359b8SXie Yongji    endif
16472a2359b8SXie Yongjielif get_option('vduse_blk_export').disabled()
16482a2359b8SXie Yongji    have_vduse_blk_export = false
16492a2359b8SXie Yongjiendif
16502a2359b8SXie Yongji
165146627f41SAndrew Melnychenko# libbpf
165246627f41SAndrew Melnychenkolibbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config')
165346627f41SAndrew Melnychenkoif libbpf.found() and not cc.links('''
165446627f41SAndrew Melnychenko   #include <bpf/libbpf.h>
165546627f41SAndrew Melnychenko   int main(void)
165646627f41SAndrew Melnychenko   {
165746627f41SAndrew Melnychenko     bpf_object__destroy_skeleton(NULL);
165846627f41SAndrew Melnychenko     return 0;
165946627f41SAndrew Melnychenko   }''', dependencies: libbpf)
166046627f41SAndrew Melnychenko  libbpf = not_found
166146627f41SAndrew Melnychenko  if get_option('bpf').enabled()
166246627f41SAndrew Melnychenko    error('libbpf skeleton test failed')
166346627f41SAndrew Melnychenko  else
166446627f41SAndrew Melnychenko    warning('libbpf skeleton test failed, disabling')
166546627f41SAndrew Melnychenko  endif
166646627f41SAndrew Melnychenkoendif
166746627f41SAndrew Melnychenko
16687c10cb38SIlya Leoshkevich# libdw
1669bc71d58fSIlya Leoshkevichlibdw = not_found
1670550c6d97SIlya Leoshkevichif not get_option('libdw').auto() or \
1671a0cbd2e8SPaolo Bonzini        (not get_option('prefer_static') and (have_system or have_user))
16727c10cb38SIlya Leoshkevich    libdw = dependency('libdw',
16737c10cb38SIlya Leoshkevich                       method: 'pkg-config',
1674bc71d58fSIlya Leoshkevich                       required: get_option('libdw'))
1675bc71d58fSIlya Leoshkevichendif
16767c10cb38SIlya Leoshkevich
167787430d5bSPaolo Bonzini#################
167887430d5bSPaolo Bonzini# config-host.h #
167987430d5bSPaolo Bonzini#################
168087430d5bSPaolo Bonzini
168187430d5bSPaolo Bonziniaudio_drivers_selected = []
168287430d5bSPaolo Bonziniif have_system
168387430d5bSPaolo Bonzini  audio_drivers_available = {
168487430d5bSPaolo Bonzini    'alsa': alsa.found(),
168587430d5bSPaolo Bonzini    'coreaudio': coreaudio.found(),
168687430d5bSPaolo Bonzini    'dsound': dsound.found(),
168787430d5bSPaolo Bonzini    'jack': jack.found(),
168887430d5bSPaolo Bonzini    'oss': oss.found(),
168987430d5bSPaolo Bonzini    'pa': pulse.found(),
1690c2d3d1c2SDorinda Bassey    'pipewire': pipewire.found(),
169187430d5bSPaolo Bonzini    'sdl': sdl.found(),
1692663df1ccSAlexandre Ratchov    'sndio': sndio.found(),
169387430d5bSPaolo Bonzini  }
1694e5424a29SPaolo Bonzini  foreach k, v: audio_drivers_available
1695e5424a29SPaolo Bonzini    config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
1696e5424a29SPaolo Bonzini  endforeach
169787430d5bSPaolo Bonzini
169887430d5bSPaolo Bonzini  # Default to native drivers first, OSS second, SDL third
169987430d5bSPaolo Bonzini  audio_drivers_priority = \
1700663df1ccSAlexandre Ratchov    [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \
170187430d5bSPaolo Bonzini    (targetos == 'linux' ? [] : [ 'sdl' ])
170287430d5bSPaolo Bonzini  audio_drivers_default = []
170387430d5bSPaolo Bonzini  foreach k: audio_drivers_priority
170487430d5bSPaolo Bonzini    if audio_drivers_available[k]
170587430d5bSPaolo Bonzini      audio_drivers_default += k
170687430d5bSPaolo Bonzini    endif
170787430d5bSPaolo Bonzini  endforeach
170887430d5bSPaolo Bonzini
170987430d5bSPaolo Bonzini  foreach k: get_option('audio_drv_list')
171087430d5bSPaolo Bonzini    if k == 'default'
171187430d5bSPaolo Bonzini      audio_drivers_selected += audio_drivers_default
171287430d5bSPaolo Bonzini    elif not audio_drivers_available[k]
171387430d5bSPaolo Bonzini      error('Audio driver "@0@" not available.'.format(k))
171487430d5bSPaolo Bonzini    else
171587430d5bSPaolo Bonzini      audio_drivers_selected += k
171687430d5bSPaolo Bonzini    endif
171787430d5bSPaolo Bonzini  endforeach
171887430d5bSPaolo Bonziniendif
171987430d5bSPaolo Bonziniconfig_host_data.set('CONFIG_AUDIO_DRIVERS',
172087430d5bSPaolo Bonzini                     '"' + '", "'.join(audio_drivers_selected) + '", ')
172187430d5bSPaolo Bonzini
17229e62ba48SDaniele Buonoif get_option('cfi')
17239e62ba48SDaniele Buono  cfi_flags=[]
17249e62ba48SDaniele Buono  # Check for dependency on LTO
17259e62ba48SDaniele Buono  if not get_option('b_lto')
17269e62ba48SDaniele Buono    error('Selected Control-Flow Integrity but LTO is disabled')
17279e62ba48SDaniele Buono  endif
17289e62ba48SDaniele Buono  if config_host.has_key('CONFIG_MODULES')
17299e62ba48SDaniele Buono    error('Selected Control-Flow Integrity is not compatible with modules')
17309e62ba48SDaniele Buono  endif
17319e62ba48SDaniele Buono  # Check for cfi flags. CFI requires LTO so we can't use
17329e62ba48SDaniele Buono  # get_supported_arguments, but need a more complex "compiles" which allows
17339e62ba48SDaniele Buono  # custom arguments
17349e62ba48SDaniele Buono  if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
17359e62ba48SDaniele Buono                 args: ['-flto', '-fsanitize=cfi-icall'] )
17369e62ba48SDaniele Buono    cfi_flags += '-fsanitize=cfi-icall'
17379e62ba48SDaniele Buono  else
17389e62ba48SDaniele Buono    error('-fsanitize=cfi-icall is not supported by the compiler')
17399e62ba48SDaniele Buono  endif
17409e62ba48SDaniele Buono  if cc.compiles('int main () { return 0; }',
17419e62ba48SDaniele Buono                 name: '-fsanitize-cfi-icall-generalize-pointers',
17429e62ba48SDaniele Buono                 args: ['-flto', '-fsanitize=cfi-icall',
17439e62ba48SDaniele Buono                        '-fsanitize-cfi-icall-generalize-pointers'] )
17449e62ba48SDaniele Buono    cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
17459e62ba48SDaniele Buono  else
17469e62ba48SDaniele Buono    error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
17479e62ba48SDaniele Buono  endif
17489e62ba48SDaniele Buono  if get_option('cfi_debug')
17499e62ba48SDaniele Buono    if cc.compiles('int main () { return 0; }',
17509e62ba48SDaniele Buono                   name: '-fno-sanitize-trap=cfi-icall',
17519e62ba48SDaniele Buono                   args: ['-flto', '-fsanitize=cfi-icall',
17529e62ba48SDaniele Buono                          '-fno-sanitize-trap=cfi-icall'] )
17539e62ba48SDaniele Buono      cfi_flags += '-fno-sanitize-trap=cfi-icall'
17549e62ba48SDaniele Buono    else
17559e62ba48SDaniele Buono      error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
17569e62ba48SDaniele Buono    endif
17579e62ba48SDaniele Buono  endif
1758e5134024SPaolo Bonzini  add_global_arguments(cfi_flags, native: false, language: all_languages)
1759e5134024SPaolo Bonzini  add_global_link_arguments(cfi_flags, native: false, language: all_languages)
17609e62ba48SDaniele Buonoendif
17619e62ba48SDaniele Buono
176214176c8dSJoelle van Dynehave_host_block_device = (targetos != 'darwin' or
176314176c8dSJoelle van Dyne    cc.has_header('IOKit/storage/IOMedia.h'))
176414176c8dSJoelle van Dyne
1765a436d6d4SPaolo Bonzinidbus_display = get_option('dbus_display') \
1766a436d6d4SPaolo Bonzini  .require(gio.version().version_compare('>=2.64'),
1767a436d6d4SPaolo Bonzini           error_message: '-display dbus requires glib>=2.64') \
17687544060eSPaolo Bonzini  .require(gdbus_codegen.found(),
1769bb2dc4b7SPaolo Bonzini           error_message: gdbus_codegen_error.format('-display dbus')) \
177084a0a2efSMarc-André Lureau  .require(targetos != 'windows',
177184a0a2efSMarc-André Lureau           error_message: '-display dbus is not available on Windows') \
1772a436d6d4SPaolo Bonzini  .allowed()
1773142ca628SMarc-André Lureau
1774a436d6d4SPaolo Bonzinihave_virtfs = get_option('virtfs') \
17750fb1e19dSKeno Fischer    .require(targetos == 'linux' or targetos == 'darwin',
17760fb1e19dSKeno Fischer             error_message: 'virtio-9p (virtfs) requires Linux or macOS') \
17770fb1e19dSKeno Fischer    .require(targetos == 'linux' or cc.has_function('pthread_fchdir_np'),
17780fb1e19dSKeno Fischer             error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \
17791a67e07fSPeter Foley    .require(targetos == 'darwin' or libattr.found(),
17801a67e07fSPeter Foley             error_message: 'virtio-9p (virtfs) on Linux requires libattr-devel') \
1781a436d6d4SPaolo Bonzini    .disable_auto_if(not have_tools and not have_system) \
1782a436d6d4SPaolo Bonzini    .allowed()
178369202b40SPaolo Bonzini
17841a67e07fSPeter Foleyhave_virtfs_proxy_helper = get_option('virtfs_proxy_helper') \
17851a67e07fSPeter Foley    .require(targetos != 'darwin', error_message: 'the virtfs proxy helper is incompatible with macOS') \
17861a67e07fSPeter Foley    .require(have_virtfs, error_message: 'the virtfs proxy helper requires that virtfs is enabled') \
17871a67e07fSPeter Foley    .disable_auto_if(not have_tools) \
17881a67e07fSPeter Foley    .require(libcap_ng.found(), error_message: 'the virtfs proxy helper requires libcap-ng') \
17891a67e07fSPeter Foley    .allowed()
17903a489d38SPhilippe Mathieu-Daudé
1791622d64ffSPaolo Bonziniif get_option('block_drv_ro_whitelist') == ''
1792622d64ffSPaolo Bonzini  config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '')
1793622d64ffSPaolo Bonzinielse
1794622d64ffSPaolo Bonzini  config_host_data.set('CONFIG_BDRV_RO_WHITELIST',
1795622d64ffSPaolo Bonzini        '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ')
1796622d64ffSPaolo Bonziniendif
1797622d64ffSPaolo Bonziniif get_option('block_drv_rw_whitelist') == ''
1798622d64ffSPaolo Bonzini  config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '')
1799622d64ffSPaolo Bonzinielse
1800622d64ffSPaolo Bonzini  config_host_data.set('CONFIG_BDRV_RW_WHITELIST',
1801622d64ffSPaolo Bonzini        '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ')
1802622d64ffSPaolo Bonziniendif
1803622d64ffSPaolo Bonzini
18049c29b741SPaolo Bonziniforeach k : get_option('trace_backends')
18059c29b741SPaolo Bonzini  config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
18069c29b741SPaolo Bonziniendforeach
18079c29b741SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
180841f2ae28SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority'))
180940c909f5SPaolo Bonziniif iasl.found()
181040c909f5SPaolo Bonzini  config_host_data.set_quoted('CONFIG_IASL', iasl.full_path())
18115dc4618eSPaolo Bonziniendif
181216bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
181316bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
181416bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
181516bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
181616bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
18178154f5e6SAkihiko Odaki
18188154f5e6SAkihiko Odakiqemu_firmwarepath = ''
18198154f5e6SAkihiko Odakiforeach k : get_option('qemu_firmwarepath')
18208154f5e6SAkihiko Odaki  qemu_firmwarepath += '"' + get_option('prefix') / k + '", '
18218154f5e6SAkihiko Odakiendforeach
18228154f5e6SAkihiko Odakiconfig_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath)
18238154f5e6SAkihiko Odaki
182416bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
182516bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
182616bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
182716bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
182816bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
182916bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
183016bf7a33SPaolo Bonzini
1831b0b4323eSPaolo Bonziniif config_host.has_key('CONFIG_MODULES')
1832b0b4323eSPaolo Bonzini  config_host_data.set('CONFIG_STAMP', run_command(
1833b0b4323eSPaolo Bonzini      meson.current_source_dir() / 'scripts/qemu-stamp.py',
1834b0b4323eSPaolo Bonzini      meson.project_version(), get_option('pkgversion'), '--',
1835b0b4323eSPaolo Bonzini      meson.current_source_dir() / 'configure',
1836b0b4323eSPaolo Bonzini      capture: true, check: true).stdout().strip())
1837b0b4323eSPaolo Bonziniendif
1838b0b4323eSPaolo Bonzini
183935acbb30SPaolo Bonzinihave_slirp_smbd = get_option('slirp_smbd') \
184035acbb30SPaolo Bonzini  .require(targetos != 'windows', error_message: 'Host smbd not supported on this platform.') \
184135acbb30SPaolo Bonzini  .allowed()
184235acbb30SPaolo Bonziniif have_slirp_smbd
184335acbb30SPaolo Bonzini  smbd_path = get_option('smbd')
184435acbb30SPaolo Bonzini  if smbd_path == ''
184535acbb30SPaolo Bonzini    smbd_path = (targetos == 'solaris' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd')
184635acbb30SPaolo Bonzini  endif
184735acbb30SPaolo Bonzini  config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path)
184835acbb30SPaolo Bonziniendif
184935acbb30SPaolo Bonzini
1850823eb013SPaolo Bonziniconfig_host_data.set('HOST_' + host_arch.to_upper(), 1)
1851823eb013SPaolo Bonzini
18522cb2f580SPaolo Bonziniif get_option('module_upgrades') and not enable_modules
18532cb2f580SPaolo Bonzini  error('Cannot enable module-upgrades as modules are not enabled')
18542cb2f580SPaolo Bonziniendif
18552cb2f580SPaolo Bonziniconfig_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades'))
18562cb2f580SPaolo Bonzini
1857f7f2d651SPaolo Bonziniconfig_host_data.set('CONFIG_ATTR', libattr.found())
1858c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools'))
18598c6d4ff4SPaolo Bonziniconfig_host_data.set('CONFIG_BRLAPI', brlapi.found())
1860b4e312e9SPaolo Bonziniconfig_host_data.set('CONFIG_COCOA', cocoa.found())
1861537b7248SPaolo Bonziniconfig_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
1862af2bb99bSPaolo Bonziniconfig_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
1863f01496a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBUDEV', libudev.found())
18640c32a0aeSPaolo Bonziniconfig_host_data.set('CONFIG_LZO', lzo.found())
18656ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH', mpathpersist.found())
18666ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
1867fd66dbd4SStefan Hajnocziconfig_host_data.set('CONFIG_BLKIO', blkio.found())
1868f9cd86feSPaolo Bonziniconfig_host_data.set('CONFIG_CURL', curl.found())
18695285e593SYonggang Luoconfig_host_data.set('CONFIG_CURSES', curses.found())
18708bc5184dSThomas Huthconfig_host_data.set('CONFIG_GBM', gbm.found())
18717544060eSPaolo Bonziniconfig_host_data.set('CONFIG_GIO', gio.found())
187208821ca2SPaolo Bonziniconfig_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
187308821ca2SPaolo Bonziniif glusterfs.found()
187408821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
187508821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
187608821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
187708821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
187808821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
187908821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
188008821ca2SPaolo Bonziniendif
18811b695471SPaolo Bonziniconfig_host_data.set('CONFIG_GTK', gtk.found())
1882c23d7b4eSPaolo Bonziniconfig_host_data.set('CONFIG_VTE', vte.found())
188329e0bfffSClaudio Fontanaconfig_host_data.set('CONFIG_GTK_CLIPBOARD', have_gtk_clipboard)
1884f7f2d651SPaolo Bonziniconfig_host_data.set('CONFIG_LIBATTR', have_old_libattr)
1885727c8bb8SPaolo Bonziniconfig_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
188646627f41SAndrew Melnychenkoconfig_host_data.set('CONFIG_EBPF', libbpf.found())
188763a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
18889db405a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
188930045c05SPaolo Bonziniconfig_host_data.set('CONFIG_LIBNFS', libnfs.found())
1890e6a52b36SThomas Huthconfig_host_data.set('CONFIG_LIBSSH', libssh.found())
1891ff66f3e5SPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_AIO', libaio.found())
189263a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
189363a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LIBPMEM', libpmem.found())
1894488a8c73SPaolo Bonziniconfig_host_data.set('CONFIG_NUMA', numa.found())
18956bb613f0SMichal Privoznikif numa.found()
18966bb613f0SMichal Privoznik  config_host_data.set('HAVE_NUMA_HAS_PREFERRED_MANY',
18976bb613f0SMichal Privoznik                       cc.has_function('numa_has_preferred_many',
18986bb613f0SMichal Privoznik                                       dependencies: numa))
18996bb613f0SMichal Privoznikendif
190088b6e618SPaolo Bonziniconfig_host_data.set('CONFIG_OPENGL', opengl.found())
1901c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_PROFILER', get_option('profiler'))
1902fabd1e93SPaolo Bonziniconfig_host_data.set('CONFIG_RBD', rbd.found())
19033730a734SPaolo Bonziniconfig_host_data.set('CONFIG_RDMA', rdma.found())
190435be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL', sdl.found())
190535be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
190690835c2bSPaolo Bonziniconfig_host_data.set('CONFIG_SECCOMP', seccomp.found())
190773422d95SMichal Privoznikif seccomp.found()
190873422d95SMichal Privoznik  config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc)
190973422d95SMichal Privoznikendif
1910241611eaSPaolo Bonziniconfig_host_data.set('CONFIG_SNAPPY', snappy.found())
19110d04c4c9SPaolo Bonziniconfig_host_data.set('CONFIG_TPM', have_tpm)
191290540f32SPaolo Bonziniconfig_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
1913e1723999SPaolo Bonziniconfig_host_data.set('CONFIG_VDE', vde.found())
19142df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET', have_vhost_net)
19152df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user)
19162df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa)
19172df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel)
19182df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_USER', have_vhost_user)
19192df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto)
19202df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa)
1921e2c1d78dSVladislav Yaroshchukconfig_host_data.set('CONFIG_VMNET', vmnet.found())
1922e5e856c1SStefan Hajnocziconfig_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
19232a2359b8SXie Yongjiconfig_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export)
192495f8510eSKshitij Suriconfig_host_data.set('CONFIG_PNG', png.found())
1925a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC', vnc.found())
1926a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
1927a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_SASL', sasl.found())
192869202b40SPaolo Bonziniconfig_host_data.set('CONFIG_VIRTFS', have_virtfs)
192963a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_VTE', vte.found())
19304113f4cfSLaurent Vivierconfig_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
1931af04e89dSMarc-André Lureauconfig_host_data.set('CONFIG_KEYUTILS', keyutils.found())
19323909def8SMarc-André Lureauconfig_host_data.set('CONFIG_GETTID', has_gettid)
193357612511SPaolo Bonziniconfig_host_data.set('CONFIG_GNUTLS', gnutls.found())
1934cc4c7c73SDaniel P. Berrangéconfig_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
1935d47b83b1SDaniel P. Berrangéconfig_host_data.set('CONFIG_TASN1', tasn1.found())
193657612511SPaolo Bonziniconfig_host_data.set('CONFIG_GCRYPT', gcrypt.found())
193757612511SPaolo Bonziniconfig_host_data.set('CONFIG_NETTLE', nettle.found())
19384c5e512eSLei Heconfig_host_data.set('CONFIG_HOGWEED', hogweed.found())
193957612511SPaolo Bonziniconfig_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
1940aa087962SPaolo Bonziniconfig_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
194184e319a5SMax Reitzconfig_host_data.set('CONFIG_STATX', has_statx)
19424ce7a08dSHanna Reitzconfig_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id)
1943b1def33dSPaolo Bonziniconfig_host_data.set('CONFIG_ZSTD', zstd.found())
1944a484a719SMax Reitzconfig_host_data.set('CONFIG_FUSE', fuse.found())
1945df4ea709SMax Reitzconfig_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
19463f0a5d55SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
1947ddece465SMarc-André Lureauif spice_protocol.found()
1948ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0])
1949ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1])
1950ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2])
1951ddece465SMarc-André Lureauendif
19523f0a5d55SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE', spice.found())
19539d71037fSPaolo Bonziniconfig_host_data.set('CONFIG_X11', x11.found())
1954142ca628SMarc-André Lureauconfig_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display)
19559e62ba48SDaniele Buonoconfig_host_data.set('CONFIG_CFI', get_option('cfi'))
19563d212b41SRichard W.M. Jonesconfig_host_data.set('CONFIG_SELINUX', selinux.found())
195714efd8d3SPaolo Bonziniconfig_host_data.set('CONFIG_XEN_BACKEND', xen.found())
19587c10cb38SIlya Leoshkevichconfig_host_data.set('CONFIG_LIBDW', libdw.found())
195914efd8d3SPaolo Bonziniif xen.found()
196014efd8d3SPaolo Bonzini  # protect from xen.version() having less than three components
196114efd8d3SPaolo Bonzini  xen_version = xen.version().split('.') + ['0', '0']
196214efd8d3SPaolo Bonzini  xen_ctrl_version = xen_version[0] + \
196314efd8d3SPaolo Bonzini    ('0' + xen_version[1]).substring(-2) + \
196414efd8d3SPaolo Bonzini    ('0' + xen_version[2]).substring(-2)
196514efd8d3SPaolo Bonzini  config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version)
196614efd8d3SPaolo Bonziniendif
1967859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1968859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1969859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1970859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1971859aef02SPaolo Bonzini
1972a6305081SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
197369d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
197469d8de7aSPaolo Bonzini
1975728c0a2fSPaolo Bonzinihave_coroutine_pool = get_option('coroutine_pool')
1976728c0a2fSPaolo Bonziniif get_option('debug_stack_usage') and have_coroutine_pool
1977728c0a2fSPaolo Bonzini  message('Disabling coroutine pool to measure stack usage')
1978728c0a2fSPaolo Bonzini  have_coroutine_pool = false
1979728c0a2fSPaolo Bonziniendif
1980728c0a2fSPaolo Bonziniconfig_host_data.set10('CONFIG_COROUTINE_POOL', have_coroutine_pool)
198158a2e3f5SStefan Hajnocziconfig_host_data.set('CONFIG_DEBUG_GRAPH_LOCK', get_option('debug_graph_lock'))
1982c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex'))
1983728c0a2fSPaolo Bonziniconfig_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage'))
1984c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_GPROF', get_option('gprof'))
1985406523f6SPaolo Bonziniconfig_host_data.set('CONFIG_LIVE_BLOCK_MIGRATION', get_option('live_block_migration').allowed())
1986c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug'))
1987abad185cSJuan Quintelaconfig_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed())
1988406523f6SPaolo Bonzini
198969d8de7aSPaolo Bonzini# has_header
1990e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
1991d47a8b3bSPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
1992d47a8b3bSPaolo Bonziniconfig_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
199348f670ecSThomas Huthconfig_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
19942964be52SThomas Huthconfig_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
19952802d91dSThomas Huthconfig_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
199669d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
1997ded5d78cSThomas Huthconfig_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
19984a9d5f89SThomas Huthconfig_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
1999d409373bSBin Mengif targetos == 'windows'
2000d409373bSBin Meng  config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h'))
2001d409373bSBin Mengendif
2002ded5d78cSThomas Huth
200369d8de7aSPaolo Bonzini# has_function
2004c891c24bSClaudio Imbrendaconfig_host_data.set('CONFIG_CLOSE_RANGE', cc.has_function('close_range'))
2005a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
2006e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
2007e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
2008e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
2009e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
20108698343bSPeter Maydell# Note that we need to specify prefix: here to avoid incorrectly
20118698343bSPeter Maydell# thinking that Windows has posix_memalign()
20128698343bSPeter Maydellconfig_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>'))
20135c8c714aSPeter Maydellconfig_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc'))
201488454f84SPeter Maydellconfig_host_data.set('CONFIG_VALLOC', cc.has_function('valloc'))
201588454f84SPeter Maydellconfig_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign'))
2016e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
20172b9f74efSPeter Maydellconfig_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
2018029ed1bdSKeno Fischerconfig_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np'))
2019e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
2020e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
2021e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
2022e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
2023e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
2024be7e89f6SPaolo Bonziniconfig_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
202559e35c7bSAndrew Deasonconfig_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
2026*fc9a809eSPaolo Bonziniconfig_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice)
2027e66420acSPaolo Bonziniconfig_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
2028ed3b3f17SPaolo Bonziniconfig_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
202969d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
203066dc5f96SStefano Garzarellaif rbd.found()
203166dc5f96SStefano Garzarella  config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS',
203266dc5f96SStefano Garzarella                       cc.has_function('rbd_namespace_exists',
203366dc5f96SStefano Garzarella                                       dependencies: rbd,
203466dc5f96SStefano Garzarella                                       prefix: '#include <rbd/librbd.h>'))
203566dc5f96SStefano Garzarellaendif
2036911965acSLi Zhijianif rdma.found()
2037911965acSLi Zhijian  config_host_data.set('HAVE_IBV_ADVISE_MR',
2038911965acSLi Zhijian                       cc.has_function('ibv_advise_mr',
20393730a734SPaolo Bonzini                                       dependencies: rdma,
2040911965acSLi Zhijian                                       prefix: '#include <infiniband/verbs.h>'))
2041911965acSLi Zhijianendif
20422b9f74efSPeter Maydell
2043e66420acSPaolo Bonzini# has_header_symbol
20446d43eaa3SSam Liconfig_host_data.set('CONFIG_BLKZONED',
20456d43eaa3SSam Li                     cc.has_header_symbol('linux/blkzoned.h', 'BLKOPENZONE'))
2046e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_EPOLL_CREATE1',
2047e66420acSPaolo Bonzini                     cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
2048e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
2049e66420acSPaolo Bonzini                     cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
2050e66420acSPaolo Bonzini                     cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
2051e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
2052e66420acSPaolo Bonzini                     cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
2053e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FIEMAP',
2054e66420acSPaolo Bonzini                     cc.has_header('linux/fiemap.h') and
2055e66420acSPaolo Bonzini                     cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
2056be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_GETRANDOM',
2057be7e89f6SPaolo Bonzini                     cc.has_function('getrandom') and
2058be7e89f6SPaolo Bonzini                     cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
2059a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_INOTIFY',
2060a620fbe9SPaolo Bonzini                     cc.has_header_symbol('sys/inotify.h', 'inotify_init'))
2061a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_INOTIFY1',
2062a620fbe9SPaolo Bonzini                     cc.has_header_symbol('sys/inotify.h', 'inotify_init1'))
2063e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
2064e66420acSPaolo Bonzini                     cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
2065be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_RTNETLINK',
2066be7e89f6SPaolo Bonzini                     cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
2067be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_SYSMACROS',
2068be7e89f6SPaolo Bonzini                     cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
2069e1fbd2c4SPaolo Bonziniconfig_host_data.set('HAVE_OPTRESET',
2070e1fbd2c4SPaolo Bonzini                     cc.has_header_symbol('getopt.h', 'optreset'))
2071653163fcSMarc-André Lureauconfig_host_data.set('HAVE_IPPROTO_MPTCP',
2072653163fcSMarc-André Lureau                     cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
2073e66420acSPaolo Bonzini
2074e66420acSPaolo Bonzini# has_member
2075e66420acSPaolo Bonziniconfig_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
2076e66420acSPaolo Bonzini                     cc.has_member('struct sigevent', 'sigev_notify_thread_id',
2077e66420acSPaolo Bonzini                                   prefix: '#include <signal.h>'))
2078ed3b3f17SPaolo Bonziniconfig_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
2079ed3b3f17SPaolo Bonzini                     cc.has_member('struct stat', 'st_atim',
2080ed3b3f17SPaolo Bonzini                                   prefix: '#include <sys/stat.h>'))
20816d43eaa3SSam Liconfig_host_data.set('HAVE_BLK_ZONE_REP_CAPACITY',
20826d43eaa3SSam Li                     cc.has_member('struct blk_zone', 'capacity',
20836d43eaa3SSam Li                                   prefix: '#include <linux/blkzoned.h>'))
2084e66420acSPaolo Bonzini
20856a23f819SPaolo Bonzini# has_type
20866a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_IOVEC',
20876a23f819SPaolo Bonzini                     cc.has_type('struct iovec',
20886a23f819SPaolo Bonzini                                 prefix: '#include <sys/uio.h>'))
20896a23f819SPaolo Bonziniconfig_host_data.set('HAVE_UTMPX',
20906a23f819SPaolo Bonzini                     cc.has_type('struct utmpx',
20916a23f819SPaolo Bonzini                                 prefix: '#include <utmpx.h>'))
20926a23f819SPaolo Bonzini
2093904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_EVENTFD', cc.links('''
2094e1fbd2c4SPaolo Bonzini  #include <sys/eventfd.h>
2095e1fbd2c4SPaolo Bonzini  int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
2096904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
2097e1fbd2c4SPaolo Bonzini  #include <unistd.h>
2098e1fbd2c4SPaolo Bonzini  int main(void) {
2099e1fbd2c4SPaolo Bonzini  #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
2100e1fbd2c4SPaolo Bonzini  return fdatasync(0);
2101e1fbd2c4SPaolo Bonzini  #else
2102e1fbd2c4SPaolo Bonzini  #error Not supported
2103e1fbd2c4SPaolo Bonzini  #endif
2104e1fbd2c4SPaolo Bonzini  }'''))
21058900c204SAndrew Deason
21068900c204SAndrew Deasonhas_madvise = cc.links(gnu_source_prefix + '''
2107e1fbd2c4SPaolo Bonzini  #include <sys/types.h>
2108e1fbd2c4SPaolo Bonzini  #include <sys/mman.h>
2109e1fbd2c4SPaolo Bonzini  #include <stddef.h>
21108900c204SAndrew Deason  int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')
21118900c204SAndrew Deasonmissing_madvise_proto = false
21128900c204SAndrew Deasonif has_madvise
21138900c204SAndrew Deason  # Some platforms (illumos and Solaris before Solaris 11) provide madvise()
21148900c204SAndrew Deason  # but forget to prototype it. In this case, has_madvise will be true (the
21158900c204SAndrew Deason  # test program links despite a compile warning). To detect the
21168900c204SAndrew Deason  # missing-prototype case, we try again with a definitely-bogus prototype.
21178900c204SAndrew Deason  # This will only compile if the system headers don't provide the prototype;
21188900c204SAndrew Deason  # otherwise the conflicting prototypes will cause a compiler error.
21198900c204SAndrew Deason  missing_madvise_proto = cc.links(gnu_source_prefix + '''
21208900c204SAndrew Deason    #include <sys/types.h>
21218900c204SAndrew Deason    #include <sys/mman.h>
21228900c204SAndrew Deason    #include <stddef.h>
21238900c204SAndrew Deason    extern int madvise(int);
21248900c204SAndrew Deason    int main(void) { return madvise(0); }''')
21258900c204SAndrew Deasonendif
21268900c204SAndrew Deasonconfig_host_data.set('CONFIG_MADVISE', has_madvise)
21278900c204SAndrew Deasonconfig_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto)
21288900c204SAndrew Deason
2129904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
2130e1fbd2c4SPaolo Bonzini  #include <sys/mman.h>
2131e1fbd2c4SPaolo Bonzini  int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
2132904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
2133d47a8b3bSPaolo Bonzini  #include <fcntl.h>
2134d47a8b3bSPaolo Bonzini  #if !defined(AT_EMPTY_PATH)
2135d47a8b3bSPaolo Bonzini  # error missing definition
2136d47a8b3bSPaolo Bonzini  #else
2137d47a8b3bSPaolo Bonzini  int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
2138d47a8b3bSPaolo Bonzini  #endif'''))
2139904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
2140e1fbd2c4SPaolo Bonzini  #include <sys/mman.h>
2141e1fbd2c4SPaolo Bonzini  #include <stddef.h>
2142e1fbd2c4SPaolo Bonzini  int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
214310f6b231SPaolo Bonzini
21446a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + '''
214510f6b231SPaolo Bonzini  #include <pthread.h>
214610f6b231SPaolo Bonzini
214710f6b231SPaolo Bonzini  static void *f(void *p) { return NULL; }
214810f6b231SPaolo Bonzini  int main(void)
214910f6b231SPaolo Bonzini  {
215010f6b231SPaolo Bonzini    pthread_t thread;
215110f6b231SPaolo Bonzini    pthread_create(&thread, 0, f, 0);
215210f6b231SPaolo Bonzini    pthread_setname_np(thread, "QEMU");
215310f6b231SPaolo Bonzini    return 0;
215410f6b231SPaolo Bonzini  }''', dependencies: threads))
21556a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + '''
215610f6b231SPaolo Bonzini  #include <pthread.h>
215710f6b231SPaolo Bonzini
215810f6b231SPaolo Bonzini  static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
215910f6b231SPaolo Bonzini  int main(void)
216010f6b231SPaolo Bonzini  {
216110f6b231SPaolo Bonzini    pthread_t thread;
216210f6b231SPaolo Bonzini    pthread_create(&thread, 0, f, 0);
216310f6b231SPaolo Bonzini    return 0;
216410f6b231SPaolo Bonzini  }''', dependencies: threads))
21653ada67a3SBrad Smithconfig_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(gnu_source_prefix + '''
21663ada67a3SBrad Smith  #include <pthread.h>
21673ada67a3SBrad Smith  #include <pthread_np.h>
21683ada67a3SBrad Smith
21693ada67a3SBrad Smith  static void *f(void *p) { return NULL; }
21703ada67a3SBrad Smith  int main(void)
21713ada67a3SBrad Smith  {
21723ada67a3SBrad Smith    pthread_t thread;
21733ada67a3SBrad Smith    pthread_create(&thread, 0, f, 0);
21743ada67a3SBrad Smith    pthread_set_name_np(thread, "QEMU");
21753ada67a3SBrad Smith    return 0;
21763ada67a3SBrad Smith  }''', dependencies: threads))
2177657ac98bSLongpeng(Mike)config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + '''
2178657ac98bSLongpeng(Mike)  #include <pthread.h>
2179657ac98bSLongpeng(Mike)  #include <time.h>
2180657ac98bSLongpeng(Mike)
2181657ac98bSLongpeng(Mike)  int main(void)
2182657ac98bSLongpeng(Mike)  {
2183657ac98bSLongpeng(Mike)    pthread_condattr_t attr
2184657ac98bSLongpeng(Mike)    pthread_condattr_init(&attr);
2185657ac98bSLongpeng(Mike)    pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
2186657ac98bSLongpeng(Mike)    return 0;
2187657ac98bSLongpeng(Mike)  }''', dependencies: threads))
21887730f32cSDavid Hildenbrandconfig_host_data.set('CONFIG_PTHREAD_AFFINITY_NP', cc.links(gnu_source_prefix + '''
21897730f32cSDavid Hildenbrand  #include <pthread.h>
219010f6b231SPaolo Bonzini
21917730f32cSDavid Hildenbrand  static void *f(void *p) { return NULL; }
21927730f32cSDavid Hildenbrand  int main(void)
21937730f32cSDavid Hildenbrand  {
21947730f32cSDavid Hildenbrand    int setsize = CPU_ALLOC_SIZE(64);
21957730f32cSDavid Hildenbrand    pthread_t thread;
21967730f32cSDavid Hildenbrand    cpu_set_t *cpuset;
21977730f32cSDavid Hildenbrand    pthread_create(&thread, 0, f, 0);
21987730f32cSDavid Hildenbrand    cpuset = CPU_ALLOC(64);
21997730f32cSDavid Hildenbrand    CPU_ZERO_S(setsize, cpuset);
22007730f32cSDavid Hildenbrand    pthread_setaffinity_np(thread, setsize, cpuset);
22017730f32cSDavid Hildenbrand    pthread_getaffinity_np(thread, setsize, cpuset);
22027730f32cSDavid Hildenbrand    CPU_FREE(cpuset);
22037730f32cSDavid Hildenbrand    return 0;
22047730f32cSDavid Hildenbrand  }''', dependencies: threads))
2205904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
22066bd17dccSKacper Słomiński  #include <sys/signalfd.h>
22076bd17dccSKacper Słomiński  #include <stddef.h>
22086bd17dccSKacper Słomiński  int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
2209904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
2210a620fbe9SPaolo Bonzini  #include <unistd.h>
2211a620fbe9SPaolo Bonzini  #include <fcntl.h>
2212a620fbe9SPaolo Bonzini  #include <limits.h>
2213a620fbe9SPaolo Bonzini
2214a620fbe9SPaolo Bonzini  int main(void)
2215a620fbe9SPaolo Bonzini  {
2216a620fbe9SPaolo Bonzini    int len, fd = 0;
2217a620fbe9SPaolo Bonzini    len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
2218a620fbe9SPaolo Bonzini    splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
2219a620fbe9SPaolo Bonzini    return 0;
2220a620fbe9SPaolo Bonzini  }'''))
2221e1fbd2c4SPaolo Bonzini
222296a63aebSPaolo Bonziniconfig_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
222396a63aebSPaolo Bonzini  #include <sys/mman.h>
2224b5d3dac1SPaolo Bonzini  int main(void) {
222596a63aebSPaolo Bonzini    return mlockall(MCL_FUTURE);
222696a63aebSPaolo Bonzini  }'''))
222796a63aebSPaolo Bonzini
2228eea9453aSThomas Huthhave_l2tpv3 = false
222943a363aeSPaolo Bonziniif get_option('l2tpv3').allowed() and have_system
22306a23f819SPaolo Bonzini  have_l2tpv3 = cc.has_type('struct mmsghdr',
22316a23f819SPaolo Bonzini    prefix: gnu_source_prefix + '''
22326a23f819SPaolo Bonzini      #include <sys/socket.h>
22336a23f819SPaolo Bonzini      #include <linux/ip.h>''')
2234eea9453aSThomas Huthendif
2235eea9453aSThomas Huthconfig_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
2236eea9453aSThomas Huth
2237837b84b1SPaolo Bonzinihave_netmap = false
223843a363aeSPaolo Bonziniif get_option('netmap').allowed() and have_system
2239837b84b1SPaolo Bonzini  have_netmap = cc.compiles('''
2240837b84b1SPaolo Bonzini    #include <inttypes.h>
2241837b84b1SPaolo Bonzini    #include <net/if.h>
2242837b84b1SPaolo Bonzini    #include <net/netmap.h>
2243837b84b1SPaolo Bonzini    #include <net/netmap_user.h>
2244837b84b1SPaolo Bonzini    #if (NETMAP_API < 11) || (NETMAP_API > 15)
2245837b84b1SPaolo Bonzini    #error
2246837b84b1SPaolo Bonzini    #endif
2247837b84b1SPaolo Bonzini    int main(void) { return 0; }''')
2248837b84b1SPaolo Bonzini  if not have_netmap and get_option('netmap').enabled()
2249837b84b1SPaolo Bonzini    error('Netmap headers not available')
2250837b84b1SPaolo Bonzini  endif
2251837b84b1SPaolo Bonziniendif
2252837b84b1SPaolo Bonziniconfig_host_data.set('CONFIG_NETMAP', have_netmap)
2253837b84b1SPaolo Bonzini
225496a63aebSPaolo Bonzini# Work around a system header bug with some kernel/XFS header
225596a63aebSPaolo Bonzini# versions where they both try to define 'struct fsxattr':
225696a63aebSPaolo Bonzini# xfs headers will not try to redefine structs from linux headers
225796a63aebSPaolo Bonzini# if this macro is set.
225896a63aebSPaolo Bonziniconfig_host_data.set('HAVE_FSXATTR', cc.links('''
22596a23f819SPaolo Bonzini  #include <linux/fs.h>
226096a63aebSPaolo Bonzini  struct fsxattr foo;
226196a63aebSPaolo Bonzini  int main(void) {
226296a63aebSPaolo Bonzini    return 0;
226396a63aebSPaolo Bonzini  }'''))
226496a63aebSPaolo Bonzini
2265e46bd55dSPaolo Bonzini# Some versions of Mac OS X incorrectly define SIZE_MAX
2266e46bd55dSPaolo Bonziniconfig_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
2267e46bd55dSPaolo Bonzini    #include <stdint.h>
2268e46bd55dSPaolo Bonzini    #include <stdio.h>
2269b5d3dac1SPaolo Bonzini    int main(void) {
2270e46bd55dSPaolo Bonzini        return printf("%zu", SIZE_MAX);
2271e46bd55dSPaolo Bonzini    }''', args: ['-Werror']))
2272e46bd55dSPaolo Bonzini
2273e61f1efeSRichard Henderson# See if 64-bit atomic operations are supported.
2274e61f1efeSRichard Henderson# Note that without __atomic builtins, we can only
2275e61f1efeSRichard Henderson# assume atomic loads/stores max at pointer size.
2276e61f1efeSRichard Hendersonconfig_host_data.set('CONFIG_ATOMIC64', cc.links('''
2277bd87a367SPaolo Bonzini  #include <stdint.h>
2278bd87a367SPaolo Bonzini  int main(void)
2279bd87a367SPaolo Bonzini  {
2280e61f1efeSRichard Henderson    uint64_t x = 0, y = 0;
2281bd87a367SPaolo Bonzini    y = __atomic_load_n(&x, __ATOMIC_RELAXED);
2282bd87a367SPaolo Bonzini    __atomic_store_n(&x, y, __ATOMIC_RELAXED);
2283bd87a367SPaolo Bonzini    __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2284bd87a367SPaolo Bonzini    __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
2285bd87a367SPaolo Bonzini    __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
2286bd87a367SPaolo Bonzini    return 0;
2287e61f1efeSRichard Henderson  }'''))
2288bd87a367SPaolo Bonzini
2289848126d1SMarc-André Lureauhas_int128 = cc.links('''
2290848126d1SMarc-André Lureau  __int128_t a;
2291848126d1SMarc-André Lureau  __uint128_t b;
2292848126d1SMarc-André Lureau  int main (void) {
2293848126d1SMarc-André Lureau    a = a + b;
2294848126d1SMarc-André Lureau    b = a * b;
2295848126d1SMarc-André Lureau    a = a * a;
2296848126d1SMarc-André Lureau    return 0;
2297848126d1SMarc-André Lureau  }''')
2298848126d1SMarc-André Lureau
2299848126d1SMarc-André Lureauconfig_host_data.set('CONFIG_INT128', has_int128)
2300848126d1SMarc-André Lureau
2301848126d1SMarc-André Lureauif has_int128
2302d2958fb0SMarc-André Lureau  # "do we have 128-bit atomics which are handled inline and specifically not
2303d2958fb0SMarc-André Lureau  # via libatomic". The reason we can't use libatomic is documented in the
2304d2958fb0SMarc-André Lureau  # comment starting "GCC is a house divided" in include/qemu/atomic128.h.
2305e61f1efeSRichard Henderson  # We only care about these operations on 16-byte aligned pointers, so
2306e61f1efeSRichard Henderson  # force 16-byte alignment of the pointer, which may be greater than
2307e61f1efeSRichard Henderson  # __alignof(unsigned __int128) for the host.
2308e61f1efeSRichard Henderson  atomic_test_128 = '''
2309e61f1efeSRichard Henderson    int main(int ac, char **av) {
2310e61f1efeSRichard Henderson      unsigned __int128 *p = __builtin_assume_aligned(av[ac - 1], sizeof(16));
2311e61f1efeSRichard Henderson      p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED);
2312e61f1efeSRichard Henderson      __atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED);
2313e61f1efeSRichard Henderson      __atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2314e61f1efeSRichard Henderson      return 0;
2315e61f1efeSRichard Henderson    }'''
2316e61f1efeSRichard Henderson  has_atomic128 = cc.links(atomic_test_128)
2317848126d1SMarc-André Lureau
2318848126d1SMarc-André Lureau  config_host_data.set('CONFIG_ATOMIC128', has_atomic128)
2319848126d1SMarc-André Lureau
2320848126d1SMarc-André Lureau  if not has_atomic128
2321e61f1efeSRichard Henderson    # Even with __builtin_assume_aligned, the above test may have failed
2322e61f1efeSRichard Henderson    # without optimization enabled.  Try again with optimizations locally
2323e61f1efeSRichard Henderson    # enabled for the function.  See
2324e61f1efeSRichard Henderson    #   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107389
2325e61f1efeSRichard Henderson    has_atomic128_opt = cc.links('__attribute__((optimize("O1")))' + atomic_test_128)
2326e61f1efeSRichard Henderson    config_host_data.set('CONFIG_ATOMIC128_OPT', has_atomic128_opt)
2327e61f1efeSRichard Henderson
2328e61f1efeSRichard Henderson    if not has_atomic128_opt
2329e61f1efeSRichard Henderson      config_host_data.set('CONFIG_CMPXCHG128', cc.links('''
2330848126d1SMarc-André Lureau        int main(void)
2331848126d1SMarc-André Lureau        {
2332848126d1SMarc-André Lureau          unsigned __int128 x = 0, y = 0;
2333848126d1SMarc-André Lureau          __sync_val_compare_and_swap_16(&x, y, x);
2334848126d1SMarc-André Lureau          return 0;
2335848126d1SMarc-André Lureau        }
2336e61f1efeSRichard Henderson      '''))
2337e61f1efeSRichard Henderson    endif
2338848126d1SMarc-André Lureau  endif
2339848126d1SMarc-André Lureauendif
2340bd87a367SPaolo Bonzini
2341bd87a367SPaolo Bonziniconfig_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
2342bd87a367SPaolo Bonzini  #include <sys/auxv.h>
2343bd87a367SPaolo Bonzini  int main(void) {
2344bd87a367SPaolo Bonzini    return getauxval(AT_HWCAP) == 0;
2345bd87a367SPaolo Bonzini  }'''))
2346bd87a367SPaolo Bonzini
23470dae95d4SPaolo Bonziniconfig_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles('''
23480dae95d4SPaolo Bonzini  #include <linux/usbdevice_fs.h>
23490dae95d4SPaolo Bonzini
23500dae95d4SPaolo Bonzini  #ifndef USBDEVFS_GET_CAPABILITIES
23510dae95d4SPaolo Bonzini  #error "USBDEVFS_GET_CAPABILITIES undefined"
23520dae95d4SPaolo Bonzini  #endif
23530dae95d4SPaolo Bonzini
23540dae95d4SPaolo Bonzini  #ifndef USBDEVFS_DISCONNECT_CLAIM
23550dae95d4SPaolo Bonzini  #error "USBDEVFS_DISCONNECT_CLAIM undefined"
23560dae95d4SPaolo Bonzini  #endif
23570dae95d4SPaolo Bonzini
23580dae95d4SPaolo Bonzini  int main(void) { return 0; }'''))
23590dae95d4SPaolo Bonzini
23602edd2c04SPaolo Bonzinihave_keyring = get_option('keyring') \
23612edd2c04SPaolo Bonzini  .require(targetos == 'linux', error_message: 'keyring is only available on Linux') \
23622edd2c04SPaolo Bonzini  .require(cc.compiles('''
23632edd2c04SPaolo Bonzini    #include <errno.h>
23642edd2c04SPaolo Bonzini    #include <asm/unistd.h>
23652edd2c04SPaolo Bonzini    #include <linux/keyctl.h>
23662edd2c04SPaolo Bonzini    #include <sys/syscall.h>
23672edd2c04SPaolo Bonzini    #include <unistd.h>
23682edd2c04SPaolo Bonzini    int main(void) {
23692edd2c04SPaolo Bonzini        return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
23702edd2c04SPaolo Bonzini    }'''), error_message: 'keyctl syscall not available on this system').allowed()
23712edd2c04SPaolo Bonziniconfig_host_data.set('CONFIG_SECRET_KEYRING', have_keyring)
23722edd2c04SPaolo Bonzini
2373622753d2SPaolo Bonzinihave_cpuid_h = cc.links('''
2374622753d2SPaolo Bonzini  #include <cpuid.h>
2375622753d2SPaolo Bonzini  int main(void) {
2376622753d2SPaolo Bonzini    unsigned a, b, c, d;
2377622753d2SPaolo Bonzini    unsigned max = __get_cpuid_max(0, 0);
2378622753d2SPaolo Bonzini
2379622753d2SPaolo Bonzini    if (max >= 1) {
2380622753d2SPaolo Bonzini        __cpuid(1, a, b, c, d);
2381622753d2SPaolo Bonzini    }
2382622753d2SPaolo Bonzini
2383622753d2SPaolo Bonzini    if (max >= 7) {
2384622753d2SPaolo Bonzini        __cpuid_count(7, 0, a, b, c, d);
2385622753d2SPaolo Bonzini    }
2386622753d2SPaolo Bonzini
2387622753d2SPaolo Bonzini    return 0;
2388622753d2SPaolo Bonzini  }''')
2389622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_CPUID_H', have_cpuid_h)
2390622753d2SPaolo Bonzini
2391622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \
2392622753d2SPaolo Bonzini  .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \
2393622753d2SPaolo Bonzini  .require(cc.links('''
2394622753d2SPaolo Bonzini    #include <cpuid.h>
2395622753d2SPaolo Bonzini    #include <immintrin.h>
2396701ea587SRichard Henderson    static int __attribute__((target("avx2"))) bar(void *a) {
2397622753d2SPaolo Bonzini      __m256i x = *(__m256i *)a;
2398622753d2SPaolo Bonzini      return _mm256_testz_si256(x, x);
2399622753d2SPaolo Bonzini    }
2400b5d3dac1SPaolo Bonzini    int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
2401622753d2SPaolo Bonzini  '''), error_message: 'AVX2 not available').allowed())
2402622753d2SPaolo Bonzini
2403622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_AVX512F_OPT', get_option('avx512f') \
2404622753d2SPaolo Bonzini  .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512F') \
2405622753d2SPaolo Bonzini  .require(cc.links('''
2406622753d2SPaolo Bonzini    #include <cpuid.h>
2407622753d2SPaolo Bonzini    #include <immintrin.h>
2408701ea587SRichard Henderson    static int __attribute__((target("avx512f"))) bar(void *a) {
2409622753d2SPaolo Bonzini      __m512i x = *(__m512i *)a;
2410622753d2SPaolo Bonzini      return _mm512_test_epi64_mask(x, x);
2411622753d2SPaolo Bonzini    }
2412b5d3dac1SPaolo Bonzini    int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
2413622753d2SPaolo Bonzini  '''), error_message: 'AVX512F not available').allowed())
2414622753d2SPaolo Bonzini
241504ffce13Sling xuconfig_host_data.set('CONFIG_AVX512BW_OPT', get_option('avx512bw') \
241604ffce13Sling xu  .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512BW') \
241704ffce13Sling xu  .require(cc.links('''
241804ffce13Sling xu    #include <cpuid.h>
241904ffce13Sling xu    #include <immintrin.h>
2420dc165fcdSRichard Henderson    static int __attribute__((target("avx512bw"))) bar(void *a) {
242104ffce13Sling xu      __m512i *x = a;
242204ffce13Sling xu      __m512i res= _mm512_abs_epi8(*x);
242304ffce13Sling xu      return res[1];
242404ffce13Sling xu    }
242504ffce13Sling xu    int main(int argc, char *argv[]) { return bar(argv[0]); }
242604ffce13Sling xu  '''), error_message: 'AVX512BW not available').allowed())
242704ffce13Sling xu
24283730a734SPaolo Bonzinihave_pvrdma = get_option('pvrdma') \
24293730a734SPaolo Bonzini  .require(rdma.found(), error_message: 'PVRDMA requires OpenFabrics libraries') \
2430354d2d9bSJuan Quintela  .require(cc.compiles(gnu_source_prefix + '''
2431354d2d9bSJuan Quintela    #include <sys/mman.h>
24323730a734SPaolo Bonzini    int main(void)
24333730a734SPaolo Bonzini    {
24343730a734SPaolo Bonzini      char buf = 0;
24353730a734SPaolo Bonzini      void *addr = &buf;
24363730a734SPaolo Bonzini      addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
24373730a734SPaolo Bonzini
24383730a734SPaolo Bonzini      return 0;
24393730a734SPaolo Bonzini    }'''), error_message: 'PVRDMA requires mremap').allowed()
24403730a734SPaolo Bonzini
24413730a734SPaolo Bonziniif have_pvrdma
2442354d2d9bSJuan Quintela  config_host_data.set('LEGACY_RDMA_REG_MR', not cc.links('''
24433730a734SPaolo Bonzini    #include <infiniband/verbs.h>
24443730a734SPaolo Bonzini    int main(void)
24453730a734SPaolo Bonzini    {
24463730a734SPaolo Bonzini      struct ibv_mr *mr;
24473730a734SPaolo Bonzini      struct ibv_pd *pd = NULL;
24483730a734SPaolo Bonzini      size_t length = 10;
24493730a734SPaolo Bonzini      uint64_t iova = 0;
24503730a734SPaolo Bonzini      int access = 0;
24513730a734SPaolo Bonzini      void *addr = NULL;
24523730a734SPaolo Bonzini
24533730a734SPaolo Bonzini      mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
24543730a734SPaolo Bonzini      ibv_dereg_mr(mr);
24553730a734SPaolo Bonzini      return 0;
24563730a734SPaolo Bonzini    }'''))
24573730a734SPaolo Bonziniendif
24583730a734SPaolo Bonzini
2459b87df904SPaolo Bonziniif get_option('membarrier').disabled()
2460b87df904SPaolo Bonzini  have_membarrier = false
2461b87df904SPaolo Bonzinielif targetos == 'windows'
2462b87df904SPaolo Bonzini  have_membarrier = true
2463b87df904SPaolo Bonzinielif targetos == 'linux'
2464b87df904SPaolo Bonzini  have_membarrier = cc.compiles('''
2465b87df904SPaolo Bonzini    #include <linux/membarrier.h>
2466b87df904SPaolo Bonzini    #include <sys/syscall.h>
2467b87df904SPaolo Bonzini    #include <unistd.h>
2468b87df904SPaolo Bonzini    #include <stdlib.h>
2469b87df904SPaolo Bonzini    int main(void) {
2470b87df904SPaolo Bonzini        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
2471b87df904SPaolo Bonzini        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
2472b87df904SPaolo Bonzini        exit(0);
2473b87df904SPaolo Bonzini    }''')
2474b87df904SPaolo Bonziniendif
2475b87df904SPaolo Bonziniconfig_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \
2476b87df904SPaolo Bonzini  .require(have_membarrier, error_message: 'membarrier system call not available') \
2477b87df904SPaolo Bonzini  .allowed())
2478b87df904SPaolo Bonzini
247934b52615SPaolo Bonzinihave_afalg = get_option('crypto_afalg') \
248034b52615SPaolo Bonzini  .require(cc.compiles(gnu_source_prefix + '''
248134b52615SPaolo Bonzini    #include <errno.h>
248234b52615SPaolo Bonzini    #include <sys/types.h>
248334b52615SPaolo Bonzini    #include <sys/socket.h>
248434b52615SPaolo Bonzini    #include <linux/if_alg.h>
248534b52615SPaolo Bonzini    int main(void) {
248634b52615SPaolo Bonzini      int sock;
248734b52615SPaolo Bonzini      sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
248834b52615SPaolo Bonzini      return sock;
248934b52615SPaolo Bonzini    }
249034b52615SPaolo Bonzini  '''), error_message: 'AF_ALG requested but could not be detected').allowed()
249134b52615SPaolo Bonziniconfig_host_data.set('CONFIG_AF_ALG', have_afalg)
249234b52615SPaolo Bonzini
24939d734b85SMarc-André Lureauconfig_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
24949d734b85SMarc-André Lureau  'linux/vm_sockets.h', 'AF_VSOCK',
24959d734b85SMarc-André Lureau  prefix: '#include <sys/socket.h>',
24969d734b85SMarc-André Lureau))
2497bd87a367SPaolo Bonzini
24988821a389SMarc-André Lureauhave_vss = false
2499872b69e6SMarc-André Lureauhave_vss_sdk = false # old xp/2003 SDK
25008821a389SMarc-André Lureauif targetos == 'windows' and link_language == 'cpp'
25018821a389SMarc-André Lureau  have_vss = cxx.compiles('''
25028821a389SMarc-André Lureau    #define __MIDL_user_allocate_free_DEFINED__
250332478cb6SMarc-André Lureau    #include <vss.h>
25048821a389SMarc-André Lureau    int main(void) { return VSS_CTX_BACKUP; }''')
2505872b69e6SMarc-André Lureau  have_vss_sdk = cxx.has_header('vscoordint.h')
25068821a389SMarc-André Lureauendif
2507872b69e6SMarc-André Lureauconfig_host_data.set('HAVE_VSS_SDK', have_vss_sdk)
25088821a389SMarc-André Lureau
2509859aef02SPaolo Bonziniforeach k, v: config_host
2510ce6119dcSPaolo Bonzini  if k.startswith('CONFIG_')
2511859aef02SPaolo Bonzini    config_host_data.set(k, v == 'y' ? 1 : v)
2512859aef02SPaolo Bonzini  endif
2513859aef02SPaolo Bonziniendforeach
2514859aef02SPaolo Bonzini
25156391c772SRichard Henderson# Older versions of MinGW do not import _lock_file and _unlock_file properly.
25166391c772SRichard Henderson# This was fixed for v6.0.0 with commit b48e3ac8969d.
25176391c772SRichard Hendersonif targetos == 'windows'
25186391c772SRichard Henderson  config_host_data.set('HAVE__LOCK_FILE', cc.links('''
25196391c772SRichard Henderson    #include <stdio.h>
25206391c772SRichard Henderson    int main(void) {
25216391c772SRichard Henderson      _lock_file(NULL);
25226391c772SRichard Henderson      _unlock_file(NULL);
25236391c772SRichard Henderson      return 0;
25246391c772SRichard Henderson    }''', name: '_lock_file and _unlock_file'))
25256391c772SRichard Hendersonendif
25266391c772SRichard Henderson
2527dbd672c8SPierrick Bouvierif targetos == 'windows'
2528dbd672c8SPierrick Bouvier  mingw_has_setjmp_longjmp = cc.links('''
2529dbd672c8SPierrick Bouvier    #include <setjmp.h>
2530dbd672c8SPierrick Bouvier    int main(void) {
2531dbd672c8SPierrick Bouvier      /*
2532dbd672c8SPierrick Bouvier       * These functions are not available in setjmp header, but may be
2533dbd672c8SPierrick Bouvier       * available at link time, from libmingwex.a.
2534dbd672c8SPierrick Bouvier       */
2535dbd672c8SPierrick Bouvier      extern int __mingw_setjmp(jmp_buf);
2536dbd672c8SPierrick Bouvier      extern void __attribute__((noreturn)) __mingw_longjmp(jmp_buf, int);
2537dbd672c8SPierrick Bouvier      jmp_buf env;
2538dbd672c8SPierrick Bouvier      __mingw_setjmp(env);
2539dbd672c8SPierrick Bouvier      __mingw_longjmp(env, 0);
2540dbd672c8SPierrick Bouvier    }
2541dbd672c8SPierrick Bouvier  ''', name: 'mingw setjmp and longjmp')
2542dbd672c8SPierrick Bouvier
2543dbd672c8SPierrick Bouvier  if cpu == 'aarch64' and not mingw_has_setjmp_longjmp
2544dbd672c8SPierrick Bouvier    error('mingw must provide setjmp/longjmp for windows-arm64')
2545dbd672c8SPierrick Bouvier  endif
2546dbd672c8SPierrick Bouvierendif
2547dbd672c8SPierrick Bouvier
2548a0c9162cSPaolo Bonzini########################
2549a0c9162cSPaolo Bonzini# Target configuration #
2550a0c9162cSPaolo Bonzini########################
2551a0c9162cSPaolo Bonzini
25522becc36aSPaolo Bonziniminikconf = find_program('scripts/minikconf.py')
255305512f55SPaolo Bonziniconfig_all = {}
2554a98006bcSPaolo Bonziniconfig_all_devices = {}
2555ca0fc784SPaolo Bonziniconfig_all_disas = {}
25562becc36aSPaolo Bonziniconfig_devices_mak_list = []
25572becc36aSPaolo Bonziniconfig_devices_h = {}
2558859aef02SPaolo Bonziniconfig_target_h = {}
25592becc36aSPaolo Bonziniconfig_target_mak = {}
2560ca0fc784SPaolo Bonzini
2561ca0fc784SPaolo Bonzinidisassemblers = {
2562ca0fc784SPaolo Bonzini  'alpha' : ['CONFIG_ALPHA_DIS'],
2563ca0fc784SPaolo Bonzini  'avr' : ['CONFIG_AVR_DIS'],
2564ca0fc784SPaolo Bonzini  'cris' : ['CONFIG_CRIS_DIS'],
25653e7a84eeSTaylor Simpson  'hexagon' : ['CONFIG_HEXAGON_DIS'],
2566ca0fc784SPaolo Bonzini  'hppa' : ['CONFIG_HPPA_DIS'],
2567ca0fc784SPaolo Bonzini  'i386' : ['CONFIG_I386_DIS'],
2568ca0fc784SPaolo Bonzini  'x86_64' : ['CONFIG_I386_DIS'],
2569ca0fc784SPaolo Bonzini  'm68k' : ['CONFIG_M68K_DIS'],
2570ca0fc784SPaolo Bonzini  'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
2571ca0fc784SPaolo Bonzini  'mips' : ['CONFIG_MIPS_DIS'],
2572ca0fc784SPaolo Bonzini  'nios2' : ['CONFIG_NIOS2_DIS'],
2573ca0fc784SPaolo Bonzini  'or1k' : ['CONFIG_OPENRISC_DIS'],
2574ca0fc784SPaolo Bonzini  'ppc' : ['CONFIG_PPC_DIS'],
2575ca0fc784SPaolo Bonzini  'riscv' : ['CONFIG_RISCV_DIS'],
2576ca0fc784SPaolo Bonzini  'rx' : ['CONFIG_RX_DIS'],
2577ca0fc784SPaolo Bonzini  's390' : ['CONFIG_S390_DIS'],
2578ca0fc784SPaolo Bonzini  'sh4' : ['CONFIG_SH4_DIS'],
2579ca0fc784SPaolo Bonzini  'sparc' : ['CONFIG_SPARC_DIS'],
2580ca0fc784SPaolo Bonzini  'xtensa' : ['CONFIG_XTENSA_DIS'],
2581aae1746cSSong Gao  'loongarch' : ['CONFIG_LOONGARCH_DIS'],
2582ca0fc784SPaolo Bonzini}
2583ca0fc784SPaolo Bonzini
2584e1fbd2c4SPaolo Bonzinihave_ivshmem = config_host_data.get('CONFIG_EVENTFD')
25850a189110SPaolo Bonzinihost_kconfig = \
2586537b7248SPaolo Bonzini  (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
25870d04c4c9SPaolo Bonzini  (have_tpm ? ['CONFIG_TPM=y'] : []) + \
25883f0a5d55SMarc-André Lureau  (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
2589ccd250aaSPaolo Bonzini  (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
259088b6e618SPaolo Bonzini  (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \
25919d71037fSPaolo Bonzini  (x11.found() ? ['CONFIG_X11=y'] : []) + \
25922a3129a3SPaolo Bonzini  (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \
25932a3129a3SPaolo Bonzini  (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \
25942a3129a3SPaolo Bonzini  (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
259569202b40SPaolo Bonzini  (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
25960a189110SPaolo Bonzini  ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
25973730a734SPaolo Bonzini  (have_pvrdma ? ['CONFIG_PVRDMA=y'] : []) + \
259855116968SJagannathan Raman  (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \
259955116968SJagannathan Raman  (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : [])
26000a189110SPaolo Bonzini
2601a9a74907SPaolo Bonziniignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
2602ca0fc784SPaolo Bonzini
2603fdb75aefSPaolo Bonzinidefault_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
2604fdb75aefSPaolo Bonziniactual_target_dirs = []
2605fbb4121dSPaolo Bonzinifdt_required = []
2606a81df1b6SPaolo Bonziniforeach target : target_dirs
2607765686d6SPaolo Bonzini  config_target = { 'TARGET_NAME': target.split('-')[0] }
2608765686d6SPaolo Bonzini  if target.endswith('linux-user')
2609fdb75aefSPaolo Bonzini    if targetos != 'linux'
2610fdb75aefSPaolo Bonzini      if default_targets
2611fdb75aefSPaolo Bonzini        continue
2612fdb75aefSPaolo Bonzini      endif
2613fdb75aefSPaolo Bonzini      error('Target @0@ is only available on a Linux host'.format(target))
2614fdb75aefSPaolo Bonzini    endif
2615765686d6SPaolo Bonzini    config_target += { 'CONFIG_LINUX_USER': 'y' }
2616765686d6SPaolo Bonzini  elif target.endswith('bsd-user')
2617fdb75aefSPaolo Bonzini    if 'CONFIG_BSD' not in config_host
2618fdb75aefSPaolo Bonzini      if default_targets
2619fdb75aefSPaolo Bonzini        continue
2620fdb75aefSPaolo Bonzini      endif
2621fdb75aefSPaolo Bonzini      error('Target @0@ is only available on a BSD host'.format(target))
2622fdb75aefSPaolo Bonzini    endif
2623765686d6SPaolo Bonzini    config_target += { 'CONFIG_BSD_USER': 'y' }
2624765686d6SPaolo Bonzini  elif target.endswith('softmmu')
2625765686d6SPaolo Bonzini    config_target += { 'CONFIG_SOFTMMU': 'y' }
2626765686d6SPaolo Bonzini  endif
2627765686d6SPaolo Bonzini  if target.endswith('-user')
2628765686d6SPaolo Bonzini    config_target += {
2629765686d6SPaolo Bonzini      'CONFIG_USER_ONLY': 'y',
2630765686d6SPaolo Bonzini      'CONFIG_QEMU_INTERP_PREFIX':
2631ce6119dcSPaolo Bonzini        get_option('interp_prefix').replace('%M', config_target['TARGET_NAME'])
2632765686d6SPaolo Bonzini    }
2633765686d6SPaolo Bonzini  endif
2634859aef02SPaolo Bonzini
26350a189110SPaolo Bonzini  accel_kconfig = []
26368a19980eSPaolo Bonzini  foreach sym: accelerators
26378a19980eSPaolo Bonzini    if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
26388a19980eSPaolo Bonzini      config_target += { sym: 'y' }
26398a19980eSPaolo Bonzini      config_all += { sym: 'y' }
2640dae0ec15SGerd Hoffmann      if target in modular_tcg
2641dae0ec15SGerd Hoffmann        config_target += { 'CONFIG_TCG_MODULAR': 'y' }
2642dae0ec15SGerd Hoffmann      else
2643dae0ec15SGerd Hoffmann        config_target += { 'CONFIG_TCG_BUILTIN': 'y' }
2644dae0ec15SGerd Hoffmann      endif
26450a189110SPaolo Bonzini      accel_kconfig += [ sym + '=y' ]
26468a19980eSPaolo Bonzini    endif
26478a19980eSPaolo Bonzini  endforeach
26480a189110SPaolo Bonzini  if accel_kconfig.length() == 0
2649fdb75aefSPaolo Bonzini    if default_targets
2650fdb75aefSPaolo Bonzini      continue
2651fdb75aefSPaolo Bonzini    endif
2652fdb75aefSPaolo Bonzini    error('No accelerator available for target @0@'.format(target))
2653fdb75aefSPaolo Bonzini  endif
26548a19980eSPaolo Bonzini
2655fdb75aefSPaolo Bonzini  actual_target_dirs += target
2656812b31d3SAlex Bennée  config_target += keyval.load('configs/targets' / target + '.mak')
2657a9a74907SPaolo Bonzini  config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
2658765686d6SPaolo Bonzini
2659fbb4121dSPaolo Bonzini  if 'TARGET_NEED_FDT' in config_target
2660fbb4121dSPaolo Bonzini    fdt_required += target
2661fbb4121dSPaolo Bonzini  endif
2662fbb4121dSPaolo Bonzini
2663fa73168bSPaolo Bonzini  # Add default keys
2664fa73168bSPaolo Bonzini  if 'TARGET_BASE_ARCH' not in config_target
2665fa73168bSPaolo Bonzini    config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
2666fa73168bSPaolo Bonzini  endif
2667fa73168bSPaolo Bonzini  if 'TARGET_ABI_DIR' not in config_target
2668fa73168bSPaolo Bonzini    config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
2669fa73168bSPaolo Bonzini  endif
2670ee3eb3a7SMarc-André Lureau  if 'TARGET_BIG_ENDIAN' not in config_target
2671ee3eb3a7SMarc-André Lureau    config_target += {'TARGET_BIG_ENDIAN': 'n'}
2672ee3eb3a7SMarc-André Lureau  endif
2673859aef02SPaolo Bonzini
2674ca0fc784SPaolo Bonzini  foreach k, v: disassemblers
2675823eb013SPaolo Bonzini    if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
2676ca0fc784SPaolo Bonzini      foreach sym: v
2677ca0fc784SPaolo Bonzini        config_target += { sym: 'y' }
2678ca0fc784SPaolo Bonzini        config_all_disas += { sym: 'y' }
2679ca0fc784SPaolo Bonzini      endforeach
2680ca0fc784SPaolo Bonzini    endif
2681ca0fc784SPaolo Bonzini  endforeach
2682ca0fc784SPaolo Bonzini
2683859aef02SPaolo Bonzini  config_target_data = configuration_data()
2684859aef02SPaolo Bonzini  foreach k, v: config_target
2685859aef02SPaolo Bonzini    if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
2686859aef02SPaolo Bonzini      # do nothing
2687859aef02SPaolo Bonzini    elif ignored.contains(k)
2688859aef02SPaolo Bonzini      # do nothing
2689859aef02SPaolo Bonzini    elif k == 'TARGET_BASE_ARCH'
2690a9a74907SPaolo Bonzini      # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
2691a9a74907SPaolo Bonzini      # not used to select files from sourcesets.
2692859aef02SPaolo Bonzini      config_target_data.set('TARGET_' + v.to_upper(), 1)
2693765686d6SPaolo Bonzini    elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
2694859aef02SPaolo Bonzini      config_target_data.set_quoted(k, v)
2695859aef02SPaolo Bonzini    elif v == 'y'
2696859aef02SPaolo Bonzini      config_target_data.set(k, 1)
2697ee3eb3a7SMarc-André Lureau    elif v == 'n'
2698ee3eb3a7SMarc-André Lureau      config_target_data.set(k, 0)
2699859aef02SPaolo Bonzini    else
2700859aef02SPaolo Bonzini      config_target_data.set(k, v)
2701859aef02SPaolo Bonzini    endif
2702859aef02SPaolo Bonzini  endforeach
2703cb2c5531SPeter Maydell  config_target_data.set('QEMU_ARCH',
2704cb2c5531SPeter Maydell                         'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
2705859aef02SPaolo Bonzini  config_target_h += {target: configure_file(output: target + '-config-target.h',
2706859aef02SPaolo Bonzini                                               configuration: config_target_data)}
27072becc36aSPaolo Bonzini
27082becc36aSPaolo Bonzini  if target.endswith('-softmmu')
2709d1d5e9eeSAlex Bennée    config_input = meson.get_external_property(target, 'default')
27102becc36aSPaolo Bonzini    config_devices_mak = target + '-config-devices.mak'
27112becc36aSPaolo Bonzini    config_devices_mak = configure_file(
2712d1d5e9eeSAlex Bennée      input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
27132becc36aSPaolo Bonzini      output: config_devices_mak,
27142becc36aSPaolo Bonzini      depfile: config_devices_mak + '.d',
27152becc36aSPaolo Bonzini      capture: true,
27167bc3ca7fSPaolo Bonzini      command: [minikconf,
27177bc3ca7fSPaolo Bonzini                get_option('default_devices') ? '--defconfig' : '--allnoconfig',
27182becc36aSPaolo Bonzini                config_devices_mak, '@DEPFILE@', '@INPUT@',
2719f4063f9cSPhilippe Mathieu-Daudé                host_kconfig, accel_kconfig,
2720f4063f9cSPhilippe Mathieu-Daudé                'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'])
2721859aef02SPaolo Bonzini
2722859aef02SPaolo Bonzini    config_devices_data = configuration_data()
2723859aef02SPaolo Bonzini    config_devices = keyval.load(config_devices_mak)
2724859aef02SPaolo Bonzini    foreach k, v: config_devices
2725859aef02SPaolo Bonzini      config_devices_data.set(k, 1)
2726859aef02SPaolo Bonzini    endforeach
27272becc36aSPaolo Bonzini    config_devices_mak_list += config_devices_mak
2728859aef02SPaolo Bonzini    config_devices_h += {target: configure_file(output: target + '-config-devices.h',
2729859aef02SPaolo Bonzini                                                configuration: config_devices_data)}
2730859aef02SPaolo Bonzini    config_target += config_devices
2731a98006bcSPaolo Bonzini    config_all_devices += config_devices
27322becc36aSPaolo Bonzini  endif
27332becc36aSPaolo Bonzini  config_target_mak += {target: config_target}
2734a81df1b6SPaolo Bonziniendforeach
2735fdb75aefSPaolo Bonzinitarget_dirs = actual_target_dirs
2736a81df1b6SPaolo Bonzini
27372becc36aSPaolo Bonzini# This configuration is used to build files that are shared by
27382becc36aSPaolo Bonzini# multiple binaries, and then extracted out of the "common"
27392becc36aSPaolo Bonzini# static_library target.
27402becc36aSPaolo Bonzini#
27412becc36aSPaolo Bonzini# We do not use all_sources()/all_dependencies(), because it would
27422becc36aSPaolo Bonzini# build literally all source files, including devices only used by
27432becc36aSPaolo Bonzini# targets that are not built for this compilation.  The CONFIG_ALL
27442becc36aSPaolo Bonzini# pseudo symbol replaces it.
27452becc36aSPaolo Bonzini
274605512f55SPaolo Bonziniconfig_all += config_all_devices
27472becc36aSPaolo Bonziniconfig_all += config_host
27482becc36aSPaolo Bonziniconfig_all += config_all_disas
27492becc36aSPaolo Bonziniconfig_all += {
275014efd8d3SPaolo Bonzini  'CONFIG_XEN': xen.found(),
27512becc36aSPaolo Bonzini  'CONFIG_SOFTMMU': have_system,
27522becc36aSPaolo Bonzini  'CONFIG_USER_ONLY': have_user,
27532becc36aSPaolo Bonzini  'CONFIG_ALL': true,
27542becc36aSPaolo Bonzini}
27552becc36aSPaolo Bonzini
2756eed56e9aSPaolo Bonzinitarget_configs_h = []
2757eed56e9aSPaolo Bonziniforeach target: target_dirs
2758eed56e9aSPaolo Bonzini  target_configs_h += config_target_h[target]
2759eed56e9aSPaolo Bonzini  target_configs_h += config_devices_h.get(target, [])
2760eed56e9aSPaolo Bonziniendforeach
2761eed56e9aSPaolo Bonzinigenh += custom_target('config-poison.h',
2762eed56e9aSPaolo Bonzini                      input: [target_configs_h],
2763eed56e9aSPaolo Bonzini                      output: 'config-poison.h',
2764eed56e9aSPaolo Bonzini                      capture: true,
2765eed56e9aSPaolo Bonzini                      command: [find_program('scripts/make-config-poison.sh'),
2766eed56e9aSPaolo Bonzini                                target_configs_h])
2767eed56e9aSPaolo Bonzini
2768a0c9162cSPaolo Bonzini##############
2769a0c9162cSPaolo Bonzini# Submodules #
2770a0c9162cSPaolo Bonzini##############
27718b18cdbfSRichard Henderson
27728b18cdbfSRichard Hendersoncapstone = not_found
277383602083SThomas Huthif not get_option('capstone').auto() or have_system or have_user
277443ecd166SThomas Huth  capstone = dependency('capstone', version: '>=3.0.5',
2775063d5119SPaolo Bonzini                        method: 'pkg-config',
277683602083SThomas Huth                        required: get_option('capstone'))
27778f4aea71SDaniel P. Berrangé
27788f4aea71SDaniel P. Berrangé  # Some versions of capstone have broken pkg-config file
27798f4aea71SDaniel P. Berrangé  # that reports a wrong -I path, causing the #include to
27808f4aea71SDaniel P. Berrangé  # fail later. If the system has such a broken version
27818f4aea71SDaniel P. Berrangé  # do not use it.
27828f4aea71SDaniel P. Berrangé  if capstone.found() and not cc.compiles('#include <capstone.h>',
27838f4aea71SDaniel P. Berrangé                                          dependencies: [capstone])
27848f4aea71SDaniel P. Berrangé    capstone = not_found
278583602083SThomas Huth    if get_option('capstone').enabled()
278683602083SThomas Huth      error('capstone requested, but it does not appear to work')
27878f4aea71SDaniel P. Berrangé    endif
27888f4aea71SDaniel P. Berrangé  endif
27898b18cdbfSRichard Hendersonendif
27904d34a86bSPaolo Bonzini
279155116968SJagannathan Ramanlibvfio_user_dep = not_found
279255116968SJagannathan Ramanif have_system and vfio_user_server_allowed
279355116968SJagannathan Raman  have_internal = fs.exists(meson.current_source_dir() / 'subprojects/libvfio-user/meson.build')
279455116968SJagannathan Raman
279555116968SJagannathan Raman  if not have_internal
279655116968SJagannathan Raman    error('libvfio-user source not found - please pull git submodule')
279755116968SJagannathan Raman  endif
279855116968SJagannathan Raman
279955116968SJagannathan Raman  libvfio_user_proj = subproject('libvfio-user')
280055116968SJagannathan Raman
28015328353cSPaolo Bonzini  libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep')
280255116968SJagannathan Ramanendif
280355116968SJagannathan Raman
2804fbb4121dSPaolo Bonzinifdt = not_found
2805fbb4121dSPaolo Bonziniif have_system
2806c593d841SPhilippe Mathieu-Daudé  fdt_opt = get_option('fdt')
2807fbb4121dSPaolo Bonzini  if fdt_opt in ['enabled', 'auto', 'system']
2808fbb4121dSPaolo Bonzini    have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
2809063d5119SPaolo Bonzini    fdt = cc.find_library('fdt',
2810fbb4121dSPaolo Bonzini                          required: fdt_opt == 'system' or
2811fbb4121dSPaolo Bonzini                                    fdt_opt == 'enabled' and not have_internal)
2812fbb4121dSPaolo Bonzini    if fdt.found() and cc.links('''
2813fbb4121dSPaolo Bonzini       #include <libfdt.h>
2814fbb4121dSPaolo Bonzini       #include <libfdt_env.h>
2815de47b0ffSThomas Huth       int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
2816fbb4121dSPaolo Bonzini         dependencies: fdt)
2817fbb4121dSPaolo Bonzini      fdt_opt = 'system'
28186c22853cSThomas Huth    elif fdt_opt == 'system'
28196c22853cSThomas Huth       error('system libfdt requested, but it is too old (1.5.1 or newer required)')
2820fbb4121dSPaolo Bonzini    elif have_internal
2821fbb4121dSPaolo Bonzini      fdt_opt = 'internal'
2822fbb4121dSPaolo Bonzini    else
2823fbb4121dSPaolo Bonzini      fdt_opt = 'disabled'
282487daf898SThomas Huth      fdt = not_found
2825fbb4121dSPaolo Bonzini    endif
2826fbb4121dSPaolo Bonzini  endif
2827fbb4121dSPaolo Bonzini  if fdt_opt == 'internal'
2828fbb4121dSPaolo Bonzini    fdt_files = files(
2829fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt.c',
2830fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_ro.c',
2831fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_wip.c',
2832fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_sw.c',
2833fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_rw.c',
2834fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_strerror.c',
2835fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_empty_tree.c',
2836fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_addresses.c',
2837fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_overlay.c',
2838fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_check.c',
2839fbb4121dSPaolo Bonzini    )
2840fbb4121dSPaolo Bonzini
2841fbb4121dSPaolo Bonzini    fdt_inc = include_directories('dtc/libfdt')
2842fbb4121dSPaolo Bonzini    libfdt = static_library('fdt',
2843610e7e0eSPhilippe Mathieu-Daudé                            build_by_default: false,
2844fbb4121dSPaolo Bonzini                            sources: fdt_files,
2845fbb4121dSPaolo Bonzini                            include_directories: fdt_inc)
2846fbb4121dSPaolo Bonzini    fdt = declare_dependency(link_with: libfdt,
2847fbb4121dSPaolo Bonzini                             include_directories: fdt_inc)
2848fbb4121dSPaolo Bonzini  endif
2849c593d841SPhilippe Mathieu-Daudéelse
2850c593d841SPhilippe Mathieu-Daudé  fdt_opt = 'disabled'
2851fbb4121dSPaolo Bonziniendif
2852fbb4121dSPaolo Bonziniif not fdt.found() and fdt_required.length() > 0
2853fbb4121dSPaolo Bonzini  error('fdt not available but required by targets ' + ', '.join(fdt_required))
2854fbb4121dSPaolo Bonziniendif
2855fbb4121dSPaolo Bonzini
28568b18cdbfSRichard Hendersonconfig_host_data.set('CONFIG_CAPSTONE', capstone.found())
2857fbb4121dSPaolo Bonziniconfig_host_data.set('CONFIG_FDT', fdt.found())
28584d34a86bSPaolo Bonziniconfig_host_data.set('CONFIG_SLIRP', slirp.found())
28598b18cdbfSRichard Henderson
2860a0c9162cSPaolo Bonzini#####################
2861a0c9162cSPaolo Bonzini# Generated sources #
2862a0c9162cSPaolo Bonzini#####################
28638b18cdbfSRichard Henderson
2864a0c9162cSPaolo Bonzinigenh += configure_file(output: 'config-host.h', configuration: config_host_data)
2865a81df1b6SPaolo Bonzini
28663f885659SMarc-André Lureauhxtool = find_program('scripts/hxtool')
2867e2c4012bSMarc-André Lureaushaderinclude = find_program('scripts/shaderinclude.py')
2868a81df1b6SPaolo Bonziniqapi_gen = find_program('scripts/qapi-gen.py')
2869654d6b04SPaolo Bonziniqapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
2870654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/commands.py',
2871654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/common.py',
2872654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/error.py',
2873654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/events.py',
2874654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/expr.py',
2875654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/gen.py',
2876654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/introspect.py',
287788d357d2SMarkus Armbruster                     meson.current_source_dir() / 'scripts/qapi/main.py',
2878654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/parser.py',
2879654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/schema.py',
2880654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/source.py',
2881654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/types.py',
2882654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/visit.py',
2883654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi-gen.py'
2884a81df1b6SPaolo Bonzini]
2885a81df1b6SPaolo Bonzini
2886a81df1b6SPaolo Bonzinitracetool = [
2887a81df1b6SPaolo Bonzini  python, files('scripts/tracetool.py'),
28889c29b741SPaolo Bonzini   '--backend=' + ','.join(get_option('trace_backends'))
2889a81df1b6SPaolo Bonzini]
28900572d6cdSStefan Hajnoczitracetool_depends = files(
28910572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/log.py',
28920572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/__init__.py',
28930572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/dtrace.py',
28940572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/ftrace.py',
28950572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/simple.py',
28960572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/syslog.py',
28970572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/ust.py',
28980572d6cdSStefan Hajnoczi  'scripts/tracetool/format/ust_events_c.py',
28990572d6cdSStefan Hajnoczi  'scripts/tracetool/format/ust_events_h.py',
29000572d6cdSStefan Hajnoczi  'scripts/tracetool/format/__init__.py',
29010572d6cdSStefan Hajnoczi  'scripts/tracetool/format/d.py',
29020572d6cdSStefan Hajnoczi  'scripts/tracetool/format/simpletrace_stap.py',
29030572d6cdSStefan Hajnoczi  'scripts/tracetool/format/c.py',
29040572d6cdSStefan Hajnoczi  'scripts/tracetool/format/h.py',
29050572d6cdSStefan Hajnoczi  'scripts/tracetool/format/log_stap.py',
29060572d6cdSStefan Hajnoczi  'scripts/tracetool/format/stap.py',
29070572d6cdSStefan Hajnoczi  'scripts/tracetool/__init__.py',
29080572d6cdSStefan Hajnoczi  'scripts/tracetool/vcpu.py'
29090572d6cdSStefan Hajnoczi)
2910a81df1b6SPaolo Bonzini
29112c273f32SMarc-André Lureauqemu_version_cmd = [find_program('scripts/qemu-version.sh'),
29122c273f32SMarc-André Lureau                    meson.current_source_dir(),
2913b0b4323eSPaolo Bonzini                    get_option('pkgversion'), meson.project_version()]
29142c273f32SMarc-André Lureauqemu_version = custom_target('qemu-version.h',
29152c273f32SMarc-André Lureau                             output: 'qemu-version.h',
29162c273f32SMarc-André Lureau                             command: qemu_version_cmd,
29172c273f32SMarc-André Lureau                             capture: true,
29182c273f32SMarc-André Lureau                             build_by_default: true,
29192c273f32SMarc-André Lureau                             build_always_stale: true)
29202c273f32SMarc-André Lureaugenh += qemu_version
29212c273f32SMarc-André Lureau
29223f885659SMarc-André Lureauhxdep = []
29233f885659SMarc-André Lureauhx_headers = [
29243f885659SMarc-André Lureau  ['qemu-options.hx', 'qemu-options.def'],
29253f885659SMarc-André Lureau  ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
29263f885659SMarc-André Lureau]
29273f885659SMarc-André Lureauif have_system
29283f885659SMarc-André Lureau  hx_headers += [
29293f885659SMarc-André Lureau    ['hmp-commands.hx', 'hmp-commands.h'],
29303f885659SMarc-André Lureau    ['hmp-commands-info.hx', 'hmp-commands-info.h'],
29313f885659SMarc-André Lureau  ]
29323f885659SMarc-André Lureauendif
29333f885659SMarc-André Lureauforeach d : hx_headers
2934b7c70bf2SMarc-André Lureau  hxdep += custom_target(d[1],
29353f885659SMarc-André Lureau                input: files(d[0]),
29363f885659SMarc-André Lureau                output: d[1],
29373f885659SMarc-André Lureau                capture: true,
29383f885659SMarc-André Lureau                build_by_default: true, # to be removed when added to a target
29393f885659SMarc-André Lureau                command: [hxtool, '-h', '@INPUT0@'])
29403f885659SMarc-André Lureauendforeach
29413f885659SMarc-André Lureaugenh += hxdep
29423f885659SMarc-André Lureau
2943a0c9162cSPaolo Bonzini###################
2944a0c9162cSPaolo Bonzini# Collect sources #
2945a0c9162cSPaolo Bonzini###################
2946a81df1b6SPaolo Bonzini
294755567891SPhilippe Mathieu-Daudéauthz_ss = ss.source_set()
29487e2b888fSPhilippe Mathieu-Daudéblockdev_ss = ss.source_set()
29497e2b888fSPhilippe Mathieu-Daudéblock_ss = ss.source_set()
2950c2306d71SPhilippe Mathieu-Daudéchardev_ss = ss.source_set()
29517e2b888fSPhilippe Mathieu-Daudécommon_ss = ss.source_set()
29522389304aSPhilippe Mathieu-Daudécrypto_ss = ss.source_set()
2953f73fb063SPhilippe Mathieu-Daudéhwcore_ss = ss.source_set()
2954f78536b1SPhilippe Mathieu-Daudéio_ss = ss.source_set()
29557e2b888fSPhilippe Mathieu-Daudéqmp_ss = ss.source_set()
2956da33fc09SPhilippe Mathieu-Daudéqom_ss = ss.source_set()
29577e2b888fSPhilippe Mathieu-Daudésoftmmu_ss = ss.source_set()
29587e2b888fSPhilippe Mathieu-Daudéspecific_fuzz_ss = ss.source_set()
29597e2b888fSPhilippe Mathieu-Daudéspecific_ss = ss.source_set()
2960a81df1b6SPaolo Bonzinistub_ss = ss.source_set()
2961a81df1b6SPaolo Bonzinitrace_ss = ss.source_set()
29622becc36aSPaolo Bonziniuser_ss = ss.source_set()
29637e2b888fSPhilippe Mathieu-Daudéutil_ss = ss.source_set()
29642becc36aSPaolo Bonzini
2965c94a7b88SGerd Hoffmann# accel modules
2966c94a7b88SGerd Hoffmannqtest_module_ss = ss.source_set()
2967dae0ec15SGerd Hoffmanntcg_module_ss = ss.source_set()
2968c94a7b88SGerd Hoffmann
29693154fee4SMarc-André Lureaumodules = {}
2970db2e89dfSGerd Hoffmanntarget_modules = {}
29712becc36aSPaolo Bonzinihw_arch = {}
29722becc36aSPaolo Bonzinitarget_arch = {}
29732becc36aSPaolo Bonzinitarget_softmmu_arch = {}
297446369b50SPhilippe Mathieu-Daudétarget_user_arch = {}
2975a81df1b6SPaolo Bonzini
2976a81df1b6SPaolo Bonzini###############
2977a81df1b6SPaolo Bonzini# Trace files #
2978a81df1b6SPaolo Bonzini###############
2979a81df1b6SPaolo Bonzini
2980c9322ab5SMarc-André Lureau# TODO: add each directory to the subdirs from its own meson.build, once
2981c9322ab5SMarc-André Lureau# we have those
2982a81df1b6SPaolo Bonzinitrace_events_subdirs = [
2983a81df1b6SPaolo Bonzini  'crypto',
298469ff4d0aSPhilippe Mathieu-Daudé  'qapi',
298569ff4d0aSPhilippe Mathieu-Daudé  'qom',
2986a81df1b6SPaolo Bonzini  'monitor',
298769ff4d0aSPhilippe Mathieu-Daudé  'util',
2988842b42dfSAlex Bennée  'gdbstub',
2989a81df1b6SPaolo Bonzini]
29906ddc1abeSWarner Loshif have_linux_user
2991a81df1b6SPaolo Bonzini  trace_events_subdirs += [ 'linux-user' ]
2992a81df1b6SPaolo Bonziniendif
29936ddc1abeSWarner Loshif have_bsd_user
29946ddc1abeSWarner Losh  trace_events_subdirs += [ 'bsd-user' ]
29956ddc1abeSWarner Loshendif
2996a81df1b6SPaolo Bonziniif have_block
2997a81df1b6SPaolo Bonzini  trace_events_subdirs += [
2998a81df1b6SPaolo Bonzini    'authz',
2999a81df1b6SPaolo Bonzini    'block',
3000a81df1b6SPaolo Bonzini    'io',
3001a81df1b6SPaolo Bonzini    'nbd',
3002a81df1b6SPaolo Bonzini    'scsi',
3003a81df1b6SPaolo Bonzini  ]
3004a81df1b6SPaolo Bonziniendif
3005a81df1b6SPaolo Bonziniif have_system
3006a81df1b6SPaolo Bonzini  trace_events_subdirs += [
30078985db26SPhilippe Mathieu-Daudé    'accel/kvm',
3008a81df1b6SPaolo Bonzini    'audio',
3009a81df1b6SPaolo Bonzini    'backends',
3010a81df1b6SPaolo Bonzini    'backends/tpm',
3011a81df1b6SPaolo Bonzini    'chardev',
301246627f41SAndrew Melnychenko    'ebpf',
3013a81df1b6SPaolo Bonzini    'hw/9pfs',
3014a81df1b6SPaolo Bonzini    'hw/acpi',
301577c05b0bSHao Wu    'hw/adc',
3016a81df1b6SPaolo Bonzini    'hw/alpha',
3017a81df1b6SPaolo Bonzini    'hw/arm',
3018a81df1b6SPaolo Bonzini    'hw/audio',
3019a81df1b6SPaolo Bonzini    'hw/block',
3020a81df1b6SPaolo Bonzini    'hw/block/dataplane',
3021a81df1b6SPaolo Bonzini    'hw/char',
3022a81df1b6SPaolo Bonzini    'hw/display',
3023a81df1b6SPaolo Bonzini    'hw/dma',
3024a81df1b6SPaolo Bonzini    'hw/hyperv',
3025a81df1b6SPaolo Bonzini    'hw/i2c',
3026a81df1b6SPaolo Bonzini    'hw/i386',
3027a81df1b6SPaolo Bonzini    'hw/i386/xen',
3028aa98ee38SDavid Woodhouse    'hw/i386/kvm',
3029a81df1b6SPaolo Bonzini    'hw/ide',
3030a81df1b6SPaolo Bonzini    'hw/input',
3031a81df1b6SPaolo Bonzini    'hw/intc',
3032a81df1b6SPaolo Bonzini    'hw/isa',
3033a81df1b6SPaolo Bonzini    'hw/mem',
3034a81df1b6SPaolo Bonzini    'hw/mips',
3035a81df1b6SPaolo Bonzini    'hw/misc',
3036a81df1b6SPaolo Bonzini    'hw/misc/macio',
3037a81df1b6SPaolo Bonzini    'hw/net',
303898e5d7a2SVikram Garhwal    'hw/net/can',
3039ce0e6a2cSMark Cave-Ayland    'hw/nubus',
304088eea45cSKlaus Jensen    'hw/nvme',
3041a81df1b6SPaolo Bonzini    'hw/nvram',
3042a81df1b6SPaolo Bonzini    'hw/pci',
3043a81df1b6SPaolo Bonzini    'hw/pci-host',
3044a81df1b6SPaolo Bonzini    'hw/ppc',
3045a81df1b6SPaolo Bonzini    'hw/rdma',
3046a81df1b6SPaolo Bonzini    'hw/rdma/vmw',
3047a81df1b6SPaolo Bonzini    'hw/rtc',
3048a81df1b6SPaolo Bonzini    'hw/s390x',
3049a81df1b6SPaolo Bonzini    'hw/scsi',
3050a81df1b6SPaolo Bonzini    'hw/sd',
3051ad52cfc1SBALATON Zoltan    'hw/sh4',
3052a81df1b6SPaolo Bonzini    'hw/sparc',
3053a81df1b6SPaolo Bonzini    'hw/sparc64',
3054a81df1b6SPaolo Bonzini    'hw/ssi',
3055a81df1b6SPaolo Bonzini    'hw/timer',
3056a81df1b6SPaolo Bonzini    'hw/tpm',
3057a81df1b6SPaolo Bonzini    'hw/usb',
3058a81df1b6SPaolo Bonzini    'hw/vfio',
3059a81df1b6SPaolo Bonzini    'hw/virtio',
3060a81df1b6SPaolo Bonzini    'hw/watchdog',
3061a81df1b6SPaolo Bonzini    'hw/xen',
3062a81df1b6SPaolo Bonzini    'hw/gpio',
3063a81df1b6SPaolo Bonzini    'migration',
3064a81df1b6SPaolo Bonzini    'net',
30658b7a5507SPhilippe Mathieu-Daudé    'softmmu',
3066a81df1b6SPaolo Bonzini    'ui',
3067ad22c308SElena Ufimtseva    'hw/remote',
3068a81df1b6SPaolo Bonzini  ]
3069a81df1b6SPaolo Bonziniendif
30708985db26SPhilippe Mathieu-Daudéif have_system or have_user
30718985db26SPhilippe Mathieu-Daudé  trace_events_subdirs += [
30728985db26SPhilippe Mathieu-Daudé    'accel/tcg',
30738985db26SPhilippe Mathieu-Daudé    'hw/core',
30748985db26SPhilippe Mathieu-Daudé    'target/arm',
3075a1477da3SAlexander Graf    'target/arm/hvf',
30768985db26SPhilippe Mathieu-Daudé    'target/hppa',
30778985db26SPhilippe Mathieu-Daudé    'target/i386',
30788985db26SPhilippe Mathieu-Daudé    'target/i386/kvm',
307934b8ff25SPhilippe Mathieu-Daudé    'target/mips/tcg',
30806f83e277SRichard Henderson    'target/nios2',
30818985db26SPhilippe Mathieu-Daudé    'target/ppc',
30828985db26SPhilippe Mathieu-Daudé    'target/riscv',
30838985db26SPhilippe Mathieu-Daudé    'target/s390x',
308467043607SCho, Yu-Chen    'target/s390x/kvm',
30858985db26SPhilippe Mathieu-Daudé    'target/sparc',
30868985db26SPhilippe Mathieu-Daudé  ]
30878985db26SPhilippe Mathieu-Daudéendif
3088a81df1b6SPaolo Bonzini
30890df750e9SMarc-André Lureauvhost_user = not_found
30902a3129a3SPaolo Bonziniif targetos == 'linux' and have_vhost_user
30910df750e9SMarc-André Lureau  libvhost_user = subproject('libvhost-user')
30920df750e9SMarc-André Lureau  vhost_user = libvhost_user.get_variable('vhost_user_dep')
30930df750e9SMarc-André Lureauendif
30940df750e9SMarc-André Lureau
3095a6caeee8SXie Yongjilibvduse = not_found
3096a6caeee8SXie Yongjiif have_libvduse
3097a6caeee8SXie Yongji  libvduse_proj = subproject('libvduse')
3098a6caeee8SXie Yongji  libvduse = libvduse_proj.get_variable('libvduse_dep')
3099a6caeee8SXie Yongjiendif
3100a6caeee8SXie Yongji
3101b83a80e8SVladimir Sementsov-Ogievskiy# NOTE: the trace/ subdirectory needs the qapi_trace_events variable
3102b83a80e8SVladimir Sementsov-Ogievskiy# that is filled in by qapi/.
3103a81df1b6SPaolo Bonzinisubdir('qapi')
3104a81df1b6SPaolo Bonzinisubdir('qobject')
3105a81df1b6SPaolo Bonzinisubdir('stubs')
3106a81df1b6SPaolo Bonzinisubdir('trace')
3107a81df1b6SPaolo Bonzinisubdir('util')
31085582c58fSMarc-André Lureausubdir('qom')
31095582c58fSMarc-André Lureausubdir('authz')
3110a81df1b6SPaolo Bonzinisubdir('crypto')
31112d78b56eSMarc-André Lureausubdir('ui')
31127d5983e3SNicolas Saenz Juliennesubdir('hw')
3113842b42dfSAlex Bennéesubdir('gdbstub')
3114a81df1b6SPaolo Bonzini
31153154fee4SMarc-André Lureauif enable_modules
31163154fee4SMarc-André Lureau  libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
31173154fee4SMarc-André Lureau  modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
31183154fee4SMarc-André Lureauendif
31193154fee4SMarc-André Lureau
31207d5983e3SNicolas Saenz Julienneqom_ss = qom_ss.apply(config_host, strict: false)
31217d5983e3SNicolas Saenz Juliennelibqom = static_library('qom', qom_ss.sources() + genh,
31227d5983e3SNicolas Saenz Julienne                        dependencies: [qom_ss.dependencies()],
31237d5983e3SNicolas Saenz Julienne                        name_suffix: 'fa')
31247d5983e3SNicolas Saenz Julienneqom = declare_dependency(link_whole: libqom)
31257d5983e3SNicolas Saenz Julienne
31267d5983e3SNicolas Saenz Julienneevent_loop_base = files('event-loop-base.c')
31277d5983e3SNicolas Saenz Julienneevent_loop_base = static_library('event-loop-base', sources: event_loop_base + genh,
31287d5983e3SNicolas Saenz Julienne                                 build_by_default: true)
31297d5983e3SNicolas Saenz Julienneevent_loop_base = declare_dependency(link_whole: event_loop_base,
31307d5983e3SNicolas Saenz Julienne                                     dependencies: [qom])
31317d5983e3SNicolas Saenz Julienne
31322becc36aSPaolo Bonzinistub_ss = stub_ss.apply(config_all, strict: false)
3133a81df1b6SPaolo Bonzini
3134a81df1b6SPaolo Bonziniutil_ss.add_all(trace_ss)
31352becc36aSPaolo Bonziniutil_ss = util_ss.apply(config_all, strict: false)
3136a81df1b6SPaolo Bonzinilibqemuutil = static_library('qemuutil',
3137a81df1b6SPaolo Bonzini                             sources: util_ss.sources() + stub_ss.sources() + genh,
31386d7c7c2dSPaolo Bonzini                             dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman])
3139a81df1b6SPaolo Bonziniqemuutil = declare_dependency(link_with: libqemuutil,
314070ac26b9SNicolas Saenz Julienne                              sources: genh + version_res,
314170ac26b9SNicolas Saenz Julienne                              dependencies: [event_loop_base])
3142a81df1b6SPaolo Bonzini
3143957b31f6SPhilippe Mathieu-Daudéif have_system or have_user
3144abff1abfSPaolo Bonzini  decodetree = generator(find_program('scripts/decodetree.py'),
3145abff1abfSPaolo Bonzini                         output: 'decode-@BASENAME@.c.inc',
3146abff1abfSPaolo Bonzini                         arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
3147957b31f6SPhilippe Mathieu-Daudé  subdir('libdecnumber')
3148957b31f6SPhilippe Mathieu-Daudé  subdir('target')
3149957b31f6SPhilippe Mathieu-Daudéendif
3150abff1abfSPaolo Bonzini
3151478e943fSPaolo Bonzinisubdir('audio')
31527fcfd456SMarc-André Lureausubdir('io')
3153848e8ff6SMarc-André Lureausubdir('chardev')
3154ec0d5893SMarc-André Lureausubdir('fsdev')
3155708eab42SMarc-André Lureausubdir('dump')
3156ec0d5893SMarc-André Lureau
3157f285bd3fSPhilippe Mathieu-Daudéif have_block
31585e5733e5SMarc-André Lureau  block_ss.add(files(
31595e5733e5SMarc-André Lureau    'block.c',
31605e5733e5SMarc-André Lureau    'blockjob.c',
31615e5733e5SMarc-André Lureau    'job.c',
31625e5733e5SMarc-André Lureau    'qemu-io-cmds.c',
31635e5733e5SMarc-André Lureau  ))
3164406523f6SPaolo Bonzini  if config_host_data.get('CONFIG_REPLICATION')
3165406523f6SPaolo Bonzini    block_ss.add(files('replication.c'))
3166406523f6SPaolo Bonzini  endif
31675e5733e5SMarc-André Lureau
31685e5733e5SMarc-André Lureau  subdir('nbd')
31695e5733e5SMarc-André Lureau  subdir('scsi')
31705e5733e5SMarc-André Lureau  subdir('block')
31715e5733e5SMarc-André Lureau
31724a96337dSPaolo Bonzini  blockdev_ss.add(files(
31734a96337dSPaolo Bonzini    'blockdev.c',
3174cbc20bfbSStefan Hajnoczi    'blockdev-nbd.c',
31754a96337dSPaolo Bonzini    'iothread.c',
31764a96337dSPaolo Bonzini    'job-qmp.c',
31773eacf70bSRoman Bolshakov  ), gnutls)
31784a96337dSPaolo Bonzini
31794a96337dSPaolo Bonzini  # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
31804a96337dSPaolo Bonzini  # os-win32.c does not
31814a96337dSPaolo Bonzini  blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
31824a96337dSPaolo Bonzini  softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
3183f285bd3fSPhilippe Mathieu-Daudéendif
31844a96337dSPaolo Bonzini
31854a96337dSPaolo Bonzinicommon_ss.add(files('cpus-common.c'))
318631ffa2aaSPhilippe Mathieu-Daudéspecific_ss.add(files('cpu.c'))
31874a96337dSPaolo Bonzini
31885d3ea0e1SPaolo Bonzinisubdir('softmmu')
3189c9322ab5SMarc-André Lureau
319044b99a6dSRichard Henderson# Work around a gcc bug/misfeature wherein constant propagation looks
319144b99a6dSRichard Henderson# through an alias:
319244b99a6dSRichard Henderson#   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
319344b99a6dSRichard Henderson# to guess that a const variable is always zero.  Without lto, this is
319444b99a6dSRichard Henderson# impossible, as the alias is restricted to page-vary-common.c.  Indeed,
319544b99a6dSRichard Henderson# without lto, not even the alias is required -- we simply use different
319644b99a6dSRichard Henderson# declarations in different compilation units.
319744b99a6dSRichard Hendersonpagevary = files('page-vary-common.c')
319844b99a6dSRichard Hendersonif get_option('b_lto')
319944b99a6dSRichard Henderson  pagevary_flags = ['-fno-lto']
320044b99a6dSRichard Henderson  if get_option('cfi')
320144b99a6dSRichard Henderson    pagevary_flags += '-fno-sanitize=cfi-icall'
320244b99a6dSRichard Henderson  endif
320354c9b194SThomas Huth  pagevary = static_library('page-vary-common', sources: pagevary + genh,
320444b99a6dSRichard Henderson                            c_args: pagevary_flags)
320544b99a6dSRichard Henderson  pagevary = declare_dependency(link_with: pagevary)
320644b99a6dSRichard Hendersonendif
320744b99a6dSRichard Hendersoncommon_ss.add(pagevary)
32086670d4d0SRichard Hendersonspecific_ss.add(files('page-vary.c'))
32096670d4d0SRichard Henderson
3210ab318051SMarc-André Lureausubdir('backends')
3211c574e161SMarc-André Lureausubdir('disas')
321255166230SMarc-André Lureausubdir('migration')
3213ff219dcaSPaolo Bonzinisubdir('monitor')
3214cdaf0722SMarc-André Lureausubdir('net')
321517ef2af6SMarc-André Lureausubdir('replay')
32168df9f0c3SPhilippe Mathieu-Daudésubdir('semihosting')
3217aa09b3d5SMarkus Armbrustersubdir('stats')
3218104cc2c0SRichard Hendersonsubdir('tcg')
3219c6347541SRichard Hendersonsubdir('fpu')
32201a82878aSMarc-André Lureausubdir('accel')
3221f556b4a1SPaolo Bonzinisubdir('plugins')
3222bbf15aafSRichard Hendersonsubdir('ebpf')
3223bbf15aafSRichard Henderson
3224bbf15aafSRichard Hendersoncommon_user_inc = []
3225bbf15aafSRichard Henderson
3226bbf15aafSRichard Hendersonsubdir('common-user')
3227b309c321SMarc-André Lureausubdir('bsd-user')
32283a30446aSMarc-André Lureausubdir('linux-user')
322946627f41SAndrew Melnychenko
3230a2ce7dbdSPaolo Bonzini# needed for fuzzing binaries
3231a2ce7dbdSPaolo Bonzinisubdir('tests/qtest/libqos')
323264ed6f92SPaolo Bonzinisubdir('tests/qtest/fuzz')
3233a2ce7dbdSPaolo Bonzini
3234c94a7b88SGerd Hoffmann# accel modules
3235dae0ec15SGerd Hoffmanntcg_real_module_ss = ss.source_set()
3236dae0ec15SGerd Hoffmanntcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss)
3237dae0ec15SGerd Hoffmannspecific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss)
3238dae0ec15SGerd Hoffmanntarget_modules += { 'accel' : { 'qtest': qtest_module_ss,
3239dae0ec15SGerd Hoffmann                                'tcg': tcg_real_module_ss }}
3240c94a7b88SGerd Hoffmann
3241a0c9162cSPaolo Bonzini########################
3242a0c9162cSPaolo Bonzini# Library dependencies #
3243a0c9162cSPaolo Bonzini########################
3244a0c9162cSPaolo Bonzini
3245f5723ab6SGerd Hoffmannmodinfo_collect = find_program('scripts/modinfo-collect.py')
32465ebbfeccSGerd Hoffmannmodinfo_generate = find_program('scripts/modinfo-generate.py')
3247f5723ab6SGerd Hoffmannmodinfo_files = []
3248f5723ab6SGerd Hoffmann
32493154fee4SMarc-André Lureaublock_mods = []
32503154fee4SMarc-André Lureausoftmmu_mods = []
32513154fee4SMarc-André Lureauforeach d, list : modules
3252ef709860SPaolo Bonzini  if not (d == 'block' ? have_block : have_system)
3253ef709860SPaolo Bonzini    continue
3254ef709860SPaolo Bonzini  endif
3255ef709860SPaolo Bonzini
32563154fee4SMarc-André Lureau  foreach m, module_ss : list
32573154fee4SMarc-André Lureau    if enable_modules and targetos != 'windows'
32583e292c51SGerd Hoffmann      module_ss = module_ss.apply(config_all, strict: false)
32593154fee4SMarc-André Lureau      sl = static_library(d + '-' + m, [genh, module_ss.sources()],
32603154fee4SMarc-André Lureau                          dependencies: [modulecommon, module_ss.dependencies()], pic: true)
32613154fee4SMarc-André Lureau      if d == 'block'
32623154fee4SMarc-André Lureau        block_mods += sl
32633154fee4SMarc-André Lureau      else
32643154fee4SMarc-André Lureau        softmmu_mods += sl
32653154fee4SMarc-André Lureau      endif
3266f5723ab6SGerd Hoffmann      if module_ss.sources() != []
3267f5723ab6SGerd Hoffmann        # FIXME: Should use sl.extract_all_objects(recursive: true) as
3268f5723ab6SGerd Hoffmann        # input. Sources can be used multiple times but objects are
3269f5723ab6SGerd Hoffmann        # unique when it comes to lookup in compile_commands.json.
3270f5723ab6SGerd Hoffmann        # Depnds on a mesion version with
3271f5723ab6SGerd Hoffmann        # https://github.com/mesonbuild/meson/pull/8900
3272f5723ab6SGerd Hoffmann        modinfo_files += custom_target(d + '-' + m + '.modinfo',
3273f5723ab6SGerd Hoffmann                                       output: d + '-' + m + '.modinfo',
3274ac347111SPaolo Bonzini                                       input: module_ss.sources() + genh,
3275f5723ab6SGerd Hoffmann                                       capture: true,
3276ac347111SPaolo Bonzini                                       command: [modinfo_collect, module_ss.sources()])
3277f5723ab6SGerd Hoffmann      endif
32783154fee4SMarc-André Lureau    else
32793154fee4SMarc-André Lureau      if d == 'block'
32803154fee4SMarc-André Lureau        block_ss.add_all(module_ss)
32813154fee4SMarc-André Lureau      else
32823154fee4SMarc-André Lureau        softmmu_ss.add_all(module_ss)
32833154fee4SMarc-André Lureau      endif
32843154fee4SMarc-André Lureau    endif
32853154fee4SMarc-André Lureau  endforeach
32863154fee4SMarc-André Lureauendforeach
32873154fee4SMarc-André Lureau
3288db2e89dfSGerd Hoffmannforeach d, list : target_modules
3289db2e89dfSGerd Hoffmann  foreach m, module_ss : list
3290db2e89dfSGerd Hoffmann    if enable_modules and targetos != 'windows'
3291db2e89dfSGerd Hoffmann      foreach target : target_dirs
3292db2e89dfSGerd Hoffmann        if target.endswith('-softmmu')
3293db2e89dfSGerd Hoffmann          config_target = config_target_mak[target]
3294db2e89dfSGerd Hoffmann          config_target += config_host
3295db2e89dfSGerd Hoffmann          target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
3296db2e89dfSGerd Hoffmann          c_args = ['-DNEED_CPU_H',
3297db2e89dfSGerd Hoffmann                    '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3298db2e89dfSGerd Hoffmann                    '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3299db2e89dfSGerd Hoffmann          target_module_ss = module_ss.apply(config_target, strict: false)
3300db2e89dfSGerd Hoffmann          if target_module_ss.sources() != []
3301db2e89dfSGerd Hoffmann            module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
3302db2e89dfSGerd Hoffmann            sl = static_library(module_name,
3303db2e89dfSGerd Hoffmann                                [genh, target_module_ss.sources()],
3304db2e89dfSGerd Hoffmann                                dependencies: [modulecommon, target_module_ss.dependencies()],
3305db2e89dfSGerd Hoffmann                                include_directories: target_inc,
3306db2e89dfSGerd Hoffmann                                c_args: c_args,
3307db2e89dfSGerd Hoffmann                                pic: true)
3308db2e89dfSGerd Hoffmann            softmmu_mods += sl
3309db2e89dfSGerd Hoffmann            # FIXME: Should use sl.extract_all_objects(recursive: true) too.
3310db2e89dfSGerd Hoffmann            modinfo_files += custom_target(module_name + '.modinfo',
3311db2e89dfSGerd Hoffmann                                           output: module_name + '.modinfo',
3312917ddc27SGerd Hoffmann                                           input: target_module_ss.sources() + genh,
3313db2e89dfSGerd Hoffmann                                           capture: true,
3314917ddc27SGerd Hoffmann                                           command: [modinfo_collect, '--target', target, target_module_ss.sources()])
3315db2e89dfSGerd Hoffmann          endif
3316db2e89dfSGerd Hoffmann        endif
3317db2e89dfSGerd Hoffmann      endforeach
3318db2e89dfSGerd Hoffmann    else
3319db2e89dfSGerd Hoffmann      specific_ss.add_all(module_ss)
3320db2e89dfSGerd Hoffmann    endif
3321db2e89dfSGerd Hoffmann  endforeach
3322db2e89dfSGerd Hoffmannendforeach
3323db2e89dfSGerd Hoffmann
33245ebbfeccSGerd Hoffmannif enable_modules
332505d6814cSJose R. Ziviani  foreach target : target_dirs
332605d6814cSJose R. Ziviani    if target.endswith('-softmmu')
332705d6814cSJose R. Ziviani      config_target = config_target_mak[target]
332805d6814cSJose R. Ziviani      config_devices_mak = target + '-config-devices.mak'
332905d6814cSJose R. Ziviani      modinfo_src = custom_target('modinfo-' + target + '.c',
333005d6814cSJose R. Ziviani                                  output: 'modinfo-' + target + '.c',
33315ebbfeccSGerd Hoffmann                                  input: modinfo_files,
333205d6814cSJose R. Ziviani                                  command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'],
33335ebbfeccSGerd Hoffmann                                  capture: true)
333405d6814cSJose R. Ziviani
333505d6814cSJose R. Ziviani      modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src)
333605d6814cSJose R. Ziviani      modinfo_dep = declare_dependency(link_with: modinfo_lib)
333705d6814cSJose R. Ziviani
333805d6814cSJose R. Ziviani      arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH']
333905d6814cSJose R. Ziviani      hw_arch[arch].add(modinfo_dep)
334005d6814cSJose R. Ziviani    endif
334105d6814cSJose R. Ziviani  endforeach
33425ebbfeccSGerd Hoffmannendif
33435ebbfeccSGerd Hoffmann
33443154fee4SMarc-André Lureaunm = find_program('nm')
3345604f3e4eSYonggang Luoundefsym = find_program('scripts/undefsym.py')
33463154fee4SMarc-André Lureaublock_syms = custom_target('block.syms', output: 'block.syms',
33473154fee4SMarc-André Lureau                             input: [libqemuutil, block_mods],
33483154fee4SMarc-André Lureau                             capture: true,
33493154fee4SMarc-André Lureau                             command: [undefsym, nm, '@INPUT@'])
33503154fee4SMarc-André Lureauqemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
33513154fee4SMarc-André Lureau                             input: [libqemuutil, softmmu_mods],
33523154fee4SMarc-André Lureau                             capture: true,
33533154fee4SMarc-André Lureau                             command: [undefsym, nm, '@INPUT@'])
33543154fee4SMarc-André Lureau
335555567891SPhilippe Mathieu-Daudéauthz_ss = authz_ss.apply(config_host, strict: false)
335655567891SPhilippe Mathieu-Daudélibauthz = static_library('authz', authz_ss.sources() + genh,
335755567891SPhilippe Mathieu-Daudé                          dependencies: [authz_ss.dependencies()],
335855567891SPhilippe Mathieu-Daudé                          name_suffix: 'fa',
335955567891SPhilippe Mathieu-Daudé                          build_by_default: false)
336055567891SPhilippe Mathieu-Daudé
336155567891SPhilippe Mathieu-Daudéauthz = declare_dependency(link_whole: libauthz,
336255567891SPhilippe Mathieu-Daudé                           dependencies: qom)
336355567891SPhilippe Mathieu-Daudé
33642389304aSPhilippe Mathieu-Daudécrypto_ss = crypto_ss.apply(config_host, strict: false)
33652389304aSPhilippe Mathieu-Daudélibcrypto = static_library('crypto', crypto_ss.sources() + genh,
33662389304aSPhilippe Mathieu-Daudé                           dependencies: [crypto_ss.dependencies()],
33672389304aSPhilippe Mathieu-Daudé                           name_suffix: 'fa',
33682389304aSPhilippe Mathieu-Daudé                           build_by_default: false)
33692389304aSPhilippe Mathieu-Daudé
33702389304aSPhilippe Mathieu-Daudécrypto = declare_dependency(link_whole: libcrypto,
33712389304aSPhilippe Mathieu-Daudé                            dependencies: [authz, qom])
33722389304aSPhilippe Mathieu-Daudé
3373f78536b1SPhilippe Mathieu-Daudéio_ss = io_ss.apply(config_host, strict: false)
3374f78536b1SPhilippe Mathieu-Daudélibio = static_library('io', io_ss.sources() + genh,
3375f78536b1SPhilippe Mathieu-Daudé                       dependencies: [io_ss.dependencies()],
3376f78536b1SPhilippe Mathieu-Daudé                       link_with: libqemuutil,
3377f78536b1SPhilippe Mathieu-Daudé                       name_suffix: 'fa',
3378f78536b1SPhilippe Mathieu-Daudé                       build_by_default: false)
3379f78536b1SPhilippe Mathieu-Daudé
3380f78536b1SPhilippe Mathieu-Daudéio = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
3381f78536b1SPhilippe Mathieu-Daudé
33827e6edef3SPhilippe Mathieu-Daudélibmigration = static_library('migration', sources: migration_files + genh,
33837e6edef3SPhilippe Mathieu-Daudé                              name_suffix: 'fa',
33847e6edef3SPhilippe Mathieu-Daudé                              build_by_default: false)
33857e6edef3SPhilippe Mathieu-Daudémigration = declare_dependency(link_with: libmigration,
33867e6edef3SPhilippe Mathieu-Daudé                               dependencies: [zlib, qom, io])
33877e6edef3SPhilippe Mathieu-Daudésoftmmu_ss.add(migration)
33887e6edef3SPhilippe Mathieu-Daudé
33895e5733e5SMarc-André Lureaublock_ss = block_ss.apply(config_host, strict: false)
33905e5733e5SMarc-André Lureaulibblock = static_library('block', block_ss.sources() + genh,
33915e5733e5SMarc-André Lureau                          dependencies: block_ss.dependencies(),
33925e5733e5SMarc-André Lureau                          link_depends: block_syms,
33935e5733e5SMarc-André Lureau                          name_suffix: 'fa',
33945e5733e5SMarc-André Lureau                          build_by_default: false)
33955e5733e5SMarc-André Lureau
33965e5733e5SMarc-André Lureaublock = declare_dependency(link_whole: [libblock],
3397b7c70bf2SMarc-André Lureau                           link_args: '@block.syms',
3398b7c70bf2SMarc-André Lureau                           dependencies: [crypto, io])
33995e5733e5SMarc-André Lureau
34004fb9071fSStefan Hajnocziblockdev_ss = blockdev_ss.apply(config_host, strict: false)
34014fb9071fSStefan Hajnoczilibblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
34024fb9071fSStefan Hajnoczi                             dependencies: blockdev_ss.dependencies(),
34034fb9071fSStefan Hajnoczi                             name_suffix: 'fa',
34044fb9071fSStefan Hajnoczi                             build_by_default: false)
34054fb9071fSStefan Hajnoczi
34064fb9071fSStefan Hajnocziblockdev = declare_dependency(link_whole: [libblockdev],
34077d5983e3SNicolas Saenz Julienne                              dependencies: [block, event_loop_base])
34084fb9071fSStefan Hajnoczi
3409ff219dcaSPaolo Bonziniqmp_ss = qmp_ss.apply(config_host, strict: false)
3410ff219dcaSPaolo Bonzinilibqmp = static_library('qmp', qmp_ss.sources() + genh,
3411ff219dcaSPaolo Bonzini                        dependencies: qmp_ss.dependencies(),
3412ff219dcaSPaolo Bonzini                        name_suffix: 'fa',
3413ff219dcaSPaolo Bonzini                        build_by_default: false)
3414ff219dcaSPaolo Bonzini
3415ff219dcaSPaolo Bonziniqmp = declare_dependency(link_whole: [libqmp])
3416ff219dcaSPaolo Bonzini
3417c2306d71SPhilippe Mathieu-Daudélibchardev = static_library('chardev', chardev_ss.sources() + genh,
3418c2306d71SPhilippe Mathieu-Daudé                            name_suffix: 'fa',
341922d1f7a8SMarc-André Lureau                            dependencies: chardev_ss.dependencies(),
3420c2306d71SPhilippe Mathieu-Daudé                            build_by_default: false)
3421c2306d71SPhilippe Mathieu-Daudé
3422c2306d71SPhilippe Mathieu-Daudéchardev = declare_dependency(link_whole: libchardev)
3423c2306d71SPhilippe Mathieu-Daudé
3424f73fb063SPhilippe Mathieu-Daudéhwcore_ss = hwcore_ss.apply(config_host, strict: false)
3425f73fb063SPhilippe Mathieu-Daudélibhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
3426e28ab096SPhilippe Mathieu-Daudé                           name_suffix: 'fa',
3427e28ab096SPhilippe Mathieu-Daudé                           build_by_default: false)
3428e28ab096SPhilippe Mathieu-Daudéhwcore = declare_dependency(link_whole: libhwcore)
3429e28ab096SPhilippe Mathieu-Daudécommon_ss.add(hwcore)
3430e28ab096SPhilippe Mathieu-Daudé
3431064f8ee7SPhilippe Mathieu-Daudé###########
3432064f8ee7SPhilippe Mathieu-Daudé# Targets #
3433064f8ee7SPhilippe Mathieu-Daudé###########
3434064f8ee7SPhilippe Mathieu-Daudé
3435fb72176bSPaolo Bonziniemulator_modules = []
34363154fee4SMarc-André Lureauforeach m : block_mods + softmmu_mods
3437fb72176bSPaolo Bonzini  emulator_modules += shared_module(m.name(),
3438fb72176bSPaolo Bonzini                build_by_default: true,
34393154fee4SMarc-André Lureau                name_prefix: '',
34403154fee4SMarc-André Lureau                link_whole: m,
34413154fee4SMarc-André Lureau                install: true,
344216bf7a33SPaolo Bonzini                install_dir: qemu_moddir)
34433154fee4SMarc-André Lureauendforeach
3444d8f3a609SPaolo Bonziniif emulator_modules.length() > 0
3445d8f3a609SPaolo Bonzini  alias_target('modules', emulator_modules)
3446d8f3a609SPaolo Bonziniendif
34473154fee4SMarc-André Lureau
34484fb9071fSStefan Hajnoczisoftmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
344964ed6f92SPaolo Bonzinicommon_ss.add(qom, qemuutil)
345064ed6f92SPaolo Bonzini
345164ed6f92SPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
34522becc36aSPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
34532becc36aSPaolo Bonzini
34542becc36aSPaolo Bonzinicommon_all = common_ss.apply(config_all, strict: false)
34552becc36aSPaolo Bonzinicommon_all = static_library('common',
34562becc36aSPaolo Bonzini                            build_by_default: false,
34572becc36aSPaolo Bonzini                            sources: common_all.sources() + genh,
34589d24fb73SPaolo Bonzini                            include_directories: common_user_inc,
345975eebe0bSKatsuhiro Ueno                            implicit_include_directories: false,
34602becc36aSPaolo Bonzini                            dependencies: common_all.dependencies(),
34612becc36aSPaolo Bonzini                            name_suffix: 'fa')
34622becc36aSPaolo Bonzini
3463c9322ab5SMarc-André Lureaufeature_to_c = find_program('scripts/feature_to_c.sh')
3464c9322ab5SMarc-André Lureau
346530cfa50dSPhilippe Mathieu-Daudéif targetos == 'darwin'
346630cfa50dSPhilippe Mathieu-Daudé  entitlement = find_program('scripts/entitlement.sh')
346730cfa50dSPhilippe Mathieu-Daudéendif
346830cfa50dSPhilippe Mathieu-Daudé
3469fd5eef85SPaolo Bonziniemulators = {}
34702becc36aSPaolo Bonziniforeach target : target_dirs
34712becc36aSPaolo Bonzini  config_target = config_target_mak[target]
34722becc36aSPaolo Bonzini  target_name = config_target['TARGET_NAME']
3473ffb91f68SPaolo Bonzini  target_base_arch = config_target['TARGET_BASE_ARCH']
3474859aef02SPaolo Bonzini  arch_srcs = [config_target_h[target]]
347564ed6f92SPaolo Bonzini  arch_deps = []
347664ed6f92SPaolo Bonzini  c_args = ['-DNEED_CPU_H',
347764ed6f92SPaolo Bonzini            '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
347864ed6f92SPaolo Bonzini            '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3479b6c7cfd4SPaolo Bonzini  link_args = emulator_link_args
34802becc36aSPaolo Bonzini
3481859aef02SPaolo Bonzini  config_target += config_host
34822becc36aSPaolo Bonzini  target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
34832becc36aSPaolo Bonzini  if targetos == 'linux'
34842becc36aSPaolo Bonzini    target_inc += include_directories('linux-headers', is_system: true)
34852becc36aSPaolo Bonzini  endif
34862becc36aSPaolo Bonzini  if target.endswith('-softmmu')
34872becc36aSPaolo Bonzini    target_type='system'
3488ffb91f68SPaolo Bonzini    t = target_softmmu_arch[target_base_arch].apply(config_target, strict: false)
3489abff1abfSPaolo Bonzini    arch_srcs += t.sources()
349064ed6f92SPaolo Bonzini    arch_deps += t.dependencies()
3491abff1abfSPaolo Bonzini
3492ffb91f68SPaolo Bonzini    hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch
34932c44220dSMarc-André Lureau    hw = hw_arch[hw_dir].apply(config_target, strict: false)
34942c44220dSMarc-André Lureau    arch_srcs += hw.sources()
349564ed6f92SPaolo Bonzini    arch_deps += hw.dependencies()
34962c44220dSMarc-André Lureau
34972becc36aSPaolo Bonzini    arch_srcs += config_devices_h[target]
349864ed6f92SPaolo Bonzini    link_args += ['@block.syms', '@qemu.syms']
34992becc36aSPaolo Bonzini  else
35003a30446aSMarc-André Lureau    abi = config_target['TARGET_ABI_DIR']
35012becc36aSPaolo Bonzini    target_type='user'
3502a3a576b0SPaolo Bonzini    target_inc += common_user_inc
3503ffb91f68SPaolo Bonzini    if target_base_arch in target_user_arch
3504ffb91f68SPaolo Bonzini      t = target_user_arch[target_base_arch].apply(config_target, strict: false)
350546369b50SPhilippe Mathieu-Daudé      arch_srcs += t.sources()
350646369b50SPhilippe Mathieu-Daudé      arch_deps += t.dependencies()
350746369b50SPhilippe Mathieu-Daudé    endif
35082becc36aSPaolo Bonzini    if 'CONFIG_LINUX_USER' in config_target
35092becc36aSPaolo Bonzini      base_dir = 'linux-user'
3510e2a74729SWarner Losh    endif
3511e2a74729SWarner Losh    if 'CONFIG_BSD_USER' in config_target
35122becc36aSPaolo Bonzini      base_dir = 'bsd-user'
3513e2a74729SWarner Losh      target_inc += include_directories('bsd-user/' / targetos)
351485fc1b5dSWarner Losh      target_inc += include_directories('bsd-user/host/' / host_arch)
3515e2a74729SWarner Losh      dir = base_dir / abi
351619bf129fSWarner Losh      arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c')
35172becc36aSPaolo Bonzini    endif
35182becc36aSPaolo Bonzini    target_inc += include_directories(
35192becc36aSPaolo Bonzini      base_dir,
35203a30446aSMarc-André Lureau      base_dir / abi,
35212becc36aSPaolo Bonzini    )
35223a30446aSMarc-André Lureau    if 'CONFIG_LINUX_USER' in config_target
35233a30446aSMarc-André Lureau      dir = base_dir / abi
35243a30446aSMarc-André Lureau      arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
35253a30446aSMarc-André Lureau      if config_target.has_key('TARGET_SYSTBL_ABI')
35263a30446aSMarc-André Lureau        arch_srcs += \
35273a30446aSMarc-André Lureau          syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
35283a30446aSMarc-André Lureau                                             extra_args : config_target['TARGET_SYSTBL_ABI'])
35293a30446aSMarc-André Lureau      endif
35303a30446aSMarc-André Lureau    endif
35312becc36aSPaolo Bonzini  endif
35322becc36aSPaolo Bonzini
3533c9322ab5SMarc-André Lureau  if 'TARGET_XML_FILES' in config_target
3534c9322ab5SMarc-André Lureau    gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
3535c9322ab5SMarc-André Lureau                                output: target + '-gdbstub-xml.c',
3536c9322ab5SMarc-André Lureau                                input: files(config_target['TARGET_XML_FILES'].split()),
3537c9322ab5SMarc-André Lureau                                command: [feature_to_c, '@INPUT@'],
3538c9322ab5SMarc-André Lureau                                capture: true)
3539c9322ab5SMarc-André Lureau    arch_srcs += gdbstub_xml
3540c9322ab5SMarc-André Lureau  endif
3541c9322ab5SMarc-André Lureau
3542ffb91f68SPaolo Bonzini  t = target_arch[target_base_arch].apply(config_target, strict: false)
3543abff1abfSPaolo Bonzini  arch_srcs += t.sources()
354464ed6f92SPaolo Bonzini  arch_deps += t.dependencies()
3545abff1abfSPaolo Bonzini
35462becc36aSPaolo Bonzini  target_common = common_ss.apply(config_target, strict: false)
35472becc36aSPaolo Bonzini  objects = common_all.extract_objects(target_common.sources())
354864ed6f92SPaolo Bonzini  deps = target_common.dependencies()
35492becc36aSPaolo Bonzini
35502becc36aSPaolo Bonzini  target_specific = specific_ss.apply(config_target, strict: false)
35512becc36aSPaolo Bonzini  arch_srcs += target_specific.sources()
355264ed6f92SPaolo Bonzini  arch_deps += target_specific.dependencies()
35532becc36aSPaolo Bonzini
355464ed6f92SPaolo Bonzini  lib = static_library('qemu-' + target,
3555859aef02SPaolo Bonzini                 sources: arch_srcs + genh,
3556b7612f45SPaolo Bonzini                 dependencies: arch_deps,
35572becc36aSPaolo Bonzini                 objects: objects,
35582becc36aSPaolo Bonzini                 include_directories: target_inc,
355964ed6f92SPaolo Bonzini                 c_args: c_args,
356064ed6f92SPaolo Bonzini                 build_by_default: false,
35612becc36aSPaolo Bonzini                 name_suffix: 'fa')
356264ed6f92SPaolo Bonzini
356364ed6f92SPaolo Bonzini  if target.endswith('-softmmu')
356464ed6f92SPaolo Bonzini    execs = [{
356564ed6f92SPaolo Bonzini      'name': 'qemu-system-' + target_name,
3566654d6b04SPaolo Bonzini      'win_subsystem': 'console',
356764ed6f92SPaolo Bonzini      'sources': files('softmmu/main.c'),
356864ed6f92SPaolo Bonzini      'dependencies': []
356964ed6f92SPaolo Bonzini    }]
357035be72baSPaolo Bonzini    if targetos == 'windows' and (sdl.found() or gtk.found())
357164ed6f92SPaolo Bonzini      execs += [{
357264ed6f92SPaolo Bonzini        'name': 'qemu-system-' + target_name + 'w',
3573654d6b04SPaolo Bonzini        'win_subsystem': 'windows',
357464ed6f92SPaolo Bonzini        'sources': files('softmmu/main.c'),
357564ed6f92SPaolo Bonzini        'dependencies': []
357664ed6f92SPaolo Bonzini      }]
357764ed6f92SPaolo Bonzini    endif
3578537b7248SPaolo Bonzini    if get_option('fuzzing')
357964ed6f92SPaolo Bonzini      specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
358064ed6f92SPaolo Bonzini      execs += [{
358164ed6f92SPaolo Bonzini        'name': 'qemu-fuzz-' + target_name,
3582654d6b04SPaolo Bonzini        'win_subsystem': 'console',
358364ed6f92SPaolo Bonzini        'sources': specific_fuzz.sources(),
358464ed6f92SPaolo Bonzini        'dependencies': specific_fuzz.dependencies(),
358564ed6f92SPaolo Bonzini      }]
358664ed6f92SPaolo Bonzini    endif
358764ed6f92SPaolo Bonzini  else
358864ed6f92SPaolo Bonzini    execs = [{
358964ed6f92SPaolo Bonzini      'name': 'qemu-' + target_name,
3590654d6b04SPaolo Bonzini      'win_subsystem': 'console',
359164ed6f92SPaolo Bonzini      'sources': [],
359264ed6f92SPaolo Bonzini      'dependencies': []
359364ed6f92SPaolo Bonzini    }]
359464ed6f92SPaolo Bonzini  endif
359564ed6f92SPaolo Bonzini  foreach exe: execs
35968a74ce61SAlexander Graf    exe_name = exe['name']
35973983a767SJohn Arbuckle    if targetos == 'darwin'
35988a74ce61SAlexander Graf      exe_name += '-unsigned'
35998a74ce61SAlexander Graf    endif
36008a74ce61SAlexander Graf
36018a74ce61SAlexander Graf    emulator = executable(exe_name, exe['sources'],
3602237377acSAkihiko Odaki               install: true,
360364ed6f92SPaolo Bonzini               c_args: c_args,
360464ed6f92SPaolo Bonzini               dependencies: arch_deps + deps + exe['dependencies'],
360564ed6f92SPaolo Bonzini               objects: lib.extract_all_objects(recursive: true),
360664ed6f92SPaolo Bonzini               link_language: link_language,
360764ed6f92SPaolo Bonzini               link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
360864ed6f92SPaolo Bonzini               link_args: link_args,
3609654d6b04SPaolo Bonzini               win_subsystem: exe['win_subsystem'])
36108a74ce61SAlexander Graf
36113983a767SJohn Arbuckle    if targetos == 'darwin'
3612411ad8ddSAkihiko Odaki      icon = 'pc-bios/qemu.rsrc'
3613411ad8ddSAkihiko Odaki      build_input = [emulator, files(icon)]
3614411ad8ddSAkihiko Odaki      install_input = [
3615411ad8ddSAkihiko Odaki        get_option('bindir') / exe_name,
3616411ad8ddSAkihiko Odaki        meson.current_source_dir() / icon
3617411ad8ddSAkihiko Odaki      ]
3618411ad8ddSAkihiko Odaki      if 'CONFIG_HVF' in config_target
3619411ad8ddSAkihiko Odaki        entitlements = 'accel/hvf/entitlements.plist'
3620411ad8ddSAkihiko Odaki        build_input += files(entitlements)
3621411ad8ddSAkihiko Odaki        install_input += meson.current_source_dir() / entitlements
3622411ad8ddSAkihiko Odaki      endif
3623411ad8ddSAkihiko Odaki
36248a74ce61SAlexander Graf      emulators += {exe['name'] : custom_target(exe['name'],
3625411ad8ddSAkihiko Odaki                   input: build_input,
36268a74ce61SAlexander Graf                   output: exe['name'],
3627235b523dSPhilippe Mathieu-Daudé                   command: [entitlement, '@OUTPUT@', '@INPUT@'])
3628fd5eef85SPaolo Bonzini      }
3629237377acSAkihiko Odaki
3630235b523dSPhilippe Mathieu-Daudé      meson.add_install_script(entitlement, '--install',
3631237377acSAkihiko Odaki                               get_option('bindir') / exe['name'],
3632411ad8ddSAkihiko Odaki                               install_input)
36338a74ce61SAlexander Graf    else
36348a74ce61SAlexander Graf      emulators += {exe['name']: emulator}
36358a74ce61SAlexander Graf    endif
363610e1d263SMarc-André Lureau
36379c29b741SPaolo Bonzini    if stap.found()
363810e1d263SMarc-André Lureau      foreach stp: [
3639bd5f973aSStefan Hajnoczi        {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
3640bd5f973aSStefan Hajnoczi        {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
364110e1d263SMarc-André Lureau        {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
364210e1d263SMarc-André Lureau        {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
364310e1d263SMarc-André Lureau      ]
3644bd5f973aSStefan Hajnoczi        custom_target(exe['name'] + stp['ext'],
364510e1d263SMarc-André Lureau                      input: trace_events_all,
3646bd5f973aSStefan Hajnoczi                      output: exe['name'] + stp['ext'],
364710e1d263SMarc-André Lureau                      install: stp['install'],
364816bf7a33SPaolo Bonzini                      install_dir: get_option('datadir') / 'systemtap/tapset',
364910e1d263SMarc-André Lureau                      command: [
365010e1d263SMarc-André Lureau                        tracetool, '--group=all', '--format=' + stp['fmt'],
365110e1d263SMarc-André Lureau                        '--binary=' + stp['bin'],
365210e1d263SMarc-André Lureau                        '--target-name=' + target_name,
365310e1d263SMarc-André Lureau                        '--target-type=' + target_type,
365410e1d263SMarc-André Lureau                        '--probe-prefix=qemu.' + target_type + '.' + target_name,
3655c05012a3SStefan Hajnoczi                        '@INPUT@', '@OUTPUT@'
36560572d6cdSStefan Hajnoczi                      ],
36570572d6cdSStefan Hajnoczi                      depend_files: tracetool_depends)
365810e1d263SMarc-André Lureau      endforeach
365910e1d263SMarc-André Lureau    endif
366064ed6f92SPaolo Bonzini  endforeach
36612becc36aSPaolo Bonziniendforeach
36622becc36aSPaolo Bonzini
3663931049b4SPaolo Bonzini# Other build targets
3664897b5afaSMarc-André Lureau
3665f556b4a1SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host
3666f556b4a1SPaolo Bonzini  install_headers('include/qemu/qemu-plugin.h')
3667f556b4a1SPaolo Bonziniendif
3668f556b4a1SPaolo Bonzini
3669f15bff25SPaolo Bonzinisubdir('qga')
3670f15bff25SPaolo Bonzini
36719755c94aSLaurent Vivier# Don't build qemu-keymap if xkbcommon is not explicitly enabled
36729755c94aSLaurent Vivier# when we don't build tools or system
36734113f4cfSLaurent Vivierif xkbcommon.found()
367428742467SMarc-André Lureau  # used for the update-keymaps target, so include rules even if !have_tools
367528742467SMarc-André Lureau  qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
367628742467SMarc-André Lureau                           dependencies: [qemuutil, xkbcommon], install: have_tools)
367728742467SMarc-André Lureauendif
367828742467SMarc-André Lureau
3679931049b4SPaolo Bonziniif have_tools
3680b7c70bf2SMarc-André Lureau  qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
3681b7c70bf2SMarc-André Lureau             dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
3682b7c70bf2SMarc-André Lureau  qemu_io = executable('qemu-io', files('qemu-io.c'),
3683b7c70bf2SMarc-André Lureau             dependencies: [block, qemuutil], install: true)
3684b7c70bf2SMarc-André Lureau  qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
36853d212b41SRichard W.M. Jones               dependencies: [blockdev, qemuutil, gnutls, selinux],
36863d212b41SRichard W.M. Jones               install: true)
3687b7c70bf2SMarc-André Lureau
36887c58bb76SPaolo Bonzini  subdir('storage-daemon')
3689a9c9727cSPaolo Bonzini  subdir('contrib/rdmacm-mux')
36901d7bb6abSMarc-André Lureau  subdir('contrib/elf2dmp')
3691a9c9727cSPaolo Bonzini
3692157e7b13SMarc-André Lureau  executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
3693157e7b13SMarc-André Lureau             dependencies: qemuutil,
3694157e7b13SMarc-André Lureau             install: true)
3695157e7b13SMarc-André Lureau
36962a3129a3SPaolo Bonzini  if have_vhost_user
36972d7ac0afSPaolo Bonzini    subdir('contrib/vhost-user-blk')
3698ea458960SMarc-André Lureau    subdir('contrib/vhost-user-gpu')
369932fcc624SMarc-André Lureau    subdir('contrib/vhost-user-input')
370099650b62SPaolo Bonzini    subdir('contrib/vhost-user-scsi')
3701931049b4SPaolo Bonzini  endif
37028f51e01cSMarc-André Lureau
37038f51e01cSMarc-André Lureau  if targetos == 'linux'
37048f51e01cSMarc-André Lureau    executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
37058f51e01cSMarc-André Lureau               dependencies: [qemuutil, libcap_ng],
37068f51e01cSMarc-André Lureau               install: true,
37078f51e01cSMarc-André Lureau               install_dir: get_option('libexecdir'))
3708897b5afaSMarc-André Lureau
3709897b5afaSMarc-André Lureau    executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
3710897b5afaSMarc-André Lureau               dependencies: [authz, crypto, io, qom, qemuutil,
37116ec0e15dSPaolo Bonzini                              libcap_ng, mpathpersist],
3712897b5afaSMarc-André Lureau               install: true)
37138f51e01cSMarc-André Lureau  endif
37148f51e01cSMarc-André Lureau
3715ccd250aaSPaolo Bonzini  if have_ivshmem
37165ee24e78SMarc-André Lureau    subdir('contrib/ivshmem-client')
37175ee24e78SMarc-André Lureau    subdir('contrib/ivshmem-server')
37185ee24e78SMarc-André Lureau  endif
3719931049b4SPaolo Bonziniendif
3720931049b4SPaolo Bonzini
3721f5aa6320SMarc-André Lureausubdir('scripts')
37223f99cf57SPaolo Bonzinisubdir('tools')
3723bdcbea7aSMarc-André Lureausubdir('pc-bios')
3724f8aa24eaSPaolo Bonzinisubdir('docs')
3725e3667660SYonggang Luosubdir('tests')
37261b695471SPaolo Bonziniif gtk.found()
3727e8f3bd71SMarc-André Lureau  subdir('po')
3728e8f3bd71SMarc-André Lureauendif
37293f99cf57SPaolo Bonzini
37308adfeba9SMarc-André Lureauif host_machine.system() == 'windows'
37318adfeba9SMarc-André Lureau  nsis_cmd = [
37328adfeba9SMarc-André Lureau    find_program('scripts/nsis.py'),
37338adfeba9SMarc-André Lureau    '@OUTPUT@',
37348adfeba9SMarc-André Lureau    get_option('prefix'),
37358adfeba9SMarc-André Lureau    meson.current_source_dir(),
3736*fc9a809eSPaolo Bonzini    glib_pc.get_variable('bindir'),
373724bdcc96SStefan Weil    host_machine.cpu(),
37388adfeba9SMarc-André Lureau    '--',
37398adfeba9SMarc-André Lureau    '-DDISPLAYVERSION=' + meson.project_version(),
37408adfeba9SMarc-André Lureau  ]
37418adfeba9SMarc-André Lureau  if build_docs
37428adfeba9SMarc-André Lureau    nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
37438adfeba9SMarc-André Lureau  endif
37441b695471SPaolo Bonzini  if gtk.found()
37458adfeba9SMarc-André Lureau    nsis_cmd += '-DCONFIG_GTK=y'
37468adfeba9SMarc-André Lureau  endif
37478adfeba9SMarc-André Lureau
37488adfeba9SMarc-André Lureau  nsis = custom_target('nsis',
37498adfeba9SMarc-André Lureau                       output: 'qemu-setup-' + meson.project_version() + '.exe',
37508adfeba9SMarc-André Lureau                       input: files('qemu.nsi'),
37518adfeba9SMarc-André Lureau                       build_always_stale: true,
37528adfeba9SMarc-André Lureau                       command: nsis_cmd + ['@INPUT@'])
37538adfeba9SMarc-André Lureau  alias_target('installer', nsis)
37548adfeba9SMarc-André Lureauendif
37558adfeba9SMarc-André Lureau
3756a0c9162cSPaolo Bonzini#########################
3757a0c9162cSPaolo Bonzini# Configuration summary #
3758a0c9162cSPaolo Bonzini#########################
3759a0c9162cSPaolo Bonzini
3760983d0a75SPhilippe Mathieu-Daudé# Directories
3761f9332757SPaolo Bonzinisummary_info = {}
376216bf7a33SPaolo Bonzinisummary_info += {'Install prefix':    get_option('prefix')}
376316bf7a33SPaolo Bonzinisummary_info += {'BIOS directory':    qemu_datadir}
37648154f5e6SAkihiko Odakipathsep = targetos == 'windows' ? ';' : ':'
37658154f5e6SAkihiko Odakisummary_info += {'firmware path':     pathsep.join(get_option('qemu_firmwarepath'))}
3766f7fb6c6aSPaolo Bonzinisummary_info += {'binary directory':  get_option('prefix') / get_option('bindir')}
3767f7fb6c6aSPaolo Bonzinisummary_info += {'library directory': get_option('prefix') / get_option('libdir')}
376816bf7a33SPaolo Bonzinisummary_info += {'module directory':  qemu_moddir}
3769f7fb6c6aSPaolo Bonzinisummary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')}
3770f7fb6c6aSPaolo Bonzinisummary_info += {'include directory': get_option('prefix') / get_option('includedir')}
3771f7fb6c6aSPaolo Bonzinisummary_info += {'config directory':  get_option('prefix') / get_option('sysconfdir')}
3772f9332757SPaolo Bonziniif targetos != 'windows'
3773f7fb6c6aSPaolo Bonzini  summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')}
3774f7fb6c6aSPaolo Bonzini  summary_info += {'Manual directory':      get_option('prefix') / get_option('mandir')}
3775f9332757SPaolo Bonzinielse
3776f9332757SPaolo Bonzini  summary_info += {'local state directory': 'queried at runtime'}
3777f9332757SPaolo Bonziniendif
3778f7fb6c6aSPaolo Bonzinisummary_info += {'Doc directory':     get_option('prefix') / get_option('docdir')}
3779f9332757SPaolo Bonzinisummary_info += {'Build directory':   meson.current_build_dir()}
3780f9332757SPaolo Bonzinisummary_info += {'Source path':       meson.current_source_dir()}
3781f9332757SPaolo Bonzinisummary_info += {'GIT submodules':    config_host['GIT_SUBMODULES']}
3782983d0a75SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Directories')
3783983d0a75SPhilippe Mathieu-Daudé
3784e11a0e17SPhilippe Mathieu-Daudé# Host binaries
3785983d0a75SPhilippe Mathieu-Daudésummary_info = {}
3786e11a0e17SPhilippe Mathieu-Daudésummary_info += {'git':               config_host['GIT']}
3787e11a0e17SPhilippe Mathieu-Daudésummary_info += {'make':              config_host['MAKE']}
3788e11a0e17SPhilippe Mathieu-Daudésummary_info += {'python':            '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
3789bb647c49SPaolo Bonzinisummary_info += {'sphinx-build':      sphinx_build}
3790e11a0e17SPhilippe Mathieu-Daudéif config_host.has_key('HAVE_GDB_BIN')
3791e11a0e17SPhilippe Mathieu-Daudé  summary_info += {'gdb':             config_host['HAVE_GDB_BIN']}
3792e11a0e17SPhilippe Mathieu-Daudéendif
379340c909f5SPaolo Bonzinisummary_info += {'iasl':              iasl}
3794e11a0e17SPhilippe Mathieu-Daudésummary_info += {'genisoimage':       config_host['GENISOIMAGE']}
379520cf5cb4SPaolo Bonziniif targetos == 'windows' and have_ga
3796bb647c49SPaolo Bonzini  summary_info += {'wixl':            wixl}
3797e11a0e17SPhilippe Mathieu-Daudéendif
37985890258aSThomas Huthif slirp.found() and have_system
379935acbb30SPaolo Bonzini  summary_info += {'smbd':            have_slirp_smbd ? smbd_path : false}
3800e11a0e17SPhilippe Mathieu-Daudéendif
3801e11a0e17SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Host binaries')
3802e11a0e17SPhilippe Mathieu-Daudé
38031d718865SPhilippe Mathieu-Daudé# Configurable features
38041d718865SPhilippe Mathieu-Daudésummary_info = {}
38051d718865SPhilippe Mathieu-Daudésummary_info += {'Documentation':     build_docs}
3806aa3ca634SPhilippe Mathieu-Daudésummary_info += {'system-mode emulation': have_system}
3807aa3ca634SPhilippe Mathieu-Daudésummary_info += {'user-mode emulation': have_user}
3808813803aaSPhilippe Mathieu-Daudésummary_info += {'block layer':       have_block}
38091d718865SPhilippe Mathieu-Daudésummary_info += {'Install blobs':     get_option('install_blobs')}
38101d718865SPhilippe Mathieu-Daudésummary_info += {'module support':    config_host.has_key('CONFIG_MODULES')}
38111d718865SPhilippe Mathieu-Daudéif config_host.has_key('CONFIG_MODULES')
38122cb2f580SPaolo Bonzini  summary_info += {'alternative module path': get_option('module_upgrades')}
38131d718865SPhilippe Mathieu-Daudéendif
3814537b7248SPaolo Bonzinisummary_info += {'fuzzing support':   get_option('fuzzing')}
38151d718865SPhilippe Mathieu-Daudéif have_system
381687430d5bSPaolo Bonzini  summary_info += {'Audio drivers':     ' '.join(audio_drivers_selected)}
38171d718865SPhilippe Mathieu-Daudéendif
38189c29b741SPaolo Bonzinisummary_info += {'Trace backends':    ','.join(get_option('trace_backends'))}
38199c29b741SPaolo Bonziniif 'simple' in get_option('trace_backends')
38209c29b741SPaolo Bonzini  summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
38211d718865SPhilippe Mathieu-Daudéendif
3822142ca628SMarc-André Lureausummary_info += {'D-Bus display':     dbus_display}
3823c55cf6abSPaolo Bonzinisummary_info += {'QOM debugging':     get_option('qom_cast_debug')}
38242a3129a3SPaolo Bonzinisummary_info += {'vhost-kernel support': have_vhost_kernel}
38252a3129a3SPaolo Bonzinisummary_info += {'vhost-net support': have_vhost_net}
38262a3129a3SPaolo Bonzinisummary_info += {'vhost-user support': have_vhost_user}
38272a3129a3SPaolo Bonzinisummary_info += {'vhost-user-crypto support': have_vhost_user_crypto}
38281d718865SPhilippe Mathieu-Daudésummary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
38292a3129a3SPaolo Bonzinisummary_info += {'vhost-vdpa support': have_vhost_vdpa}
383020cf5cb4SPaolo Bonzinisummary_info += {'build guest agent': have_ga}
38311d718865SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Configurable features')
38321d718865SPhilippe Mathieu-Daudé
38332e864b8bSPhilippe Mathieu-Daudé# Compilation information
3834e11a0e17SPhilippe Mathieu-Daudésummary_info = {}
38352e864b8bSPhilippe Mathieu-Daudésummary_info += {'host CPU':          cpu}
38362e864b8bSPhilippe Mathieu-Daudésummary_info += {'host endianness':   build_machine.endian()}
383763de9353SAlex Bennéesummary_info += {'C compiler':        ' '.join(meson.get_compiler('c').cmd_array())}
383863de9353SAlex Bennéesummary_info += {'Host C compiler':   ' '.join(meson.get_compiler('c', native: true).cmd_array())}
3839f9332757SPaolo Bonziniif link_language == 'cpp'
384063de9353SAlex Bennée  summary_info += {'C++ compiler':    ' '.join(meson.get_compiler('cpp').cmd_array())}
3841f9332757SPaolo Bonzinielse
3842f9332757SPaolo Bonzini  summary_info += {'C++ compiler':      false}
3843f9332757SPaolo Bonziniendif
3844f9332757SPaolo Bonziniif targetos == 'darwin'
384563de9353SAlex Bennée  summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
3846f9332757SPaolo Bonziniendif
38476a97f393SPaolo Bonzinioption_cflags = (get_option('debug') ? ['-g'] : [])
38486a97f393SPaolo Bonziniif get_option('optimization') != 'plain'
38496a97f393SPaolo Bonzini  option_cflags += ['-O' + get_option('optimization')]
38506a97f393SPaolo Bonziniendif
38516a97f393SPaolo Bonzinisummary_info += {'CFLAGS':            ' '.join(get_option('c_args') + option_cflags)}
385247b30835SPaolo Bonziniif link_language == 'cpp'
38536a97f393SPaolo Bonzini  summary_info += {'CXXFLAGS':        ' '.join(get_option('cpp_args') + option_cflags)}
385447b30835SPaolo Bonziniendif
3855e910c7d9SPhilippe Mathieu-Daudéif targetos == 'darwin'
38566a97f393SPaolo Bonzini  summary_info += {'OBJCFLAGS':       ' '.join(get_option('objc_args') + option_cflags)}
3857e910c7d9SPhilippe Mathieu-Daudéendif
385847b30835SPaolo Bonzinilink_args = get_option(link_language + '_link_args')
385947b30835SPaolo Bonziniif link_args.length() > 0
386047b30835SPaolo Bonzini  summary_info += {'LDFLAGS':         ' '.join(link_args)}
386147b30835SPaolo Bonziniendif
3862d065177eSPaolo Bonzinisummary_info += {'QEMU_CFLAGS':       ' '.join(qemu_cflags)}
3863e5134024SPaolo Bonziniif 'cpp' in all_languages
3864d065177eSPaolo Bonzini  summary_info += {'QEMU_CXXFLAGS':     ' '.join(qemu_cxxflags)}
3865e5134024SPaolo Bonziniendif
3866e5134024SPaolo Bonziniif 'objc' in all_languages
3867d065177eSPaolo Bonzini  summary_info += {'QEMU_OBJCFLAGS':    ' '.join(qemu_objcflags)}
3868e5134024SPaolo Bonziniendif
3869d065177eSPaolo Bonzinisummary_info += {'QEMU_LDFLAGS':      ' '.join(qemu_ldflags)}
3870c55cf6abSPaolo Bonzinisummary_info += {'profiler':          get_option('profiler')}
3871cdad781dSDaniele Buonosummary_info += {'link-time optimization (LTO)': get_option('b_lto')}
38722e864b8bSPhilippe Mathieu-Daudésummary_info += {'PIE':               get_option('b_pie')}
38733e8529ddSLaurent Viviersummary_info += {'static build':      config_host.has_key('CONFIG_STATIC')}
38742e864b8bSPhilippe Mathieu-Daudésummary_info += {'malloc trim support': has_malloc_trim}
3875b87df904SPaolo Bonzinisummary_info += {'membarrier':        have_membarrier}
387658a2e3f5SStefan Hajnoczisummary_info += {'debug graph lock':  get_option('debug_graph_lock')}
3877728c0a2fSPaolo Bonzinisummary_info += {'debug stack usage': get_option('debug_stack_usage')}
3878c55cf6abSPaolo Bonzinisummary_info += {'mutex debugging':   get_option('debug_mutex')}
38792e864b8bSPhilippe Mathieu-Daudésummary_info += {'memory allocator':  get_option('malloc')}
3880622753d2SPaolo Bonzinisummary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
388104ffce13Sling xusummary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')}
3882622753d2SPaolo Bonzinisummary_info += {'avx512f optimization': config_host_data.get('CONFIG_AVX512F_OPT')}
3883bb9ecae7SAlex Bennéeif get_option('gprof')
3884bb9ecae7SAlex Bennée  gprof_info = 'YES (deprecated)'
3885bb9ecae7SAlex Bennéeelse
3886bb9ecae7SAlex Bennée  gprof_info = get_option('gprof')
3887bb9ecae7SAlex Bennéeendif
3888bb9ecae7SAlex Bennéesummary_info += {'gprof':             gprof_info}
38892e864b8bSPhilippe Mathieu-Daudésummary_info += {'gcov':              get_option('b_coverage')}
38902e864b8bSPhilippe Mathieu-Daudésummary_info += {'thread sanitizer':  config_host.has_key('CONFIG_TSAN')}
38912e864b8bSPhilippe Mathieu-Daudésummary_info += {'CFI support':       get_option('cfi')}
38922e864b8bSPhilippe Mathieu-Daudéif get_option('cfi')
38932e864b8bSPhilippe Mathieu-Daudé  summary_info += {'CFI debug support': get_option('cfi_debug')}
38942e864b8bSPhilippe Mathieu-Daudéendif
38952e864b8bSPhilippe Mathieu-Daudésummary_info += {'strip binaries':    get_option('strip')}
3896bb647c49SPaolo Bonzinisummary_info += {'sparse':            sparse}
38972e864b8bSPhilippe Mathieu-Daudésummary_info += {'mingw32 support':   targetos == 'windows'}
389812640f05SPaolo Bonzinisummary(summary_info, bool_yn: true, section: 'Compilation')
389949e8565bSAlex Bennée
390049e8565bSAlex Bennée# snarf the cross-compilation information for tests
390112640f05SPaolo Bonzinisummary_info = {}
390212640f05SPaolo Bonzinihave_cross = false
390349e8565bSAlex Bennéeforeach target: target_dirs
3904c7022a70SPaolo Bonzini  tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak'
390549e8565bSAlex Bennée  if fs.exists(tcg_mak)
390649e8565bSAlex Bennée    config_cross_tcg = keyval.load(tcg_mak)
390785b141eaSAlex Bennée    if 'CC' in config_cross_tcg
390812640f05SPaolo Bonzini      summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']}
390912640f05SPaolo Bonzini      have_cross = true
391049e8565bSAlex Bennée    endif
391149e8565bSAlex Bennée  endif
391249e8565bSAlex Bennéeendforeach
391312640f05SPaolo Bonziniif have_cross
391412640f05SPaolo Bonzini  summary(summary_info, bool_yn: true, section: 'Cross compilers')
391512640f05SPaolo Bonziniendif
39162e864b8bSPhilippe Mathieu-Daudé
3917aa3ca634SPhilippe Mathieu-Daudé# Targets and accelerators
39182e864b8bSPhilippe Mathieu-Daudésummary_info = {}
3919aa3ca634SPhilippe Mathieu-Daudéif have_system
3920aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'KVM support':       config_all.has_key('CONFIG_KVM')}
3921aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'HAX support':       config_all.has_key('CONFIG_HAX')}
3922aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'HVF support':       config_all.has_key('CONFIG_HVF')}
3923aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'WHPX support':      config_all.has_key('CONFIG_WHPX')}
392474a414a1SReinoud Zandijk  summary_info += {'NVMM support':      config_all.has_key('CONFIG_NVMM')}
392514efd8d3SPaolo Bonzini  summary_info += {'Xen support':       xen.found()}
392614efd8d3SPaolo Bonzini  if xen.found()
392714efd8d3SPaolo Bonzini    summary_info += {'xen ctrl version':  xen.version()}
3928aa3ca634SPhilippe Mathieu-Daudé  endif
3929820c1abaSDavid Woodhouse  summary_info += {'Xen emulation':     config_all.has_key('CONFIG_XEN_EMU')}
3930aa3ca634SPhilippe Mathieu-Daudéendif
3931aa3ca634SPhilippe Mathieu-Daudésummary_info += {'TCG support':       config_all.has_key('CONFIG_TCG')}
3932aa3ca634SPhilippe Mathieu-Daudéif config_all.has_key('CONFIG_TCG')
393339687acaSPhilippe Mathieu-Daudé  if get_option('tcg_interpreter')
3934f1f727acSPhilippe Mathieu-Daudé    summary_info += {'TCG backend':   'TCI (TCG with bytecode interpreter, slow)'}
393539687acaSPhilippe Mathieu-Daudé  else
393639687acaSPhilippe Mathieu-Daudé    summary_info += {'TCG backend':   'native (@0@)'.format(cpu)}
393739687acaSPhilippe Mathieu-Daudé  endif
3938029aa68fSAlex Bennée  summary_info += {'TCG plugins': config_host.has_key('CONFIG_PLUGIN')}
3939aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
3940aa3ca634SPhilippe Mathieu-Daudéendif
39412e864b8bSPhilippe Mathieu-Daudésummary_info += {'target list':       ' '.join(target_dirs)}
3942aa3ca634SPhilippe Mathieu-Daudéif have_system
3943aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'default devices':   get_option('default_devices')}
3944106ad1f9SPaolo Bonzini  summary_info += {'out of process emulation': multiprocess_allowed}
394555116968SJagannathan Raman  summary_info += {'vfio-user server': vfio_user_server_allowed}
3946aa3ca634SPhilippe Mathieu-Daudéendif
3947aa3ca634SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Targets and accelerators')
3948aa3ca634SPhilippe Mathieu-Daudé
3949813803aaSPhilippe Mathieu-Daudé# Block layer
3950813803aaSPhilippe Mathieu-Daudésummary_info = {}
3951813803aaSPhilippe Mathieu-Daudésummary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
3952728c0a2fSPaolo Bonzinisummary_info += {'coroutine pool':    have_coroutine_pool}
3953813803aaSPhilippe Mathieu-Daudéif have_block
3954622d64ffSPaolo Bonzini  summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')}
3955622d64ffSPaolo Bonzini  summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')}
3956c55cf6abSPaolo Bonzini  summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')}
39573887702eSChristian Schoenebeck  summary_info += {'VirtFS (9P) support':    have_virtfs}
39583887702eSChristian Schoenebeck  summary_info += {'VirtFS (9P) Proxy Helper support': have_virtfs_proxy_helper}
3959406523f6SPaolo Bonzini  summary_info += {'Live block migration': config_host_data.get('CONFIG_LIVE_BLOCK_MIGRATION')}
3960406523f6SPaolo Bonzini  summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')}
3961ed793c2cSPaolo Bonzini  summary_info += {'bochs support':     get_option('bochs').allowed()}
3962ed793c2cSPaolo Bonzini  summary_info += {'cloop support':     get_option('cloop').allowed()}
3963ed793c2cSPaolo Bonzini  summary_info += {'dmg support':       get_option('dmg').allowed()}
3964ed793c2cSPaolo Bonzini  summary_info += {'qcow v1 support':   get_option('qcow1').allowed()}
3965ed793c2cSPaolo Bonzini  summary_info += {'vdi support':       get_option('vdi').allowed()}
396611cea42eSVladimir Sementsov-Ogievskiy  summary_info += {'vhdx support':      get_option('vhdx').allowed()}
396711cea42eSVladimir Sementsov-Ogievskiy  summary_info += {'vmdk support':      get_option('vmdk').allowed()}
396811cea42eSVladimir Sementsov-Ogievskiy  summary_info += {'vpc support':       get_option('vpc').allowed()}
3969ed793c2cSPaolo Bonzini  summary_info += {'vvfat support':     get_option('vvfat').allowed()}
3970ed793c2cSPaolo Bonzini  summary_info += {'qed support':       get_option('qed').allowed()}
3971ed793c2cSPaolo Bonzini  summary_info += {'parallels support': get_option('parallels').allowed()}
3972bb647c49SPaolo Bonzini  summary_info += {'FUSE exports':      fuse}
39732a2359b8SXie Yongji  summary_info += {'VDUSE block exports': have_vduse_blk_export}
3974813803aaSPhilippe Mathieu-Daudéendif
3975813803aaSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Block layer support')
3976813803aaSPhilippe Mathieu-Daudé
3977aa58028aSPhilippe Mathieu-Daudé# Crypto
3978aa3ca634SPhilippe Mathieu-Daudésummary_info = {}
397941f2ae28SPaolo Bonzinisummary_info += {'TLS priority':      get_option('tls_priority')}
3980bb647c49SPaolo Bonzinisummary_info += {'GNUTLS support':    gnutls}
3981bb647c49SPaolo Bonziniif gnutls.found()
3982cc4c7c73SDaniel P. Berrangé  summary_info += {'  GNUTLS crypto':   gnutls_crypto.found()}
3983bb647c49SPaolo Bonziniendif
3984bb647c49SPaolo Bonzinisummary_info += {'libgcrypt':         gcrypt}
3985bb647c49SPaolo Bonzinisummary_info += {'nettle':            nettle}
398657612511SPaolo Bonziniif nettle.found()
398757612511SPaolo Bonzini   summary_info += {'  XTS':             xts != 'private'}
3988f9332757SPaolo Bonziniendif
398934b52615SPaolo Bonzinisummary_info += {'AF_ALG support':    have_afalg}
3990c55cf6abSPaolo Bonzinisummary_info += {'rng-none':          get_option('rng_none')}
39912edd2c04SPaolo Bonzinisummary_info += {'Linux keyring':     have_keyring}
3992aa58028aSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Crypto')
3993aa58028aSPhilippe Mathieu-Daudé
399469a78cceSPhilippe Mathieu-Daudé# Libraries
3995aa58028aSPhilippe Mathieu-Daudésummary_info = {}
3996aa58028aSPhilippe Mathieu-Daudéif targetos == 'darwin'
3997bb647c49SPaolo Bonzini  summary_info += {'Cocoa support':           cocoa}
3998e2c1d78dSVladislav Yaroshchuk  summary_info += {'vmnet.framework support': vmnet}
3999aa58028aSPhilippe Mathieu-Daudéendif
4000bb647c49SPaolo Bonzinisummary_info += {'SDL support':       sdl}
4001bb647c49SPaolo Bonzinisummary_info += {'SDL image support': sdl_image}
4002bb647c49SPaolo Bonzinisummary_info += {'GTK support':       gtk}
4003bb647c49SPaolo Bonzinisummary_info += {'pixman':            pixman}
4004bb647c49SPaolo Bonzinisummary_info += {'VTE support':       vte}
40055890258aSThomas Huthsummary_info += {'slirp support':     slirp}
4006bb647c49SPaolo Bonzinisummary_info += {'libtasn1':          tasn1}
4007bb647c49SPaolo Bonzinisummary_info += {'PAM':               pam}
4008bb647c49SPaolo Bonzinisummary_info += {'iconv support':     iconv}
4009bb647c49SPaolo Bonzinisummary_info += {'curses support':    curses}
4010bb647c49SPaolo Bonzinisummary_info += {'virgl support':     virgl}
4011fd66dbd4SStefan Hajnoczisummary_info += {'blkio support':     blkio}
4012bb647c49SPaolo Bonzinisummary_info += {'curl support':      curl}
4013bb647c49SPaolo Bonzinisummary_info += {'Multipath support': mpathpersist}
401495f8510eSKshitij Surisummary_info += {'PNG support':       png}
4015bb647c49SPaolo Bonzinisummary_info += {'VNC support':       vnc}
4016a0b93237SPaolo Bonziniif vnc.found()
4017bb647c49SPaolo Bonzini  summary_info += {'VNC SASL support':  sasl}
4018bb647c49SPaolo Bonzini  summary_info += {'VNC JPEG support':  jpeg}
4019f9332757SPaolo Bonziniendif
402087430d5bSPaolo Bonziniif targetos not in ['darwin', 'haiku', 'windows']
402187430d5bSPaolo Bonzini  summary_info += {'OSS support':     oss}
4022663df1ccSAlexandre Ratchov  summary_info += {'sndio support':   sndio}
402387430d5bSPaolo Bonzinielif targetos == 'darwin'
402487430d5bSPaolo Bonzini  summary_info += {'CoreAudio support': coreaudio}
402587430d5bSPaolo Bonzinielif targetos == 'windows'
402687430d5bSPaolo Bonzini  summary_info += {'DirectSound support': dsound}
402787430d5bSPaolo Bonziniendif
402887430d5bSPaolo Bonziniif targetos == 'linux'
402987430d5bSPaolo Bonzini  summary_info += {'ALSA support':    alsa}
403087430d5bSPaolo Bonzini  summary_info += {'PulseAudio support': pulse}
403187430d5bSPaolo Bonziniendif
4032c2d3d1c2SDorinda Basseysummary_info += {'Pipewire support':   pipewire}
403387430d5bSPaolo Bonzinisummary_info += {'JACK support':      jack}
4034bb647c49SPaolo Bonzinisummary_info += {'brlapi support':    brlapi}
4035e1723999SPaolo Bonzinisummary_info += {'vde support':       vde}
4036837b84b1SPaolo Bonzinisummary_info += {'netmap support':    have_netmap}
4037eea9453aSThomas Huthsummary_info += {'l2tpv3 support':    have_l2tpv3}
4038ff66f3e5SPaolo Bonzinisummary_info += {'Linux AIO support': libaio}
4039bb647c49SPaolo Bonzinisummary_info += {'Linux io_uring support': linux_io_uring}
4040bb647c49SPaolo Bonzinisummary_info += {'ATTR/XATTR support': libattr}
40413730a734SPaolo Bonzinisummary_info += {'RDMA support':      rdma}
40423730a734SPaolo Bonzinisummary_info += {'PVRDMA support':    have_pvrdma}
4043fbb4121dSPaolo Bonzinisummary_info += {'fdt support':       fdt_opt == 'disabled' ? false : fdt_opt}
4044bb647c49SPaolo Bonzinisummary_info += {'libcap-ng support': libcap_ng}
4045bb647c49SPaolo Bonzinisummary_info += {'bpf support':       libbpf}
40463f0a5d55SMarc-André Lureausummary_info += {'spice protocol support': spice_protocol}
40473f0a5d55SMarc-André Lureauif spice_protocol.found()
40483f0a5d55SMarc-André Lureau  summary_info += {'  spice server support': spice}
40493f0a5d55SMarc-André Lureauendif
4050bb647c49SPaolo Bonzinisummary_info += {'rbd support':       rbd}
4051bb647c49SPaolo Bonzinisummary_info += {'smartcard support': cacard}
4052bb647c49SPaolo Bonzinisummary_info += {'U2F support':       u2f}
4053bb647c49SPaolo Bonzinisummary_info += {'libusb':            libusb}
4054bb647c49SPaolo Bonzinisummary_info += {'usb net redir':     usbredir}
405588b6e618SPaolo Bonzinisummary_info += {'OpenGL support (epoxy)': opengl}
4056bb647c49SPaolo Bonzinisummary_info += {'GBM':               gbm}
4057bb647c49SPaolo Bonzinisummary_info += {'libiscsi support':  libiscsi}
4058bb647c49SPaolo Bonzinisummary_info += {'libnfs support':    libnfs}
4059f9332757SPaolo Bonziniif targetos == 'windows'
406020cf5cb4SPaolo Bonzini  if have_ga
40618821a389SMarc-André Lureau    summary_info += {'QGA VSS support':   have_qga_vss}
4062b846ab7cSPaolo Bonzini  endif
4063f9332757SPaolo Bonziniendif
4064bb647c49SPaolo Bonzinisummary_info += {'seccomp support':   seccomp}
4065bb647c49SPaolo Bonzinisummary_info += {'GlusterFS support': glusterfs}
40660d04c4c9SPaolo Bonzinisummary_info += {'TPM support':       have_tpm}
4067e6a52b36SThomas Huthsummary_info += {'libssh support':    libssh}
4068bb647c49SPaolo Bonzinisummary_info += {'lzo support':       lzo}
4069bb647c49SPaolo Bonzinisummary_info += {'snappy support':    snappy}
4070bb647c49SPaolo Bonzinisummary_info += {'bzip2 support':     libbzip2}
4071bb647c49SPaolo Bonzinisummary_info += {'lzfse support':     liblzfse}
4072bb647c49SPaolo Bonzinisummary_info += {'zstd support':      zstd}
4073488a8c73SPaolo Bonzinisummary_info += {'NUMA host support': numa}
407483602083SThomas Huthsummary_info += {'capstone':          capstone}
4075bb647c49SPaolo Bonzinisummary_info += {'libpmem support':   libpmem}
4076bb647c49SPaolo Bonzinisummary_info += {'libdaxctl support': libdaxctl}
4077bb647c49SPaolo Bonzinisummary_info += {'libudev':           libudev}
4078bb647c49SPaolo Bonzini# Dummy dependency, keep .found()
4079df4ea709SMax Reitzsummary_info += {'FUSE lseek':        fuse_lseek.found()}
40803d212b41SRichard W.M. Jonessummary_info += {'selinux':           selinux}
40817c10cb38SIlya Leoshkevichsummary_info += {'libdw':             libdw}
408269a78cceSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Dependencies')
4083f9332757SPaolo Bonzini
4084f9332757SPaolo Bonziniif not supported_cpus.contains(cpu)
4085f9332757SPaolo Bonzini  message()
4086f9332757SPaolo Bonzini  warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
4087f9332757SPaolo Bonzini  message()
4088f9332757SPaolo Bonzini  message('CPU host architecture ' + cpu + ' support is not currently maintained.')
4089f9332757SPaolo Bonzini  message('The QEMU project intends to remove support for this host CPU in')
4090f9332757SPaolo Bonzini  message('a future release if nobody volunteers to maintain it and to')
4091f9332757SPaolo Bonzini  message('provide a build host for our continuous integration setup.')
4092f9332757SPaolo Bonzini  message('configure has succeeded and you can continue to build, but')
4093f9332757SPaolo Bonzini  message('if you care about QEMU on this platform you should contact')
4094f9332757SPaolo Bonzini  message('us upstream at qemu-devel@nongnu.org.')
4095f9332757SPaolo Bonziniendif
4096f9332757SPaolo Bonzini
4097f9332757SPaolo Bonziniif not supported_oses.contains(targetos)
4098f9332757SPaolo Bonzini  message()
4099f9332757SPaolo Bonzini  warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
4100f9332757SPaolo Bonzini  message()
4101f9332757SPaolo Bonzini  message('Host OS ' + targetos + 'support is not currently maintained.')
4102f9332757SPaolo Bonzini  message('The QEMU project intends to remove support for this host OS in')
4103f9332757SPaolo Bonzini  message('a future release if nobody volunteers to maintain it and to')
4104f9332757SPaolo Bonzini  message('provide a build host for our continuous integration setup.')
4105f9332757SPaolo Bonzini  message('configure has succeeded and you can continue to build, but')
4106f9332757SPaolo Bonzini  message('if you care about QEMU on this platform you should contact')
4107f9332757SPaolo Bonzini  message('us upstream at qemu-devel@nongnu.org.')
4108f9332757SPaolo Bonziniendif
4109