xref: /qemu/meson.build (revision 6002711c)
13b087f79SPaolo Bonziniproject('qemu', ['c'], meson_version: '>=0.63.0',
2654d6b04SPaolo Bonzini        default_options: ['warning_level=1', 'c_std=gnu11', 'cpp_std=gnu++11', 'b_colorout=auto',
30a31e3a0SPaolo Bonzini                          'b_staticpic=false', 'stdsplit=false', 'optimization=2', 'b_pie=true'],
4654d6b04SPaolo Bonzini        version: files('VERSION'))
5a5665051SPaolo Bonzini
6e287072bSThomas Huthadd_test_setup('quick', exclude_suites: ['slow', 'thorough'], is_default: true)
7e287072bSThomas Huthadd_test_setup('slow', exclude_suites: ['thorough'], env: ['G_TEST_SLOW=1', 'SPEED=slow'])
8e287072bSThomas Huthadd_test_setup('thorough', env: ['G_TEST_SLOW=1', 'SPEED=thorough'])
93d2f73efSPaolo Bonzini
10cf60ccc3SAkihiko Odakimeson.add_postconf_script(find_program('scripts/symlink-install-tree.py'))
11cf60ccc3SAkihiko Odaki
12a5665051SPaolo Bonzininot_found = dependency('', required: false)
13b29b40f4SPaolo Bonzinikeyval = import('keyval')
14a81df1b6SPaolo Bonziniss = import('sourceset')
158b18cdbfSRichard Hendersonfs = import('fs')
16a81df1b6SPaolo Bonzini
17e5134024SPaolo Bonzinitargetos = host_machine.system()
18ce1c1e7aSPaolo Bonzinish = find_program('sh')
19a5665051SPaolo Bonziniconfig_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
20d7dedf42SPaolo Bonzini
21e5134024SPaolo Bonzinicc = meson.get_compiler('c')
22e5134024SPaolo Bonziniall_languages = ['c']
23e5134024SPaolo Bonziniif add_languages('cpp', required: false, native: false)
24e5134024SPaolo Bonzini  all_languages += ['cpp']
25e5134024SPaolo Bonzini  cxx = meson.get_compiler('cpp')
26e5134024SPaolo Bonziniendif
27e5134024SPaolo Bonziniif targetos == 'darwin' and \
28e5134024SPaolo Bonzini   add_languages('objc', required: get_option('cocoa'), native: false)
29e5134024SPaolo Bonzini  all_languages += ['objc']
30e5134024SPaolo Bonzini  objc = meson.get_compiler('objc')
31e5134024SPaolo Bonziniendif
32e5134024SPaolo Bonzini
33e3667660SYonggang Luo# Temporary directory used for files created while
34e3667660SYonggang Luo# configure runs. Since it is in the build directory
35e3667660SYonggang Luo# we can safely blow away any previous version of it
36e3667660SYonggang Luo# (and we need not jump through hoops to try to delete
37e3667660SYonggang Luo# it when configure exits.)
38e3667660SYonggang Luotmpdir = meson.current_build_dir() / 'meson-private/temp'
398fe11232SMarc-André Lureau
408fe11232SMarc-André Lureauif get_option('qemu_suffix').startswith('/')
418fe11232SMarc-André Lureau  error('qemu_suffix cannot start with a /')
428fe11232SMarc-André Lureauendif
438fe11232SMarc-André Lureau
4416bf7a33SPaolo Bonziniqemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
45ab4c0996SMarc-André Lureauqemu_datadir = get_option('datadir') / get_option('qemu_suffix')
46491e74c1SMarc-André Lureauqemu_docdir = get_option('docdir') / get_option('qemu_suffix')
4716bf7a33SPaolo Bonziniqemu_moddir = get_option('libdir') / get_option('qemu_suffix')
4816bf7a33SPaolo Bonzini
4916bf7a33SPaolo Bonziniqemu_desktopdir = get_option('datadir') / 'applications'
5016bf7a33SPaolo Bonziniqemu_icondir = get_option('datadir') / 'icons'
5116bf7a33SPaolo Bonzini
52859aef02SPaolo Bonziniconfig_host_data = configuration_data()
53859aef02SPaolo Bonzinigenh = []
54b83a80e8SVladimir Sementsov-Ogievskiyqapi_trace_events = []
55a5665051SPaolo Bonzini
5620cf5cb4SPaolo Bonzinibsd_oses = ['gnu/kfreebsd', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'darwin']
57201e8ed7SPaolo Bonzinisupported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
58ba0e7333SRichard Hendersonsupported_cpus = ['ppc', 'ppc64', 's390x', 'riscv', 'x86', 'x86_64',
596d0b52edSRichard Henderson  'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc64']
60201e8ed7SPaolo Bonzini
61201e8ed7SPaolo Bonzinicpu = host_machine.cpu_family()
62c94c2394SRichard Henderson
63c94c2394SRichard Henderson# Unify riscv* to a single family.
64c94c2394SRichard Hendersonif cpu in ['riscv32', 'riscv64']
65c94c2394SRichard Henderson  cpu = 'riscv'
66c94c2394SRichard Hendersonendif
67c94c2394SRichard Henderson
6820cf5cb4SPaolo Bonzinitarget_dirs = config_host['TARGET_DIRS'].split()
6920cf5cb4SPaolo Bonzinihave_linux_user = false
7020cf5cb4SPaolo Bonzinihave_bsd_user = false
7120cf5cb4SPaolo Bonzinihave_system = false
7220cf5cb4SPaolo Bonziniforeach target : target_dirs
7320cf5cb4SPaolo Bonzini  have_linux_user = have_linux_user or target.endswith('linux-user')
7420cf5cb4SPaolo Bonzini  have_bsd_user = have_bsd_user or target.endswith('bsd-user')
7520cf5cb4SPaolo Bonzini  have_system = have_system or target.endswith('-softmmu')
7620cf5cb4SPaolo Bonziniendforeach
7720cf5cb4SPaolo Bonzinihave_user = have_linux_user or have_bsd_user
7820cf5cb4SPaolo Bonzinihave_tools = get_option('tools') \
7920cf5cb4SPaolo Bonzini  .disable_auto_if(not have_system) \
8020cf5cb4SPaolo Bonzini  .allowed()
8120cf5cb4SPaolo Bonzinihave_ga = get_option('guest_agent') \
8220cf5cb4SPaolo Bonzini  .disable_auto_if(not have_system and not have_tools) \
8328236ad8SBrad Smith  .require(targetos in ['sunos', 'linux', 'windows', 'freebsd', 'netbsd', 'openbsd'],
8420cf5cb4SPaolo Bonzini           error_message: 'unsupported OS for QEMU guest agent') \
8520cf5cb4SPaolo Bonzini  .allowed()
86*6002711cSPaolo Bonzinienable_modules = get_option('modules') \
87*6002711cSPaolo Bonzini  .require(targetos != 'windows',
88*6002711cSPaolo Bonzini           error_message: 'Modules are not available for Windows') \
89*6002711cSPaolo Bonzini  .require(not get_option('prefer_static'),
90*6002711cSPaolo Bonzini           error_message: 'Modules are incompatible with static linking') \
91*6002711cSPaolo Bonzini  .allowed()
9220cf5cb4SPaolo Bonzinihave_block = have_system or have_tools
9320cf5cb4SPaolo Bonzini
9420cf5cb4SPaolo Bonzinipython = import('python').find_installation()
9520cf5cb4SPaolo Bonzini
96823eb013SPaolo Bonziniif cpu not in supported_cpus
97823eb013SPaolo Bonzini  host_arch = 'unknown'
98823eb013SPaolo Bonzinielif cpu == 'x86'
99823eb013SPaolo Bonzini  host_arch = 'i386'
1000e3ed77dSRichard Hendersonelif cpu == 'mips64'
1010e3ed77dSRichard Henderson  host_arch = 'mips'
102823eb013SPaolo Bonzinielse
103823eb013SPaolo Bonzini  host_arch = cpu
104823eb013SPaolo Bonziniendif
105823eb013SPaolo Bonzini
1068a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64']
1078a19980eSPaolo Bonzini  kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
1088a19980eSPaolo Bonzinielif cpu == 'aarch64'
1098a19980eSPaolo Bonzini  kvm_targets = ['aarch64-softmmu']
1108a19980eSPaolo Bonzinielif cpu == 's390x'
1118a19980eSPaolo Bonzini  kvm_targets = ['s390x-softmmu']
1128a19980eSPaolo Bonzinielif cpu in ['ppc', 'ppc64']
1138a19980eSPaolo Bonzini  kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
114fbc5884cSHuacai Chenelif cpu in ['mips', 'mips64']
115fbc5884cSHuacai Chen  kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
116fbf43c7dSYifei Jiangelif cpu in ['riscv']
117fbf43c7dSYifei Jiang  kvm_targets = ['riscv32-softmmu', 'riscv64-softmmu']
1188a19980eSPaolo Bonzinielse
1198a19980eSPaolo Bonzini  kvm_targets = []
1208a19980eSPaolo Bonziniendif
1218a19980eSPaolo Bonzini
12244d3d898SIgor Mammedovkvm_targets_c = '""'
12343a363aeSPaolo Bonziniif get_option('kvm').allowed() and targetos == 'linux'
124e741aff0SIgor Mammedov  kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
125e741aff0SIgor Mammedovendif
126e741aff0SIgor Mammedovconfig_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
127e741aff0SIgor Mammedov
1288a19980eSPaolo Bonziniaccelerator_targets = { 'CONFIG_KVM': kvm_targets }
129844a06bbSAlexander Graf
130844a06bbSAlexander Grafif cpu in ['aarch64']
131844a06bbSAlexander Graf  accelerator_targets += {
132844a06bbSAlexander Graf    'CONFIG_HVF': ['aarch64-softmmu']
133844a06bbSAlexander Graf  }
134844a06bbSAlexander Grafendif
135844a06bbSAlexander Graf
1360c3e41d4SAlex Bennéeif cpu in ['x86', 'x86_64', 'arm', 'aarch64']
1372a2d51bcSMarc-André Lureau  # i386 emulator provides xenpv machine type for multiple architectures
1380c3e41d4SAlex Bennée  accelerator_targets += {
1390c3e41d4SAlex Bennée    'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
1400c3e41d4SAlex Bennée  }
1410c3e41d4SAlex Bennéeendif
1428a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64']
1438a19980eSPaolo Bonzini  accelerator_targets += {
1448a19980eSPaolo Bonzini    'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
1458a19980eSPaolo Bonzini    'CONFIG_HVF': ['x86_64-softmmu'],
14674a414a1SReinoud Zandijk    'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
1478a19980eSPaolo Bonzini    'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
1488a19980eSPaolo Bonzini  }
1498a19980eSPaolo Bonziniendif
1508a19980eSPaolo Bonzini
151a1b176f9SPaolo Bonzinimodular_tcg = []
152a1b176f9SPaolo Bonzini# Darwin does not support references to thread-local variables in modules
153a1b176f9SPaolo Bonziniif targetos != 'darwin'
154dae0ec15SGerd Hoffmann  modular_tcg = ['i386-softmmu', 'x86_64-softmmu']
155a1b176f9SPaolo Bonziniendif
156dae0ec15SGerd Hoffmann
157eae9a1d1SPhilippe Mathieu-Daudéedk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ]
158e49c0ef6SPaolo Bonziniunpack_edk2_blobs = false
159e49c0ef6SPaolo Bonziniforeach target : edk2_targets
160e49c0ef6SPaolo Bonzini  if target in target_dirs
161e49c0ef6SPaolo Bonzini    bzip2 = find_program('bzip2', required: get_option('install_blobs'))
162e49c0ef6SPaolo Bonzini    unpack_edk2_blobs = bzip2.found()
163e49c0ef6SPaolo Bonzini    break
164eae9a1d1SPhilippe Mathieu-Daudé  endif
165e49c0ef6SPaolo Bonziniendforeach
16645b545ddSPhilippe Mathieu-Daudé
1679c29b741SPaolo Bonzinidtrace = not_found
1689c29b741SPaolo Bonzinistap = not_found
1699c29b741SPaolo Bonziniif 'dtrace' in get_option('trace_backends')
1709c29b741SPaolo Bonzini  dtrace = find_program('dtrace', required: true)
1719c29b741SPaolo Bonzini  stap = find_program('stap', required: false)
1729c29b741SPaolo Bonzini  if stap.found()
1739c29b741SPaolo Bonzini    # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
1749c29b741SPaolo Bonzini    # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
1759c29b741SPaolo Bonzini    # instead. QEMU --enable-modules depends on this because the SystemTap
1769c29b741SPaolo Bonzini    # semaphores are linked into the main binary and not the module's shared
1779c29b741SPaolo Bonzini    # object.
1789c29b741SPaolo Bonzini    add_global_arguments('-DSTAP_SDT_V2',
179e5134024SPaolo Bonzini                         native: false, language: all_languages)
1809c29b741SPaolo Bonzini  endif
1819c29b741SPaolo Bonziniendif
1829c29b741SPaolo Bonzini
18340c909f5SPaolo Bonziniif get_option('iasl') == ''
18440c909f5SPaolo Bonzini  iasl = find_program('iasl', required: false)
18540c909f5SPaolo Bonzinielse
18640c909f5SPaolo Bonzini  iasl = find_program(get_option('iasl'), required: true)
18740c909f5SPaolo Bonziniendif
18840c909f5SPaolo Bonzini
189201e8ed7SPaolo Bonzini##################
190201e8ed7SPaolo Bonzini# Compiler flags #
191201e8ed7SPaolo Bonzini##################
192201e8ed7SPaolo Bonzini
1938cc2d231SPaolo Bonziniqemu_cflags = config_host['QEMU_CFLAGS'].split()
1944cb37d11SPhilippe Mathieu-Daudéqemu_objcflags = config_host['QEMU_OBJCFLAGS'].split()
1958cc2d231SPaolo Bonziniqemu_ldflags = config_host['QEMU_LDFLAGS'].split()
1968cc2d231SPaolo Bonzini
197a0cbd2e8SPaolo Bonziniif get_option('prefer_static')
198e4333d14SPaolo Bonzini  qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
199e4333d14SPaolo Bonziniendif
200e4333d14SPaolo Bonzini
201e4333d14SPaolo Bonzini# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
202e4333d14SPaolo Bonzini# The combination is known as "full relro", because .got.plt is read-only too.
203e4333d14SPaolo Bonziniqemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now')
204e4333d14SPaolo Bonzini
205d2147e04SPaolo Bonziniif targetos == 'windows'
206d2147e04SPaolo Bonzini  qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat')
2072d73fa74SPaolo Bonzini  qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va')
208d2147e04SPaolo Bonziniendif
209d2147e04SPaolo Bonzini
210c55cf6abSPaolo Bonziniif get_option('gprof')
211c55cf6abSPaolo Bonzini  qemu_cflags += ['-p']
2124cb37d11SPhilippe Mathieu-Daudé  qemu_objcflags += ['-p']
213c55cf6abSPaolo Bonzini  qemu_ldflags += ['-p']
214c55cf6abSPaolo Bonziniendif
215c55cf6abSPaolo Bonzini
216ff9ed62bSAlexander Bulekov# Specify linker-script with add_project_link_arguments so that it is not placed
217ff9ed62bSAlexander Bulekov# within a linker --start-group/--end-group pair
218537b7248SPaolo Bonziniif get_option('fuzzing')
219537b7248SPaolo Bonzini  # Specify a filter to only instrument code that is directly related to
220537b7248SPaolo Bonzini  # virtual-devices.
221537b7248SPaolo Bonzini  configure_file(output: 'instrumentation-filter',
222537b7248SPaolo Bonzini                 input: 'scripts/oss-fuzz/instrumentation-filter-template',
223537b7248SPaolo Bonzini                 copy: true)
224aa4f3a3bSAlexander Bulekov
225aa4f3a3bSAlexander Bulekov  if cc.compiles('int main () { return 0; }',
226aa4f3a3bSAlexander Bulekov                  name: '-fsanitize-coverage-allowlist=/dev/null',
227e56d0970SAlexander Bulekov                 args: ['-fsanitize-coverage-allowlist=/dev/null',
228e56d0970SAlexander Bulekov                        '-fsanitize-coverage=trace-pc'] )
229aa4f3a3bSAlexander Bulekov    add_global_arguments('-fsanitize-coverage-allowlist=instrumentation-filter',
230e5134024SPaolo Bonzini                         native: false, language: all_languages)
231aa4f3a3bSAlexander Bulekov  endif
232537b7248SPaolo Bonzini
233537b7248SPaolo Bonzini  if get_option('fuzzing_engine') == ''
234537b7248SPaolo Bonzini    # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
235537b7248SPaolo Bonzini    # compiled code.  To build non-fuzzer binaries with --enable-fuzzing, link
236537b7248SPaolo Bonzini    # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
237537b7248SPaolo Bonzini    # unable to bind the fuzzer-related callbacks added by instrumentation.
238537b7248SPaolo Bonzini    add_global_arguments('-fsanitize=fuzzer-no-link',
239e5134024SPaolo Bonzini                         native: false, language: all_languages)
240537b7248SPaolo Bonzini    add_global_link_arguments('-fsanitize=fuzzer-no-link',
241e5134024SPaolo Bonzini                              native: false, language: all_languages)
242537b7248SPaolo Bonzini    # For the actual fuzzer binaries, we need to link against the libfuzzer
243537b7248SPaolo Bonzini    # library. They need to be configurable, to support OSS-Fuzz
244537b7248SPaolo Bonzini    fuzz_exe_ldflags = ['-fsanitize=fuzzer']
245537b7248SPaolo Bonzini  else
246537b7248SPaolo Bonzini    # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and
247537b7248SPaolo Bonzini    # the needed CFLAGS have already been provided
248537b7248SPaolo Bonzini    fuzz_exe_ldflags = get_option('fuzzing_engine').split()
249537b7248SPaolo Bonzini  endif
250ff9ed62bSAlexander Bulekovendif
251ff9ed62bSAlexander Bulekov
252b485458eSPaolo Bonzini# Check that the C++ compiler exists and works with the C compiler.
253b485458eSPaolo Bonzinilink_language = 'c'
254b485458eSPaolo Bonzinilinker = cc
255b485458eSPaolo Bonziniqemu_cxxflags = []
256e5134024SPaolo Bonziniif 'cpp' in all_languages
257b485458eSPaolo Bonzini  add_global_arguments(['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'],
258b485458eSPaolo Bonzini                       native: false, language: 'cpp')
259b485458eSPaolo Bonzini  foreach k: qemu_cflags
260b485458eSPaolo Bonzini    if k not in ['-Wstrict-prototypes', '-Wmissing-prototypes', '-Wnested-externs',
261b485458eSPaolo Bonzini                 '-Wold-style-declaration', '-Wold-style-definition', '-Wredundant-decls']
262b485458eSPaolo Bonzini      qemu_cxxflags += [k]
263b485458eSPaolo Bonzini    endif
264b485458eSPaolo Bonzini  endforeach
265b485458eSPaolo Bonzini
266b485458eSPaolo Bonzini  if cxx.links(files('scripts/main.c'), args: qemu_cflags)
267b485458eSPaolo Bonzini    link_language = 'cpp'
268b485458eSPaolo Bonzini    linker = cxx
269b485458eSPaolo Bonzini  else
270b485458eSPaolo Bonzini    message('C++ compiler does not work with C compiler')
271b485458eSPaolo Bonzini    message('Disabling C++-specific optional code')
272b485458eSPaolo Bonzini  endif
273b485458eSPaolo Bonziniendif
274b485458eSPaolo Bonzini
275e4333d14SPaolo Bonzini# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
276e4333d14SPaolo Bonziniif targetos != 'sunos' and not config_host.has_key('CONFIG_TSAN')
277e4333d14SPaolo Bonzini  qemu_ldflags += linker.get_supported_link_arguments('-Wl,--warn-common')
278e4333d14SPaolo Bonziniendif
279e4333d14SPaolo Bonzini
280e5134024SPaolo Bonziniadd_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
281a5665051SPaolo Bonzini
282e5134024SPaolo Bonziniadd_global_arguments(qemu_cflags, native: false, language: 'c')
283e5134024SPaolo Bonziniadd_global_arguments(qemu_cxxflags, native: false, language: 'cpp')
284e5134024SPaolo Bonziniadd_global_arguments(qemu_objcflags, native: false, language: 'objc')
2851e6e616dSPaolo Bonziniif targetos == 'linux'
2861e6e616dSPaolo Bonzini  add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
2871e6e616dSPaolo Bonzini                        '-isystem', 'linux-headers',
288e5134024SPaolo Bonzini                        language: all_languages)
2891e6e616dSPaolo Bonziniendif
2901e6e616dSPaolo Bonzini
29123a77b2dSPaolo Bonziniadd_project_arguments('-iquote', '.',
2921e6e616dSPaolo Bonzini                      '-iquote', meson.current_source_dir(),
2931e6e616dSPaolo Bonzini                      '-iquote', meson.current_source_dir() / 'include',
294e5134024SPaolo Bonzini                      language: all_languages)
295a5665051SPaolo Bonzini
296deb62371SPaolo Bonzinisparse = find_program('cgcc', required: get_option('sparse'))
297deb62371SPaolo Bonziniif sparse.found()
298968b4db3SPaolo Bonzini  run_target('sparse',
299968b4db3SPaolo Bonzini             command: [find_program('scripts/check_sparse.py'),
300deb62371SPaolo Bonzini                       'compile_commands.json', sparse.full_path(), '-Wbitwise',
301deb62371SPaolo Bonzini                       '-Wno-transparent-union', '-Wno-old-initializer',
302deb62371SPaolo Bonzini                       '-Wno-non-pointer-null'])
303968b4db3SPaolo Bonziniendif
304968b4db3SPaolo Bonzini
3056ec0e15dSPaolo Bonzini###########################################
3066ec0e15dSPaolo Bonzini# Target-specific checks and dependencies #
3076ec0e15dSPaolo Bonzini###########################################
3086ec0e15dSPaolo Bonzini
309b7a75c8cSPaolo Bonzini# Fuzzing
310537b7248SPaolo Bonziniif get_option('fuzzing') and get_option('fuzzing_engine') == '' and \
311537b7248SPaolo Bonzini    not cc.links('''
312537b7248SPaolo Bonzini          #include <stdint.h>
313537b7248SPaolo Bonzini          #include <sys/types.h>
314537b7248SPaolo Bonzini          int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
315537b7248SPaolo Bonzini          int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
316537b7248SPaolo Bonzini        ''',
317537b7248SPaolo Bonzini        args: ['-Werror', '-fsanitize=fuzzer'])
318537b7248SPaolo Bonzini  error('Your compiler does not support -fsanitize=fuzzer')
319537b7248SPaolo Bonziniendif
320537b7248SPaolo Bonzini
321b7a75c8cSPaolo Bonzini# Tracing backends
3229c29b741SPaolo Bonziniif 'ftrace' in get_option('trace_backends') and targetos != 'linux'
3239c29b741SPaolo Bonzini  error('ftrace is supported only on Linux')
3249c29b741SPaolo Bonziniendif
3259c29b741SPaolo Bonziniif 'syslog' in get_option('trace_backends') and not cc.compiles('''
3269c29b741SPaolo Bonzini    #include <syslog.h>
3279c29b741SPaolo Bonzini    int main(void) {
3289c29b741SPaolo Bonzini        openlog("qemu", LOG_PID, LOG_DAEMON);
3299c29b741SPaolo Bonzini        syslog(LOG_INFO, "configure");
3309c29b741SPaolo Bonzini        return 0;
3319c29b741SPaolo Bonzini    }''')
3329c29b741SPaolo Bonzini  error('syslog is not supported on this system')
3339c29b741SPaolo Bonziniendif
3349c29b741SPaolo Bonzini
335b7a75c8cSPaolo Bonzini# Miscellaneous Linux-only features
336a436d6d4SPaolo Bonziniget_option('mpath') \
337a436d6d4SPaolo Bonzini  .require(targetos == 'linux', error_message: 'Multipath is supported only on Linux')
3386ec0e15dSPaolo Bonzini
339a436d6d4SPaolo Bonzinimultiprocess_allowed = get_option('multiprocess') \
340a436d6d4SPaolo Bonzini  .require(targetos == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \
341a436d6d4SPaolo Bonzini  .allowed()
342106ad1f9SPaolo Bonzini
34355116968SJagannathan Ramanvfio_user_server_allowed = get_option('vfio_user_server') \
34455116968SJagannathan Raman  .require(targetos == 'linux', error_message: 'vfio-user server is supported only on Linux') \
34555116968SJagannathan Raman  .allowed()
34655116968SJagannathan Raman
3470d04c4c9SPaolo Bonzinihave_tpm = get_option('tpm') \
3480d04c4c9SPaolo Bonzini  .require(targetos != 'windows', error_message: 'TPM emulation only available on POSIX systems') \
3490d04c4c9SPaolo Bonzini  .allowed()
3500d04c4c9SPaolo Bonzini
3512a3129a3SPaolo Bonzini# vhost
3522df89d54SPaolo Bonzinihave_vhost_user = get_option('vhost_user') \
3532df89d54SPaolo Bonzini  .disable_auto_if(targetos != 'linux') \
3542df89d54SPaolo Bonzini  .require(targetos != 'windows',
3552df89d54SPaolo Bonzini           error_message: 'vhost-user is not available on Windows').allowed()
3562df89d54SPaolo Bonzinihave_vhost_vdpa = get_option('vhost_vdpa') \
3572df89d54SPaolo Bonzini  .require(targetos == 'linux',
3582df89d54SPaolo Bonzini           error_message: 'vhost-vdpa is only available on Linux').allowed()
3592df89d54SPaolo Bonzinihave_vhost_kernel = get_option('vhost_kernel') \
3602df89d54SPaolo Bonzini  .require(targetos == 'linux',
3612df89d54SPaolo Bonzini           error_message: 'vhost-kernel is only available on Linux').allowed()
3622df89d54SPaolo Bonzinihave_vhost_user_crypto = get_option('vhost_crypto') \
3632df89d54SPaolo Bonzini  .require(have_vhost_user,
3642df89d54SPaolo Bonzini           error_message: 'vhost-crypto requires vhost-user to be enabled').allowed()
3652df89d54SPaolo Bonzini
36643b6d7eeSPaolo Bonzinihave_vhost = have_vhost_user or have_vhost_vdpa or have_vhost_kernel
3672df89d54SPaolo Bonzini
3682df89d54SPaolo Bonzinihave_vhost_net_user = have_vhost_user and get_option('vhost_net').allowed()
3692df89d54SPaolo Bonzinihave_vhost_net_vdpa = have_vhost_vdpa and get_option('vhost_net').allowed()
3702df89d54SPaolo Bonzinihave_vhost_net_kernel = have_vhost_kernel and get_option('vhost_net').allowed()
3712df89d54SPaolo Bonzinihave_vhost_net = have_vhost_net_kernel or have_vhost_net_user or have_vhost_net_vdpa
3722a3129a3SPaolo Bonzini
373b7a75c8cSPaolo Bonzini# Target-specific libraries and flags
3747fa1c635SPaolo Bonzinilibm = cc.find_library('m', required: false)
3756d7c7c2dSPaolo Bonzinithreads = dependency('threads')
376a81df1b6SPaolo Bonziniutil = cc.find_library('util', required: false)
3774a96337dSPaolo Bonziniwinmm = []
378a81df1b6SPaolo Bonzinisocket = []
37904c6f1e7SMarc-André Lureauversion_res = []
380d92989aaSMarc-André Lureaucoref = []
381d92989aaSMarc-André Lureauiokit = []
382b6c7cfd4SPaolo Bonziniemulator_link_args = []
38374a414a1SReinoud Zandijknvmm =not_found
3848a19980eSPaolo Bonzinihvf = not_found
38523011f44SMarc-André Lureaumidl = not_found
38623011f44SMarc-André Lureauwidl = not_found
387cf60ccc3SAkihiko Odakipathcch = not_found
388a6305081SPaolo Bonzinihost_dsosuf = '.so'
389a81df1b6SPaolo Bonziniif targetos == 'windows'
39023011f44SMarc-André Lureau  midl = find_program('midl', required: false)
39123011f44SMarc-André Lureau  widl = find_program('widl', required: false)
392cf60ccc3SAkihiko Odaki  pathcch = cc.find_library('pathcch')
393a81df1b6SPaolo Bonzini  socket = cc.find_library('ws2_32')
3944a96337dSPaolo Bonzini  winmm = cc.find_library('winmm')
39504c6f1e7SMarc-André Lureau
39604c6f1e7SMarc-André Lureau  win = import('windows')
39704c6f1e7SMarc-André Lureau  version_res = win.compile_resources('version.rc',
39804c6f1e7SMarc-André Lureau                                      depend_files: files('pc-bios/qemu-nsis.ico'),
39904c6f1e7SMarc-André Lureau                                      include_directories: include_directories('.'))
400a6305081SPaolo Bonzini  host_dsosuf = '.dll'
401d92989aaSMarc-André Lureauelif targetos == 'darwin'
402d92989aaSMarc-André Lureau  coref = dependency('appleframeworks', modules: 'CoreFoundation')
40314176c8dSJoelle van Dyne  iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
404a6305081SPaolo Bonzini  host_dsosuf = '.dylib'
405cfad62f1SPaolo Bonzinielif targetos == 'sunos'
406cfad62f1SPaolo Bonzini  socket = [cc.find_library('socket'),
407cfad62f1SPaolo Bonzini            cc.find_library('nsl'),
408cfad62f1SPaolo Bonzini            cc.find_library('resolv')]
409cfad62f1SPaolo Bonzinielif targetos == 'haiku'
410cfad62f1SPaolo Bonzini  socket = [cc.find_library('posix_error_mapper'),
411cfad62f1SPaolo Bonzini            cc.find_library('network'),
412cfad62f1SPaolo Bonzini            cc.find_library('bsd')]
413b6c7cfd4SPaolo Bonzinielif targetos == 'openbsd'
41443a363aeSPaolo Bonzini  if get_option('tcg').allowed() and target_dirs.length() > 0
415b6c7cfd4SPaolo Bonzini    # Disable OpenBSD W^X if available
416b6c7cfd4SPaolo Bonzini    emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
417b6c7cfd4SPaolo Bonzini  endif
418a81df1b6SPaolo Bonziniendif
4196ec0e15dSPaolo Bonzini
420b7a75c8cSPaolo Bonzini# Target-specific configuration of accelerators
4218a19980eSPaolo Bonziniaccelerators = []
42243a363aeSPaolo Bonziniif get_option('kvm').allowed() and targetos == 'linux'
4238a19980eSPaolo Bonzini  accelerators += 'CONFIG_KVM'
4248a19980eSPaolo Bonziniendif
42543a363aeSPaolo Bonziniif get_option('whpx').allowed() and targetos == 'windows'
42657e2a1f8SSunil Muthuswamy  if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
4278a19980eSPaolo Bonzini    error('WHPX requires 64-bit host')
4288a19980eSPaolo Bonzini  elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
4298a19980eSPaolo Bonzini       cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
4308a19980eSPaolo Bonzini    accelerators += 'CONFIG_WHPX'
4318a19980eSPaolo Bonzini  endif
4328a19980eSPaolo Bonziniendif
43343a363aeSPaolo Bonziniif get_option('hvf').allowed()
4348a19980eSPaolo Bonzini  hvf = dependency('appleframeworks', modules: 'Hypervisor',
4358a19980eSPaolo Bonzini                   required: get_option('hvf'))
4368a19980eSPaolo Bonzini  if hvf.found()
4378a19980eSPaolo Bonzini    accelerators += 'CONFIG_HVF'
4388a19980eSPaolo Bonzini  endif
4398a19980eSPaolo Bonziniendif
44043a363aeSPaolo Bonziniif get_option('hax').allowed()
4418a19980eSPaolo Bonzini  if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
4428a19980eSPaolo Bonzini    accelerators += 'CONFIG_HAX'
4438a19980eSPaolo Bonzini  endif
4448a19980eSPaolo Bonziniendif
44574a414a1SReinoud Zandijkif targetos == 'netbsd'
44674a414a1SReinoud Zandijk  nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
44774a414a1SReinoud Zandijk  if nvmm.found()
44874a414a1SReinoud Zandijk    accelerators += 'CONFIG_NVMM'
44974a414a1SReinoud Zandijk  endif
45074a414a1SReinoud Zandijkendif
45123a77b2dSPaolo Bonzini
452823eb013SPaolo Bonzinitcg_arch = host_arch
45343a363aeSPaolo Bonziniif get_option('tcg').allowed()
454823eb013SPaolo Bonzini  if host_arch == 'unknown'
45523a77b2dSPaolo Bonzini    if get_option('tcg_interpreter')
456f1f727acSPhilippe Mathieu-Daudé      warning('Unsupported CPU @0@, will use TCG with TCI (slow)'.format(cpu))
4578a19980eSPaolo Bonzini    else
4588a19980eSPaolo Bonzini      error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
4598a19980eSPaolo Bonzini    endif
460fa2f7b0bSPhilippe Mathieu-Daudé  elif get_option('tcg_interpreter')
4611c282da3SPhilippe Mathieu-Daudé    warning('Use of the TCG interpreter is not recommended on this host')
462fa2f7b0bSPhilippe Mathieu-Daudé    warning('architecture. There is a native TCG execution backend available')
463fa2f7b0bSPhilippe Mathieu-Daudé    warning('which provides substantially better performance and reliability.')
464fa2f7b0bSPhilippe Mathieu-Daudé    warning('It is strongly recommended to remove the --enable-tcg-interpreter')
465fa2f7b0bSPhilippe Mathieu-Daudé    warning('configuration option on this architecture to use the native')
466fa2f7b0bSPhilippe Mathieu-Daudé    warning('backend.')
4678a19980eSPaolo Bonzini  endif
46823a77b2dSPaolo Bonzini  if get_option('tcg_interpreter')
46923a77b2dSPaolo Bonzini    tcg_arch = 'tci'
470ed145144SRichard Henderson    config_host += { 'CONFIG_TCG_INTERPRETER': 'y' }
471823eb013SPaolo Bonzini  elif host_arch == 'x86_64'
47223a77b2dSPaolo Bonzini    tcg_arch = 'i386'
473823eb013SPaolo Bonzini  elif host_arch == 'ppc64'
47423a77b2dSPaolo Bonzini    tcg_arch = 'ppc'
47523a77b2dSPaolo Bonzini  endif
47623a77b2dSPaolo Bonzini  add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
477e5134024SPaolo Bonzini                        language: all_languages)
47823a77b2dSPaolo Bonzini
4798a19980eSPaolo Bonzini  accelerators += 'CONFIG_TCG'
4808a19980eSPaolo Bonzini  config_host += { 'CONFIG_TCG': 'y' }
4818a19980eSPaolo Bonziniendif
4828a19980eSPaolo Bonzini
4838a19980eSPaolo Bonziniif 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
4848a19980eSPaolo Bonzini  error('KVM not available on this platform')
4858a19980eSPaolo Bonziniendif
4868a19980eSPaolo Bonziniif 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
4878a19980eSPaolo Bonzini  error('HVF not available on this platform')
4888a19980eSPaolo Bonziniendif
48974a414a1SReinoud Zandijkif 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
49074a414a1SReinoud Zandijk  error('NVMM not available on this platform')
49174a414a1SReinoud Zandijkendif
4928a19980eSPaolo Bonziniif 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
4938a19980eSPaolo Bonzini  error('WHPX not available on this platform')
4948a19980eSPaolo Bonziniendif
495b4e312e9SPaolo Bonzini
4966ec0e15dSPaolo Bonzini################
4976ec0e15dSPaolo Bonzini# Dependencies #
4986ec0e15dSPaolo Bonzini################
4996ec0e15dSPaolo Bonzini
500fc9a809eSPaolo Bonzini# When bumping glib minimum version, please check also whether to increase
501fc9a809eSPaolo Bonzini# the _WIN32_WINNT setting in osdep.h according to the value from glib
502fc9a809eSPaolo Bonziniglib_req_ver = '>=2.56.0'
503fc9a809eSPaolo Bonziniglib_pc = dependency('glib-2.0', version: glib_req_ver, required: true,
504fc9a809eSPaolo Bonzini                    method: 'pkg-config')
505fc9a809eSPaolo Bonziniglib_cflags = []
506*6002711cSPaolo Bonziniif enable_modules
507fc9a809eSPaolo Bonzini  gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true,
508fc9a809eSPaolo Bonzini                       method: 'pkg-config')
509fc9a809eSPaolo Bonzinielif config_host.has_key('CONFIG_PLUGIN')
510fc9a809eSPaolo Bonzini  gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true,
511fc9a809eSPaolo Bonzini                       method: 'pkg-config')
512fc9a809eSPaolo Bonzinielse
513fc9a809eSPaolo Bonzini  gmodule = not_found
514e3feb2ccSEmilio Cotaendif
515953d5a9eSMarc-André Lureau
516fc9a809eSPaolo Bonzini# This workaround is required due to a bug in pkg-config file for glib as it
517fc9a809eSPaolo Bonzini# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
518fc9a809eSPaolo Bonziniif targetos == 'windows' and get_option('prefer_static')
519fc9a809eSPaolo Bonzini  glib_cflags += ['-DGLIB_STATIC_COMPILATION']
520fc9a809eSPaolo Bonziniendif
521fc9a809eSPaolo Bonzini
522fc9a809eSPaolo Bonzini# Sanity check that the current size_t matches the
523fc9a809eSPaolo Bonzini# size that glib thinks it should be. This catches
524fc9a809eSPaolo Bonzini# problems on multi-arch where people try to build
525fc9a809eSPaolo Bonzini# 32-bit QEMU while pointing at 64-bit glib headers
526fc9a809eSPaolo Bonzini
527fc9a809eSPaolo Bonziniif not cc.compiles('''
528fc9a809eSPaolo Bonzini  #include <glib.h>
529fc9a809eSPaolo Bonzini  #include <unistd.h>
530fc9a809eSPaolo Bonzini
531fc9a809eSPaolo Bonzini  #define QEMU_BUILD_BUG_ON(x) \
532fc9a809eSPaolo Bonzini  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
533fc9a809eSPaolo Bonzini
534fc9a809eSPaolo Bonzini  int main(void) {
535fc9a809eSPaolo Bonzini     QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
536fc9a809eSPaolo Bonzini     return 0;
537fc9a809eSPaolo Bonzini  }''', dependencies: glib_pc, args: glib_cflags)
538fc9a809eSPaolo Bonzini  error('''sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T.
539fc9a809eSPaolo Bonzini        You probably need to set PKG_CONFIG_LIBDIR" to point
540fc9a809eSPaolo Bonzini        to the right pkg-config files for your build target.''')
541fc9a809eSPaolo Bonziniendif
542fc9a809eSPaolo Bonzini
543fc9a809eSPaolo Bonzini# Silence clang warnings triggered by glib < 2.57.2
544fc9a809eSPaolo Bonziniif not cc.compiles('''
545fc9a809eSPaolo Bonzini  #include <glib.h>
546fc9a809eSPaolo Bonzini  typedef struct Foo {
547fc9a809eSPaolo Bonzini    int i;
548fc9a809eSPaolo Bonzini  } Foo;
549fc9a809eSPaolo Bonzini  static void foo_free(Foo *f)
550fc9a809eSPaolo Bonzini  {
551fc9a809eSPaolo Bonzini    g_free(f);
552fc9a809eSPaolo Bonzini  }
553fc9a809eSPaolo Bonzini  G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free)
554fc9a809eSPaolo Bonzini  int main(void) { return 0; }''', dependencies: glib_pc, args: ['-Werror'])
555fc9a809eSPaolo Bonzini  glib_cflags += cc.get_supported_arguments('-Wno-unused-function')
556fc9a809eSPaolo Bonziniendif
557fc9a809eSPaolo Bonziniglib = declare_dependency(dependencies: [glib_pc, gmodule],
558fc9a809eSPaolo Bonzini                          compile_args: glib_cflags,
559fc9a809eSPaolo Bonzini                          version: glib_pc.version())
560fc9a809eSPaolo Bonzini
561fc9a809eSPaolo Bonzini# Check whether glib has gslice, which we have to avoid for correctness.
562fc9a809eSPaolo Bonzini# TODO: remove this check and the corresponding workaround (qtree) when
563fc9a809eSPaolo Bonzini# the minimum supported glib is >= 2.75.3
564fc9a809eSPaolo Bonziniglib_has_gslice = glib.version().version_compare('<2.75.3')
565fc9a809eSPaolo Bonzini
566fc9a809eSPaolo Bonzini# override glib dep to include the above refinements
567fc9a809eSPaolo Bonzinimeson.override_dependency('glib-2.0', glib)
568fc9a809eSPaolo Bonzini
569fc9a809eSPaolo Bonzini# The path to glib.h is added to all compilation commands.
570fc9a809eSPaolo Bonziniadd_project_dependencies(glib.partial_dependency(compile_args: true, includes: true),
571fc9a809eSPaolo Bonzini                         native: false, language: all_languages)
572fc9a809eSPaolo Bonzini
573a81df1b6SPaolo Bonzinigio = not_found
5747544060eSPaolo Bonzinigdbus_codegen = not_found
575bb2dc4b7SPaolo Bonzinigdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio'
5767544060eSPaolo Bonziniif not get_option('gio').auto() or have_system
5777544060eSPaolo Bonzini  gio = dependency('gio-2.0', required: get_option('gio'),
578063d5119SPaolo Bonzini                   method: 'pkg-config')
5797544060eSPaolo Bonzini  if gio.found() and not cc.links('''
5807544060eSPaolo Bonzini    #include <gio/gio.h>
5817544060eSPaolo Bonzini    int main(void)
5827544060eSPaolo Bonzini    {
5837544060eSPaolo Bonzini      g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
5847544060eSPaolo Bonzini      return 0;
5857544060eSPaolo Bonzini    }''', dependencies: [glib, gio])
5867544060eSPaolo Bonzini    if get_option('gio').enabled()
5877544060eSPaolo Bonzini      error('The installed libgio is broken for static linking')
588a81df1b6SPaolo Bonzini    endif
5897544060eSPaolo Bonzini    gio = not_found
5907544060eSPaolo Bonzini  endif
5917544060eSPaolo Bonzini  if gio.found()
5927544060eSPaolo Bonzini    gdbus_codegen = find_program(gio.get_variable('gdbus_codegen'),
5937544060eSPaolo Bonzini                                 required: get_option('gio'))
5947544060eSPaolo Bonzini    gio_unix = dependency('gio-unix-2.0', required: get_option('gio'),
595063d5119SPaolo Bonzini                          method: 'pkg-config')
5967544060eSPaolo Bonzini    gio = declare_dependency(dependencies: [gio, gio_unix],
5977544060eSPaolo Bonzini                             version: gio.version())
5987544060eSPaolo Bonzini  endif
5997544060eSPaolo Bonziniendif
600bb2dc4b7SPaolo Bonziniif gdbus_codegen.found() and get_option('cfi')
601bb2dc4b7SPaolo Bonzini  gdbus_codegen = not_found
602bb2dc4b7SPaolo Bonzini  gdbus_codegen_error = '@0@ uses gdbus-codegen, which does not support control flow integrity'
603bb2dc4b7SPaolo Bonziniendif
6047544060eSPaolo Bonzini
605a81df1b6SPaolo Bonzinilttng = not_found
6069c29b741SPaolo Bonziniif 'ust' in get_option('trace_backends')
607e32aaa5aSMarc-André Lureau  lttng = dependency('lttng-ust', required: true, version: '>= 2.1',
608063d5119SPaolo Bonzini                     method: 'pkg-config')
609a81df1b6SPaolo Bonziniendif
610b7612f45SPaolo Bonzinipixman = not_found
611b7612f45SPaolo Bonziniif have_system or have_tools
612b7612f45SPaolo Bonzini  pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
613063d5119SPaolo Bonzini                      method: 'pkg-config')
614b7612f45SPaolo Bonziniendif
615063d5119SPaolo Bonzinizlib = dependency('zlib', required: true)
61653c22b68SPaolo Bonzini
617ff66f3e5SPaolo Bonzinilibaio = not_found
618ff66f3e5SPaolo Bonziniif not get_option('linux_aio').auto() or have_block
619ff66f3e5SPaolo Bonzini  libaio = cc.find_library('aio', has_headers: ['libaio.h'],
620063d5119SPaolo Bonzini                           required: get_option('linux_aio'))
621ff66f3e5SPaolo Bonziniendif
622354081d4SLeonardo Bras
623354081d4SLeonardo Braslinux_io_uring_test = '''
624354081d4SLeonardo Bras  #include <liburing.h>
625354081d4SLeonardo Bras  #include <linux/errqueue.h>
626354081d4SLeonardo Bras
627354081d4SLeonardo Bras  int main(void) { return 0; }'''
628354081d4SLeonardo Bras
6295e5733e5SMarc-André Lureaulinux_io_uring = not_found
63053c22b68SPaolo Bonziniif not get_option('linux_io_uring').auto() or have_block
631a41b4fdcSDaniel P. Berrangé  linux_io_uring = dependency('liburing', version: '>=0.3',
632a41b4fdcSDaniel P. Berrangé                              required: get_option('linux_io_uring'),
633063d5119SPaolo Bonzini                              method: 'pkg-config')
634354081d4SLeonardo Bras  if not cc.links(linux_io_uring_test)
635354081d4SLeonardo Bras    linux_io_uring = not_found
6365e5733e5SMarc-André Lureau  endif
637354081d4SLeonardo Brasendif
638354081d4SLeonardo Bras
6395e5733e5SMarc-André Lureaulibnfs = not_found
64030045c05SPaolo Bonziniif not get_option('libnfs').auto() or have_block
64130045c05SPaolo Bonzini  libnfs = dependency('libnfs', version: '>=1.9.3',
64230045c05SPaolo Bonzini                      required: get_option('libnfs'),
643063d5119SPaolo Bonzini                      method: 'pkg-config')
6445e5733e5SMarc-André Lureauendif
645f7f2d651SPaolo Bonzini
646f7f2d651SPaolo Bonzinilibattr_test = '''
647f7f2d651SPaolo Bonzini  #include <stddef.h>
648f7f2d651SPaolo Bonzini  #include <sys/types.h>
649f7f2d651SPaolo Bonzini  #ifdef CONFIG_LIBATTR
650f7f2d651SPaolo Bonzini  #include <attr/xattr.h>
651f7f2d651SPaolo Bonzini  #else
652f7f2d651SPaolo Bonzini  #include <sys/xattr.h>
653f7f2d651SPaolo Bonzini  #endif
654f7f2d651SPaolo Bonzini  int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
655f7f2d651SPaolo Bonzini
656ec0d5893SMarc-André Lureaulibattr = not_found
657f7f2d651SPaolo Bonzinihave_old_libattr = false
65843a363aeSPaolo Bonziniif get_option('attr').allowed()
659f7f2d651SPaolo Bonzini  if cc.links(libattr_test)
660f7f2d651SPaolo Bonzini    libattr = declare_dependency()
661f7f2d651SPaolo Bonzini  else
662f7f2d651SPaolo Bonzini    libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
663063d5119SPaolo Bonzini                              required: get_option('attr'))
664f7f2d651SPaolo Bonzini    if libattr.found() and not \
665f7f2d651SPaolo Bonzini      cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
666f7f2d651SPaolo Bonzini      libattr = not_found
667f7f2d651SPaolo Bonzini      if get_option('attr').enabled()
668f7f2d651SPaolo Bonzini        error('could not link libattr')
669f7f2d651SPaolo Bonzini      else
670f7f2d651SPaolo Bonzini        warning('could not link libattr, disabling')
671ec0d5893SMarc-André Lureau      endif
672f7f2d651SPaolo Bonzini    else
673f7f2d651SPaolo Bonzini      have_old_libattr = libattr.found()
674f7f2d651SPaolo Bonzini    endif
675f7f2d651SPaolo Bonzini  endif
676f7f2d651SPaolo Bonziniendif
677f7f2d651SPaolo Bonzini
67852eaefd3SAkihiko Odakicocoa = dependency('appleframeworks', modules: ['Cocoa', 'CoreVideo'],
67952eaefd3SAkihiko Odaki                   required: get_option('cocoa'))
680c1ec4941SPaolo Bonzini
681e2c1d78dSVladislav Yaroshchukvmnet = dependency('appleframeworks', modules: 'vmnet', required: get_option('vmnet'))
682e2c1d78dSVladislav Yaroshchukif vmnet.found() and not cc.has_header_symbol('vmnet/vmnet.h',
683e2c1d78dSVladislav Yaroshchuk                                              'VMNET_BRIDGED_MODE',
684e2c1d78dSVladislav Yaroshchuk                                              dependencies: vmnet)
685e2c1d78dSVladislav Yaroshchuk  vmnet = not_found
686e2c1d78dSVladislav Yaroshchuk  if get_option('vmnet').enabled()
687e2c1d78dSVladislav Yaroshchuk    error('vmnet.framework API is outdated')
688e2c1d78dSVladislav Yaroshchuk  else
689e2c1d78dSVladislav Yaroshchuk    warning('vmnet.framework API is outdated, disabling')
690e2c1d78dSVladislav Yaroshchuk  endif
691e2c1d78dSVladislav Yaroshchukendif
692e2c1d78dSVladislav Yaroshchuk
6933f99cf57SPaolo Bonziniseccomp = not_found
69473422d95SMichal Privoznikseccomp_has_sysrawrc = false
69590835c2bSPaolo Bonziniif not get_option('seccomp').auto() or have_system or have_tools
69690835c2bSPaolo Bonzini  seccomp = dependency('libseccomp', version: '>=2.3.0',
69790835c2bSPaolo Bonzini                       required: get_option('seccomp'),
698063d5119SPaolo Bonzini                       method: 'pkg-config')
69973422d95SMichal Privoznik  if seccomp.found()
70073422d95SMichal Privoznik    seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h',
70173422d95SMichal Privoznik                                                'SCMP_FLTATR_API_SYSRAWRC',
70273422d95SMichal Privoznik                                                dependencies: seccomp)
70373422d95SMichal Privoznik  endif
7043f99cf57SPaolo Bonziniendif
705727c8bb8SPaolo Bonzini
7063f99cf57SPaolo Bonzinilibcap_ng = not_found
707727c8bb8SPaolo Bonziniif not get_option('cap_ng').auto() or have_system or have_tools
708727c8bb8SPaolo Bonzini  libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
709063d5119SPaolo Bonzini                              required: get_option('cap_ng'))
7103f99cf57SPaolo Bonziniendif
711727c8bb8SPaolo Bonziniif libcap_ng.found() and not cc.links('''
712727c8bb8SPaolo Bonzini   #include <cap-ng.h>
713727c8bb8SPaolo Bonzini   int main(void)
714727c8bb8SPaolo Bonzini   {
715727c8bb8SPaolo Bonzini     capng_capability_to_name(CAPNG_EFFECTIVE);
716727c8bb8SPaolo Bonzini     return 0;
717727c8bb8SPaolo Bonzini   }''', dependencies: libcap_ng)
718727c8bb8SPaolo Bonzini  libcap_ng = not_found
719727c8bb8SPaolo Bonzini  if get_option('cap_ng').enabled()
720727c8bb8SPaolo Bonzini    error('could not link libcap-ng')
721727c8bb8SPaolo Bonzini  else
722727c8bb8SPaolo Bonzini    warning('could not link libcap-ng, disabling')
723727c8bb8SPaolo Bonzini  endif
724727c8bb8SPaolo Bonziniendif
725727c8bb8SPaolo Bonzini
7261917ec6dSPaolo Bonziniif get_option('xkbcommon').auto() and not have_system and not have_tools
7271917ec6dSPaolo Bonzini  xkbcommon = not_found
7281917ec6dSPaolo Bonzinielse
7291917ec6dSPaolo Bonzini  xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
730063d5119SPaolo Bonzini                         method: 'pkg-config')
731ade60d4fSMarc-André Lureauendif
732e1723999SPaolo Bonzini
7335890258aSThomas Huthslirp = not_found
7345890258aSThomas Huthif not get_option('slirp').auto() or have_system
7355890258aSThomas Huth  slirp = dependency('slirp', required: get_option('slirp'),
736063d5119SPaolo Bonzini                     method: 'pkg-config')
7375890258aSThomas Huth  # slirp < 4.7 is incompatible with CFI support in QEMU.  This is because
7385890258aSThomas Huth  # it passes function pointers within libslirp as callbacks for timers.
7395890258aSThomas Huth  # When using a system-wide shared libslirp, the type information for the
7405890258aSThomas Huth  # callback is missing and the timer call produces a false positive with CFI.
7415890258aSThomas Huth  # Do not use the "version" keyword argument to produce a better error.
7425890258aSThomas Huth  # with control-flow integrity.
7435890258aSThomas Huth  if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7')
7445890258aSThomas Huth    if get_option('slirp').enabled()
7455890258aSThomas Huth      error('Control-Flow Integrity requires libslirp 4.7.')
7465890258aSThomas Huth    else
7475890258aSThomas Huth      warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.')
7485890258aSThomas Huth      slirp = not_found
7495890258aSThomas Huth    endif
7505890258aSThomas Huth  endif
7515890258aSThomas Huthendif
7525890258aSThomas Huth
753cdaf0722SMarc-André Lureauvde = not_found
754e1723999SPaolo Bonziniif not get_option('vde').auto() or have_system or have_tools
755e1723999SPaolo Bonzini  vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
756063d5119SPaolo Bonzini                           required: get_option('vde'))
757e1723999SPaolo Bonziniendif
758e1723999SPaolo Bonziniif vde.found() and not cc.links('''
759e1723999SPaolo Bonzini   #include <libvdeplug.h>
760e1723999SPaolo Bonzini   int main(void)
761e1723999SPaolo Bonzini   {
762e1723999SPaolo Bonzini     struct vde_open_args a = {0, 0, 0};
763e1723999SPaolo Bonzini     char s[] = "";
764e1723999SPaolo Bonzini     vde_open(s, s, &a);
765e1723999SPaolo Bonzini     return 0;
766e1723999SPaolo Bonzini   }''', dependencies: vde)
767e1723999SPaolo Bonzini  vde = not_found
768e1723999SPaolo Bonzini  if get_option('cap_ng').enabled()
769e1723999SPaolo Bonzini    error('could not link libvdeplug')
770e1723999SPaolo Bonzini  else
771e1723999SPaolo Bonzini    warning('could not link libvdeplug, disabling')
772e1723999SPaolo Bonzini  endif
773cdaf0722SMarc-André Lureauendif
77487430d5bSPaolo Bonzini
775478e943fSPaolo Bonzinipulse = not_found
77687430d5bSPaolo Bonziniif not get_option('pa').auto() or (targetos == 'linux' and have_system)
77787430d5bSPaolo Bonzini  pulse = dependency('libpulse', required: get_option('pa'),
778063d5119SPaolo Bonzini                     method: 'pkg-config')
779478e943fSPaolo Bonziniendif
780478e943fSPaolo Bonzinialsa = not_found
78187430d5bSPaolo Bonziniif not get_option('alsa').auto() or (targetos == 'linux' and have_system)
78287430d5bSPaolo Bonzini  alsa = dependency('alsa', required: get_option('alsa'),
783063d5119SPaolo Bonzini                    method: 'pkg-config')
784478e943fSPaolo Bonziniendif
785478e943fSPaolo Bonzinijack = not_found
78687430d5bSPaolo Bonziniif not get_option('jack').auto() or have_system
78787430d5bSPaolo Bonzini  jack = dependency('jack', required: get_option('jack'),
788063d5119SPaolo Bonzini                    method: 'pkg-config')
789478e943fSPaolo Bonziniendif
790c2d3d1c2SDorinda Basseypipewire = not_found
791c2d3d1c2SDorinda Basseyif not get_option('pipewire').auto() or (targetos == 'linux' and have_system)
792c2d3d1c2SDorinda Bassey  pipewire = dependency('libpipewire-0.3', version: '>=0.3.60',
793c2d3d1c2SDorinda Bassey                    required: get_option('pipewire'),
794063d5119SPaolo Bonzini                    method: 'pkg-config')
795c2d3d1c2SDorinda Basseyendif
796663df1ccSAlexandre Ratchovsndio = not_found
797663df1ccSAlexandre Ratchovif not get_option('sndio').auto() or have_system
798663df1ccSAlexandre Ratchov  sndio = dependency('sndio', required: get_option('sndio'),
799063d5119SPaolo Bonzini                    method: 'pkg-config')
800663df1ccSAlexandre Ratchovendif
80187430d5bSPaolo Bonzini
80258d3f3ffSGerd Hoffmannspice_protocol = not_found
8033f0a5d55SMarc-André Lureauif not get_option('spice_protocol').auto() or have_system
8045c167b53SMarkus Armbruster  spice_protocol = dependency('spice-protocol', version: '>=0.14.0',
8053f0a5d55SMarc-André Lureau                              required: get_option('spice_protocol'),
806063d5119SPaolo Bonzini                              method: 'pkg-config')
8072634733cSPaolo Bonziniendif
8083f0a5d55SMarc-André Lureauspice = not_found
8093f0a5d55SMarc-André Lureauif not get_option('spice').auto() or have_system
81034d55725SMarkus Armbruster  spice = dependency('spice-server', version: '>=0.14.0',
8113f0a5d55SMarc-André Lureau                     required: get_option('spice'),
812063d5119SPaolo Bonzini                     method: 'pkg-config')
81358d3f3ffSGerd Hoffmannendif
8143f0a5d55SMarc-André Lureauspice_headers = spice.partial_dependency(compile_args: true, includes: true)
8153f0a5d55SMarc-André Lureau
8165ee24e78SMarc-André Lureaurt = cc.find_library('rt', required: false)
817a399f914SPaolo Bonzini
81899650b62SPaolo Bonzinilibiscsi = not_found
8199db405a3SPaolo Bonziniif not get_option('libiscsi').auto() or have_block
8209db405a3SPaolo Bonzini  libiscsi = dependency('libiscsi', version: '>=1.9.0',
8219db405a3SPaolo Bonzini                         required: get_option('libiscsi'),
822063d5119SPaolo Bonzini                         method: 'pkg-config')
82399650b62SPaolo Bonziniendif
8245e5733e5SMarc-André Lureauzstd = not_found
825b1def33dSPaolo Bonziniif not get_option('zstd').auto() or have_block
826b1def33dSPaolo Bonzini  zstd = dependency('libzstd', version: '>=1.4.0',
827b1def33dSPaolo Bonzini                    required: get_option('zstd'),
828063d5119SPaolo Bonzini                    method: 'pkg-config')
8295e5733e5SMarc-André Lureauendif
830ea458960SMarc-André Lureauvirgl = not_found
8310265fe9eSPaolo Bonzini
8320265fe9eSPaolo Bonzinihave_vhost_user_gpu = have_tools and targetos == 'linux' and pixman.found()
8330265fe9eSPaolo Bonziniif not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
834587d59d6SPaolo Bonzini  virgl = dependency('virglrenderer',
835587d59d6SPaolo Bonzini                     method: 'pkg-config',
836063d5119SPaolo Bonzini                     required: get_option('virglrenderer'))
837ea458960SMarc-André Lureauendif
838fd66dbd4SStefan Hajnocziblkio = not_found
839fd66dbd4SStefan Hajnocziif not get_option('blkio').auto() or have_block
840fd66dbd4SStefan Hajnoczi  blkio = dependency('blkio',
841fd66dbd4SStefan Hajnoczi                     method: 'pkg-config',
842063d5119SPaolo Bonzini                     required: get_option('blkio'))
843fd66dbd4SStefan Hajnocziendif
8441d7bb6abSMarc-André Lureaucurl = not_found
845f9cd86feSPaolo Bonziniif not get_option('curl').auto() or have_block
846f9cd86feSPaolo Bonzini  curl = dependency('libcurl', version: '>=7.29.0',
847f9cd86feSPaolo Bonzini                    method: 'pkg-config',
848063d5119SPaolo Bonzini                    required: get_option('curl'))
8491d7bb6abSMarc-André Lureauendif
850f15bff25SPaolo Bonzinilibudev = not_found
851f01496a3SPaolo Bonziniif targetos == 'linux' and (have_system or have_tools)
8526ec0e15dSPaolo Bonzini  libudev = dependency('libudev',
853a0fbbb6eSPaolo Bonzini                       method: 'pkg-config',
854063d5119SPaolo Bonzini                       required: get_option('libudev'))
855f15bff25SPaolo Bonziniendif
8566ec0e15dSPaolo Bonzini
8575c53015aSPaolo Bonzinimpathlibs = [libudev]
8586ec0e15dSPaolo Bonzinimpathpersist = not_found
8596ec0e15dSPaolo Bonzinimpathpersist_new_api = false
86043a363aeSPaolo Bonziniif targetos == 'linux' and have_tools and get_option('mpath').allowed()
8616ec0e15dSPaolo Bonzini  mpath_test_source_new = '''
8626ec0e15dSPaolo Bonzini    #include <libudev.h>
8636ec0e15dSPaolo Bonzini    #include <mpath_persist.h>
8646ec0e15dSPaolo Bonzini    unsigned mpath_mx_alloc_len = 1024;
8656ec0e15dSPaolo Bonzini    int logsink;
8666ec0e15dSPaolo Bonzini    static struct config *multipath_conf;
8676ec0e15dSPaolo Bonzini    extern struct udev *udev;
8686ec0e15dSPaolo Bonzini    extern struct config *get_multipath_config(void);
8696ec0e15dSPaolo Bonzini    extern void put_multipath_config(struct config *conf);
8706ec0e15dSPaolo Bonzini    struct udev *udev;
8716ec0e15dSPaolo Bonzini    struct config *get_multipath_config(void) { return multipath_conf; }
8726ec0e15dSPaolo Bonzini    void put_multipath_config(struct config *conf) { }
8736ec0e15dSPaolo Bonzini    int main(void) {
8746ec0e15dSPaolo Bonzini        udev = udev_new();
8756ec0e15dSPaolo Bonzini        multipath_conf = mpath_lib_init();
8766ec0e15dSPaolo Bonzini        return 0;
8776ec0e15dSPaolo Bonzini    }'''
8786ec0e15dSPaolo Bonzini  mpath_test_source_old = '''
8796ec0e15dSPaolo Bonzini      #include <libudev.h>
8806ec0e15dSPaolo Bonzini      #include <mpath_persist.h>
8816ec0e15dSPaolo Bonzini      unsigned mpath_mx_alloc_len = 1024;
8826ec0e15dSPaolo Bonzini      int logsink;
8836ec0e15dSPaolo Bonzini      int main(void) {
8846ec0e15dSPaolo Bonzini          struct udev *udev = udev_new();
8856ec0e15dSPaolo Bonzini          mpath_lib_init(udev);
8866ec0e15dSPaolo Bonzini          return 0;
8876ec0e15dSPaolo Bonzini      }'''
8885c53015aSPaolo Bonzini  libmpathpersist = cc.find_library('mpathpersist',
889063d5119SPaolo Bonzini                                    required: get_option('mpath'))
8905c53015aSPaolo Bonzini  if libmpathpersist.found()
8915c53015aSPaolo Bonzini    mpathlibs += libmpathpersist
892a0cbd2e8SPaolo Bonzini    if get_option('prefer_static')
89343b43a40SPaolo Bonzini      mpathlibs += cc.find_library('devmapper',
894063d5119SPaolo Bonzini                                     required: get_option('mpath'))
89543b43a40SPaolo Bonzini    endif
89643b43a40SPaolo Bonzini    mpathlibs += cc.find_library('multipath',
897063d5119SPaolo Bonzini                                 required: get_option('mpath'))
89843b43a40SPaolo Bonzini    foreach lib: mpathlibs
89943b43a40SPaolo Bonzini      if not lib.found()
90043b43a40SPaolo Bonzini        mpathlibs = []
90143b43a40SPaolo Bonzini        break
90243b43a40SPaolo Bonzini      endif
90343b43a40SPaolo Bonzini    endforeach
9045c53015aSPaolo Bonzini    if mpathlibs.length() == 0
9055c53015aSPaolo Bonzini      msg = 'Dependencies missing for libmpathpersist'
9065c53015aSPaolo Bonzini    elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
9076ec0e15dSPaolo Bonzini      mpathpersist = declare_dependency(dependencies: mpathlibs)
9086ec0e15dSPaolo Bonzini      mpathpersist_new_api = true
9096ec0e15dSPaolo Bonzini    elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
9106ec0e15dSPaolo Bonzini      mpathpersist = declare_dependency(dependencies: mpathlibs)
9116ec0e15dSPaolo Bonzini    else
9125c53015aSPaolo Bonzini      msg = 'Cannot detect libmpathpersist API'
9135c53015aSPaolo Bonzini    endif
9145c53015aSPaolo Bonzini    if not mpathpersist.found()
9156ec0e15dSPaolo Bonzini      if get_option('mpath').enabled()
9165c53015aSPaolo Bonzini        error(msg)
9176ec0e15dSPaolo Bonzini      else
9185c53015aSPaolo Bonzini        warning(msg + ', disabling')
9196ec0e15dSPaolo Bonzini      endif
9206ec0e15dSPaolo Bonzini    endif
9216ec0e15dSPaolo Bonzini  endif
9226ec0e15dSPaolo Bonziniendif
9236ec0e15dSPaolo Bonzini
9245285e593SYonggang Luoiconv = not_found
92530fe76b1SPaolo Bonzinicurses = not_found
92643a363aeSPaolo Bonziniif have_system and get_option('curses').allowed()
9275285e593SYonggang Luo  curses_test = '''
928fbab8cc2SStefan Weil    #if defined(__APPLE__) || defined(__OpenBSD__)
929fbab8cc2SStefan Weil    #define _XOPEN_SOURCE_EXTENDED 1
930fbab8cc2SStefan Weil    #endif
9315285e593SYonggang Luo    #include <locale.h>
9325285e593SYonggang Luo    #include <curses.h>
9335285e593SYonggang Luo    #include <wchar.h>
9345285e593SYonggang Luo    int main(void) {
9355285e593SYonggang Luo      wchar_t wch = L'w';
9365285e593SYonggang Luo      setlocale(LC_ALL, "");
9375285e593SYonggang Luo      resize_term(0, 0);
9385285e593SYonggang Luo      addwstr(L"wide chars\n");
9395285e593SYonggang Luo      addnwstr(&wch, 1);
9405285e593SYonggang Luo      add_wch(WACS_DEGREE);
9415285e593SYonggang Luo      return 0;
9425285e593SYonggang Luo    }'''
943925a40dfSPaolo Bonzini
944ca31e307SYonggang Luo  curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
9456d322635SPaolo Bonzini  curses = dependency(curses_dep_list,
9465285e593SYonggang Luo                      required: false,
947063d5119SPaolo Bonzini                      method: 'pkg-config')
948925a40dfSPaolo Bonzini  msg = get_option('curses').enabled() ? 'curses library not found' : ''
949fbab8cc2SStefan Weil  curses_compile_args = ['-DNCURSES_WIDECHAR=1']
950925a40dfSPaolo Bonzini  if curses.found()
9510dbce6efSPaolo Bonzini    if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
952bd3615d6SPaolo Bonzini      curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses],
953bd3615d6SPaolo Bonzini                                  version: curses.version())
954925a40dfSPaolo Bonzini    else
955925a40dfSPaolo Bonzini      msg = 'curses package not usable'
956925a40dfSPaolo Bonzini      curses = not_found
9575285e593SYonggang Luo    endif
958925a40dfSPaolo Bonzini  endif
959925a40dfSPaolo Bonzini  if not curses.found()
960925a40dfSPaolo Bonzini    has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
961925a40dfSPaolo Bonzini    if targetos != 'windows' and not has_curses_h
962925a40dfSPaolo Bonzini      message('Trying with /usr/include/ncursesw')
963925a40dfSPaolo Bonzini      curses_compile_args += ['-I/usr/include/ncursesw']
964925a40dfSPaolo Bonzini      has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
965925a40dfSPaolo Bonzini    endif
966925a40dfSPaolo Bonzini    if has_curses_h
967925a40dfSPaolo Bonzini      curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
968925a40dfSPaolo Bonzini      foreach curses_libname : curses_libname_list
9695285e593SYonggang Luo        libcurses = cc.find_library(curses_libname,
970063d5119SPaolo Bonzini                                    required: false)
9715285e593SYonggang Luo        if libcurses.found()
972925a40dfSPaolo Bonzini          if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
973925a40dfSPaolo Bonzini            curses = declare_dependency(compile_args: curses_compile_args,
974925a40dfSPaolo Bonzini                                        dependencies: [libcurses])
9755285e593SYonggang Luo            break
976925a40dfSPaolo Bonzini          else
977925a40dfSPaolo Bonzini            msg = 'curses library not usable'
9785285e593SYonggang Luo          endif
9795285e593SYonggang Luo        endif
9805285e593SYonggang Luo      endforeach
9815285e593SYonggang Luo    endif
98230fe76b1SPaolo Bonzini  endif
98343a363aeSPaolo Bonzini  if get_option('iconv').allowed()
984925a40dfSPaolo Bonzini    foreach link_args : [ ['-liconv'], [] ]
985925a40dfSPaolo Bonzini      # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
986925a40dfSPaolo Bonzini      # We need to use libiconv if available because mixing libiconv's headers with
987925a40dfSPaolo Bonzini      # the system libc does not work.
988925a40dfSPaolo Bonzini      # However, without adding glib to the dependencies -L/usr/local/lib will not be
989925a40dfSPaolo Bonzini      # included in the command line and libiconv will not be found.
990925a40dfSPaolo Bonzini      if cc.links('''
991925a40dfSPaolo Bonzini        #include <iconv.h>
992925a40dfSPaolo Bonzini        int main(void) {
993925a40dfSPaolo Bonzini          iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
994925a40dfSPaolo Bonzini          return conv != (iconv_t) -1;
995fc9a809eSPaolo Bonzini        }''', args: link_args, dependencies: glib)
996925a40dfSPaolo Bonzini        iconv = declare_dependency(link_args: link_args, dependencies: glib)
997925a40dfSPaolo Bonzini        break
998925a40dfSPaolo Bonzini      endif
999925a40dfSPaolo Bonzini    endforeach
1000925a40dfSPaolo Bonzini  endif
1001925a40dfSPaolo Bonzini  if curses.found() and not iconv.found()
1002925a40dfSPaolo Bonzini    if get_option('iconv').enabled()
1003925a40dfSPaolo Bonzini      error('iconv not available')
1004925a40dfSPaolo Bonzini    endif
1005925a40dfSPaolo Bonzini    msg = 'iconv required for curses UI but not available'
1006925a40dfSPaolo Bonzini    curses = not_found
1007925a40dfSPaolo Bonzini  endif
1008925a40dfSPaolo Bonzini  if not curses.found() and msg != ''
1009925a40dfSPaolo Bonzini    if get_option('curses').enabled()
1010925a40dfSPaolo Bonzini      error(msg)
10115285e593SYonggang Luo    else
1012925a40dfSPaolo Bonzini      warning(msg + ', disabling')
101330fe76b1SPaolo Bonzini    endif
10145285e593SYonggang Luo  endif
10155285e593SYonggang Luoendif
10165285e593SYonggang Luo
10172634733cSPaolo Bonzinibrlapi = not_found
10188c6d4ff4SPaolo Bonziniif not get_option('brlapi').auto() or have_system
10198c6d4ff4SPaolo Bonzini  brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
1020063d5119SPaolo Bonzini                         required: get_option('brlapi'))
10218c6d4ff4SPaolo Bonzini  if brlapi.found() and not cc.links('''
10228c6d4ff4SPaolo Bonzini     #include <brlapi.h>
10238c6d4ff4SPaolo Bonzini     #include <stddef.h>
10248c6d4ff4SPaolo Bonzini     int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
10258c6d4ff4SPaolo Bonzini    brlapi = not_found
10268c6d4ff4SPaolo Bonzini    if get_option('brlapi').enabled()
10278c6d4ff4SPaolo Bonzini      error('could not link brlapi')
10288c6d4ff4SPaolo Bonzini    else
10298c6d4ff4SPaolo Bonzini      warning('could not link brlapi, disabling')
10308c6d4ff4SPaolo Bonzini    endif
10318c6d4ff4SPaolo Bonzini  endif
10322634733cSPaolo Bonziniendif
103335be72baSPaolo Bonzini
1034760e4327SPaolo Bonzinisdl = not_found
103564d3fec7SAkihiko Odakiif not get_option('sdl').auto() or have_system
1036063d5119SPaolo Bonzini  sdl = dependency('sdl2', required: get_option('sdl'))
103735be72baSPaolo Bonzini  sdl_image = not_found
1038760e4327SPaolo Bonziniendif
103935be72baSPaolo Bonziniif sdl.found()
104035be72baSPaolo Bonzini  # work around 2.0.8 bug
104135be72baSPaolo Bonzini  sdl = declare_dependency(compile_args: '-Wno-undef',
1042bd3615d6SPaolo Bonzini                           dependencies: sdl,
1043bd3615d6SPaolo Bonzini                           version: sdl.version())
10447161a433SVolker Rümelin  sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
1045063d5119SPaolo Bonzini                         method: 'pkg-config')
104635be72baSPaolo Bonzinielse
104735be72baSPaolo Bonzini  if get_option('sdl_image').enabled()
1048a8dc2aceSSergei Trofimovich    error('sdl-image required, but SDL was @0@'.format(
1049a8dc2aceSSergei Trofimovich          get_option('sdl').disabled() ? 'disabled' : 'not found'))
10502634733cSPaolo Bonzini  endif
105135be72baSPaolo Bonzini  sdl_image = not_found
105235be72baSPaolo Bonziniendif
105335be72baSPaolo Bonzini
10545e5733e5SMarc-André Lureaurbd = not_found
1055fabd1e93SPaolo Bonziniif not get_option('rbd').auto() or have_block
1056063d5119SPaolo Bonzini  librados = cc.find_library('rados', required: get_option('rbd'))
1057fabd1e93SPaolo Bonzini  librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
1058063d5119SPaolo Bonzini                           required: get_option('rbd'))
1059c518d6c2SPaolo Bonzini  if librados.found() and librbd.found()
1060c518d6c2SPaolo Bonzini    if cc.links('''
1061fabd1e93SPaolo Bonzini      #include <stdio.h>
1062fabd1e93SPaolo Bonzini      #include <rbd/librbd.h>
1063fabd1e93SPaolo Bonzini      int main(void) {
1064fabd1e93SPaolo Bonzini        rados_t cluster;
1065fabd1e93SPaolo Bonzini        rados_create(&cluster, NULL);
106648672ac0SPeter Lieven        #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
106748672ac0SPeter Lieven        #error
106848672ac0SPeter Lieven        #endif
1069fabd1e93SPaolo Bonzini        return 0;
1070fabd1e93SPaolo Bonzini      }''', dependencies: [librbd, librados])
1071fabd1e93SPaolo Bonzini      rbd = declare_dependency(dependencies: [librbd, librados])
1072c518d6c2SPaolo Bonzini    elif get_option('rbd').enabled()
107348672ac0SPeter Lieven      error('librbd >= 1.12.0 required')
1074c518d6c2SPaolo Bonzini    else
107548672ac0SPeter Lieven      warning('librbd >= 1.12.0 not found, disabling')
1076c518d6c2SPaolo Bonzini    endif
10775e5733e5SMarc-André Lureau  endif
1078fabd1e93SPaolo Bonziniendif
1079fabd1e93SPaolo Bonzini
10805e5733e5SMarc-André Lureauglusterfs = not_found
108108821ca2SPaolo Bonziniglusterfs_ftruncate_has_stat = false
108208821ca2SPaolo Bonziniglusterfs_iocb_has_stat = false
108308821ca2SPaolo Bonziniif not get_option('glusterfs').auto() or have_block
108408821ca2SPaolo Bonzini  glusterfs = dependency('glusterfs-api', version: '>=3',
108508821ca2SPaolo Bonzini                         required: get_option('glusterfs'),
1086063d5119SPaolo Bonzini                         method: 'pkg-config')
108708821ca2SPaolo Bonzini  if glusterfs.found()
108808821ca2SPaolo Bonzini    glusterfs_ftruncate_has_stat = cc.links('''
108908821ca2SPaolo Bonzini      #include <glusterfs/api/glfs.h>
109008821ca2SPaolo Bonzini
109108821ca2SPaolo Bonzini      int
109208821ca2SPaolo Bonzini      main(void)
109308821ca2SPaolo Bonzini      {
109408821ca2SPaolo Bonzini          /* new glfs_ftruncate() passes two additional args */
109508821ca2SPaolo Bonzini          return glfs_ftruncate(NULL, 0, NULL, NULL);
109608821ca2SPaolo Bonzini      }
109708821ca2SPaolo Bonzini    ''', dependencies: glusterfs)
109808821ca2SPaolo Bonzini    glusterfs_iocb_has_stat = cc.links('''
109908821ca2SPaolo Bonzini      #include <glusterfs/api/glfs.h>
110008821ca2SPaolo Bonzini
110108821ca2SPaolo Bonzini      /* new glfs_io_cbk() passes two additional glfs_stat structs */
110208821ca2SPaolo Bonzini      static void
110308821ca2SPaolo Bonzini      glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
110408821ca2SPaolo Bonzini      {}
110508821ca2SPaolo Bonzini
110608821ca2SPaolo Bonzini      int
110708821ca2SPaolo Bonzini      main(void)
110808821ca2SPaolo Bonzini      {
110908821ca2SPaolo Bonzini          glfs_io_cbk iocb = &glusterfs_iocb;
111008821ca2SPaolo Bonzini          iocb(NULL, 0 , NULL, NULL, NULL);
111108821ca2SPaolo Bonzini          return 0;
111208821ca2SPaolo Bonzini      }
111308821ca2SPaolo Bonzini    ''', dependencies: glusterfs)
111408821ca2SPaolo Bonzini  endif
11155e5733e5SMarc-André Lureauendif
1116e6a52b36SThomas Huth
11175e5733e5SMarc-André Lureaulibssh = not_found
1118e6a52b36SThomas Huthif not get_option('libssh').auto() or have_block
1119e6a52b36SThomas Huth  libssh = dependency('libssh', version: '>=0.8.7',
1120e6a52b36SThomas Huth                    method: 'pkg-config',
1121063d5119SPaolo Bonzini                    required: get_option('libssh'))
11225e5733e5SMarc-André Lureauendif
1123e6a52b36SThomas Huth
11245e5733e5SMarc-André Lureaulibbzip2 = not_found
112529ba6116SPaolo Bonziniif not get_option('bzip2').auto() or have_block
112629ba6116SPaolo Bonzini  libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
1127063d5119SPaolo Bonzini                             required: get_option('bzip2'))
112829ba6116SPaolo Bonzini  if libbzip2.found() and not cc.links('''
112929ba6116SPaolo Bonzini     #include <bzlib.h>
113029ba6116SPaolo Bonzini     int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
113129ba6116SPaolo Bonzini    libbzip2 = not_found
113229ba6116SPaolo Bonzini    if get_option('bzip2').enabled()
113329ba6116SPaolo Bonzini      error('could not link libbzip2')
113429ba6116SPaolo Bonzini    else
113529ba6116SPaolo Bonzini      warning('could not link libbzip2, disabling')
11365e5733e5SMarc-André Lureau    endif
113729ba6116SPaolo Bonzini  endif
11385e5733e5SMarc-André Lureauendif
1139ecea3696SPaolo Bonzini
11405e5733e5SMarc-André Lureauliblzfse = not_found
1141ecea3696SPaolo Bonziniif not get_option('lzfse').auto() or have_block
1142ecea3696SPaolo Bonzini  liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
1143063d5119SPaolo Bonzini                             required: get_option('lzfse'))
11445e5733e5SMarc-André Lureauendif
1145ecea3696SPaolo Bonziniif liblzfse.found() and not cc.links('''
1146ecea3696SPaolo Bonzini   #include <lzfse.h>
1147ecea3696SPaolo Bonzini   int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
1148ecea3696SPaolo Bonzini  liblzfse = not_found
1149ecea3696SPaolo Bonzini  if get_option('lzfse').enabled()
1150ecea3696SPaolo Bonzini    error('could not link liblzfse')
1151ecea3696SPaolo Bonzini  else
1152ecea3696SPaolo Bonzini    warning('could not link liblzfse, disabling')
1153ecea3696SPaolo Bonzini  endif
1154ecea3696SPaolo Bonziniendif
1155ecea3696SPaolo Bonzini
1156478e943fSPaolo Bonzinioss = not_found
115743a363aeSPaolo Bonziniif get_option('oss').allowed() and have_system
115887430d5bSPaolo Bonzini  if not cc.has_header('sys/soundcard.h')
115987430d5bSPaolo Bonzini    # not found
116087430d5bSPaolo Bonzini  elif targetos == 'netbsd'
1161063d5119SPaolo Bonzini    oss = cc.find_library('ossaudio', required: get_option('oss'))
116287430d5bSPaolo Bonzini  else
116387430d5bSPaolo Bonzini    oss = declare_dependency()
116487430d5bSPaolo Bonzini  endif
116587430d5bSPaolo Bonzini
116687430d5bSPaolo Bonzini  if not oss.found()
116787430d5bSPaolo Bonzini    if get_option('oss').enabled()
116887430d5bSPaolo Bonzini      error('OSS not found')
116987430d5bSPaolo Bonzini    endif
117087430d5bSPaolo Bonzini  endif
1171478e943fSPaolo Bonziniendif
1172478e943fSPaolo Bonzinidsound = not_found
117387430d5bSPaolo Bonziniif not get_option('dsound').auto() or (targetos == 'windows' and have_system)
117487430d5bSPaolo Bonzini  if cc.has_header('dsound.h')
117587430d5bSPaolo Bonzini    dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
1176478e943fSPaolo Bonzini  endif
117787430d5bSPaolo Bonzini
117887430d5bSPaolo Bonzini  if not dsound.found()
117987430d5bSPaolo Bonzini    if get_option('dsound').enabled()
118087430d5bSPaolo Bonzini      error('DirectSound not found')
118187430d5bSPaolo Bonzini    endif
118287430d5bSPaolo Bonzini  endif
118387430d5bSPaolo Bonziniendif
118487430d5bSPaolo Bonzini
1185478e943fSPaolo Bonzinicoreaudio = not_found
118687430d5bSPaolo Bonziniif not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system)
118787430d5bSPaolo Bonzini  coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
118887430d5bSPaolo Bonzini                         required: get_option('coreaudio'))
1189478e943fSPaolo Bonziniendif
11908bc5184dSThomas Huth
11912b1ccdf4SMarc-André Lureauopengl = not_found
119288b6e618SPaolo Bonziniif not get_option('opengl').auto() or have_system or have_vhost_user_gpu
119388b6e618SPaolo Bonzini  epoxy = dependency('epoxy', method: 'pkg-config',
1194063d5119SPaolo Bonzini                      required: get_option('opengl'))
119588b6e618SPaolo Bonzini  if cc.has_header('epoxy/egl.h', dependencies: epoxy)
119688b6e618SPaolo Bonzini    opengl = epoxy
119788b6e618SPaolo Bonzini  elif get_option('opengl').enabled()
119888b6e618SPaolo Bonzini    error('epoxy/egl.h not found')
119988b6e618SPaolo Bonzini  endif
12002b1ccdf4SMarc-André Lureauendif
12018bc5184dSThomas Huthgbm = not_found
12028bc5184dSThomas Huthif (have_system or have_tools) and (virgl.found() or opengl.found())
1203063d5119SPaolo Bonzini  gbm = dependency('gbm', method: 'pkg-config', required: false)
12048bc5184dSThomas Huthendif
1205f0caba44SMarc-André Lureauhave_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found()
12061b695471SPaolo Bonzini
120757612511SPaolo Bonzinignutls = not_found
1208cc4c7c73SDaniel P. Berrangégnutls_crypto = not_found
1209abc14fd0SAlyssa Rossif get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
1210cc4c7c73SDaniel P. Berrangé  # For general TLS support our min gnutls matches
1211cc4c7c73SDaniel P. Berrangé  # that implied by our platform support matrix
1212cc4c7c73SDaniel P. Berrangé  #
1213cc4c7c73SDaniel P. Berrangé  # For the crypto backends, we look for a newer
1214cc4c7c73SDaniel P. Berrangé  # gnutls:
1215cc4c7c73SDaniel P. Berrangé  #
1216cc4c7c73SDaniel P. Berrangé  #   Version 3.6.8  is needed to get XTS
1217cc4c7c73SDaniel P. Berrangé  #   Version 3.6.13 is needed to get PBKDF
1218cc4c7c73SDaniel P. Berrangé  #   Version 3.6.14 is needed to get HW accelerated XTS
1219cc4c7c73SDaniel P. Berrangé  #
1220cc4c7c73SDaniel P. Berrangé  # If newer enough gnutls isn't available, we can
1221cc4c7c73SDaniel P. Berrangé  # still use a different crypto backend to satisfy
1222cc4c7c73SDaniel P. Berrangé  # the platform support requirements
1223cc4c7c73SDaniel P. Berrangé  gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
1224cc4c7c73SDaniel P. Berrangé                             method: 'pkg-config',
1225063d5119SPaolo Bonzini                             required: false)
1226cc4c7c73SDaniel P. Berrangé  if gnutls_crypto.found()
1227cc4c7c73SDaniel P. Berrangé    gnutls = gnutls_crypto
1228cc4c7c73SDaniel P. Berrangé  else
1229cc4c7c73SDaniel P. Berrangé    # Our min version if all we need is TLS
123057612511SPaolo Bonzini    gnutls = dependency('gnutls', version: '>=3.5.18',
123157612511SPaolo Bonzini                        method: 'pkg-config',
1232063d5119SPaolo Bonzini                        required: get_option('gnutls'))
123357612511SPaolo Bonzini  endif
1234cc4c7c73SDaniel P. Berrangéendif
123557612511SPaolo Bonzini
12368bd0931fSDaniel P. Berrangé# We prefer use of gnutls for crypto, unless the options
12378bd0931fSDaniel P. Berrangé# explicitly asked for nettle or gcrypt.
12388bd0931fSDaniel P. Berrangé#
12398bd0931fSDaniel P. Berrangé# If gnutls isn't available for crypto, then we'll prefer
12408bd0931fSDaniel P. Berrangé# gcrypt over nettle for performance reasons.
124157612511SPaolo Bonzinigcrypt = not_found
124257612511SPaolo Bonzininettle = not_found
12434c5e512eSLei Hehogweed = not_found
124468014044SDaniel P. Berrangéxts = 'none'
12458bd0931fSDaniel P. Berrangé
124657612511SPaolo Bonziniif get_option('nettle').enabled() and get_option('gcrypt').enabled()
124757612511SPaolo Bonzini  error('Only one of gcrypt & nettle can be enabled')
124857612511SPaolo Bonziniendif
12498bd0931fSDaniel P. Berrangé
12508bd0931fSDaniel P. Berrangé# Explicit nettle/gcrypt request, so ignore gnutls for crypto
12518bd0931fSDaniel P. Berrangéif get_option('nettle').enabled() or get_option('gcrypt').enabled()
12528bd0931fSDaniel P. Berrangé  gnutls_crypto = not_found
125357612511SPaolo Bonziniendif
12548bd0931fSDaniel P. Berrangé
12558bd0931fSDaniel P. Berrangéif not gnutls_crypto.found()
12568bd0931fSDaniel P. Berrangé  if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
12571741093bSDaniel P. Berrangé    gcrypt = dependency('libgcrypt', version: '>=1.8',
125857612511SPaolo Bonzini                        method: 'config-tool',
1259063d5119SPaolo Bonzini                        required: get_option('gcrypt'))
126057612511SPaolo Bonzini    # Debian has removed -lgpg-error from libgcrypt-config
126157612511SPaolo Bonzini    # as it "spreads unnecessary dependencies" which in
126257612511SPaolo Bonzini    # turn breaks static builds...
1263a0cbd2e8SPaolo Bonzini    if gcrypt.found() and get_option('prefer_static')
1264bd3615d6SPaolo Bonzini      gcrypt = declare_dependency(dependencies:
1265bd3615d6SPaolo Bonzini        [gcrypt,
1266bd3615d6SPaolo Bonzini         cc.find_library('gpg-error', required: true)],
1267bd3615d6SPaolo Bonzini        version: gcrypt.version())
126857612511SPaolo Bonzini    endif
126957612511SPaolo Bonzini  endif
1270260a13d4SDaniel P. Berrangé  if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1271260a13d4SDaniel P. Berrangé    nettle = dependency('nettle', version: '>=3.4',
1272260a13d4SDaniel P. Berrangé                        method: 'pkg-config',
1273063d5119SPaolo Bonzini                        required: get_option('nettle'))
1274260a13d4SDaniel P. Berrangé    if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1275260a13d4SDaniel P. Berrangé      xts = 'private'
1276260a13d4SDaniel P. Berrangé    endif
1277260a13d4SDaniel P. Berrangé  endif
1278cc4c7c73SDaniel P. Berrangéendif
127957612511SPaolo Bonzini
1280063d5119SPaolo Bonzinigmp = dependency('gmp', required: false, method: 'pkg-config')
12814c5e512eSLei Heif nettle.found() and gmp.found()
12824c5e512eSLei He  hogweed = dependency('hogweed', version: '>=3.4',
12834c5e512eSLei He                       method: 'pkg-config',
1284063d5119SPaolo Bonzini                       required: get_option('nettle'))
12854c5e512eSLei Heendif
12864c5e512eSLei He
12874c5e512eSLei He
12882b1ccdf4SMarc-André Lureaugtk = not_found
12891b695471SPaolo Bonzinigtkx11 = not_found
1290c23d7b4eSPaolo Bonzinivte = not_found
129129e0bfffSClaudio Fontanahave_gtk_clipboard = get_option('gtk_clipboard').enabled()
129229e0bfffSClaudio Fontana
129364d3fec7SAkihiko Odakiif not get_option('gtk').auto() or have_system
12941b695471SPaolo Bonzini  gtk = dependency('gtk+-3.0', version: '>=3.22.0',
12951b695471SPaolo Bonzini                   method: 'pkg-config',
1296063d5119SPaolo Bonzini                   required: get_option('gtk'))
12971b695471SPaolo Bonzini  if gtk.found()
12981b695471SPaolo Bonzini    gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
12991b695471SPaolo Bonzini                        method: 'pkg-config',
1300063d5119SPaolo Bonzini                        required: false)
1301bd3615d6SPaolo Bonzini    gtk = declare_dependency(dependencies: [gtk, gtkx11],
1302bd3615d6SPaolo Bonzini                             version: gtk.version())
1303c23d7b4eSPaolo Bonzini
1304c23d7b4eSPaolo Bonzini    if not get_option('vte').auto() or have_system
1305c23d7b4eSPaolo Bonzini      vte = dependency('vte-2.91',
1306c23d7b4eSPaolo Bonzini                       method: 'pkg-config',
1307063d5119SPaolo Bonzini                       required: get_option('vte'))
1308c23d7b4eSPaolo Bonzini    endif
130929e0bfffSClaudio Fontana  elif have_gtk_clipboard
131029e0bfffSClaudio Fontana    error('GTK clipboard requested, but GTK not found')
13112b1ccdf4SMarc-André Lureau  endif
13121b695471SPaolo Bonziniendif
13131b695471SPaolo Bonzini
13142b1ccdf4SMarc-André Lureaux11 = not_found
13159d49bcf6SMarkus Armbrusterif gtkx11.found()
1316063d5119SPaolo Bonzini  x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found())
13172b1ccdf4SMarc-André Lureauendif
13182b1ccdf4SMarc-André Lureaupng = not_found
131995f8510eSKshitij Suriif get_option('png').allowed() and have_system
13201ec8c2c0SThomas Huth   png = dependency('libpng', version: '>=1.6.34', required: get_option('png'),
1321063d5119SPaolo Bonzini                    method: 'pkg-config')
132295f8510eSKshitij Suriendif
132395f8510eSKshitij Surivnc = not_found
13242b1ccdf4SMarc-André Lureaujpeg = not_found
13252b1ccdf4SMarc-André Lureausasl = not_found
132643a363aeSPaolo Bonziniif get_option('vnc').allowed() and have_system
1327a0b93237SPaolo Bonzini  vnc = declare_dependency() # dummy dependency
13288e242b3cSPaolo Bonzini  jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
1329063d5119SPaolo Bonzini                    method: 'pkg-config')
1330a0b93237SPaolo Bonzini  sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
1331063d5119SPaolo Bonzini                         required: get_option('vnc_sasl'))
1332a0b93237SPaolo Bonzini  if sasl.found()
1333a0b93237SPaolo Bonzini    sasl = declare_dependency(dependencies: sasl,
1334a0b93237SPaolo Bonzini                              compile_args: '-DSTRUCT_IOVEC_DEFINED')
1335a0b93237SPaolo Bonzini  endif
13362b1ccdf4SMarc-André Lureauendif
1337241611eaSPaolo Bonzini
133805e391aeSPaolo Bonzinipam = not_found
133905e391aeSPaolo Bonziniif not get_option('auth_pam').auto() or have_system
134005e391aeSPaolo Bonzini  pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
1341063d5119SPaolo Bonzini                        required: get_option('auth_pam'))
134205e391aeSPaolo Bonziniendif
134305e391aeSPaolo Bonziniif pam.found() and not cc.links('''
134405e391aeSPaolo Bonzini   #include <stddef.h>
134505e391aeSPaolo Bonzini   #include <security/pam_appl.h>
134605e391aeSPaolo Bonzini   int main(void) {
134705e391aeSPaolo Bonzini     const char *service_name = "qemu";
134805e391aeSPaolo Bonzini     const char *user = "frank";
134905e391aeSPaolo Bonzini     const struct pam_conv pam_conv = { 0 };
135005e391aeSPaolo Bonzini     pam_handle_t *pamh = NULL;
135105e391aeSPaolo Bonzini     pam_start(service_name, user, &pam_conv, &pamh);
135205e391aeSPaolo Bonzini     return 0;
135305e391aeSPaolo Bonzini   }''', dependencies: pam)
135405e391aeSPaolo Bonzini  pam = not_found
135505e391aeSPaolo Bonzini  if get_option('auth_pam').enabled()
135605e391aeSPaolo Bonzini    error('could not link libpam')
135705e391aeSPaolo Bonzini  else
135805e391aeSPaolo Bonzini    warning('could not link libpam, disabling')
135905e391aeSPaolo Bonzini  endif
136005e391aeSPaolo Bonziniendif
136105e391aeSPaolo Bonzini
1362708eab42SMarc-André Lureausnappy = not_found
1363241611eaSPaolo Bonziniif not get_option('snappy').auto() or have_system
1364241611eaSPaolo Bonzini  snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
1365063d5119SPaolo Bonzini                           required: get_option('snappy'))
1366708eab42SMarc-André Lureauendif
1367565174d0SPaolo Bonziniif snappy.found() and not linker.links('''
1368241611eaSPaolo Bonzini   #include <snappy-c.h>
1369241611eaSPaolo Bonzini   int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
1370241611eaSPaolo Bonzini  snappy = not_found
1371241611eaSPaolo Bonzini  if get_option('snappy').enabled()
1372241611eaSPaolo Bonzini    error('could not link libsnappy')
1373241611eaSPaolo Bonzini  else
1374241611eaSPaolo Bonzini    warning('could not link libsnappy, disabling')
1375241611eaSPaolo Bonzini  endif
1376708eab42SMarc-André Lureauendif
13770c32a0aeSPaolo Bonzini
1378708eab42SMarc-André Lureaulzo = not_found
13790c32a0aeSPaolo Bonziniif not get_option('lzo').auto() or have_system
13800c32a0aeSPaolo Bonzini  lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
1381063d5119SPaolo Bonzini                        required: get_option('lzo'))
1382708eab42SMarc-André Lureauendif
13830c32a0aeSPaolo Bonziniif lzo.found() and not cc.links('''
13840c32a0aeSPaolo Bonzini   #include <lzo/lzo1x.h>
13850c32a0aeSPaolo Bonzini   int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
13860c32a0aeSPaolo Bonzini  lzo = not_found
13870c32a0aeSPaolo Bonzini  if get_option('lzo').enabled()
13880c32a0aeSPaolo Bonzini    error('could not link liblzo2')
13890c32a0aeSPaolo Bonzini  else
13900c32a0aeSPaolo Bonzini    warning('could not link liblzo2, disabling')
13910c32a0aeSPaolo Bonzini  endif
13920c32a0aeSPaolo Bonziniendif
13930c32a0aeSPaolo Bonzini
1394488a8c73SPaolo Bonzininuma = not_found
1395488a8c73SPaolo Bonziniif not get_option('numa').auto() or have_system or have_tools
1396488a8c73SPaolo Bonzini  numa = cc.find_library('numa', has_headers: ['numa.h'],
1397063d5119SPaolo Bonzini                              required: get_option('numa'))
1398488a8c73SPaolo Bonziniendif
1399488a8c73SPaolo Bonziniif numa.found() and not cc.links('''
1400488a8c73SPaolo Bonzini   #include <numa.h>
1401488a8c73SPaolo Bonzini   int main(void) { return numa_available(); }
1402488a8c73SPaolo Bonzini   ''', dependencies: numa)
1403488a8c73SPaolo Bonzini  numa = not_found
1404488a8c73SPaolo Bonzini  if get_option('numa').enabled()
1405488a8c73SPaolo Bonzini    error('could not link numa')
1406488a8c73SPaolo Bonzini  else
1407488a8c73SPaolo Bonzini    warning('could not link numa, disabling')
1408488a8c73SPaolo Bonzini  endif
1409488a8c73SPaolo Bonziniendif
1410488a8c73SPaolo Bonzini
141155166230SMarc-André Lureaurdma = not_found
14123730a734SPaolo Bonziniif not get_option('rdma').auto() or have_system
14133730a734SPaolo Bonzini  libumad = cc.find_library('ibumad', required: get_option('rdma'))
14143730a734SPaolo Bonzini  rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'],
1415063d5119SPaolo Bonzini                               required: get_option('rdma')),
1416063d5119SPaolo Bonzini               cc.find_library('ibverbs', required: get_option('rdma')),
14173730a734SPaolo Bonzini               libumad]
14183730a734SPaolo Bonzini  rdma = declare_dependency(dependencies: rdma_libs)
14193730a734SPaolo Bonzini  foreach lib: rdma_libs
14203730a734SPaolo Bonzini    if not lib.found()
14213730a734SPaolo Bonzini      rdma = not_found
142255166230SMarc-André Lureau    endif
14233730a734SPaolo Bonzini  endforeach
14243730a734SPaolo Bonziniendif
14253730a734SPaolo Bonzini
1426582ea95fSMarc-André Lureauxen = not_found
142714efd8d3SPaolo Bonziniif get_option('xen').enabled() or (get_option('xen').auto() and have_system)
142814efd8d3SPaolo Bonzini  xencontrol = dependency('xencontrol', required: false,
1429063d5119SPaolo Bonzini                          method: 'pkg-config')
143014efd8d3SPaolo Bonzini  if xencontrol.found()
143114efd8d3SPaolo Bonzini    xen_pc = declare_dependency(version: xencontrol.version(),
143214efd8d3SPaolo Bonzini      dependencies: [
143314efd8d3SPaolo Bonzini        xencontrol,
143414efd8d3SPaolo Bonzini        # disabler: true makes xen_pc.found() return false if any is not found
143514efd8d3SPaolo Bonzini        dependency('xenstore', required: false,
1436063d5119SPaolo Bonzini                   method: 'pkg-config',
143714efd8d3SPaolo Bonzini                   disabler: true),
143814efd8d3SPaolo Bonzini        dependency('xenforeignmemory', required: false,
1439063d5119SPaolo Bonzini                   method: 'pkg-config',
144014efd8d3SPaolo Bonzini                   disabler: true),
144114efd8d3SPaolo Bonzini        dependency('xengnttab', required: false,
1442063d5119SPaolo Bonzini                   method: 'pkg-config',
144314efd8d3SPaolo Bonzini                   disabler: true),
144414efd8d3SPaolo Bonzini        dependency('xenevtchn', required: false,
1445063d5119SPaolo Bonzini                   method: 'pkg-config',
144614efd8d3SPaolo Bonzini                   disabler: true),
144714efd8d3SPaolo Bonzini        dependency('xendevicemodel', required: false,
1448063d5119SPaolo Bonzini                   method: 'pkg-config',
144914efd8d3SPaolo Bonzini                   disabler: true),
145014efd8d3SPaolo Bonzini        # optional, no "disabler: true"
145114efd8d3SPaolo Bonzini        dependency('xentoolcore', required: false,
1452063d5119SPaolo Bonzini                   method: 'pkg-config')])
145314efd8d3SPaolo Bonzini    if xen_pc.found()
145414efd8d3SPaolo Bonzini      xen = xen_pc
1455582ea95fSMarc-André Lureau    endif
145614efd8d3SPaolo Bonzini  endif
145714efd8d3SPaolo Bonzini  if not xen.found()
145814efd8d3SPaolo 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' ]
145914efd8d3SPaolo Bonzini    xen_libs = {
146014efd8d3SPaolo Bonzini      '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
146114efd8d3SPaolo Bonzini      '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
146214efd8d3SPaolo Bonzini      '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
146314efd8d3SPaolo Bonzini      '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
146414efd8d3SPaolo Bonzini      '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
146514efd8d3SPaolo Bonzini      '4.6.0': [ 'xenstore', 'xenctrl' ],
146614efd8d3SPaolo Bonzini      '4.5.0': [ 'xenstore', 'xenctrl' ],
146714efd8d3SPaolo Bonzini      '4.2.0': [ 'xenstore', 'xenctrl' ],
146814efd8d3SPaolo Bonzini    }
146914efd8d3SPaolo Bonzini    xen_deps = {}
147014efd8d3SPaolo Bonzini    foreach ver: xen_tests
147114efd8d3SPaolo Bonzini      # cache the various library tests to avoid polluting the logs
147214efd8d3SPaolo Bonzini      xen_test_deps = []
147314efd8d3SPaolo Bonzini      foreach l: xen_libs[ver]
147414efd8d3SPaolo Bonzini        if l not in xen_deps
147514efd8d3SPaolo Bonzini          xen_deps += { l: cc.find_library(l, required: false) }
147614efd8d3SPaolo Bonzini        endif
147714efd8d3SPaolo Bonzini        xen_test_deps += xen_deps[l]
147814efd8d3SPaolo Bonzini      endforeach
147914efd8d3SPaolo Bonzini
148014efd8d3SPaolo Bonzini      # Use -D to pick just one of the test programs in scripts/xen-detect.c
148114efd8d3SPaolo Bonzini      xen_version = ver.split('.')
148214efd8d3SPaolo Bonzini      xen_ctrl_version = xen_version[0] + \
148314efd8d3SPaolo Bonzini        ('0' + xen_version[1]).substring(-2) + \
148414efd8d3SPaolo Bonzini        ('0' + xen_version[2]).substring(-2)
148514efd8d3SPaolo Bonzini      if cc.links(files('scripts/xen-detect.c'),
148614efd8d3SPaolo Bonzini                  args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version,
148714efd8d3SPaolo Bonzini                  dependencies: xen_test_deps)
148814efd8d3SPaolo Bonzini        xen = declare_dependency(version: ver, dependencies: xen_test_deps)
148914efd8d3SPaolo Bonzini        break
149014efd8d3SPaolo Bonzini      endif
149114efd8d3SPaolo Bonzini    endforeach
149214efd8d3SPaolo Bonzini  endif
149314efd8d3SPaolo Bonzini  if xen.found()
149414efd8d3SPaolo Bonzini    accelerators += 'CONFIG_XEN'
149514efd8d3SPaolo Bonzini  elif get_option('xen').enabled()
149614efd8d3SPaolo Bonzini    error('could not compile and link Xen test program')
149714efd8d3SPaolo Bonzini  endif
149814efd8d3SPaolo Bonziniendif
149914efd8d3SPaolo Bonzinihave_xen_pci_passthrough = get_option('xen_pci_passthrough') \
150014efd8d3SPaolo Bonzini  .require(xen.found(),
150114efd8d3SPaolo Bonzini           error_message: 'Xen PCI passthrough requested but Xen not enabled') \
150214efd8d3SPaolo Bonzini  .require(targetos == 'linux',
150314efd8d3SPaolo Bonzini           error_message: 'Xen PCI passthrough not available on this platform') \
150414efd8d3SPaolo Bonzini  .allowed()
150514efd8d3SPaolo Bonzini
150614efd8d3SPaolo Bonzini
150706677ce1SPaolo Bonzinicacard = not_found
15085f364c57SPaolo Bonziniif not get_option('smartcard').auto() or have_system
15095f364c57SPaolo Bonzini  cacard = dependency('libcacard', required: get_option('smartcard'),
1510063d5119SPaolo Bonzini                      version: '>=2.5.1', method: 'pkg-config')
151106677ce1SPaolo Bonziniendif
15120a40bcb7SCésar Belleyu2f = not_found
15130a40bcb7SCésar Belleyif have_system
15140a40bcb7SCésar Belley  u2f = dependency('u2f-emu', required: get_option('u2f'),
1515063d5119SPaolo Bonzini                   method: 'pkg-config')
15160a40bcb7SCésar Belleyendif
15178caef850SHongren (Zenithal) Zhengcanokey = not_found
15188caef850SHongren (Zenithal) Zhengif have_system
15198caef850SHongren (Zenithal) Zheng  canokey = dependency('canokey-qemu', required: get_option('canokey'),
1520063d5119SPaolo Bonzini                   method: 'pkg-config')
15218caef850SHongren (Zenithal) Zhengendif
152206677ce1SPaolo Bonziniusbredir = not_found
152318f31e60SPaolo Bonziniif not get_option('usb_redir').auto() or have_system
152418f31e60SPaolo Bonzini  usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
1525063d5119SPaolo Bonzini                        version: '>=0.6', method: 'pkg-config')
152606677ce1SPaolo Bonziniendif
152706677ce1SPaolo Bonzinilibusb = not_found
152890540f32SPaolo Bonziniif not get_option('libusb').auto() or have_system
152990540f32SPaolo Bonzini  libusb = dependency('libusb-1.0', required: get_option('libusb'),
1530063d5119SPaolo Bonzini                      version: '>=1.0.13', method: 'pkg-config')
153106677ce1SPaolo Bonziniendif
153290540f32SPaolo Bonzini
1533c9322ab5SMarc-André Lureaulibpmem = not_found
1534e36e8c70SPaolo Bonziniif not get_option('libpmem').auto() or have_system
1535e36e8c70SPaolo Bonzini  libpmem = dependency('libpmem', required: get_option('libpmem'),
1536063d5119SPaolo Bonzini                       method: 'pkg-config')
1537c9322ab5SMarc-André Lureauendif
1538c7c91a74SBruce Rogerslibdaxctl = not_found
153983ef1682SPaolo Bonziniif not get_option('libdaxctl').auto() or have_system
154083ef1682SPaolo Bonzini  libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
1541063d5119SPaolo Bonzini                         version: '>=57', method: 'pkg-config')
1542c7c91a74SBruce Rogersendif
15438ce0a45fSMarc-André Lureautasn1 = not_found
1544ba7ed407SPaolo Bonziniif gnutls.found()
1545ba7ed407SPaolo Bonzini  tasn1 = dependency('libtasn1',
1546063d5119SPaolo Bonzini                     method: 'pkg-config')
15478ce0a45fSMarc-André Lureauendif
1548af04e89dSMarc-André Lureaukeyutils = dependency('libkeyutils', required: false,
1549063d5119SPaolo Bonzini                      method: 'pkg-config')
1550a81df1b6SPaolo Bonzini
15513909def8SMarc-André Lureauhas_gettid = cc.has_function('gettid')
15523909def8SMarc-André Lureau
15533d212b41SRichard W.M. Jones# libselinux
15543d212b41SRichard W.M. Jonesselinux = dependency('libselinux',
15553d212b41SRichard W.M. Jones                     required: get_option('selinux'),
1556063d5119SPaolo Bonzini                     method: 'pkg-config')
15573d212b41SRichard W.M. Jones
1558aa087962SPaolo Bonzini# Malloc tests
1559aa087962SPaolo Bonzini
1560aa087962SPaolo Bonzinimalloc = []
1561aa087962SPaolo Bonziniif get_option('malloc') == 'system'
1562aa087962SPaolo Bonzini  has_malloc_trim = \
156343a363aeSPaolo Bonzini    get_option('malloc_trim').allowed() and \
1564aa087962SPaolo Bonzini    cc.links('''#include <malloc.h>
1565aa087962SPaolo Bonzini                int main(void) { malloc_trim(0); return 0; }''')
1566aa087962SPaolo Bonzinielse
1567aa087962SPaolo Bonzini  has_malloc_trim = false
1568aa087962SPaolo Bonzini  malloc = cc.find_library(get_option('malloc'), required: true)
1569aa087962SPaolo Bonziniendif
1570aa087962SPaolo Bonziniif not has_malloc_trim and get_option('malloc_trim').enabled()
1571aa087962SPaolo Bonzini  if get_option('malloc') == 'system'
1572aa087962SPaolo Bonzini    error('malloc_trim not available on this platform.')
1573aa087962SPaolo Bonzini  else
1574aa087962SPaolo Bonzini    error('malloc_trim not available with non-libc memory allocator')
1575aa087962SPaolo Bonzini  endif
1576aa087962SPaolo Bonziniendif
1577aa087962SPaolo Bonzini
157884e319a5SMax Reitz# Check whether the glibc provides statx()
157984e319a5SMax Reitz
1580e66420acSPaolo Bonzinignu_source_prefix = '''
158184e319a5SMax Reitz  #ifndef _GNU_SOURCE
158284e319a5SMax Reitz  #define _GNU_SOURCE
158384e319a5SMax Reitz  #endif
1584e66420acSPaolo Bonzini'''
1585e66420acSPaolo Bonzinistatx_test = gnu_source_prefix + '''
158684e319a5SMax Reitz  #include <sys/stat.h>
158784e319a5SMax Reitz  int main(void) {
158884e319a5SMax Reitz    struct statx statxbuf;
158984e319a5SMax Reitz    statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
159084e319a5SMax Reitz    return 0;
159184e319a5SMax Reitz  }'''
159284e319a5SMax Reitz
159384e319a5SMax Reitzhas_statx = cc.links(statx_test)
159484e319a5SMax Reitz
15954ce7a08dSHanna Reitz# Check whether statx() provides mount ID information
15964ce7a08dSHanna Reitz
15974ce7a08dSHanna Reitzstatx_mnt_id_test = gnu_source_prefix + '''
15984ce7a08dSHanna Reitz  #include <sys/stat.h>
15994ce7a08dSHanna Reitz  int main(void) {
16004ce7a08dSHanna Reitz    struct statx statxbuf;
16014ce7a08dSHanna Reitz    statx(0, "", 0, STATX_BASIC_STATS | STATX_MNT_ID, &statxbuf);
16024ce7a08dSHanna Reitz    return statxbuf.stx_mnt_id;
16034ce7a08dSHanna Reitz  }'''
16044ce7a08dSHanna Reitz
16054ce7a08dSHanna Reitzhas_statx_mnt_id = cc.links(statx_mnt_id_test)
16064ce7a08dSHanna Reitz
1607a436d6d4SPaolo Bonzinihave_vhost_user_blk_server = get_option('vhost_user_blk_server') \
1608a436d6d4SPaolo Bonzini  .require(targetos == 'linux',
1609a436d6d4SPaolo Bonzini           error_message: 'vhost_user_blk_server requires linux') \
16102a3129a3SPaolo Bonzini  .require(have_vhost_user,
1611a436d6d4SPaolo Bonzini           error_message: 'vhost_user_blk_server requires vhost-user support') \
161226ed501bSAlex Bennée  .disable_auto_if(not have_tools and not have_system) \
1613a436d6d4SPaolo Bonzini  .allowed()
16149e62ba48SDaniele Buono
1615df4ea709SMax Reitzif get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
1616df4ea709SMax Reitz  error('Cannot enable fuse-lseek while fuse is disabled')
1617df4ea709SMax Reitzendif
1618df4ea709SMax Reitz
1619a484a719SMax Reitzfuse = dependency('fuse3', required: get_option('fuse'),
1620063d5119SPaolo Bonzini                  version: '>=3.1', method: 'pkg-config')
1621a484a719SMax Reitz
1622df4ea709SMax Reitzfuse_lseek = not_found
162343a363aeSPaolo Bonziniif get_option('fuse_lseek').allowed()
1624df4ea709SMax Reitz  if fuse.version().version_compare('>=3.8')
1625df4ea709SMax Reitz    # Dummy dependency
1626df4ea709SMax Reitz    fuse_lseek = declare_dependency()
1627df4ea709SMax Reitz  elif get_option('fuse_lseek').enabled()
1628df4ea709SMax Reitz    if fuse.found()
1629df4ea709SMax Reitz      error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1630df4ea709SMax Reitz    else
1631df4ea709SMax Reitz      error('fuse-lseek requires libfuse, which was not found')
1632df4ea709SMax Reitz    endif
1633df4ea709SMax Reitz  endif
1634df4ea709SMax Reitzendif
1635df4ea709SMax Reitz
1636a6caeee8SXie Yongjihave_libvduse = (targetos == 'linux')
1637a6caeee8SXie Yongjiif get_option('libvduse').enabled()
1638a6caeee8SXie Yongji    if targetos != 'linux'
1639a6caeee8SXie Yongji        error('libvduse requires linux')
1640a6caeee8SXie Yongji    endif
1641a6caeee8SXie Yongjielif get_option('libvduse').disabled()
1642a6caeee8SXie Yongji    have_libvduse = false
1643a6caeee8SXie Yongjiendif
1644a6caeee8SXie Yongji
16452a2359b8SXie Yongjihave_vduse_blk_export = (have_libvduse and targetos == 'linux')
16462a2359b8SXie Yongjiif get_option('vduse_blk_export').enabled()
16472a2359b8SXie Yongji    if targetos != 'linux'
16482a2359b8SXie Yongji        error('vduse_blk_export requires linux')
16492a2359b8SXie Yongji    elif not have_libvduse
16502a2359b8SXie Yongji        error('vduse_blk_export requires libvduse support')
16512a2359b8SXie Yongji    endif
16522a2359b8SXie Yongjielif get_option('vduse_blk_export').disabled()
16532a2359b8SXie Yongji    have_vduse_blk_export = false
16542a2359b8SXie Yongjiendif
16552a2359b8SXie Yongji
165646627f41SAndrew Melnychenko# libbpf
165746627f41SAndrew Melnychenkolibbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config')
165846627f41SAndrew Melnychenkoif libbpf.found() and not cc.links('''
165946627f41SAndrew Melnychenko   #include <bpf/libbpf.h>
166046627f41SAndrew Melnychenko   int main(void)
166146627f41SAndrew Melnychenko   {
166246627f41SAndrew Melnychenko     bpf_object__destroy_skeleton(NULL);
166346627f41SAndrew Melnychenko     return 0;
166446627f41SAndrew Melnychenko   }''', dependencies: libbpf)
166546627f41SAndrew Melnychenko  libbpf = not_found
166646627f41SAndrew Melnychenko  if get_option('bpf').enabled()
166746627f41SAndrew Melnychenko    error('libbpf skeleton test failed')
166846627f41SAndrew Melnychenko  else
166946627f41SAndrew Melnychenko    warning('libbpf skeleton test failed, disabling')
167046627f41SAndrew Melnychenko  endif
167146627f41SAndrew Melnychenkoendif
167246627f41SAndrew Melnychenko
16737c10cb38SIlya Leoshkevich# libdw
1674bc71d58fSIlya Leoshkevichlibdw = not_found
1675550c6d97SIlya Leoshkevichif not get_option('libdw').auto() or \
1676a0cbd2e8SPaolo Bonzini        (not get_option('prefer_static') and (have_system or have_user))
16777c10cb38SIlya Leoshkevich    libdw = dependency('libdw',
16787c10cb38SIlya Leoshkevich                       method: 'pkg-config',
1679bc71d58fSIlya Leoshkevich                       required: get_option('libdw'))
1680bc71d58fSIlya Leoshkevichendif
16817c10cb38SIlya Leoshkevich
168287430d5bSPaolo Bonzini#################
168387430d5bSPaolo Bonzini# config-host.h #
168487430d5bSPaolo Bonzini#################
168587430d5bSPaolo Bonzini
168687430d5bSPaolo Bonziniaudio_drivers_selected = []
168787430d5bSPaolo Bonziniif have_system
168887430d5bSPaolo Bonzini  audio_drivers_available = {
168987430d5bSPaolo Bonzini    'alsa': alsa.found(),
169087430d5bSPaolo Bonzini    'coreaudio': coreaudio.found(),
169187430d5bSPaolo Bonzini    'dsound': dsound.found(),
169287430d5bSPaolo Bonzini    'jack': jack.found(),
169387430d5bSPaolo Bonzini    'oss': oss.found(),
169487430d5bSPaolo Bonzini    'pa': pulse.found(),
1695c2d3d1c2SDorinda Bassey    'pipewire': pipewire.found(),
169687430d5bSPaolo Bonzini    'sdl': sdl.found(),
1697663df1ccSAlexandre Ratchov    'sndio': sndio.found(),
169887430d5bSPaolo Bonzini  }
1699e5424a29SPaolo Bonzini  foreach k, v: audio_drivers_available
1700e5424a29SPaolo Bonzini    config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
1701e5424a29SPaolo Bonzini  endforeach
170287430d5bSPaolo Bonzini
170387430d5bSPaolo Bonzini  # Default to native drivers first, OSS second, SDL third
170487430d5bSPaolo Bonzini  audio_drivers_priority = \
1705663df1ccSAlexandre Ratchov    [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \
170687430d5bSPaolo Bonzini    (targetos == 'linux' ? [] : [ 'sdl' ])
170787430d5bSPaolo Bonzini  audio_drivers_default = []
170887430d5bSPaolo Bonzini  foreach k: audio_drivers_priority
170987430d5bSPaolo Bonzini    if audio_drivers_available[k]
171087430d5bSPaolo Bonzini      audio_drivers_default += k
171187430d5bSPaolo Bonzini    endif
171287430d5bSPaolo Bonzini  endforeach
171387430d5bSPaolo Bonzini
171487430d5bSPaolo Bonzini  foreach k: get_option('audio_drv_list')
171587430d5bSPaolo Bonzini    if k == 'default'
171687430d5bSPaolo Bonzini      audio_drivers_selected += audio_drivers_default
171787430d5bSPaolo Bonzini    elif not audio_drivers_available[k]
171887430d5bSPaolo Bonzini      error('Audio driver "@0@" not available.'.format(k))
171987430d5bSPaolo Bonzini    else
172087430d5bSPaolo Bonzini      audio_drivers_selected += k
172187430d5bSPaolo Bonzini    endif
172287430d5bSPaolo Bonzini  endforeach
172387430d5bSPaolo Bonziniendif
172487430d5bSPaolo Bonziniconfig_host_data.set('CONFIG_AUDIO_DRIVERS',
172587430d5bSPaolo Bonzini                     '"' + '", "'.join(audio_drivers_selected) + '", ')
172687430d5bSPaolo Bonzini
17279e62ba48SDaniele Buonoif get_option('cfi')
17289e62ba48SDaniele Buono  cfi_flags=[]
17299e62ba48SDaniele Buono  # Check for dependency on LTO
17309e62ba48SDaniele Buono  if not get_option('b_lto')
17319e62ba48SDaniele Buono    error('Selected Control-Flow Integrity but LTO is disabled')
17329e62ba48SDaniele Buono  endif
1733*6002711cSPaolo Bonzini  if enable_modules
17349e62ba48SDaniele Buono    error('Selected Control-Flow Integrity is not compatible with modules')
17359e62ba48SDaniele Buono  endif
17369e62ba48SDaniele Buono  # Check for cfi flags. CFI requires LTO so we can't use
17379e62ba48SDaniele Buono  # get_supported_arguments, but need a more complex "compiles" which allows
17389e62ba48SDaniele Buono  # custom arguments
17399e62ba48SDaniele Buono  if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
17409e62ba48SDaniele Buono                 args: ['-flto', '-fsanitize=cfi-icall'] )
17419e62ba48SDaniele Buono    cfi_flags += '-fsanitize=cfi-icall'
17429e62ba48SDaniele Buono  else
17439e62ba48SDaniele Buono    error('-fsanitize=cfi-icall is not supported by the compiler')
17449e62ba48SDaniele Buono  endif
17459e62ba48SDaniele Buono  if cc.compiles('int main () { return 0; }',
17469e62ba48SDaniele Buono                 name: '-fsanitize-cfi-icall-generalize-pointers',
17479e62ba48SDaniele Buono                 args: ['-flto', '-fsanitize=cfi-icall',
17489e62ba48SDaniele Buono                        '-fsanitize-cfi-icall-generalize-pointers'] )
17499e62ba48SDaniele Buono    cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
17509e62ba48SDaniele Buono  else
17519e62ba48SDaniele Buono    error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
17529e62ba48SDaniele Buono  endif
17539e62ba48SDaniele Buono  if get_option('cfi_debug')
17549e62ba48SDaniele Buono    if cc.compiles('int main () { return 0; }',
17559e62ba48SDaniele Buono                   name: '-fno-sanitize-trap=cfi-icall',
17569e62ba48SDaniele Buono                   args: ['-flto', '-fsanitize=cfi-icall',
17579e62ba48SDaniele Buono                          '-fno-sanitize-trap=cfi-icall'] )
17589e62ba48SDaniele Buono      cfi_flags += '-fno-sanitize-trap=cfi-icall'
17599e62ba48SDaniele Buono    else
17609e62ba48SDaniele Buono      error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
17619e62ba48SDaniele Buono    endif
17629e62ba48SDaniele Buono  endif
1763e5134024SPaolo Bonzini  add_global_arguments(cfi_flags, native: false, language: all_languages)
1764e5134024SPaolo Bonzini  add_global_link_arguments(cfi_flags, native: false, language: all_languages)
17659e62ba48SDaniele Buonoendif
17669e62ba48SDaniele Buono
176714176c8dSJoelle van Dynehave_host_block_device = (targetos != 'darwin' or
176814176c8dSJoelle van Dyne    cc.has_header('IOKit/storage/IOMedia.h'))
176914176c8dSJoelle van Dyne
1770a436d6d4SPaolo Bonzinidbus_display = get_option('dbus_display') \
1771a436d6d4SPaolo Bonzini  .require(gio.version().version_compare('>=2.64'),
1772a436d6d4SPaolo Bonzini           error_message: '-display dbus requires glib>=2.64') \
17737544060eSPaolo Bonzini  .require(gdbus_codegen.found(),
1774bb2dc4b7SPaolo Bonzini           error_message: gdbus_codegen_error.format('-display dbus')) \
177584a0a2efSMarc-André Lureau  .require(targetos != 'windows',
177684a0a2efSMarc-André Lureau           error_message: '-display dbus is not available on Windows') \
1777a436d6d4SPaolo Bonzini  .allowed()
1778142ca628SMarc-André Lureau
1779a436d6d4SPaolo Bonzinihave_virtfs = get_option('virtfs') \
17800fb1e19dSKeno Fischer    .require(targetos == 'linux' or targetos == 'darwin',
17810fb1e19dSKeno Fischer             error_message: 'virtio-9p (virtfs) requires Linux or macOS') \
17820fb1e19dSKeno Fischer    .require(targetos == 'linux' or cc.has_function('pthread_fchdir_np'),
17830fb1e19dSKeno Fischer             error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \
17841a67e07fSPeter Foley    .require(targetos == 'darwin' or libattr.found(),
17851a67e07fSPeter Foley             error_message: 'virtio-9p (virtfs) on Linux requires libattr-devel') \
1786a436d6d4SPaolo Bonzini    .disable_auto_if(not have_tools and not have_system) \
1787a436d6d4SPaolo Bonzini    .allowed()
178869202b40SPaolo Bonzini
17891a67e07fSPeter Foleyhave_virtfs_proxy_helper = get_option('virtfs_proxy_helper') \
17901a67e07fSPeter Foley    .require(targetos != 'darwin', error_message: 'the virtfs proxy helper is incompatible with macOS') \
17911a67e07fSPeter Foley    .require(have_virtfs, error_message: 'the virtfs proxy helper requires that virtfs is enabled') \
17921a67e07fSPeter Foley    .disable_auto_if(not have_tools) \
17931a67e07fSPeter Foley    .require(libcap_ng.found(), error_message: 'the virtfs proxy helper requires libcap-ng') \
17941a67e07fSPeter Foley    .allowed()
17953a489d38SPhilippe Mathieu-Daudé
1796622d64ffSPaolo Bonziniif get_option('block_drv_ro_whitelist') == ''
1797622d64ffSPaolo Bonzini  config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '')
1798622d64ffSPaolo Bonzinielse
1799622d64ffSPaolo Bonzini  config_host_data.set('CONFIG_BDRV_RO_WHITELIST',
1800622d64ffSPaolo Bonzini        '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ')
1801622d64ffSPaolo Bonziniendif
1802622d64ffSPaolo Bonziniif get_option('block_drv_rw_whitelist') == ''
1803622d64ffSPaolo Bonzini  config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '')
1804622d64ffSPaolo Bonzinielse
1805622d64ffSPaolo Bonzini  config_host_data.set('CONFIG_BDRV_RW_WHITELIST',
1806622d64ffSPaolo Bonzini        '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ')
1807622d64ffSPaolo Bonziniendif
1808622d64ffSPaolo Bonzini
18099c29b741SPaolo Bonziniforeach k : get_option('trace_backends')
18109c29b741SPaolo Bonzini  config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
18119c29b741SPaolo Bonziniendforeach
18129c29b741SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
181341f2ae28SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority'))
181440c909f5SPaolo Bonziniif iasl.found()
181540c909f5SPaolo Bonzini  config_host_data.set_quoted('CONFIG_IASL', iasl.full_path())
18165dc4618eSPaolo Bonziniendif
181716bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
181816bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
181916bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
182016bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
182116bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
18228154f5e6SAkihiko Odaki
18238154f5e6SAkihiko Odakiqemu_firmwarepath = ''
18248154f5e6SAkihiko Odakiforeach k : get_option('qemu_firmwarepath')
18258154f5e6SAkihiko Odaki  qemu_firmwarepath += '"' + get_option('prefix') / k + '", '
18268154f5e6SAkihiko Odakiendforeach
18278154f5e6SAkihiko Odakiconfig_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath)
18288154f5e6SAkihiko Odaki
182916bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
183016bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
183116bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
183216bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
183316bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
183416bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
183516bf7a33SPaolo Bonzini
1836*6002711cSPaolo Bonziniif enable_modules
1837b0b4323eSPaolo Bonzini  config_host_data.set('CONFIG_STAMP', run_command(
1838b0b4323eSPaolo Bonzini      meson.current_source_dir() / 'scripts/qemu-stamp.py',
1839b0b4323eSPaolo Bonzini      meson.project_version(), get_option('pkgversion'), '--',
1840b0b4323eSPaolo Bonzini      meson.current_source_dir() / 'configure',
1841b0b4323eSPaolo Bonzini      capture: true, check: true).stdout().strip())
1842b0b4323eSPaolo Bonziniendif
1843b0b4323eSPaolo Bonzini
184435acbb30SPaolo Bonzinihave_slirp_smbd = get_option('slirp_smbd') \
184535acbb30SPaolo Bonzini  .require(targetos != 'windows', error_message: 'Host smbd not supported on this platform.') \
184635acbb30SPaolo Bonzini  .allowed()
184735acbb30SPaolo Bonziniif have_slirp_smbd
184835acbb30SPaolo Bonzini  smbd_path = get_option('smbd')
184935acbb30SPaolo Bonzini  if smbd_path == ''
185035acbb30SPaolo Bonzini    smbd_path = (targetos == 'solaris' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd')
185135acbb30SPaolo Bonzini  endif
185235acbb30SPaolo Bonzini  config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path)
185335acbb30SPaolo Bonziniendif
185435acbb30SPaolo Bonzini
1855823eb013SPaolo Bonziniconfig_host_data.set('HOST_' + host_arch.to_upper(), 1)
1856823eb013SPaolo Bonzini
18572cb2f580SPaolo Bonziniif get_option('module_upgrades') and not enable_modules
18582cb2f580SPaolo Bonzini  error('Cannot enable module-upgrades as modules are not enabled')
18592cb2f580SPaolo Bonziniendif
18602cb2f580SPaolo Bonziniconfig_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades'))
18612cb2f580SPaolo Bonzini
1862f7f2d651SPaolo Bonziniconfig_host_data.set('CONFIG_ATTR', libattr.found())
1863c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools'))
18648c6d4ff4SPaolo Bonziniconfig_host_data.set('CONFIG_BRLAPI', brlapi.found())
1865b4e312e9SPaolo Bonziniconfig_host_data.set('CONFIG_COCOA', cocoa.found())
1866537b7248SPaolo Bonziniconfig_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
1867af2bb99bSPaolo Bonziniconfig_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
1868f01496a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBUDEV', libudev.found())
18690c32a0aeSPaolo Bonziniconfig_host_data.set('CONFIG_LZO', lzo.found())
18706ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH', mpathpersist.found())
18716ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
1872fd66dbd4SStefan Hajnocziconfig_host_data.set('CONFIG_BLKIO', blkio.found())
1873f9cd86feSPaolo Bonziniconfig_host_data.set('CONFIG_CURL', curl.found())
18745285e593SYonggang Luoconfig_host_data.set('CONFIG_CURSES', curses.found())
18758bc5184dSThomas Huthconfig_host_data.set('CONFIG_GBM', gbm.found())
18767544060eSPaolo Bonziniconfig_host_data.set('CONFIG_GIO', gio.found())
187708821ca2SPaolo Bonziniconfig_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
187808821ca2SPaolo Bonziniif glusterfs.found()
187908821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
188008821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
188108821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
188208821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
188308821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
188408821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
188508821ca2SPaolo Bonziniendif
18861b695471SPaolo Bonziniconfig_host_data.set('CONFIG_GTK', gtk.found())
1887c23d7b4eSPaolo Bonziniconfig_host_data.set('CONFIG_VTE', vte.found())
188829e0bfffSClaudio Fontanaconfig_host_data.set('CONFIG_GTK_CLIPBOARD', have_gtk_clipboard)
1889f7f2d651SPaolo Bonziniconfig_host_data.set('CONFIG_LIBATTR', have_old_libattr)
1890727c8bb8SPaolo Bonziniconfig_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
189146627f41SAndrew Melnychenkoconfig_host_data.set('CONFIG_EBPF', libbpf.found())
189263a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
18939db405a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
189430045c05SPaolo Bonziniconfig_host_data.set('CONFIG_LIBNFS', libnfs.found())
1895e6a52b36SThomas Huthconfig_host_data.set('CONFIG_LIBSSH', libssh.found())
1896ff66f3e5SPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_AIO', libaio.found())
189763a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
189863a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LIBPMEM', libpmem.found())
1899*6002711cSPaolo Bonziniconfig_host_data.set('CONFIG_MODULES', enable_modules)
1900488a8c73SPaolo Bonziniconfig_host_data.set('CONFIG_NUMA', numa.found())
19016bb613f0SMichal Privoznikif numa.found()
19026bb613f0SMichal Privoznik  config_host_data.set('HAVE_NUMA_HAS_PREFERRED_MANY',
19036bb613f0SMichal Privoznik                       cc.has_function('numa_has_preferred_many',
19046bb613f0SMichal Privoznik                                       dependencies: numa))
19056bb613f0SMichal Privoznikendif
190688b6e618SPaolo Bonziniconfig_host_data.set('CONFIG_OPENGL', opengl.found())
1907c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_PROFILER', get_option('profiler'))
1908fabd1e93SPaolo Bonziniconfig_host_data.set('CONFIG_RBD', rbd.found())
19093730a734SPaolo Bonziniconfig_host_data.set('CONFIG_RDMA', rdma.found())
191035be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL', sdl.found())
191135be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
191290835c2bSPaolo Bonziniconfig_host_data.set('CONFIG_SECCOMP', seccomp.found())
191373422d95SMichal Privoznikif seccomp.found()
191473422d95SMichal Privoznik  config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc)
191573422d95SMichal Privoznikendif
1916241611eaSPaolo Bonziniconfig_host_data.set('CONFIG_SNAPPY', snappy.found())
19170d04c4c9SPaolo Bonziniconfig_host_data.set('CONFIG_TPM', have_tpm)
191890540f32SPaolo Bonziniconfig_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
1919e1723999SPaolo Bonziniconfig_host_data.set('CONFIG_VDE', vde.found())
19202df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET', have_vhost_net)
19212df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user)
19222df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa)
19232df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel)
19242df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_USER', have_vhost_user)
19252df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto)
19262df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa)
1927e2c1d78dSVladislav Yaroshchukconfig_host_data.set('CONFIG_VMNET', vmnet.found())
1928e5e856c1SStefan Hajnocziconfig_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
19292a2359b8SXie Yongjiconfig_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export)
193095f8510eSKshitij Suriconfig_host_data.set('CONFIG_PNG', png.found())
1931a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC', vnc.found())
1932a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
1933a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_SASL', sasl.found())
193469202b40SPaolo Bonziniconfig_host_data.set('CONFIG_VIRTFS', have_virtfs)
193563a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_VTE', vte.found())
19364113f4cfSLaurent Vivierconfig_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
1937af04e89dSMarc-André Lureauconfig_host_data.set('CONFIG_KEYUTILS', keyutils.found())
19383909def8SMarc-André Lureauconfig_host_data.set('CONFIG_GETTID', has_gettid)
193957612511SPaolo Bonziniconfig_host_data.set('CONFIG_GNUTLS', gnutls.found())
1940cc4c7c73SDaniel P. Berrangéconfig_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
1941d47b83b1SDaniel P. Berrangéconfig_host_data.set('CONFIG_TASN1', tasn1.found())
194257612511SPaolo Bonziniconfig_host_data.set('CONFIG_GCRYPT', gcrypt.found())
194357612511SPaolo Bonziniconfig_host_data.set('CONFIG_NETTLE', nettle.found())
19444c5e512eSLei Heconfig_host_data.set('CONFIG_HOGWEED', hogweed.found())
194557612511SPaolo Bonziniconfig_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
1946aa087962SPaolo Bonziniconfig_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
194784e319a5SMax Reitzconfig_host_data.set('CONFIG_STATX', has_statx)
19484ce7a08dSHanna Reitzconfig_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id)
1949b1def33dSPaolo Bonziniconfig_host_data.set('CONFIG_ZSTD', zstd.found())
1950a484a719SMax Reitzconfig_host_data.set('CONFIG_FUSE', fuse.found())
1951df4ea709SMax Reitzconfig_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
19523f0a5d55SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
1953ddece465SMarc-André Lureauif spice_protocol.found()
1954ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0])
1955ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1])
1956ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2])
1957ddece465SMarc-André Lureauendif
19583f0a5d55SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE', spice.found())
19599d71037fSPaolo Bonziniconfig_host_data.set('CONFIG_X11', x11.found())
1960142ca628SMarc-André Lureauconfig_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display)
19619e62ba48SDaniele Buonoconfig_host_data.set('CONFIG_CFI', get_option('cfi'))
19623d212b41SRichard W.M. Jonesconfig_host_data.set('CONFIG_SELINUX', selinux.found())
196314efd8d3SPaolo Bonziniconfig_host_data.set('CONFIG_XEN_BACKEND', xen.found())
19647c10cb38SIlya Leoshkevichconfig_host_data.set('CONFIG_LIBDW', libdw.found())
196514efd8d3SPaolo Bonziniif xen.found()
196614efd8d3SPaolo Bonzini  # protect from xen.version() having less than three components
196714efd8d3SPaolo Bonzini  xen_version = xen.version().split('.') + ['0', '0']
196814efd8d3SPaolo Bonzini  xen_ctrl_version = xen_version[0] + \
196914efd8d3SPaolo Bonzini    ('0' + xen_version[1]).substring(-2) + \
197014efd8d3SPaolo Bonzini    ('0' + xen_version[2]).substring(-2)
197114efd8d3SPaolo Bonzini  config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version)
197214efd8d3SPaolo Bonziniendif
1973859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1974859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1975859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1976859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1977859aef02SPaolo Bonzini
1978a6305081SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
197969d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
198069d8de7aSPaolo Bonzini
1981728c0a2fSPaolo Bonzinihave_coroutine_pool = get_option('coroutine_pool')
1982728c0a2fSPaolo Bonziniif get_option('debug_stack_usage') and have_coroutine_pool
1983728c0a2fSPaolo Bonzini  message('Disabling coroutine pool to measure stack usage')
1984728c0a2fSPaolo Bonzini  have_coroutine_pool = false
1985728c0a2fSPaolo Bonziniendif
1986728c0a2fSPaolo Bonziniconfig_host_data.set10('CONFIG_COROUTINE_POOL', have_coroutine_pool)
198758a2e3f5SStefan Hajnocziconfig_host_data.set('CONFIG_DEBUG_GRAPH_LOCK', get_option('debug_graph_lock'))
1988c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex'))
1989728c0a2fSPaolo Bonziniconfig_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage'))
1990c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_GPROF', get_option('gprof'))
1991406523f6SPaolo Bonziniconfig_host_data.set('CONFIG_LIVE_BLOCK_MIGRATION', get_option('live_block_migration').allowed())
1992c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug'))
1993abad185cSJuan Quintelaconfig_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed())
1994406523f6SPaolo Bonzini
199569d8de7aSPaolo Bonzini# has_header
1996e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
1997d47a8b3bSPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
1998d47a8b3bSPaolo Bonziniconfig_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
199948f670ecSThomas Huthconfig_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
20002964be52SThomas Huthconfig_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
20012802d91dSThomas Huthconfig_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
200269d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
2003ded5d78cSThomas Huthconfig_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
20044a9d5f89SThomas Huthconfig_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
2005d409373bSBin Mengif targetos == 'windows'
2006d409373bSBin Meng  config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h'))
2007d409373bSBin Mengendif
2008ded5d78cSThomas Huth
200969d8de7aSPaolo Bonzini# has_function
2010c891c24bSClaudio Imbrendaconfig_host_data.set('CONFIG_CLOSE_RANGE', cc.has_function('close_range'))
2011a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
2012e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
2013e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
2014e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
2015e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
20168698343bSPeter Maydell# Note that we need to specify prefix: here to avoid incorrectly
20178698343bSPeter Maydell# thinking that Windows has posix_memalign()
20188698343bSPeter Maydellconfig_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>'))
20195c8c714aSPeter Maydellconfig_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc'))
202088454f84SPeter Maydellconfig_host_data.set('CONFIG_VALLOC', cc.has_function('valloc'))
202188454f84SPeter Maydellconfig_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign'))
2022e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
20232b9f74efSPeter Maydellconfig_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
2024029ed1bdSKeno Fischerconfig_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np'))
2025e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
2026e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
2027e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
2028e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
2029e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
2030be7e89f6SPaolo Bonziniconfig_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
203159e35c7bSAndrew Deasonconfig_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
2032fc9a809eSPaolo Bonziniconfig_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice)
2033e66420acSPaolo Bonziniconfig_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
2034ed3b3f17SPaolo Bonziniconfig_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
203569d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
203666dc5f96SStefano Garzarellaif rbd.found()
203766dc5f96SStefano Garzarella  config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS',
203866dc5f96SStefano Garzarella                       cc.has_function('rbd_namespace_exists',
203966dc5f96SStefano Garzarella                                       dependencies: rbd,
204066dc5f96SStefano Garzarella                                       prefix: '#include <rbd/librbd.h>'))
204166dc5f96SStefano Garzarellaendif
2042911965acSLi Zhijianif rdma.found()
2043911965acSLi Zhijian  config_host_data.set('HAVE_IBV_ADVISE_MR',
2044911965acSLi Zhijian                       cc.has_function('ibv_advise_mr',
20453730a734SPaolo Bonzini                                       dependencies: rdma,
2046911965acSLi Zhijian                                       prefix: '#include <infiniband/verbs.h>'))
2047911965acSLi Zhijianendif
20482b9f74efSPeter Maydell
2049e66420acSPaolo Bonzini# has_header_symbol
20506d43eaa3SSam Liconfig_host_data.set('CONFIG_BLKZONED',
20516d43eaa3SSam Li                     cc.has_header_symbol('linux/blkzoned.h', 'BLKOPENZONE'))
2052e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_EPOLL_CREATE1',
2053e66420acSPaolo Bonzini                     cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
2054e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
2055e66420acSPaolo Bonzini                     cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
2056e66420acSPaolo Bonzini                     cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
2057e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
2058e66420acSPaolo Bonzini                     cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
2059e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FIEMAP',
2060e66420acSPaolo Bonzini                     cc.has_header('linux/fiemap.h') and
2061e66420acSPaolo Bonzini                     cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
2062be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_GETRANDOM',
2063be7e89f6SPaolo Bonzini                     cc.has_function('getrandom') and
2064be7e89f6SPaolo Bonzini                     cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
2065a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_INOTIFY',
2066a620fbe9SPaolo Bonzini                     cc.has_header_symbol('sys/inotify.h', 'inotify_init'))
2067a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_INOTIFY1',
2068a620fbe9SPaolo Bonzini                     cc.has_header_symbol('sys/inotify.h', 'inotify_init1'))
2069e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
2070e66420acSPaolo Bonzini                     cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
2071be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_RTNETLINK',
2072be7e89f6SPaolo Bonzini                     cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
2073be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_SYSMACROS',
2074be7e89f6SPaolo Bonzini                     cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
2075e1fbd2c4SPaolo Bonziniconfig_host_data.set('HAVE_OPTRESET',
2076e1fbd2c4SPaolo Bonzini                     cc.has_header_symbol('getopt.h', 'optreset'))
2077653163fcSMarc-André Lureauconfig_host_data.set('HAVE_IPPROTO_MPTCP',
2078653163fcSMarc-André Lureau                     cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
2079e66420acSPaolo Bonzini
2080e66420acSPaolo Bonzini# has_member
2081e66420acSPaolo Bonziniconfig_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
2082e66420acSPaolo Bonzini                     cc.has_member('struct sigevent', 'sigev_notify_thread_id',
2083e66420acSPaolo Bonzini                                   prefix: '#include <signal.h>'))
2084ed3b3f17SPaolo Bonziniconfig_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
2085ed3b3f17SPaolo Bonzini                     cc.has_member('struct stat', 'st_atim',
2086ed3b3f17SPaolo Bonzini                                   prefix: '#include <sys/stat.h>'))
20876d43eaa3SSam Liconfig_host_data.set('HAVE_BLK_ZONE_REP_CAPACITY',
20886d43eaa3SSam Li                     cc.has_member('struct blk_zone', 'capacity',
20896d43eaa3SSam Li                                   prefix: '#include <linux/blkzoned.h>'))
2090e66420acSPaolo Bonzini
20916a23f819SPaolo Bonzini# has_type
20926a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_IOVEC',
20936a23f819SPaolo Bonzini                     cc.has_type('struct iovec',
20946a23f819SPaolo Bonzini                                 prefix: '#include <sys/uio.h>'))
20956a23f819SPaolo Bonziniconfig_host_data.set('HAVE_UTMPX',
20966a23f819SPaolo Bonzini                     cc.has_type('struct utmpx',
20976a23f819SPaolo Bonzini                                 prefix: '#include <utmpx.h>'))
20986a23f819SPaolo Bonzini
2099904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_EVENTFD', cc.links('''
2100e1fbd2c4SPaolo Bonzini  #include <sys/eventfd.h>
2101e1fbd2c4SPaolo Bonzini  int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
2102904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
2103e1fbd2c4SPaolo Bonzini  #include <unistd.h>
2104e1fbd2c4SPaolo Bonzini  int main(void) {
2105e1fbd2c4SPaolo Bonzini  #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
2106e1fbd2c4SPaolo Bonzini  return fdatasync(0);
2107e1fbd2c4SPaolo Bonzini  #else
2108e1fbd2c4SPaolo Bonzini  #error Not supported
2109e1fbd2c4SPaolo Bonzini  #endif
2110e1fbd2c4SPaolo Bonzini  }'''))
21118900c204SAndrew Deason
21128900c204SAndrew Deasonhas_madvise = cc.links(gnu_source_prefix + '''
2113e1fbd2c4SPaolo Bonzini  #include <sys/types.h>
2114e1fbd2c4SPaolo Bonzini  #include <sys/mman.h>
2115e1fbd2c4SPaolo Bonzini  #include <stddef.h>
21168900c204SAndrew Deason  int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')
21178900c204SAndrew Deasonmissing_madvise_proto = false
21188900c204SAndrew Deasonif has_madvise
21198900c204SAndrew Deason  # Some platforms (illumos and Solaris before Solaris 11) provide madvise()
21208900c204SAndrew Deason  # but forget to prototype it. In this case, has_madvise will be true (the
21218900c204SAndrew Deason  # test program links despite a compile warning). To detect the
21228900c204SAndrew Deason  # missing-prototype case, we try again with a definitely-bogus prototype.
21238900c204SAndrew Deason  # This will only compile if the system headers don't provide the prototype;
21248900c204SAndrew Deason  # otherwise the conflicting prototypes will cause a compiler error.
21258900c204SAndrew Deason  missing_madvise_proto = cc.links(gnu_source_prefix + '''
21268900c204SAndrew Deason    #include <sys/types.h>
21278900c204SAndrew Deason    #include <sys/mman.h>
21288900c204SAndrew Deason    #include <stddef.h>
21298900c204SAndrew Deason    extern int madvise(int);
21308900c204SAndrew Deason    int main(void) { return madvise(0); }''')
21318900c204SAndrew Deasonendif
21328900c204SAndrew Deasonconfig_host_data.set('CONFIG_MADVISE', has_madvise)
21338900c204SAndrew Deasonconfig_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto)
21348900c204SAndrew Deason
2135904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
2136e1fbd2c4SPaolo Bonzini  #include <sys/mman.h>
2137e1fbd2c4SPaolo Bonzini  int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
2138904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
2139d47a8b3bSPaolo Bonzini  #include <fcntl.h>
2140d47a8b3bSPaolo Bonzini  #if !defined(AT_EMPTY_PATH)
2141d47a8b3bSPaolo Bonzini  # error missing definition
2142d47a8b3bSPaolo Bonzini  #else
2143d47a8b3bSPaolo Bonzini  int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
2144d47a8b3bSPaolo Bonzini  #endif'''))
2145904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
2146e1fbd2c4SPaolo Bonzini  #include <sys/mman.h>
2147e1fbd2c4SPaolo Bonzini  #include <stddef.h>
2148e1fbd2c4SPaolo Bonzini  int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
214910f6b231SPaolo Bonzini
21506a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + '''
215110f6b231SPaolo Bonzini  #include <pthread.h>
215210f6b231SPaolo Bonzini
215310f6b231SPaolo Bonzini  static void *f(void *p) { return NULL; }
215410f6b231SPaolo Bonzini  int main(void)
215510f6b231SPaolo Bonzini  {
215610f6b231SPaolo Bonzini    pthread_t thread;
215710f6b231SPaolo Bonzini    pthread_create(&thread, 0, f, 0);
215810f6b231SPaolo Bonzini    pthread_setname_np(thread, "QEMU");
215910f6b231SPaolo Bonzini    return 0;
216010f6b231SPaolo Bonzini  }''', dependencies: threads))
21616a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + '''
216210f6b231SPaolo Bonzini  #include <pthread.h>
216310f6b231SPaolo Bonzini
216410f6b231SPaolo Bonzini  static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
216510f6b231SPaolo Bonzini  int main(void)
216610f6b231SPaolo Bonzini  {
216710f6b231SPaolo Bonzini    pthread_t thread;
216810f6b231SPaolo Bonzini    pthread_create(&thread, 0, f, 0);
216910f6b231SPaolo Bonzini    return 0;
217010f6b231SPaolo Bonzini  }''', dependencies: threads))
21713ada67a3SBrad Smithconfig_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(gnu_source_prefix + '''
21723ada67a3SBrad Smith  #include <pthread.h>
21733ada67a3SBrad Smith  #include <pthread_np.h>
21743ada67a3SBrad Smith
21753ada67a3SBrad Smith  static void *f(void *p) { return NULL; }
21763ada67a3SBrad Smith  int main(void)
21773ada67a3SBrad Smith  {
21783ada67a3SBrad Smith    pthread_t thread;
21793ada67a3SBrad Smith    pthread_create(&thread, 0, f, 0);
21803ada67a3SBrad Smith    pthread_set_name_np(thread, "QEMU");
21813ada67a3SBrad Smith    return 0;
21823ada67a3SBrad Smith  }''', dependencies: threads))
2183657ac98bSLongpeng(Mike)config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + '''
2184657ac98bSLongpeng(Mike)  #include <pthread.h>
2185657ac98bSLongpeng(Mike)  #include <time.h>
2186657ac98bSLongpeng(Mike)
2187657ac98bSLongpeng(Mike)  int main(void)
2188657ac98bSLongpeng(Mike)  {
2189657ac98bSLongpeng(Mike)    pthread_condattr_t attr
2190657ac98bSLongpeng(Mike)    pthread_condattr_init(&attr);
2191657ac98bSLongpeng(Mike)    pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
2192657ac98bSLongpeng(Mike)    return 0;
2193657ac98bSLongpeng(Mike)  }''', dependencies: threads))
21947730f32cSDavid Hildenbrandconfig_host_data.set('CONFIG_PTHREAD_AFFINITY_NP', cc.links(gnu_source_prefix + '''
21957730f32cSDavid Hildenbrand  #include <pthread.h>
219610f6b231SPaolo Bonzini
21977730f32cSDavid Hildenbrand  static void *f(void *p) { return NULL; }
21987730f32cSDavid Hildenbrand  int main(void)
21997730f32cSDavid Hildenbrand  {
22007730f32cSDavid Hildenbrand    int setsize = CPU_ALLOC_SIZE(64);
22017730f32cSDavid Hildenbrand    pthread_t thread;
22027730f32cSDavid Hildenbrand    cpu_set_t *cpuset;
22037730f32cSDavid Hildenbrand    pthread_create(&thread, 0, f, 0);
22047730f32cSDavid Hildenbrand    cpuset = CPU_ALLOC(64);
22057730f32cSDavid Hildenbrand    CPU_ZERO_S(setsize, cpuset);
22067730f32cSDavid Hildenbrand    pthread_setaffinity_np(thread, setsize, cpuset);
22077730f32cSDavid Hildenbrand    pthread_getaffinity_np(thread, setsize, cpuset);
22087730f32cSDavid Hildenbrand    CPU_FREE(cpuset);
22097730f32cSDavid Hildenbrand    return 0;
22107730f32cSDavid Hildenbrand  }''', dependencies: threads))
2211904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
22126bd17dccSKacper Słomiński  #include <sys/signalfd.h>
22136bd17dccSKacper Słomiński  #include <stddef.h>
22146bd17dccSKacper Słomiński  int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
2215904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
2216a620fbe9SPaolo Bonzini  #include <unistd.h>
2217a620fbe9SPaolo Bonzini  #include <fcntl.h>
2218a620fbe9SPaolo Bonzini  #include <limits.h>
2219a620fbe9SPaolo Bonzini
2220a620fbe9SPaolo Bonzini  int main(void)
2221a620fbe9SPaolo Bonzini  {
2222a620fbe9SPaolo Bonzini    int len, fd = 0;
2223a620fbe9SPaolo Bonzini    len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
2224a620fbe9SPaolo Bonzini    splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
2225a620fbe9SPaolo Bonzini    return 0;
2226a620fbe9SPaolo Bonzini  }'''))
2227e1fbd2c4SPaolo Bonzini
222896a63aebSPaolo Bonziniconfig_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
222996a63aebSPaolo Bonzini  #include <sys/mman.h>
2230b5d3dac1SPaolo Bonzini  int main(void) {
223196a63aebSPaolo Bonzini    return mlockall(MCL_FUTURE);
223296a63aebSPaolo Bonzini  }'''))
223396a63aebSPaolo Bonzini
2234eea9453aSThomas Huthhave_l2tpv3 = false
223543a363aeSPaolo Bonziniif get_option('l2tpv3').allowed() and have_system
22366a23f819SPaolo Bonzini  have_l2tpv3 = cc.has_type('struct mmsghdr',
22376a23f819SPaolo Bonzini    prefix: gnu_source_prefix + '''
22386a23f819SPaolo Bonzini      #include <sys/socket.h>
22396a23f819SPaolo Bonzini      #include <linux/ip.h>''')
2240eea9453aSThomas Huthendif
2241eea9453aSThomas Huthconfig_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
2242eea9453aSThomas Huth
2243837b84b1SPaolo Bonzinihave_netmap = false
224443a363aeSPaolo Bonziniif get_option('netmap').allowed() and have_system
2245837b84b1SPaolo Bonzini  have_netmap = cc.compiles('''
2246837b84b1SPaolo Bonzini    #include <inttypes.h>
2247837b84b1SPaolo Bonzini    #include <net/if.h>
2248837b84b1SPaolo Bonzini    #include <net/netmap.h>
2249837b84b1SPaolo Bonzini    #include <net/netmap_user.h>
2250837b84b1SPaolo Bonzini    #if (NETMAP_API < 11) || (NETMAP_API > 15)
2251837b84b1SPaolo Bonzini    #error
2252837b84b1SPaolo Bonzini    #endif
2253837b84b1SPaolo Bonzini    int main(void) { return 0; }''')
2254837b84b1SPaolo Bonzini  if not have_netmap and get_option('netmap').enabled()
2255837b84b1SPaolo Bonzini    error('Netmap headers not available')
2256837b84b1SPaolo Bonzini  endif
2257837b84b1SPaolo Bonziniendif
2258837b84b1SPaolo Bonziniconfig_host_data.set('CONFIG_NETMAP', have_netmap)
2259837b84b1SPaolo Bonzini
226096a63aebSPaolo Bonzini# Work around a system header bug with some kernel/XFS header
226196a63aebSPaolo Bonzini# versions where they both try to define 'struct fsxattr':
226296a63aebSPaolo Bonzini# xfs headers will not try to redefine structs from linux headers
226396a63aebSPaolo Bonzini# if this macro is set.
226496a63aebSPaolo Bonziniconfig_host_data.set('HAVE_FSXATTR', cc.links('''
22656a23f819SPaolo Bonzini  #include <linux/fs.h>
226696a63aebSPaolo Bonzini  struct fsxattr foo;
226796a63aebSPaolo Bonzini  int main(void) {
226896a63aebSPaolo Bonzini    return 0;
226996a63aebSPaolo Bonzini  }'''))
227096a63aebSPaolo Bonzini
2271e46bd55dSPaolo Bonzini# Some versions of Mac OS X incorrectly define SIZE_MAX
2272e46bd55dSPaolo Bonziniconfig_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
2273e46bd55dSPaolo Bonzini    #include <stdint.h>
2274e46bd55dSPaolo Bonzini    #include <stdio.h>
2275b5d3dac1SPaolo Bonzini    int main(void) {
2276e46bd55dSPaolo Bonzini        return printf("%zu", SIZE_MAX);
2277e46bd55dSPaolo Bonzini    }''', args: ['-Werror']))
2278e46bd55dSPaolo Bonzini
2279e61f1efeSRichard Henderson# See if 64-bit atomic operations are supported.
2280e61f1efeSRichard Henderson# Note that without __atomic builtins, we can only
2281e61f1efeSRichard Henderson# assume atomic loads/stores max at pointer size.
2282e61f1efeSRichard Hendersonconfig_host_data.set('CONFIG_ATOMIC64', cc.links('''
2283bd87a367SPaolo Bonzini  #include <stdint.h>
2284bd87a367SPaolo Bonzini  int main(void)
2285bd87a367SPaolo Bonzini  {
2286e61f1efeSRichard Henderson    uint64_t x = 0, y = 0;
2287bd87a367SPaolo Bonzini    y = __atomic_load_n(&x, __ATOMIC_RELAXED);
2288bd87a367SPaolo Bonzini    __atomic_store_n(&x, y, __ATOMIC_RELAXED);
2289bd87a367SPaolo Bonzini    __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2290bd87a367SPaolo Bonzini    __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
2291bd87a367SPaolo Bonzini    __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
2292bd87a367SPaolo Bonzini    return 0;
2293e61f1efeSRichard Henderson  }'''))
2294bd87a367SPaolo Bonzini
2295848126d1SMarc-André Lureauhas_int128 = cc.links('''
2296848126d1SMarc-André Lureau  __int128_t a;
2297848126d1SMarc-André Lureau  __uint128_t b;
2298848126d1SMarc-André Lureau  int main (void) {
2299848126d1SMarc-André Lureau    a = a + b;
2300848126d1SMarc-André Lureau    b = a * b;
2301848126d1SMarc-André Lureau    a = a * a;
2302848126d1SMarc-André Lureau    return 0;
2303848126d1SMarc-André Lureau  }''')
2304848126d1SMarc-André Lureau
2305848126d1SMarc-André Lureauconfig_host_data.set('CONFIG_INT128', has_int128)
2306848126d1SMarc-André Lureau
2307848126d1SMarc-André Lureauif has_int128
2308d2958fb0SMarc-André Lureau  # "do we have 128-bit atomics which are handled inline and specifically not
2309d2958fb0SMarc-André Lureau  # via libatomic". The reason we can't use libatomic is documented in the
2310d2958fb0SMarc-André Lureau  # comment starting "GCC is a house divided" in include/qemu/atomic128.h.
2311e61f1efeSRichard Henderson  # We only care about these operations on 16-byte aligned pointers, so
2312e61f1efeSRichard Henderson  # force 16-byte alignment of the pointer, which may be greater than
2313e61f1efeSRichard Henderson  # __alignof(unsigned __int128) for the host.
2314e61f1efeSRichard Henderson  atomic_test_128 = '''
2315e61f1efeSRichard Henderson    int main(int ac, char **av) {
2316e61f1efeSRichard Henderson      unsigned __int128 *p = __builtin_assume_aligned(av[ac - 1], sizeof(16));
2317e61f1efeSRichard Henderson      p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED);
2318e61f1efeSRichard Henderson      __atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED);
2319e61f1efeSRichard Henderson      __atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2320e61f1efeSRichard Henderson      return 0;
2321e61f1efeSRichard Henderson    }'''
2322e61f1efeSRichard Henderson  has_atomic128 = cc.links(atomic_test_128)
2323848126d1SMarc-André Lureau
2324848126d1SMarc-André Lureau  config_host_data.set('CONFIG_ATOMIC128', has_atomic128)
2325848126d1SMarc-André Lureau
2326848126d1SMarc-André Lureau  if not has_atomic128
2327e61f1efeSRichard Henderson    # Even with __builtin_assume_aligned, the above test may have failed
2328e61f1efeSRichard Henderson    # without optimization enabled.  Try again with optimizations locally
2329e61f1efeSRichard Henderson    # enabled for the function.  See
2330e61f1efeSRichard Henderson    #   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107389
2331e61f1efeSRichard Henderson    has_atomic128_opt = cc.links('__attribute__((optimize("O1")))' + atomic_test_128)
2332e61f1efeSRichard Henderson    config_host_data.set('CONFIG_ATOMIC128_OPT', has_atomic128_opt)
2333e61f1efeSRichard Henderson
2334e61f1efeSRichard Henderson    if not has_atomic128_opt
2335e61f1efeSRichard Henderson      config_host_data.set('CONFIG_CMPXCHG128', cc.links('''
2336848126d1SMarc-André Lureau        int main(void)
2337848126d1SMarc-André Lureau        {
2338848126d1SMarc-André Lureau          unsigned __int128 x = 0, y = 0;
2339848126d1SMarc-André Lureau          __sync_val_compare_and_swap_16(&x, y, x);
2340848126d1SMarc-André Lureau          return 0;
2341848126d1SMarc-André Lureau        }
2342e61f1efeSRichard Henderson      '''))
2343e61f1efeSRichard Henderson    endif
2344848126d1SMarc-André Lureau  endif
2345848126d1SMarc-André Lureauendif
2346bd87a367SPaolo Bonzini
2347bd87a367SPaolo Bonziniconfig_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
2348bd87a367SPaolo Bonzini  #include <sys/auxv.h>
2349bd87a367SPaolo Bonzini  int main(void) {
2350bd87a367SPaolo Bonzini    return getauxval(AT_HWCAP) == 0;
2351bd87a367SPaolo Bonzini  }'''))
2352bd87a367SPaolo Bonzini
23530dae95d4SPaolo Bonziniconfig_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles('''
23540dae95d4SPaolo Bonzini  #include <linux/usbdevice_fs.h>
23550dae95d4SPaolo Bonzini
23560dae95d4SPaolo Bonzini  #ifndef USBDEVFS_GET_CAPABILITIES
23570dae95d4SPaolo Bonzini  #error "USBDEVFS_GET_CAPABILITIES undefined"
23580dae95d4SPaolo Bonzini  #endif
23590dae95d4SPaolo Bonzini
23600dae95d4SPaolo Bonzini  #ifndef USBDEVFS_DISCONNECT_CLAIM
23610dae95d4SPaolo Bonzini  #error "USBDEVFS_DISCONNECT_CLAIM undefined"
23620dae95d4SPaolo Bonzini  #endif
23630dae95d4SPaolo Bonzini
23640dae95d4SPaolo Bonzini  int main(void) { return 0; }'''))
23650dae95d4SPaolo Bonzini
23662edd2c04SPaolo Bonzinihave_keyring = get_option('keyring') \
23672edd2c04SPaolo Bonzini  .require(targetos == 'linux', error_message: 'keyring is only available on Linux') \
23682edd2c04SPaolo Bonzini  .require(cc.compiles('''
23692edd2c04SPaolo Bonzini    #include <errno.h>
23702edd2c04SPaolo Bonzini    #include <asm/unistd.h>
23712edd2c04SPaolo Bonzini    #include <linux/keyctl.h>
23722edd2c04SPaolo Bonzini    #include <sys/syscall.h>
23732edd2c04SPaolo Bonzini    #include <unistd.h>
23742edd2c04SPaolo Bonzini    int main(void) {
23752edd2c04SPaolo Bonzini        return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
23762edd2c04SPaolo Bonzini    }'''), error_message: 'keyctl syscall not available on this system').allowed()
23772edd2c04SPaolo Bonziniconfig_host_data.set('CONFIG_SECRET_KEYRING', have_keyring)
23782edd2c04SPaolo Bonzini
2379622753d2SPaolo Bonzinihave_cpuid_h = cc.links('''
2380622753d2SPaolo Bonzini  #include <cpuid.h>
2381622753d2SPaolo Bonzini  int main(void) {
2382622753d2SPaolo Bonzini    unsigned a, b, c, d;
2383622753d2SPaolo Bonzini    unsigned max = __get_cpuid_max(0, 0);
2384622753d2SPaolo Bonzini
2385622753d2SPaolo Bonzini    if (max >= 1) {
2386622753d2SPaolo Bonzini        __cpuid(1, a, b, c, d);
2387622753d2SPaolo Bonzini    }
2388622753d2SPaolo Bonzini
2389622753d2SPaolo Bonzini    if (max >= 7) {
2390622753d2SPaolo Bonzini        __cpuid_count(7, 0, a, b, c, d);
2391622753d2SPaolo Bonzini    }
2392622753d2SPaolo Bonzini
2393622753d2SPaolo Bonzini    return 0;
2394622753d2SPaolo Bonzini  }''')
2395622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_CPUID_H', have_cpuid_h)
2396622753d2SPaolo Bonzini
2397622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \
2398622753d2SPaolo Bonzini  .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \
2399622753d2SPaolo Bonzini  .require(cc.links('''
2400622753d2SPaolo Bonzini    #include <cpuid.h>
2401622753d2SPaolo Bonzini    #include <immintrin.h>
2402701ea587SRichard Henderson    static int __attribute__((target("avx2"))) bar(void *a) {
2403622753d2SPaolo Bonzini      __m256i x = *(__m256i *)a;
2404622753d2SPaolo Bonzini      return _mm256_testz_si256(x, x);
2405622753d2SPaolo Bonzini    }
2406b5d3dac1SPaolo Bonzini    int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
2407622753d2SPaolo Bonzini  '''), error_message: 'AVX2 not available').allowed())
2408622753d2SPaolo Bonzini
2409622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_AVX512F_OPT', get_option('avx512f') \
2410622753d2SPaolo Bonzini  .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512F') \
2411622753d2SPaolo Bonzini  .require(cc.links('''
2412622753d2SPaolo Bonzini    #include <cpuid.h>
2413622753d2SPaolo Bonzini    #include <immintrin.h>
2414701ea587SRichard Henderson    static int __attribute__((target("avx512f"))) bar(void *a) {
2415622753d2SPaolo Bonzini      __m512i x = *(__m512i *)a;
2416622753d2SPaolo Bonzini      return _mm512_test_epi64_mask(x, x);
2417622753d2SPaolo Bonzini    }
2418b5d3dac1SPaolo Bonzini    int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
2419622753d2SPaolo Bonzini  '''), error_message: 'AVX512F not available').allowed())
2420622753d2SPaolo Bonzini
242104ffce13Sling xuconfig_host_data.set('CONFIG_AVX512BW_OPT', get_option('avx512bw') \
242204ffce13Sling xu  .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512BW') \
242304ffce13Sling xu  .require(cc.links('''
242404ffce13Sling xu    #include <cpuid.h>
242504ffce13Sling xu    #include <immintrin.h>
2426dc165fcdSRichard Henderson    static int __attribute__((target("avx512bw"))) bar(void *a) {
242704ffce13Sling xu      __m512i *x = a;
242804ffce13Sling xu      __m512i res= _mm512_abs_epi8(*x);
242904ffce13Sling xu      return res[1];
243004ffce13Sling xu    }
243104ffce13Sling xu    int main(int argc, char *argv[]) { return bar(argv[0]); }
243204ffce13Sling xu  '''), error_message: 'AVX512BW not available').allowed())
243304ffce13Sling xu
24343730a734SPaolo Bonzinihave_pvrdma = get_option('pvrdma') \
24353730a734SPaolo Bonzini  .require(rdma.found(), error_message: 'PVRDMA requires OpenFabrics libraries') \
2436354d2d9bSJuan Quintela  .require(cc.compiles(gnu_source_prefix + '''
2437354d2d9bSJuan Quintela    #include <sys/mman.h>
24383730a734SPaolo Bonzini    int main(void)
24393730a734SPaolo Bonzini    {
24403730a734SPaolo Bonzini      char buf = 0;
24413730a734SPaolo Bonzini      void *addr = &buf;
24423730a734SPaolo Bonzini      addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
24433730a734SPaolo Bonzini
24443730a734SPaolo Bonzini      return 0;
24453730a734SPaolo Bonzini    }'''), error_message: 'PVRDMA requires mremap').allowed()
24463730a734SPaolo Bonzini
24473730a734SPaolo Bonziniif have_pvrdma
2448354d2d9bSJuan Quintela  config_host_data.set('LEGACY_RDMA_REG_MR', not cc.links('''
24493730a734SPaolo Bonzini    #include <infiniband/verbs.h>
24503730a734SPaolo Bonzini    int main(void)
24513730a734SPaolo Bonzini    {
24523730a734SPaolo Bonzini      struct ibv_mr *mr;
24533730a734SPaolo Bonzini      struct ibv_pd *pd = NULL;
24543730a734SPaolo Bonzini      size_t length = 10;
24553730a734SPaolo Bonzini      uint64_t iova = 0;
24563730a734SPaolo Bonzini      int access = 0;
24573730a734SPaolo Bonzini      void *addr = NULL;
24583730a734SPaolo Bonzini
24593730a734SPaolo Bonzini      mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
24603730a734SPaolo Bonzini      ibv_dereg_mr(mr);
24613730a734SPaolo Bonzini      return 0;
24623730a734SPaolo Bonzini    }'''))
24633730a734SPaolo Bonziniendif
24643730a734SPaolo Bonzini
2465b87df904SPaolo Bonziniif get_option('membarrier').disabled()
2466b87df904SPaolo Bonzini  have_membarrier = false
2467b87df904SPaolo Bonzinielif targetos == 'windows'
2468b87df904SPaolo Bonzini  have_membarrier = true
2469b87df904SPaolo Bonzinielif targetos == 'linux'
2470b87df904SPaolo Bonzini  have_membarrier = cc.compiles('''
2471b87df904SPaolo Bonzini    #include <linux/membarrier.h>
2472b87df904SPaolo Bonzini    #include <sys/syscall.h>
2473b87df904SPaolo Bonzini    #include <unistd.h>
2474b87df904SPaolo Bonzini    #include <stdlib.h>
2475b87df904SPaolo Bonzini    int main(void) {
2476b87df904SPaolo Bonzini        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
2477b87df904SPaolo Bonzini        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
2478b87df904SPaolo Bonzini        exit(0);
2479b87df904SPaolo Bonzini    }''')
2480b87df904SPaolo Bonziniendif
2481b87df904SPaolo Bonziniconfig_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \
2482b87df904SPaolo Bonzini  .require(have_membarrier, error_message: 'membarrier system call not available') \
2483b87df904SPaolo Bonzini  .allowed())
2484b87df904SPaolo Bonzini
248534b52615SPaolo Bonzinihave_afalg = get_option('crypto_afalg') \
248634b52615SPaolo Bonzini  .require(cc.compiles(gnu_source_prefix + '''
248734b52615SPaolo Bonzini    #include <errno.h>
248834b52615SPaolo Bonzini    #include <sys/types.h>
248934b52615SPaolo Bonzini    #include <sys/socket.h>
249034b52615SPaolo Bonzini    #include <linux/if_alg.h>
249134b52615SPaolo Bonzini    int main(void) {
249234b52615SPaolo Bonzini      int sock;
249334b52615SPaolo Bonzini      sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
249434b52615SPaolo Bonzini      return sock;
249534b52615SPaolo Bonzini    }
249634b52615SPaolo Bonzini  '''), error_message: 'AF_ALG requested but could not be detected').allowed()
249734b52615SPaolo Bonziniconfig_host_data.set('CONFIG_AF_ALG', have_afalg)
249834b52615SPaolo Bonzini
24999d734b85SMarc-André Lureauconfig_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
25009d734b85SMarc-André Lureau  'linux/vm_sockets.h', 'AF_VSOCK',
25019d734b85SMarc-André Lureau  prefix: '#include <sys/socket.h>',
25029d734b85SMarc-André Lureau))
2503bd87a367SPaolo Bonzini
25048821a389SMarc-André Lureauhave_vss = false
2505872b69e6SMarc-André Lureauhave_vss_sdk = false # old xp/2003 SDK
25068821a389SMarc-André Lureauif targetos == 'windows' and link_language == 'cpp'
25078821a389SMarc-André Lureau  have_vss = cxx.compiles('''
25088821a389SMarc-André Lureau    #define __MIDL_user_allocate_free_DEFINED__
250932478cb6SMarc-André Lureau    #include <vss.h>
25108821a389SMarc-André Lureau    int main(void) { return VSS_CTX_BACKUP; }''')
2511872b69e6SMarc-André Lureau  have_vss_sdk = cxx.has_header('vscoordint.h')
25128821a389SMarc-André Lureauendif
2513872b69e6SMarc-André Lureauconfig_host_data.set('HAVE_VSS_SDK', have_vss_sdk)
25148821a389SMarc-André Lureau
2515859aef02SPaolo Bonziniforeach k, v: config_host
2516ce6119dcSPaolo Bonzini  if k.startswith('CONFIG_')
2517859aef02SPaolo Bonzini    config_host_data.set(k, v == 'y' ? 1 : v)
2518859aef02SPaolo Bonzini  endif
2519859aef02SPaolo Bonziniendforeach
2520859aef02SPaolo Bonzini
25216391c772SRichard Henderson# Older versions of MinGW do not import _lock_file and _unlock_file properly.
25226391c772SRichard Henderson# This was fixed for v6.0.0 with commit b48e3ac8969d.
25236391c772SRichard Hendersonif targetos == 'windows'
25246391c772SRichard Henderson  config_host_data.set('HAVE__LOCK_FILE', cc.links('''
25256391c772SRichard Henderson    #include <stdio.h>
25266391c772SRichard Henderson    int main(void) {
25276391c772SRichard Henderson      _lock_file(NULL);
25286391c772SRichard Henderson      _unlock_file(NULL);
25296391c772SRichard Henderson      return 0;
25306391c772SRichard Henderson    }''', name: '_lock_file and _unlock_file'))
25316391c772SRichard Hendersonendif
25326391c772SRichard Henderson
2533dbd672c8SPierrick Bouvierif targetos == 'windows'
2534dbd672c8SPierrick Bouvier  mingw_has_setjmp_longjmp = cc.links('''
2535dbd672c8SPierrick Bouvier    #include <setjmp.h>
2536dbd672c8SPierrick Bouvier    int main(void) {
2537dbd672c8SPierrick Bouvier      /*
2538dbd672c8SPierrick Bouvier       * These functions are not available in setjmp header, but may be
2539dbd672c8SPierrick Bouvier       * available at link time, from libmingwex.a.
2540dbd672c8SPierrick Bouvier       */
2541dbd672c8SPierrick Bouvier      extern int __mingw_setjmp(jmp_buf);
2542dbd672c8SPierrick Bouvier      extern void __attribute__((noreturn)) __mingw_longjmp(jmp_buf, int);
2543dbd672c8SPierrick Bouvier      jmp_buf env;
2544dbd672c8SPierrick Bouvier      __mingw_setjmp(env);
2545dbd672c8SPierrick Bouvier      __mingw_longjmp(env, 0);
2546dbd672c8SPierrick Bouvier    }
2547dbd672c8SPierrick Bouvier  ''', name: 'mingw setjmp and longjmp')
2548dbd672c8SPierrick Bouvier
2549dbd672c8SPierrick Bouvier  if cpu == 'aarch64' and not mingw_has_setjmp_longjmp
2550dbd672c8SPierrick Bouvier    error('mingw must provide setjmp/longjmp for windows-arm64')
2551dbd672c8SPierrick Bouvier  endif
2552dbd672c8SPierrick Bouvierendif
2553dbd672c8SPierrick Bouvier
2554a0c9162cSPaolo Bonzini########################
2555a0c9162cSPaolo Bonzini# Target configuration #
2556a0c9162cSPaolo Bonzini########################
2557a0c9162cSPaolo Bonzini
25582becc36aSPaolo Bonziniminikconf = find_program('scripts/minikconf.py')
255905512f55SPaolo Bonziniconfig_all = {}
2560a98006bcSPaolo Bonziniconfig_all_devices = {}
2561ca0fc784SPaolo Bonziniconfig_all_disas = {}
25622becc36aSPaolo Bonziniconfig_devices_mak_list = []
25632becc36aSPaolo Bonziniconfig_devices_h = {}
2564859aef02SPaolo Bonziniconfig_target_h = {}
25652becc36aSPaolo Bonziniconfig_target_mak = {}
2566ca0fc784SPaolo Bonzini
2567ca0fc784SPaolo Bonzinidisassemblers = {
2568ca0fc784SPaolo Bonzini  'alpha' : ['CONFIG_ALPHA_DIS'],
2569ca0fc784SPaolo Bonzini  'avr' : ['CONFIG_AVR_DIS'],
2570ca0fc784SPaolo Bonzini  'cris' : ['CONFIG_CRIS_DIS'],
25713e7a84eeSTaylor Simpson  'hexagon' : ['CONFIG_HEXAGON_DIS'],
2572ca0fc784SPaolo Bonzini  'hppa' : ['CONFIG_HPPA_DIS'],
2573ca0fc784SPaolo Bonzini  'i386' : ['CONFIG_I386_DIS'],
2574ca0fc784SPaolo Bonzini  'x86_64' : ['CONFIG_I386_DIS'],
2575ca0fc784SPaolo Bonzini  'm68k' : ['CONFIG_M68K_DIS'],
2576ca0fc784SPaolo Bonzini  'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
2577ca0fc784SPaolo Bonzini  'mips' : ['CONFIG_MIPS_DIS'],
2578ca0fc784SPaolo Bonzini  'nios2' : ['CONFIG_NIOS2_DIS'],
2579ca0fc784SPaolo Bonzini  'or1k' : ['CONFIG_OPENRISC_DIS'],
2580ca0fc784SPaolo Bonzini  'ppc' : ['CONFIG_PPC_DIS'],
2581ca0fc784SPaolo Bonzini  'riscv' : ['CONFIG_RISCV_DIS'],
2582ca0fc784SPaolo Bonzini  'rx' : ['CONFIG_RX_DIS'],
2583ca0fc784SPaolo Bonzini  's390' : ['CONFIG_S390_DIS'],
2584ca0fc784SPaolo Bonzini  'sh4' : ['CONFIG_SH4_DIS'],
2585ca0fc784SPaolo Bonzini  'sparc' : ['CONFIG_SPARC_DIS'],
2586ca0fc784SPaolo Bonzini  'xtensa' : ['CONFIG_XTENSA_DIS'],
2587aae1746cSSong Gao  'loongarch' : ['CONFIG_LOONGARCH_DIS'],
2588ca0fc784SPaolo Bonzini}
2589ca0fc784SPaolo Bonzini
2590e1fbd2c4SPaolo Bonzinihave_ivshmem = config_host_data.get('CONFIG_EVENTFD')
25910a189110SPaolo Bonzinihost_kconfig = \
2592537b7248SPaolo Bonzini  (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
25930d04c4c9SPaolo Bonzini  (have_tpm ? ['CONFIG_TPM=y'] : []) + \
25943f0a5d55SMarc-André Lureau  (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
2595ccd250aaSPaolo Bonzini  (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
259688b6e618SPaolo Bonzini  (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \
25979d71037fSPaolo Bonzini  (x11.found() ? ['CONFIG_X11=y'] : []) + \
25982a3129a3SPaolo Bonzini  (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \
25992a3129a3SPaolo Bonzini  (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \
26002a3129a3SPaolo Bonzini  (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
260169202b40SPaolo Bonzini  (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
26020a189110SPaolo Bonzini  ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
26033730a734SPaolo Bonzini  (have_pvrdma ? ['CONFIG_PVRDMA=y'] : []) + \
260455116968SJagannathan Raman  (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \
260555116968SJagannathan Raman  (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : [])
26060a189110SPaolo Bonzini
2607a9a74907SPaolo Bonziniignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
2608ca0fc784SPaolo Bonzini
2609fdb75aefSPaolo Bonzinidefault_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
2610fdb75aefSPaolo Bonziniactual_target_dirs = []
2611fbb4121dSPaolo Bonzinifdt_required = []
2612a81df1b6SPaolo Bonziniforeach target : target_dirs
2613765686d6SPaolo Bonzini  config_target = { 'TARGET_NAME': target.split('-')[0] }
2614765686d6SPaolo Bonzini  if target.endswith('linux-user')
2615fdb75aefSPaolo Bonzini    if targetos != 'linux'
2616fdb75aefSPaolo Bonzini      if default_targets
2617fdb75aefSPaolo Bonzini        continue
2618fdb75aefSPaolo Bonzini      endif
2619fdb75aefSPaolo Bonzini      error('Target @0@ is only available on a Linux host'.format(target))
2620fdb75aefSPaolo Bonzini    endif
2621765686d6SPaolo Bonzini    config_target += { 'CONFIG_LINUX_USER': 'y' }
2622765686d6SPaolo Bonzini  elif target.endswith('bsd-user')
2623fdb75aefSPaolo Bonzini    if 'CONFIG_BSD' not in config_host
2624fdb75aefSPaolo Bonzini      if default_targets
2625fdb75aefSPaolo Bonzini        continue
2626fdb75aefSPaolo Bonzini      endif
2627fdb75aefSPaolo Bonzini      error('Target @0@ is only available on a BSD host'.format(target))
2628fdb75aefSPaolo Bonzini    endif
2629765686d6SPaolo Bonzini    config_target += { 'CONFIG_BSD_USER': 'y' }
2630765686d6SPaolo Bonzini  elif target.endswith('softmmu')
2631765686d6SPaolo Bonzini    config_target += { 'CONFIG_SOFTMMU': 'y' }
2632765686d6SPaolo Bonzini  endif
2633765686d6SPaolo Bonzini  if target.endswith('-user')
2634765686d6SPaolo Bonzini    config_target += {
2635765686d6SPaolo Bonzini      'CONFIG_USER_ONLY': 'y',
2636765686d6SPaolo Bonzini      'CONFIG_QEMU_INTERP_PREFIX':
2637ce6119dcSPaolo Bonzini        get_option('interp_prefix').replace('%M', config_target['TARGET_NAME'])
2638765686d6SPaolo Bonzini    }
2639765686d6SPaolo Bonzini  endif
2640859aef02SPaolo Bonzini
26410a189110SPaolo Bonzini  accel_kconfig = []
26428a19980eSPaolo Bonzini  foreach sym: accelerators
26438a19980eSPaolo Bonzini    if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
26448a19980eSPaolo Bonzini      config_target += { sym: 'y' }
26458a19980eSPaolo Bonzini      config_all += { sym: 'y' }
2646dae0ec15SGerd Hoffmann      if target in modular_tcg
2647dae0ec15SGerd Hoffmann        config_target += { 'CONFIG_TCG_MODULAR': 'y' }
2648dae0ec15SGerd Hoffmann      else
2649dae0ec15SGerd Hoffmann        config_target += { 'CONFIG_TCG_BUILTIN': 'y' }
2650dae0ec15SGerd Hoffmann      endif
26510a189110SPaolo Bonzini      accel_kconfig += [ sym + '=y' ]
26528a19980eSPaolo Bonzini    endif
26538a19980eSPaolo Bonzini  endforeach
26540a189110SPaolo Bonzini  if accel_kconfig.length() == 0
2655fdb75aefSPaolo Bonzini    if default_targets
2656fdb75aefSPaolo Bonzini      continue
2657fdb75aefSPaolo Bonzini    endif
2658fdb75aefSPaolo Bonzini    error('No accelerator available for target @0@'.format(target))
2659fdb75aefSPaolo Bonzini  endif
26608a19980eSPaolo Bonzini
2661fdb75aefSPaolo Bonzini  actual_target_dirs += target
2662812b31d3SAlex Bennée  config_target += keyval.load('configs/targets' / target + '.mak')
2663a9a74907SPaolo Bonzini  config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
2664765686d6SPaolo Bonzini
2665fbb4121dSPaolo Bonzini  if 'TARGET_NEED_FDT' in config_target
2666fbb4121dSPaolo Bonzini    fdt_required += target
2667fbb4121dSPaolo Bonzini  endif
2668fbb4121dSPaolo Bonzini
2669fa73168bSPaolo Bonzini  # Add default keys
2670fa73168bSPaolo Bonzini  if 'TARGET_BASE_ARCH' not in config_target
2671fa73168bSPaolo Bonzini    config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
2672fa73168bSPaolo Bonzini  endif
2673fa73168bSPaolo Bonzini  if 'TARGET_ABI_DIR' not in config_target
2674fa73168bSPaolo Bonzini    config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
2675fa73168bSPaolo Bonzini  endif
2676ee3eb3a7SMarc-André Lureau  if 'TARGET_BIG_ENDIAN' not in config_target
2677ee3eb3a7SMarc-André Lureau    config_target += {'TARGET_BIG_ENDIAN': 'n'}
2678ee3eb3a7SMarc-André Lureau  endif
2679859aef02SPaolo Bonzini
2680ca0fc784SPaolo Bonzini  foreach k, v: disassemblers
2681823eb013SPaolo Bonzini    if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
2682ca0fc784SPaolo Bonzini      foreach sym: v
2683ca0fc784SPaolo Bonzini        config_target += { sym: 'y' }
2684ca0fc784SPaolo Bonzini        config_all_disas += { sym: 'y' }
2685ca0fc784SPaolo Bonzini      endforeach
2686ca0fc784SPaolo Bonzini    endif
2687ca0fc784SPaolo Bonzini  endforeach
2688ca0fc784SPaolo Bonzini
2689859aef02SPaolo Bonzini  config_target_data = configuration_data()
2690859aef02SPaolo Bonzini  foreach k, v: config_target
2691859aef02SPaolo Bonzini    if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
2692859aef02SPaolo Bonzini      # do nothing
2693859aef02SPaolo Bonzini    elif ignored.contains(k)
2694859aef02SPaolo Bonzini      # do nothing
2695859aef02SPaolo Bonzini    elif k == 'TARGET_BASE_ARCH'
2696a9a74907SPaolo Bonzini      # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
2697a9a74907SPaolo Bonzini      # not used to select files from sourcesets.
2698859aef02SPaolo Bonzini      config_target_data.set('TARGET_' + v.to_upper(), 1)
2699765686d6SPaolo Bonzini    elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
2700859aef02SPaolo Bonzini      config_target_data.set_quoted(k, v)
2701859aef02SPaolo Bonzini    elif v == 'y'
2702859aef02SPaolo Bonzini      config_target_data.set(k, 1)
2703ee3eb3a7SMarc-André Lureau    elif v == 'n'
2704ee3eb3a7SMarc-André Lureau      config_target_data.set(k, 0)
2705859aef02SPaolo Bonzini    else
2706859aef02SPaolo Bonzini      config_target_data.set(k, v)
2707859aef02SPaolo Bonzini    endif
2708859aef02SPaolo Bonzini  endforeach
2709cb2c5531SPeter Maydell  config_target_data.set('QEMU_ARCH',
2710cb2c5531SPeter Maydell                         'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
2711859aef02SPaolo Bonzini  config_target_h += {target: configure_file(output: target + '-config-target.h',
2712859aef02SPaolo Bonzini                                               configuration: config_target_data)}
27132becc36aSPaolo Bonzini
27142becc36aSPaolo Bonzini  if target.endswith('-softmmu')
2715d1d5e9eeSAlex Bennée    config_input = meson.get_external_property(target, 'default')
27162becc36aSPaolo Bonzini    config_devices_mak = target + '-config-devices.mak'
27172becc36aSPaolo Bonzini    config_devices_mak = configure_file(
2718d1d5e9eeSAlex Bennée      input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
27192becc36aSPaolo Bonzini      output: config_devices_mak,
27202becc36aSPaolo Bonzini      depfile: config_devices_mak + '.d',
27212becc36aSPaolo Bonzini      capture: true,
27227bc3ca7fSPaolo Bonzini      command: [minikconf,
27237bc3ca7fSPaolo Bonzini                get_option('default_devices') ? '--defconfig' : '--allnoconfig',
27242becc36aSPaolo Bonzini                config_devices_mak, '@DEPFILE@', '@INPUT@',
2725f4063f9cSPhilippe Mathieu-Daudé                host_kconfig, accel_kconfig,
2726f4063f9cSPhilippe Mathieu-Daudé                'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'])
2727859aef02SPaolo Bonzini
2728859aef02SPaolo Bonzini    config_devices_data = configuration_data()
2729859aef02SPaolo Bonzini    config_devices = keyval.load(config_devices_mak)
2730859aef02SPaolo Bonzini    foreach k, v: config_devices
2731859aef02SPaolo Bonzini      config_devices_data.set(k, 1)
2732859aef02SPaolo Bonzini    endforeach
27332becc36aSPaolo Bonzini    config_devices_mak_list += config_devices_mak
2734859aef02SPaolo Bonzini    config_devices_h += {target: configure_file(output: target + '-config-devices.h',
2735859aef02SPaolo Bonzini                                                configuration: config_devices_data)}
2736859aef02SPaolo Bonzini    config_target += config_devices
2737a98006bcSPaolo Bonzini    config_all_devices += config_devices
27382becc36aSPaolo Bonzini  endif
27392becc36aSPaolo Bonzini  config_target_mak += {target: config_target}
2740a81df1b6SPaolo Bonziniendforeach
2741fdb75aefSPaolo Bonzinitarget_dirs = actual_target_dirs
2742a81df1b6SPaolo Bonzini
27432becc36aSPaolo Bonzini# This configuration is used to build files that are shared by
27442becc36aSPaolo Bonzini# multiple binaries, and then extracted out of the "common"
27452becc36aSPaolo Bonzini# static_library target.
27462becc36aSPaolo Bonzini#
27472becc36aSPaolo Bonzini# We do not use all_sources()/all_dependencies(), because it would
27482becc36aSPaolo Bonzini# build literally all source files, including devices only used by
27492becc36aSPaolo Bonzini# targets that are not built for this compilation.  The CONFIG_ALL
27502becc36aSPaolo Bonzini# pseudo symbol replaces it.
27512becc36aSPaolo Bonzini
275205512f55SPaolo Bonziniconfig_all += config_all_devices
27532becc36aSPaolo Bonziniconfig_all += config_host
27542becc36aSPaolo Bonziniconfig_all += config_all_disas
27552becc36aSPaolo Bonziniconfig_all += {
275614efd8d3SPaolo Bonzini  'CONFIG_XEN': xen.found(),
27572becc36aSPaolo Bonzini  'CONFIG_SOFTMMU': have_system,
27582becc36aSPaolo Bonzini  'CONFIG_USER_ONLY': have_user,
27592becc36aSPaolo Bonzini  'CONFIG_ALL': true,
27602becc36aSPaolo Bonzini}
27612becc36aSPaolo Bonzini
2762eed56e9aSPaolo Bonzinitarget_configs_h = []
2763eed56e9aSPaolo Bonziniforeach target: target_dirs
2764eed56e9aSPaolo Bonzini  target_configs_h += config_target_h[target]
2765eed56e9aSPaolo Bonzini  target_configs_h += config_devices_h.get(target, [])
2766eed56e9aSPaolo Bonziniendforeach
2767eed56e9aSPaolo Bonzinigenh += custom_target('config-poison.h',
2768eed56e9aSPaolo Bonzini                      input: [target_configs_h],
2769eed56e9aSPaolo Bonzini                      output: 'config-poison.h',
2770eed56e9aSPaolo Bonzini                      capture: true,
2771eed56e9aSPaolo Bonzini                      command: [find_program('scripts/make-config-poison.sh'),
2772eed56e9aSPaolo Bonzini                                target_configs_h])
2773eed56e9aSPaolo Bonzini
2774a0c9162cSPaolo Bonzini##############
2775a0c9162cSPaolo Bonzini# Submodules #
2776a0c9162cSPaolo Bonzini##############
27778b18cdbfSRichard Henderson
27788b18cdbfSRichard Hendersoncapstone = not_found
277983602083SThomas Huthif not get_option('capstone').auto() or have_system or have_user
278043ecd166SThomas Huth  capstone = dependency('capstone', version: '>=3.0.5',
2781063d5119SPaolo Bonzini                        method: 'pkg-config',
278283602083SThomas Huth                        required: get_option('capstone'))
27838f4aea71SDaniel P. Berrangé
27848f4aea71SDaniel P. Berrangé  # Some versions of capstone have broken pkg-config file
27858f4aea71SDaniel P. Berrangé  # that reports a wrong -I path, causing the #include to
27868f4aea71SDaniel P. Berrangé  # fail later. If the system has such a broken version
27878f4aea71SDaniel P. Berrangé  # do not use it.
27888f4aea71SDaniel P. Berrangé  if capstone.found() and not cc.compiles('#include <capstone.h>',
27898f4aea71SDaniel P. Berrangé                                          dependencies: [capstone])
27908f4aea71SDaniel P. Berrangé    capstone = not_found
279183602083SThomas Huth    if get_option('capstone').enabled()
279283602083SThomas Huth      error('capstone requested, but it does not appear to work')
27938f4aea71SDaniel P. Berrangé    endif
27948f4aea71SDaniel P. Berrangé  endif
27958b18cdbfSRichard Hendersonendif
27964d34a86bSPaolo Bonzini
279755116968SJagannathan Ramanlibvfio_user_dep = not_found
279855116968SJagannathan Ramanif have_system and vfio_user_server_allowed
279955116968SJagannathan Raman  have_internal = fs.exists(meson.current_source_dir() / 'subprojects/libvfio-user/meson.build')
280055116968SJagannathan Raman
280155116968SJagannathan Raman  if not have_internal
280255116968SJagannathan Raman    error('libvfio-user source not found - please pull git submodule')
280355116968SJagannathan Raman  endif
280455116968SJagannathan Raman
280555116968SJagannathan Raman  libvfio_user_proj = subproject('libvfio-user')
280655116968SJagannathan Raman
28075328353cSPaolo Bonzini  libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep')
280855116968SJagannathan Ramanendif
280955116968SJagannathan Raman
2810fbb4121dSPaolo Bonzinifdt = not_found
2811fbb4121dSPaolo Bonziniif have_system
2812c593d841SPhilippe Mathieu-Daudé  fdt_opt = get_option('fdt')
2813fbb4121dSPaolo Bonzini  if fdt_opt in ['enabled', 'auto', 'system']
2814fbb4121dSPaolo Bonzini    have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
2815063d5119SPaolo Bonzini    fdt = cc.find_library('fdt',
2816fbb4121dSPaolo Bonzini                          required: fdt_opt == 'system' or
2817fbb4121dSPaolo Bonzini                                    fdt_opt == 'enabled' and not have_internal)
2818fbb4121dSPaolo Bonzini    if fdt.found() and cc.links('''
2819fbb4121dSPaolo Bonzini       #include <libfdt.h>
2820fbb4121dSPaolo Bonzini       #include <libfdt_env.h>
2821de47b0ffSThomas Huth       int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
2822fbb4121dSPaolo Bonzini         dependencies: fdt)
2823fbb4121dSPaolo Bonzini      fdt_opt = 'system'
28246c22853cSThomas Huth    elif fdt_opt == 'system'
28256c22853cSThomas Huth       error('system libfdt requested, but it is too old (1.5.1 or newer required)')
2826fbb4121dSPaolo Bonzini    elif have_internal
2827fbb4121dSPaolo Bonzini      fdt_opt = 'internal'
2828fbb4121dSPaolo Bonzini    else
2829fbb4121dSPaolo Bonzini      fdt_opt = 'disabled'
283087daf898SThomas Huth      fdt = not_found
2831fbb4121dSPaolo Bonzini    endif
2832fbb4121dSPaolo Bonzini  endif
2833fbb4121dSPaolo Bonzini  if fdt_opt == 'internal'
2834fbb4121dSPaolo Bonzini    fdt_files = files(
2835fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt.c',
2836fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_ro.c',
2837fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_wip.c',
2838fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_sw.c',
2839fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_rw.c',
2840fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_strerror.c',
2841fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_empty_tree.c',
2842fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_addresses.c',
2843fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_overlay.c',
2844fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_check.c',
2845fbb4121dSPaolo Bonzini    )
2846fbb4121dSPaolo Bonzini
2847fbb4121dSPaolo Bonzini    fdt_inc = include_directories('dtc/libfdt')
2848fbb4121dSPaolo Bonzini    libfdt = static_library('fdt',
2849610e7e0eSPhilippe Mathieu-Daudé                            build_by_default: false,
2850fbb4121dSPaolo Bonzini                            sources: fdt_files,
2851fbb4121dSPaolo Bonzini                            include_directories: fdt_inc)
2852fbb4121dSPaolo Bonzini    fdt = declare_dependency(link_with: libfdt,
2853fbb4121dSPaolo Bonzini                             include_directories: fdt_inc)
2854fbb4121dSPaolo Bonzini  endif
2855c593d841SPhilippe Mathieu-Daudéelse
2856c593d841SPhilippe Mathieu-Daudé  fdt_opt = 'disabled'
2857fbb4121dSPaolo Bonziniendif
2858fbb4121dSPaolo Bonziniif not fdt.found() and fdt_required.length() > 0
2859fbb4121dSPaolo Bonzini  error('fdt not available but required by targets ' + ', '.join(fdt_required))
2860fbb4121dSPaolo Bonziniendif
2861fbb4121dSPaolo Bonzini
28628b18cdbfSRichard Hendersonconfig_host_data.set('CONFIG_CAPSTONE', capstone.found())
2863fbb4121dSPaolo Bonziniconfig_host_data.set('CONFIG_FDT', fdt.found())
28644d34a86bSPaolo Bonziniconfig_host_data.set('CONFIG_SLIRP', slirp.found())
28658b18cdbfSRichard Henderson
2866a0c9162cSPaolo Bonzini#####################
2867a0c9162cSPaolo Bonzini# Generated sources #
2868a0c9162cSPaolo Bonzini#####################
28698b18cdbfSRichard Henderson
2870a0c9162cSPaolo Bonzinigenh += configure_file(output: 'config-host.h', configuration: config_host_data)
2871a81df1b6SPaolo Bonzini
28723f885659SMarc-André Lureauhxtool = find_program('scripts/hxtool')
2873e2c4012bSMarc-André Lureaushaderinclude = find_program('scripts/shaderinclude.py')
2874a81df1b6SPaolo Bonziniqapi_gen = find_program('scripts/qapi-gen.py')
2875654d6b04SPaolo Bonziniqapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
2876654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/commands.py',
2877654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/common.py',
2878654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/error.py',
2879654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/events.py',
2880654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/expr.py',
2881654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/gen.py',
2882654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/introspect.py',
288388d357d2SMarkus Armbruster                     meson.current_source_dir() / 'scripts/qapi/main.py',
2884654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/parser.py',
2885654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/schema.py',
2886654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/source.py',
2887654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/types.py',
2888654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/visit.py',
2889654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi-gen.py'
2890a81df1b6SPaolo Bonzini]
2891a81df1b6SPaolo Bonzini
2892a81df1b6SPaolo Bonzinitracetool = [
2893a81df1b6SPaolo Bonzini  python, files('scripts/tracetool.py'),
28949c29b741SPaolo Bonzini   '--backend=' + ','.join(get_option('trace_backends'))
2895a81df1b6SPaolo Bonzini]
28960572d6cdSStefan Hajnoczitracetool_depends = files(
28970572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/log.py',
28980572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/__init__.py',
28990572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/dtrace.py',
29000572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/ftrace.py',
29010572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/simple.py',
29020572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/syslog.py',
29030572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/ust.py',
29040572d6cdSStefan Hajnoczi  'scripts/tracetool/format/ust_events_c.py',
29050572d6cdSStefan Hajnoczi  'scripts/tracetool/format/ust_events_h.py',
29060572d6cdSStefan Hajnoczi  'scripts/tracetool/format/__init__.py',
29070572d6cdSStefan Hajnoczi  'scripts/tracetool/format/d.py',
29080572d6cdSStefan Hajnoczi  'scripts/tracetool/format/simpletrace_stap.py',
29090572d6cdSStefan Hajnoczi  'scripts/tracetool/format/c.py',
29100572d6cdSStefan Hajnoczi  'scripts/tracetool/format/h.py',
29110572d6cdSStefan Hajnoczi  'scripts/tracetool/format/log_stap.py',
29120572d6cdSStefan Hajnoczi  'scripts/tracetool/format/stap.py',
29130572d6cdSStefan Hajnoczi  'scripts/tracetool/__init__.py',
29140572d6cdSStefan Hajnoczi  'scripts/tracetool/vcpu.py'
29150572d6cdSStefan Hajnoczi)
2916a81df1b6SPaolo Bonzini
29172c273f32SMarc-André Lureauqemu_version_cmd = [find_program('scripts/qemu-version.sh'),
29182c273f32SMarc-André Lureau                    meson.current_source_dir(),
2919b0b4323eSPaolo Bonzini                    get_option('pkgversion'), meson.project_version()]
29202c273f32SMarc-André Lureauqemu_version = custom_target('qemu-version.h',
29212c273f32SMarc-André Lureau                             output: 'qemu-version.h',
29222c273f32SMarc-André Lureau                             command: qemu_version_cmd,
29232c273f32SMarc-André Lureau                             capture: true,
29242c273f32SMarc-André Lureau                             build_by_default: true,
29252c273f32SMarc-André Lureau                             build_always_stale: true)
29262c273f32SMarc-André Lureaugenh += qemu_version
29272c273f32SMarc-André Lureau
29283f885659SMarc-André Lureauhxdep = []
29293f885659SMarc-André Lureauhx_headers = [
29303f885659SMarc-André Lureau  ['qemu-options.hx', 'qemu-options.def'],
29313f885659SMarc-André Lureau  ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
29323f885659SMarc-André Lureau]
29333f885659SMarc-André Lureauif have_system
29343f885659SMarc-André Lureau  hx_headers += [
29353f885659SMarc-André Lureau    ['hmp-commands.hx', 'hmp-commands.h'],
29363f885659SMarc-André Lureau    ['hmp-commands-info.hx', 'hmp-commands-info.h'],
29373f885659SMarc-André Lureau  ]
29383f885659SMarc-André Lureauendif
29393f885659SMarc-André Lureauforeach d : hx_headers
2940b7c70bf2SMarc-André Lureau  hxdep += custom_target(d[1],
29413f885659SMarc-André Lureau                input: files(d[0]),
29423f885659SMarc-André Lureau                output: d[1],
29433f885659SMarc-André Lureau                capture: true,
29443f885659SMarc-André Lureau                build_by_default: true, # to be removed when added to a target
29453f885659SMarc-André Lureau                command: [hxtool, '-h', '@INPUT0@'])
29463f885659SMarc-André Lureauendforeach
29473f885659SMarc-André Lureaugenh += hxdep
29483f885659SMarc-André Lureau
2949a0c9162cSPaolo Bonzini###################
2950a0c9162cSPaolo Bonzini# Collect sources #
2951a0c9162cSPaolo Bonzini###################
2952a81df1b6SPaolo Bonzini
295355567891SPhilippe Mathieu-Daudéauthz_ss = ss.source_set()
29547e2b888fSPhilippe Mathieu-Daudéblockdev_ss = ss.source_set()
29557e2b888fSPhilippe Mathieu-Daudéblock_ss = ss.source_set()
2956c2306d71SPhilippe Mathieu-Daudéchardev_ss = ss.source_set()
29577e2b888fSPhilippe Mathieu-Daudécommon_ss = ss.source_set()
29582389304aSPhilippe Mathieu-Daudécrypto_ss = ss.source_set()
2959f73fb063SPhilippe Mathieu-Daudéhwcore_ss = ss.source_set()
2960f78536b1SPhilippe Mathieu-Daudéio_ss = ss.source_set()
29617e2b888fSPhilippe Mathieu-Daudéqmp_ss = ss.source_set()
2962da33fc09SPhilippe Mathieu-Daudéqom_ss = ss.source_set()
29637e2b888fSPhilippe Mathieu-Daudésoftmmu_ss = ss.source_set()
29647e2b888fSPhilippe Mathieu-Daudéspecific_fuzz_ss = ss.source_set()
29657e2b888fSPhilippe Mathieu-Daudéspecific_ss = ss.source_set()
2966a81df1b6SPaolo Bonzinistub_ss = ss.source_set()
2967a81df1b6SPaolo Bonzinitrace_ss = ss.source_set()
29682becc36aSPaolo Bonziniuser_ss = ss.source_set()
29697e2b888fSPhilippe Mathieu-Daudéutil_ss = ss.source_set()
29702becc36aSPaolo Bonzini
2971c94a7b88SGerd Hoffmann# accel modules
2972c94a7b88SGerd Hoffmannqtest_module_ss = ss.source_set()
2973dae0ec15SGerd Hoffmanntcg_module_ss = ss.source_set()
2974c94a7b88SGerd Hoffmann
29753154fee4SMarc-André Lureaumodules = {}
2976db2e89dfSGerd Hoffmanntarget_modules = {}
29772becc36aSPaolo Bonzinihw_arch = {}
29782becc36aSPaolo Bonzinitarget_arch = {}
29792becc36aSPaolo Bonzinitarget_softmmu_arch = {}
298046369b50SPhilippe Mathieu-Daudétarget_user_arch = {}
2981a81df1b6SPaolo Bonzini
2982a81df1b6SPaolo Bonzini###############
2983a81df1b6SPaolo Bonzini# Trace files #
2984a81df1b6SPaolo Bonzini###############
2985a81df1b6SPaolo Bonzini
2986c9322ab5SMarc-André Lureau# TODO: add each directory to the subdirs from its own meson.build, once
2987c9322ab5SMarc-André Lureau# we have those
2988a81df1b6SPaolo Bonzinitrace_events_subdirs = [
2989a81df1b6SPaolo Bonzini  'crypto',
299069ff4d0aSPhilippe Mathieu-Daudé  'qapi',
299169ff4d0aSPhilippe Mathieu-Daudé  'qom',
2992a81df1b6SPaolo Bonzini  'monitor',
299369ff4d0aSPhilippe Mathieu-Daudé  'util',
2994842b42dfSAlex Bennée  'gdbstub',
2995a81df1b6SPaolo Bonzini]
29966ddc1abeSWarner Loshif have_linux_user
2997a81df1b6SPaolo Bonzini  trace_events_subdirs += [ 'linux-user' ]
2998a81df1b6SPaolo Bonziniendif
29996ddc1abeSWarner Loshif have_bsd_user
30006ddc1abeSWarner Losh  trace_events_subdirs += [ 'bsd-user' ]
30016ddc1abeSWarner Loshendif
3002a81df1b6SPaolo Bonziniif have_block
3003a81df1b6SPaolo Bonzini  trace_events_subdirs += [
3004a81df1b6SPaolo Bonzini    'authz',
3005a81df1b6SPaolo Bonzini    'block',
3006a81df1b6SPaolo Bonzini    'io',
3007a81df1b6SPaolo Bonzini    'nbd',
3008a81df1b6SPaolo Bonzini    'scsi',
3009a81df1b6SPaolo Bonzini  ]
3010a81df1b6SPaolo Bonziniendif
3011a81df1b6SPaolo Bonziniif have_system
3012a81df1b6SPaolo Bonzini  trace_events_subdirs += [
30138985db26SPhilippe Mathieu-Daudé    'accel/kvm',
3014a81df1b6SPaolo Bonzini    'audio',
3015a81df1b6SPaolo Bonzini    'backends',
3016a81df1b6SPaolo Bonzini    'backends/tpm',
3017a81df1b6SPaolo Bonzini    'chardev',
301846627f41SAndrew Melnychenko    'ebpf',
3019a81df1b6SPaolo Bonzini    'hw/9pfs',
3020a81df1b6SPaolo Bonzini    'hw/acpi',
302177c05b0bSHao Wu    'hw/adc',
3022a81df1b6SPaolo Bonzini    'hw/alpha',
3023a81df1b6SPaolo Bonzini    'hw/arm',
3024a81df1b6SPaolo Bonzini    'hw/audio',
3025a81df1b6SPaolo Bonzini    'hw/block',
3026a81df1b6SPaolo Bonzini    'hw/block/dataplane',
3027a81df1b6SPaolo Bonzini    'hw/char',
3028a81df1b6SPaolo Bonzini    'hw/display',
3029a81df1b6SPaolo Bonzini    'hw/dma',
3030a81df1b6SPaolo Bonzini    'hw/hyperv',
3031a81df1b6SPaolo Bonzini    'hw/i2c',
3032a81df1b6SPaolo Bonzini    'hw/i386',
3033a81df1b6SPaolo Bonzini    'hw/i386/xen',
3034aa98ee38SDavid Woodhouse    'hw/i386/kvm',
3035a81df1b6SPaolo Bonzini    'hw/ide',
3036a81df1b6SPaolo Bonzini    'hw/input',
3037a81df1b6SPaolo Bonzini    'hw/intc',
3038a81df1b6SPaolo Bonzini    'hw/isa',
3039a81df1b6SPaolo Bonzini    'hw/mem',
3040a81df1b6SPaolo Bonzini    'hw/mips',
3041a81df1b6SPaolo Bonzini    'hw/misc',
3042a81df1b6SPaolo Bonzini    'hw/misc/macio',
3043a81df1b6SPaolo Bonzini    'hw/net',
304498e5d7a2SVikram Garhwal    'hw/net/can',
3045ce0e6a2cSMark Cave-Ayland    'hw/nubus',
304688eea45cSKlaus Jensen    'hw/nvme',
3047a81df1b6SPaolo Bonzini    'hw/nvram',
3048a81df1b6SPaolo Bonzini    'hw/pci',
3049a81df1b6SPaolo Bonzini    'hw/pci-host',
3050a81df1b6SPaolo Bonzini    'hw/ppc',
3051a81df1b6SPaolo Bonzini    'hw/rdma',
3052a81df1b6SPaolo Bonzini    'hw/rdma/vmw',
3053a81df1b6SPaolo Bonzini    'hw/rtc',
3054a81df1b6SPaolo Bonzini    'hw/s390x',
3055a81df1b6SPaolo Bonzini    'hw/scsi',
3056a81df1b6SPaolo Bonzini    'hw/sd',
3057ad52cfc1SBALATON Zoltan    'hw/sh4',
3058a81df1b6SPaolo Bonzini    'hw/sparc',
3059a81df1b6SPaolo Bonzini    'hw/sparc64',
3060a81df1b6SPaolo Bonzini    'hw/ssi',
3061a81df1b6SPaolo Bonzini    'hw/timer',
3062a81df1b6SPaolo Bonzini    'hw/tpm',
3063a81df1b6SPaolo Bonzini    'hw/usb',
3064a81df1b6SPaolo Bonzini    'hw/vfio',
3065a81df1b6SPaolo Bonzini    'hw/virtio',
3066a81df1b6SPaolo Bonzini    'hw/watchdog',
3067a81df1b6SPaolo Bonzini    'hw/xen',
3068a81df1b6SPaolo Bonzini    'hw/gpio',
3069a81df1b6SPaolo Bonzini    'migration',
3070a81df1b6SPaolo Bonzini    'net',
30718b7a5507SPhilippe Mathieu-Daudé    'softmmu',
3072a81df1b6SPaolo Bonzini    'ui',
3073ad22c308SElena Ufimtseva    'hw/remote',
3074a81df1b6SPaolo Bonzini  ]
3075a81df1b6SPaolo Bonziniendif
30768985db26SPhilippe Mathieu-Daudéif have_system or have_user
30778985db26SPhilippe Mathieu-Daudé  trace_events_subdirs += [
30788985db26SPhilippe Mathieu-Daudé    'accel/tcg',
30798985db26SPhilippe Mathieu-Daudé    'hw/core',
30808985db26SPhilippe Mathieu-Daudé    'target/arm',
3081a1477da3SAlexander Graf    'target/arm/hvf',
30828985db26SPhilippe Mathieu-Daudé    'target/hppa',
30838985db26SPhilippe Mathieu-Daudé    'target/i386',
30848985db26SPhilippe Mathieu-Daudé    'target/i386/kvm',
308534b8ff25SPhilippe Mathieu-Daudé    'target/mips/tcg',
30866f83e277SRichard Henderson    'target/nios2',
30878985db26SPhilippe Mathieu-Daudé    'target/ppc',
30888985db26SPhilippe Mathieu-Daudé    'target/riscv',
30898985db26SPhilippe Mathieu-Daudé    'target/s390x',
309067043607SCho, Yu-Chen    'target/s390x/kvm',
30918985db26SPhilippe Mathieu-Daudé    'target/sparc',
30928985db26SPhilippe Mathieu-Daudé  ]
30938985db26SPhilippe Mathieu-Daudéendif
3094a81df1b6SPaolo Bonzini
30950df750e9SMarc-André Lureauvhost_user = not_found
30962a3129a3SPaolo Bonziniif targetos == 'linux' and have_vhost_user
30970df750e9SMarc-André Lureau  libvhost_user = subproject('libvhost-user')
30980df750e9SMarc-André Lureau  vhost_user = libvhost_user.get_variable('vhost_user_dep')
30990df750e9SMarc-André Lureauendif
31000df750e9SMarc-André Lureau
3101a6caeee8SXie Yongjilibvduse = not_found
3102a6caeee8SXie Yongjiif have_libvduse
3103a6caeee8SXie Yongji  libvduse_proj = subproject('libvduse')
3104a6caeee8SXie Yongji  libvduse = libvduse_proj.get_variable('libvduse_dep')
3105a6caeee8SXie Yongjiendif
3106a6caeee8SXie Yongji
3107b83a80e8SVladimir Sementsov-Ogievskiy# NOTE: the trace/ subdirectory needs the qapi_trace_events variable
3108b83a80e8SVladimir Sementsov-Ogievskiy# that is filled in by qapi/.
3109a81df1b6SPaolo Bonzinisubdir('qapi')
3110a81df1b6SPaolo Bonzinisubdir('qobject')
3111a81df1b6SPaolo Bonzinisubdir('stubs')
3112a81df1b6SPaolo Bonzinisubdir('trace')
3113a81df1b6SPaolo Bonzinisubdir('util')
31145582c58fSMarc-André Lureausubdir('qom')
31155582c58fSMarc-André Lureausubdir('authz')
3116a81df1b6SPaolo Bonzinisubdir('crypto')
31172d78b56eSMarc-André Lureausubdir('ui')
31187d5983e3SNicolas Saenz Juliennesubdir('hw')
3119842b42dfSAlex Bennéesubdir('gdbstub')
3120a81df1b6SPaolo Bonzini
31213154fee4SMarc-André Lureauif enable_modules
31223154fee4SMarc-André Lureau  libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
31233154fee4SMarc-André Lureau  modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
31243154fee4SMarc-André Lureauendif
31253154fee4SMarc-André Lureau
31267d5983e3SNicolas Saenz Julienneqom_ss = qom_ss.apply(config_host, strict: false)
31277d5983e3SNicolas Saenz Juliennelibqom = static_library('qom', qom_ss.sources() + genh,
31287d5983e3SNicolas Saenz Julienne                        dependencies: [qom_ss.dependencies()],
31297d5983e3SNicolas Saenz Julienne                        name_suffix: 'fa')
31307d5983e3SNicolas Saenz Julienneqom = declare_dependency(link_whole: libqom)
31317d5983e3SNicolas Saenz Julienne
31327d5983e3SNicolas Saenz Julienneevent_loop_base = files('event-loop-base.c')
31337d5983e3SNicolas Saenz Julienneevent_loop_base = static_library('event-loop-base', sources: event_loop_base + genh,
31347d5983e3SNicolas Saenz Julienne                                 build_by_default: true)
31357d5983e3SNicolas Saenz Julienneevent_loop_base = declare_dependency(link_whole: event_loop_base,
31367d5983e3SNicolas Saenz Julienne                                     dependencies: [qom])
31377d5983e3SNicolas Saenz Julienne
31382becc36aSPaolo Bonzinistub_ss = stub_ss.apply(config_all, strict: false)
3139a81df1b6SPaolo Bonzini
3140a81df1b6SPaolo Bonziniutil_ss.add_all(trace_ss)
31412becc36aSPaolo Bonziniutil_ss = util_ss.apply(config_all, strict: false)
3142a81df1b6SPaolo Bonzinilibqemuutil = static_library('qemuutil',
3143a81df1b6SPaolo Bonzini                             sources: util_ss.sources() + stub_ss.sources() + genh,
31446d7c7c2dSPaolo Bonzini                             dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman])
3145a81df1b6SPaolo Bonziniqemuutil = declare_dependency(link_with: libqemuutil,
314670ac26b9SNicolas Saenz Julienne                              sources: genh + version_res,
314770ac26b9SNicolas Saenz Julienne                              dependencies: [event_loop_base])
3148a81df1b6SPaolo Bonzini
3149957b31f6SPhilippe Mathieu-Daudéif have_system or have_user
3150abff1abfSPaolo Bonzini  decodetree = generator(find_program('scripts/decodetree.py'),
3151abff1abfSPaolo Bonzini                         output: 'decode-@BASENAME@.c.inc',
3152abff1abfSPaolo Bonzini                         arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
3153957b31f6SPhilippe Mathieu-Daudé  subdir('libdecnumber')
3154957b31f6SPhilippe Mathieu-Daudé  subdir('target')
3155957b31f6SPhilippe Mathieu-Daudéendif
3156abff1abfSPaolo Bonzini
3157478e943fSPaolo Bonzinisubdir('audio')
31587fcfd456SMarc-André Lureausubdir('io')
3159848e8ff6SMarc-André Lureausubdir('chardev')
3160ec0d5893SMarc-André Lureausubdir('fsdev')
3161708eab42SMarc-André Lureausubdir('dump')
3162ec0d5893SMarc-André Lureau
3163f285bd3fSPhilippe Mathieu-Daudéif have_block
31645e5733e5SMarc-André Lureau  block_ss.add(files(
31655e5733e5SMarc-André Lureau    'block.c',
31665e5733e5SMarc-André Lureau    'blockjob.c',
31675e5733e5SMarc-André Lureau    'job.c',
31685e5733e5SMarc-André Lureau    'qemu-io-cmds.c',
31695e5733e5SMarc-André Lureau  ))
3170406523f6SPaolo Bonzini  if config_host_data.get('CONFIG_REPLICATION')
3171406523f6SPaolo Bonzini    block_ss.add(files('replication.c'))
3172406523f6SPaolo Bonzini  endif
31735e5733e5SMarc-André Lureau
31745e5733e5SMarc-André Lureau  subdir('nbd')
31755e5733e5SMarc-André Lureau  subdir('scsi')
31765e5733e5SMarc-André Lureau  subdir('block')
31775e5733e5SMarc-André Lureau
31784a96337dSPaolo Bonzini  blockdev_ss.add(files(
31794a96337dSPaolo Bonzini    'blockdev.c',
3180cbc20bfbSStefan Hajnoczi    'blockdev-nbd.c',
31814a96337dSPaolo Bonzini    'iothread.c',
31824a96337dSPaolo Bonzini    'job-qmp.c',
31833eacf70bSRoman Bolshakov  ), gnutls)
31844a96337dSPaolo Bonzini
31854a96337dSPaolo Bonzini  # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
31864a96337dSPaolo Bonzini  # os-win32.c does not
31874a96337dSPaolo Bonzini  blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
31884a96337dSPaolo Bonzini  softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
3189f285bd3fSPhilippe Mathieu-Daudéendif
31904a96337dSPaolo Bonzini
31914a96337dSPaolo Bonzinicommon_ss.add(files('cpus-common.c'))
319231ffa2aaSPhilippe Mathieu-Daudéspecific_ss.add(files('cpu.c'))
31934a96337dSPaolo Bonzini
31945d3ea0e1SPaolo Bonzinisubdir('softmmu')
3195c9322ab5SMarc-André Lureau
319644b99a6dSRichard Henderson# Work around a gcc bug/misfeature wherein constant propagation looks
319744b99a6dSRichard Henderson# through an alias:
319844b99a6dSRichard Henderson#   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
319944b99a6dSRichard Henderson# to guess that a const variable is always zero.  Without lto, this is
320044b99a6dSRichard Henderson# impossible, as the alias is restricted to page-vary-common.c.  Indeed,
320144b99a6dSRichard Henderson# without lto, not even the alias is required -- we simply use different
320244b99a6dSRichard Henderson# declarations in different compilation units.
320344b99a6dSRichard Hendersonpagevary = files('page-vary-common.c')
320444b99a6dSRichard Hendersonif get_option('b_lto')
320544b99a6dSRichard Henderson  pagevary_flags = ['-fno-lto']
320644b99a6dSRichard Henderson  if get_option('cfi')
320744b99a6dSRichard Henderson    pagevary_flags += '-fno-sanitize=cfi-icall'
320844b99a6dSRichard Henderson  endif
320954c9b194SThomas Huth  pagevary = static_library('page-vary-common', sources: pagevary + genh,
321044b99a6dSRichard Henderson                            c_args: pagevary_flags)
321144b99a6dSRichard Henderson  pagevary = declare_dependency(link_with: pagevary)
321244b99a6dSRichard Hendersonendif
321344b99a6dSRichard Hendersoncommon_ss.add(pagevary)
32146670d4d0SRichard Hendersonspecific_ss.add(files('page-vary.c'))
32156670d4d0SRichard Henderson
3216ab318051SMarc-André Lureausubdir('backends')
3217c574e161SMarc-André Lureausubdir('disas')
321855166230SMarc-André Lureausubdir('migration')
3219ff219dcaSPaolo Bonzinisubdir('monitor')
3220cdaf0722SMarc-André Lureausubdir('net')
322117ef2af6SMarc-André Lureausubdir('replay')
32228df9f0c3SPhilippe Mathieu-Daudésubdir('semihosting')
3223aa09b3d5SMarkus Armbrustersubdir('stats')
3224104cc2c0SRichard Hendersonsubdir('tcg')
3225c6347541SRichard Hendersonsubdir('fpu')
32261a82878aSMarc-André Lureausubdir('accel')
3227f556b4a1SPaolo Bonzinisubdir('plugins')
3228bbf15aafSRichard Hendersonsubdir('ebpf')
3229bbf15aafSRichard Henderson
3230bbf15aafSRichard Hendersoncommon_user_inc = []
3231bbf15aafSRichard Henderson
3232bbf15aafSRichard Hendersonsubdir('common-user')
3233b309c321SMarc-André Lureausubdir('bsd-user')
32343a30446aSMarc-André Lureausubdir('linux-user')
323546627f41SAndrew Melnychenko
3236a2ce7dbdSPaolo Bonzini# needed for fuzzing binaries
3237a2ce7dbdSPaolo Bonzinisubdir('tests/qtest/libqos')
323864ed6f92SPaolo Bonzinisubdir('tests/qtest/fuzz')
3239a2ce7dbdSPaolo Bonzini
3240c94a7b88SGerd Hoffmann# accel modules
3241dae0ec15SGerd Hoffmanntcg_real_module_ss = ss.source_set()
3242dae0ec15SGerd Hoffmanntcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss)
3243dae0ec15SGerd Hoffmannspecific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss)
3244dae0ec15SGerd Hoffmanntarget_modules += { 'accel' : { 'qtest': qtest_module_ss,
3245dae0ec15SGerd Hoffmann                                'tcg': tcg_real_module_ss }}
3246c94a7b88SGerd Hoffmann
3247a0c9162cSPaolo Bonzini########################
3248a0c9162cSPaolo Bonzini# Library dependencies #
3249a0c9162cSPaolo Bonzini########################
3250a0c9162cSPaolo Bonzini
3251f5723ab6SGerd Hoffmannmodinfo_collect = find_program('scripts/modinfo-collect.py')
32525ebbfeccSGerd Hoffmannmodinfo_generate = find_program('scripts/modinfo-generate.py')
3253f5723ab6SGerd Hoffmannmodinfo_files = []
3254f5723ab6SGerd Hoffmann
32553154fee4SMarc-André Lureaublock_mods = []
32563154fee4SMarc-André Lureausoftmmu_mods = []
32573154fee4SMarc-André Lureauforeach d, list : modules
3258ef709860SPaolo Bonzini  if not (d == 'block' ? have_block : have_system)
3259ef709860SPaolo Bonzini    continue
3260ef709860SPaolo Bonzini  endif
3261ef709860SPaolo Bonzini
32623154fee4SMarc-André Lureau  foreach m, module_ss : list
3263*6002711cSPaolo Bonzini    if enable_modules
32643e292c51SGerd Hoffmann      module_ss = module_ss.apply(config_all, strict: false)
32653154fee4SMarc-André Lureau      sl = static_library(d + '-' + m, [genh, module_ss.sources()],
32663154fee4SMarc-André Lureau                          dependencies: [modulecommon, module_ss.dependencies()], pic: true)
32673154fee4SMarc-André Lureau      if d == 'block'
32683154fee4SMarc-André Lureau        block_mods += sl
32693154fee4SMarc-André Lureau      else
32703154fee4SMarc-André Lureau        softmmu_mods += sl
32713154fee4SMarc-André Lureau      endif
3272f5723ab6SGerd Hoffmann      if module_ss.sources() != []
3273f5723ab6SGerd Hoffmann        # FIXME: Should use sl.extract_all_objects(recursive: true) as
3274f5723ab6SGerd Hoffmann        # input. Sources can be used multiple times but objects are
3275f5723ab6SGerd Hoffmann        # unique when it comes to lookup in compile_commands.json.
3276f5723ab6SGerd Hoffmann        # Depnds on a mesion version with
3277f5723ab6SGerd Hoffmann        # https://github.com/mesonbuild/meson/pull/8900
3278f5723ab6SGerd Hoffmann        modinfo_files += custom_target(d + '-' + m + '.modinfo',
3279f5723ab6SGerd Hoffmann                                       output: d + '-' + m + '.modinfo',
3280ac347111SPaolo Bonzini                                       input: module_ss.sources() + genh,
3281f5723ab6SGerd Hoffmann                                       capture: true,
3282ac347111SPaolo Bonzini                                       command: [modinfo_collect, module_ss.sources()])
3283f5723ab6SGerd Hoffmann      endif
32843154fee4SMarc-André Lureau    else
32853154fee4SMarc-André Lureau      if d == 'block'
32863154fee4SMarc-André Lureau        block_ss.add_all(module_ss)
32873154fee4SMarc-André Lureau      else
32883154fee4SMarc-André Lureau        softmmu_ss.add_all(module_ss)
32893154fee4SMarc-André Lureau      endif
32903154fee4SMarc-André Lureau    endif
32913154fee4SMarc-André Lureau  endforeach
32923154fee4SMarc-André Lureauendforeach
32933154fee4SMarc-André Lureau
3294db2e89dfSGerd Hoffmannforeach d, list : target_modules
3295db2e89dfSGerd Hoffmann  foreach m, module_ss : list
3296*6002711cSPaolo Bonzini    if enable_modules
3297db2e89dfSGerd Hoffmann      foreach target : target_dirs
3298db2e89dfSGerd Hoffmann        if target.endswith('-softmmu')
3299db2e89dfSGerd Hoffmann          config_target = config_target_mak[target]
3300db2e89dfSGerd Hoffmann          config_target += config_host
3301db2e89dfSGerd Hoffmann          target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
3302db2e89dfSGerd Hoffmann          c_args = ['-DNEED_CPU_H',
3303db2e89dfSGerd Hoffmann                    '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3304db2e89dfSGerd Hoffmann                    '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3305db2e89dfSGerd Hoffmann          target_module_ss = module_ss.apply(config_target, strict: false)
3306db2e89dfSGerd Hoffmann          if target_module_ss.sources() != []
3307db2e89dfSGerd Hoffmann            module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
3308db2e89dfSGerd Hoffmann            sl = static_library(module_name,
3309db2e89dfSGerd Hoffmann                                [genh, target_module_ss.sources()],
3310db2e89dfSGerd Hoffmann                                dependencies: [modulecommon, target_module_ss.dependencies()],
3311db2e89dfSGerd Hoffmann                                include_directories: target_inc,
3312db2e89dfSGerd Hoffmann                                c_args: c_args,
3313db2e89dfSGerd Hoffmann                                pic: true)
3314db2e89dfSGerd Hoffmann            softmmu_mods += sl
3315db2e89dfSGerd Hoffmann            # FIXME: Should use sl.extract_all_objects(recursive: true) too.
3316db2e89dfSGerd Hoffmann            modinfo_files += custom_target(module_name + '.modinfo',
3317db2e89dfSGerd Hoffmann                                           output: module_name + '.modinfo',
3318917ddc27SGerd Hoffmann                                           input: target_module_ss.sources() + genh,
3319db2e89dfSGerd Hoffmann                                           capture: true,
3320917ddc27SGerd Hoffmann                                           command: [modinfo_collect, '--target', target, target_module_ss.sources()])
3321db2e89dfSGerd Hoffmann          endif
3322db2e89dfSGerd Hoffmann        endif
3323db2e89dfSGerd Hoffmann      endforeach
3324db2e89dfSGerd Hoffmann    else
3325db2e89dfSGerd Hoffmann      specific_ss.add_all(module_ss)
3326db2e89dfSGerd Hoffmann    endif
3327db2e89dfSGerd Hoffmann  endforeach
3328db2e89dfSGerd Hoffmannendforeach
3329db2e89dfSGerd Hoffmann
33305ebbfeccSGerd Hoffmannif enable_modules
333105d6814cSJose R. Ziviani  foreach target : target_dirs
333205d6814cSJose R. Ziviani    if target.endswith('-softmmu')
333305d6814cSJose R. Ziviani      config_target = config_target_mak[target]
333405d6814cSJose R. Ziviani      config_devices_mak = target + '-config-devices.mak'
333505d6814cSJose R. Ziviani      modinfo_src = custom_target('modinfo-' + target + '.c',
333605d6814cSJose R. Ziviani                                  output: 'modinfo-' + target + '.c',
33375ebbfeccSGerd Hoffmann                                  input: modinfo_files,
333805d6814cSJose R. Ziviani                                  command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'],
33395ebbfeccSGerd Hoffmann                                  capture: true)
334005d6814cSJose R. Ziviani
334105d6814cSJose R. Ziviani      modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src)
334205d6814cSJose R. Ziviani      modinfo_dep = declare_dependency(link_with: modinfo_lib)
334305d6814cSJose R. Ziviani
334405d6814cSJose R. Ziviani      arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH']
334505d6814cSJose R. Ziviani      hw_arch[arch].add(modinfo_dep)
334605d6814cSJose R. Ziviani    endif
334705d6814cSJose R. Ziviani  endforeach
33485ebbfeccSGerd Hoffmannendif
33495ebbfeccSGerd Hoffmann
33503154fee4SMarc-André Lureaunm = find_program('nm')
3351604f3e4eSYonggang Luoundefsym = find_program('scripts/undefsym.py')
33523154fee4SMarc-André Lureaublock_syms = custom_target('block.syms', output: 'block.syms',
33533154fee4SMarc-André Lureau                             input: [libqemuutil, block_mods],
33543154fee4SMarc-André Lureau                             capture: true,
33553154fee4SMarc-André Lureau                             command: [undefsym, nm, '@INPUT@'])
33563154fee4SMarc-André Lureauqemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
33573154fee4SMarc-André Lureau                             input: [libqemuutil, softmmu_mods],
33583154fee4SMarc-André Lureau                             capture: true,
33593154fee4SMarc-André Lureau                             command: [undefsym, nm, '@INPUT@'])
33603154fee4SMarc-André Lureau
336155567891SPhilippe Mathieu-Daudéauthz_ss = authz_ss.apply(config_host, strict: false)
336255567891SPhilippe Mathieu-Daudélibauthz = static_library('authz', authz_ss.sources() + genh,
336355567891SPhilippe Mathieu-Daudé                          dependencies: [authz_ss.dependencies()],
336455567891SPhilippe Mathieu-Daudé                          name_suffix: 'fa',
336555567891SPhilippe Mathieu-Daudé                          build_by_default: false)
336655567891SPhilippe Mathieu-Daudé
336755567891SPhilippe Mathieu-Daudéauthz = declare_dependency(link_whole: libauthz,
336855567891SPhilippe Mathieu-Daudé                           dependencies: qom)
336955567891SPhilippe Mathieu-Daudé
33702389304aSPhilippe Mathieu-Daudécrypto_ss = crypto_ss.apply(config_host, strict: false)
33712389304aSPhilippe Mathieu-Daudélibcrypto = static_library('crypto', crypto_ss.sources() + genh,
33722389304aSPhilippe Mathieu-Daudé                           dependencies: [crypto_ss.dependencies()],
33732389304aSPhilippe Mathieu-Daudé                           name_suffix: 'fa',
33742389304aSPhilippe Mathieu-Daudé                           build_by_default: false)
33752389304aSPhilippe Mathieu-Daudé
33762389304aSPhilippe Mathieu-Daudécrypto = declare_dependency(link_whole: libcrypto,
33772389304aSPhilippe Mathieu-Daudé                            dependencies: [authz, qom])
33782389304aSPhilippe Mathieu-Daudé
3379f78536b1SPhilippe Mathieu-Daudéio_ss = io_ss.apply(config_host, strict: false)
3380f78536b1SPhilippe Mathieu-Daudélibio = static_library('io', io_ss.sources() + genh,
3381f78536b1SPhilippe Mathieu-Daudé                       dependencies: [io_ss.dependencies()],
3382f78536b1SPhilippe Mathieu-Daudé                       link_with: libqemuutil,
3383f78536b1SPhilippe Mathieu-Daudé                       name_suffix: 'fa',
3384f78536b1SPhilippe Mathieu-Daudé                       build_by_default: false)
3385f78536b1SPhilippe Mathieu-Daudé
3386f78536b1SPhilippe Mathieu-Daudéio = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
3387f78536b1SPhilippe Mathieu-Daudé
33887e6edef3SPhilippe Mathieu-Daudélibmigration = static_library('migration', sources: migration_files + genh,
33897e6edef3SPhilippe Mathieu-Daudé                              name_suffix: 'fa',
33907e6edef3SPhilippe Mathieu-Daudé                              build_by_default: false)
33917e6edef3SPhilippe Mathieu-Daudémigration = declare_dependency(link_with: libmigration,
33927e6edef3SPhilippe Mathieu-Daudé                               dependencies: [zlib, qom, io])
33937e6edef3SPhilippe Mathieu-Daudésoftmmu_ss.add(migration)
33947e6edef3SPhilippe Mathieu-Daudé
33955e5733e5SMarc-André Lureaublock_ss = block_ss.apply(config_host, strict: false)
33965e5733e5SMarc-André Lureaulibblock = static_library('block', block_ss.sources() + genh,
33975e5733e5SMarc-André Lureau                          dependencies: block_ss.dependencies(),
33985e5733e5SMarc-André Lureau                          link_depends: block_syms,
33995e5733e5SMarc-André Lureau                          name_suffix: 'fa',
34005e5733e5SMarc-André Lureau                          build_by_default: false)
34015e5733e5SMarc-André Lureau
34025e5733e5SMarc-André Lureaublock = declare_dependency(link_whole: [libblock],
3403b7c70bf2SMarc-André Lureau                           link_args: '@block.syms',
3404b7c70bf2SMarc-André Lureau                           dependencies: [crypto, io])
34055e5733e5SMarc-André Lureau
34064fb9071fSStefan Hajnocziblockdev_ss = blockdev_ss.apply(config_host, strict: false)
34074fb9071fSStefan Hajnoczilibblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
34084fb9071fSStefan Hajnoczi                             dependencies: blockdev_ss.dependencies(),
34094fb9071fSStefan Hajnoczi                             name_suffix: 'fa',
34104fb9071fSStefan Hajnoczi                             build_by_default: false)
34114fb9071fSStefan Hajnoczi
34124fb9071fSStefan Hajnocziblockdev = declare_dependency(link_whole: [libblockdev],
34137d5983e3SNicolas Saenz Julienne                              dependencies: [block, event_loop_base])
34144fb9071fSStefan Hajnoczi
3415ff219dcaSPaolo Bonziniqmp_ss = qmp_ss.apply(config_host, strict: false)
3416ff219dcaSPaolo Bonzinilibqmp = static_library('qmp', qmp_ss.sources() + genh,
3417ff219dcaSPaolo Bonzini                        dependencies: qmp_ss.dependencies(),
3418ff219dcaSPaolo Bonzini                        name_suffix: 'fa',
3419ff219dcaSPaolo Bonzini                        build_by_default: false)
3420ff219dcaSPaolo Bonzini
3421ff219dcaSPaolo Bonziniqmp = declare_dependency(link_whole: [libqmp])
3422ff219dcaSPaolo Bonzini
3423c2306d71SPhilippe Mathieu-Daudélibchardev = static_library('chardev', chardev_ss.sources() + genh,
3424c2306d71SPhilippe Mathieu-Daudé                            name_suffix: 'fa',
342522d1f7a8SMarc-André Lureau                            dependencies: chardev_ss.dependencies(),
3426c2306d71SPhilippe Mathieu-Daudé                            build_by_default: false)
3427c2306d71SPhilippe Mathieu-Daudé
3428c2306d71SPhilippe Mathieu-Daudéchardev = declare_dependency(link_whole: libchardev)
3429c2306d71SPhilippe Mathieu-Daudé
3430f73fb063SPhilippe Mathieu-Daudéhwcore_ss = hwcore_ss.apply(config_host, strict: false)
3431f73fb063SPhilippe Mathieu-Daudélibhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
3432e28ab096SPhilippe Mathieu-Daudé                           name_suffix: 'fa',
3433e28ab096SPhilippe Mathieu-Daudé                           build_by_default: false)
3434e28ab096SPhilippe Mathieu-Daudéhwcore = declare_dependency(link_whole: libhwcore)
3435e28ab096SPhilippe Mathieu-Daudécommon_ss.add(hwcore)
3436e28ab096SPhilippe Mathieu-Daudé
3437064f8ee7SPhilippe Mathieu-Daudé###########
3438064f8ee7SPhilippe Mathieu-Daudé# Targets #
3439064f8ee7SPhilippe Mathieu-Daudé###########
3440064f8ee7SPhilippe Mathieu-Daudé
3441fb72176bSPaolo Bonziniemulator_modules = []
34423154fee4SMarc-André Lureauforeach m : block_mods + softmmu_mods
3443fb72176bSPaolo Bonzini  emulator_modules += shared_module(m.name(),
3444fb72176bSPaolo Bonzini                build_by_default: true,
34453154fee4SMarc-André Lureau                name_prefix: '',
34463154fee4SMarc-André Lureau                link_whole: m,
34473154fee4SMarc-André Lureau                install: true,
344816bf7a33SPaolo Bonzini                install_dir: qemu_moddir)
34493154fee4SMarc-André Lureauendforeach
3450d8f3a609SPaolo Bonziniif emulator_modules.length() > 0
3451d8f3a609SPaolo Bonzini  alias_target('modules', emulator_modules)
3452d8f3a609SPaolo Bonziniendif
34533154fee4SMarc-André Lureau
34544fb9071fSStefan Hajnoczisoftmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
345564ed6f92SPaolo Bonzinicommon_ss.add(qom, qemuutil)
345664ed6f92SPaolo Bonzini
345764ed6f92SPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
34582becc36aSPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
34592becc36aSPaolo Bonzini
34602becc36aSPaolo Bonzinicommon_all = common_ss.apply(config_all, strict: false)
34612becc36aSPaolo Bonzinicommon_all = static_library('common',
34622becc36aSPaolo Bonzini                            build_by_default: false,
34632becc36aSPaolo Bonzini                            sources: common_all.sources() + genh,
34649d24fb73SPaolo Bonzini                            include_directories: common_user_inc,
346575eebe0bSKatsuhiro Ueno                            implicit_include_directories: false,
34662becc36aSPaolo Bonzini                            dependencies: common_all.dependencies(),
34672becc36aSPaolo Bonzini                            name_suffix: 'fa')
34682becc36aSPaolo Bonzini
3469c9322ab5SMarc-André Lureaufeature_to_c = find_program('scripts/feature_to_c.sh')
3470c9322ab5SMarc-André Lureau
347130cfa50dSPhilippe Mathieu-Daudéif targetos == 'darwin'
347230cfa50dSPhilippe Mathieu-Daudé  entitlement = find_program('scripts/entitlement.sh')
347330cfa50dSPhilippe Mathieu-Daudéendif
347430cfa50dSPhilippe Mathieu-Daudé
3475fd5eef85SPaolo Bonziniemulators = {}
34762becc36aSPaolo Bonziniforeach target : target_dirs
34772becc36aSPaolo Bonzini  config_target = config_target_mak[target]
34782becc36aSPaolo Bonzini  target_name = config_target['TARGET_NAME']
3479ffb91f68SPaolo Bonzini  target_base_arch = config_target['TARGET_BASE_ARCH']
3480859aef02SPaolo Bonzini  arch_srcs = [config_target_h[target]]
348164ed6f92SPaolo Bonzini  arch_deps = []
348264ed6f92SPaolo Bonzini  c_args = ['-DNEED_CPU_H',
348364ed6f92SPaolo Bonzini            '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
348464ed6f92SPaolo Bonzini            '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3485b6c7cfd4SPaolo Bonzini  link_args = emulator_link_args
34862becc36aSPaolo Bonzini
3487859aef02SPaolo Bonzini  config_target += config_host
34882becc36aSPaolo Bonzini  target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
34892becc36aSPaolo Bonzini  if targetos == 'linux'
34902becc36aSPaolo Bonzini    target_inc += include_directories('linux-headers', is_system: true)
34912becc36aSPaolo Bonzini  endif
34922becc36aSPaolo Bonzini  if target.endswith('-softmmu')
34932becc36aSPaolo Bonzini    target_type='system'
3494ffb91f68SPaolo Bonzini    t = target_softmmu_arch[target_base_arch].apply(config_target, strict: false)
3495abff1abfSPaolo Bonzini    arch_srcs += t.sources()
349664ed6f92SPaolo Bonzini    arch_deps += t.dependencies()
3497abff1abfSPaolo Bonzini
3498ffb91f68SPaolo Bonzini    hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch
34992c44220dSMarc-André Lureau    hw = hw_arch[hw_dir].apply(config_target, strict: false)
35002c44220dSMarc-André Lureau    arch_srcs += hw.sources()
350164ed6f92SPaolo Bonzini    arch_deps += hw.dependencies()
35022c44220dSMarc-André Lureau
35032becc36aSPaolo Bonzini    arch_srcs += config_devices_h[target]
350464ed6f92SPaolo Bonzini    link_args += ['@block.syms', '@qemu.syms']
35052becc36aSPaolo Bonzini  else
35063a30446aSMarc-André Lureau    abi = config_target['TARGET_ABI_DIR']
35072becc36aSPaolo Bonzini    target_type='user'
3508a3a576b0SPaolo Bonzini    target_inc += common_user_inc
3509ffb91f68SPaolo Bonzini    if target_base_arch in target_user_arch
3510ffb91f68SPaolo Bonzini      t = target_user_arch[target_base_arch].apply(config_target, strict: false)
351146369b50SPhilippe Mathieu-Daudé      arch_srcs += t.sources()
351246369b50SPhilippe Mathieu-Daudé      arch_deps += t.dependencies()
351346369b50SPhilippe Mathieu-Daudé    endif
35142becc36aSPaolo Bonzini    if 'CONFIG_LINUX_USER' in config_target
35152becc36aSPaolo Bonzini      base_dir = 'linux-user'
3516e2a74729SWarner Losh    endif
3517e2a74729SWarner Losh    if 'CONFIG_BSD_USER' in config_target
35182becc36aSPaolo Bonzini      base_dir = 'bsd-user'
3519e2a74729SWarner Losh      target_inc += include_directories('bsd-user/' / targetos)
352085fc1b5dSWarner Losh      target_inc += include_directories('bsd-user/host/' / host_arch)
3521e2a74729SWarner Losh      dir = base_dir / abi
352219bf129fSWarner Losh      arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c')
35232becc36aSPaolo Bonzini    endif
35242becc36aSPaolo Bonzini    target_inc += include_directories(
35252becc36aSPaolo Bonzini      base_dir,
35263a30446aSMarc-André Lureau      base_dir / abi,
35272becc36aSPaolo Bonzini    )
35283a30446aSMarc-André Lureau    if 'CONFIG_LINUX_USER' in config_target
35293a30446aSMarc-André Lureau      dir = base_dir / abi
35303a30446aSMarc-André Lureau      arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
35313a30446aSMarc-André Lureau      if config_target.has_key('TARGET_SYSTBL_ABI')
35323a30446aSMarc-André Lureau        arch_srcs += \
35333a30446aSMarc-André Lureau          syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
35343a30446aSMarc-André Lureau                                             extra_args : config_target['TARGET_SYSTBL_ABI'])
35353a30446aSMarc-André Lureau      endif
35363a30446aSMarc-André Lureau    endif
35372becc36aSPaolo Bonzini  endif
35382becc36aSPaolo Bonzini
3539c9322ab5SMarc-André Lureau  if 'TARGET_XML_FILES' in config_target
3540c9322ab5SMarc-André Lureau    gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
3541c9322ab5SMarc-André Lureau                                output: target + '-gdbstub-xml.c',
3542c9322ab5SMarc-André Lureau                                input: files(config_target['TARGET_XML_FILES'].split()),
3543c9322ab5SMarc-André Lureau                                command: [feature_to_c, '@INPUT@'],
3544c9322ab5SMarc-André Lureau                                capture: true)
3545c9322ab5SMarc-André Lureau    arch_srcs += gdbstub_xml
3546c9322ab5SMarc-André Lureau  endif
3547c9322ab5SMarc-André Lureau
3548ffb91f68SPaolo Bonzini  t = target_arch[target_base_arch].apply(config_target, strict: false)
3549abff1abfSPaolo Bonzini  arch_srcs += t.sources()
355064ed6f92SPaolo Bonzini  arch_deps += t.dependencies()
3551abff1abfSPaolo Bonzini
35522becc36aSPaolo Bonzini  target_common = common_ss.apply(config_target, strict: false)
35532becc36aSPaolo Bonzini  objects = common_all.extract_objects(target_common.sources())
355464ed6f92SPaolo Bonzini  deps = target_common.dependencies()
35552becc36aSPaolo Bonzini
35562becc36aSPaolo Bonzini  target_specific = specific_ss.apply(config_target, strict: false)
35572becc36aSPaolo Bonzini  arch_srcs += target_specific.sources()
355864ed6f92SPaolo Bonzini  arch_deps += target_specific.dependencies()
35592becc36aSPaolo Bonzini
356064ed6f92SPaolo Bonzini  lib = static_library('qemu-' + target,
3561859aef02SPaolo Bonzini                 sources: arch_srcs + genh,
3562b7612f45SPaolo Bonzini                 dependencies: arch_deps,
35632becc36aSPaolo Bonzini                 objects: objects,
35642becc36aSPaolo Bonzini                 include_directories: target_inc,
356564ed6f92SPaolo Bonzini                 c_args: c_args,
356664ed6f92SPaolo Bonzini                 build_by_default: false,
35672becc36aSPaolo Bonzini                 name_suffix: 'fa')
356864ed6f92SPaolo Bonzini
356964ed6f92SPaolo Bonzini  if target.endswith('-softmmu')
357064ed6f92SPaolo Bonzini    execs = [{
357164ed6f92SPaolo Bonzini      'name': 'qemu-system-' + target_name,
3572654d6b04SPaolo Bonzini      'win_subsystem': 'console',
357364ed6f92SPaolo Bonzini      'sources': files('softmmu/main.c'),
357464ed6f92SPaolo Bonzini      'dependencies': []
357564ed6f92SPaolo Bonzini    }]
357635be72baSPaolo Bonzini    if targetos == 'windows' and (sdl.found() or gtk.found())
357764ed6f92SPaolo Bonzini      execs += [{
357864ed6f92SPaolo Bonzini        'name': 'qemu-system-' + target_name + 'w',
3579654d6b04SPaolo Bonzini        'win_subsystem': 'windows',
358064ed6f92SPaolo Bonzini        'sources': files('softmmu/main.c'),
358164ed6f92SPaolo Bonzini        'dependencies': []
358264ed6f92SPaolo Bonzini      }]
358364ed6f92SPaolo Bonzini    endif
3584537b7248SPaolo Bonzini    if get_option('fuzzing')
358564ed6f92SPaolo Bonzini      specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
358664ed6f92SPaolo Bonzini      execs += [{
358764ed6f92SPaolo Bonzini        'name': 'qemu-fuzz-' + target_name,
3588654d6b04SPaolo Bonzini        'win_subsystem': 'console',
358964ed6f92SPaolo Bonzini        'sources': specific_fuzz.sources(),
359064ed6f92SPaolo Bonzini        'dependencies': specific_fuzz.dependencies(),
359164ed6f92SPaolo Bonzini      }]
359264ed6f92SPaolo Bonzini    endif
359364ed6f92SPaolo Bonzini  else
359464ed6f92SPaolo Bonzini    execs = [{
359564ed6f92SPaolo Bonzini      'name': 'qemu-' + target_name,
3596654d6b04SPaolo Bonzini      'win_subsystem': 'console',
359764ed6f92SPaolo Bonzini      'sources': [],
359864ed6f92SPaolo Bonzini      'dependencies': []
359964ed6f92SPaolo Bonzini    }]
360064ed6f92SPaolo Bonzini  endif
360164ed6f92SPaolo Bonzini  foreach exe: execs
36028a74ce61SAlexander Graf    exe_name = exe['name']
36033983a767SJohn Arbuckle    if targetos == 'darwin'
36048a74ce61SAlexander Graf      exe_name += '-unsigned'
36058a74ce61SAlexander Graf    endif
36068a74ce61SAlexander Graf
36078a74ce61SAlexander Graf    emulator = executable(exe_name, exe['sources'],
3608237377acSAkihiko Odaki               install: true,
360964ed6f92SPaolo Bonzini               c_args: c_args,
361064ed6f92SPaolo Bonzini               dependencies: arch_deps + deps + exe['dependencies'],
361164ed6f92SPaolo Bonzini               objects: lib.extract_all_objects(recursive: true),
361264ed6f92SPaolo Bonzini               link_language: link_language,
361364ed6f92SPaolo Bonzini               link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
361464ed6f92SPaolo Bonzini               link_args: link_args,
3615654d6b04SPaolo Bonzini               win_subsystem: exe['win_subsystem'])
36168a74ce61SAlexander Graf
36173983a767SJohn Arbuckle    if targetos == 'darwin'
3618411ad8ddSAkihiko Odaki      icon = 'pc-bios/qemu.rsrc'
3619411ad8ddSAkihiko Odaki      build_input = [emulator, files(icon)]
3620411ad8ddSAkihiko Odaki      install_input = [
3621411ad8ddSAkihiko Odaki        get_option('bindir') / exe_name,
3622411ad8ddSAkihiko Odaki        meson.current_source_dir() / icon
3623411ad8ddSAkihiko Odaki      ]
3624411ad8ddSAkihiko Odaki      if 'CONFIG_HVF' in config_target
3625411ad8ddSAkihiko Odaki        entitlements = 'accel/hvf/entitlements.plist'
3626411ad8ddSAkihiko Odaki        build_input += files(entitlements)
3627411ad8ddSAkihiko Odaki        install_input += meson.current_source_dir() / entitlements
3628411ad8ddSAkihiko Odaki      endif
3629411ad8ddSAkihiko Odaki
36308a74ce61SAlexander Graf      emulators += {exe['name'] : custom_target(exe['name'],
3631411ad8ddSAkihiko Odaki                   input: build_input,
36328a74ce61SAlexander Graf                   output: exe['name'],
3633235b523dSPhilippe Mathieu-Daudé                   command: [entitlement, '@OUTPUT@', '@INPUT@'])
3634fd5eef85SPaolo Bonzini      }
3635237377acSAkihiko Odaki
3636235b523dSPhilippe Mathieu-Daudé      meson.add_install_script(entitlement, '--install',
3637237377acSAkihiko Odaki                               get_option('bindir') / exe['name'],
3638411ad8ddSAkihiko Odaki                               install_input)
36398a74ce61SAlexander Graf    else
36408a74ce61SAlexander Graf      emulators += {exe['name']: emulator}
36418a74ce61SAlexander Graf    endif
364210e1d263SMarc-André Lureau
36439c29b741SPaolo Bonzini    if stap.found()
364410e1d263SMarc-André Lureau      foreach stp: [
3645bd5f973aSStefan Hajnoczi        {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
3646bd5f973aSStefan Hajnoczi        {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
364710e1d263SMarc-André Lureau        {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
364810e1d263SMarc-André Lureau        {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
364910e1d263SMarc-André Lureau      ]
3650bd5f973aSStefan Hajnoczi        custom_target(exe['name'] + stp['ext'],
365110e1d263SMarc-André Lureau                      input: trace_events_all,
3652bd5f973aSStefan Hajnoczi                      output: exe['name'] + stp['ext'],
365310e1d263SMarc-André Lureau                      install: stp['install'],
365416bf7a33SPaolo Bonzini                      install_dir: get_option('datadir') / 'systemtap/tapset',
365510e1d263SMarc-André Lureau                      command: [
365610e1d263SMarc-André Lureau                        tracetool, '--group=all', '--format=' + stp['fmt'],
365710e1d263SMarc-André Lureau                        '--binary=' + stp['bin'],
365810e1d263SMarc-André Lureau                        '--target-name=' + target_name,
365910e1d263SMarc-André Lureau                        '--target-type=' + target_type,
366010e1d263SMarc-André Lureau                        '--probe-prefix=qemu.' + target_type + '.' + target_name,
3661c05012a3SStefan Hajnoczi                        '@INPUT@', '@OUTPUT@'
36620572d6cdSStefan Hajnoczi                      ],
36630572d6cdSStefan Hajnoczi                      depend_files: tracetool_depends)
366410e1d263SMarc-André Lureau      endforeach
366510e1d263SMarc-André Lureau    endif
366664ed6f92SPaolo Bonzini  endforeach
36672becc36aSPaolo Bonziniendforeach
36682becc36aSPaolo Bonzini
3669931049b4SPaolo Bonzini# Other build targets
3670897b5afaSMarc-André Lureau
3671f556b4a1SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host
3672f556b4a1SPaolo Bonzini  install_headers('include/qemu/qemu-plugin.h')
3673f556b4a1SPaolo Bonziniendif
3674f556b4a1SPaolo Bonzini
3675f15bff25SPaolo Bonzinisubdir('qga')
3676f15bff25SPaolo Bonzini
36779755c94aSLaurent Vivier# Don't build qemu-keymap if xkbcommon is not explicitly enabled
36789755c94aSLaurent Vivier# when we don't build tools or system
36794113f4cfSLaurent Vivierif xkbcommon.found()
368028742467SMarc-André Lureau  # used for the update-keymaps target, so include rules even if !have_tools
368128742467SMarc-André Lureau  qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
368228742467SMarc-André Lureau                           dependencies: [qemuutil, xkbcommon], install: have_tools)
368328742467SMarc-André Lureauendif
368428742467SMarc-André Lureau
3685931049b4SPaolo Bonziniif have_tools
3686b7c70bf2SMarc-André Lureau  qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
3687b7c70bf2SMarc-André Lureau             dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
3688b7c70bf2SMarc-André Lureau  qemu_io = executable('qemu-io', files('qemu-io.c'),
3689b7c70bf2SMarc-André Lureau             dependencies: [block, qemuutil], install: true)
3690b7c70bf2SMarc-André Lureau  qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
36913d212b41SRichard W.M. Jones               dependencies: [blockdev, qemuutil, gnutls, selinux],
36923d212b41SRichard W.M. Jones               install: true)
3693b7c70bf2SMarc-André Lureau
36947c58bb76SPaolo Bonzini  subdir('storage-daemon')
3695a9c9727cSPaolo Bonzini  subdir('contrib/rdmacm-mux')
36961d7bb6abSMarc-André Lureau  subdir('contrib/elf2dmp')
3697a9c9727cSPaolo Bonzini
3698157e7b13SMarc-André Lureau  executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
3699157e7b13SMarc-André Lureau             dependencies: qemuutil,
3700157e7b13SMarc-André Lureau             install: true)
3701157e7b13SMarc-André Lureau
37022a3129a3SPaolo Bonzini  if have_vhost_user
37032d7ac0afSPaolo Bonzini    subdir('contrib/vhost-user-blk')
3704ea458960SMarc-André Lureau    subdir('contrib/vhost-user-gpu')
370532fcc624SMarc-André Lureau    subdir('contrib/vhost-user-input')
370699650b62SPaolo Bonzini    subdir('contrib/vhost-user-scsi')
3707931049b4SPaolo Bonzini  endif
37088f51e01cSMarc-André Lureau
37098f51e01cSMarc-André Lureau  if targetos == 'linux'
37108f51e01cSMarc-André Lureau    executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
37118f51e01cSMarc-André Lureau               dependencies: [qemuutil, libcap_ng],
37128f51e01cSMarc-André Lureau               install: true,
37138f51e01cSMarc-André Lureau               install_dir: get_option('libexecdir'))
3714897b5afaSMarc-André Lureau
3715897b5afaSMarc-André Lureau    executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
3716897b5afaSMarc-André Lureau               dependencies: [authz, crypto, io, qom, qemuutil,
37176ec0e15dSPaolo Bonzini                              libcap_ng, mpathpersist],
3718897b5afaSMarc-André Lureau               install: true)
37198f51e01cSMarc-André Lureau  endif
37208f51e01cSMarc-André Lureau
3721ccd250aaSPaolo Bonzini  if have_ivshmem
37225ee24e78SMarc-André Lureau    subdir('contrib/ivshmem-client')
37235ee24e78SMarc-André Lureau    subdir('contrib/ivshmem-server')
37245ee24e78SMarc-André Lureau  endif
3725931049b4SPaolo Bonziniendif
3726931049b4SPaolo Bonzini
3727f5aa6320SMarc-André Lureausubdir('scripts')
37283f99cf57SPaolo Bonzinisubdir('tools')
3729bdcbea7aSMarc-André Lureausubdir('pc-bios')
3730f8aa24eaSPaolo Bonzinisubdir('docs')
3731e3667660SYonggang Luosubdir('tests')
37321b695471SPaolo Bonziniif gtk.found()
3733e8f3bd71SMarc-André Lureau  subdir('po')
3734e8f3bd71SMarc-André Lureauendif
37353f99cf57SPaolo Bonzini
37368adfeba9SMarc-André Lureauif host_machine.system() == 'windows'
37378adfeba9SMarc-André Lureau  nsis_cmd = [
37388adfeba9SMarc-André Lureau    find_program('scripts/nsis.py'),
37398adfeba9SMarc-André Lureau    '@OUTPUT@',
37408adfeba9SMarc-André Lureau    get_option('prefix'),
37418adfeba9SMarc-André Lureau    meson.current_source_dir(),
3742fc9a809eSPaolo Bonzini    glib_pc.get_variable('bindir'),
374324bdcc96SStefan Weil    host_machine.cpu(),
37448adfeba9SMarc-André Lureau    '--',
37458adfeba9SMarc-André Lureau    '-DDISPLAYVERSION=' + meson.project_version(),
37468adfeba9SMarc-André Lureau  ]
37478adfeba9SMarc-André Lureau  if build_docs
37488adfeba9SMarc-André Lureau    nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
37498adfeba9SMarc-André Lureau  endif
37501b695471SPaolo Bonzini  if gtk.found()
37518adfeba9SMarc-André Lureau    nsis_cmd += '-DCONFIG_GTK=y'
37528adfeba9SMarc-André Lureau  endif
37538adfeba9SMarc-André Lureau
37548adfeba9SMarc-André Lureau  nsis = custom_target('nsis',
37558adfeba9SMarc-André Lureau                       output: 'qemu-setup-' + meson.project_version() + '.exe',
37568adfeba9SMarc-André Lureau                       input: files('qemu.nsi'),
37578adfeba9SMarc-André Lureau                       build_always_stale: true,
37588adfeba9SMarc-André Lureau                       command: nsis_cmd + ['@INPUT@'])
37598adfeba9SMarc-André Lureau  alias_target('installer', nsis)
37608adfeba9SMarc-André Lureauendif
37618adfeba9SMarc-André Lureau
3762a0c9162cSPaolo Bonzini#########################
3763a0c9162cSPaolo Bonzini# Configuration summary #
3764a0c9162cSPaolo Bonzini#########################
3765a0c9162cSPaolo Bonzini
3766983d0a75SPhilippe Mathieu-Daudé# Directories
3767f9332757SPaolo Bonzinisummary_info = {}
376816bf7a33SPaolo Bonzinisummary_info += {'Install prefix':    get_option('prefix')}
376916bf7a33SPaolo Bonzinisummary_info += {'BIOS directory':    qemu_datadir}
37708154f5e6SAkihiko Odakipathsep = targetos == 'windows' ? ';' : ':'
37718154f5e6SAkihiko Odakisummary_info += {'firmware path':     pathsep.join(get_option('qemu_firmwarepath'))}
3772f7fb6c6aSPaolo Bonzinisummary_info += {'binary directory':  get_option('prefix') / get_option('bindir')}
3773f7fb6c6aSPaolo Bonzinisummary_info += {'library directory': get_option('prefix') / get_option('libdir')}
377416bf7a33SPaolo Bonzinisummary_info += {'module directory':  qemu_moddir}
3775f7fb6c6aSPaolo Bonzinisummary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')}
3776f7fb6c6aSPaolo Bonzinisummary_info += {'include directory': get_option('prefix') / get_option('includedir')}
3777f7fb6c6aSPaolo Bonzinisummary_info += {'config directory':  get_option('prefix') / get_option('sysconfdir')}
3778f9332757SPaolo Bonziniif targetos != 'windows'
3779f7fb6c6aSPaolo Bonzini  summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')}
3780f7fb6c6aSPaolo Bonzini  summary_info += {'Manual directory':      get_option('prefix') / get_option('mandir')}
3781f9332757SPaolo Bonzinielse
3782f9332757SPaolo Bonzini  summary_info += {'local state directory': 'queried at runtime'}
3783f9332757SPaolo Bonziniendif
3784f7fb6c6aSPaolo Bonzinisummary_info += {'Doc directory':     get_option('prefix') / get_option('docdir')}
3785f9332757SPaolo Bonzinisummary_info += {'Build directory':   meson.current_build_dir()}
3786f9332757SPaolo Bonzinisummary_info += {'Source path':       meson.current_source_dir()}
3787f9332757SPaolo Bonzinisummary_info += {'GIT submodules':    config_host['GIT_SUBMODULES']}
3788983d0a75SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Directories')
3789983d0a75SPhilippe Mathieu-Daudé
3790e11a0e17SPhilippe Mathieu-Daudé# Host binaries
3791983d0a75SPhilippe Mathieu-Daudésummary_info = {}
3792e11a0e17SPhilippe Mathieu-Daudésummary_info += {'git':               config_host['GIT']}
3793e11a0e17SPhilippe Mathieu-Daudésummary_info += {'make':              config_host['MAKE']}
3794e11a0e17SPhilippe Mathieu-Daudésummary_info += {'python':            '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
3795bb647c49SPaolo Bonzinisummary_info += {'sphinx-build':      sphinx_build}
3796e11a0e17SPhilippe Mathieu-Daudéif config_host.has_key('HAVE_GDB_BIN')
3797e11a0e17SPhilippe Mathieu-Daudé  summary_info += {'gdb':             config_host['HAVE_GDB_BIN']}
3798e11a0e17SPhilippe Mathieu-Daudéendif
379940c909f5SPaolo Bonzinisummary_info += {'iasl':              iasl}
3800e11a0e17SPhilippe Mathieu-Daudésummary_info += {'genisoimage':       config_host['GENISOIMAGE']}
380120cf5cb4SPaolo Bonziniif targetos == 'windows' and have_ga
3802bb647c49SPaolo Bonzini  summary_info += {'wixl':            wixl}
3803e11a0e17SPhilippe Mathieu-Daudéendif
38045890258aSThomas Huthif slirp.found() and have_system
380535acbb30SPaolo Bonzini  summary_info += {'smbd':            have_slirp_smbd ? smbd_path : false}
3806e11a0e17SPhilippe Mathieu-Daudéendif
3807e11a0e17SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Host binaries')
3808e11a0e17SPhilippe Mathieu-Daudé
38091d718865SPhilippe Mathieu-Daudé# Configurable features
38101d718865SPhilippe Mathieu-Daudésummary_info = {}
38111d718865SPhilippe Mathieu-Daudésummary_info += {'Documentation':     build_docs}
3812aa3ca634SPhilippe Mathieu-Daudésummary_info += {'system-mode emulation': have_system}
3813aa3ca634SPhilippe Mathieu-Daudésummary_info += {'user-mode emulation': have_user}
3814813803aaSPhilippe Mathieu-Daudésummary_info += {'block layer':       have_block}
38151d718865SPhilippe Mathieu-Daudésummary_info += {'Install blobs':     get_option('install_blobs')}
3816*6002711cSPaolo Bonzinisummary_info += {'module support':    enable_modules}
3817*6002711cSPaolo Bonziniif enable_modules
38182cb2f580SPaolo Bonzini  summary_info += {'alternative module path': get_option('module_upgrades')}
38191d718865SPhilippe Mathieu-Daudéendif
3820537b7248SPaolo Bonzinisummary_info += {'fuzzing support':   get_option('fuzzing')}
38211d718865SPhilippe Mathieu-Daudéif have_system
382287430d5bSPaolo Bonzini  summary_info += {'Audio drivers':     ' '.join(audio_drivers_selected)}
38231d718865SPhilippe Mathieu-Daudéendif
38249c29b741SPaolo Bonzinisummary_info += {'Trace backends':    ','.join(get_option('trace_backends'))}
38259c29b741SPaolo Bonziniif 'simple' in get_option('trace_backends')
38269c29b741SPaolo Bonzini  summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
38271d718865SPhilippe Mathieu-Daudéendif
3828142ca628SMarc-André Lureausummary_info += {'D-Bus display':     dbus_display}
3829c55cf6abSPaolo Bonzinisummary_info += {'QOM debugging':     get_option('qom_cast_debug')}
38302a3129a3SPaolo Bonzinisummary_info += {'vhost-kernel support': have_vhost_kernel}
38312a3129a3SPaolo Bonzinisummary_info += {'vhost-net support': have_vhost_net}
38322a3129a3SPaolo Bonzinisummary_info += {'vhost-user support': have_vhost_user}
38332a3129a3SPaolo Bonzinisummary_info += {'vhost-user-crypto support': have_vhost_user_crypto}
38341d718865SPhilippe Mathieu-Daudésummary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
38352a3129a3SPaolo Bonzinisummary_info += {'vhost-vdpa support': have_vhost_vdpa}
383620cf5cb4SPaolo Bonzinisummary_info += {'build guest agent': have_ga}
38371d718865SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Configurable features')
38381d718865SPhilippe Mathieu-Daudé
38392e864b8bSPhilippe Mathieu-Daudé# Compilation information
3840e11a0e17SPhilippe Mathieu-Daudésummary_info = {}
38412e864b8bSPhilippe Mathieu-Daudésummary_info += {'host CPU':          cpu}
38422e864b8bSPhilippe Mathieu-Daudésummary_info += {'host endianness':   build_machine.endian()}
384363de9353SAlex Bennéesummary_info += {'C compiler':        ' '.join(meson.get_compiler('c').cmd_array())}
384463de9353SAlex Bennéesummary_info += {'Host C compiler':   ' '.join(meson.get_compiler('c', native: true).cmd_array())}
3845f9332757SPaolo Bonziniif link_language == 'cpp'
384663de9353SAlex Bennée  summary_info += {'C++ compiler':    ' '.join(meson.get_compiler('cpp').cmd_array())}
3847f9332757SPaolo Bonzinielse
3848f9332757SPaolo Bonzini  summary_info += {'C++ compiler':      false}
3849f9332757SPaolo Bonziniendif
3850f9332757SPaolo Bonziniif targetos == 'darwin'
385163de9353SAlex Bennée  summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
3852f9332757SPaolo Bonziniendif
38536a97f393SPaolo Bonzinioption_cflags = (get_option('debug') ? ['-g'] : [])
38546a97f393SPaolo Bonziniif get_option('optimization') != 'plain'
38556a97f393SPaolo Bonzini  option_cflags += ['-O' + get_option('optimization')]
38566a97f393SPaolo Bonziniendif
38576a97f393SPaolo Bonzinisummary_info += {'CFLAGS':            ' '.join(get_option('c_args') + option_cflags)}
385847b30835SPaolo Bonziniif link_language == 'cpp'
38596a97f393SPaolo Bonzini  summary_info += {'CXXFLAGS':        ' '.join(get_option('cpp_args') + option_cflags)}
386047b30835SPaolo Bonziniendif
3861e910c7d9SPhilippe Mathieu-Daudéif targetos == 'darwin'
38626a97f393SPaolo Bonzini  summary_info += {'OBJCFLAGS':       ' '.join(get_option('objc_args') + option_cflags)}
3863e910c7d9SPhilippe Mathieu-Daudéendif
386447b30835SPaolo Bonzinilink_args = get_option(link_language + '_link_args')
386547b30835SPaolo Bonziniif link_args.length() > 0
386647b30835SPaolo Bonzini  summary_info += {'LDFLAGS':         ' '.join(link_args)}
386747b30835SPaolo Bonziniendif
3868d065177eSPaolo Bonzinisummary_info += {'QEMU_CFLAGS':       ' '.join(qemu_cflags)}
3869e5134024SPaolo Bonziniif 'cpp' in all_languages
3870d065177eSPaolo Bonzini  summary_info += {'QEMU_CXXFLAGS':     ' '.join(qemu_cxxflags)}
3871e5134024SPaolo Bonziniendif
3872e5134024SPaolo Bonziniif 'objc' in all_languages
3873d065177eSPaolo Bonzini  summary_info += {'QEMU_OBJCFLAGS':    ' '.join(qemu_objcflags)}
3874e5134024SPaolo Bonziniendif
3875d065177eSPaolo Bonzinisummary_info += {'QEMU_LDFLAGS':      ' '.join(qemu_ldflags)}
3876c55cf6abSPaolo Bonzinisummary_info += {'profiler':          get_option('profiler')}
3877cdad781dSDaniele Buonosummary_info += {'link-time optimization (LTO)': get_option('b_lto')}
38782e864b8bSPhilippe Mathieu-Daudésummary_info += {'PIE':               get_option('b_pie')}
38793e8529ddSLaurent Viviersummary_info += {'static build':      config_host.has_key('CONFIG_STATIC')}
38802e864b8bSPhilippe Mathieu-Daudésummary_info += {'malloc trim support': has_malloc_trim}
3881b87df904SPaolo Bonzinisummary_info += {'membarrier':        have_membarrier}
388258a2e3f5SStefan Hajnoczisummary_info += {'debug graph lock':  get_option('debug_graph_lock')}
3883728c0a2fSPaolo Bonzinisummary_info += {'debug stack usage': get_option('debug_stack_usage')}
3884c55cf6abSPaolo Bonzinisummary_info += {'mutex debugging':   get_option('debug_mutex')}
38852e864b8bSPhilippe Mathieu-Daudésummary_info += {'memory allocator':  get_option('malloc')}
3886622753d2SPaolo Bonzinisummary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
388704ffce13Sling xusummary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')}
3888622753d2SPaolo Bonzinisummary_info += {'avx512f optimization': config_host_data.get('CONFIG_AVX512F_OPT')}
3889bb9ecae7SAlex Bennéeif get_option('gprof')
3890bb9ecae7SAlex Bennée  gprof_info = 'YES (deprecated)'
3891bb9ecae7SAlex Bennéeelse
3892bb9ecae7SAlex Bennée  gprof_info = get_option('gprof')
3893bb9ecae7SAlex Bennéeendif
3894bb9ecae7SAlex Bennéesummary_info += {'gprof':             gprof_info}
38952e864b8bSPhilippe Mathieu-Daudésummary_info += {'gcov':              get_option('b_coverage')}
38962e864b8bSPhilippe Mathieu-Daudésummary_info += {'thread sanitizer':  config_host.has_key('CONFIG_TSAN')}
38972e864b8bSPhilippe Mathieu-Daudésummary_info += {'CFI support':       get_option('cfi')}
38982e864b8bSPhilippe Mathieu-Daudéif get_option('cfi')
38992e864b8bSPhilippe Mathieu-Daudé  summary_info += {'CFI debug support': get_option('cfi_debug')}
39002e864b8bSPhilippe Mathieu-Daudéendif
39012e864b8bSPhilippe Mathieu-Daudésummary_info += {'strip binaries':    get_option('strip')}
3902bb647c49SPaolo Bonzinisummary_info += {'sparse':            sparse}
39032e864b8bSPhilippe Mathieu-Daudésummary_info += {'mingw32 support':   targetos == 'windows'}
390412640f05SPaolo Bonzinisummary(summary_info, bool_yn: true, section: 'Compilation')
390549e8565bSAlex Bennée
390649e8565bSAlex Bennée# snarf the cross-compilation information for tests
390712640f05SPaolo Bonzinisummary_info = {}
390812640f05SPaolo Bonzinihave_cross = false
390949e8565bSAlex Bennéeforeach target: target_dirs
3910c7022a70SPaolo Bonzini  tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak'
391149e8565bSAlex Bennée  if fs.exists(tcg_mak)
391249e8565bSAlex Bennée    config_cross_tcg = keyval.load(tcg_mak)
391385b141eaSAlex Bennée    if 'CC' in config_cross_tcg
391412640f05SPaolo Bonzini      summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']}
391512640f05SPaolo Bonzini      have_cross = true
391649e8565bSAlex Bennée    endif
391749e8565bSAlex Bennée  endif
391849e8565bSAlex Bennéeendforeach
391912640f05SPaolo Bonziniif have_cross
392012640f05SPaolo Bonzini  summary(summary_info, bool_yn: true, section: 'Cross compilers')
392112640f05SPaolo Bonziniendif
39222e864b8bSPhilippe Mathieu-Daudé
3923aa3ca634SPhilippe Mathieu-Daudé# Targets and accelerators
39242e864b8bSPhilippe Mathieu-Daudésummary_info = {}
3925aa3ca634SPhilippe Mathieu-Daudéif have_system
3926aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'KVM support':       config_all.has_key('CONFIG_KVM')}
3927aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'HAX support':       config_all.has_key('CONFIG_HAX')}
3928aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'HVF support':       config_all.has_key('CONFIG_HVF')}
3929aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'WHPX support':      config_all.has_key('CONFIG_WHPX')}
393074a414a1SReinoud Zandijk  summary_info += {'NVMM support':      config_all.has_key('CONFIG_NVMM')}
393114efd8d3SPaolo Bonzini  summary_info += {'Xen support':       xen.found()}
393214efd8d3SPaolo Bonzini  if xen.found()
393314efd8d3SPaolo Bonzini    summary_info += {'xen ctrl version':  xen.version()}
3934aa3ca634SPhilippe Mathieu-Daudé  endif
3935820c1abaSDavid Woodhouse  summary_info += {'Xen emulation':     config_all.has_key('CONFIG_XEN_EMU')}
3936aa3ca634SPhilippe Mathieu-Daudéendif
3937aa3ca634SPhilippe Mathieu-Daudésummary_info += {'TCG support':       config_all.has_key('CONFIG_TCG')}
3938aa3ca634SPhilippe Mathieu-Daudéif config_all.has_key('CONFIG_TCG')
393939687acaSPhilippe Mathieu-Daudé  if get_option('tcg_interpreter')
3940f1f727acSPhilippe Mathieu-Daudé    summary_info += {'TCG backend':   'TCI (TCG with bytecode interpreter, slow)'}
394139687acaSPhilippe Mathieu-Daudé  else
394239687acaSPhilippe Mathieu-Daudé    summary_info += {'TCG backend':   'native (@0@)'.format(cpu)}
394339687acaSPhilippe Mathieu-Daudé  endif
3944029aa68fSAlex Bennée  summary_info += {'TCG plugins': config_host.has_key('CONFIG_PLUGIN')}
3945aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
3946aa3ca634SPhilippe Mathieu-Daudéendif
39472e864b8bSPhilippe Mathieu-Daudésummary_info += {'target list':       ' '.join(target_dirs)}
3948aa3ca634SPhilippe Mathieu-Daudéif have_system
3949aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'default devices':   get_option('default_devices')}
3950106ad1f9SPaolo Bonzini  summary_info += {'out of process emulation': multiprocess_allowed}
395155116968SJagannathan Raman  summary_info += {'vfio-user server': vfio_user_server_allowed}
3952aa3ca634SPhilippe Mathieu-Daudéendif
3953aa3ca634SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Targets and accelerators')
3954aa3ca634SPhilippe Mathieu-Daudé
3955813803aaSPhilippe Mathieu-Daudé# Block layer
3956813803aaSPhilippe Mathieu-Daudésummary_info = {}
3957813803aaSPhilippe Mathieu-Daudésummary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
3958728c0a2fSPaolo Bonzinisummary_info += {'coroutine pool':    have_coroutine_pool}
3959813803aaSPhilippe Mathieu-Daudéif have_block
3960622d64ffSPaolo Bonzini  summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')}
3961622d64ffSPaolo Bonzini  summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')}
3962c55cf6abSPaolo Bonzini  summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')}
39633887702eSChristian Schoenebeck  summary_info += {'VirtFS (9P) support':    have_virtfs}
39643887702eSChristian Schoenebeck  summary_info += {'VirtFS (9P) Proxy Helper support': have_virtfs_proxy_helper}
3965406523f6SPaolo Bonzini  summary_info += {'Live block migration': config_host_data.get('CONFIG_LIVE_BLOCK_MIGRATION')}
3966406523f6SPaolo Bonzini  summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')}
3967ed793c2cSPaolo Bonzini  summary_info += {'bochs support':     get_option('bochs').allowed()}
3968ed793c2cSPaolo Bonzini  summary_info += {'cloop support':     get_option('cloop').allowed()}
3969ed793c2cSPaolo Bonzini  summary_info += {'dmg support':       get_option('dmg').allowed()}
3970ed793c2cSPaolo Bonzini  summary_info += {'qcow v1 support':   get_option('qcow1').allowed()}
3971ed793c2cSPaolo Bonzini  summary_info += {'vdi support':       get_option('vdi').allowed()}
397211cea42eSVladimir Sementsov-Ogievskiy  summary_info += {'vhdx support':      get_option('vhdx').allowed()}
397311cea42eSVladimir Sementsov-Ogievskiy  summary_info += {'vmdk support':      get_option('vmdk').allowed()}
397411cea42eSVladimir Sementsov-Ogievskiy  summary_info += {'vpc support':       get_option('vpc').allowed()}
3975ed793c2cSPaolo Bonzini  summary_info += {'vvfat support':     get_option('vvfat').allowed()}
3976ed793c2cSPaolo Bonzini  summary_info += {'qed support':       get_option('qed').allowed()}
3977ed793c2cSPaolo Bonzini  summary_info += {'parallels support': get_option('parallels').allowed()}
3978bb647c49SPaolo Bonzini  summary_info += {'FUSE exports':      fuse}
39792a2359b8SXie Yongji  summary_info += {'VDUSE block exports': have_vduse_blk_export}
3980813803aaSPhilippe Mathieu-Daudéendif
3981813803aaSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Block layer support')
3982813803aaSPhilippe Mathieu-Daudé
3983aa58028aSPhilippe Mathieu-Daudé# Crypto
3984aa3ca634SPhilippe Mathieu-Daudésummary_info = {}
398541f2ae28SPaolo Bonzinisummary_info += {'TLS priority':      get_option('tls_priority')}
3986bb647c49SPaolo Bonzinisummary_info += {'GNUTLS support':    gnutls}
3987bb647c49SPaolo Bonziniif gnutls.found()
3988cc4c7c73SDaniel P. Berrangé  summary_info += {'  GNUTLS crypto':   gnutls_crypto.found()}
3989bb647c49SPaolo Bonziniendif
3990bb647c49SPaolo Bonzinisummary_info += {'libgcrypt':         gcrypt}
3991bb647c49SPaolo Bonzinisummary_info += {'nettle':            nettle}
399257612511SPaolo Bonziniif nettle.found()
399357612511SPaolo Bonzini   summary_info += {'  XTS':             xts != 'private'}
3994f9332757SPaolo Bonziniendif
399534b52615SPaolo Bonzinisummary_info += {'AF_ALG support':    have_afalg}
3996c55cf6abSPaolo Bonzinisummary_info += {'rng-none':          get_option('rng_none')}
39972edd2c04SPaolo Bonzinisummary_info += {'Linux keyring':     have_keyring}
3998aa58028aSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Crypto')
3999aa58028aSPhilippe Mathieu-Daudé
400069a78cceSPhilippe Mathieu-Daudé# Libraries
4001aa58028aSPhilippe Mathieu-Daudésummary_info = {}
4002aa58028aSPhilippe Mathieu-Daudéif targetos == 'darwin'
4003bb647c49SPaolo Bonzini  summary_info += {'Cocoa support':           cocoa}
4004e2c1d78dSVladislav Yaroshchuk  summary_info += {'vmnet.framework support': vmnet}
4005aa58028aSPhilippe Mathieu-Daudéendif
4006bb647c49SPaolo Bonzinisummary_info += {'SDL support':       sdl}
4007bb647c49SPaolo Bonzinisummary_info += {'SDL image support': sdl_image}
4008bb647c49SPaolo Bonzinisummary_info += {'GTK support':       gtk}
4009bb647c49SPaolo Bonzinisummary_info += {'pixman':            pixman}
4010bb647c49SPaolo Bonzinisummary_info += {'VTE support':       vte}
40115890258aSThomas Huthsummary_info += {'slirp support':     slirp}
4012bb647c49SPaolo Bonzinisummary_info += {'libtasn1':          tasn1}
4013bb647c49SPaolo Bonzinisummary_info += {'PAM':               pam}
4014bb647c49SPaolo Bonzinisummary_info += {'iconv support':     iconv}
4015bb647c49SPaolo Bonzinisummary_info += {'curses support':    curses}
4016bb647c49SPaolo Bonzinisummary_info += {'virgl support':     virgl}
4017fd66dbd4SStefan Hajnoczisummary_info += {'blkio support':     blkio}
4018bb647c49SPaolo Bonzinisummary_info += {'curl support':      curl}
4019bb647c49SPaolo Bonzinisummary_info += {'Multipath support': mpathpersist}
402095f8510eSKshitij Surisummary_info += {'PNG support':       png}
4021bb647c49SPaolo Bonzinisummary_info += {'VNC support':       vnc}
4022a0b93237SPaolo Bonziniif vnc.found()
4023bb647c49SPaolo Bonzini  summary_info += {'VNC SASL support':  sasl}
4024bb647c49SPaolo Bonzini  summary_info += {'VNC JPEG support':  jpeg}
4025f9332757SPaolo Bonziniendif
402687430d5bSPaolo Bonziniif targetos not in ['darwin', 'haiku', 'windows']
402787430d5bSPaolo Bonzini  summary_info += {'OSS support':     oss}
4028663df1ccSAlexandre Ratchov  summary_info += {'sndio support':   sndio}
402987430d5bSPaolo Bonzinielif targetos == 'darwin'
403087430d5bSPaolo Bonzini  summary_info += {'CoreAudio support': coreaudio}
403187430d5bSPaolo Bonzinielif targetos == 'windows'
403287430d5bSPaolo Bonzini  summary_info += {'DirectSound support': dsound}
403387430d5bSPaolo Bonziniendif
403487430d5bSPaolo Bonziniif targetos == 'linux'
403587430d5bSPaolo Bonzini  summary_info += {'ALSA support':    alsa}
403687430d5bSPaolo Bonzini  summary_info += {'PulseAudio support': pulse}
403787430d5bSPaolo Bonziniendif
4038c2d3d1c2SDorinda Basseysummary_info += {'Pipewire support':   pipewire}
403987430d5bSPaolo Bonzinisummary_info += {'JACK support':      jack}
4040bb647c49SPaolo Bonzinisummary_info += {'brlapi support':    brlapi}
4041e1723999SPaolo Bonzinisummary_info += {'vde support':       vde}
4042837b84b1SPaolo Bonzinisummary_info += {'netmap support':    have_netmap}
4043eea9453aSThomas Huthsummary_info += {'l2tpv3 support':    have_l2tpv3}
4044ff66f3e5SPaolo Bonzinisummary_info += {'Linux AIO support': libaio}
4045bb647c49SPaolo Bonzinisummary_info += {'Linux io_uring support': linux_io_uring}
4046bb647c49SPaolo Bonzinisummary_info += {'ATTR/XATTR support': libattr}
40473730a734SPaolo Bonzinisummary_info += {'RDMA support':      rdma}
40483730a734SPaolo Bonzinisummary_info += {'PVRDMA support':    have_pvrdma}
4049fbb4121dSPaolo Bonzinisummary_info += {'fdt support':       fdt_opt == 'disabled' ? false : fdt_opt}
4050bb647c49SPaolo Bonzinisummary_info += {'libcap-ng support': libcap_ng}
4051bb647c49SPaolo Bonzinisummary_info += {'bpf support':       libbpf}
40523f0a5d55SMarc-André Lureausummary_info += {'spice protocol support': spice_protocol}
40533f0a5d55SMarc-André Lureauif spice_protocol.found()
40543f0a5d55SMarc-André Lureau  summary_info += {'  spice server support': spice}
40553f0a5d55SMarc-André Lureauendif
4056bb647c49SPaolo Bonzinisummary_info += {'rbd support':       rbd}
4057bb647c49SPaolo Bonzinisummary_info += {'smartcard support': cacard}
4058bb647c49SPaolo Bonzinisummary_info += {'U2F support':       u2f}
4059bb647c49SPaolo Bonzinisummary_info += {'libusb':            libusb}
4060bb647c49SPaolo Bonzinisummary_info += {'usb net redir':     usbredir}
406188b6e618SPaolo Bonzinisummary_info += {'OpenGL support (epoxy)': opengl}
4062bb647c49SPaolo Bonzinisummary_info += {'GBM':               gbm}
4063bb647c49SPaolo Bonzinisummary_info += {'libiscsi support':  libiscsi}
4064bb647c49SPaolo Bonzinisummary_info += {'libnfs support':    libnfs}
4065f9332757SPaolo Bonziniif targetos == 'windows'
406620cf5cb4SPaolo Bonzini  if have_ga
40678821a389SMarc-André Lureau    summary_info += {'QGA VSS support':   have_qga_vss}
4068b846ab7cSPaolo Bonzini  endif
4069f9332757SPaolo Bonziniendif
4070bb647c49SPaolo Bonzinisummary_info += {'seccomp support':   seccomp}
4071bb647c49SPaolo Bonzinisummary_info += {'GlusterFS support': glusterfs}
40720d04c4c9SPaolo Bonzinisummary_info += {'TPM support':       have_tpm}
4073e6a52b36SThomas Huthsummary_info += {'libssh support':    libssh}
4074bb647c49SPaolo Bonzinisummary_info += {'lzo support':       lzo}
4075bb647c49SPaolo Bonzinisummary_info += {'snappy support':    snappy}
4076bb647c49SPaolo Bonzinisummary_info += {'bzip2 support':     libbzip2}
4077bb647c49SPaolo Bonzinisummary_info += {'lzfse support':     liblzfse}
4078bb647c49SPaolo Bonzinisummary_info += {'zstd support':      zstd}
4079488a8c73SPaolo Bonzinisummary_info += {'NUMA host support': numa}
408083602083SThomas Huthsummary_info += {'capstone':          capstone}
4081bb647c49SPaolo Bonzinisummary_info += {'libpmem support':   libpmem}
4082bb647c49SPaolo Bonzinisummary_info += {'libdaxctl support': libdaxctl}
4083bb647c49SPaolo Bonzinisummary_info += {'libudev':           libudev}
4084bb647c49SPaolo Bonzini# Dummy dependency, keep .found()
4085df4ea709SMax Reitzsummary_info += {'FUSE lseek':        fuse_lseek.found()}
40863d212b41SRichard W.M. Jonessummary_info += {'selinux':           selinux}
40877c10cb38SIlya Leoshkevichsummary_info += {'libdw':             libdw}
408869a78cceSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Dependencies')
4089f9332757SPaolo Bonzini
4090f9332757SPaolo Bonziniif not supported_cpus.contains(cpu)
4091f9332757SPaolo Bonzini  message()
4092f9332757SPaolo Bonzini  warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
4093f9332757SPaolo Bonzini  message()
4094f9332757SPaolo Bonzini  message('CPU host architecture ' + cpu + ' support is not currently maintained.')
4095f9332757SPaolo Bonzini  message('The QEMU project intends to remove support for this host CPU in')
4096f9332757SPaolo Bonzini  message('a future release if nobody volunteers to maintain it and to')
4097f9332757SPaolo Bonzini  message('provide a build host for our continuous integration setup.')
4098f9332757SPaolo Bonzini  message('configure has succeeded and you can continue to build, but')
4099f9332757SPaolo Bonzini  message('if you care about QEMU on this platform you should contact')
4100f9332757SPaolo Bonzini  message('us upstream at qemu-devel@nongnu.org.')
4101f9332757SPaolo Bonziniendif
4102f9332757SPaolo Bonzini
4103f9332757SPaolo Bonziniif not supported_oses.contains(targetos)
4104f9332757SPaolo Bonzini  message()
4105f9332757SPaolo Bonzini  warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
4106f9332757SPaolo Bonzini  message()
4107f9332757SPaolo Bonzini  message('Host OS ' + targetos + 'support is not currently maintained.')
4108f9332757SPaolo Bonzini  message('The QEMU project intends to remove support for this host OS in')
4109f9332757SPaolo Bonzini  message('a future release if nobody volunteers to maintain it and to')
4110f9332757SPaolo Bonzini  message('provide a build host for our continuous integration setup.')
4111f9332757SPaolo Bonzini  message('configure has succeeded and you can continue to build, but')
4112f9332757SPaolo Bonzini  message('if you care about QEMU on this platform you should contact')
4113f9332757SPaolo Bonzini  message('us upstream at qemu-devel@nongnu.org.')
4114f9332757SPaolo Bonziniendif
4115