xref: /qemu/meson.build (revision a988b4c5)
13b087f79SPaolo Bonziniproject('qemu', ['c'], meson_version: '>=0.63.0',
2654d6b04SPaolo Bonzini        default_options: ['warning_level=1', 'c_std=gnu11', 'cpp_std=gnu++11', 'b_colorout=auto',
30a31e3a0SPaolo Bonzini                          'b_staticpic=false', 'stdsplit=false', 'optimization=2', 'b_pie=true'],
4654d6b04SPaolo Bonzini        version: files('VERSION'))
5a5665051SPaolo Bonzini
6e287072bSThomas Huthadd_test_setup('quick', exclude_suites: ['slow', 'thorough'], is_default: true)
7e287072bSThomas Huthadd_test_setup('slow', exclude_suites: ['thorough'], env: ['G_TEST_SLOW=1', 'SPEED=slow'])
8e287072bSThomas Huthadd_test_setup('thorough', env: ['G_TEST_SLOW=1', 'SPEED=thorough'])
93d2f73efSPaolo Bonzini
10cf60ccc3SAkihiko Odakimeson.add_postconf_script(find_program('scripts/symlink-install-tree.py'))
11cf60ccc3SAkihiko Odaki
12a5665051SPaolo Bonzininot_found = dependency('', required: false)
13b29b40f4SPaolo Bonzinikeyval = import('keyval')
14a81df1b6SPaolo Bonziniss = import('sourceset')
158b18cdbfSRichard Hendersonfs = import('fs')
16a81df1b6SPaolo Bonzini
17e5134024SPaolo Bonzinitargetos = host_machine.system()
18ce1c1e7aSPaolo Bonzinish = find_program('sh')
19a5665051SPaolo Bonziniconfig_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
20d7dedf42SPaolo Bonzini
21e5134024SPaolo Bonzinicc = meson.get_compiler('c')
22e5134024SPaolo Bonziniall_languages = ['c']
23e5134024SPaolo Bonziniif add_languages('cpp', required: false, native: false)
24e5134024SPaolo Bonzini  all_languages += ['cpp']
25e5134024SPaolo Bonzini  cxx = meson.get_compiler('cpp')
26e5134024SPaolo Bonziniendif
27e5134024SPaolo Bonziniif targetos == 'darwin' and \
28e5134024SPaolo Bonzini   add_languages('objc', required: get_option('cocoa'), native: false)
29e5134024SPaolo Bonzini  all_languages += ['objc']
30e5134024SPaolo Bonzini  objc = meson.get_compiler('objc')
31e5134024SPaolo Bonziniendif
32e5134024SPaolo Bonzini
33e3667660SYonggang Luo# Temporary directory used for files created while
34e3667660SYonggang Luo# configure runs. Since it is in the build directory
35e3667660SYonggang Luo# we can safely blow away any previous version of it
36e3667660SYonggang Luo# (and we need not jump through hoops to try to delete
37e3667660SYonggang Luo# it when configure exits.)
38e3667660SYonggang Luotmpdir = meson.current_build_dir() / 'meson-private/temp'
398fe11232SMarc-André Lureau
408fe11232SMarc-André Lureauif get_option('qemu_suffix').startswith('/')
418fe11232SMarc-André Lureau  error('qemu_suffix cannot start with a /')
428fe11232SMarc-André Lureauendif
438fe11232SMarc-André Lureau
4416bf7a33SPaolo Bonziniqemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
45ab4c0996SMarc-André Lureauqemu_datadir = get_option('datadir') / get_option('qemu_suffix')
46491e74c1SMarc-André Lureauqemu_docdir = get_option('docdir') / get_option('qemu_suffix')
4716bf7a33SPaolo Bonziniqemu_moddir = get_option('libdir') / get_option('qemu_suffix')
4816bf7a33SPaolo Bonzini
4916bf7a33SPaolo Bonziniqemu_desktopdir = get_option('datadir') / 'applications'
5016bf7a33SPaolo Bonziniqemu_icondir = get_option('datadir') / 'icons'
5116bf7a33SPaolo Bonzini
52859aef02SPaolo Bonziniconfig_host_data = configuration_data()
53859aef02SPaolo Bonzinigenh = []
54b83a80e8SVladimir Sementsov-Ogievskiyqapi_trace_events = []
55a5665051SPaolo Bonzini
5620cf5cb4SPaolo Bonzinibsd_oses = ['gnu/kfreebsd', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'darwin']
57201e8ed7SPaolo Bonzinisupported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
58ba0e7333SRichard Hendersonsupported_cpus = ['ppc', 'ppc64', 's390x', 'riscv', 'x86', 'x86_64',
596d0b52edSRichard Henderson  'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc64']
60201e8ed7SPaolo Bonzini
61201e8ed7SPaolo Bonzinicpu = host_machine.cpu_family()
62c94c2394SRichard Henderson
63c94c2394SRichard Henderson# Unify riscv* to a single family.
64c94c2394SRichard Hendersonif cpu in ['riscv32', 'riscv64']
65c94c2394SRichard Henderson  cpu = 'riscv'
66c94c2394SRichard Hendersonendif
67c94c2394SRichard Henderson
6820cf5cb4SPaolo Bonzinitarget_dirs = config_host['TARGET_DIRS'].split()
6920cf5cb4SPaolo Bonzinihave_linux_user = false
7020cf5cb4SPaolo Bonzinihave_bsd_user = false
7120cf5cb4SPaolo Bonzinihave_system = false
7220cf5cb4SPaolo Bonziniforeach target : target_dirs
7320cf5cb4SPaolo Bonzini  have_linux_user = have_linux_user or target.endswith('linux-user')
7420cf5cb4SPaolo Bonzini  have_bsd_user = have_bsd_user or target.endswith('bsd-user')
7520cf5cb4SPaolo Bonzini  have_system = have_system or target.endswith('-softmmu')
7620cf5cb4SPaolo Bonziniendforeach
7720cf5cb4SPaolo Bonzinihave_user = have_linux_user or have_bsd_user
7820cf5cb4SPaolo Bonzinihave_tools = get_option('tools') \
7920cf5cb4SPaolo Bonzini  .disable_auto_if(not have_system) \
8020cf5cb4SPaolo Bonzini  .allowed()
8120cf5cb4SPaolo Bonzinihave_ga = get_option('guest_agent') \
8220cf5cb4SPaolo Bonzini  .disable_auto_if(not have_system and not have_tools) \
8328236ad8SBrad Smith  .require(targetos in ['sunos', 'linux', 'windows', 'freebsd', 'netbsd', 'openbsd'],
8420cf5cb4SPaolo Bonzini           error_message: 'unsupported OS for QEMU guest agent') \
8520cf5cb4SPaolo Bonzini  .allowed()
866002711cSPaolo Bonzinienable_modules = get_option('modules') \
876002711cSPaolo Bonzini  .require(targetos != 'windows',
886002711cSPaolo Bonzini           error_message: 'Modules are not available for Windows') \
896002711cSPaolo Bonzini  .require(not get_option('prefer_static'),
906002711cSPaolo Bonzini           error_message: 'Modules are incompatible with static linking') \
916002711cSPaolo Bonzini  .allowed()
9220cf5cb4SPaolo Bonzinihave_block = have_system or have_tools
9320cf5cb4SPaolo Bonzini
9420cf5cb4SPaolo Bonzinipython = import('python').find_installation()
9520cf5cb4SPaolo Bonzini
96823eb013SPaolo Bonziniif cpu not in supported_cpus
97823eb013SPaolo Bonzini  host_arch = 'unknown'
98823eb013SPaolo Bonzinielif cpu == 'x86'
99823eb013SPaolo Bonzini  host_arch = 'i386'
1000e3ed77dSRichard Hendersonelif cpu == 'mips64'
1010e3ed77dSRichard Henderson  host_arch = 'mips'
102823eb013SPaolo Bonzinielse
103823eb013SPaolo Bonzini  host_arch = cpu
104823eb013SPaolo Bonziniendif
105823eb013SPaolo Bonzini
1068a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64']
1078a19980eSPaolo Bonzini  kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
1088a19980eSPaolo Bonzinielif cpu == 'aarch64'
1098a19980eSPaolo Bonzini  kvm_targets = ['aarch64-softmmu']
1108a19980eSPaolo Bonzinielif cpu == 's390x'
1118a19980eSPaolo Bonzini  kvm_targets = ['s390x-softmmu']
1128a19980eSPaolo Bonzinielif cpu in ['ppc', 'ppc64']
1138a19980eSPaolo Bonzini  kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
114fbc5884cSHuacai Chenelif cpu in ['mips', 'mips64']
115fbc5884cSHuacai Chen  kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
116fbf43c7dSYifei Jiangelif cpu in ['riscv']
117fbf43c7dSYifei Jiang  kvm_targets = ['riscv32-softmmu', 'riscv64-softmmu']
1188a19980eSPaolo Bonzinielse
1198a19980eSPaolo Bonzini  kvm_targets = []
1208a19980eSPaolo Bonziniendif
1218a19980eSPaolo Bonzini
12244d3d898SIgor Mammedovkvm_targets_c = '""'
12343a363aeSPaolo Bonziniif get_option('kvm').allowed() and targetos == 'linux'
124e741aff0SIgor Mammedov  kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
125e741aff0SIgor Mammedovendif
126e741aff0SIgor Mammedovconfig_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
127e741aff0SIgor Mammedov
1288a19980eSPaolo Bonziniaccelerator_targets = { 'CONFIG_KVM': kvm_targets }
129844a06bbSAlexander Graf
130844a06bbSAlexander Grafif cpu in ['aarch64']
131844a06bbSAlexander Graf  accelerator_targets += {
132844a06bbSAlexander Graf    'CONFIG_HVF': ['aarch64-softmmu']
133844a06bbSAlexander Graf  }
134844a06bbSAlexander Grafendif
135844a06bbSAlexander Graf
1360c3e41d4SAlex Bennéeif cpu in ['x86', 'x86_64', 'arm', 'aarch64']
1372a2d51bcSMarc-André Lureau  # i386 emulator provides xenpv machine type for multiple architectures
1380c3e41d4SAlex Bennée  accelerator_targets += {
1390c3e41d4SAlex Bennée    'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
1400c3e41d4SAlex Bennée  }
1410c3e41d4SAlex Bennéeendif
1428a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64']
1438a19980eSPaolo Bonzini  accelerator_targets += {
1448a19980eSPaolo Bonzini    'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
1458a19980eSPaolo Bonzini    'CONFIG_HVF': ['x86_64-softmmu'],
14674a414a1SReinoud Zandijk    'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
1478a19980eSPaolo Bonzini    'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
1488a19980eSPaolo Bonzini  }
1498a19980eSPaolo Bonziniendif
1508a19980eSPaolo Bonzini
151a1b176f9SPaolo Bonzinimodular_tcg = []
152a1b176f9SPaolo Bonzini# Darwin does not support references to thread-local variables in modules
153a1b176f9SPaolo Bonziniif targetos != 'darwin'
154dae0ec15SGerd Hoffmann  modular_tcg = ['i386-softmmu', 'x86_64-softmmu']
155a1b176f9SPaolo Bonziniendif
156dae0ec15SGerd Hoffmann
157eae9a1d1SPhilippe Mathieu-Daudéedk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ]
158e49c0ef6SPaolo Bonziniunpack_edk2_blobs = false
159e49c0ef6SPaolo Bonziniforeach target : edk2_targets
160e49c0ef6SPaolo Bonzini  if target in target_dirs
161e49c0ef6SPaolo Bonzini    bzip2 = find_program('bzip2', required: get_option('install_blobs'))
162e49c0ef6SPaolo Bonzini    unpack_edk2_blobs = bzip2.found()
163e49c0ef6SPaolo Bonzini    break
164eae9a1d1SPhilippe Mathieu-Daudé  endif
165e49c0ef6SPaolo Bonziniendforeach
16645b545ddSPhilippe Mathieu-Daudé
1679c29b741SPaolo Bonzinidtrace = not_found
1689c29b741SPaolo Bonzinistap = not_found
1699c29b741SPaolo Bonziniif 'dtrace' in get_option('trace_backends')
1709c29b741SPaolo Bonzini  dtrace = find_program('dtrace', required: true)
1719c29b741SPaolo Bonzini  stap = find_program('stap', required: false)
1729c29b741SPaolo Bonzini  if stap.found()
1739c29b741SPaolo Bonzini    # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
1749c29b741SPaolo Bonzini    # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
1759c29b741SPaolo Bonzini    # instead. QEMU --enable-modules depends on this because the SystemTap
1769c29b741SPaolo Bonzini    # semaphores are linked into the main binary and not the module's shared
1779c29b741SPaolo Bonzini    # object.
1789c29b741SPaolo Bonzini    add_global_arguments('-DSTAP_SDT_V2',
179e5134024SPaolo Bonzini                         native: false, language: all_languages)
1809c29b741SPaolo Bonzini  endif
1819c29b741SPaolo Bonziniendif
1829c29b741SPaolo Bonzini
18340c909f5SPaolo Bonziniif get_option('iasl') == ''
18440c909f5SPaolo Bonzini  iasl = find_program('iasl', required: false)
18540c909f5SPaolo Bonzinielse
18640c909f5SPaolo Bonzini  iasl = find_program(get_option('iasl'), required: true)
18740c909f5SPaolo Bonziniendif
18840c909f5SPaolo Bonzini
189201e8ed7SPaolo Bonzini##################
190201e8ed7SPaolo Bonzini# Compiler flags #
191201e8ed7SPaolo Bonzini##################
192201e8ed7SPaolo Bonzini
193*a988b4c5SPaolo Bonzini# default flags for all hosts
194*a988b4c5SPaolo Bonzini# We use -fwrapv to tell the compiler that we require a C dialect where
195*a988b4c5SPaolo Bonzini# left shift of signed integers is well defined and has the expected
196*a988b4c5SPaolo Bonzini# 2s-complement style results. (Both clang and gcc agree that it
197*a988b4c5SPaolo Bonzini# provides these semantics.)
198*a988b4c5SPaolo Bonzini
199*a988b4c5SPaolo Bonziniqemu_common_flags = [
200*a988b4c5SPaolo Bonzini  '-D_GNU_SOURCE', '-D_FILE_OFFSET_BITS=64', '-D_LARGEFILE_SOURCE',
201*a988b4c5SPaolo Bonzini  '-fno-strict-aliasing', '-fno-common', '-fwrapv' ]
202d67212d4SPaolo Bonziniqemu_cflags = []
203911d4caaSPaolo Bonziniqemu_ldflags = []
2048cc2d231SPaolo Bonzini
205*a988b4c5SPaolo Bonziniif targetos == 'darwin'
206*a988b4c5SPaolo Bonzini  # Disable attempts to use ObjectiveC features in os/object.h since they
207*a988b4c5SPaolo Bonzini  # won't work when we're compiling with gcc as a C compiler.
208*a988b4c5SPaolo Bonzini  qemu_common_flags += '-DOS_OBJECT_USE_OBJC=0'
209*a988b4c5SPaolo Bonzinielif targetos == 'solaris'
210*a988b4c5SPaolo Bonzini  # needed for CMSG_ macros in sys/socket.h
211*a988b4c5SPaolo Bonzini  qemu_common_flags += '-D_XOPEN_SOURCE=600'
212*a988b4c5SPaolo Bonzini  # needed for TIOCWIN* defines in termios.h
213*a988b4c5SPaolo Bonzini  qemu_common_flags += '-D__EXTENSIONS__'
214*a988b4c5SPaolo Bonzinielif targetos == 'haiku'
215*a988b4c5SPaolo Bonzini  qemu_common_flags += ['-DB_USE_POSITIVE_POSIX_ERRORS', '-D_BSD_SOURCE', '-fPIC']
216*a988b4c5SPaolo Bonziniendif
217*a988b4c5SPaolo Bonzini
218*a988b4c5SPaolo Bonzini# __sync_fetch_and_and requires at least -march=i486. Many toolchains
219*a988b4c5SPaolo Bonzini# use i686 as default anyway, but for those that don't, an explicit
220*a988b4c5SPaolo Bonzini# specification is necessary
221*a988b4c5SPaolo Bonziniif host_arch == 'i386' and not cc.links('''
222*a988b4c5SPaolo Bonzini  static int sfaa(int *ptr)
223*a988b4c5SPaolo Bonzini  {
224*a988b4c5SPaolo Bonzini    return __sync_fetch_and_and(ptr, 0);
225*a988b4c5SPaolo Bonzini  }
226*a988b4c5SPaolo Bonzini
227*a988b4c5SPaolo Bonzini  int main(void)
228*a988b4c5SPaolo Bonzini  {
229*a988b4c5SPaolo Bonzini    int val = 42;
230*a988b4c5SPaolo Bonzini    val = __sync_val_compare_and_swap(&val, 0, 1);
231*a988b4c5SPaolo Bonzini    sfaa(&val);
232*a988b4c5SPaolo Bonzini    return val;
233*a988b4c5SPaolo Bonzini  }''')
234*a988b4c5SPaolo Bonzini  qemu_common_flags = ['-march=i486'] + qemu_common_flags
235*a988b4c5SPaolo Bonziniendif
236*a988b4c5SPaolo Bonzini
237d67212d4SPaolo Bonziniif get_option('gprof')
238d67212d4SPaolo Bonzini  qemu_common_flags += ['-p']
239d67212d4SPaolo Bonzini  qemu_ldflags += ['-p']
240d67212d4SPaolo Bonziniendif
241d67212d4SPaolo Bonzini
242a0cbd2e8SPaolo Bonziniif get_option('prefer_static')
243e4333d14SPaolo Bonzini  qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
244e4333d14SPaolo Bonziniendif
245e4333d14SPaolo Bonzini
246*a988b4c5SPaolo Bonzini# Meson currently only handles pie as a boolean for now, so if the user
247*a988b4c5SPaolo Bonzini# has explicitly disabled PIE we need to extend our cflags.
248*a988b4c5SPaolo Bonziniif not get_option('b_pie')
249*a988b4c5SPaolo Bonzini  qemu_common_flags += cc.get_supported_arguments('-fno-pie')
250*a988b4c5SPaolo Bonzini  if not get_option('prefer_static')
251*a988b4c5SPaolo Bonzini    # No PIE is implied by -static which we added above.
252*a988b4c5SPaolo Bonzini    qemu_ldflags += cc.get_supported_link_arguments('-no-pie')
253*a988b4c5SPaolo Bonzini  endif
254*a988b4c5SPaolo Bonziniendif
255*a988b4c5SPaolo Bonzini
256911d4caaSPaolo Bonziniif not get_option('stack_protector').disabled()
257911d4caaSPaolo Bonzini  stack_protector_probe = '''
258911d4caaSPaolo Bonzini    int main(int argc, char *argv[])
259911d4caaSPaolo Bonzini    {
260911d4caaSPaolo Bonzini      char arr[64], *p = arr, *c = argv[argc - 1];
261911d4caaSPaolo Bonzini      while (*c) {
262911d4caaSPaolo Bonzini          *p++ = *c++;
263911d4caaSPaolo Bonzini      }
264911d4caaSPaolo Bonzini      return 0;
265911d4caaSPaolo Bonzini    }'''
266911d4caaSPaolo Bonzini  have_stack_protector = false
267911d4caaSPaolo Bonzini  foreach arg : ['-fstack-protector-strong', '-fstack-protector-all']
268911d4caaSPaolo Bonzini    # We need to check both a compile and a link, since some compiler
269911d4caaSPaolo Bonzini    # setups fail only on a .c->.o compile and some only at link time
270911d4caaSPaolo Bonzini    if cc.compiles(stack_protector_probe, args: ['-Werror', arg]) and \
271911d4caaSPaolo Bonzini       cc.links(stack_protector_probe, args: ['-Werror', arg])
272911d4caaSPaolo Bonzini      have_stack_protector = true
273911d4caaSPaolo Bonzini      qemu_cflags += arg
274911d4caaSPaolo Bonzini      qemu_ldflags += arg
275911d4caaSPaolo Bonzini      break
276911d4caaSPaolo Bonzini    endif
277911d4caaSPaolo Bonzini  endforeach
278911d4caaSPaolo Bonzini  get_option('stack_protector') \
279911d4caaSPaolo Bonzini    .require(have_stack_protector, error_message: 'Stack protector not supported')
280911d4caaSPaolo Bonziniendif
281911d4caaSPaolo Bonzini
2826739825aSPaolo Bonzinicoroutine_backend = get_option('coroutine_backend')
2836739825aSPaolo Bonziniucontext_probe = '''
2846739825aSPaolo Bonzini  #include <ucontext.h>
2856739825aSPaolo Bonzini  #ifdef __stub_makecontext
2866739825aSPaolo Bonzini  #error Ignoring glibc stub makecontext which will always fail
2876739825aSPaolo Bonzini  #endif
2886739825aSPaolo Bonzini  int main(void) { makecontext(0, 0, 0); return 0; }'''
2896739825aSPaolo Bonzini
2906739825aSPaolo Bonzini# On Windows the only valid backend is the Windows specific one.
2916739825aSPaolo Bonzini# For POSIX prefer ucontext, but it's not always possible. The fallback
2926739825aSPaolo Bonzini# is sigcontext.
2936739825aSPaolo Bonzinisupported_backends = []
2946739825aSPaolo Bonziniif targetos == 'windows'
2956739825aSPaolo Bonzini  supported_backends += ['windows']
2966739825aSPaolo Bonzinielse
2976739825aSPaolo Bonzini  if targetos != 'darwin' and cc.links(ucontext_probe)
2986739825aSPaolo Bonzini    supported_backends += ['ucontext']
2996739825aSPaolo Bonzini  endif
3006739825aSPaolo Bonzini  supported_backends += ['sigaltstack']
3016739825aSPaolo Bonziniendif
3026739825aSPaolo Bonzini
3036739825aSPaolo Bonziniif coroutine_backend == 'auto'
3046739825aSPaolo Bonzini  coroutine_backend = supported_backends[0]
3056739825aSPaolo Bonzinielif coroutine_backend not in supported_backends
3066739825aSPaolo Bonzini  error('"@0@" backend requested but not available.  Available backends: @1@' \
3076739825aSPaolo Bonzini        .format(coroutine_backend, ', '.join(supported_backends)))
3086739825aSPaolo Bonziniendif
3096739825aSPaolo Bonzini
310721fa5e5SPaolo Bonzini# Compiles if SafeStack *not* enabled
311721fa5e5SPaolo Bonzinisafe_stack_probe = '''
312721fa5e5SPaolo Bonzini  int main(void)
313721fa5e5SPaolo Bonzini  {
314721fa5e5SPaolo Bonzini  #if defined(__has_feature)
315721fa5e5SPaolo Bonzini  #if __has_feature(safe_stack)
316721fa5e5SPaolo Bonzini  #error SafeStack Enabled
317721fa5e5SPaolo Bonzini  #endif
318721fa5e5SPaolo Bonzini  #endif
319721fa5e5SPaolo Bonzini      return 0;
320721fa5e5SPaolo Bonzini  }'''
321721fa5e5SPaolo Bonziniif get_option('safe_stack') != not cc.compiles(safe_stack_probe)
322721fa5e5SPaolo Bonzini  safe_stack_arg = get_option('safe_stack') ? '-fsanitize=safe-stack' : '-fno-sanitize=safe-stack'
323721fa5e5SPaolo Bonzini  if get_option('safe_stack') != not cc.compiles(safe_stack_probe, args: safe_stack_arg)
324721fa5e5SPaolo Bonzini    error(get_option('safe_stack') \
325721fa5e5SPaolo Bonzini          ? 'SafeStack not supported by your compiler' \
326721fa5e5SPaolo Bonzini          : 'Cannot disable SafeStack')
327721fa5e5SPaolo Bonzini  endif
328721fa5e5SPaolo Bonzini  qemu_cflags += safe_stack_arg
329721fa5e5SPaolo Bonzini  qemu_ldflags += safe_stack_arg
330721fa5e5SPaolo Bonziniendif
3316739825aSPaolo Bonziniif get_option('safe_stack') and coroutine_backend != 'ucontext'
332721fa5e5SPaolo Bonzini  error('SafeStack is only supported with the ucontext coroutine backend')
333721fa5e5SPaolo Bonziniendif
334721fa5e5SPaolo Bonzini
33534f983d8SPaolo Bonziniif get_option('sanitizers')
33634f983d8SPaolo Bonzini  if cc.has_argument('-fsanitize=address')
33734f983d8SPaolo Bonzini    qemu_cflags = ['-fsanitize=address'] + qemu_cflags
33834f983d8SPaolo Bonzini    qemu_ldflags = ['-fsanitize=address'] + qemu_ldflags
33934f983d8SPaolo Bonzini  endif
34034f983d8SPaolo Bonzini
34134f983d8SPaolo Bonzini  # Detect static linking issue with ubsan - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
34234f983d8SPaolo Bonzini  if cc.links('int main(int argc, char **argv) { return argc + 1; }',
34334f983d8SPaolo Bonzini              args: [qemu_ldflags, '-fsanitize=undefined'])
34434f983d8SPaolo Bonzini    qemu_cflags = ['-fsanitize=undefined'] + qemu_cflags
34534f983d8SPaolo Bonzini    qemu_ldflags = ['-fsanitize=undefined'] + qemu_ldflags
34634f983d8SPaolo Bonzini  endif
34734f983d8SPaolo Bonziniendif
34834f983d8SPaolo Bonzini
34934f983d8SPaolo Bonzini# Thread sanitizer is, for now, much noisier than the other sanitizers;
35034f983d8SPaolo Bonzini# keep it separate until that is not the case.
35134f983d8SPaolo Bonziniif get_option('tsan')
35234f983d8SPaolo Bonzini  if get_option('sanitizers')
35334f983d8SPaolo Bonzini    error('TSAN is not supported with other sanitizers')
35434f983d8SPaolo Bonzini  endif
35534f983d8SPaolo Bonzini  if not cc.has_function('__tsan_create_fiber',
35634f983d8SPaolo Bonzini                         args: '-fsanitize=thread',
35734f983d8SPaolo Bonzini                         prefix: '#include <sanitizer/tsan_interface.h>')
35834f983d8SPaolo Bonzini    error('Cannot enable TSAN due to missing fiber annotation interface')
35934f983d8SPaolo Bonzini  endif
36034f983d8SPaolo Bonzini  qemu_cflags = ['-fsanitize=thread'] + qemu_cflags
36134f983d8SPaolo Bonzini  qemu_ldflags = ['-fsanitize=thread'] + qemu_ldflags
36234f983d8SPaolo Bonziniendif
36334f983d8SPaolo Bonzini
364e4333d14SPaolo Bonzini# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
365e4333d14SPaolo Bonzini# The combination is known as "full relro", because .got.plt is read-only too.
366e4333d14SPaolo Bonziniqemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now')
367e4333d14SPaolo Bonzini
368d2147e04SPaolo Bonziniif targetos == 'windows'
369d2147e04SPaolo Bonzini  qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat')
3702d73fa74SPaolo Bonzini  qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va')
371d2147e04SPaolo Bonziniendif
372d2147e04SPaolo Bonzini
373d67212d4SPaolo Bonzini# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
37434f983d8SPaolo Bonziniif targetos != 'sunos' and not get_option('tsan')
375d67212d4SPaolo Bonzini  qemu_ldflags += cc.get_supported_link_arguments('-Wl,--warn-common')
376c55cf6abSPaolo Bonziniendif
377c55cf6abSPaolo Bonzini
378ff9ed62bSAlexander Bulekov# Specify linker-script with add_project_link_arguments so that it is not placed
379ff9ed62bSAlexander Bulekov# within a linker --start-group/--end-group pair
380537b7248SPaolo Bonziniif get_option('fuzzing')
381537b7248SPaolo Bonzini  # Specify a filter to only instrument code that is directly related to
382537b7248SPaolo Bonzini  # virtual-devices.
383537b7248SPaolo Bonzini  configure_file(output: 'instrumentation-filter',
384537b7248SPaolo Bonzini                 input: 'scripts/oss-fuzz/instrumentation-filter-template',
385537b7248SPaolo Bonzini                 copy: true)
386aa4f3a3bSAlexander Bulekov
387aa4f3a3bSAlexander Bulekov  if cc.compiles('int main () { return 0; }',
388aa4f3a3bSAlexander Bulekov                  name: '-fsanitize-coverage-allowlist=/dev/null',
389e56d0970SAlexander Bulekov                 args: ['-fsanitize-coverage-allowlist=/dev/null',
390e56d0970SAlexander Bulekov                        '-fsanitize-coverage=trace-pc'] )
391d67212d4SPaolo Bonzini    qemu_common_flags += ['-fsanitize-coverage-allowlist=instrumentation-filter']
392aa4f3a3bSAlexander Bulekov  endif
393537b7248SPaolo Bonzini
394537b7248SPaolo Bonzini  if get_option('fuzzing_engine') == ''
395537b7248SPaolo Bonzini    # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
396537b7248SPaolo Bonzini    # compiled code.  To build non-fuzzer binaries with --enable-fuzzing, link
397537b7248SPaolo Bonzini    # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
398537b7248SPaolo Bonzini    # unable to bind the fuzzer-related callbacks added by instrumentation.
399d67212d4SPaolo Bonzini    qemu_common_flags += ['-fsanitize=fuzzer-no-link']
400d67212d4SPaolo Bonzini    qemu_ldflags += ['-fsanitize=fuzzer-no-link']
401537b7248SPaolo Bonzini    # For the actual fuzzer binaries, we need to link against the libfuzzer
402537b7248SPaolo Bonzini    # library. They need to be configurable, to support OSS-Fuzz
403537b7248SPaolo Bonzini    fuzz_exe_ldflags = ['-fsanitize=fuzzer']
404537b7248SPaolo Bonzini  else
405537b7248SPaolo Bonzini    # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and
406537b7248SPaolo Bonzini    # the needed CFLAGS have already been provided
407537b7248SPaolo Bonzini    fuzz_exe_ldflags = get_option('fuzzing_engine').split()
408537b7248SPaolo Bonzini  endif
409ff9ed62bSAlexander Bulekovendif
410ff9ed62bSAlexander Bulekov
411d67212d4SPaolo Bonziniadd_global_arguments(qemu_common_flags, native: false, language: all_languages)
412d67212d4SPaolo Bonziniadd_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
413d67212d4SPaolo Bonzini
41495caf1fbSPaolo Bonzini# Collect warnings that we want to enable
41595caf1fbSPaolo Bonzini
41695caf1fbSPaolo Bonziniwarn_flags = [
41795caf1fbSPaolo Bonzini  '-Wundef',
41895caf1fbSPaolo Bonzini  '-Wwrite-strings',
41995caf1fbSPaolo Bonzini  '-Wmissing-prototypes',
42095caf1fbSPaolo Bonzini  '-Wstrict-prototypes',
42195caf1fbSPaolo Bonzini  '-Wredundant-decls',
42295caf1fbSPaolo Bonzini  '-Wold-style-declaration',
42395caf1fbSPaolo Bonzini  '-Wold-style-definition',
42495caf1fbSPaolo Bonzini  '-Wtype-limits',
42595caf1fbSPaolo Bonzini  '-Wformat-security',
42695caf1fbSPaolo Bonzini  '-Wformat-y2k',
42795caf1fbSPaolo Bonzini  '-Winit-self',
42895caf1fbSPaolo Bonzini  '-Wignored-qualifiers',
42995caf1fbSPaolo Bonzini  '-Wempty-body',
43095caf1fbSPaolo Bonzini  '-Wnested-externs',
43195caf1fbSPaolo Bonzini  '-Wendif-labels',
43295caf1fbSPaolo Bonzini  '-Wexpansion-to-defined',
43395caf1fbSPaolo Bonzini  '-Wimplicit-fallthrough=2',
43495caf1fbSPaolo Bonzini  '-Wmissing-format-attribute',
43595caf1fbSPaolo Bonzini  '-Wno-initializer-overrides',
43695caf1fbSPaolo Bonzini  '-Wno-missing-include-dirs',
43795caf1fbSPaolo Bonzini  '-Wno-shift-negative-value',
43895caf1fbSPaolo Bonzini  '-Wno-string-plus-int',
43995caf1fbSPaolo Bonzini  '-Wno-typedef-redefinition',
44095caf1fbSPaolo Bonzini  '-Wno-tautological-type-limit-compare',
44195caf1fbSPaolo Bonzini  '-Wno-psabi',
44295caf1fbSPaolo Bonzini  '-Wno-gnu-variable-sized-type-not-at-end',
44395caf1fbSPaolo Bonzini]
44495caf1fbSPaolo Bonzini
44595caf1fbSPaolo Bonziniif targetos != 'darwin'
44695caf1fbSPaolo Bonzini  warn_flags += ['-Wthread-safety']
44795caf1fbSPaolo Bonziniendif
44895caf1fbSPaolo Bonzini
449b485458eSPaolo Bonzini# Check that the C++ compiler exists and works with the C compiler.
450b485458eSPaolo Bonzinilink_language = 'c'
451b485458eSPaolo Bonzinilinker = cc
452b485458eSPaolo Bonziniqemu_cxxflags = []
453e5134024SPaolo Bonziniif 'cpp' in all_languages
45495caf1fbSPaolo Bonzini  qemu_cxxflags = ['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'] + qemu_cflags
455b485458eSPaolo Bonzini  if cxx.links(files('scripts/main.c'), args: qemu_cflags)
456b485458eSPaolo Bonzini    link_language = 'cpp'
457b485458eSPaolo Bonzini    linker = cxx
458b485458eSPaolo Bonzini  else
459b485458eSPaolo Bonzini    message('C++ compiler does not work with C compiler')
460b485458eSPaolo Bonzini    message('Disabling C++-specific optional code')
461b485458eSPaolo Bonzini  endif
462b485458eSPaolo Bonziniendif
463b485458eSPaolo Bonzini
46434f983d8SPaolo Bonzini# clang does not support glibc + FORTIFY_SOURCE (is it still true?)
46534f983d8SPaolo Bonziniif get_option('optimization') != '0' and targetos == 'linux'
46634f983d8SPaolo Bonzini  if cc.get_id() == 'gcc'
46734f983d8SPaolo Bonzini    qemu_cflags += ['-U_FORTIFY_SOURCE', '-D_FORTIFY_SOURCE=2']
46834f983d8SPaolo Bonzini  endif
46934f983d8SPaolo Bonzini  if 'cpp' in all_languages and cxx.get_id() == 'gcc'
47034f983d8SPaolo Bonzini    qemu_cxxflags += ['-U_FORTIFY_SOURCE', '-D_FORTIFY_SOURCE=2']
47134f983d8SPaolo Bonzini  endif
47234f983d8SPaolo Bonziniendif
47334f983d8SPaolo Bonzini
474d67212d4SPaolo Bonziniadd_project_arguments(qemu_cflags, native: false, language: 'c')
47595caf1fbSPaolo Bonziniadd_project_arguments(cc.get_supported_arguments(warn_flags), native: false, language: 'c')
47695caf1fbSPaolo Bonziniif 'cpp' in all_languages
477d67212d4SPaolo Bonzini  add_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
47895caf1fbSPaolo Bonzini  add_project_arguments(cxx.get_supported_arguments(warn_flags), native: false, language: 'cpp')
47995caf1fbSPaolo Bonziniendif
48095caf1fbSPaolo Bonziniif 'objc' in all_languages
48195caf1fbSPaolo Bonzini  # Note sanitizer flags are not applied to Objective-C sources!
48295caf1fbSPaolo Bonzini  add_project_arguments(objc.get_supported_arguments(warn_flags), native: false, language: 'objc')
48395caf1fbSPaolo Bonziniendif
4841e6e616dSPaolo Bonziniif targetos == 'linux'
4851e6e616dSPaolo Bonzini  add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
4861e6e616dSPaolo Bonzini                        '-isystem', 'linux-headers',
487e5134024SPaolo Bonzini                        language: all_languages)
4881e6e616dSPaolo Bonziniendif
4891e6e616dSPaolo Bonzini
49023a77b2dSPaolo Bonziniadd_project_arguments('-iquote', '.',
4911e6e616dSPaolo Bonzini                      '-iquote', meson.current_source_dir(),
4921e6e616dSPaolo Bonzini                      '-iquote', meson.current_source_dir() / 'include',
493e5134024SPaolo Bonzini                      language: all_languages)
494a5665051SPaolo Bonzini
495deb62371SPaolo Bonzinisparse = find_program('cgcc', required: get_option('sparse'))
496deb62371SPaolo Bonziniif sparse.found()
497968b4db3SPaolo Bonzini  run_target('sparse',
498968b4db3SPaolo Bonzini             command: [find_program('scripts/check_sparse.py'),
499deb62371SPaolo Bonzini                       'compile_commands.json', sparse.full_path(), '-Wbitwise',
500deb62371SPaolo Bonzini                       '-Wno-transparent-union', '-Wno-old-initializer',
501deb62371SPaolo Bonzini                       '-Wno-non-pointer-null'])
502968b4db3SPaolo Bonziniendif
503968b4db3SPaolo Bonzini
5046ec0e15dSPaolo Bonzini###########################################
5056ec0e15dSPaolo Bonzini# Target-specific checks and dependencies #
5066ec0e15dSPaolo Bonzini###########################################
5076ec0e15dSPaolo Bonzini
508b7a75c8cSPaolo Bonzini# Fuzzing
509537b7248SPaolo Bonziniif get_option('fuzzing') and get_option('fuzzing_engine') == '' and \
510537b7248SPaolo Bonzini    not cc.links('''
511537b7248SPaolo Bonzini          #include <stdint.h>
512537b7248SPaolo Bonzini          #include <sys/types.h>
513537b7248SPaolo Bonzini          int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
514537b7248SPaolo Bonzini          int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
515537b7248SPaolo Bonzini        ''',
516537b7248SPaolo Bonzini        args: ['-Werror', '-fsanitize=fuzzer'])
517537b7248SPaolo Bonzini  error('Your compiler does not support -fsanitize=fuzzer')
518537b7248SPaolo Bonziniendif
519537b7248SPaolo Bonzini
520b7a75c8cSPaolo Bonzini# Tracing backends
5219c29b741SPaolo Bonziniif 'ftrace' in get_option('trace_backends') and targetos != 'linux'
5229c29b741SPaolo Bonzini  error('ftrace is supported only on Linux')
5239c29b741SPaolo Bonziniendif
5249c29b741SPaolo Bonziniif 'syslog' in get_option('trace_backends') and not cc.compiles('''
5259c29b741SPaolo Bonzini    #include <syslog.h>
5269c29b741SPaolo Bonzini    int main(void) {
5279c29b741SPaolo Bonzini        openlog("qemu", LOG_PID, LOG_DAEMON);
5289c29b741SPaolo Bonzini        syslog(LOG_INFO, "configure");
5299c29b741SPaolo Bonzini        return 0;
5309c29b741SPaolo Bonzini    }''')
5319c29b741SPaolo Bonzini  error('syslog is not supported on this system')
5329c29b741SPaolo Bonziniendif
5339c29b741SPaolo Bonzini
534b7a75c8cSPaolo Bonzini# Miscellaneous Linux-only features
535a436d6d4SPaolo Bonziniget_option('mpath') \
536a436d6d4SPaolo Bonzini  .require(targetos == 'linux', error_message: 'Multipath is supported only on Linux')
5376ec0e15dSPaolo Bonzini
538a436d6d4SPaolo Bonzinimultiprocess_allowed = get_option('multiprocess') \
539a436d6d4SPaolo Bonzini  .require(targetos == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \
540a436d6d4SPaolo Bonzini  .allowed()
541106ad1f9SPaolo Bonzini
54255116968SJagannathan Ramanvfio_user_server_allowed = get_option('vfio_user_server') \
54355116968SJagannathan Raman  .require(targetos == 'linux', error_message: 'vfio-user server is supported only on Linux') \
54455116968SJagannathan Raman  .allowed()
54555116968SJagannathan Raman
5460d04c4c9SPaolo Bonzinihave_tpm = get_option('tpm') \
5470d04c4c9SPaolo Bonzini  .require(targetos != 'windows', error_message: 'TPM emulation only available on POSIX systems') \
5480d04c4c9SPaolo Bonzini  .allowed()
5490d04c4c9SPaolo Bonzini
5502a3129a3SPaolo Bonzini# vhost
5512df89d54SPaolo Bonzinihave_vhost_user = get_option('vhost_user') \
5522df89d54SPaolo Bonzini  .disable_auto_if(targetos != 'linux') \
5532df89d54SPaolo Bonzini  .require(targetos != 'windows',
5542df89d54SPaolo Bonzini           error_message: 'vhost-user is not available on Windows').allowed()
5552df89d54SPaolo Bonzinihave_vhost_vdpa = get_option('vhost_vdpa') \
5562df89d54SPaolo Bonzini  .require(targetos == 'linux',
5572df89d54SPaolo Bonzini           error_message: 'vhost-vdpa is only available on Linux').allowed()
5582df89d54SPaolo Bonzinihave_vhost_kernel = get_option('vhost_kernel') \
5592df89d54SPaolo Bonzini  .require(targetos == 'linux',
5602df89d54SPaolo Bonzini           error_message: 'vhost-kernel is only available on Linux').allowed()
5612df89d54SPaolo Bonzinihave_vhost_user_crypto = get_option('vhost_crypto') \
5622df89d54SPaolo Bonzini  .require(have_vhost_user,
5632df89d54SPaolo Bonzini           error_message: 'vhost-crypto requires vhost-user to be enabled').allowed()
5642df89d54SPaolo Bonzini
56543b6d7eeSPaolo Bonzinihave_vhost = have_vhost_user or have_vhost_vdpa or have_vhost_kernel
5662df89d54SPaolo Bonzini
5672df89d54SPaolo Bonzinihave_vhost_net_user = have_vhost_user and get_option('vhost_net').allowed()
5682df89d54SPaolo Bonzinihave_vhost_net_vdpa = have_vhost_vdpa and get_option('vhost_net').allowed()
5692df89d54SPaolo Bonzinihave_vhost_net_kernel = have_vhost_kernel and get_option('vhost_net').allowed()
5702df89d54SPaolo Bonzinihave_vhost_net = have_vhost_net_kernel or have_vhost_net_user or have_vhost_net_vdpa
5712a3129a3SPaolo Bonzini
572b7a75c8cSPaolo Bonzini# Target-specific libraries and flags
5737fa1c635SPaolo Bonzinilibm = cc.find_library('m', required: false)
5746d7c7c2dSPaolo Bonzinithreads = dependency('threads')
575a81df1b6SPaolo Bonziniutil = cc.find_library('util', required: false)
5764a96337dSPaolo Bonziniwinmm = []
577a81df1b6SPaolo Bonzinisocket = []
57804c6f1e7SMarc-André Lureauversion_res = []
579d92989aaSMarc-André Lureaucoref = []
580d92989aaSMarc-André Lureauiokit = []
581b6c7cfd4SPaolo Bonziniemulator_link_args = []
58274a414a1SReinoud Zandijknvmm =not_found
5838a19980eSPaolo Bonzinihvf = not_found
58423011f44SMarc-André Lureaumidl = not_found
58523011f44SMarc-André Lureauwidl = not_found
586cf60ccc3SAkihiko Odakipathcch = not_found
587a6305081SPaolo Bonzinihost_dsosuf = '.so'
588a81df1b6SPaolo Bonziniif targetos == 'windows'
58923011f44SMarc-André Lureau  midl = find_program('midl', required: false)
59023011f44SMarc-André Lureau  widl = find_program('widl', required: false)
591cf60ccc3SAkihiko Odaki  pathcch = cc.find_library('pathcch')
592a81df1b6SPaolo Bonzini  socket = cc.find_library('ws2_32')
5934a96337dSPaolo Bonzini  winmm = cc.find_library('winmm')
59404c6f1e7SMarc-André Lureau
59504c6f1e7SMarc-André Lureau  win = import('windows')
59604c6f1e7SMarc-André Lureau  version_res = win.compile_resources('version.rc',
59704c6f1e7SMarc-André Lureau                                      depend_files: files('pc-bios/qemu-nsis.ico'),
59804c6f1e7SMarc-André Lureau                                      include_directories: include_directories('.'))
599a6305081SPaolo Bonzini  host_dsosuf = '.dll'
600d92989aaSMarc-André Lureauelif targetos == 'darwin'
601d92989aaSMarc-André Lureau  coref = dependency('appleframeworks', modules: 'CoreFoundation')
60214176c8dSJoelle van Dyne  iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
603a6305081SPaolo Bonzini  host_dsosuf = '.dylib'
604cfad62f1SPaolo Bonzinielif targetos == 'sunos'
605cfad62f1SPaolo Bonzini  socket = [cc.find_library('socket'),
606cfad62f1SPaolo Bonzini            cc.find_library('nsl'),
607cfad62f1SPaolo Bonzini            cc.find_library('resolv')]
608cfad62f1SPaolo Bonzinielif targetos == 'haiku'
609cfad62f1SPaolo Bonzini  socket = [cc.find_library('posix_error_mapper'),
610cfad62f1SPaolo Bonzini            cc.find_library('network'),
611cfad62f1SPaolo Bonzini            cc.find_library('bsd')]
612b6c7cfd4SPaolo Bonzinielif targetos == 'openbsd'
61343a363aeSPaolo Bonzini  if get_option('tcg').allowed() and target_dirs.length() > 0
614b6c7cfd4SPaolo Bonzini    # Disable OpenBSD W^X if available
615b6c7cfd4SPaolo Bonzini    emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
616b6c7cfd4SPaolo Bonzini  endif
617a81df1b6SPaolo Bonziniendif
6186ec0e15dSPaolo Bonzini
619b7a75c8cSPaolo Bonzini# Target-specific configuration of accelerators
6208a19980eSPaolo Bonziniaccelerators = []
62143a363aeSPaolo Bonziniif get_option('kvm').allowed() and targetos == 'linux'
6228a19980eSPaolo Bonzini  accelerators += 'CONFIG_KVM'
6238a19980eSPaolo Bonziniendif
62443a363aeSPaolo Bonziniif get_option('whpx').allowed() and targetos == 'windows'
62557e2a1f8SSunil Muthuswamy  if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
6268a19980eSPaolo Bonzini    error('WHPX requires 64-bit host')
6278a19980eSPaolo Bonzini  elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
6288a19980eSPaolo Bonzini       cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
6298a19980eSPaolo Bonzini    accelerators += 'CONFIG_WHPX'
6308a19980eSPaolo Bonzini  endif
6318a19980eSPaolo Bonziniendif
63243a363aeSPaolo Bonziniif get_option('hvf').allowed()
6338a19980eSPaolo Bonzini  hvf = dependency('appleframeworks', modules: 'Hypervisor',
6348a19980eSPaolo Bonzini                   required: get_option('hvf'))
6358a19980eSPaolo Bonzini  if hvf.found()
6368a19980eSPaolo Bonzini    accelerators += 'CONFIG_HVF'
6378a19980eSPaolo Bonzini  endif
6388a19980eSPaolo Bonziniendif
63943a363aeSPaolo Bonziniif get_option('hax').allowed()
6408a19980eSPaolo Bonzini  if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
6418a19980eSPaolo Bonzini    accelerators += 'CONFIG_HAX'
6428a19980eSPaolo Bonzini  endif
6438a19980eSPaolo Bonziniendif
64474a414a1SReinoud Zandijkif targetos == 'netbsd'
64574a414a1SReinoud Zandijk  nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
64674a414a1SReinoud Zandijk  if nvmm.found()
64774a414a1SReinoud Zandijk    accelerators += 'CONFIG_NVMM'
64874a414a1SReinoud Zandijk  endif
64974a414a1SReinoud Zandijkendif
65023a77b2dSPaolo Bonzini
651823eb013SPaolo Bonzinitcg_arch = host_arch
65243a363aeSPaolo Bonziniif get_option('tcg').allowed()
653823eb013SPaolo Bonzini  if host_arch == 'unknown'
65423a77b2dSPaolo Bonzini    if get_option('tcg_interpreter')
655f1f727acSPhilippe Mathieu-Daudé      warning('Unsupported CPU @0@, will use TCG with TCI (slow)'.format(cpu))
6568a19980eSPaolo Bonzini    else
6578a19980eSPaolo Bonzini      error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
6588a19980eSPaolo Bonzini    endif
659fa2f7b0bSPhilippe Mathieu-Daudé  elif get_option('tcg_interpreter')
6601c282da3SPhilippe Mathieu-Daudé    warning('Use of the TCG interpreter is not recommended on this host')
661fa2f7b0bSPhilippe Mathieu-Daudé    warning('architecture. There is a native TCG execution backend available')
662fa2f7b0bSPhilippe Mathieu-Daudé    warning('which provides substantially better performance and reliability.')
663fa2f7b0bSPhilippe Mathieu-Daudé    warning('It is strongly recommended to remove the --enable-tcg-interpreter')
664fa2f7b0bSPhilippe Mathieu-Daudé    warning('configuration option on this architecture to use the native')
665fa2f7b0bSPhilippe Mathieu-Daudé    warning('backend.')
6668a19980eSPaolo Bonzini  endif
66723a77b2dSPaolo Bonzini  if get_option('tcg_interpreter')
66823a77b2dSPaolo Bonzini    tcg_arch = 'tci'
669ed145144SRichard Henderson    config_host += { 'CONFIG_TCG_INTERPRETER': 'y' }
670823eb013SPaolo Bonzini  elif host_arch == 'x86_64'
67123a77b2dSPaolo Bonzini    tcg_arch = 'i386'
672823eb013SPaolo Bonzini  elif host_arch == 'ppc64'
67323a77b2dSPaolo Bonzini    tcg_arch = 'ppc'
67423a77b2dSPaolo Bonzini  endif
67523a77b2dSPaolo Bonzini  add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
676e5134024SPaolo Bonzini                        language: all_languages)
67723a77b2dSPaolo Bonzini
6788a19980eSPaolo Bonzini  accelerators += 'CONFIG_TCG'
6798a19980eSPaolo Bonzini  config_host += { 'CONFIG_TCG': 'y' }
6808a19980eSPaolo Bonziniendif
6818a19980eSPaolo Bonzini
6828a19980eSPaolo Bonziniif 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
6838a19980eSPaolo Bonzini  error('KVM not available on this platform')
6848a19980eSPaolo Bonziniendif
6858a19980eSPaolo Bonziniif 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
6868a19980eSPaolo Bonzini  error('HVF not available on this platform')
6878a19980eSPaolo Bonziniendif
68874a414a1SReinoud Zandijkif 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
68974a414a1SReinoud Zandijk  error('NVMM not available on this platform')
69074a414a1SReinoud Zandijkendif
6918a19980eSPaolo Bonziniif 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
6928a19980eSPaolo Bonzini  error('WHPX not available on this platform')
6938a19980eSPaolo Bonziniendif
694b4e312e9SPaolo Bonzini
6956ec0e15dSPaolo Bonzini################
6966ec0e15dSPaolo Bonzini# Dependencies #
6976ec0e15dSPaolo Bonzini################
6986ec0e15dSPaolo Bonzini
699fc9a809eSPaolo Bonzini# When bumping glib minimum version, please check also whether to increase
700fc9a809eSPaolo Bonzini# the _WIN32_WINNT setting in osdep.h according to the value from glib
701fc9a809eSPaolo Bonziniglib_req_ver = '>=2.56.0'
702fc9a809eSPaolo Bonziniglib_pc = dependency('glib-2.0', version: glib_req_ver, required: true,
703fc9a809eSPaolo Bonzini                    method: 'pkg-config')
704fc9a809eSPaolo Bonziniglib_cflags = []
7056002711cSPaolo Bonziniif enable_modules
706fc9a809eSPaolo Bonzini  gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true,
707fc9a809eSPaolo Bonzini                       method: 'pkg-config')
708fc9a809eSPaolo Bonzinielif config_host.has_key('CONFIG_PLUGIN')
709fc9a809eSPaolo Bonzini  gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true,
710fc9a809eSPaolo Bonzini                       method: 'pkg-config')
711fc9a809eSPaolo Bonzinielse
712fc9a809eSPaolo Bonzini  gmodule = not_found
713e3feb2ccSEmilio Cotaendif
714953d5a9eSMarc-André Lureau
715fc9a809eSPaolo Bonzini# This workaround is required due to a bug in pkg-config file for glib as it
716fc9a809eSPaolo Bonzini# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
717fc9a809eSPaolo Bonziniif targetos == 'windows' and get_option('prefer_static')
718fc9a809eSPaolo Bonzini  glib_cflags += ['-DGLIB_STATIC_COMPILATION']
719fc9a809eSPaolo Bonziniendif
720fc9a809eSPaolo Bonzini
721fc9a809eSPaolo Bonzini# Sanity check that the current size_t matches the
722fc9a809eSPaolo Bonzini# size that glib thinks it should be. This catches
723fc9a809eSPaolo Bonzini# problems on multi-arch where people try to build
724fc9a809eSPaolo Bonzini# 32-bit QEMU while pointing at 64-bit glib headers
725fc9a809eSPaolo Bonzini
726fc9a809eSPaolo Bonziniif not cc.compiles('''
727fc9a809eSPaolo Bonzini  #include <glib.h>
728fc9a809eSPaolo Bonzini  #include <unistd.h>
729fc9a809eSPaolo Bonzini
730fc9a809eSPaolo Bonzini  #define QEMU_BUILD_BUG_ON(x) \
731fc9a809eSPaolo Bonzini  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
732fc9a809eSPaolo Bonzini
733fc9a809eSPaolo Bonzini  int main(void) {
734fc9a809eSPaolo Bonzini     QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
735fc9a809eSPaolo Bonzini     return 0;
736fc9a809eSPaolo Bonzini  }''', dependencies: glib_pc, args: glib_cflags)
737fc9a809eSPaolo Bonzini  error('''sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T.
738fc9a809eSPaolo Bonzini        You probably need to set PKG_CONFIG_LIBDIR" to point
739fc9a809eSPaolo Bonzini        to the right pkg-config files for your build target.''')
740fc9a809eSPaolo Bonziniendif
741fc9a809eSPaolo Bonzini
742fc9a809eSPaolo Bonzini# Silence clang warnings triggered by glib < 2.57.2
743fc9a809eSPaolo Bonziniif not cc.compiles('''
744fc9a809eSPaolo Bonzini  #include <glib.h>
745fc9a809eSPaolo Bonzini  typedef struct Foo {
746fc9a809eSPaolo Bonzini    int i;
747fc9a809eSPaolo Bonzini  } Foo;
748fc9a809eSPaolo Bonzini  static void foo_free(Foo *f)
749fc9a809eSPaolo Bonzini  {
750fc9a809eSPaolo Bonzini    g_free(f);
751fc9a809eSPaolo Bonzini  }
752fc9a809eSPaolo Bonzini  G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free)
753fc9a809eSPaolo Bonzini  int main(void) { return 0; }''', dependencies: glib_pc, args: ['-Werror'])
754fc9a809eSPaolo Bonzini  glib_cflags += cc.get_supported_arguments('-Wno-unused-function')
755fc9a809eSPaolo Bonziniendif
756fc9a809eSPaolo Bonziniglib = declare_dependency(dependencies: [glib_pc, gmodule],
757fc9a809eSPaolo Bonzini                          compile_args: glib_cflags,
758fc9a809eSPaolo Bonzini                          version: glib_pc.version())
759fc9a809eSPaolo Bonzini
760fc9a809eSPaolo Bonzini# Check whether glib has gslice, which we have to avoid for correctness.
761fc9a809eSPaolo Bonzini# TODO: remove this check and the corresponding workaround (qtree) when
762fc9a809eSPaolo Bonzini# the minimum supported glib is >= 2.75.3
763fc9a809eSPaolo Bonziniglib_has_gslice = glib.version().version_compare('<2.75.3')
764fc9a809eSPaolo Bonzini
765fc9a809eSPaolo Bonzini# override glib dep to include the above refinements
766fc9a809eSPaolo Bonzinimeson.override_dependency('glib-2.0', glib)
767fc9a809eSPaolo Bonzini
768fc9a809eSPaolo Bonzini# The path to glib.h is added to all compilation commands.
769fc9a809eSPaolo Bonziniadd_project_dependencies(glib.partial_dependency(compile_args: true, includes: true),
770fc9a809eSPaolo Bonzini                         native: false, language: all_languages)
771fc9a809eSPaolo Bonzini
772a81df1b6SPaolo Bonzinigio = not_found
7737544060eSPaolo Bonzinigdbus_codegen = not_found
774bb2dc4b7SPaolo Bonzinigdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio'
7757544060eSPaolo Bonziniif not get_option('gio').auto() or have_system
7767544060eSPaolo Bonzini  gio = dependency('gio-2.0', required: get_option('gio'),
777063d5119SPaolo Bonzini                   method: 'pkg-config')
7787544060eSPaolo Bonzini  if gio.found() and not cc.links('''
7797544060eSPaolo Bonzini    #include <gio/gio.h>
7807544060eSPaolo Bonzini    int main(void)
7817544060eSPaolo Bonzini    {
7827544060eSPaolo Bonzini      g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
7837544060eSPaolo Bonzini      return 0;
7847544060eSPaolo Bonzini    }''', dependencies: [glib, gio])
7857544060eSPaolo Bonzini    if get_option('gio').enabled()
7867544060eSPaolo Bonzini      error('The installed libgio is broken for static linking')
787a81df1b6SPaolo Bonzini    endif
7887544060eSPaolo Bonzini    gio = not_found
7897544060eSPaolo Bonzini  endif
7907544060eSPaolo Bonzini  if gio.found()
7917544060eSPaolo Bonzini    gdbus_codegen = find_program(gio.get_variable('gdbus_codegen'),
7927544060eSPaolo Bonzini                                 required: get_option('gio'))
7937544060eSPaolo Bonzini    gio_unix = dependency('gio-unix-2.0', required: get_option('gio'),
794063d5119SPaolo Bonzini                          method: 'pkg-config')
7957544060eSPaolo Bonzini    gio = declare_dependency(dependencies: [gio, gio_unix],
7967544060eSPaolo Bonzini                             version: gio.version())
7977544060eSPaolo Bonzini  endif
7987544060eSPaolo Bonziniendif
799bb2dc4b7SPaolo Bonziniif gdbus_codegen.found() and get_option('cfi')
800bb2dc4b7SPaolo Bonzini  gdbus_codegen = not_found
801bb2dc4b7SPaolo Bonzini  gdbus_codegen_error = '@0@ uses gdbus-codegen, which does not support control flow integrity'
802bb2dc4b7SPaolo Bonziniendif
8037544060eSPaolo Bonzini
804a81df1b6SPaolo Bonzinilttng = not_found
8059c29b741SPaolo Bonziniif 'ust' in get_option('trace_backends')
806e32aaa5aSMarc-André Lureau  lttng = dependency('lttng-ust', required: true, version: '>= 2.1',
807063d5119SPaolo Bonzini                     method: 'pkg-config')
808a81df1b6SPaolo Bonziniendif
809b7612f45SPaolo Bonzinipixman = not_found
810b7612f45SPaolo Bonziniif have_system or have_tools
811b7612f45SPaolo Bonzini  pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
812063d5119SPaolo Bonzini                      method: 'pkg-config')
813b7612f45SPaolo Bonziniendif
814063d5119SPaolo Bonzinizlib = dependency('zlib', required: true)
81553c22b68SPaolo Bonzini
816ff66f3e5SPaolo Bonzinilibaio = not_found
817ff66f3e5SPaolo Bonziniif not get_option('linux_aio').auto() or have_block
818ff66f3e5SPaolo Bonzini  libaio = cc.find_library('aio', has_headers: ['libaio.h'],
819063d5119SPaolo Bonzini                           required: get_option('linux_aio'))
820ff66f3e5SPaolo Bonziniendif
821354081d4SLeonardo Bras
822354081d4SLeonardo Braslinux_io_uring_test = '''
823354081d4SLeonardo Bras  #include <liburing.h>
824354081d4SLeonardo Bras  #include <linux/errqueue.h>
825354081d4SLeonardo Bras
826354081d4SLeonardo Bras  int main(void) { return 0; }'''
827354081d4SLeonardo Bras
8285e5733e5SMarc-André Lureaulinux_io_uring = not_found
82953c22b68SPaolo Bonziniif not get_option('linux_io_uring').auto() or have_block
830a41b4fdcSDaniel P. Berrangé  linux_io_uring = dependency('liburing', version: '>=0.3',
831a41b4fdcSDaniel P. Berrangé                              required: get_option('linux_io_uring'),
832063d5119SPaolo Bonzini                              method: 'pkg-config')
833354081d4SLeonardo Bras  if not cc.links(linux_io_uring_test)
834354081d4SLeonardo Bras    linux_io_uring = not_found
8355e5733e5SMarc-André Lureau  endif
836354081d4SLeonardo Brasendif
837354081d4SLeonardo Bras
8385e5733e5SMarc-André Lureaulibnfs = not_found
83930045c05SPaolo Bonziniif not get_option('libnfs').auto() or have_block
84030045c05SPaolo Bonzini  libnfs = dependency('libnfs', version: '>=1.9.3',
84130045c05SPaolo Bonzini                      required: get_option('libnfs'),
842063d5119SPaolo Bonzini                      method: 'pkg-config')
8435e5733e5SMarc-André Lureauendif
844f7f2d651SPaolo Bonzini
845f7f2d651SPaolo Bonzinilibattr_test = '''
846f7f2d651SPaolo Bonzini  #include <stddef.h>
847f7f2d651SPaolo Bonzini  #include <sys/types.h>
848f7f2d651SPaolo Bonzini  #ifdef CONFIG_LIBATTR
849f7f2d651SPaolo Bonzini  #include <attr/xattr.h>
850f7f2d651SPaolo Bonzini  #else
851f7f2d651SPaolo Bonzini  #include <sys/xattr.h>
852f7f2d651SPaolo Bonzini  #endif
853f7f2d651SPaolo Bonzini  int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
854f7f2d651SPaolo Bonzini
855ec0d5893SMarc-André Lureaulibattr = not_found
856f7f2d651SPaolo Bonzinihave_old_libattr = false
85743a363aeSPaolo Bonziniif get_option('attr').allowed()
858f7f2d651SPaolo Bonzini  if cc.links(libattr_test)
859f7f2d651SPaolo Bonzini    libattr = declare_dependency()
860f7f2d651SPaolo Bonzini  else
861f7f2d651SPaolo Bonzini    libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
862063d5119SPaolo Bonzini                              required: get_option('attr'))
863f7f2d651SPaolo Bonzini    if libattr.found() and not \
864f7f2d651SPaolo Bonzini      cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
865f7f2d651SPaolo Bonzini      libattr = not_found
866f7f2d651SPaolo Bonzini      if get_option('attr').enabled()
867f7f2d651SPaolo Bonzini        error('could not link libattr')
868f7f2d651SPaolo Bonzini      else
869f7f2d651SPaolo Bonzini        warning('could not link libattr, disabling')
870ec0d5893SMarc-André Lureau      endif
871f7f2d651SPaolo Bonzini    else
872f7f2d651SPaolo Bonzini      have_old_libattr = libattr.found()
873f7f2d651SPaolo Bonzini    endif
874f7f2d651SPaolo Bonzini  endif
875f7f2d651SPaolo Bonziniendif
876f7f2d651SPaolo Bonzini
87752eaefd3SAkihiko Odakicocoa = dependency('appleframeworks', modules: ['Cocoa', 'CoreVideo'],
87852eaefd3SAkihiko Odaki                   required: get_option('cocoa'))
879c1ec4941SPaolo Bonzini
880e2c1d78dSVladislav Yaroshchukvmnet = dependency('appleframeworks', modules: 'vmnet', required: get_option('vmnet'))
881e2c1d78dSVladislav Yaroshchukif vmnet.found() and not cc.has_header_symbol('vmnet/vmnet.h',
882e2c1d78dSVladislav Yaroshchuk                                              'VMNET_BRIDGED_MODE',
883e2c1d78dSVladislav Yaroshchuk                                              dependencies: vmnet)
884e2c1d78dSVladislav Yaroshchuk  vmnet = not_found
885e2c1d78dSVladislav Yaroshchuk  if get_option('vmnet').enabled()
886e2c1d78dSVladislav Yaroshchuk    error('vmnet.framework API is outdated')
887e2c1d78dSVladislav Yaroshchuk  else
888e2c1d78dSVladislav Yaroshchuk    warning('vmnet.framework API is outdated, disabling')
889e2c1d78dSVladislav Yaroshchuk  endif
890e2c1d78dSVladislav Yaroshchukendif
891e2c1d78dSVladislav Yaroshchuk
8923f99cf57SPaolo Bonziniseccomp = not_found
89373422d95SMichal Privoznikseccomp_has_sysrawrc = false
89490835c2bSPaolo Bonziniif not get_option('seccomp').auto() or have_system or have_tools
89590835c2bSPaolo Bonzini  seccomp = dependency('libseccomp', version: '>=2.3.0',
89690835c2bSPaolo Bonzini                       required: get_option('seccomp'),
897063d5119SPaolo Bonzini                       method: 'pkg-config')
89873422d95SMichal Privoznik  if seccomp.found()
89973422d95SMichal Privoznik    seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h',
90073422d95SMichal Privoznik                                                'SCMP_FLTATR_API_SYSRAWRC',
90173422d95SMichal Privoznik                                                dependencies: seccomp)
90273422d95SMichal Privoznik  endif
9033f99cf57SPaolo Bonziniendif
904727c8bb8SPaolo Bonzini
9053f99cf57SPaolo Bonzinilibcap_ng = not_found
906727c8bb8SPaolo Bonziniif not get_option('cap_ng').auto() or have_system or have_tools
907727c8bb8SPaolo Bonzini  libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
908063d5119SPaolo Bonzini                              required: get_option('cap_ng'))
9093f99cf57SPaolo Bonziniendif
910727c8bb8SPaolo Bonziniif libcap_ng.found() and not cc.links('''
911727c8bb8SPaolo Bonzini   #include <cap-ng.h>
912727c8bb8SPaolo Bonzini   int main(void)
913727c8bb8SPaolo Bonzini   {
914727c8bb8SPaolo Bonzini     capng_capability_to_name(CAPNG_EFFECTIVE);
915727c8bb8SPaolo Bonzini     return 0;
916727c8bb8SPaolo Bonzini   }''', dependencies: libcap_ng)
917727c8bb8SPaolo Bonzini  libcap_ng = not_found
918727c8bb8SPaolo Bonzini  if get_option('cap_ng').enabled()
919727c8bb8SPaolo Bonzini    error('could not link libcap-ng')
920727c8bb8SPaolo Bonzini  else
921727c8bb8SPaolo Bonzini    warning('could not link libcap-ng, disabling')
922727c8bb8SPaolo Bonzini  endif
923727c8bb8SPaolo Bonziniendif
924727c8bb8SPaolo Bonzini
9251917ec6dSPaolo Bonziniif get_option('xkbcommon').auto() and not have_system and not have_tools
9261917ec6dSPaolo Bonzini  xkbcommon = not_found
9271917ec6dSPaolo Bonzinielse
9281917ec6dSPaolo Bonzini  xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
929063d5119SPaolo Bonzini                         method: 'pkg-config')
930ade60d4fSMarc-André Lureauendif
931e1723999SPaolo Bonzini
9325890258aSThomas Huthslirp = not_found
9335890258aSThomas Huthif not get_option('slirp').auto() or have_system
9345890258aSThomas Huth  slirp = dependency('slirp', required: get_option('slirp'),
935063d5119SPaolo Bonzini                     method: 'pkg-config')
9365890258aSThomas Huth  # slirp < 4.7 is incompatible with CFI support in QEMU.  This is because
9375890258aSThomas Huth  # it passes function pointers within libslirp as callbacks for timers.
9385890258aSThomas Huth  # When using a system-wide shared libslirp, the type information for the
9395890258aSThomas Huth  # callback is missing and the timer call produces a false positive with CFI.
9405890258aSThomas Huth  # Do not use the "version" keyword argument to produce a better error.
9415890258aSThomas Huth  # with control-flow integrity.
9425890258aSThomas Huth  if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7')
9435890258aSThomas Huth    if get_option('slirp').enabled()
9445890258aSThomas Huth      error('Control-Flow Integrity requires libslirp 4.7.')
9455890258aSThomas Huth    else
9465890258aSThomas Huth      warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.')
9475890258aSThomas Huth      slirp = not_found
9485890258aSThomas Huth    endif
9495890258aSThomas Huth  endif
9505890258aSThomas Huthendif
9515890258aSThomas Huth
952cdaf0722SMarc-André Lureauvde = not_found
953e1723999SPaolo Bonziniif not get_option('vde').auto() or have_system or have_tools
954e1723999SPaolo Bonzini  vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
955063d5119SPaolo Bonzini                           required: get_option('vde'))
956e1723999SPaolo Bonziniendif
957e1723999SPaolo Bonziniif vde.found() and not cc.links('''
958e1723999SPaolo Bonzini   #include <libvdeplug.h>
959e1723999SPaolo Bonzini   int main(void)
960e1723999SPaolo Bonzini   {
961e1723999SPaolo Bonzini     struct vde_open_args a = {0, 0, 0};
962e1723999SPaolo Bonzini     char s[] = "";
963e1723999SPaolo Bonzini     vde_open(s, s, &a);
964e1723999SPaolo Bonzini     return 0;
965e1723999SPaolo Bonzini   }''', dependencies: vde)
966e1723999SPaolo Bonzini  vde = not_found
967e1723999SPaolo Bonzini  if get_option('cap_ng').enabled()
968e1723999SPaolo Bonzini    error('could not link libvdeplug')
969e1723999SPaolo Bonzini  else
970e1723999SPaolo Bonzini    warning('could not link libvdeplug, disabling')
971e1723999SPaolo Bonzini  endif
972cdaf0722SMarc-André Lureauendif
97387430d5bSPaolo Bonzini
974478e943fSPaolo Bonzinipulse = not_found
97587430d5bSPaolo Bonziniif not get_option('pa').auto() or (targetos == 'linux' and have_system)
97687430d5bSPaolo Bonzini  pulse = dependency('libpulse', required: get_option('pa'),
977063d5119SPaolo Bonzini                     method: 'pkg-config')
978478e943fSPaolo Bonziniendif
979478e943fSPaolo Bonzinialsa = not_found
98087430d5bSPaolo Bonziniif not get_option('alsa').auto() or (targetos == 'linux' and have_system)
98187430d5bSPaolo Bonzini  alsa = dependency('alsa', required: get_option('alsa'),
982063d5119SPaolo Bonzini                    method: 'pkg-config')
983478e943fSPaolo Bonziniendif
984478e943fSPaolo Bonzinijack = not_found
98587430d5bSPaolo Bonziniif not get_option('jack').auto() or have_system
98687430d5bSPaolo Bonzini  jack = dependency('jack', required: get_option('jack'),
987063d5119SPaolo Bonzini                    method: 'pkg-config')
988478e943fSPaolo Bonziniendif
989c2d3d1c2SDorinda Basseypipewire = not_found
990c2d3d1c2SDorinda Basseyif not get_option('pipewire').auto() or (targetos == 'linux' and have_system)
991c2d3d1c2SDorinda Bassey  pipewire = dependency('libpipewire-0.3', version: '>=0.3.60',
992c2d3d1c2SDorinda Bassey                    required: get_option('pipewire'),
993063d5119SPaolo Bonzini                    method: 'pkg-config')
994c2d3d1c2SDorinda Basseyendif
995663df1ccSAlexandre Ratchovsndio = not_found
996663df1ccSAlexandre Ratchovif not get_option('sndio').auto() or have_system
997663df1ccSAlexandre Ratchov  sndio = dependency('sndio', required: get_option('sndio'),
998063d5119SPaolo Bonzini                    method: 'pkg-config')
999663df1ccSAlexandre Ratchovendif
100087430d5bSPaolo Bonzini
100158d3f3ffSGerd Hoffmannspice_protocol = not_found
10023f0a5d55SMarc-André Lureauif not get_option('spice_protocol').auto() or have_system
10035c167b53SMarkus Armbruster  spice_protocol = dependency('spice-protocol', version: '>=0.14.0',
10043f0a5d55SMarc-André Lureau                              required: get_option('spice_protocol'),
1005063d5119SPaolo Bonzini                              method: 'pkg-config')
10062634733cSPaolo Bonziniendif
10073f0a5d55SMarc-André Lureauspice = not_found
10083f0a5d55SMarc-André Lureauif not get_option('spice').auto() or have_system
100934d55725SMarkus Armbruster  spice = dependency('spice-server', version: '>=0.14.0',
10103f0a5d55SMarc-André Lureau                     required: get_option('spice'),
1011063d5119SPaolo Bonzini                     method: 'pkg-config')
101258d3f3ffSGerd Hoffmannendif
10133f0a5d55SMarc-André Lureauspice_headers = spice.partial_dependency(compile_args: true, includes: true)
10143f0a5d55SMarc-André Lureau
10155ee24e78SMarc-André Lureaurt = cc.find_library('rt', required: false)
1016a399f914SPaolo Bonzini
101799650b62SPaolo Bonzinilibiscsi = not_found
10189db405a3SPaolo Bonziniif not get_option('libiscsi').auto() or have_block
10199db405a3SPaolo Bonzini  libiscsi = dependency('libiscsi', version: '>=1.9.0',
10209db405a3SPaolo Bonzini                         required: get_option('libiscsi'),
1021063d5119SPaolo Bonzini                         method: 'pkg-config')
102299650b62SPaolo Bonziniendif
10235e5733e5SMarc-André Lureauzstd = not_found
1024b1def33dSPaolo Bonziniif not get_option('zstd').auto() or have_block
1025b1def33dSPaolo Bonzini  zstd = dependency('libzstd', version: '>=1.4.0',
1026b1def33dSPaolo Bonzini                    required: get_option('zstd'),
1027063d5119SPaolo Bonzini                    method: 'pkg-config')
10285e5733e5SMarc-André Lureauendif
1029ea458960SMarc-André Lureauvirgl = not_found
10300265fe9eSPaolo Bonzini
10310265fe9eSPaolo Bonzinihave_vhost_user_gpu = have_tools and targetos == 'linux' and pixman.found()
10320265fe9eSPaolo Bonziniif not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
1033587d59d6SPaolo Bonzini  virgl = dependency('virglrenderer',
1034587d59d6SPaolo Bonzini                     method: 'pkg-config',
1035063d5119SPaolo Bonzini                     required: get_option('virglrenderer'))
1036ea458960SMarc-André Lureauendif
1037fd66dbd4SStefan Hajnocziblkio = not_found
1038fd66dbd4SStefan Hajnocziif not get_option('blkio').auto() or have_block
1039fd66dbd4SStefan Hajnoczi  blkio = dependency('blkio',
1040fd66dbd4SStefan Hajnoczi                     method: 'pkg-config',
1041063d5119SPaolo Bonzini                     required: get_option('blkio'))
1042fd66dbd4SStefan Hajnocziendif
10431d7bb6abSMarc-André Lureaucurl = not_found
1044f9cd86feSPaolo Bonziniif not get_option('curl').auto() or have_block
1045f9cd86feSPaolo Bonzini  curl = dependency('libcurl', version: '>=7.29.0',
1046f9cd86feSPaolo Bonzini                    method: 'pkg-config',
1047063d5119SPaolo Bonzini                    required: get_option('curl'))
10481d7bb6abSMarc-André Lureauendif
1049f15bff25SPaolo Bonzinilibudev = not_found
1050f01496a3SPaolo Bonziniif targetos == 'linux' and (have_system or have_tools)
10516ec0e15dSPaolo Bonzini  libudev = dependency('libudev',
1052a0fbbb6eSPaolo Bonzini                       method: 'pkg-config',
1053063d5119SPaolo Bonzini                       required: get_option('libudev'))
1054f15bff25SPaolo Bonziniendif
10556ec0e15dSPaolo Bonzini
10565c53015aSPaolo Bonzinimpathlibs = [libudev]
10576ec0e15dSPaolo Bonzinimpathpersist = not_found
10586ec0e15dSPaolo Bonzinimpathpersist_new_api = false
105943a363aeSPaolo Bonziniif targetos == 'linux' and have_tools and get_option('mpath').allowed()
10606ec0e15dSPaolo Bonzini  mpath_test_source_new = '''
10616ec0e15dSPaolo Bonzini    #include <libudev.h>
10626ec0e15dSPaolo Bonzini    #include <mpath_persist.h>
10636ec0e15dSPaolo Bonzini    unsigned mpath_mx_alloc_len = 1024;
10646ec0e15dSPaolo Bonzini    int logsink;
10656ec0e15dSPaolo Bonzini    static struct config *multipath_conf;
10666ec0e15dSPaolo Bonzini    extern struct udev *udev;
10676ec0e15dSPaolo Bonzini    extern struct config *get_multipath_config(void);
10686ec0e15dSPaolo Bonzini    extern void put_multipath_config(struct config *conf);
10696ec0e15dSPaolo Bonzini    struct udev *udev;
10706ec0e15dSPaolo Bonzini    struct config *get_multipath_config(void) { return multipath_conf; }
10716ec0e15dSPaolo Bonzini    void put_multipath_config(struct config *conf) { }
10726ec0e15dSPaolo Bonzini    int main(void) {
10736ec0e15dSPaolo Bonzini        udev = udev_new();
10746ec0e15dSPaolo Bonzini        multipath_conf = mpath_lib_init();
10756ec0e15dSPaolo Bonzini        return 0;
10766ec0e15dSPaolo Bonzini    }'''
10776ec0e15dSPaolo Bonzini  mpath_test_source_old = '''
10786ec0e15dSPaolo Bonzini      #include <libudev.h>
10796ec0e15dSPaolo Bonzini      #include <mpath_persist.h>
10806ec0e15dSPaolo Bonzini      unsigned mpath_mx_alloc_len = 1024;
10816ec0e15dSPaolo Bonzini      int logsink;
10826ec0e15dSPaolo Bonzini      int main(void) {
10836ec0e15dSPaolo Bonzini          struct udev *udev = udev_new();
10846ec0e15dSPaolo Bonzini          mpath_lib_init(udev);
10856ec0e15dSPaolo Bonzini          return 0;
10866ec0e15dSPaolo Bonzini      }'''
10875c53015aSPaolo Bonzini  libmpathpersist = cc.find_library('mpathpersist',
1088063d5119SPaolo Bonzini                                    required: get_option('mpath'))
10895c53015aSPaolo Bonzini  if libmpathpersist.found()
10905c53015aSPaolo Bonzini    mpathlibs += libmpathpersist
1091a0cbd2e8SPaolo Bonzini    if get_option('prefer_static')
109243b43a40SPaolo Bonzini      mpathlibs += cc.find_library('devmapper',
1093063d5119SPaolo Bonzini                                     required: get_option('mpath'))
109443b43a40SPaolo Bonzini    endif
109543b43a40SPaolo Bonzini    mpathlibs += cc.find_library('multipath',
1096063d5119SPaolo Bonzini                                 required: get_option('mpath'))
109743b43a40SPaolo Bonzini    foreach lib: mpathlibs
109843b43a40SPaolo Bonzini      if not lib.found()
109943b43a40SPaolo Bonzini        mpathlibs = []
110043b43a40SPaolo Bonzini        break
110143b43a40SPaolo Bonzini      endif
110243b43a40SPaolo Bonzini    endforeach
11035c53015aSPaolo Bonzini    if mpathlibs.length() == 0
11045c53015aSPaolo Bonzini      msg = 'Dependencies missing for libmpathpersist'
11055c53015aSPaolo Bonzini    elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
11066ec0e15dSPaolo Bonzini      mpathpersist = declare_dependency(dependencies: mpathlibs)
11076ec0e15dSPaolo Bonzini      mpathpersist_new_api = true
11086ec0e15dSPaolo Bonzini    elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
11096ec0e15dSPaolo Bonzini      mpathpersist = declare_dependency(dependencies: mpathlibs)
11106ec0e15dSPaolo Bonzini    else
11115c53015aSPaolo Bonzini      msg = 'Cannot detect libmpathpersist API'
11125c53015aSPaolo Bonzini    endif
11135c53015aSPaolo Bonzini    if not mpathpersist.found()
11146ec0e15dSPaolo Bonzini      if get_option('mpath').enabled()
11155c53015aSPaolo Bonzini        error(msg)
11166ec0e15dSPaolo Bonzini      else
11175c53015aSPaolo Bonzini        warning(msg + ', disabling')
11186ec0e15dSPaolo Bonzini      endif
11196ec0e15dSPaolo Bonzini    endif
11206ec0e15dSPaolo Bonzini  endif
11216ec0e15dSPaolo Bonziniendif
11226ec0e15dSPaolo Bonzini
11235285e593SYonggang Luoiconv = not_found
112430fe76b1SPaolo Bonzinicurses = not_found
112543a363aeSPaolo Bonziniif have_system and get_option('curses').allowed()
11265285e593SYonggang Luo  curses_test = '''
1127fbab8cc2SStefan Weil    #if defined(__APPLE__) || defined(__OpenBSD__)
1128fbab8cc2SStefan Weil    #define _XOPEN_SOURCE_EXTENDED 1
1129fbab8cc2SStefan Weil    #endif
11305285e593SYonggang Luo    #include <locale.h>
11315285e593SYonggang Luo    #include <curses.h>
11325285e593SYonggang Luo    #include <wchar.h>
11335285e593SYonggang Luo    int main(void) {
11345285e593SYonggang Luo      wchar_t wch = L'w';
11355285e593SYonggang Luo      setlocale(LC_ALL, "");
11365285e593SYonggang Luo      resize_term(0, 0);
11375285e593SYonggang Luo      addwstr(L"wide chars\n");
11385285e593SYonggang Luo      addnwstr(&wch, 1);
11395285e593SYonggang Luo      add_wch(WACS_DEGREE);
11405285e593SYonggang Luo      return 0;
11415285e593SYonggang Luo    }'''
1142925a40dfSPaolo Bonzini
1143ca31e307SYonggang Luo  curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
11446d322635SPaolo Bonzini  curses = dependency(curses_dep_list,
11455285e593SYonggang Luo                      required: false,
1146063d5119SPaolo Bonzini                      method: 'pkg-config')
1147925a40dfSPaolo Bonzini  msg = get_option('curses').enabled() ? 'curses library not found' : ''
1148fbab8cc2SStefan Weil  curses_compile_args = ['-DNCURSES_WIDECHAR=1']
1149925a40dfSPaolo Bonzini  if curses.found()
11500dbce6efSPaolo Bonzini    if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
1151bd3615d6SPaolo Bonzini      curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses],
1152bd3615d6SPaolo Bonzini                                  version: curses.version())
1153925a40dfSPaolo Bonzini    else
1154925a40dfSPaolo Bonzini      msg = 'curses package not usable'
1155925a40dfSPaolo Bonzini      curses = not_found
11565285e593SYonggang Luo    endif
1157925a40dfSPaolo Bonzini  endif
1158925a40dfSPaolo Bonzini  if not curses.found()
1159925a40dfSPaolo Bonzini    has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
1160925a40dfSPaolo Bonzini    if targetos != 'windows' and not has_curses_h
1161925a40dfSPaolo Bonzini      message('Trying with /usr/include/ncursesw')
1162925a40dfSPaolo Bonzini      curses_compile_args += ['-I/usr/include/ncursesw']
1163925a40dfSPaolo Bonzini      has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
1164925a40dfSPaolo Bonzini    endif
1165925a40dfSPaolo Bonzini    if has_curses_h
1166925a40dfSPaolo Bonzini      curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
1167925a40dfSPaolo Bonzini      foreach curses_libname : curses_libname_list
11685285e593SYonggang Luo        libcurses = cc.find_library(curses_libname,
1169063d5119SPaolo Bonzini                                    required: false)
11705285e593SYonggang Luo        if libcurses.found()
1171925a40dfSPaolo Bonzini          if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
1172925a40dfSPaolo Bonzini            curses = declare_dependency(compile_args: curses_compile_args,
1173925a40dfSPaolo Bonzini                                        dependencies: [libcurses])
11745285e593SYonggang Luo            break
1175925a40dfSPaolo Bonzini          else
1176925a40dfSPaolo Bonzini            msg = 'curses library not usable'
11775285e593SYonggang Luo          endif
11785285e593SYonggang Luo        endif
11795285e593SYonggang Luo      endforeach
11805285e593SYonggang Luo    endif
118130fe76b1SPaolo Bonzini  endif
118243a363aeSPaolo Bonzini  if get_option('iconv').allowed()
1183925a40dfSPaolo Bonzini    foreach link_args : [ ['-liconv'], [] ]
1184925a40dfSPaolo Bonzini      # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
1185925a40dfSPaolo Bonzini      # We need to use libiconv if available because mixing libiconv's headers with
1186925a40dfSPaolo Bonzini      # the system libc does not work.
1187925a40dfSPaolo Bonzini      # However, without adding glib to the dependencies -L/usr/local/lib will not be
1188925a40dfSPaolo Bonzini      # included in the command line and libiconv will not be found.
1189925a40dfSPaolo Bonzini      if cc.links('''
1190925a40dfSPaolo Bonzini        #include <iconv.h>
1191925a40dfSPaolo Bonzini        int main(void) {
1192925a40dfSPaolo Bonzini          iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
1193925a40dfSPaolo Bonzini          return conv != (iconv_t) -1;
1194fc9a809eSPaolo Bonzini        }''', args: link_args, dependencies: glib)
1195925a40dfSPaolo Bonzini        iconv = declare_dependency(link_args: link_args, dependencies: glib)
1196925a40dfSPaolo Bonzini        break
1197925a40dfSPaolo Bonzini      endif
1198925a40dfSPaolo Bonzini    endforeach
1199925a40dfSPaolo Bonzini  endif
1200925a40dfSPaolo Bonzini  if curses.found() and not iconv.found()
1201925a40dfSPaolo Bonzini    if get_option('iconv').enabled()
1202925a40dfSPaolo Bonzini      error('iconv not available')
1203925a40dfSPaolo Bonzini    endif
1204925a40dfSPaolo Bonzini    msg = 'iconv required for curses UI but not available'
1205925a40dfSPaolo Bonzini    curses = not_found
1206925a40dfSPaolo Bonzini  endif
1207925a40dfSPaolo Bonzini  if not curses.found() and msg != ''
1208925a40dfSPaolo Bonzini    if get_option('curses').enabled()
1209925a40dfSPaolo Bonzini      error(msg)
12105285e593SYonggang Luo    else
1211925a40dfSPaolo Bonzini      warning(msg + ', disabling')
121230fe76b1SPaolo Bonzini    endif
12135285e593SYonggang Luo  endif
12145285e593SYonggang Luoendif
12155285e593SYonggang Luo
12162634733cSPaolo Bonzinibrlapi = not_found
12178c6d4ff4SPaolo Bonziniif not get_option('brlapi').auto() or have_system
12188c6d4ff4SPaolo Bonzini  brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
1219063d5119SPaolo Bonzini                         required: get_option('brlapi'))
12208c6d4ff4SPaolo Bonzini  if brlapi.found() and not cc.links('''
12218c6d4ff4SPaolo Bonzini     #include <brlapi.h>
12228c6d4ff4SPaolo Bonzini     #include <stddef.h>
12238c6d4ff4SPaolo Bonzini     int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
12248c6d4ff4SPaolo Bonzini    brlapi = not_found
12258c6d4ff4SPaolo Bonzini    if get_option('brlapi').enabled()
12268c6d4ff4SPaolo Bonzini      error('could not link brlapi')
12278c6d4ff4SPaolo Bonzini    else
12288c6d4ff4SPaolo Bonzini      warning('could not link brlapi, disabling')
12298c6d4ff4SPaolo Bonzini    endif
12308c6d4ff4SPaolo Bonzini  endif
12312634733cSPaolo Bonziniendif
123235be72baSPaolo Bonzini
1233760e4327SPaolo Bonzinisdl = not_found
123464d3fec7SAkihiko Odakiif not get_option('sdl').auto() or have_system
1235063d5119SPaolo Bonzini  sdl = dependency('sdl2', required: get_option('sdl'))
123635be72baSPaolo Bonzini  sdl_image = not_found
1237760e4327SPaolo Bonziniendif
123835be72baSPaolo Bonziniif sdl.found()
123935be72baSPaolo Bonzini  # work around 2.0.8 bug
124035be72baSPaolo Bonzini  sdl = declare_dependency(compile_args: '-Wno-undef',
1241bd3615d6SPaolo Bonzini                           dependencies: sdl,
1242bd3615d6SPaolo Bonzini                           version: sdl.version())
12437161a433SVolker Rümelin  sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
1244063d5119SPaolo Bonzini                         method: 'pkg-config')
124535be72baSPaolo Bonzinielse
124635be72baSPaolo Bonzini  if get_option('sdl_image').enabled()
1247a8dc2aceSSergei Trofimovich    error('sdl-image required, but SDL was @0@'.format(
1248a8dc2aceSSergei Trofimovich          get_option('sdl').disabled() ? 'disabled' : 'not found'))
12492634733cSPaolo Bonzini  endif
125035be72baSPaolo Bonzini  sdl_image = not_found
125135be72baSPaolo Bonziniendif
125235be72baSPaolo Bonzini
12535e5733e5SMarc-André Lureaurbd = not_found
1254fabd1e93SPaolo Bonziniif not get_option('rbd').auto() or have_block
1255063d5119SPaolo Bonzini  librados = cc.find_library('rados', required: get_option('rbd'))
1256fabd1e93SPaolo Bonzini  librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
1257063d5119SPaolo Bonzini                           required: get_option('rbd'))
1258c518d6c2SPaolo Bonzini  if librados.found() and librbd.found()
1259c518d6c2SPaolo Bonzini    if cc.links('''
1260fabd1e93SPaolo Bonzini      #include <stdio.h>
1261fabd1e93SPaolo Bonzini      #include <rbd/librbd.h>
1262fabd1e93SPaolo Bonzini      int main(void) {
1263fabd1e93SPaolo Bonzini        rados_t cluster;
1264fabd1e93SPaolo Bonzini        rados_create(&cluster, NULL);
126548672ac0SPeter Lieven        #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
126648672ac0SPeter Lieven        #error
126748672ac0SPeter Lieven        #endif
1268fabd1e93SPaolo Bonzini        return 0;
1269fabd1e93SPaolo Bonzini      }''', dependencies: [librbd, librados])
1270fabd1e93SPaolo Bonzini      rbd = declare_dependency(dependencies: [librbd, librados])
1271c518d6c2SPaolo Bonzini    elif get_option('rbd').enabled()
127248672ac0SPeter Lieven      error('librbd >= 1.12.0 required')
1273c518d6c2SPaolo Bonzini    else
127448672ac0SPeter Lieven      warning('librbd >= 1.12.0 not found, disabling')
1275c518d6c2SPaolo Bonzini    endif
12765e5733e5SMarc-André Lureau  endif
1277fabd1e93SPaolo Bonziniendif
1278fabd1e93SPaolo Bonzini
12795e5733e5SMarc-André Lureauglusterfs = not_found
128008821ca2SPaolo Bonziniglusterfs_ftruncate_has_stat = false
128108821ca2SPaolo Bonziniglusterfs_iocb_has_stat = false
128208821ca2SPaolo Bonziniif not get_option('glusterfs').auto() or have_block
128308821ca2SPaolo Bonzini  glusterfs = dependency('glusterfs-api', version: '>=3',
128408821ca2SPaolo Bonzini                         required: get_option('glusterfs'),
1285063d5119SPaolo Bonzini                         method: 'pkg-config')
128608821ca2SPaolo Bonzini  if glusterfs.found()
128708821ca2SPaolo Bonzini    glusterfs_ftruncate_has_stat = cc.links('''
128808821ca2SPaolo Bonzini      #include <glusterfs/api/glfs.h>
128908821ca2SPaolo Bonzini
129008821ca2SPaolo Bonzini      int
129108821ca2SPaolo Bonzini      main(void)
129208821ca2SPaolo Bonzini      {
129308821ca2SPaolo Bonzini          /* new glfs_ftruncate() passes two additional args */
129408821ca2SPaolo Bonzini          return glfs_ftruncate(NULL, 0, NULL, NULL);
129508821ca2SPaolo Bonzini      }
129608821ca2SPaolo Bonzini    ''', dependencies: glusterfs)
129708821ca2SPaolo Bonzini    glusterfs_iocb_has_stat = cc.links('''
129808821ca2SPaolo Bonzini      #include <glusterfs/api/glfs.h>
129908821ca2SPaolo Bonzini
130008821ca2SPaolo Bonzini      /* new glfs_io_cbk() passes two additional glfs_stat structs */
130108821ca2SPaolo Bonzini      static void
130208821ca2SPaolo Bonzini      glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
130308821ca2SPaolo Bonzini      {}
130408821ca2SPaolo Bonzini
130508821ca2SPaolo Bonzini      int
130608821ca2SPaolo Bonzini      main(void)
130708821ca2SPaolo Bonzini      {
130808821ca2SPaolo Bonzini          glfs_io_cbk iocb = &glusterfs_iocb;
130908821ca2SPaolo Bonzini          iocb(NULL, 0 , NULL, NULL, NULL);
131008821ca2SPaolo Bonzini          return 0;
131108821ca2SPaolo Bonzini      }
131208821ca2SPaolo Bonzini    ''', dependencies: glusterfs)
131308821ca2SPaolo Bonzini  endif
13145e5733e5SMarc-André Lureauendif
1315e6a52b36SThomas Huth
13165e5733e5SMarc-André Lureaulibssh = not_found
1317e6a52b36SThomas Huthif not get_option('libssh').auto() or have_block
1318e6a52b36SThomas Huth  libssh = dependency('libssh', version: '>=0.8.7',
1319e6a52b36SThomas Huth                    method: 'pkg-config',
1320063d5119SPaolo Bonzini                    required: get_option('libssh'))
13215e5733e5SMarc-André Lureauendif
1322e6a52b36SThomas Huth
13235e5733e5SMarc-André Lureaulibbzip2 = not_found
132429ba6116SPaolo Bonziniif not get_option('bzip2').auto() or have_block
132529ba6116SPaolo Bonzini  libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
1326063d5119SPaolo Bonzini                             required: get_option('bzip2'))
132729ba6116SPaolo Bonzini  if libbzip2.found() and not cc.links('''
132829ba6116SPaolo Bonzini     #include <bzlib.h>
132929ba6116SPaolo Bonzini     int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
133029ba6116SPaolo Bonzini    libbzip2 = not_found
133129ba6116SPaolo Bonzini    if get_option('bzip2').enabled()
133229ba6116SPaolo Bonzini      error('could not link libbzip2')
133329ba6116SPaolo Bonzini    else
133429ba6116SPaolo Bonzini      warning('could not link libbzip2, disabling')
13355e5733e5SMarc-André Lureau    endif
133629ba6116SPaolo Bonzini  endif
13375e5733e5SMarc-André Lureauendif
1338ecea3696SPaolo Bonzini
13395e5733e5SMarc-André Lureauliblzfse = not_found
1340ecea3696SPaolo Bonziniif not get_option('lzfse').auto() or have_block
1341ecea3696SPaolo Bonzini  liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
1342063d5119SPaolo Bonzini                             required: get_option('lzfse'))
13435e5733e5SMarc-André Lureauendif
1344ecea3696SPaolo Bonziniif liblzfse.found() and not cc.links('''
1345ecea3696SPaolo Bonzini   #include <lzfse.h>
1346ecea3696SPaolo Bonzini   int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
1347ecea3696SPaolo Bonzini  liblzfse = not_found
1348ecea3696SPaolo Bonzini  if get_option('lzfse').enabled()
1349ecea3696SPaolo Bonzini    error('could not link liblzfse')
1350ecea3696SPaolo Bonzini  else
1351ecea3696SPaolo Bonzini    warning('could not link liblzfse, disabling')
1352ecea3696SPaolo Bonzini  endif
1353ecea3696SPaolo Bonziniendif
1354ecea3696SPaolo Bonzini
1355478e943fSPaolo Bonzinioss = not_found
135643a363aeSPaolo Bonziniif get_option('oss').allowed() and have_system
135787430d5bSPaolo Bonzini  if not cc.has_header('sys/soundcard.h')
135887430d5bSPaolo Bonzini    # not found
135987430d5bSPaolo Bonzini  elif targetos == 'netbsd'
1360063d5119SPaolo Bonzini    oss = cc.find_library('ossaudio', required: get_option('oss'))
136187430d5bSPaolo Bonzini  else
136287430d5bSPaolo Bonzini    oss = declare_dependency()
136387430d5bSPaolo Bonzini  endif
136487430d5bSPaolo Bonzini
136587430d5bSPaolo Bonzini  if not oss.found()
136687430d5bSPaolo Bonzini    if get_option('oss').enabled()
136787430d5bSPaolo Bonzini      error('OSS not found')
136887430d5bSPaolo Bonzini    endif
136987430d5bSPaolo Bonzini  endif
1370478e943fSPaolo Bonziniendif
1371478e943fSPaolo Bonzinidsound = not_found
137287430d5bSPaolo Bonziniif not get_option('dsound').auto() or (targetos == 'windows' and have_system)
137387430d5bSPaolo Bonzini  if cc.has_header('dsound.h')
137487430d5bSPaolo Bonzini    dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
1375478e943fSPaolo Bonzini  endif
137687430d5bSPaolo Bonzini
137787430d5bSPaolo Bonzini  if not dsound.found()
137887430d5bSPaolo Bonzini    if get_option('dsound').enabled()
137987430d5bSPaolo Bonzini      error('DirectSound not found')
138087430d5bSPaolo Bonzini    endif
138187430d5bSPaolo Bonzini  endif
138287430d5bSPaolo Bonziniendif
138387430d5bSPaolo Bonzini
1384478e943fSPaolo Bonzinicoreaudio = not_found
138587430d5bSPaolo Bonziniif not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system)
138687430d5bSPaolo Bonzini  coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
138787430d5bSPaolo Bonzini                         required: get_option('coreaudio'))
1388478e943fSPaolo Bonziniendif
13898bc5184dSThomas Huth
13902b1ccdf4SMarc-André Lureauopengl = not_found
139188b6e618SPaolo Bonziniif not get_option('opengl').auto() or have_system or have_vhost_user_gpu
139288b6e618SPaolo Bonzini  epoxy = dependency('epoxy', method: 'pkg-config',
1393063d5119SPaolo Bonzini                      required: get_option('opengl'))
139488b6e618SPaolo Bonzini  if cc.has_header('epoxy/egl.h', dependencies: epoxy)
139588b6e618SPaolo Bonzini    opengl = epoxy
139688b6e618SPaolo Bonzini  elif get_option('opengl').enabled()
139788b6e618SPaolo Bonzini    error('epoxy/egl.h not found')
139888b6e618SPaolo Bonzini  endif
13992b1ccdf4SMarc-André Lureauendif
14008bc5184dSThomas Huthgbm = not_found
14018bc5184dSThomas Huthif (have_system or have_tools) and (virgl.found() or opengl.found())
1402063d5119SPaolo Bonzini  gbm = dependency('gbm', method: 'pkg-config', required: false)
14038bc5184dSThomas Huthendif
1404f0caba44SMarc-André Lureauhave_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found()
14051b695471SPaolo Bonzini
140657612511SPaolo Bonzinignutls = not_found
1407cc4c7c73SDaniel P. Berrangégnutls_crypto = not_found
1408abc14fd0SAlyssa Rossif get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
1409cc4c7c73SDaniel P. Berrangé  # For general TLS support our min gnutls matches
1410cc4c7c73SDaniel P. Berrangé  # that implied by our platform support matrix
1411cc4c7c73SDaniel P. Berrangé  #
1412cc4c7c73SDaniel P. Berrangé  # For the crypto backends, we look for a newer
1413cc4c7c73SDaniel P. Berrangé  # gnutls:
1414cc4c7c73SDaniel P. Berrangé  #
1415cc4c7c73SDaniel P. Berrangé  #   Version 3.6.8  is needed to get XTS
1416cc4c7c73SDaniel P. Berrangé  #   Version 3.6.13 is needed to get PBKDF
1417cc4c7c73SDaniel P. Berrangé  #   Version 3.6.14 is needed to get HW accelerated XTS
1418cc4c7c73SDaniel P. Berrangé  #
1419cc4c7c73SDaniel P. Berrangé  # If newer enough gnutls isn't available, we can
1420cc4c7c73SDaniel P. Berrangé  # still use a different crypto backend to satisfy
1421cc4c7c73SDaniel P. Berrangé  # the platform support requirements
1422cc4c7c73SDaniel P. Berrangé  gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
1423cc4c7c73SDaniel P. Berrangé                             method: 'pkg-config',
1424063d5119SPaolo Bonzini                             required: false)
1425cc4c7c73SDaniel P. Berrangé  if gnutls_crypto.found()
1426cc4c7c73SDaniel P. Berrangé    gnutls = gnutls_crypto
1427cc4c7c73SDaniel P. Berrangé  else
1428cc4c7c73SDaniel P. Berrangé    # Our min version if all we need is TLS
142957612511SPaolo Bonzini    gnutls = dependency('gnutls', version: '>=3.5.18',
143057612511SPaolo Bonzini                        method: 'pkg-config',
1431063d5119SPaolo Bonzini                        required: get_option('gnutls'))
143257612511SPaolo Bonzini  endif
1433cc4c7c73SDaniel P. Berrangéendif
143457612511SPaolo Bonzini
14358bd0931fSDaniel P. Berrangé# We prefer use of gnutls for crypto, unless the options
14368bd0931fSDaniel P. Berrangé# explicitly asked for nettle or gcrypt.
14378bd0931fSDaniel P. Berrangé#
14388bd0931fSDaniel P. Berrangé# If gnutls isn't available for crypto, then we'll prefer
14398bd0931fSDaniel P. Berrangé# gcrypt over nettle for performance reasons.
144057612511SPaolo Bonzinigcrypt = not_found
144157612511SPaolo Bonzininettle = not_found
14424c5e512eSLei Hehogweed = not_found
144368014044SDaniel P. Berrangéxts = 'none'
14448bd0931fSDaniel P. Berrangé
144557612511SPaolo Bonziniif get_option('nettle').enabled() and get_option('gcrypt').enabled()
144657612511SPaolo Bonzini  error('Only one of gcrypt & nettle can be enabled')
144757612511SPaolo Bonziniendif
14488bd0931fSDaniel P. Berrangé
14498bd0931fSDaniel P. Berrangé# Explicit nettle/gcrypt request, so ignore gnutls for crypto
14508bd0931fSDaniel P. Berrangéif get_option('nettle').enabled() or get_option('gcrypt').enabled()
14518bd0931fSDaniel P. Berrangé  gnutls_crypto = not_found
145257612511SPaolo Bonziniendif
14538bd0931fSDaniel P. Berrangé
14548bd0931fSDaniel P. Berrangéif not gnutls_crypto.found()
14558bd0931fSDaniel P. Berrangé  if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
14561741093bSDaniel P. Berrangé    gcrypt = dependency('libgcrypt', version: '>=1.8',
145757612511SPaolo Bonzini                        method: 'config-tool',
1458063d5119SPaolo Bonzini                        required: get_option('gcrypt'))
145957612511SPaolo Bonzini    # Debian has removed -lgpg-error from libgcrypt-config
146057612511SPaolo Bonzini    # as it "spreads unnecessary dependencies" which in
146157612511SPaolo Bonzini    # turn breaks static builds...
1462a0cbd2e8SPaolo Bonzini    if gcrypt.found() and get_option('prefer_static')
1463bd3615d6SPaolo Bonzini      gcrypt = declare_dependency(dependencies:
1464bd3615d6SPaolo Bonzini        [gcrypt,
1465bd3615d6SPaolo Bonzini         cc.find_library('gpg-error', required: true)],
1466bd3615d6SPaolo Bonzini        version: gcrypt.version())
146757612511SPaolo Bonzini    endif
146857612511SPaolo Bonzini  endif
1469260a13d4SDaniel P. Berrangé  if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1470260a13d4SDaniel P. Berrangé    nettle = dependency('nettle', version: '>=3.4',
1471260a13d4SDaniel P. Berrangé                        method: 'pkg-config',
1472063d5119SPaolo Bonzini                        required: get_option('nettle'))
1473260a13d4SDaniel P. Berrangé    if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1474260a13d4SDaniel P. Berrangé      xts = 'private'
1475260a13d4SDaniel P. Berrangé    endif
1476260a13d4SDaniel P. Berrangé  endif
1477cc4c7c73SDaniel P. Berrangéendif
147857612511SPaolo Bonzini
1479063d5119SPaolo Bonzinigmp = dependency('gmp', required: false, method: 'pkg-config')
14804c5e512eSLei Heif nettle.found() and gmp.found()
14814c5e512eSLei He  hogweed = dependency('hogweed', version: '>=3.4',
14824c5e512eSLei He                       method: 'pkg-config',
1483063d5119SPaolo Bonzini                       required: get_option('nettle'))
14844c5e512eSLei Heendif
14854c5e512eSLei He
14864c5e512eSLei He
14872b1ccdf4SMarc-André Lureaugtk = not_found
14881b695471SPaolo Bonzinigtkx11 = not_found
1489c23d7b4eSPaolo Bonzinivte = not_found
149029e0bfffSClaudio Fontanahave_gtk_clipboard = get_option('gtk_clipboard').enabled()
149129e0bfffSClaudio Fontana
149264d3fec7SAkihiko Odakiif not get_option('gtk').auto() or have_system
14931b695471SPaolo Bonzini  gtk = dependency('gtk+-3.0', version: '>=3.22.0',
14941b695471SPaolo Bonzini                   method: 'pkg-config',
1495063d5119SPaolo Bonzini                   required: get_option('gtk'))
14961b695471SPaolo Bonzini  if gtk.found()
14971b695471SPaolo Bonzini    gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
14981b695471SPaolo Bonzini                        method: 'pkg-config',
1499063d5119SPaolo Bonzini                        required: false)
1500bd3615d6SPaolo Bonzini    gtk = declare_dependency(dependencies: [gtk, gtkx11],
1501bd3615d6SPaolo Bonzini                             version: gtk.version())
1502c23d7b4eSPaolo Bonzini
1503c23d7b4eSPaolo Bonzini    if not get_option('vte').auto() or have_system
1504c23d7b4eSPaolo Bonzini      vte = dependency('vte-2.91',
1505c23d7b4eSPaolo Bonzini                       method: 'pkg-config',
1506063d5119SPaolo Bonzini                       required: get_option('vte'))
1507c23d7b4eSPaolo Bonzini    endif
150829e0bfffSClaudio Fontana  elif have_gtk_clipboard
150929e0bfffSClaudio Fontana    error('GTK clipboard requested, but GTK not found')
15102b1ccdf4SMarc-André Lureau  endif
15111b695471SPaolo Bonziniendif
15121b695471SPaolo Bonzini
15132b1ccdf4SMarc-André Lureaux11 = not_found
15149d49bcf6SMarkus Armbrusterif gtkx11.found()
1515063d5119SPaolo Bonzini  x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found())
15162b1ccdf4SMarc-André Lureauendif
15172b1ccdf4SMarc-André Lureaupng = not_found
151895f8510eSKshitij Suriif get_option('png').allowed() and have_system
15191ec8c2c0SThomas Huth   png = dependency('libpng', version: '>=1.6.34', required: get_option('png'),
1520063d5119SPaolo Bonzini                    method: 'pkg-config')
152195f8510eSKshitij Suriendif
152295f8510eSKshitij Surivnc = not_found
15232b1ccdf4SMarc-André Lureaujpeg = not_found
15242b1ccdf4SMarc-André Lureausasl = not_found
152543a363aeSPaolo Bonziniif get_option('vnc').allowed() and have_system
1526a0b93237SPaolo Bonzini  vnc = declare_dependency() # dummy dependency
15278e242b3cSPaolo Bonzini  jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
1528063d5119SPaolo Bonzini                    method: 'pkg-config')
1529a0b93237SPaolo Bonzini  sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
1530063d5119SPaolo Bonzini                         required: get_option('vnc_sasl'))
1531a0b93237SPaolo Bonzini  if sasl.found()
1532a0b93237SPaolo Bonzini    sasl = declare_dependency(dependencies: sasl,
1533a0b93237SPaolo Bonzini                              compile_args: '-DSTRUCT_IOVEC_DEFINED')
1534a0b93237SPaolo Bonzini  endif
15352b1ccdf4SMarc-André Lureauendif
1536241611eaSPaolo Bonzini
153705e391aeSPaolo Bonzinipam = not_found
153805e391aeSPaolo Bonziniif not get_option('auth_pam').auto() or have_system
153905e391aeSPaolo Bonzini  pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
1540063d5119SPaolo Bonzini                        required: get_option('auth_pam'))
154105e391aeSPaolo Bonziniendif
154205e391aeSPaolo Bonziniif pam.found() and not cc.links('''
154305e391aeSPaolo Bonzini   #include <stddef.h>
154405e391aeSPaolo Bonzini   #include <security/pam_appl.h>
154505e391aeSPaolo Bonzini   int main(void) {
154605e391aeSPaolo Bonzini     const char *service_name = "qemu";
154705e391aeSPaolo Bonzini     const char *user = "frank";
154805e391aeSPaolo Bonzini     const struct pam_conv pam_conv = { 0 };
154905e391aeSPaolo Bonzini     pam_handle_t *pamh = NULL;
155005e391aeSPaolo Bonzini     pam_start(service_name, user, &pam_conv, &pamh);
155105e391aeSPaolo Bonzini     return 0;
155205e391aeSPaolo Bonzini   }''', dependencies: pam)
155305e391aeSPaolo Bonzini  pam = not_found
155405e391aeSPaolo Bonzini  if get_option('auth_pam').enabled()
155505e391aeSPaolo Bonzini    error('could not link libpam')
155605e391aeSPaolo Bonzini  else
155705e391aeSPaolo Bonzini    warning('could not link libpam, disabling')
155805e391aeSPaolo Bonzini  endif
155905e391aeSPaolo Bonziniendif
156005e391aeSPaolo Bonzini
1561708eab42SMarc-André Lureausnappy = not_found
1562241611eaSPaolo Bonziniif not get_option('snappy').auto() or have_system
1563241611eaSPaolo Bonzini  snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
1564063d5119SPaolo Bonzini                           required: get_option('snappy'))
1565708eab42SMarc-André Lureauendif
1566565174d0SPaolo Bonziniif snappy.found() and not linker.links('''
1567241611eaSPaolo Bonzini   #include <snappy-c.h>
1568241611eaSPaolo Bonzini   int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
1569241611eaSPaolo Bonzini  snappy = not_found
1570241611eaSPaolo Bonzini  if get_option('snappy').enabled()
1571241611eaSPaolo Bonzini    error('could not link libsnappy')
1572241611eaSPaolo Bonzini  else
1573241611eaSPaolo Bonzini    warning('could not link libsnappy, disabling')
1574241611eaSPaolo Bonzini  endif
1575708eab42SMarc-André Lureauendif
15760c32a0aeSPaolo Bonzini
1577708eab42SMarc-André Lureaulzo = not_found
15780c32a0aeSPaolo Bonziniif not get_option('lzo').auto() or have_system
15790c32a0aeSPaolo Bonzini  lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
1580063d5119SPaolo Bonzini                        required: get_option('lzo'))
1581708eab42SMarc-André Lureauendif
15820c32a0aeSPaolo Bonziniif lzo.found() and not cc.links('''
15830c32a0aeSPaolo Bonzini   #include <lzo/lzo1x.h>
15840c32a0aeSPaolo Bonzini   int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
15850c32a0aeSPaolo Bonzini  lzo = not_found
15860c32a0aeSPaolo Bonzini  if get_option('lzo').enabled()
15870c32a0aeSPaolo Bonzini    error('could not link liblzo2')
15880c32a0aeSPaolo Bonzini  else
15890c32a0aeSPaolo Bonzini    warning('could not link liblzo2, disabling')
15900c32a0aeSPaolo Bonzini  endif
15910c32a0aeSPaolo Bonziniendif
15920c32a0aeSPaolo Bonzini
1593488a8c73SPaolo Bonzininuma = not_found
1594488a8c73SPaolo Bonziniif not get_option('numa').auto() or have_system or have_tools
1595488a8c73SPaolo Bonzini  numa = cc.find_library('numa', has_headers: ['numa.h'],
1596063d5119SPaolo Bonzini                              required: get_option('numa'))
1597488a8c73SPaolo Bonziniendif
1598488a8c73SPaolo Bonziniif numa.found() and not cc.links('''
1599488a8c73SPaolo Bonzini   #include <numa.h>
1600488a8c73SPaolo Bonzini   int main(void) { return numa_available(); }
1601488a8c73SPaolo Bonzini   ''', dependencies: numa)
1602488a8c73SPaolo Bonzini  numa = not_found
1603488a8c73SPaolo Bonzini  if get_option('numa').enabled()
1604488a8c73SPaolo Bonzini    error('could not link numa')
1605488a8c73SPaolo Bonzini  else
1606488a8c73SPaolo Bonzini    warning('could not link numa, disabling')
1607488a8c73SPaolo Bonzini  endif
1608488a8c73SPaolo Bonziniendif
1609488a8c73SPaolo Bonzini
161055166230SMarc-André Lureaurdma = not_found
16113730a734SPaolo Bonziniif not get_option('rdma').auto() or have_system
16123730a734SPaolo Bonzini  libumad = cc.find_library('ibumad', required: get_option('rdma'))
16133730a734SPaolo Bonzini  rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'],
1614063d5119SPaolo Bonzini                               required: get_option('rdma')),
1615063d5119SPaolo Bonzini               cc.find_library('ibverbs', required: get_option('rdma')),
16163730a734SPaolo Bonzini               libumad]
16173730a734SPaolo Bonzini  rdma = declare_dependency(dependencies: rdma_libs)
16183730a734SPaolo Bonzini  foreach lib: rdma_libs
16193730a734SPaolo Bonzini    if not lib.found()
16203730a734SPaolo Bonzini      rdma = not_found
162155166230SMarc-André Lureau    endif
16223730a734SPaolo Bonzini  endforeach
16233730a734SPaolo Bonziniendif
16243730a734SPaolo Bonzini
1625582ea95fSMarc-André Lureauxen = not_found
162614efd8d3SPaolo Bonziniif get_option('xen').enabled() or (get_option('xen').auto() and have_system)
162714efd8d3SPaolo Bonzini  xencontrol = dependency('xencontrol', required: false,
1628063d5119SPaolo Bonzini                          method: 'pkg-config')
162914efd8d3SPaolo Bonzini  if xencontrol.found()
163014efd8d3SPaolo Bonzini    xen_pc = declare_dependency(version: xencontrol.version(),
163114efd8d3SPaolo Bonzini      dependencies: [
163214efd8d3SPaolo Bonzini        xencontrol,
163314efd8d3SPaolo Bonzini        # disabler: true makes xen_pc.found() return false if any is not found
163414efd8d3SPaolo Bonzini        dependency('xenstore', required: false,
1635063d5119SPaolo Bonzini                   method: 'pkg-config',
163614efd8d3SPaolo Bonzini                   disabler: true),
163714efd8d3SPaolo Bonzini        dependency('xenforeignmemory', required: false,
1638063d5119SPaolo Bonzini                   method: 'pkg-config',
163914efd8d3SPaolo Bonzini                   disabler: true),
164014efd8d3SPaolo Bonzini        dependency('xengnttab', required: false,
1641063d5119SPaolo Bonzini                   method: 'pkg-config',
164214efd8d3SPaolo Bonzini                   disabler: true),
164314efd8d3SPaolo Bonzini        dependency('xenevtchn', required: false,
1644063d5119SPaolo Bonzini                   method: 'pkg-config',
164514efd8d3SPaolo Bonzini                   disabler: true),
164614efd8d3SPaolo Bonzini        dependency('xendevicemodel', required: false,
1647063d5119SPaolo Bonzini                   method: 'pkg-config',
164814efd8d3SPaolo Bonzini                   disabler: true),
164914efd8d3SPaolo Bonzini        # optional, no "disabler: true"
165014efd8d3SPaolo Bonzini        dependency('xentoolcore', required: false,
1651063d5119SPaolo Bonzini                   method: 'pkg-config')])
165214efd8d3SPaolo Bonzini    if xen_pc.found()
165314efd8d3SPaolo Bonzini      xen = xen_pc
1654582ea95fSMarc-André Lureau    endif
165514efd8d3SPaolo Bonzini  endif
165614efd8d3SPaolo Bonzini  if not xen.found()
165714efd8d3SPaolo 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' ]
165814efd8d3SPaolo Bonzini    xen_libs = {
165914efd8d3SPaolo Bonzini      '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
166014efd8d3SPaolo Bonzini      '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
166114efd8d3SPaolo Bonzini      '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
166214efd8d3SPaolo Bonzini      '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
166314efd8d3SPaolo Bonzini      '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
166414efd8d3SPaolo Bonzini      '4.6.0': [ 'xenstore', 'xenctrl' ],
166514efd8d3SPaolo Bonzini      '4.5.0': [ 'xenstore', 'xenctrl' ],
166614efd8d3SPaolo Bonzini      '4.2.0': [ 'xenstore', 'xenctrl' ],
166714efd8d3SPaolo Bonzini    }
166814efd8d3SPaolo Bonzini    xen_deps = {}
166914efd8d3SPaolo Bonzini    foreach ver: xen_tests
167014efd8d3SPaolo Bonzini      # cache the various library tests to avoid polluting the logs
167114efd8d3SPaolo Bonzini      xen_test_deps = []
167214efd8d3SPaolo Bonzini      foreach l: xen_libs[ver]
167314efd8d3SPaolo Bonzini        if l not in xen_deps
167414efd8d3SPaolo Bonzini          xen_deps += { l: cc.find_library(l, required: false) }
167514efd8d3SPaolo Bonzini        endif
167614efd8d3SPaolo Bonzini        xen_test_deps += xen_deps[l]
167714efd8d3SPaolo Bonzini      endforeach
167814efd8d3SPaolo Bonzini
167914efd8d3SPaolo Bonzini      # Use -D to pick just one of the test programs in scripts/xen-detect.c
168014efd8d3SPaolo Bonzini      xen_version = ver.split('.')
168114efd8d3SPaolo Bonzini      xen_ctrl_version = xen_version[0] + \
168214efd8d3SPaolo Bonzini        ('0' + xen_version[1]).substring(-2) + \
168314efd8d3SPaolo Bonzini        ('0' + xen_version[2]).substring(-2)
168414efd8d3SPaolo Bonzini      if cc.links(files('scripts/xen-detect.c'),
168514efd8d3SPaolo Bonzini                  args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version,
168614efd8d3SPaolo Bonzini                  dependencies: xen_test_deps)
168714efd8d3SPaolo Bonzini        xen = declare_dependency(version: ver, dependencies: xen_test_deps)
168814efd8d3SPaolo Bonzini        break
168914efd8d3SPaolo Bonzini      endif
169014efd8d3SPaolo Bonzini    endforeach
169114efd8d3SPaolo Bonzini  endif
169214efd8d3SPaolo Bonzini  if xen.found()
169314efd8d3SPaolo Bonzini    accelerators += 'CONFIG_XEN'
169414efd8d3SPaolo Bonzini  elif get_option('xen').enabled()
169514efd8d3SPaolo Bonzini    error('could not compile and link Xen test program')
169614efd8d3SPaolo Bonzini  endif
169714efd8d3SPaolo Bonziniendif
169814efd8d3SPaolo Bonzinihave_xen_pci_passthrough = get_option('xen_pci_passthrough') \
169914efd8d3SPaolo Bonzini  .require(xen.found(),
170014efd8d3SPaolo Bonzini           error_message: 'Xen PCI passthrough requested but Xen not enabled') \
170114efd8d3SPaolo Bonzini  .require(targetos == 'linux',
170214efd8d3SPaolo Bonzini           error_message: 'Xen PCI passthrough not available on this platform') \
170314efd8d3SPaolo Bonzini  .allowed()
170414efd8d3SPaolo Bonzini
170514efd8d3SPaolo Bonzini
170606677ce1SPaolo Bonzinicacard = not_found
17075f364c57SPaolo Bonziniif not get_option('smartcard').auto() or have_system
17085f364c57SPaolo Bonzini  cacard = dependency('libcacard', required: get_option('smartcard'),
1709063d5119SPaolo Bonzini                      version: '>=2.5.1', method: 'pkg-config')
171006677ce1SPaolo Bonziniendif
17110a40bcb7SCésar Belleyu2f = not_found
17120a40bcb7SCésar Belleyif have_system
17130a40bcb7SCésar Belley  u2f = dependency('u2f-emu', required: get_option('u2f'),
1714063d5119SPaolo Bonzini                   method: 'pkg-config')
17150a40bcb7SCésar Belleyendif
17168caef850SHongren (Zenithal) Zhengcanokey = not_found
17178caef850SHongren (Zenithal) Zhengif have_system
17188caef850SHongren (Zenithal) Zheng  canokey = dependency('canokey-qemu', required: get_option('canokey'),
1719063d5119SPaolo Bonzini                   method: 'pkg-config')
17208caef850SHongren (Zenithal) Zhengendif
172106677ce1SPaolo Bonziniusbredir = not_found
172218f31e60SPaolo Bonziniif not get_option('usb_redir').auto() or have_system
172318f31e60SPaolo Bonzini  usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
1724063d5119SPaolo Bonzini                        version: '>=0.6', method: 'pkg-config')
172506677ce1SPaolo Bonziniendif
172606677ce1SPaolo Bonzinilibusb = not_found
172790540f32SPaolo Bonziniif not get_option('libusb').auto() or have_system
172890540f32SPaolo Bonzini  libusb = dependency('libusb-1.0', required: get_option('libusb'),
1729063d5119SPaolo Bonzini                      version: '>=1.0.13', method: 'pkg-config')
173006677ce1SPaolo Bonziniendif
173190540f32SPaolo Bonzini
1732c9322ab5SMarc-André Lureaulibpmem = not_found
1733e36e8c70SPaolo Bonziniif not get_option('libpmem').auto() or have_system
1734e36e8c70SPaolo Bonzini  libpmem = dependency('libpmem', required: get_option('libpmem'),
1735063d5119SPaolo Bonzini                       method: 'pkg-config')
1736c9322ab5SMarc-André Lureauendif
1737c7c91a74SBruce Rogerslibdaxctl = not_found
173883ef1682SPaolo Bonziniif not get_option('libdaxctl').auto() or have_system
173983ef1682SPaolo Bonzini  libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
1740063d5119SPaolo Bonzini                         version: '>=57', method: 'pkg-config')
1741c7c91a74SBruce Rogersendif
17428ce0a45fSMarc-André Lureautasn1 = not_found
1743ba7ed407SPaolo Bonziniif gnutls.found()
1744ba7ed407SPaolo Bonzini  tasn1 = dependency('libtasn1',
1745063d5119SPaolo Bonzini                     method: 'pkg-config')
17468ce0a45fSMarc-André Lureauendif
1747af04e89dSMarc-André Lureaukeyutils = dependency('libkeyutils', required: false,
1748063d5119SPaolo Bonzini                      method: 'pkg-config')
1749a81df1b6SPaolo Bonzini
17503909def8SMarc-André Lureauhas_gettid = cc.has_function('gettid')
17513909def8SMarc-André Lureau
17523d212b41SRichard W.M. Jones# libselinux
17533d212b41SRichard W.M. Jonesselinux = dependency('libselinux',
17543d212b41SRichard W.M. Jones                     required: get_option('selinux'),
1755063d5119SPaolo Bonzini                     method: 'pkg-config')
17563d212b41SRichard W.M. Jones
1757aa087962SPaolo Bonzini# Malloc tests
1758aa087962SPaolo Bonzini
1759aa087962SPaolo Bonzinimalloc = []
1760aa087962SPaolo Bonziniif get_option('malloc') == 'system'
1761aa087962SPaolo Bonzini  has_malloc_trim = \
176243a363aeSPaolo Bonzini    get_option('malloc_trim').allowed() and \
1763aa087962SPaolo Bonzini    cc.links('''#include <malloc.h>
1764aa087962SPaolo Bonzini                int main(void) { malloc_trim(0); return 0; }''')
1765aa087962SPaolo Bonzinielse
1766aa087962SPaolo Bonzini  has_malloc_trim = false
1767aa087962SPaolo Bonzini  malloc = cc.find_library(get_option('malloc'), required: true)
1768aa087962SPaolo Bonziniendif
1769aa087962SPaolo Bonziniif not has_malloc_trim and get_option('malloc_trim').enabled()
1770aa087962SPaolo Bonzini  if get_option('malloc') == 'system'
1771aa087962SPaolo Bonzini    error('malloc_trim not available on this platform.')
1772aa087962SPaolo Bonzini  else
1773aa087962SPaolo Bonzini    error('malloc_trim not available with non-libc memory allocator')
1774aa087962SPaolo Bonzini  endif
1775aa087962SPaolo Bonziniendif
1776aa087962SPaolo Bonzini
177784e319a5SMax Reitz# Check whether the glibc provides statx()
177884e319a5SMax Reitz
1779e66420acSPaolo Bonzinignu_source_prefix = '''
178084e319a5SMax Reitz  #ifndef _GNU_SOURCE
178184e319a5SMax Reitz  #define _GNU_SOURCE
178284e319a5SMax Reitz  #endif
1783e66420acSPaolo Bonzini'''
1784e66420acSPaolo Bonzinistatx_test = gnu_source_prefix + '''
178584e319a5SMax Reitz  #include <sys/stat.h>
178684e319a5SMax Reitz  int main(void) {
178784e319a5SMax Reitz    struct statx statxbuf;
178884e319a5SMax Reitz    statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
178984e319a5SMax Reitz    return 0;
179084e319a5SMax Reitz  }'''
179184e319a5SMax Reitz
179284e319a5SMax Reitzhas_statx = cc.links(statx_test)
179384e319a5SMax Reitz
17944ce7a08dSHanna Reitz# Check whether statx() provides mount ID information
17954ce7a08dSHanna Reitz
17964ce7a08dSHanna Reitzstatx_mnt_id_test = gnu_source_prefix + '''
17974ce7a08dSHanna Reitz  #include <sys/stat.h>
17984ce7a08dSHanna Reitz  int main(void) {
17994ce7a08dSHanna Reitz    struct statx statxbuf;
18004ce7a08dSHanna Reitz    statx(0, "", 0, STATX_BASIC_STATS | STATX_MNT_ID, &statxbuf);
18014ce7a08dSHanna Reitz    return statxbuf.stx_mnt_id;
18024ce7a08dSHanna Reitz  }'''
18034ce7a08dSHanna Reitz
18044ce7a08dSHanna Reitzhas_statx_mnt_id = cc.links(statx_mnt_id_test)
18054ce7a08dSHanna Reitz
1806a436d6d4SPaolo Bonzinihave_vhost_user_blk_server = get_option('vhost_user_blk_server') \
1807a436d6d4SPaolo Bonzini  .require(targetos == 'linux',
1808a436d6d4SPaolo Bonzini           error_message: 'vhost_user_blk_server requires linux') \
18092a3129a3SPaolo Bonzini  .require(have_vhost_user,
1810a436d6d4SPaolo Bonzini           error_message: 'vhost_user_blk_server requires vhost-user support') \
181126ed501bSAlex Bennée  .disable_auto_if(not have_tools and not have_system) \
1812a436d6d4SPaolo Bonzini  .allowed()
18139e62ba48SDaniele Buono
1814df4ea709SMax Reitzif get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
1815df4ea709SMax Reitz  error('Cannot enable fuse-lseek while fuse is disabled')
1816df4ea709SMax Reitzendif
1817df4ea709SMax Reitz
1818a484a719SMax Reitzfuse = dependency('fuse3', required: get_option('fuse'),
1819063d5119SPaolo Bonzini                  version: '>=3.1', method: 'pkg-config')
1820a484a719SMax Reitz
1821df4ea709SMax Reitzfuse_lseek = not_found
182243a363aeSPaolo Bonziniif get_option('fuse_lseek').allowed()
1823df4ea709SMax Reitz  if fuse.version().version_compare('>=3.8')
1824df4ea709SMax Reitz    # Dummy dependency
1825df4ea709SMax Reitz    fuse_lseek = declare_dependency()
1826df4ea709SMax Reitz  elif get_option('fuse_lseek').enabled()
1827df4ea709SMax Reitz    if fuse.found()
1828df4ea709SMax Reitz      error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1829df4ea709SMax Reitz    else
1830df4ea709SMax Reitz      error('fuse-lseek requires libfuse, which was not found')
1831df4ea709SMax Reitz    endif
1832df4ea709SMax Reitz  endif
1833df4ea709SMax Reitzendif
1834df4ea709SMax Reitz
1835a6caeee8SXie Yongjihave_libvduse = (targetos == 'linux')
1836a6caeee8SXie Yongjiif get_option('libvduse').enabled()
1837a6caeee8SXie Yongji    if targetos != 'linux'
1838a6caeee8SXie Yongji        error('libvduse requires linux')
1839a6caeee8SXie Yongji    endif
1840a6caeee8SXie Yongjielif get_option('libvduse').disabled()
1841a6caeee8SXie Yongji    have_libvduse = false
1842a6caeee8SXie Yongjiendif
1843a6caeee8SXie Yongji
18442a2359b8SXie Yongjihave_vduse_blk_export = (have_libvduse and targetos == 'linux')
18452a2359b8SXie Yongjiif get_option('vduse_blk_export').enabled()
18462a2359b8SXie Yongji    if targetos != 'linux'
18472a2359b8SXie Yongji        error('vduse_blk_export requires linux')
18482a2359b8SXie Yongji    elif not have_libvduse
18492a2359b8SXie Yongji        error('vduse_blk_export requires libvduse support')
18502a2359b8SXie Yongji    endif
18512a2359b8SXie Yongjielif get_option('vduse_blk_export').disabled()
18522a2359b8SXie Yongji    have_vduse_blk_export = false
18532a2359b8SXie Yongjiendif
18542a2359b8SXie Yongji
185546627f41SAndrew Melnychenko# libbpf
185646627f41SAndrew Melnychenkolibbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config')
185746627f41SAndrew Melnychenkoif libbpf.found() and not cc.links('''
185846627f41SAndrew Melnychenko   #include <bpf/libbpf.h>
185946627f41SAndrew Melnychenko   int main(void)
186046627f41SAndrew Melnychenko   {
186146627f41SAndrew Melnychenko     bpf_object__destroy_skeleton(NULL);
186246627f41SAndrew Melnychenko     return 0;
186346627f41SAndrew Melnychenko   }''', dependencies: libbpf)
186446627f41SAndrew Melnychenko  libbpf = not_found
186546627f41SAndrew Melnychenko  if get_option('bpf').enabled()
186646627f41SAndrew Melnychenko    error('libbpf skeleton test failed')
186746627f41SAndrew Melnychenko  else
186846627f41SAndrew Melnychenko    warning('libbpf skeleton test failed, disabling')
186946627f41SAndrew Melnychenko  endif
187046627f41SAndrew Melnychenkoendif
187146627f41SAndrew Melnychenko
18727c10cb38SIlya Leoshkevich# libdw
1873bc71d58fSIlya Leoshkevichlibdw = not_found
1874550c6d97SIlya Leoshkevichif not get_option('libdw').auto() or \
1875a0cbd2e8SPaolo Bonzini        (not get_option('prefer_static') and (have_system or have_user))
18767c10cb38SIlya Leoshkevich    libdw = dependency('libdw',
18777c10cb38SIlya Leoshkevich                       method: 'pkg-config',
1878bc71d58fSIlya Leoshkevich                       required: get_option('libdw'))
1879bc71d58fSIlya Leoshkevichendif
18807c10cb38SIlya Leoshkevich
188187430d5bSPaolo Bonzini#################
188287430d5bSPaolo Bonzini# config-host.h #
188387430d5bSPaolo Bonzini#################
188487430d5bSPaolo Bonzini
188587430d5bSPaolo Bonziniaudio_drivers_selected = []
188687430d5bSPaolo Bonziniif have_system
188787430d5bSPaolo Bonzini  audio_drivers_available = {
188887430d5bSPaolo Bonzini    'alsa': alsa.found(),
188987430d5bSPaolo Bonzini    'coreaudio': coreaudio.found(),
189087430d5bSPaolo Bonzini    'dsound': dsound.found(),
189187430d5bSPaolo Bonzini    'jack': jack.found(),
189287430d5bSPaolo Bonzini    'oss': oss.found(),
189387430d5bSPaolo Bonzini    'pa': pulse.found(),
1894c2d3d1c2SDorinda Bassey    'pipewire': pipewire.found(),
189587430d5bSPaolo Bonzini    'sdl': sdl.found(),
1896663df1ccSAlexandre Ratchov    'sndio': sndio.found(),
189787430d5bSPaolo Bonzini  }
1898e5424a29SPaolo Bonzini  foreach k, v: audio_drivers_available
1899e5424a29SPaolo Bonzini    config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
1900e5424a29SPaolo Bonzini  endforeach
190187430d5bSPaolo Bonzini
190287430d5bSPaolo Bonzini  # Default to native drivers first, OSS second, SDL third
190387430d5bSPaolo Bonzini  audio_drivers_priority = \
1904663df1ccSAlexandre Ratchov    [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \
190587430d5bSPaolo Bonzini    (targetos == 'linux' ? [] : [ 'sdl' ])
190687430d5bSPaolo Bonzini  audio_drivers_default = []
190787430d5bSPaolo Bonzini  foreach k: audio_drivers_priority
190887430d5bSPaolo Bonzini    if audio_drivers_available[k]
190987430d5bSPaolo Bonzini      audio_drivers_default += k
191087430d5bSPaolo Bonzini    endif
191187430d5bSPaolo Bonzini  endforeach
191287430d5bSPaolo Bonzini
191387430d5bSPaolo Bonzini  foreach k: get_option('audio_drv_list')
191487430d5bSPaolo Bonzini    if k == 'default'
191587430d5bSPaolo Bonzini      audio_drivers_selected += audio_drivers_default
191687430d5bSPaolo Bonzini    elif not audio_drivers_available[k]
191787430d5bSPaolo Bonzini      error('Audio driver "@0@" not available.'.format(k))
191887430d5bSPaolo Bonzini    else
191987430d5bSPaolo Bonzini      audio_drivers_selected += k
192087430d5bSPaolo Bonzini    endif
192187430d5bSPaolo Bonzini  endforeach
192287430d5bSPaolo Bonziniendif
192387430d5bSPaolo Bonziniconfig_host_data.set('CONFIG_AUDIO_DRIVERS',
192487430d5bSPaolo Bonzini                     '"' + '", "'.join(audio_drivers_selected) + '", ')
192587430d5bSPaolo Bonzini
19269e62ba48SDaniele Buonoif get_option('cfi')
19279e62ba48SDaniele Buono  cfi_flags=[]
19289e62ba48SDaniele Buono  # Check for dependency on LTO
19299e62ba48SDaniele Buono  if not get_option('b_lto')
19309e62ba48SDaniele Buono    error('Selected Control-Flow Integrity but LTO is disabled')
19319e62ba48SDaniele Buono  endif
19326002711cSPaolo Bonzini  if enable_modules
19339e62ba48SDaniele Buono    error('Selected Control-Flow Integrity is not compatible with modules')
19349e62ba48SDaniele Buono  endif
19359e62ba48SDaniele Buono  # Check for cfi flags. CFI requires LTO so we can't use
19369e62ba48SDaniele Buono  # get_supported_arguments, but need a more complex "compiles" which allows
19379e62ba48SDaniele Buono  # custom arguments
19389e62ba48SDaniele Buono  if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
19399e62ba48SDaniele Buono                 args: ['-flto', '-fsanitize=cfi-icall'] )
19409e62ba48SDaniele Buono    cfi_flags += '-fsanitize=cfi-icall'
19419e62ba48SDaniele Buono  else
19429e62ba48SDaniele Buono    error('-fsanitize=cfi-icall is not supported by the compiler')
19439e62ba48SDaniele Buono  endif
19449e62ba48SDaniele Buono  if cc.compiles('int main () { return 0; }',
19459e62ba48SDaniele Buono                 name: '-fsanitize-cfi-icall-generalize-pointers',
19469e62ba48SDaniele Buono                 args: ['-flto', '-fsanitize=cfi-icall',
19479e62ba48SDaniele Buono                        '-fsanitize-cfi-icall-generalize-pointers'] )
19489e62ba48SDaniele Buono    cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
19499e62ba48SDaniele Buono  else
19509e62ba48SDaniele Buono    error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
19519e62ba48SDaniele Buono  endif
19529e62ba48SDaniele Buono  if get_option('cfi_debug')
19539e62ba48SDaniele Buono    if cc.compiles('int main () { return 0; }',
19549e62ba48SDaniele Buono                   name: '-fno-sanitize-trap=cfi-icall',
19559e62ba48SDaniele Buono                   args: ['-flto', '-fsanitize=cfi-icall',
19569e62ba48SDaniele Buono                          '-fno-sanitize-trap=cfi-icall'] )
19579e62ba48SDaniele Buono      cfi_flags += '-fno-sanitize-trap=cfi-icall'
19589e62ba48SDaniele Buono    else
19599e62ba48SDaniele Buono      error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
19609e62ba48SDaniele Buono    endif
19619e62ba48SDaniele Buono  endif
1962e5134024SPaolo Bonzini  add_global_arguments(cfi_flags, native: false, language: all_languages)
1963e5134024SPaolo Bonzini  add_global_link_arguments(cfi_flags, native: false, language: all_languages)
19649e62ba48SDaniele Buonoendif
19659e62ba48SDaniele Buono
196614176c8dSJoelle van Dynehave_host_block_device = (targetos != 'darwin' or
196714176c8dSJoelle van Dyne    cc.has_header('IOKit/storage/IOMedia.h'))
196814176c8dSJoelle van Dyne
1969a436d6d4SPaolo Bonzinidbus_display = get_option('dbus_display') \
1970a436d6d4SPaolo Bonzini  .require(gio.version().version_compare('>=2.64'),
1971a436d6d4SPaolo Bonzini           error_message: '-display dbus requires glib>=2.64') \
19727544060eSPaolo Bonzini  .require(gdbus_codegen.found(),
1973bb2dc4b7SPaolo Bonzini           error_message: gdbus_codegen_error.format('-display dbus')) \
197484a0a2efSMarc-André Lureau  .require(targetos != 'windows',
197584a0a2efSMarc-André Lureau           error_message: '-display dbus is not available on Windows') \
1976a436d6d4SPaolo Bonzini  .allowed()
1977142ca628SMarc-André Lureau
1978a436d6d4SPaolo Bonzinihave_virtfs = get_option('virtfs') \
19790fb1e19dSKeno Fischer    .require(targetos == 'linux' or targetos == 'darwin',
19800fb1e19dSKeno Fischer             error_message: 'virtio-9p (virtfs) requires Linux or macOS') \
19810fb1e19dSKeno Fischer    .require(targetos == 'linux' or cc.has_function('pthread_fchdir_np'),
19820fb1e19dSKeno Fischer             error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \
19831a67e07fSPeter Foley    .require(targetos == 'darwin' or libattr.found(),
19841a67e07fSPeter Foley             error_message: 'virtio-9p (virtfs) on Linux requires libattr-devel') \
1985a436d6d4SPaolo Bonzini    .disable_auto_if(not have_tools and not have_system) \
1986a436d6d4SPaolo Bonzini    .allowed()
198769202b40SPaolo Bonzini
19881a67e07fSPeter Foleyhave_virtfs_proxy_helper = get_option('virtfs_proxy_helper') \
19891a67e07fSPeter Foley    .require(targetos != 'darwin', error_message: 'the virtfs proxy helper is incompatible with macOS') \
19901a67e07fSPeter Foley    .require(have_virtfs, error_message: 'the virtfs proxy helper requires that virtfs is enabled') \
19911a67e07fSPeter Foley    .disable_auto_if(not have_tools) \
19921a67e07fSPeter Foley    .require(libcap_ng.found(), error_message: 'the virtfs proxy helper requires libcap-ng') \
19931a67e07fSPeter Foley    .allowed()
19943a489d38SPhilippe Mathieu-Daudé
1995622d64ffSPaolo Bonziniif get_option('block_drv_ro_whitelist') == ''
1996622d64ffSPaolo Bonzini  config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '')
1997622d64ffSPaolo Bonzinielse
1998622d64ffSPaolo Bonzini  config_host_data.set('CONFIG_BDRV_RO_WHITELIST',
1999622d64ffSPaolo Bonzini        '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ')
2000622d64ffSPaolo Bonziniendif
2001622d64ffSPaolo Bonziniif get_option('block_drv_rw_whitelist') == ''
2002622d64ffSPaolo Bonzini  config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '')
2003622d64ffSPaolo Bonzinielse
2004622d64ffSPaolo Bonzini  config_host_data.set('CONFIG_BDRV_RW_WHITELIST',
2005622d64ffSPaolo Bonzini        '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ')
2006622d64ffSPaolo Bonziniendif
2007622d64ffSPaolo Bonzini
20089c29b741SPaolo Bonziniforeach k : get_option('trace_backends')
20099c29b741SPaolo Bonzini  config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
20109c29b741SPaolo Bonziniendforeach
20119c29b741SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
201241f2ae28SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority'))
201340c909f5SPaolo Bonziniif iasl.found()
201440c909f5SPaolo Bonzini  config_host_data.set_quoted('CONFIG_IASL', iasl.full_path())
20155dc4618eSPaolo Bonziniendif
201616bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
201716bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
201816bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
201916bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
202016bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
20218154f5e6SAkihiko Odaki
20228154f5e6SAkihiko Odakiqemu_firmwarepath = ''
20238154f5e6SAkihiko Odakiforeach k : get_option('qemu_firmwarepath')
20248154f5e6SAkihiko Odaki  qemu_firmwarepath += '"' + get_option('prefix') / k + '", '
20258154f5e6SAkihiko Odakiendforeach
20268154f5e6SAkihiko Odakiconfig_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath)
20278154f5e6SAkihiko Odaki
202816bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
202916bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
203016bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
203116bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
203216bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
203316bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
203416bf7a33SPaolo Bonzini
20356002711cSPaolo Bonziniif enable_modules
2036b0b4323eSPaolo Bonzini  config_host_data.set('CONFIG_STAMP', run_command(
2037b0b4323eSPaolo Bonzini      meson.current_source_dir() / 'scripts/qemu-stamp.py',
2038b0b4323eSPaolo Bonzini      meson.project_version(), get_option('pkgversion'), '--',
2039b0b4323eSPaolo Bonzini      meson.current_source_dir() / 'configure',
2040b0b4323eSPaolo Bonzini      capture: true, check: true).stdout().strip())
2041b0b4323eSPaolo Bonziniendif
2042b0b4323eSPaolo Bonzini
204335acbb30SPaolo Bonzinihave_slirp_smbd = get_option('slirp_smbd') \
204435acbb30SPaolo Bonzini  .require(targetos != 'windows', error_message: 'Host smbd not supported on this platform.') \
204535acbb30SPaolo Bonzini  .allowed()
204635acbb30SPaolo Bonziniif have_slirp_smbd
204735acbb30SPaolo Bonzini  smbd_path = get_option('smbd')
204835acbb30SPaolo Bonzini  if smbd_path == ''
204935acbb30SPaolo Bonzini    smbd_path = (targetos == 'solaris' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd')
205035acbb30SPaolo Bonzini  endif
205135acbb30SPaolo Bonzini  config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path)
205235acbb30SPaolo Bonziniendif
205335acbb30SPaolo Bonzini
2054823eb013SPaolo Bonziniconfig_host_data.set('HOST_' + host_arch.to_upper(), 1)
2055823eb013SPaolo Bonzini
20562cb2f580SPaolo Bonziniif get_option('module_upgrades') and not enable_modules
20572cb2f580SPaolo Bonzini  error('Cannot enable module-upgrades as modules are not enabled')
20582cb2f580SPaolo Bonziniendif
20592cb2f580SPaolo Bonziniconfig_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades'))
20602cb2f580SPaolo Bonzini
2061f7f2d651SPaolo Bonziniconfig_host_data.set('CONFIG_ATTR', libattr.found())
2062c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools'))
20638c6d4ff4SPaolo Bonziniconfig_host_data.set('CONFIG_BRLAPI', brlapi.found())
2064b4e312e9SPaolo Bonziniconfig_host_data.set('CONFIG_COCOA', cocoa.found())
2065537b7248SPaolo Bonziniconfig_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
2066af2bb99bSPaolo Bonziniconfig_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
2067f01496a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBUDEV', libudev.found())
20680c32a0aeSPaolo Bonziniconfig_host_data.set('CONFIG_LZO', lzo.found())
20696ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH', mpathpersist.found())
20706ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
2071fd66dbd4SStefan Hajnocziconfig_host_data.set('CONFIG_BLKIO', blkio.found())
2072f9cd86feSPaolo Bonziniconfig_host_data.set('CONFIG_CURL', curl.found())
20735285e593SYonggang Luoconfig_host_data.set('CONFIG_CURSES', curses.found())
20748bc5184dSThomas Huthconfig_host_data.set('CONFIG_GBM', gbm.found())
20757544060eSPaolo Bonziniconfig_host_data.set('CONFIG_GIO', gio.found())
207608821ca2SPaolo Bonziniconfig_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
207708821ca2SPaolo Bonziniif glusterfs.found()
207808821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
207908821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
208008821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
208108821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
208208821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
208308821ca2SPaolo Bonzini  config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
208408821ca2SPaolo Bonziniendif
20851b695471SPaolo Bonziniconfig_host_data.set('CONFIG_GTK', gtk.found())
2086c23d7b4eSPaolo Bonziniconfig_host_data.set('CONFIG_VTE', vte.found())
208729e0bfffSClaudio Fontanaconfig_host_data.set('CONFIG_GTK_CLIPBOARD', have_gtk_clipboard)
2088f7f2d651SPaolo Bonziniconfig_host_data.set('CONFIG_LIBATTR', have_old_libattr)
2089727c8bb8SPaolo Bonziniconfig_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
209046627f41SAndrew Melnychenkoconfig_host_data.set('CONFIG_EBPF', libbpf.found())
209163a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
20929db405a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
209330045c05SPaolo Bonziniconfig_host_data.set('CONFIG_LIBNFS', libnfs.found())
2094e6a52b36SThomas Huthconfig_host_data.set('CONFIG_LIBSSH', libssh.found())
2095ff66f3e5SPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_AIO', libaio.found())
209663a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
209763a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LIBPMEM', libpmem.found())
20986002711cSPaolo Bonziniconfig_host_data.set('CONFIG_MODULES', enable_modules)
2099488a8c73SPaolo Bonziniconfig_host_data.set('CONFIG_NUMA', numa.found())
21006bb613f0SMichal Privoznikif numa.found()
21016bb613f0SMichal Privoznik  config_host_data.set('HAVE_NUMA_HAS_PREFERRED_MANY',
21026bb613f0SMichal Privoznik                       cc.has_function('numa_has_preferred_many',
21036bb613f0SMichal Privoznik                                       dependencies: numa))
21046bb613f0SMichal Privoznikendif
210588b6e618SPaolo Bonziniconfig_host_data.set('CONFIG_OPENGL', opengl.found())
2106c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_PROFILER', get_option('profiler'))
2107fabd1e93SPaolo Bonziniconfig_host_data.set('CONFIG_RBD', rbd.found())
21083730a734SPaolo Bonziniconfig_host_data.set('CONFIG_RDMA', rdma.found())
2109721fa5e5SPaolo Bonziniconfig_host_data.set('CONFIG_SAFESTACK', get_option('safe_stack'))
211035be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL', sdl.found())
211135be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
211290835c2bSPaolo Bonziniconfig_host_data.set('CONFIG_SECCOMP', seccomp.found())
211373422d95SMichal Privoznikif seccomp.found()
211473422d95SMichal Privoznik  config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc)
211573422d95SMichal Privoznikendif
2116241611eaSPaolo Bonziniconfig_host_data.set('CONFIG_SNAPPY', snappy.found())
21170d04c4c9SPaolo Bonziniconfig_host_data.set('CONFIG_TPM', have_tpm)
211834f983d8SPaolo Bonziniconfig_host_data.set('CONFIG_TSAN', get_option('tsan'))
211990540f32SPaolo Bonziniconfig_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
2120e1723999SPaolo Bonziniconfig_host_data.set('CONFIG_VDE', vde.found())
21212df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET', have_vhost_net)
21222df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user)
21232df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa)
21242df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel)
21252df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_USER', have_vhost_user)
21262df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto)
21272df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa)
2128e2c1d78dSVladislav Yaroshchukconfig_host_data.set('CONFIG_VMNET', vmnet.found())
2129e5e856c1SStefan Hajnocziconfig_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
21302a2359b8SXie Yongjiconfig_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export)
213195f8510eSKshitij Suriconfig_host_data.set('CONFIG_PNG', png.found())
2132a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC', vnc.found())
2133a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
2134a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_SASL', sasl.found())
213569202b40SPaolo Bonziniconfig_host_data.set('CONFIG_VIRTFS', have_virtfs)
213663a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_VTE', vte.found())
21374113f4cfSLaurent Vivierconfig_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
2138af04e89dSMarc-André Lureauconfig_host_data.set('CONFIG_KEYUTILS', keyutils.found())
21393909def8SMarc-André Lureauconfig_host_data.set('CONFIG_GETTID', has_gettid)
214057612511SPaolo Bonziniconfig_host_data.set('CONFIG_GNUTLS', gnutls.found())
2141cc4c7c73SDaniel P. Berrangéconfig_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
2142d47b83b1SDaniel P. Berrangéconfig_host_data.set('CONFIG_TASN1', tasn1.found())
214357612511SPaolo Bonziniconfig_host_data.set('CONFIG_GCRYPT', gcrypt.found())
214457612511SPaolo Bonziniconfig_host_data.set('CONFIG_NETTLE', nettle.found())
21454c5e512eSLei Heconfig_host_data.set('CONFIG_HOGWEED', hogweed.found())
214657612511SPaolo Bonziniconfig_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
2147aa087962SPaolo Bonziniconfig_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
214884e319a5SMax Reitzconfig_host_data.set('CONFIG_STATX', has_statx)
21494ce7a08dSHanna Reitzconfig_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id)
2150b1def33dSPaolo Bonziniconfig_host_data.set('CONFIG_ZSTD', zstd.found())
2151a484a719SMax Reitzconfig_host_data.set('CONFIG_FUSE', fuse.found())
2152df4ea709SMax Reitzconfig_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
21533f0a5d55SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
2154ddece465SMarc-André Lureauif spice_protocol.found()
2155ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0])
2156ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1])
2157ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2])
2158ddece465SMarc-André Lureauendif
21593f0a5d55SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE', spice.found())
21609d71037fSPaolo Bonziniconfig_host_data.set('CONFIG_X11', x11.found())
2161142ca628SMarc-André Lureauconfig_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display)
21629e62ba48SDaniele Buonoconfig_host_data.set('CONFIG_CFI', get_option('cfi'))
21633d212b41SRichard W.M. Jonesconfig_host_data.set('CONFIG_SELINUX', selinux.found())
216414efd8d3SPaolo Bonziniconfig_host_data.set('CONFIG_XEN_BACKEND', xen.found())
21657c10cb38SIlya Leoshkevichconfig_host_data.set('CONFIG_LIBDW', libdw.found())
216614efd8d3SPaolo Bonziniif xen.found()
216714efd8d3SPaolo Bonzini  # protect from xen.version() having less than three components
216814efd8d3SPaolo Bonzini  xen_version = xen.version().split('.') + ['0', '0']
216914efd8d3SPaolo Bonzini  xen_ctrl_version = xen_version[0] + \
217014efd8d3SPaolo Bonzini    ('0' + xen_version[1]).substring(-2) + \
217114efd8d3SPaolo Bonzini    ('0' + xen_version[2]).substring(-2)
217214efd8d3SPaolo Bonzini  config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version)
217314efd8d3SPaolo Bonziniendif
2174859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
2175859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
2176859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
2177859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
2178859aef02SPaolo Bonzini
2179a6305081SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
218069d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
218169d8de7aSPaolo Bonzini
2182728c0a2fSPaolo Bonzinihave_coroutine_pool = get_option('coroutine_pool')
2183728c0a2fSPaolo Bonziniif get_option('debug_stack_usage') and have_coroutine_pool
2184728c0a2fSPaolo Bonzini  message('Disabling coroutine pool to measure stack usage')
2185728c0a2fSPaolo Bonzini  have_coroutine_pool = false
2186728c0a2fSPaolo Bonziniendif
2187728c0a2fSPaolo Bonziniconfig_host_data.set10('CONFIG_COROUTINE_POOL', have_coroutine_pool)
218858a2e3f5SStefan Hajnocziconfig_host_data.set('CONFIG_DEBUG_GRAPH_LOCK', get_option('debug_graph_lock'))
2189c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex'))
2190728c0a2fSPaolo Bonziniconfig_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage'))
2191c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_GPROF', get_option('gprof'))
2192406523f6SPaolo Bonziniconfig_host_data.set('CONFIG_LIVE_BLOCK_MIGRATION', get_option('live_block_migration').allowed())
2193c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug'))
2194abad185cSJuan Quintelaconfig_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed())
2195406523f6SPaolo Bonzini
219669d8de7aSPaolo Bonzini# has_header
2197e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
2198d47a8b3bSPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
2199d47a8b3bSPaolo Bonziniconfig_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
220048f670ecSThomas Huthconfig_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
22012964be52SThomas Huthconfig_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
22022802d91dSThomas Huthconfig_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
220369d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
2204ded5d78cSThomas Huthconfig_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
22054a9d5f89SThomas Huthconfig_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
2206d409373bSBin Mengif targetos == 'windows'
2207d409373bSBin Meng  config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h'))
2208d409373bSBin Mengendif
2209ded5d78cSThomas Huth
221069d8de7aSPaolo Bonzini# has_function
2211c891c24bSClaudio Imbrendaconfig_host_data.set('CONFIG_CLOSE_RANGE', cc.has_function('close_range'))
2212a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
2213e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
2214e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
2215e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
2216e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
22178698343bSPeter Maydell# Note that we need to specify prefix: here to avoid incorrectly
22188698343bSPeter Maydell# thinking that Windows has posix_memalign()
22198698343bSPeter Maydellconfig_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>'))
22205c8c714aSPeter Maydellconfig_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc'))
222188454f84SPeter Maydellconfig_host_data.set('CONFIG_VALLOC', cc.has_function('valloc'))
222288454f84SPeter Maydellconfig_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign'))
2223e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
22242b9f74efSPeter Maydellconfig_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
2225029ed1bdSKeno Fischerconfig_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np'))
2226e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
2227e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
2228e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
2229e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
2230e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
2231be7e89f6SPaolo Bonziniconfig_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
223259e35c7bSAndrew Deasonconfig_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
2233fc9a809eSPaolo Bonziniconfig_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice)
2234e66420acSPaolo Bonziniconfig_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
2235ed3b3f17SPaolo Bonziniconfig_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
223669d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
223766dc5f96SStefano Garzarellaif rbd.found()
223866dc5f96SStefano Garzarella  config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS',
223966dc5f96SStefano Garzarella                       cc.has_function('rbd_namespace_exists',
224066dc5f96SStefano Garzarella                                       dependencies: rbd,
224166dc5f96SStefano Garzarella                                       prefix: '#include <rbd/librbd.h>'))
224266dc5f96SStefano Garzarellaendif
2243911965acSLi Zhijianif rdma.found()
2244911965acSLi Zhijian  config_host_data.set('HAVE_IBV_ADVISE_MR',
2245911965acSLi Zhijian                       cc.has_function('ibv_advise_mr',
22463730a734SPaolo Bonzini                                       dependencies: rdma,
2247911965acSLi Zhijian                                       prefix: '#include <infiniband/verbs.h>'))
2248911965acSLi Zhijianendif
22492b9f74efSPeter Maydell
225034f983d8SPaolo Bonzinihave_asan_fiber = false
225134f983d8SPaolo Bonziniif get_option('sanitizers') and \
225234f983d8SPaolo Bonzini   not cc.has_function('__sanitizer_start_switch_fiber',
225334f983d8SPaolo Bonzini                         args: '-fsanitize=address',
225434f983d8SPaolo Bonzini                         prefix: '#include <sanitizer/asan_interface.h>')
225534f983d8SPaolo Bonzini  warning('Missing ASAN due to missing fiber annotation interface')
225634f983d8SPaolo Bonzini  warning('Without code annotation, the report may be inferior.')
225734f983d8SPaolo Bonzinielse
225834f983d8SPaolo Bonzini  have_asan_fiber = true
225934f983d8SPaolo Bonziniendif
226034f983d8SPaolo Bonziniconfig_host_data.set('CONFIG_ASAN_IFACE_FIBER', have_asan_fiber)
226134f983d8SPaolo Bonzini
2262e66420acSPaolo Bonzini# has_header_symbol
22636d43eaa3SSam Liconfig_host_data.set('CONFIG_BLKZONED',
22646d43eaa3SSam Li                     cc.has_header_symbol('linux/blkzoned.h', 'BLKOPENZONE'))
2265e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_EPOLL_CREATE1',
2266e66420acSPaolo Bonzini                     cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
2267e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
2268e66420acSPaolo Bonzini                     cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
2269e66420acSPaolo Bonzini                     cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
2270e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
2271e66420acSPaolo Bonzini                     cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
2272e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FIEMAP',
2273e66420acSPaolo Bonzini                     cc.has_header('linux/fiemap.h') and
2274e66420acSPaolo Bonzini                     cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
2275be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_GETRANDOM',
2276be7e89f6SPaolo Bonzini                     cc.has_function('getrandom') and
2277be7e89f6SPaolo Bonzini                     cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
2278a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_INOTIFY',
2279a620fbe9SPaolo Bonzini                     cc.has_header_symbol('sys/inotify.h', 'inotify_init'))
2280a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_INOTIFY1',
2281a620fbe9SPaolo Bonzini                     cc.has_header_symbol('sys/inotify.h', 'inotify_init1'))
2282e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
2283e66420acSPaolo Bonzini                     cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
2284be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_RTNETLINK',
2285be7e89f6SPaolo Bonzini                     cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
2286be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_SYSMACROS',
2287be7e89f6SPaolo Bonzini                     cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
2288e1fbd2c4SPaolo Bonziniconfig_host_data.set('HAVE_OPTRESET',
2289e1fbd2c4SPaolo Bonzini                     cc.has_header_symbol('getopt.h', 'optreset'))
2290653163fcSMarc-André Lureauconfig_host_data.set('HAVE_IPPROTO_MPTCP',
2291653163fcSMarc-André Lureau                     cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
2292e66420acSPaolo Bonzini
2293e66420acSPaolo Bonzini# has_member
2294e66420acSPaolo Bonziniconfig_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
2295e66420acSPaolo Bonzini                     cc.has_member('struct sigevent', 'sigev_notify_thread_id',
2296e66420acSPaolo Bonzini                                   prefix: '#include <signal.h>'))
2297ed3b3f17SPaolo Bonziniconfig_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
2298ed3b3f17SPaolo Bonzini                     cc.has_member('struct stat', 'st_atim',
2299ed3b3f17SPaolo Bonzini                                   prefix: '#include <sys/stat.h>'))
23006d43eaa3SSam Liconfig_host_data.set('HAVE_BLK_ZONE_REP_CAPACITY',
23016d43eaa3SSam Li                     cc.has_member('struct blk_zone', 'capacity',
23026d43eaa3SSam Li                                   prefix: '#include <linux/blkzoned.h>'))
2303e66420acSPaolo Bonzini
23046a23f819SPaolo Bonzini# has_type
23056a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_IOVEC',
23066a23f819SPaolo Bonzini                     cc.has_type('struct iovec',
23076a23f819SPaolo Bonzini                                 prefix: '#include <sys/uio.h>'))
23086a23f819SPaolo Bonziniconfig_host_data.set('HAVE_UTMPX',
23096a23f819SPaolo Bonzini                     cc.has_type('struct utmpx',
23106a23f819SPaolo Bonzini                                 prefix: '#include <utmpx.h>'))
23116a23f819SPaolo Bonzini
2312904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_EVENTFD', cc.links('''
2313e1fbd2c4SPaolo Bonzini  #include <sys/eventfd.h>
2314e1fbd2c4SPaolo Bonzini  int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
2315904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
2316e1fbd2c4SPaolo Bonzini  #include <unistd.h>
2317e1fbd2c4SPaolo Bonzini  int main(void) {
2318e1fbd2c4SPaolo Bonzini  #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
2319e1fbd2c4SPaolo Bonzini  return fdatasync(0);
2320e1fbd2c4SPaolo Bonzini  #else
2321e1fbd2c4SPaolo Bonzini  #error Not supported
2322e1fbd2c4SPaolo Bonzini  #endif
2323e1fbd2c4SPaolo Bonzini  }'''))
23248900c204SAndrew Deason
23258900c204SAndrew Deasonhas_madvise = cc.links(gnu_source_prefix + '''
2326e1fbd2c4SPaolo Bonzini  #include <sys/types.h>
2327e1fbd2c4SPaolo Bonzini  #include <sys/mman.h>
2328e1fbd2c4SPaolo Bonzini  #include <stddef.h>
23298900c204SAndrew Deason  int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')
23308900c204SAndrew Deasonmissing_madvise_proto = false
23318900c204SAndrew Deasonif has_madvise
23328900c204SAndrew Deason  # Some platforms (illumos and Solaris before Solaris 11) provide madvise()
23338900c204SAndrew Deason  # but forget to prototype it. In this case, has_madvise will be true (the
23348900c204SAndrew Deason  # test program links despite a compile warning). To detect the
23358900c204SAndrew Deason  # missing-prototype case, we try again with a definitely-bogus prototype.
23368900c204SAndrew Deason  # This will only compile if the system headers don't provide the prototype;
23378900c204SAndrew Deason  # otherwise the conflicting prototypes will cause a compiler error.
23388900c204SAndrew Deason  missing_madvise_proto = cc.links(gnu_source_prefix + '''
23398900c204SAndrew Deason    #include <sys/types.h>
23408900c204SAndrew Deason    #include <sys/mman.h>
23418900c204SAndrew Deason    #include <stddef.h>
23428900c204SAndrew Deason    extern int madvise(int);
23438900c204SAndrew Deason    int main(void) { return madvise(0); }''')
23448900c204SAndrew Deasonendif
23458900c204SAndrew Deasonconfig_host_data.set('CONFIG_MADVISE', has_madvise)
23468900c204SAndrew Deasonconfig_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto)
23478900c204SAndrew Deason
2348904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
2349e1fbd2c4SPaolo Bonzini  #include <sys/mman.h>
2350e1fbd2c4SPaolo Bonzini  int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
2351904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
2352d47a8b3bSPaolo Bonzini  #include <fcntl.h>
2353d47a8b3bSPaolo Bonzini  #if !defined(AT_EMPTY_PATH)
2354d47a8b3bSPaolo Bonzini  # error missing definition
2355d47a8b3bSPaolo Bonzini  #else
2356d47a8b3bSPaolo Bonzini  int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
2357d47a8b3bSPaolo Bonzini  #endif'''))
2358904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
2359e1fbd2c4SPaolo Bonzini  #include <sys/mman.h>
2360e1fbd2c4SPaolo Bonzini  #include <stddef.h>
2361e1fbd2c4SPaolo Bonzini  int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
236210f6b231SPaolo Bonzini
23636a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + '''
236410f6b231SPaolo Bonzini  #include <pthread.h>
236510f6b231SPaolo Bonzini
236610f6b231SPaolo Bonzini  static void *f(void *p) { return NULL; }
236710f6b231SPaolo Bonzini  int main(void)
236810f6b231SPaolo Bonzini  {
236910f6b231SPaolo Bonzini    pthread_t thread;
237010f6b231SPaolo Bonzini    pthread_create(&thread, 0, f, 0);
237110f6b231SPaolo Bonzini    pthread_setname_np(thread, "QEMU");
237210f6b231SPaolo Bonzini    return 0;
237310f6b231SPaolo Bonzini  }''', dependencies: threads))
23746a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + '''
237510f6b231SPaolo Bonzini  #include <pthread.h>
237610f6b231SPaolo Bonzini
237710f6b231SPaolo Bonzini  static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
237810f6b231SPaolo Bonzini  int main(void)
237910f6b231SPaolo Bonzini  {
238010f6b231SPaolo Bonzini    pthread_t thread;
238110f6b231SPaolo Bonzini    pthread_create(&thread, 0, f, 0);
238210f6b231SPaolo Bonzini    return 0;
238310f6b231SPaolo Bonzini  }''', dependencies: threads))
23843ada67a3SBrad Smithconfig_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(gnu_source_prefix + '''
23853ada67a3SBrad Smith  #include <pthread.h>
23863ada67a3SBrad Smith  #include <pthread_np.h>
23873ada67a3SBrad Smith
23883ada67a3SBrad Smith  static void *f(void *p) { return NULL; }
23893ada67a3SBrad Smith  int main(void)
23903ada67a3SBrad Smith  {
23913ada67a3SBrad Smith    pthread_t thread;
23923ada67a3SBrad Smith    pthread_create(&thread, 0, f, 0);
23933ada67a3SBrad Smith    pthread_set_name_np(thread, "QEMU");
23943ada67a3SBrad Smith    return 0;
23953ada67a3SBrad Smith  }''', dependencies: threads))
2396657ac98bSLongpeng(Mike)config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + '''
2397657ac98bSLongpeng(Mike)  #include <pthread.h>
2398657ac98bSLongpeng(Mike)  #include <time.h>
2399657ac98bSLongpeng(Mike)
2400657ac98bSLongpeng(Mike)  int main(void)
2401657ac98bSLongpeng(Mike)  {
2402657ac98bSLongpeng(Mike)    pthread_condattr_t attr
2403657ac98bSLongpeng(Mike)    pthread_condattr_init(&attr);
2404657ac98bSLongpeng(Mike)    pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
2405657ac98bSLongpeng(Mike)    return 0;
2406657ac98bSLongpeng(Mike)  }''', dependencies: threads))
24077730f32cSDavid Hildenbrandconfig_host_data.set('CONFIG_PTHREAD_AFFINITY_NP', cc.links(gnu_source_prefix + '''
24087730f32cSDavid Hildenbrand  #include <pthread.h>
240910f6b231SPaolo Bonzini
24107730f32cSDavid Hildenbrand  static void *f(void *p) { return NULL; }
24117730f32cSDavid Hildenbrand  int main(void)
24127730f32cSDavid Hildenbrand  {
24137730f32cSDavid Hildenbrand    int setsize = CPU_ALLOC_SIZE(64);
24147730f32cSDavid Hildenbrand    pthread_t thread;
24157730f32cSDavid Hildenbrand    cpu_set_t *cpuset;
24167730f32cSDavid Hildenbrand    pthread_create(&thread, 0, f, 0);
24177730f32cSDavid Hildenbrand    cpuset = CPU_ALLOC(64);
24187730f32cSDavid Hildenbrand    CPU_ZERO_S(setsize, cpuset);
24197730f32cSDavid Hildenbrand    pthread_setaffinity_np(thread, setsize, cpuset);
24207730f32cSDavid Hildenbrand    pthread_getaffinity_np(thread, setsize, cpuset);
24217730f32cSDavid Hildenbrand    CPU_FREE(cpuset);
24227730f32cSDavid Hildenbrand    return 0;
24237730f32cSDavid Hildenbrand  }''', dependencies: threads))
2424904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
24256bd17dccSKacper Słomiński  #include <sys/signalfd.h>
24266bd17dccSKacper Słomiński  #include <stddef.h>
24276bd17dccSKacper Słomiński  int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
2428904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
2429a620fbe9SPaolo Bonzini  #include <unistd.h>
2430a620fbe9SPaolo Bonzini  #include <fcntl.h>
2431a620fbe9SPaolo Bonzini  #include <limits.h>
2432a620fbe9SPaolo Bonzini
2433a620fbe9SPaolo Bonzini  int main(void)
2434a620fbe9SPaolo Bonzini  {
2435a620fbe9SPaolo Bonzini    int len, fd = 0;
2436a620fbe9SPaolo Bonzini    len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
2437a620fbe9SPaolo Bonzini    splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
2438a620fbe9SPaolo Bonzini    return 0;
2439a620fbe9SPaolo Bonzini  }'''))
2440e1fbd2c4SPaolo Bonzini
244196a63aebSPaolo Bonziniconfig_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
244296a63aebSPaolo Bonzini  #include <sys/mman.h>
2443b5d3dac1SPaolo Bonzini  int main(void) {
244496a63aebSPaolo Bonzini    return mlockall(MCL_FUTURE);
244596a63aebSPaolo Bonzini  }'''))
244696a63aebSPaolo Bonzini
2447eea9453aSThomas Huthhave_l2tpv3 = false
244843a363aeSPaolo Bonziniif get_option('l2tpv3').allowed() and have_system
24496a23f819SPaolo Bonzini  have_l2tpv3 = cc.has_type('struct mmsghdr',
24506a23f819SPaolo Bonzini    prefix: gnu_source_prefix + '''
24516a23f819SPaolo Bonzini      #include <sys/socket.h>
24526a23f819SPaolo Bonzini      #include <linux/ip.h>''')
2453eea9453aSThomas Huthendif
2454eea9453aSThomas Huthconfig_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
2455eea9453aSThomas Huth
2456837b84b1SPaolo Bonzinihave_netmap = false
245743a363aeSPaolo Bonziniif get_option('netmap').allowed() and have_system
2458837b84b1SPaolo Bonzini  have_netmap = cc.compiles('''
2459837b84b1SPaolo Bonzini    #include <inttypes.h>
2460837b84b1SPaolo Bonzini    #include <net/if.h>
2461837b84b1SPaolo Bonzini    #include <net/netmap.h>
2462837b84b1SPaolo Bonzini    #include <net/netmap_user.h>
2463837b84b1SPaolo Bonzini    #if (NETMAP_API < 11) || (NETMAP_API > 15)
2464837b84b1SPaolo Bonzini    #error
2465837b84b1SPaolo Bonzini    #endif
2466837b84b1SPaolo Bonzini    int main(void) { return 0; }''')
2467837b84b1SPaolo Bonzini  if not have_netmap and get_option('netmap').enabled()
2468837b84b1SPaolo Bonzini    error('Netmap headers not available')
2469837b84b1SPaolo Bonzini  endif
2470837b84b1SPaolo Bonziniendif
2471837b84b1SPaolo Bonziniconfig_host_data.set('CONFIG_NETMAP', have_netmap)
2472837b84b1SPaolo Bonzini
247396a63aebSPaolo Bonzini# Work around a system header bug with some kernel/XFS header
247496a63aebSPaolo Bonzini# versions where they both try to define 'struct fsxattr':
247596a63aebSPaolo Bonzini# xfs headers will not try to redefine structs from linux headers
247696a63aebSPaolo Bonzini# if this macro is set.
247796a63aebSPaolo Bonziniconfig_host_data.set('HAVE_FSXATTR', cc.links('''
24786a23f819SPaolo Bonzini  #include <linux/fs.h>
247996a63aebSPaolo Bonzini  struct fsxattr foo;
248096a63aebSPaolo Bonzini  int main(void) {
248196a63aebSPaolo Bonzini    return 0;
248296a63aebSPaolo Bonzini  }'''))
248396a63aebSPaolo Bonzini
2484e46bd55dSPaolo Bonzini# Some versions of Mac OS X incorrectly define SIZE_MAX
2485e46bd55dSPaolo Bonziniconfig_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
2486e46bd55dSPaolo Bonzini    #include <stdint.h>
2487e46bd55dSPaolo Bonzini    #include <stdio.h>
2488b5d3dac1SPaolo Bonzini    int main(void) {
2489e46bd55dSPaolo Bonzini        return printf("%zu", SIZE_MAX);
2490e46bd55dSPaolo Bonzini    }''', args: ['-Werror']))
2491e46bd55dSPaolo Bonzini
2492e61f1efeSRichard Henderson# See if 64-bit atomic operations are supported.
2493e61f1efeSRichard Henderson# Note that without __atomic builtins, we can only
2494e61f1efeSRichard Henderson# assume atomic loads/stores max at pointer size.
2495e61f1efeSRichard Hendersonconfig_host_data.set('CONFIG_ATOMIC64', cc.links('''
2496bd87a367SPaolo Bonzini  #include <stdint.h>
2497bd87a367SPaolo Bonzini  int main(void)
2498bd87a367SPaolo Bonzini  {
2499e61f1efeSRichard Henderson    uint64_t x = 0, y = 0;
2500bd87a367SPaolo Bonzini    y = __atomic_load_n(&x, __ATOMIC_RELAXED);
2501bd87a367SPaolo Bonzini    __atomic_store_n(&x, y, __ATOMIC_RELAXED);
2502bd87a367SPaolo Bonzini    __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2503bd87a367SPaolo Bonzini    __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
2504bd87a367SPaolo Bonzini    __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
2505bd87a367SPaolo Bonzini    return 0;
2506e61f1efeSRichard Henderson  }'''))
2507bd87a367SPaolo Bonzini
2508848126d1SMarc-André Lureauhas_int128 = cc.links('''
2509848126d1SMarc-André Lureau  __int128_t a;
2510848126d1SMarc-André Lureau  __uint128_t b;
2511848126d1SMarc-André Lureau  int main (void) {
2512848126d1SMarc-André Lureau    a = a + b;
2513848126d1SMarc-André Lureau    b = a * b;
2514848126d1SMarc-André Lureau    a = a * a;
2515848126d1SMarc-André Lureau    return 0;
2516848126d1SMarc-André Lureau  }''')
2517848126d1SMarc-André Lureau
2518848126d1SMarc-André Lureauconfig_host_data.set('CONFIG_INT128', has_int128)
2519848126d1SMarc-André Lureau
2520848126d1SMarc-André Lureauif has_int128
2521d2958fb0SMarc-André Lureau  # "do we have 128-bit atomics which are handled inline and specifically not
2522d2958fb0SMarc-André Lureau  # via libatomic". The reason we can't use libatomic is documented in the
2523d2958fb0SMarc-André Lureau  # comment starting "GCC is a house divided" in include/qemu/atomic128.h.
2524e61f1efeSRichard Henderson  # We only care about these operations on 16-byte aligned pointers, so
2525e61f1efeSRichard Henderson  # force 16-byte alignment of the pointer, which may be greater than
2526e61f1efeSRichard Henderson  # __alignof(unsigned __int128) for the host.
2527e61f1efeSRichard Henderson  atomic_test_128 = '''
2528e61f1efeSRichard Henderson    int main(int ac, char **av) {
2529e61f1efeSRichard Henderson      unsigned __int128 *p = __builtin_assume_aligned(av[ac - 1], sizeof(16));
2530e61f1efeSRichard Henderson      p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED);
2531e61f1efeSRichard Henderson      __atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED);
2532e61f1efeSRichard Henderson      __atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2533e61f1efeSRichard Henderson      return 0;
2534e61f1efeSRichard Henderson    }'''
2535e61f1efeSRichard Henderson  has_atomic128 = cc.links(atomic_test_128)
2536848126d1SMarc-André Lureau
2537848126d1SMarc-André Lureau  config_host_data.set('CONFIG_ATOMIC128', has_atomic128)
2538848126d1SMarc-André Lureau
2539848126d1SMarc-André Lureau  if not has_atomic128
2540e61f1efeSRichard Henderson    # Even with __builtin_assume_aligned, the above test may have failed
2541e61f1efeSRichard Henderson    # without optimization enabled.  Try again with optimizations locally
2542e61f1efeSRichard Henderson    # enabled for the function.  See
2543e61f1efeSRichard Henderson    #   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107389
2544e61f1efeSRichard Henderson    has_atomic128_opt = cc.links('__attribute__((optimize("O1")))' + atomic_test_128)
2545e61f1efeSRichard Henderson    config_host_data.set('CONFIG_ATOMIC128_OPT', has_atomic128_opt)
2546e61f1efeSRichard Henderson
2547e61f1efeSRichard Henderson    if not has_atomic128_opt
2548e61f1efeSRichard Henderson      config_host_data.set('CONFIG_CMPXCHG128', cc.links('''
2549848126d1SMarc-André Lureau        int main(void)
2550848126d1SMarc-André Lureau        {
2551848126d1SMarc-André Lureau          unsigned __int128 x = 0, y = 0;
2552848126d1SMarc-André Lureau          __sync_val_compare_and_swap_16(&x, y, x);
2553848126d1SMarc-André Lureau          return 0;
2554848126d1SMarc-André Lureau        }
2555e61f1efeSRichard Henderson      '''))
2556e61f1efeSRichard Henderson    endif
2557848126d1SMarc-André Lureau  endif
2558848126d1SMarc-André Lureauendif
2559bd87a367SPaolo Bonzini
2560bd87a367SPaolo Bonziniconfig_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
2561bd87a367SPaolo Bonzini  #include <sys/auxv.h>
2562bd87a367SPaolo Bonzini  int main(void) {
2563bd87a367SPaolo Bonzini    return getauxval(AT_HWCAP) == 0;
2564bd87a367SPaolo Bonzini  }'''))
2565bd87a367SPaolo Bonzini
25660dae95d4SPaolo Bonziniconfig_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles('''
25670dae95d4SPaolo Bonzini  #include <linux/usbdevice_fs.h>
25680dae95d4SPaolo Bonzini
25690dae95d4SPaolo Bonzini  #ifndef USBDEVFS_GET_CAPABILITIES
25700dae95d4SPaolo Bonzini  #error "USBDEVFS_GET_CAPABILITIES undefined"
25710dae95d4SPaolo Bonzini  #endif
25720dae95d4SPaolo Bonzini
25730dae95d4SPaolo Bonzini  #ifndef USBDEVFS_DISCONNECT_CLAIM
25740dae95d4SPaolo Bonzini  #error "USBDEVFS_DISCONNECT_CLAIM undefined"
25750dae95d4SPaolo Bonzini  #endif
25760dae95d4SPaolo Bonzini
25770dae95d4SPaolo Bonzini  int main(void) { return 0; }'''))
25780dae95d4SPaolo Bonzini
25792edd2c04SPaolo Bonzinihave_keyring = get_option('keyring') \
25802edd2c04SPaolo Bonzini  .require(targetos == 'linux', error_message: 'keyring is only available on Linux') \
25812edd2c04SPaolo Bonzini  .require(cc.compiles('''
25822edd2c04SPaolo Bonzini    #include <errno.h>
25832edd2c04SPaolo Bonzini    #include <asm/unistd.h>
25842edd2c04SPaolo Bonzini    #include <linux/keyctl.h>
25852edd2c04SPaolo Bonzini    #include <sys/syscall.h>
25862edd2c04SPaolo Bonzini    #include <unistd.h>
25872edd2c04SPaolo Bonzini    int main(void) {
25882edd2c04SPaolo Bonzini        return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
25892edd2c04SPaolo Bonzini    }'''), error_message: 'keyctl syscall not available on this system').allowed()
25902edd2c04SPaolo Bonziniconfig_host_data.set('CONFIG_SECRET_KEYRING', have_keyring)
25912edd2c04SPaolo Bonzini
2592622753d2SPaolo Bonzinihave_cpuid_h = cc.links('''
2593622753d2SPaolo Bonzini  #include <cpuid.h>
2594622753d2SPaolo Bonzini  int main(void) {
2595622753d2SPaolo Bonzini    unsigned a, b, c, d;
2596622753d2SPaolo Bonzini    unsigned max = __get_cpuid_max(0, 0);
2597622753d2SPaolo Bonzini
2598622753d2SPaolo Bonzini    if (max >= 1) {
2599622753d2SPaolo Bonzini        __cpuid(1, a, b, c, d);
2600622753d2SPaolo Bonzini    }
2601622753d2SPaolo Bonzini
2602622753d2SPaolo Bonzini    if (max >= 7) {
2603622753d2SPaolo Bonzini        __cpuid_count(7, 0, a, b, c, d);
2604622753d2SPaolo Bonzini    }
2605622753d2SPaolo Bonzini
2606622753d2SPaolo Bonzini    return 0;
2607622753d2SPaolo Bonzini  }''')
2608622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_CPUID_H', have_cpuid_h)
2609622753d2SPaolo Bonzini
2610622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \
2611622753d2SPaolo Bonzini  .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \
2612622753d2SPaolo Bonzini  .require(cc.links('''
2613622753d2SPaolo Bonzini    #include <cpuid.h>
2614622753d2SPaolo Bonzini    #include <immintrin.h>
2615701ea587SRichard Henderson    static int __attribute__((target("avx2"))) bar(void *a) {
2616622753d2SPaolo Bonzini      __m256i x = *(__m256i *)a;
2617622753d2SPaolo Bonzini      return _mm256_testz_si256(x, x);
2618622753d2SPaolo Bonzini    }
2619b5d3dac1SPaolo Bonzini    int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
2620622753d2SPaolo Bonzini  '''), error_message: 'AVX2 not available').allowed())
2621622753d2SPaolo Bonzini
2622622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_AVX512F_OPT', get_option('avx512f') \
2623622753d2SPaolo Bonzini  .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512F') \
2624622753d2SPaolo Bonzini  .require(cc.links('''
2625622753d2SPaolo Bonzini    #include <cpuid.h>
2626622753d2SPaolo Bonzini    #include <immintrin.h>
2627701ea587SRichard Henderson    static int __attribute__((target("avx512f"))) bar(void *a) {
2628622753d2SPaolo Bonzini      __m512i x = *(__m512i *)a;
2629622753d2SPaolo Bonzini      return _mm512_test_epi64_mask(x, x);
2630622753d2SPaolo Bonzini    }
2631b5d3dac1SPaolo Bonzini    int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
2632622753d2SPaolo Bonzini  '''), error_message: 'AVX512F not available').allowed())
2633622753d2SPaolo Bonzini
263404ffce13Sling xuconfig_host_data.set('CONFIG_AVX512BW_OPT', get_option('avx512bw') \
263504ffce13Sling xu  .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512BW') \
263604ffce13Sling xu  .require(cc.links('''
263704ffce13Sling xu    #include <cpuid.h>
263804ffce13Sling xu    #include <immintrin.h>
2639dc165fcdSRichard Henderson    static int __attribute__((target("avx512bw"))) bar(void *a) {
264004ffce13Sling xu      __m512i *x = a;
264104ffce13Sling xu      __m512i res= _mm512_abs_epi8(*x);
264204ffce13Sling xu      return res[1];
264304ffce13Sling xu    }
264404ffce13Sling xu    int main(int argc, char *argv[]) { return bar(argv[0]); }
264504ffce13Sling xu  '''), error_message: 'AVX512BW not available').allowed())
264604ffce13Sling xu
26473730a734SPaolo Bonzinihave_pvrdma = get_option('pvrdma') \
26483730a734SPaolo Bonzini  .require(rdma.found(), error_message: 'PVRDMA requires OpenFabrics libraries') \
2649354d2d9bSJuan Quintela  .require(cc.compiles(gnu_source_prefix + '''
2650354d2d9bSJuan Quintela    #include <sys/mman.h>
26513730a734SPaolo Bonzini    int main(void)
26523730a734SPaolo Bonzini    {
26533730a734SPaolo Bonzini      char buf = 0;
26543730a734SPaolo Bonzini      void *addr = &buf;
26553730a734SPaolo Bonzini      addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
26563730a734SPaolo Bonzini
26573730a734SPaolo Bonzini      return 0;
26583730a734SPaolo Bonzini    }'''), error_message: 'PVRDMA requires mremap').allowed()
26593730a734SPaolo Bonzini
26603730a734SPaolo Bonziniif have_pvrdma
2661354d2d9bSJuan Quintela  config_host_data.set('LEGACY_RDMA_REG_MR', not cc.links('''
26623730a734SPaolo Bonzini    #include <infiniband/verbs.h>
26633730a734SPaolo Bonzini    int main(void)
26643730a734SPaolo Bonzini    {
26653730a734SPaolo Bonzini      struct ibv_mr *mr;
26663730a734SPaolo Bonzini      struct ibv_pd *pd = NULL;
26673730a734SPaolo Bonzini      size_t length = 10;
26683730a734SPaolo Bonzini      uint64_t iova = 0;
26693730a734SPaolo Bonzini      int access = 0;
26703730a734SPaolo Bonzini      void *addr = NULL;
26713730a734SPaolo Bonzini
26723730a734SPaolo Bonzini      mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
26733730a734SPaolo Bonzini      ibv_dereg_mr(mr);
26743730a734SPaolo Bonzini      return 0;
26753730a734SPaolo Bonzini    }'''))
26763730a734SPaolo Bonziniendif
26773730a734SPaolo Bonzini
2678b87df904SPaolo Bonziniif get_option('membarrier').disabled()
2679b87df904SPaolo Bonzini  have_membarrier = false
2680b87df904SPaolo Bonzinielif targetos == 'windows'
2681b87df904SPaolo Bonzini  have_membarrier = true
2682b87df904SPaolo Bonzinielif targetos == 'linux'
2683b87df904SPaolo Bonzini  have_membarrier = cc.compiles('''
2684b87df904SPaolo Bonzini    #include <linux/membarrier.h>
2685b87df904SPaolo Bonzini    #include <sys/syscall.h>
2686b87df904SPaolo Bonzini    #include <unistd.h>
2687b87df904SPaolo Bonzini    #include <stdlib.h>
2688b87df904SPaolo Bonzini    int main(void) {
2689b87df904SPaolo Bonzini        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
2690b87df904SPaolo Bonzini        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
2691b87df904SPaolo Bonzini        exit(0);
2692b87df904SPaolo Bonzini    }''')
2693b87df904SPaolo Bonziniendif
2694b87df904SPaolo Bonziniconfig_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \
2695b87df904SPaolo Bonzini  .require(have_membarrier, error_message: 'membarrier system call not available') \
2696b87df904SPaolo Bonzini  .allowed())
2697b87df904SPaolo Bonzini
269834b52615SPaolo Bonzinihave_afalg = get_option('crypto_afalg') \
269934b52615SPaolo Bonzini  .require(cc.compiles(gnu_source_prefix + '''
270034b52615SPaolo Bonzini    #include <errno.h>
270134b52615SPaolo Bonzini    #include <sys/types.h>
270234b52615SPaolo Bonzini    #include <sys/socket.h>
270334b52615SPaolo Bonzini    #include <linux/if_alg.h>
270434b52615SPaolo Bonzini    int main(void) {
270534b52615SPaolo Bonzini      int sock;
270634b52615SPaolo Bonzini      sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
270734b52615SPaolo Bonzini      return sock;
270834b52615SPaolo Bonzini    }
270934b52615SPaolo Bonzini  '''), error_message: 'AF_ALG requested but could not be detected').allowed()
271034b52615SPaolo Bonziniconfig_host_data.set('CONFIG_AF_ALG', have_afalg)
271134b52615SPaolo Bonzini
27129d734b85SMarc-André Lureauconfig_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
27139d734b85SMarc-André Lureau  'linux/vm_sockets.h', 'AF_VSOCK',
27149d734b85SMarc-André Lureau  prefix: '#include <sys/socket.h>',
27159d734b85SMarc-André Lureau))
2716bd87a367SPaolo Bonzini
27178821a389SMarc-André Lureauhave_vss = false
2718872b69e6SMarc-André Lureauhave_vss_sdk = false # old xp/2003 SDK
27198821a389SMarc-André Lureauif targetos == 'windows' and link_language == 'cpp'
27208821a389SMarc-André Lureau  have_vss = cxx.compiles('''
27218821a389SMarc-André Lureau    #define __MIDL_user_allocate_free_DEFINED__
272232478cb6SMarc-André Lureau    #include <vss.h>
27238821a389SMarc-André Lureau    int main(void) { return VSS_CTX_BACKUP; }''')
2724872b69e6SMarc-André Lureau  have_vss_sdk = cxx.has_header('vscoordint.h')
27258821a389SMarc-André Lureauendif
2726872b69e6SMarc-André Lureauconfig_host_data.set('HAVE_VSS_SDK', have_vss_sdk)
27278821a389SMarc-André Lureau
2728859aef02SPaolo Bonziniforeach k, v: config_host
2729ce6119dcSPaolo Bonzini  if k.startswith('CONFIG_')
2730859aef02SPaolo Bonzini    config_host_data.set(k, v == 'y' ? 1 : v)
2731859aef02SPaolo Bonzini  endif
2732859aef02SPaolo Bonziniendforeach
2733859aef02SPaolo Bonzini
27346391c772SRichard Henderson# Older versions of MinGW do not import _lock_file and _unlock_file properly.
27356391c772SRichard Henderson# This was fixed for v6.0.0 with commit b48e3ac8969d.
27366391c772SRichard Hendersonif targetos == 'windows'
27376391c772SRichard Henderson  config_host_data.set('HAVE__LOCK_FILE', cc.links('''
27386391c772SRichard Henderson    #include <stdio.h>
27396391c772SRichard Henderson    int main(void) {
27406391c772SRichard Henderson      _lock_file(NULL);
27416391c772SRichard Henderson      _unlock_file(NULL);
27426391c772SRichard Henderson      return 0;
27436391c772SRichard Henderson    }''', name: '_lock_file and _unlock_file'))
27446391c772SRichard Hendersonendif
27456391c772SRichard Henderson
2746dbd672c8SPierrick Bouvierif targetos == 'windows'
2747dbd672c8SPierrick Bouvier  mingw_has_setjmp_longjmp = cc.links('''
2748dbd672c8SPierrick Bouvier    #include <setjmp.h>
2749dbd672c8SPierrick Bouvier    int main(void) {
2750dbd672c8SPierrick Bouvier      /*
2751dbd672c8SPierrick Bouvier       * These functions are not available in setjmp header, but may be
2752dbd672c8SPierrick Bouvier       * available at link time, from libmingwex.a.
2753dbd672c8SPierrick Bouvier       */
2754dbd672c8SPierrick Bouvier      extern int __mingw_setjmp(jmp_buf);
2755dbd672c8SPierrick Bouvier      extern void __attribute__((noreturn)) __mingw_longjmp(jmp_buf, int);
2756dbd672c8SPierrick Bouvier      jmp_buf env;
2757dbd672c8SPierrick Bouvier      __mingw_setjmp(env);
2758dbd672c8SPierrick Bouvier      __mingw_longjmp(env, 0);
2759dbd672c8SPierrick Bouvier    }
2760dbd672c8SPierrick Bouvier  ''', name: 'mingw setjmp and longjmp')
2761dbd672c8SPierrick Bouvier
2762dbd672c8SPierrick Bouvier  if cpu == 'aarch64' and not mingw_has_setjmp_longjmp
2763dbd672c8SPierrick Bouvier    error('mingw must provide setjmp/longjmp for windows-arm64')
2764dbd672c8SPierrick Bouvier  endif
2765dbd672c8SPierrick Bouvierendif
2766dbd672c8SPierrick Bouvier
2767a0c9162cSPaolo Bonzini########################
2768a0c9162cSPaolo Bonzini# Target configuration #
2769a0c9162cSPaolo Bonzini########################
2770a0c9162cSPaolo Bonzini
27712becc36aSPaolo Bonziniminikconf = find_program('scripts/minikconf.py')
277205512f55SPaolo Bonziniconfig_all = {}
2773a98006bcSPaolo Bonziniconfig_all_devices = {}
2774ca0fc784SPaolo Bonziniconfig_all_disas = {}
27752becc36aSPaolo Bonziniconfig_devices_mak_list = []
27762becc36aSPaolo Bonziniconfig_devices_h = {}
2777859aef02SPaolo Bonziniconfig_target_h = {}
27782becc36aSPaolo Bonziniconfig_target_mak = {}
2779ca0fc784SPaolo Bonzini
2780ca0fc784SPaolo Bonzinidisassemblers = {
2781ca0fc784SPaolo Bonzini  'alpha' : ['CONFIG_ALPHA_DIS'],
2782ca0fc784SPaolo Bonzini  'avr' : ['CONFIG_AVR_DIS'],
2783ca0fc784SPaolo Bonzini  'cris' : ['CONFIG_CRIS_DIS'],
27843e7a84eeSTaylor Simpson  'hexagon' : ['CONFIG_HEXAGON_DIS'],
2785ca0fc784SPaolo Bonzini  'hppa' : ['CONFIG_HPPA_DIS'],
2786ca0fc784SPaolo Bonzini  'i386' : ['CONFIG_I386_DIS'],
2787ca0fc784SPaolo Bonzini  'x86_64' : ['CONFIG_I386_DIS'],
2788ca0fc784SPaolo Bonzini  'm68k' : ['CONFIG_M68K_DIS'],
2789ca0fc784SPaolo Bonzini  'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
2790ca0fc784SPaolo Bonzini  'mips' : ['CONFIG_MIPS_DIS'],
2791ca0fc784SPaolo Bonzini  'nios2' : ['CONFIG_NIOS2_DIS'],
2792ca0fc784SPaolo Bonzini  'or1k' : ['CONFIG_OPENRISC_DIS'],
2793ca0fc784SPaolo Bonzini  'ppc' : ['CONFIG_PPC_DIS'],
2794ca0fc784SPaolo Bonzini  'riscv' : ['CONFIG_RISCV_DIS'],
2795ca0fc784SPaolo Bonzini  'rx' : ['CONFIG_RX_DIS'],
2796ca0fc784SPaolo Bonzini  's390' : ['CONFIG_S390_DIS'],
2797ca0fc784SPaolo Bonzini  'sh4' : ['CONFIG_SH4_DIS'],
2798ca0fc784SPaolo Bonzini  'sparc' : ['CONFIG_SPARC_DIS'],
2799ca0fc784SPaolo Bonzini  'xtensa' : ['CONFIG_XTENSA_DIS'],
2800aae1746cSSong Gao  'loongarch' : ['CONFIG_LOONGARCH_DIS'],
2801ca0fc784SPaolo Bonzini}
2802ca0fc784SPaolo Bonzini
2803e1fbd2c4SPaolo Bonzinihave_ivshmem = config_host_data.get('CONFIG_EVENTFD')
28040a189110SPaolo Bonzinihost_kconfig = \
2805537b7248SPaolo Bonzini  (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
28060d04c4c9SPaolo Bonzini  (have_tpm ? ['CONFIG_TPM=y'] : []) + \
28073f0a5d55SMarc-André Lureau  (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
2808ccd250aaSPaolo Bonzini  (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
280988b6e618SPaolo Bonzini  (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \
28109d71037fSPaolo Bonzini  (x11.found() ? ['CONFIG_X11=y'] : []) + \
28112a3129a3SPaolo Bonzini  (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \
28122a3129a3SPaolo Bonzini  (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \
28132a3129a3SPaolo Bonzini  (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
281469202b40SPaolo Bonzini  (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
28150a189110SPaolo Bonzini  ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
28163730a734SPaolo Bonzini  (have_pvrdma ? ['CONFIG_PVRDMA=y'] : []) + \
281755116968SJagannathan Raman  (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \
281855116968SJagannathan Raman  (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : [])
28190a189110SPaolo Bonzini
2820a9a74907SPaolo Bonziniignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
2821ca0fc784SPaolo Bonzini
2822fdb75aefSPaolo Bonzinidefault_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
2823fdb75aefSPaolo Bonziniactual_target_dirs = []
2824fbb4121dSPaolo Bonzinifdt_required = []
2825a81df1b6SPaolo Bonziniforeach target : target_dirs
2826765686d6SPaolo Bonzini  config_target = { 'TARGET_NAME': target.split('-')[0] }
2827765686d6SPaolo Bonzini  if target.endswith('linux-user')
2828fdb75aefSPaolo Bonzini    if targetos != 'linux'
2829fdb75aefSPaolo Bonzini      if default_targets
2830fdb75aefSPaolo Bonzini        continue
2831fdb75aefSPaolo Bonzini      endif
2832fdb75aefSPaolo Bonzini      error('Target @0@ is only available on a Linux host'.format(target))
2833fdb75aefSPaolo Bonzini    endif
2834765686d6SPaolo Bonzini    config_target += { 'CONFIG_LINUX_USER': 'y' }
2835765686d6SPaolo Bonzini  elif target.endswith('bsd-user')
2836fdb75aefSPaolo Bonzini    if 'CONFIG_BSD' not in config_host
2837fdb75aefSPaolo Bonzini      if default_targets
2838fdb75aefSPaolo Bonzini        continue
2839fdb75aefSPaolo Bonzini      endif
2840fdb75aefSPaolo Bonzini      error('Target @0@ is only available on a BSD host'.format(target))
2841fdb75aefSPaolo Bonzini    endif
2842765686d6SPaolo Bonzini    config_target += { 'CONFIG_BSD_USER': 'y' }
2843765686d6SPaolo Bonzini  elif target.endswith('softmmu')
2844765686d6SPaolo Bonzini    config_target += { 'CONFIG_SOFTMMU': 'y' }
2845765686d6SPaolo Bonzini  endif
2846765686d6SPaolo Bonzini  if target.endswith('-user')
2847765686d6SPaolo Bonzini    config_target += {
2848765686d6SPaolo Bonzini      'CONFIG_USER_ONLY': 'y',
2849765686d6SPaolo Bonzini      'CONFIG_QEMU_INTERP_PREFIX':
2850ce6119dcSPaolo Bonzini        get_option('interp_prefix').replace('%M', config_target['TARGET_NAME'])
2851765686d6SPaolo Bonzini    }
2852765686d6SPaolo Bonzini  endif
2853859aef02SPaolo Bonzini
28540a189110SPaolo Bonzini  accel_kconfig = []
28558a19980eSPaolo Bonzini  foreach sym: accelerators
28568a19980eSPaolo Bonzini    if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
28578a19980eSPaolo Bonzini      config_target += { sym: 'y' }
28588a19980eSPaolo Bonzini      config_all += { sym: 'y' }
2859dae0ec15SGerd Hoffmann      if target in modular_tcg
2860dae0ec15SGerd Hoffmann        config_target += { 'CONFIG_TCG_MODULAR': 'y' }
2861dae0ec15SGerd Hoffmann      else
2862dae0ec15SGerd Hoffmann        config_target += { 'CONFIG_TCG_BUILTIN': 'y' }
2863dae0ec15SGerd Hoffmann      endif
28640a189110SPaolo Bonzini      accel_kconfig += [ sym + '=y' ]
28658a19980eSPaolo Bonzini    endif
28668a19980eSPaolo Bonzini  endforeach
28670a189110SPaolo Bonzini  if accel_kconfig.length() == 0
2868fdb75aefSPaolo Bonzini    if default_targets
2869fdb75aefSPaolo Bonzini      continue
2870fdb75aefSPaolo Bonzini    endif
2871fdb75aefSPaolo Bonzini    error('No accelerator available for target @0@'.format(target))
2872fdb75aefSPaolo Bonzini  endif
28738a19980eSPaolo Bonzini
2874fdb75aefSPaolo Bonzini  actual_target_dirs += target
2875812b31d3SAlex Bennée  config_target += keyval.load('configs/targets' / target + '.mak')
2876a9a74907SPaolo Bonzini  config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
2877765686d6SPaolo Bonzini
2878fbb4121dSPaolo Bonzini  if 'TARGET_NEED_FDT' in config_target
2879fbb4121dSPaolo Bonzini    fdt_required += target
2880fbb4121dSPaolo Bonzini  endif
2881fbb4121dSPaolo Bonzini
2882fa73168bSPaolo Bonzini  # Add default keys
2883fa73168bSPaolo Bonzini  if 'TARGET_BASE_ARCH' not in config_target
2884fa73168bSPaolo Bonzini    config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
2885fa73168bSPaolo Bonzini  endif
2886fa73168bSPaolo Bonzini  if 'TARGET_ABI_DIR' not in config_target
2887fa73168bSPaolo Bonzini    config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
2888fa73168bSPaolo Bonzini  endif
2889ee3eb3a7SMarc-André Lureau  if 'TARGET_BIG_ENDIAN' not in config_target
2890ee3eb3a7SMarc-André Lureau    config_target += {'TARGET_BIG_ENDIAN': 'n'}
2891ee3eb3a7SMarc-André Lureau  endif
2892859aef02SPaolo Bonzini
2893ca0fc784SPaolo Bonzini  foreach k, v: disassemblers
2894823eb013SPaolo Bonzini    if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
2895ca0fc784SPaolo Bonzini      foreach sym: v
2896ca0fc784SPaolo Bonzini        config_target += { sym: 'y' }
2897ca0fc784SPaolo Bonzini        config_all_disas += { sym: 'y' }
2898ca0fc784SPaolo Bonzini      endforeach
2899ca0fc784SPaolo Bonzini    endif
2900ca0fc784SPaolo Bonzini  endforeach
2901ca0fc784SPaolo Bonzini
2902859aef02SPaolo Bonzini  config_target_data = configuration_data()
2903859aef02SPaolo Bonzini  foreach k, v: config_target
2904859aef02SPaolo Bonzini    if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
2905859aef02SPaolo Bonzini      # do nothing
2906859aef02SPaolo Bonzini    elif ignored.contains(k)
2907859aef02SPaolo Bonzini      # do nothing
2908859aef02SPaolo Bonzini    elif k == 'TARGET_BASE_ARCH'
2909a9a74907SPaolo Bonzini      # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
2910a9a74907SPaolo Bonzini      # not used to select files from sourcesets.
2911859aef02SPaolo Bonzini      config_target_data.set('TARGET_' + v.to_upper(), 1)
2912765686d6SPaolo Bonzini    elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
2913859aef02SPaolo Bonzini      config_target_data.set_quoted(k, v)
2914859aef02SPaolo Bonzini    elif v == 'y'
2915859aef02SPaolo Bonzini      config_target_data.set(k, 1)
2916ee3eb3a7SMarc-André Lureau    elif v == 'n'
2917ee3eb3a7SMarc-André Lureau      config_target_data.set(k, 0)
2918859aef02SPaolo Bonzini    else
2919859aef02SPaolo Bonzini      config_target_data.set(k, v)
2920859aef02SPaolo Bonzini    endif
2921859aef02SPaolo Bonzini  endforeach
2922cb2c5531SPeter Maydell  config_target_data.set('QEMU_ARCH',
2923cb2c5531SPeter Maydell                         'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
2924859aef02SPaolo Bonzini  config_target_h += {target: configure_file(output: target + '-config-target.h',
2925859aef02SPaolo Bonzini                                               configuration: config_target_data)}
29262becc36aSPaolo Bonzini
29272becc36aSPaolo Bonzini  if target.endswith('-softmmu')
2928d1d5e9eeSAlex Bennée    config_input = meson.get_external_property(target, 'default')
29292becc36aSPaolo Bonzini    config_devices_mak = target + '-config-devices.mak'
29302becc36aSPaolo Bonzini    config_devices_mak = configure_file(
2931d1d5e9eeSAlex Bennée      input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
29322becc36aSPaolo Bonzini      output: config_devices_mak,
29332becc36aSPaolo Bonzini      depfile: config_devices_mak + '.d',
29342becc36aSPaolo Bonzini      capture: true,
29357bc3ca7fSPaolo Bonzini      command: [minikconf,
29367bc3ca7fSPaolo Bonzini                get_option('default_devices') ? '--defconfig' : '--allnoconfig',
29372becc36aSPaolo Bonzini                config_devices_mak, '@DEPFILE@', '@INPUT@',
2938f4063f9cSPhilippe Mathieu-Daudé                host_kconfig, accel_kconfig,
2939f4063f9cSPhilippe Mathieu-Daudé                'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'])
2940859aef02SPaolo Bonzini
2941859aef02SPaolo Bonzini    config_devices_data = configuration_data()
2942859aef02SPaolo Bonzini    config_devices = keyval.load(config_devices_mak)
2943859aef02SPaolo Bonzini    foreach k, v: config_devices
2944859aef02SPaolo Bonzini      config_devices_data.set(k, 1)
2945859aef02SPaolo Bonzini    endforeach
29462becc36aSPaolo Bonzini    config_devices_mak_list += config_devices_mak
2947859aef02SPaolo Bonzini    config_devices_h += {target: configure_file(output: target + '-config-devices.h',
2948859aef02SPaolo Bonzini                                                configuration: config_devices_data)}
2949859aef02SPaolo Bonzini    config_target += config_devices
2950a98006bcSPaolo Bonzini    config_all_devices += config_devices
29512becc36aSPaolo Bonzini  endif
29522becc36aSPaolo Bonzini  config_target_mak += {target: config_target}
2953a81df1b6SPaolo Bonziniendforeach
2954fdb75aefSPaolo Bonzinitarget_dirs = actual_target_dirs
2955a81df1b6SPaolo Bonzini
29562becc36aSPaolo Bonzini# This configuration is used to build files that are shared by
29572becc36aSPaolo Bonzini# multiple binaries, and then extracted out of the "common"
29582becc36aSPaolo Bonzini# static_library target.
29592becc36aSPaolo Bonzini#
29602becc36aSPaolo Bonzini# We do not use all_sources()/all_dependencies(), because it would
29612becc36aSPaolo Bonzini# build literally all source files, including devices only used by
29622becc36aSPaolo Bonzini# targets that are not built for this compilation.  The CONFIG_ALL
29632becc36aSPaolo Bonzini# pseudo symbol replaces it.
29642becc36aSPaolo Bonzini
296505512f55SPaolo Bonziniconfig_all += config_all_devices
29662becc36aSPaolo Bonziniconfig_all += config_host
29672becc36aSPaolo Bonziniconfig_all += config_all_disas
29682becc36aSPaolo Bonziniconfig_all += {
296914efd8d3SPaolo Bonzini  'CONFIG_XEN': xen.found(),
29702becc36aSPaolo Bonzini  'CONFIG_SOFTMMU': have_system,
29712becc36aSPaolo Bonzini  'CONFIG_USER_ONLY': have_user,
29722becc36aSPaolo Bonzini  'CONFIG_ALL': true,
29732becc36aSPaolo Bonzini}
29742becc36aSPaolo Bonzini
2975eed56e9aSPaolo Bonzinitarget_configs_h = []
2976eed56e9aSPaolo Bonziniforeach target: target_dirs
2977eed56e9aSPaolo Bonzini  target_configs_h += config_target_h[target]
2978eed56e9aSPaolo Bonzini  target_configs_h += config_devices_h.get(target, [])
2979eed56e9aSPaolo Bonziniendforeach
2980eed56e9aSPaolo Bonzinigenh += custom_target('config-poison.h',
2981eed56e9aSPaolo Bonzini                      input: [target_configs_h],
2982eed56e9aSPaolo Bonzini                      output: 'config-poison.h',
2983eed56e9aSPaolo Bonzini                      capture: true,
2984eed56e9aSPaolo Bonzini                      command: [find_program('scripts/make-config-poison.sh'),
2985eed56e9aSPaolo Bonzini                                target_configs_h])
2986eed56e9aSPaolo Bonzini
2987a0c9162cSPaolo Bonzini##############
2988a0c9162cSPaolo Bonzini# Submodules #
2989a0c9162cSPaolo Bonzini##############
29908b18cdbfSRichard Henderson
29918b18cdbfSRichard Hendersoncapstone = not_found
299283602083SThomas Huthif not get_option('capstone').auto() or have_system or have_user
299343ecd166SThomas Huth  capstone = dependency('capstone', version: '>=3.0.5',
2994063d5119SPaolo Bonzini                        method: 'pkg-config',
299583602083SThomas Huth                        required: get_option('capstone'))
29968f4aea71SDaniel P. Berrangé
29978f4aea71SDaniel P. Berrangé  # Some versions of capstone have broken pkg-config file
29988f4aea71SDaniel P. Berrangé  # that reports a wrong -I path, causing the #include to
29998f4aea71SDaniel P. Berrangé  # fail later. If the system has such a broken version
30008f4aea71SDaniel P. Berrangé  # do not use it.
30018f4aea71SDaniel P. Berrangé  if capstone.found() and not cc.compiles('#include <capstone.h>',
30028f4aea71SDaniel P. Berrangé                                          dependencies: [capstone])
30038f4aea71SDaniel P. Berrangé    capstone = not_found
300483602083SThomas Huth    if get_option('capstone').enabled()
300583602083SThomas Huth      error('capstone requested, but it does not appear to work')
30068f4aea71SDaniel P. Berrangé    endif
30078f4aea71SDaniel P. Berrangé  endif
30088b18cdbfSRichard Hendersonendif
30094d34a86bSPaolo Bonzini
301055116968SJagannathan Ramanlibvfio_user_dep = not_found
301155116968SJagannathan Ramanif have_system and vfio_user_server_allowed
301255116968SJagannathan Raman  have_internal = fs.exists(meson.current_source_dir() / 'subprojects/libvfio-user/meson.build')
301355116968SJagannathan Raman
301455116968SJagannathan Raman  if not have_internal
301555116968SJagannathan Raman    error('libvfio-user source not found - please pull git submodule')
301655116968SJagannathan Raman  endif
301755116968SJagannathan Raman
301855116968SJagannathan Raman  libvfio_user_proj = subproject('libvfio-user')
301955116968SJagannathan Raman
30205328353cSPaolo Bonzini  libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep')
302155116968SJagannathan Ramanendif
302255116968SJagannathan Raman
3023fbb4121dSPaolo Bonzinifdt = not_found
3024fbb4121dSPaolo Bonziniif have_system
3025c593d841SPhilippe Mathieu-Daudé  fdt_opt = get_option('fdt')
3026fbb4121dSPaolo Bonzini  if fdt_opt in ['enabled', 'auto', 'system']
3027fbb4121dSPaolo Bonzini    have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
3028063d5119SPaolo Bonzini    fdt = cc.find_library('fdt',
3029fbb4121dSPaolo Bonzini                          required: fdt_opt == 'system' or
3030fbb4121dSPaolo Bonzini                                    fdt_opt == 'enabled' and not have_internal)
3031fbb4121dSPaolo Bonzini    if fdt.found() and cc.links('''
3032fbb4121dSPaolo Bonzini       #include <libfdt.h>
3033fbb4121dSPaolo Bonzini       #include <libfdt_env.h>
3034de47b0ffSThomas Huth       int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
3035fbb4121dSPaolo Bonzini         dependencies: fdt)
3036fbb4121dSPaolo Bonzini      fdt_opt = 'system'
30376c22853cSThomas Huth    elif fdt_opt == 'system'
30386c22853cSThomas Huth       error('system libfdt requested, but it is too old (1.5.1 or newer required)')
3039fbb4121dSPaolo Bonzini    elif have_internal
3040fbb4121dSPaolo Bonzini      fdt_opt = 'internal'
3041fbb4121dSPaolo Bonzini    else
3042fbb4121dSPaolo Bonzini      fdt_opt = 'disabled'
304387daf898SThomas Huth      fdt = not_found
3044fbb4121dSPaolo Bonzini    endif
3045fbb4121dSPaolo Bonzini  endif
3046fbb4121dSPaolo Bonzini  if fdt_opt == 'internal'
3047fbb4121dSPaolo Bonzini    fdt_files = files(
3048fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt.c',
3049fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_ro.c',
3050fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_wip.c',
3051fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_sw.c',
3052fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_rw.c',
3053fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_strerror.c',
3054fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_empty_tree.c',
3055fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_addresses.c',
3056fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_overlay.c',
3057fbb4121dSPaolo Bonzini      'dtc/libfdt/fdt_check.c',
3058fbb4121dSPaolo Bonzini    )
3059fbb4121dSPaolo Bonzini
3060fbb4121dSPaolo Bonzini    fdt_inc = include_directories('dtc/libfdt')
3061fbb4121dSPaolo Bonzini    libfdt = static_library('fdt',
3062610e7e0eSPhilippe Mathieu-Daudé                            build_by_default: false,
3063fbb4121dSPaolo Bonzini                            sources: fdt_files,
3064fbb4121dSPaolo Bonzini                            include_directories: fdt_inc)
3065fbb4121dSPaolo Bonzini    fdt = declare_dependency(link_with: libfdt,
3066fbb4121dSPaolo Bonzini                             include_directories: fdt_inc)
3067fbb4121dSPaolo Bonzini  endif
3068c593d841SPhilippe Mathieu-Daudéelse
3069c593d841SPhilippe Mathieu-Daudé  fdt_opt = 'disabled'
3070fbb4121dSPaolo Bonziniendif
3071fbb4121dSPaolo Bonziniif not fdt.found() and fdt_required.length() > 0
3072fbb4121dSPaolo Bonzini  error('fdt not available but required by targets ' + ', '.join(fdt_required))
3073fbb4121dSPaolo Bonziniendif
3074fbb4121dSPaolo Bonzini
30758b18cdbfSRichard Hendersonconfig_host_data.set('CONFIG_CAPSTONE', capstone.found())
3076fbb4121dSPaolo Bonziniconfig_host_data.set('CONFIG_FDT', fdt.found())
30774d34a86bSPaolo Bonziniconfig_host_data.set('CONFIG_SLIRP', slirp.found())
30788b18cdbfSRichard Henderson
3079a0c9162cSPaolo Bonzini#####################
3080a0c9162cSPaolo Bonzini# Generated sources #
3081a0c9162cSPaolo Bonzini#####################
30828b18cdbfSRichard Henderson
3083a0c9162cSPaolo Bonzinigenh += configure_file(output: 'config-host.h', configuration: config_host_data)
3084a81df1b6SPaolo Bonzini
30853f885659SMarc-André Lureauhxtool = find_program('scripts/hxtool')
3086e2c4012bSMarc-André Lureaushaderinclude = find_program('scripts/shaderinclude.py')
3087a81df1b6SPaolo Bonziniqapi_gen = find_program('scripts/qapi-gen.py')
3088654d6b04SPaolo Bonziniqapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
3089654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/commands.py',
3090654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/common.py',
3091654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/error.py',
3092654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/events.py',
3093654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/expr.py',
3094654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/gen.py',
3095654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/introspect.py',
309688d357d2SMarkus Armbruster                     meson.current_source_dir() / 'scripts/qapi/main.py',
3097654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/parser.py',
3098654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/schema.py',
3099654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/source.py',
3100654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/types.py',
3101654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi/visit.py',
3102654d6b04SPaolo Bonzini                     meson.current_source_dir() / 'scripts/qapi-gen.py'
3103a81df1b6SPaolo Bonzini]
3104a81df1b6SPaolo Bonzini
3105a81df1b6SPaolo Bonzinitracetool = [
3106a81df1b6SPaolo Bonzini  python, files('scripts/tracetool.py'),
31079c29b741SPaolo Bonzini   '--backend=' + ','.join(get_option('trace_backends'))
3108a81df1b6SPaolo Bonzini]
31090572d6cdSStefan Hajnoczitracetool_depends = files(
31100572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/log.py',
31110572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/__init__.py',
31120572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/dtrace.py',
31130572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/ftrace.py',
31140572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/simple.py',
31150572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/syslog.py',
31160572d6cdSStefan Hajnoczi  'scripts/tracetool/backend/ust.py',
31170572d6cdSStefan Hajnoczi  'scripts/tracetool/format/ust_events_c.py',
31180572d6cdSStefan Hajnoczi  'scripts/tracetool/format/ust_events_h.py',
31190572d6cdSStefan Hajnoczi  'scripts/tracetool/format/__init__.py',
31200572d6cdSStefan Hajnoczi  'scripts/tracetool/format/d.py',
31210572d6cdSStefan Hajnoczi  'scripts/tracetool/format/simpletrace_stap.py',
31220572d6cdSStefan Hajnoczi  'scripts/tracetool/format/c.py',
31230572d6cdSStefan Hajnoczi  'scripts/tracetool/format/h.py',
31240572d6cdSStefan Hajnoczi  'scripts/tracetool/format/log_stap.py',
31250572d6cdSStefan Hajnoczi  'scripts/tracetool/format/stap.py',
31260572d6cdSStefan Hajnoczi  'scripts/tracetool/__init__.py',
31270572d6cdSStefan Hajnoczi  'scripts/tracetool/vcpu.py'
31280572d6cdSStefan Hajnoczi)
3129a81df1b6SPaolo Bonzini
31302c273f32SMarc-André Lureauqemu_version_cmd = [find_program('scripts/qemu-version.sh'),
31312c273f32SMarc-André Lureau                    meson.current_source_dir(),
3132b0b4323eSPaolo Bonzini                    get_option('pkgversion'), meson.project_version()]
31332c273f32SMarc-André Lureauqemu_version = custom_target('qemu-version.h',
31342c273f32SMarc-André Lureau                             output: 'qemu-version.h',
31352c273f32SMarc-André Lureau                             command: qemu_version_cmd,
31362c273f32SMarc-André Lureau                             capture: true,
31372c273f32SMarc-André Lureau                             build_by_default: true,
31382c273f32SMarc-André Lureau                             build_always_stale: true)
31392c273f32SMarc-André Lureaugenh += qemu_version
31402c273f32SMarc-André Lureau
31413f885659SMarc-André Lureauhxdep = []
31423f885659SMarc-André Lureauhx_headers = [
31433f885659SMarc-André Lureau  ['qemu-options.hx', 'qemu-options.def'],
31443f885659SMarc-André Lureau  ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
31453f885659SMarc-André Lureau]
31463f885659SMarc-André Lureauif have_system
31473f885659SMarc-André Lureau  hx_headers += [
31483f885659SMarc-André Lureau    ['hmp-commands.hx', 'hmp-commands.h'],
31493f885659SMarc-André Lureau    ['hmp-commands-info.hx', 'hmp-commands-info.h'],
31503f885659SMarc-André Lureau  ]
31513f885659SMarc-André Lureauendif
31523f885659SMarc-André Lureauforeach d : hx_headers
3153b7c70bf2SMarc-André Lureau  hxdep += custom_target(d[1],
31543f885659SMarc-André Lureau                input: files(d[0]),
31553f885659SMarc-André Lureau                output: d[1],
31563f885659SMarc-André Lureau                capture: true,
31573f885659SMarc-André Lureau                build_by_default: true, # to be removed when added to a target
31583f885659SMarc-André Lureau                command: [hxtool, '-h', '@INPUT0@'])
31593f885659SMarc-André Lureauendforeach
31603f885659SMarc-André Lureaugenh += hxdep
31613f885659SMarc-André Lureau
3162a0c9162cSPaolo Bonzini###################
3163a0c9162cSPaolo Bonzini# Collect sources #
3164a0c9162cSPaolo Bonzini###################
3165a81df1b6SPaolo Bonzini
316655567891SPhilippe Mathieu-Daudéauthz_ss = ss.source_set()
31677e2b888fSPhilippe Mathieu-Daudéblockdev_ss = ss.source_set()
31687e2b888fSPhilippe Mathieu-Daudéblock_ss = ss.source_set()
3169c2306d71SPhilippe Mathieu-Daudéchardev_ss = ss.source_set()
31707e2b888fSPhilippe Mathieu-Daudécommon_ss = ss.source_set()
31712389304aSPhilippe Mathieu-Daudécrypto_ss = ss.source_set()
3172f73fb063SPhilippe Mathieu-Daudéhwcore_ss = ss.source_set()
3173f78536b1SPhilippe Mathieu-Daudéio_ss = ss.source_set()
31747e2b888fSPhilippe Mathieu-Daudéqmp_ss = ss.source_set()
3175da33fc09SPhilippe Mathieu-Daudéqom_ss = ss.source_set()
31767e2b888fSPhilippe Mathieu-Daudésoftmmu_ss = ss.source_set()
31777e2b888fSPhilippe Mathieu-Daudéspecific_fuzz_ss = ss.source_set()
31787e2b888fSPhilippe Mathieu-Daudéspecific_ss = ss.source_set()
3179a81df1b6SPaolo Bonzinistub_ss = ss.source_set()
3180a81df1b6SPaolo Bonzinitrace_ss = ss.source_set()
31812becc36aSPaolo Bonziniuser_ss = ss.source_set()
31827e2b888fSPhilippe Mathieu-Daudéutil_ss = ss.source_set()
31832becc36aSPaolo Bonzini
3184c94a7b88SGerd Hoffmann# accel modules
3185c94a7b88SGerd Hoffmannqtest_module_ss = ss.source_set()
3186dae0ec15SGerd Hoffmanntcg_module_ss = ss.source_set()
3187c94a7b88SGerd Hoffmann
31883154fee4SMarc-André Lureaumodules = {}
3189db2e89dfSGerd Hoffmanntarget_modules = {}
31902becc36aSPaolo Bonzinihw_arch = {}
31912becc36aSPaolo Bonzinitarget_arch = {}
31922becc36aSPaolo Bonzinitarget_softmmu_arch = {}
319346369b50SPhilippe Mathieu-Daudétarget_user_arch = {}
3194a81df1b6SPaolo Bonzini
3195a81df1b6SPaolo Bonzini###############
3196a81df1b6SPaolo Bonzini# Trace files #
3197a81df1b6SPaolo Bonzini###############
3198a81df1b6SPaolo Bonzini
3199c9322ab5SMarc-André Lureau# TODO: add each directory to the subdirs from its own meson.build, once
3200c9322ab5SMarc-André Lureau# we have those
3201a81df1b6SPaolo Bonzinitrace_events_subdirs = [
3202a81df1b6SPaolo Bonzini  'crypto',
320369ff4d0aSPhilippe Mathieu-Daudé  'qapi',
320469ff4d0aSPhilippe Mathieu-Daudé  'qom',
3205a81df1b6SPaolo Bonzini  'monitor',
320669ff4d0aSPhilippe Mathieu-Daudé  'util',
3207842b42dfSAlex Bennée  'gdbstub',
3208a81df1b6SPaolo Bonzini]
32096ddc1abeSWarner Loshif have_linux_user
3210a81df1b6SPaolo Bonzini  trace_events_subdirs += [ 'linux-user' ]
3211a81df1b6SPaolo Bonziniendif
32126ddc1abeSWarner Loshif have_bsd_user
32136ddc1abeSWarner Losh  trace_events_subdirs += [ 'bsd-user' ]
32146ddc1abeSWarner Loshendif
3215a81df1b6SPaolo Bonziniif have_block
3216a81df1b6SPaolo Bonzini  trace_events_subdirs += [
3217a81df1b6SPaolo Bonzini    'authz',
3218a81df1b6SPaolo Bonzini    'block',
3219a81df1b6SPaolo Bonzini    'io',
3220a81df1b6SPaolo Bonzini    'nbd',
3221a81df1b6SPaolo Bonzini    'scsi',
3222a81df1b6SPaolo Bonzini  ]
3223a81df1b6SPaolo Bonziniendif
3224a81df1b6SPaolo Bonziniif have_system
3225a81df1b6SPaolo Bonzini  trace_events_subdirs += [
32268985db26SPhilippe Mathieu-Daudé    'accel/kvm',
3227a81df1b6SPaolo Bonzini    'audio',
3228a81df1b6SPaolo Bonzini    'backends',
3229a81df1b6SPaolo Bonzini    'backends/tpm',
3230a81df1b6SPaolo Bonzini    'chardev',
323146627f41SAndrew Melnychenko    'ebpf',
3232a81df1b6SPaolo Bonzini    'hw/9pfs',
3233a81df1b6SPaolo Bonzini    'hw/acpi',
323477c05b0bSHao Wu    'hw/adc',
3235a81df1b6SPaolo Bonzini    'hw/alpha',
3236a81df1b6SPaolo Bonzini    'hw/arm',
3237a81df1b6SPaolo Bonzini    'hw/audio',
3238a81df1b6SPaolo Bonzini    'hw/block',
3239a81df1b6SPaolo Bonzini    'hw/block/dataplane',
3240a81df1b6SPaolo Bonzini    'hw/char',
3241a81df1b6SPaolo Bonzini    'hw/display',
3242a81df1b6SPaolo Bonzini    'hw/dma',
3243a81df1b6SPaolo Bonzini    'hw/hyperv',
3244a81df1b6SPaolo Bonzini    'hw/i2c',
3245a81df1b6SPaolo Bonzini    'hw/i386',
3246a81df1b6SPaolo Bonzini    'hw/i386/xen',
3247aa98ee38SDavid Woodhouse    'hw/i386/kvm',
3248a81df1b6SPaolo Bonzini    'hw/ide',
3249a81df1b6SPaolo Bonzini    'hw/input',
3250a81df1b6SPaolo Bonzini    'hw/intc',
3251a81df1b6SPaolo Bonzini    'hw/isa',
3252a81df1b6SPaolo Bonzini    'hw/mem',
3253a81df1b6SPaolo Bonzini    'hw/mips',
3254a81df1b6SPaolo Bonzini    'hw/misc',
3255a81df1b6SPaolo Bonzini    'hw/misc/macio',
3256a81df1b6SPaolo Bonzini    'hw/net',
325798e5d7a2SVikram Garhwal    'hw/net/can',
3258ce0e6a2cSMark Cave-Ayland    'hw/nubus',
325988eea45cSKlaus Jensen    'hw/nvme',
3260a81df1b6SPaolo Bonzini    'hw/nvram',
3261a81df1b6SPaolo Bonzini    'hw/pci',
3262a81df1b6SPaolo Bonzini    'hw/pci-host',
3263a81df1b6SPaolo Bonzini    'hw/ppc',
3264a81df1b6SPaolo Bonzini    'hw/rdma',
3265a81df1b6SPaolo Bonzini    'hw/rdma/vmw',
3266a81df1b6SPaolo Bonzini    'hw/rtc',
3267a81df1b6SPaolo Bonzini    'hw/s390x',
3268a81df1b6SPaolo Bonzini    'hw/scsi',
3269a81df1b6SPaolo Bonzini    'hw/sd',
3270ad52cfc1SBALATON Zoltan    'hw/sh4',
3271a81df1b6SPaolo Bonzini    'hw/sparc',
3272a81df1b6SPaolo Bonzini    'hw/sparc64',
3273a81df1b6SPaolo Bonzini    'hw/ssi',
3274a81df1b6SPaolo Bonzini    'hw/timer',
3275a81df1b6SPaolo Bonzini    'hw/tpm',
3276a81df1b6SPaolo Bonzini    'hw/usb',
3277a81df1b6SPaolo Bonzini    'hw/vfio',
3278a81df1b6SPaolo Bonzini    'hw/virtio',
3279a81df1b6SPaolo Bonzini    'hw/watchdog',
3280a81df1b6SPaolo Bonzini    'hw/xen',
3281a81df1b6SPaolo Bonzini    'hw/gpio',
3282a81df1b6SPaolo Bonzini    'migration',
3283a81df1b6SPaolo Bonzini    'net',
32848b7a5507SPhilippe Mathieu-Daudé    'softmmu',
3285a81df1b6SPaolo Bonzini    'ui',
3286ad22c308SElena Ufimtseva    'hw/remote',
3287a81df1b6SPaolo Bonzini  ]
3288a81df1b6SPaolo Bonziniendif
32898985db26SPhilippe Mathieu-Daudéif have_system or have_user
32908985db26SPhilippe Mathieu-Daudé  trace_events_subdirs += [
32918985db26SPhilippe Mathieu-Daudé    'accel/tcg',
32928985db26SPhilippe Mathieu-Daudé    'hw/core',
32938985db26SPhilippe Mathieu-Daudé    'target/arm',
3294a1477da3SAlexander Graf    'target/arm/hvf',
32958985db26SPhilippe Mathieu-Daudé    'target/hppa',
32968985db26SPhilippe Mathieu-Daudé    'target/i386',
32978985db26SPhilippe Mathieu-Daudé    'target/i386/kvm',
329834b8ff25SPhilippe Mathieu-Daudé    'target/mips/tcg',
32996f83e277SRichard Henderson    'target/nios2',
33008985db26SPhilippe Mathieu-Daudé    'target/ppc',
33018985db26SPhilippe Mathieu-Daudé    'target/riscv',
33028985db26SPhilippe Mathieu-Daudé    'target/s390x',
330367043607SCho, Yu-Chen    'target/s390x/kvm',
33048985db26SPhilippe Mathieu-Daudé    'target/sparc',
33058985db26SPhilippe Mathieu-Daudé  ]
33068985db26SPhilippe Mathieu-Daudéendif
3307a81df1b6SPaolo Bonzini
33080df750e9SMarc-André Lureauvhost_user = not_found
33092a3129a3SPaolo Bonziniif targetos == 'linux' and have_vhost_user
33100df750e9SMarc-André Lureau  libvhost_user = subproject('libvhost-user')
33110df750e9SMarc-André Lureau  vhost_user = libvhost_user.get_variable('vhost_user_dep')
33120df750e9SMarc-André Lureauendif
33130df750e9SMarc-André Lureau
3314a6caeee8SXie Yongjilibvduse = not_found
3315a6caeee8SXie Yongjiif have_libvduse
3316a6caeee8SXie Yongji  libvduse_proj = subproject('libvduse')
3317a6caeee8SXie Yongji  libvduse = libvduse_proj.get_variable('libvduse_dep')
3318a6caeee8SXie Yongjiendif
3319a6caeee8SXie Yongji
3320b83a80e8SVladimir Sementsov-Ogievskiy# NOTE: the trace/ subdirectory needs the qapi_trace_events variable
3321b83a80e8SVladimir Sementsov-Ogievskiy# that is filled in by qapi/.
3322a81df1b6SPaolo Bonzinisubdir('qapi')
3323a81df1b6SPaolo Bonzinisubdir('qobject')
3324a81df1b6SPaolo Bonzinisubdir('stubs')
3325a81df1b6SPaolo Bonzinisubdir('trace')
3326a81df1b6SPaolo Bonzinisubdir('util')
33275582c58fSMarc-André Lureausubdir('qom')
33285582c58fSMarc-André Lureausubdir('authz')
3329a81df1b6SPaolo Bonzinisubdir('crypto')
33302d78b56eSMarc-André Lureausubdir('ui')
33317d5983e3SNicolas Saenz Juliennesubdir('hw')
3332842b42dfSAlex Bennéesubdir('gdbstub')
3333a81df1b6SPaolo Bonzini
33343154fee4SMarc-André Lureauif enable_modules
33353154fee4SMarc-André Lureau  libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
33363154fee4SMarc-André Lureau  modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
33373154fee4SMarc-André Lureauendif
33383154fee4SMarc-André Lureau
33397d5983e3SNicolas Saenz Julienneqom_ss = qom_ss.apply(config_host, strict: false)
33407d5983e3SNicolas Saenz Juliennelibqom = static_library('qom', qom_ss.sources() + genh,
33417d5983e3SNicolas Saenz Julienne                        dependencies: [qom_ss.dependencies()],
33427d5983e3SNicolas Saenz Julienne                        name_suffix: 'fa')
33437d5983e3SNicolas Saenz Julienneqom = declare_dependency(link_whole: libqom)
33447d5983e3SNicolas Saenz Julienne
33457d5983e3SNicolas Saenz Julienneevent_loop_base = files('event-loop-base.c')
33467d5983e3SNicolas Saenz Julienneevent_loop_base = static_library('event-loop-base', sources: event_loop_base + genh,
33477d5983e3SNicolas Saenz Julienne                                 build_by_default: true)
33487d5983e3SNicolas Saenz Julienneevent_loop_base = declare_dependency(link_whole: event_loop_base,
33497d5983e3SNicolas Saenz Julienne                                     dependencies: [qom])
33507d5983e3SNicolas Saenz Julienne
33512becc36aSPaolo Bonzinistub_ss = stub_ss.apply(config_all, strict: false)
3352a81df1b6SPaolo Bonzini
3353a81df1b6SPaolo Bonziniutil_ss.add_all(trace_ss)
33542becc36aSPaolo Bonziniutil_ss = util_ss.apply(config_all, strict: false)
3355a81df1b6SPaolo Bonzinilibqemuutil = static_library('qemuutil',
3356a81df1b6SPaolo Bonzini                             sources: util_ss.sources() + stub_ss.sources() + genh,
33576d7c7c2dSPaolo Bonzini                             dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman])
3358a81df1b6SPaolo Bonziniqemuutil = declare_dependency(link_with: libqemuutil,
335970ac26b9SNicolas Saenz Julienne                              sources: genh + version_res,
336070ac26b9SNicolas Saenz Julienne                              dependencies: [event_loop_base])
3361a81df1b6SPaolo Bonzini
3362957b31f6SPhilippe Mathieu-Daudéif have_system or have_user
3363abff1abfSPaolo Bonzini  decodetree = generator(find_program('scripts/decodetree.py'),
3364abff1abfSPaolo Bonzini                         output: 'decode-@BASENAME@.c.inc',
3365abff1abfSPaolo Bonzini                         arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
3366957b31f6SPhilippe Mathieu-Daudé  subdir('libdecnumber')
3367957b31f6SPhilippe Mathieu-Daudé  subdir('target')
3368957b31f6SPhilippe Mathieu-Daudéendif
3369abff1abfSPaolo Bonzini
3370478e943fSPaolo Bonzinisubdir('audio')
33717fcfd456SMarc-André Lureausubdir('io')
3372848e8ff6SMarc-André Lureausubdir('chardev')
3373ec0d5893SMarc-André Lureausubdir('fsdev')
3374708eab42SMarc-André Lureausubdir('dump')
3375ec0d5893SMarc-André Lureau
3376f285bd3fSPhilippe Mathieu-Daudéif have_block
33775e5733e5SMarc-André Lureau  block_ss.add(files(
33785e5733e5SMarc-André Lureau    'block.c',
33795e5733e5SMarc-André Lureau    'blockjob.c',
33805e5733e5SMarc-André Lureau    'job.c',
33815e5733e5SMarc-André Lureau    'qemu-io-cmds.c',
33825e5733e5SMarc-André Lureau  ))
3383406523f6SPaolo Bonzini  if config_host_data.get('CONFIG_REPLICATION')
3384406523f6SPaolo Bonzini    block_ss.add(files('replication.c'))
3385406523f6SPaolo Bonzini  endif
33865e5733e5SMarc-André Lureau
33875e5733e5SMarc-André Lureau  subdir('nbd')
33885e5733e5SMarc-André Lureau  subdir('scsi')
33895e5733e5SMarc-André Lureau  subdir('block')
33905e5733e5SMarc-André Lureau
33914a96337dSPaolo Bonzini  blockdev_ss.add(files(
33924a96337dSPaolo Bonzini    'blockdev.c',
3393cbc20bfbSStefan Hajnoczi    'blockdev-nbd.c',
33944a96337dSPaolo Bonzini    'iothread.c',
33954a96337dSPaolo Bonzini    'job-qmp.c',
33963eacf70bSRoman Bolshakov  ), gnutls)
33974a96337dSPaolo Bonzini
33984a96337dSPaolo Bonzini  # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
33994a96337dSPaolo Bonzini  # os-win32.c does not
34004a96337dSPaolo Bonzini  blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
34014a96337dSPaolo Bonzini  softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
3402f285bd3fSPhilippe Mathieu-Daudéendif
34034a96337dSPaolo Bonzini
34044a96337dSPaolo Bonzinicommon_ss.add(files('cpus-common.c'))
340531ffa2aaSPhilippe Mathieu-Daudéspecific_ss.add(files('cpu.c'))
34064a96337dSPaolo Bonzini
34075d3ea0e1SPaolo Bonzinisubdir('softmmu')
3408c9322ab5SMarc-André Lureau
340944b99a6dSRichard Henderson# Work around a gcc bug/misfeature wherein constant propagation looks
341044b99a6dSRichard Henderson# through an alias:
341144b99a6dSRichard Henderson#   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
341244b99a6dSRichard Henderson# to guess that a const variable is always zero.  Without lto, this is
341344b99a6dSRichard Henderson# impossible, as the alias is restricted to page-vary-common.c.  Indeed,
341444b99a6dSRichard Henderson# without lto, not even the alias is required -- we simply use different
341544b99a6dSRichard Henderson# declarations in different compilation units.
341644b99a6dSRichard Hendersonpagevary = files('page-vary-common.c')
341744b99a6dSRichard Hendersonif get_option('b_lto')
341844b99a6dSRichard Henderson  pagevary_flags = ['-fno-lto']
341944b99a6dSRichard Henderson  if get_option('cfi')
342044b99a6dSRichard Henderson    pagevary_flags += '-fno-sanitize=cfi-icall'
342144b99a6dSRichard Henderson  endif
342254c9b194SThomas Huth  pagevary = static_library('page-vary-common', sources: pagevary + genh,
342344b99a6dSRichard Henderson                            c_args: pagevary_flags)
342444b99a6dSRichard Henderson  pagevary = declare_dependency(link_with: pagevary)
342544b99a6dSRichard Hendersonendif
342644b99a6dSRichard Hendersoncommon_ss.add(pagevary)
34276670d4d0SRichard Hendersonspecific_ss.add(files('page-vary.c'))
34286670d4d0SRichard Henderson
3429ab318051SMarc-André Lureausubdir('backends')
3430c574e161SMarc-André Lureausubdir('disas')
343155166230SMarc-André Lureausubdir('migration')
3432ff219dcaSPaolo Bonzinisubdir('monitor')
3433cdaf0722SMarc-André Lureausubdir('net')
343417ef2af6SMarc-André Lureausubdir('replay')
34358df9f0c3SPhilippe Mathieu-Daudésubdir('semihosting')
3436aa09b3d5SMarkus Armbrustersubdir('stats')
3437104cc2c0SRichard Hendersonsubdir('tcg')
3438c6347541SRichard Hendersonsubdir('fpu')
34391a82878aSMarc-André Lureausubdir('accel')
3440f556b4a1SPaolo Bonzinisubdir('plugins')
3441bbf15aafSRichard Hendersonsubdir('ebpf')
3442bbf15aafSRichard Henderson
3443bbf15aafSRichard Hendersoncommon_user_inc = []
3444bbf15aafSRichard Henderson
3445bbf15aafSRichard Hendersonsubdir('common-user')
3446b309c321SMarc-André Lureausubdir('bsd-user')
34473a30446aSMarc-André Lureausubdir('linux-user')
344846627f41SAndrew Melnychenko
3449a2ce7dbdSPaolo Bonzini# needed for fuzzing binaries
3450a2ce7dbdSPaolo Bonzinisubdir('tests/qtest/libqos')
345164ed6f92SPaolo Bonzinisubdir('tests/qtest/fuzz')
3452a2ce7dbdSPaolo Bonzini
3453c94a7b88SGerd Hoffmann# accel modules
3454dae0ec15SGerd Hoffmanntcg_real_module_ss = ss.source_set()
3455dae0ec15SGerd Hoffmanntcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss)
3456dae0ec15SGerd Hoffmannspecific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss)
3457dae0ec15SGerd Hoffmanntarget_modules += { 'accel' : { 'qtest': qtest_module_ss,
3458dae0ec15SGerd Hoffmann                                'tcg': tcg_real_module_ss }}
3459c94a7b88SGerd Hoffmann
3460a0c9162cSPaolo Bonzini########################
3461a0c9162cSPaolo Bonzini# Library dependencies #
3462a0c9162cSPaolo Bonzini########################
3463a0c9162cSPaolo Bonzini
3464f5723ab6SGerd Hoffmannmodinfo_collect = find_program('scripts/modinfo-collect.py')
34655ebbfeccSGerd Hoffmannmodinfo_generate = find_program('scripts/modinfo-generate.py')
3466f5723ab6SGerd Hoffmannmodinfo_files = []
3467f5723ab6SGerd Hoffmann
34683154fee4SMarc-André Lureaublock_mods = []
34693154fee4SMarc-André Lureausoftmmu_mods = []
34703154fee4SMarc-André Lureauforeach d, list : modules
3471ef709860SPaolo Bonzini  if not (d == 'block' ? have_block : have_system)
3472ef709860SPaolo Bonzini    continue
3473ef709860SPaolo Bonzini  endif
3474ef709860SPaolo Bonzini
34753154fee4SMarc-André Lureau  foreach m, module_ss : list
34766002711cSPaolo Bonzini    if enable_modules
34773e292c51SGerd Hoffmann      module_ss = module_ss.apply(config_all, strict: false)
34783154fee4SMarc-André Lureau      sl = static_library(d + '-' + m, [genh, module_ss.sources()],
34793154fee4SMarc-André Lureau                          dependencies: [modulecommon, module_ss.dependencies()], pic: true)
34803154fee4SMarc-André Lureau      if d == 'block'
34813154fee4SMarc-André Lureau        block_mods += sl
34823154fee4SMarc-André Lureau      else
34833154fee4SMarc-André Lureau        softmmu_mods += sl
34843154fee4SMarc-André Lureau      endif
3485f5723ab6SGerd Hoffmann      if module_ss.sources() != []
3486f5723ab6SGerd Hoffmann        # FIXME: Should use sl.extract_all_objects(recursive: true) as
3487f5723ab6SGerd Hoffmann        # input. Sources can be used multiple times but objects are
3488f5723ab6SGerd Hoffmann        # unique when it comes to lookup in compile_commands.json.
3489f5723ab6SGerd Hoffmann        # Depnds on a mesion version with
3490f5723ab6SGerd Hoffmann        # https://github.com/mesonbuild/meson/pull/8900
3491f5723ab6SGerd Hoffmann        modinfo_files += custom_target(d + '-' + m + '.modinfo',
3492f5723ab6SGerd Hoffmann                                       output: d + '-' + m + '.modinfo',
3493ac347111SPaolo Bonzini                                       input: module_ss.sources() + genh,
3494f5723ab6SGerd Hoffmann                                       capture: true,
3495ac347111SPaolo Bonzini                                       command: [modinfo_collect, module_ss.sources()])
3496f5723ab6SGerd Hoffmann      endif
34973154fee4SMarc-André Lureau    else
34983154fee4SMarc-André Lureau      if d == 'block'
34993154fee4SMarc-André Lureau        block_ss.add_all(module_ss)
35003154fee4SMarc-André Lureau      else
35013154fee4SMarc-André Lureau        softmmu_ss.add_all(module_ss)
35023154fee4SMarc-André Lureau      endif
35033154fee4SMarc-André Lureau    endif
35043154fee4SMarc-André Lureau  endforeach
35053154fee4SMarc-André Lureauendforeach
35063154fee4SMarc-André Lureau
3507db2e89dfSGerd Hoffmannforeach d, list : target_modules
3508db2e89dfSGerd Hoffmann  foreach m, module_ss : list
35096002711cSPaolo Bonzini    if enable_modules
3510db2e89dfSGerd Hoffmann      foreach target : target_dirs
3511db2e89dfSGerd Hoffmann        if target.endswith('-softmmu')
3512db2e89dfSGerd Hoffmann          config_target = config_target_mak[target]
3513db2e89dfSGerd Hoffmann          config_target += config_host
3514db2e89dfSGerd Hoffmann          target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
3515db2e89dfSGerd Hoffmann          c_args = ['-DNEED_CPU_H',
3516db2e89dfSGerd Hoffmann                    '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3517db2e89dfSGerd Hoffmann                    '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3518db2e89dfSGerd Hoffmann          target_module_ss = module_ss.apply(config_target, strict: false)
3519db2e89dfSGerd Hoffmann          if target_module_ss.sources() != []
3520db2e89dfSGerd Hoffmann            module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
3521db2e89dfSGerd Hoffmann            sl = static_library(module_name,
3522db2e89dfSGerd Hoffmann                                [genh, target_module_ss.sources()],
3523db2e89dfSGerd Hoffmann                                dependencies: [modulecommon, target_module_ss.dependencies()],
3524db2e89dfSGerd Hoffmann                                include_directories: target_inc,
3525db2e89dfSGerd Hoffmann                                c_args: c_args,
3526db2e89dfSGerd Hoffmann                                pic: true)
3527db2e89dfSGerd Hoffmann            softmmu_mods += sl
3528db2e89dfSGerd Hoffmann            # FIXME: Should use sl.extract_all_objects(recursive: true) too.
3529db2e89dfSGerd Hoffmann            modinfo_files += custom_target(module_name + '.modinfo',
3530db2e89dfSGerd Hoffmann                                           output: module_name + '.modinfo',
3531917ddc27SGerd Hoffmann                                           input: target_module_ss.sources() + genh,
3532db2e89dfSGerd Hoffmann                                           capture: true,
3533917ddc27SGerd Hoffmann                                           command: [modinfo_collect, '--target', target, target_module_ss.sources()])
3534db2e89dfSGerd Hoffmann          endif
3535db2e89dfSGerd Hoffmann        endif
3536db2e89dfSGerd Hoffmann      endforeach
3537db2e89dfSGerd Hoffmann    else
3538db2e89dfSGerd Hoffmann      specific_ss.add_all(module_ss)
3539db2e89dfSGerd Hoffmann    endif
3540db2e89dfSGerd Hoffmann  endforeach
3541db2e89dfSGerd Hoffmannendforeach
3542db2e89dfSGerd Hoffmann
35435ebbfeccSGerd Hoffmannif enable_modules
354405d6814cSJose R. Ziviani  foreach target : target_dirs
354505d6814cSJose R. Ziviani    if target.endswith('-softmmu')
354605d6814cSJose R. Ziviani      config_target = config_target_mak[target]
354705d6814cSJose R. Ziviani      config_devices_mak = target + '-config-devices.mak'
354805d6814cSJose R. Ziviani      modinfo_src = custom_target('modinfo-' + target + '.c',
354905d6814cSJose R. Ziviani                                  output: 'modinfo-' + target + '.c',
35505ebbfeccSGerd Hoffmann                                  input: modinfo_files,
355105d6814cSJose R. Ziviani                                  command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'],
35525ebbfeccSGerd Hoffmann                                  capture: true)
355305d6814cSJose R. Ziviani
355405d6814cSJose R. Ziviani      modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src)
355505d6814cSJose R. Ziviani      modinfo_dep = declare_dependency(link_with: modinfo_lib)
355605d6814cSJose R. Ziviani
355705d6814cSJose R. Ziviani      arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH']
355805d6814cSJose R. Ziviani      hw_arch[arch].add(modinfo_dep)
355905d6814cSJose R. Ziviani    endif
356005d6814cSJose R. Ziviani  endforeach
35615ebbfeccSGerd Hoffmannendif
35625ebbfeccSGerd Hoffmann
35633154fee4SMarc-André Lureaunm = find_program('nm')
3564604f3e4eSYonggang Luoundefsym = find_program('scripts/undefsym.py')
35653154fee4SMarc-André Lureaublock_syms = custom_target('block.syms', output: 'block.syms',
35663154fee4SMarc-André Lureau                             input: [libqemuutil, block_mods],
35673154fee4SMarc-André Lureau                             capture: true,
35683154fee4SMarc-André Lureau                             command: [undefsym, nm, '@INPUT@'])
35693154fee4SMarc-André Lureauqemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
35703154fee4SMarc-André Lureau                             input: [libqemuutil, softmmu_mods],
35713154fee4SMarc-André Lureau                             capture: true,
35723154fee4SMarc-André Lureau                             command: [undefsym, nm, '@INPUT@'])
35733154fee4SMarc-André Lureau
357455567891SPhilippe Mathieu-Daudéauthz_ss = authz_ss.apply(config_host, strict: false)
357555567891SPhilippe Mathieu-Daudélibauthz = static_library('authz', authz_ss.sources() + genh,
357655567891SPhilippe Mathieu-Daudé                          dependencies: [authz_ss.dependencies()],
357755567891SPhilippe Mathieu-Daudé                          name_suffix: 'fa',
357855567891SPhilippe Mathieu-Daudé                          build_by_default: false)
357955567891SPhilippe Mathieu-Daudé
358055567891SPhilippe Mathieu-Daudéauthz = declare_dependency(link_whole: libauthz,
358155567891SPhilippe Mathieu-Daudé                           dependencies: qom)
358255567891SPhilippe Mathieu-Daudé
35832389304aSPhilippe Mathieu-Daudécrypto_ss = crypto_ss.apply(config_host, strict: false)
35842389304aSPhilippe Mathieu-Daudélibcrypto = static_library('crypto', crypto_ss.sources() + genh,
35852389304aSPhilippe Mathieu-Daudé                           dependencies: [crypto_ss.dependencies()],
35862389304aSPhilippe Mathieu-Daudé                           name_suffix: 'fa',
35872389304aSPhilippe Mathieu-Daudé                           build_by_default: false)
35882389304aSPhilippe Mathieu-Daudé
35892389304aSPhilippe Mathieu-Daudécrypto = declare_dependency(link_whole: libcrypto,
35902389304aSPhilippe Mathieu-Daudé                            dependencies: [authz, qom])
35912389304aSPhilippe Mathieu-Daudé
3592f78536b1SPhilippe Mathieu-Daudéio_ss = io_ss.apply(config_host, strict: false)
3593f78536b1SPhilippe Mathieu-Daudélibio = static_library('io', io_ss.sources() + genh,
3594f78536b1SPhilippe Mathieu-Daudé                       dependencies: [io_ss.dependencies()],
3595f78536b1SPhilippe Mathieu-Daudé                       link_with: libqemuutil,
3596f78536b1SPhilippe Mathieu-Daudé                       name_suffix: 'fa',
3597f78536b1SPhilippe Mathieu-Daudé                       build_by_default: false)
3598f78536b1SPhilippe Mathieu-Daudé
3599f78536b1SPhilippe Mathieu-Daudéio = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
3600f78536b1SPhilippe Mathieu-Daudé
36017e6edef3SPhilippe Mathieu-Daudélibmigration = static_library('migration', sources: migration_files + genh,
36027e6edef3SPhilippe Mathieu-Daudé                              name_suffix: 'fa',
36037e6edef3SPhilippe Mathieu-Daudé                              build_by_default: false)
36047e6edef3SPhilippe Mathieu-Daudémigration = declare_dependency(link_with: libmigration,
36057e6edef3SPhilippe Mathieu-Daudé                               dependencies: [zlib, qom, io])
36067e6edef3SPhilippe Mathieu-Daudésoftmmu_ss.add(migration)
36077e6edef3SPhilippe Mathieu-Daudé
36085e5733e5SMarc-André Lureaublock_ss = block_ss.apply(config_host, strict: false)
36095e5733e5SMarc-André Lureaulibblock = static_library('block', block_ss.sources() + genh,
36105e5733e5SMarc-André Lureau                          dependencies: block_ss.dependencies(),
36115e5733e5SMarc-André Lureau                          link_depends: block_syms,
36125e5733e5SMarc-André Lureau                          name_suffix: 'fa',
36135e5733e5SMarc-André Lureau                          build_by_default: false)
36145e5733e5SMarc-André Lureau
36155e5733e5SMarc-André Lureaublock = declare_dependency(link_whole: [libblock],
3616b7c70bf2SMarc-André Lureau                           link_args: '@block.syms',
3617b7c70bf2SMarc-André Lureau                           dependencies: [crypto, io])
36185e5733e5SMarc-André Lureau
36194fb9071fSStefan Hajnocziblockdev_ss = blockdev_ss.apply(config_host, strict: false)
36204fb9071fSStefan Hajnoczilibblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
36214fb9071fSStefan Hajnoczi                             dependencies: blockdev_ss.dependencies(),
36224fb9071fSStefan Hajnoczi                             name_suffix: 'fa',
36234fb9071fSStefan Hajnoczi                             build_by_default: false)
36244fb9071fSStefan Hajnoczi
36254fb9071fSStefan Hajnocziblockdev = declare_dependency(link_whole: [libblockdev],
36267d5983e3SNicolas Saenz Julienne                              dependencies: [block, event_loop_base])
36274fb9071fSStefan Hajnoczi
3628ff219dcaSPaolo Bonziniqmp_ss = qmp_ss.apply(config_host, strict: false)
3629ff219dcaSPaolo Bonzinilibqmp = static_library('qmp', qmp_ss.sources() + genh,
3630ff219dcaSPaolo Bonzini                        dependencies: qmp_ss.dependencies(),
3631ff219dcaSPaolo Bonzini                        name_suffix: 'fa',
3632ff219dcaSPaolo Bonzini                        build_by_default: false)
3633ff219dcaSPaolo Bonzini
3634ff219dcaSPaolo Bonziniqmp = declare_dependency(link_whole: [libqmp])
3635ff219dcaSPaolo Bonzini
3636c2306d71SPhilippe Mathieu-Daudélibchardev = static_library('chardev', chardev_ss.sources() + genh,
3637c2306d71SPhilippe Mathieu-Daudé                            name_suffix: 'fa',
363822d1f7a8SMarc-André Lureau                            dependencies: chardev_ss.dependencies(),
3639c2306d71SPhilippe Mathieu-Daudé                            build_by_default: false)
3640c2306d71SPhilippe Mathieu-Daudé
3641c2306d71SPhilippe Mathieu-Daudéchardev = declare_dependency(link_whole: libchardev)
3642c2306d71SPhilippe Mathieu-Daudé
3643f73fb063SPhilippe Mathieu-Daudéhwcore_ss = hwcore_ss.apply(config_host, strict: false)
3644f73fb063SPhilippe Mathieu-Daudélibhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
3645e28ab096SPhilippe Mathieu-Daudé                           name_suffix: 'fa',
3646e28ab096SPhilippe Mathieu-Daudé                           build_by_default: false)
3647e28ab096SPhilippe Mathieu-Daudéhwcore = declare_dependency(link_whole: libhwcore)
3648e28ab096SPhilippe Mathieu-Daudécommon_ss.add(hwcore)
3649e28ab096SPhilippe Mathieu-Daudé
3650064f8ee7SPhilippe Mathieu-Daudé###########
3651064f8ee7SPhilippe Mathieu-Daudé# Targets #
3652064f8ee7SPhilippe Mathieu-Daudé###########
3653064f8ee7SPhilippe Mathieu-Daudé
3654fb72176bSPaolo Bonziniemulator_modules = []
36553154fee4SMarc-André Lureauforeach m : block_mods + softmmu_mods
3656fb72176bSPaolo Bonzini  emulator_modules += shared_module(m.name(),
3657fb72176bSPaolo Bonzini                build_by_default: true,
36583154fee4SMarc-André Lureau                name_prefix: '',
36593154fee4SMarc-André Lureau                link_whole: m,
36603154fee4SMarc-André Lureau                install: true,
366116bf7a33SPaolo Bonzini                install_dir: qemu_moddir)
36623154fee4SMarc-André Lureauendforeach
3663d8f3a609SPaolo Bonziniif emulator_modules.length() > 0
3664d8f3a609SPaolo Bonzini  alias_target('modules', emulator_modules)
3665d8f3a609SPaolo Bonziniendif
36663154fee4SMarc-André Lureau
36674fb9071fSStefan Hajnoczisoftmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
366864ed6f92SPaolo Bonzinicommon_ss.add(qom, qemuutil)
366964ed6f92SPaolo Bonzini
367064ed6f92SPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
36712becc36aSPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
36722becc36aSPaolo Bonzini
36732becc36aSPaolo Bonzinicommon_all = common_ss.apply(config_all, strict: false)
36742becc36aSPaolo Bonzinicommon_all = static_library('common',
36752becc36aSPaolo Bonzini                            build_by_default: false,
36762becc36aSPaolo Bonzini                            sources: common_all.sources() + genh,
36779d24fb73SPaolo Bonzini                            include_directories: common_user_inc,
367875eebe0bSKatsuhiro Ueno                            implicit_include_directories: false,
36792becc36aSPaolo Bonzini                            dependencies: common_all.dependencies(),
36802becc36aSPaolo Bonzini                            name_suffix: 'fa')
36812becc36aSPaolo Bonzini
3682c9322ab5SMarc-André Lureaufeature_to_c = find_program('scripts/feature_to_c.sh')
3683c9322ab5SMarc-André Lureau
368430cfa50dSPhilippe Mathieu-Daudéif targetos == 'darwin'
368530cfa50dSPhilippe Mathieu-Daudé  entitlement = find_program('scripts/entitlement.sh')
368630cfa50dSPhilippe Mathieu-Daudéendif
368730cfa50dSPhilippe Mathieu-Daudé
3688fd5eef85SPaolo Bonziniemulators = {}
36892becc36aSPaolo Bonziniforeach target : target_dirs
36902becc36aSPaolo Bonzini  config_target = config_target_mak[target]
36912becc36aSPaolo Bonzini  target_name = config_target['TARGET_NAME']
3692ffb91f68SPaolo Bonzini  target_base_arch = config_target['TARGET_BASE_ARCH']
3693859aef02SPaolo Bonzini  arch_srcs = [config_target_h[target]]
369464ed6f92SPaolo Bonzini  arch_deps = []
369564ed6f92SPaolo Bonzini  c_args = ['-DNEED_CPU_H',
369664ed6f92SPaolo Bonzini            '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
369764ed6f92SPaolo Bonzini            '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3698b6c7cfd4SPaolo Bonzini  link_args = emulator_link_args
36992becc36aSPaolo Bonzini
3700859aef02SPaolo Bonzini  config_target += config_host
37012becc36aSPaolo Bonzini  target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
37022becc36aSPaolo Bonzini  if targetos == 'linux'
37032becc36aSPaolo Bonzini    target_inc += include_directories('linux-headers', is_system: true)
37042becc36aSPaolo Bonzini  endif
37052becc36aSPaolo Bonzini  if target.endswith('-softmmu')
37062becc36aSPaolo Bonzini    target_type='system'
3707ffb91f68SPaolo Bonzini    t = target_softmmu_arch[target_base_arch].apply(config_target, strict: false)
3708abff1abfSPaolo Bonzini    arch_srcs += t.sources()
370964ed6f92SPaolo Bonzini    arch_deps += t.dependencies()
3710abff1abfSPaolo Bonzini
3711ffb91f68SPaolo Bonzini    hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch
37122c44220dSMarc-André Lureau    hw = hw_arch[hw_dir].apply(config_target, strict: false)
37132c44220dSMarc-André Lureau    arch_srcs += hw.sources()
371464ed6f92SPaolo Bonzini    arch_deps += hw.dependencies()
37152c44220dSMarc-André Lureau
37162becc36aSPaolo Bonzini    arch_srcs += config_devices_h[target]
371764ed6f92SPaolo Bonzini    link_args += ['@block.syms', '@qemu.syms']
37182becc36aSPaolo Bonzini  else
37193a30446aSMarc-André Lureau    abi = config_target['TARGET_ABI_DIR']
37202becc36aSPaolo Bonzini    target_type='user'
3721a3a576b0SPaolo Bonzini    target_inc += common_user_inc
3722ffb91f68SPaolo Bonzini    if target_base_arch in target_user_arch
3723ffb91f68SPaolo Bonzini      t = target_user_arch[target_base_arch].apply(config_target, strict: false)
372446369b50SPhilippe Mathieu-Daudé      arch_srcs += t.sources()
372546369b50SPhilippe Mathieu-Daudé      arch_deps += t.dependencies()
372646369b50SPhilippe Mathieu-Daudé    endif
37272becc36aSPaolo Bonzini    if 'CONFIG_LINUX_USER' in config_target
37282becc36aSPaolo Bonzini      base_dir = 'linux-user'
3729e2a74729SWarner Losh    endif
3730e2a74729SWarner Losh    if 'CONFIG_BSD_USER' in config_target
37312becc36aSPaolo Bonzini      base_dir = 'bsd-user'
3732e2a74729SWarner Losh      target_inc += include_directories('bsd-user/' / targetos)
373385fc1b5dSWarner Losh      target_inc += include_directories('bsd-user/host/' / host_arch)
3734e2a74729SWarner Losh      dir = base_dir / abi
373519bf129fSWarner Losh      arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c')
37362becc36aSPaolo Bonzini    endif
37372becc36aSPaolo Bonzini    target_inc += include_directories(
37382becc36aSPaolo Bonzini      base_dir,
37393a30446aSMarc-André Lureau      base_dir / abi,
37402becc36aSPaolo Bonzini    )
37413a30446aSMarc-André Lureau    if 'CONFIG_LINUX_USER' in config_target
37423a30446aSMarc-André Lureau      dir = base_dir / abi
37433a30446aSMarc-André Lureau      arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
37443a30446aSMarc-André Lureau      if config_target.has_key('TARGET_SYSTBL_ABI')
37453a30446aSMarc-André Lureau        arch_srcs += \
37463a30446aSMarc-André Lureau          syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
37473a30446aSMarc-André Lureau                                             extra_args : config_target['TARGET_SYSTBL_ABI'])
37483a30446aSMarc-André Lureau      endif
37493a30446aSMarc-André Lureau    endif
37502becc36aSPaolo Bonzini  endif
37512becc36aSPaolo Bonzini
3752c9322ab5SMarc-André Lureau  if 'TARGET_XML_FILES' in config_target
3753c9322ab5SMarc-André Lureau    gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
3754c9322ab5SMarc-André Lureau                                output: target + '-gdbstub-xml.c',
3755c9322ab5SMarc-André Lureau                                input: files(config_target['TARGET_XML_FILES'].split()),
3756c9322ab5SMarc-André Lureau                                command: [feature_to_c, '@INPUT@'],
3757c9322ab5SMarc-André Lureau                                capture: true)
3758c9322ab5SMarc-André Lureau    arch_srcs += gdbstub_xml
3759c9322ab5SMarc-André Lureau  endif
3760c9322ab5SMarc-André Lureau
3761ffb91f68SPaolo Bonzini  t = target_arch[target_base_arch].apply(config_target, strict: false)
3762abff1abfSPaolo Bonzini  arch_srcs += t.sources()
376364ed6f92SPaolo Bonzini  arch_deps += t.dependencies()
3764abff1abfSPaolo Bonzini
37652becc36aSPaolo Bonzini  target_common = common_ss.apply(config_target, strict: false)
37662becc36aSPaolo Bonzini  objects = common_all.extract_objects(target_common.sources())
376764ed6f92SPaolo Bonzini  deps = target_common.dependencies()
37682becc36aSPaolo Bonzini
37692becc36aSPaolo Bonzini  target_specific = specific_ss.apply(config_target, strict: false)
37702becc36aSPaolo Bonzini  arch_srcs += target_specific.sources()
377164ed6f92SPaolo Bonzini  arch_deps += target_specific.dependencies()
37722becc36aSPaolo Bonzini
377364ed6f92SPaolo Bonzini  lib = static_library('qemu-' + target,
3774859aef02SPaolo Bonzini                 sources: arch_srcs + genh,
3775b7612f45SPaolo Bonzini                 dependencies: arch_deps,
37762becc36aSPaolo Bonzini                 objects: objects,
37772becc36aSPaolo Bonzini                 include_directories: target_inc,
377864ed6f92SPaolo Bonzini                 c_args: c_args,
377964ed6f92SPaolo Bonzini                 build_by_default: false,
37802becc36aSPaolo Bonzini                 name_suffix: 'fa')
378164ed6f92SPaolo Bonzini
378264ed6f92SPaolo Bonzini  if target.endswith('-softmmu')
378364ed6f92SPaolo Bonzini    execs = [{
378464ed6f92SPaolo Bonzini      'name': 'qemu-system-' + target_name,
3785654d6b04SPaolo Bonzini      'win_subsystem': 'console',
378664ed6f92SPaolo Bonzini      'sources': files('softmmu/main.c'),
378764ed6f92SPaolo Bonzini      'dependencies': []
378864ed6f92SPaolo Bonzini    }]
378935be72baSPaolo Bonzini    if targetos == 'windows' and (sdl.found() or gtk.found())
379064ed6f92SPaolo Bonzini      execs += [{
379164ed6f92SPaolo Bonzini        'name': 'qemu-system-' + target_name + 'w',
3792654d6b04SPaolo Bonzini        'win_subsystem': 'windows',
379364ed6f92SPaolo Bonzini        'sources': files('softmmu/main.c'),
379464ed6f92SPaolo Bonzini        'dependencies': []
379564ed6f92SPaolo Bonzini      }]
379664ed6f92SPaolo Bonzini    endif
3797537b7248SPaolo Bonzini    if get_option('fuzzing')
379864ed6f92SPaolo Bonzini      specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
379964ed6f92SPaolo Bonzini      execs += [{
380064ed6f92SPaolo Bonzini        'name': 'qemu-fuzz-' + target_name,
3801654d6b04SPaolo Bonzini        'win_subsystem': 'console',
380264ed6f92SPaolo Bonzini        'sources': specific_fuzz.sources(),
380364ed6f92SPaolo Bonzini        'dependencies': specific_fuzz.dependencies(),
380464ed6f92SPaolo Bonzini      }]
380564ed6f92SPaolo Bonzini    endif
380664ed6f92SPaolo Bonzini  else
380764ed6f92SPaolo Bonzini    execs = [{
380864ed6f92SPaolo Bonzini      'name': 'qemu-' + target_name,
3809654d6b04SPaolo Bonzini      'win_subsystem': 'console',
381064ed6f92SPaolo Bonzini      'sources': [],
381164ed6f92SPaolo Bonzini      'dependencies': []
381264ed6f92SPaolo Bonzini    }]
381364ed6f92SPaolo Bonzini  endif
381464ed6f92SPaolo Bonzini  foreach exe: execs
38158a74ce61SAlexander Graf    exe_name = exe['name']
38163983a767SJohn Arbuckle    if targetos == 'darwin'
38178a74ce61SAlexander Graf      exe_name += '-unsigned'
38188a74ce61SAlexander Graf    endif
38198a74ce61SAlexander Graf
38208a74ce61SAlexander Graf    emulator = executable(exe_name, exe['sources'],
3821237377acSAkihiko Odaki               install: true,
382264ed6f92SPaolo Bonzini               c_args: c_args,
382364ed6f92SPaolo Bonzini               dependencies: arch_deps + deps + exe['dependencies'],
382464ed6f92SPaolo Bonzini               objects: lib.extract_all_objects(recursive: true),
382564ed6f92SPaolo Bonzini               link_language: link_language,
382664ed6f92SPaolo Bonzini               link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
382764ed6f92SPaolo Bonzini               link_args: link_args,
3828654d6b04SPaolo Bonzini               win_subsystem: exe['win_subsystem'])
38298a74ce61SAlexander Graf
38303983a767SJohn Arbuckle    if targetos == 'darwin'
3831411ad8ddSAkihiko Odaki      icon = 'pc-bios/qemu.rsrc'
3832411ad8ddSAkihiko Odaki      build_input = [emulator, files(icon)]
3833411ad8ddSAkihiko Odaki      install_input = [
3834411ad8ddSAkihiko Odaki        get_option('bindir') / exe_name,
3835411ad8ddSAkihiko Odaki        meson.current_source_dir() / icon
3836411ad8ddSAkihiko Odaki      ]
3837411ad8ddSAkihiko Odaki      if 'CONFIG_HVF' in config_target
3838411ad8ddSAkihiko Odaki        entitlements = 'accel/hvf/entitlements.plist'
3839411ad8ddSAkihiko Odaki        build_input += files(entitlements)
3840411ad8ddSAkihiko Odaki        install_input += meson.current_source_dir() / entitlements
3841411ad8ddSAkihiko Odaki      endif
3842411ad8ddSAkihiko Odaki
38438a74ce61SAlexander Graf      emulators += {exe['name'] : custom_target(exe['name'],
3844411ad8ddSAkihiko Odaki                   input: build_input,
38458a74ce61SAlexander Graf                   output: exe['name'],
3846235b523dSPhilippe Mathieu-Daudé                   command: [entitlement, '@OUTPUT@', '@INPUT@'])
3847fd5eef85SPaolo Bonzini      }
3848237377acSAkihiko Odaki
3849235b523dSPhilippe Mathieu-Daudé      meson.add_install_script(entitlement, '--install',
3850237377acSAkihiko Odaki                               get_option('bindir') / exe['name'],
3851411ad8ddSAkihiko Odaki                               install_input)
38528a74ce61SAlexander Graf    else
38538a74ce61SAlexander Graf      emulators += {exe['name']: emulator}
38548a74ce61SAlexander Graf    endif
385510e1d263SMarc-André Lureau
38569c29b741SPaolo Bonzini    if stap.found()
385710e1d263SMarc-André Lureau      foreach stp: [
3858bd5f973aSStefan Hajnoczi        {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
3859bd5f973aSStefan Hajnoczi        {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
386010e1d263SMarc-André Lureau        {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
386110e1d263SMarc-André Lureau        {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
386210e1d263SMarc-André Lureau      ]
3863bd5f973aSStefan Hajnoczi        custom_target(exe['name'] + stp['ext'],
386410e1d263SMarc-André Lureau                      input: trace_events_all,
3865bd5f973aSStefan Hajnoczi                      output: exe['name'] + stp['ext'],
386610e1d263SMarc-André Lureau                      install: stp['install'],
386716bf7a33SPaolo Bonzini                      install_dir: get_option('datadir') / 'systemtap/tapset',
386810e1d263SMarc-André Lureau                      command: [
386910e1d263SMarc-André Lureau                        tracetool, '--group=all', '--format=' + stp['fmt'],
387010e1d263SMarc-André Lureau                        '--binary=' + stp['bin'],
387110e1d263SMarc-André Lureau                        '--target-name=' + target_name,
387210e1d263SMarc-André Lureau                        '--target-type=' + target_type,
387310e1d263SMarc-André Lureau                        '--probe-prefix=qemu.' + target_type + '.' + target_name,
3874c05012a3SStefan Hajnoczi                        '@INPUT@', '@OUTPUT@'
38750572d6cdSStefan Hajnoczi                      ],
38760572d6cdSStefan Hajnoczi                      depend_files: tracetool_depends)
387710e1d263SMarc-André Lureau      endforeach
387810e1d263SMarc-André Lureau    endif
387964ed6f92SPaolo Bonzini  endforeach
38802becc36aSPaolo Bonziniendforeach
38812becc36aSPaolo Bonzini
3882931049b4SPaolo Bonzini# Other build targets
3883897b5afaSMarc-André Lureau
3884f556b4a1SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host
3885f556b4a1SPaolo Bonzini  install_headers('include/qemu/qemu-plugin.h')
3886f556b4a1SPaolo Bonziniendif
3887f556b4a1SPaolo Bonzini
3888f15bff25SPaolo Bonzinisubdir('qga')
3889f15bff25SPaolo Bonzini
38909755c94aSLaurent Vivier# Don't build qemu-keymap if xkbcommon is not explicitly enabled
38919755c94aSLaurent Vivier# when we don't build tools or system
38924113f4cfSLaurent Vivierif xkbcommon.found()
389328742467SMarc-André Lureau  # used for the update-keymaps target, so include rules even if !have_tools
389428742467SMarc-André Lureau  qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
389528742467SMarc-André Lureau                           dependencies: [qemuutil, xkbcommon], install: have_tools)
389628742467SMarc-André Lureauendif
389728742467SMarc-André Lureau
3898931049b4SPaolo Bonziniif have_tools
3899b7c70bf2SMarc-André Lureau  qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
3900b7c70bf2SMarc-André Lureau             dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
3901b7c70bf2SMarc-André Lureau  qemu_io = executable('qemu-io', files('qemu-io.c'),
3902b7c70bf2SMarc-André Lureau             dependencies: [block, qemuutil], install: true)
3903b7c70bf2SMarc-André Lureau  qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
39043d212b41SRichard W.M. Jones               dependencies: [blockdev, qemuutil, gnutls, selinux],
39053d212b41SRichard W.M. Jones               install: true)
3906b7c70bf2SMarc-André Lureau
39077c58bb76SPaolo Bonzini  subdir('storage-daemon')
3908a9c9727cSPaolo Bonzini  subdir('contrib/rdmacm-mux')
39091d7bb6abSMarc-André Lureau  subdir('contrib/elf2dmp')
3910a9c9727cSPaolo Bonzini
3911157e7b13SMarc-André Lureau  executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
3912157e7b13SMarc-André Lureau             dependencies: qemuutil,
3913157e7b13SMarc-André Lureau             install: true)
3914157e7b13SMarc-André Lureau
39152a3129a3SPaolo Bonzini  if have_vhost_user
39162d7ac0afSPaolo Bonzini    subdir('contrib/vhost-user-blk')
3917ea458960SMarc-André Lureau    subdir('contrib/vhost-user-gpu')
391832fcc624SMarc-André Lureau    subdir('contrib/vhost-user-input')
391999650b62SPaolo Bonzini    subdir('contrib/vhost-user-scsi')
3920931049b4SPaolo Bonzini  endif
39218f51e01cSMarc-André Lureau
39228f51e01cSMarc-André Lureau  if targetos == 'linux'
39238f51e01cSMarc-André Lureau    executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
39248f51e01cSMarc-André Lureau               dependencies: [qemuutil, libcap_ng],
39258f51e01cSMarc-André Lureau               install: true,
39268f51e01cSMarc-André Lureau               install_dir: get_option('libexecdir'))
3927897b5afaSMarc-André Lureau
3928897b5afaSMarc-André Lureau    executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
3929897b5afaSMarc-André Lureau               dependencies: [authz, crypto, io, qom, qemuutil,
39306ec0e15dSPaolo Bonzini                              libcap_ng, mpathpersist],
3931897b5afaSMarc-André Lureau               install: true)
39328f51e01cSMarc-André Lureau  endif
39338f51e01cSMarc-André Lureau
3934ccd250aaSPaolo Bonzini  if have_ivshmem
39355ee24e78SMarc-André Lureau    subdir('contrib/ivshmem-client')
39365ee24e78SMarc-André Lureau    subdir('contrib/ivshmem-server')
39375ee24e78SMarc-André Lureau  endif
3938931049b4SPaolo Bonziniendif
3939931049b4SPaolo Bonzini
3940f5aa6320SMarc-André Lureausubdir('scripts')
39413f99cf57SPaolo Bonzinisubdir('tools')
3942bdcbea7aSMarc-André Lureausubdir('pc-bios')
3943f8aa24eaSPaolo Bonzinisubdir('docs')
3944e3667660SYonggang Luosubdir('tests')
39451b695471SPaolo Bonziniif gtk.found()
3946e8f3bd71SMarc-André Lureau  subdir('po')
3947e8f3bd71SMarc-André Lureauendif
39483f99cf57SPaolo Bonzini
39498adfeba9SMarc-André Lureauif host_machine.system() == 'windows'
39508adfeba9SMarc-André Lureau  nsis_cmd = [
39518adfeba9SMarc-André Lureau    find_program('scripts/nsis.py'),
39528adfeba9SMarc-André Lureau    '@OUTPUT@',
39538adfeba9SMarc-André Lureau    get_option('prefix'),
39548adfeba9SMarc-André Lureau    meson.current_source_dir(),
3955fc9a809eSPaolo Bonzini    glib_pc.get_variable('bindir'),
395624bdcc96SStefan Weil    host_machine.cpu(),
39578adfeba9SMarc-André Lureau    '--',
39588adfeba9SMarc-André Lureau    '-DDISPLAYVERSION=' + meson.project_version(),
39598adfeba9SMarc-André Lureau  ]
39608adfeba9SMarc-André Lureau  if build_docs
39618adfeba9SMarc-André Lureau    nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
39628adfeba9SMarc-André Lureau  endif
39631b695471SPaolo Bonzini  if gtk.found()
39648adfeba9SMarc-André Lureau    nsis_cmd += '-DCONFIG_GTK=y'
39658adfeba9SMarc-André Lureau  endif
39668adfeba9SMarc-André Lureau
39678adfeba9SMarc-André Lureau  nsis = custom_target('nsis',
39688adfeba9SMarc-André Lureau                       output: 'qemu-setup-' + meson.project_version() + '.exe',
39698adfeba9SMarc-André Lureau                       input: files('qemu.nsi'),
39708adfeba9SMarc-André Lureau                       build_always_stale: true,
39718adfeba9SMarc-André Lureau                       command: nsis_cmd + ['@INPUT@'])
39728adfeba9SMarc-André Lureau  alias_target('installer', nsis)
39738adfeba9SMarc-André Lureauendif
39748adfeba9SMarc-André Lureau
3975a0c9162cSPaolo Bonzini#########################
3976a0c9162cSPaolo Bonzini# Configuration summary #
3977a0c9162cSPaolo Bonzini#########################
3978a0c9162cSPaolo Bonzini
3979983d0a75SPhilippe Mathieu-Daudé# Directories
3980f9332757SPaolo Bonzinisummary_info = {}
398116bf7a33SPaolo Bonzinisummary_info += {'Install prefix':    get_option('prefix')}
398216bf7a33SPaolo Bonzinisummary_info += {'BIOS directory':    qemu_datadir}
39838154f5e6SAkihiko Odakipathsep = targetos == 'windows' ? ';' : ':'
39848154f5e6SAkihiko Odakisummary_info += {'firmware path':     pathsep.join(get_option('qemu_firmwarepath'))}
3985f7fb6c6aSPaolo Bonzinisummary_info += {'binary directory':  get_option('prefix') / get_option('bindir')}
3986f7fb6c6aSPaolo Bonzinisummary_info += {'library directory': get_option('prefix') / get_option('libdir')}
398716bf7a33SPaolo Bonzinisummary_info += {'module directory':  qemu_moddir}
3988f7fb6c6aSPaolo Bonzinisummary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')}
3989f7fb6c6aSPaolo Bonzinisummary_info += {'include directory': get_option('prefix') / get_option('includedir')}
3990f7fb6c6aSPaolo Bonzinisummary_info += {'config directory':  get_option('prefix') / get_option('sysconfdir')}
3991f9332757SPaolo Bonziniif targetos != 'windows'
3992f7fb6c6aSPaolo Bonzini  summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')}
3993f7fb6c6aSPaolo Bonzini  summary_info += {'Manual directory':      get_option('prefix') / get_option('mandir')}
3994f9332757SPaolo Bonzinielse
3995f9332757SPaolo Bonzini  summary_info += {'local state directory': 'queried at runtime'}
3996f9332757SPaolo Bonziniendif
3997f7fb6c6aSPaolo Bonzinisummary_info += {'Doc directory':     get_option('prefix') / get_option('docdir')}
3998f9332757SPaolo Bonzinisummary_info += {'Build directory':   meson.current_build_dir()}
3999f9332757SPaolo Bonzinisummary_info += {'Source path':       meson.current_source_dir()}
4000f9332757SPaolo Bonzinisummary_info += {'GIT submodules':    config_host['GIT_SUBMODULES']}
4001983d0a75SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Directories')
4002983d0a75SPhilippe Mathieu-Daudé
4003e11a0e17SPhilippe Mathieu-Daudé# Host binaries
4004983d0a75SPhilippe Mathieu-Daudésummary_info = {}
4005e11a0e17SPhilippe Mathieu-Daudésummary_info += {'git':               config_host['GIT']}
4006e11a0e17SPhilippe Mathieu-Daudésummary_info += {'make':              config_host['MAKE']}
4007e11a0e17SPhilippe Mathieu-Daudésummary_info += {'python':            '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
4008bb647c49SPaolo Bonzinisummary_info += {'sphinx-build':      sphinx_build}
4009e11a0e17SPhilippe Mathieu-Daudéif config_host.has_key('HAVE_GDB_BIN')
4010e11a0e17SPhilippe Mathieu-Daudé  summary_info += {'gdb':             config_host['HAVE_GDB_BIN']}
4011e11a0e17SPhilippe Mathieu-Daudéendif
401240c909f5SPaolo Bonzinisummary_info += {'iasl':              iasl}
4013e11a0e17SPhilippe Mathieu-Daudésummary_info += {'genisoimage':       config_host['GENISOIMAGE']}
401420cf5cb4SPaolo Bonziniif targetos == 'windows' and have_ga
4015bb647c49SPaolo Bonzini  summary_info += {'wixl':            wixl}
4016e11a0e17SPhilippe Mathieu-Daudéendif
40175890258aSThomas Huthif slirp.found() and have_system
401835acbb30SPaolo Bonzini  summary_info += {'smbd':            have_slirp_smbd ? smbd_path : false}
4019e11a0e17SPhilippe Mathieu-Daudéendif
4020e11a0e17SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Host binaries')
4021e11a0e17SPhilippe Mathieu-Daudé
40221d718865SPhilippe Mathieu-Daudé# Configurable features
40231d718865SPhilippe Mathieu-Daudésummary_info = {}
40241d718865SPhilippe Mathieu-Daudésummary_info += {'Documentation':     build_docs}
4025aa3ca634SPhilippe Mathieu-Daudésummary_info += {'system-mode emulation': have_system}
4026aa3ca634SPhilippe Mathieu-Daudésummary_info += {'user-mode emulation': have_user}
4027813803aaSPhilippe Mathieu-Daudésummary_info += {'block layer':       have_block}
40281d718865SPhilippe Mathieu-Daudésummary_info += {'Install blobs':     get_option('install_blobs')}
40296002711cSPaolo Bonzinisummary_info += {'module support':    enable_modules}
40306002711cSPaolo Bonziniif enable_modules
40312cb2f580SPaolo Bonzini  summary_info += {'alternative module path': get_option('module_upgrades')}
40321d718865SPhilippe Mathieu-Daudéendif
4033537b7248SPaolo Bonzinisummary_info += {'fuzzing support':   get_option('fuzzing')}
40341d718865SPhilippe Mathieu-Daudéif have_system
403587430d5bSPaolo Bonzini  summary_info += {'Audio drivers':     ' '.join(audio_drivers_selected)}
40361d718865SPhilippe Mathieu-Daudéendif
40379c29b741SPaolo Bonzinisummary_info += {'Trace backends':    ','.join(get_option('trace_backends'))}
40389c29b741SPaolo Bonziniif 'simple' in get_option('trace_backends')
40399c29b741SPaolo Bonzini  summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
40401d718865SPhilippe Mathieu-Daudéendif
4041142ca628SMarc-André Lureausummary_info += {'D-Bus display':     dbus_display}
4042c55cf6abSPaolo Bonzinisummary_info += {'QOM debugging':     get_option('qom_cast_debug')}
40432a3129a3SPaolo Bonzinisummary_info += {'vhost-kernel support': have_vhost_kernel}
40442a3129a3SPaolo Bonzinisummary_info += {'vhost-net support': have_vhost_net}
40452a3129a3SPaolo Bonzinisummary_info += {'vhost-user support': have_vhost_user}
40462a3129a3SPaolo Bonzinisummary_info += {'vhost-user-crypto support': have_vhost_user_crypto}
40471d718865SPhilippe Mathieu-Daudésummary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
40482a3129a3SPaolo Bonzinisummary_info += {'vhost-vdpa support': have_vhost_vdpa}
404920cf5cb4SPaolo Bonzinisummary_info += {'build guest agent': have_ga}
40501d718865SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Configurable features')
40511d718865SPhilippe Mathieu-Daudé
40522e864b8bSPhilippe Mathieu-Daudé# Compilation information
4053e11a0e17SPhilippe Mathieu-Daudésummary_info = {}
40542e864b8bSPhilippe Mathieu-Daudésummary_info += {'host CPU':          cpu}
40552e864b8bSPhilippe Mathieu-Daudésummary_info += {'host endianness':   build_machine.endian()}
405663de9353SAlex Bennéesummary_info += {'C compiler':        ' '.join(meson.get_compiler('c').cmd_array())}
405763de9353SAlex Bennéesummary_info += {'Host C compiler':   ' '.join(meson.get_compiler('c', native: true).cmd_array())}
4058f9332757SPaolo Bonziniif link_language == 'cpp'
405963de9353SAlex Bennée  summary_info += {'C++ compiler':    ' '.join(meson.get_compiler('cpp').cmd_array())}
4060f9332757SPaolo Bonzinielse
4061f9332757SPaolo Bonzini  summary_info += {'C++ compiler':      false}
4062f9332757SPaolo Bonziniendif
4063f9332757SPaolo Bonziniif targetos == 'darwin'
406463de9353SAlex Bennée  summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
4065f9332757SPaolo Bonziniendif
40666a97f393SPaolo Bonzinioption_cflags = (get_option('debug') ? ['-g'] : [])
40676a97f393SPaolo Bonziniif get_option('optimization') != 'plain'
40686a97f393SPaolo Bonzini  option_cflags += ['-O' + get_option('optimization')]
40696a97f393SPaolo Bonziniendif
40706a97f393SPaolo Bonzinisummary_info += {'CFLAGS':            ' '.join(get_option('c_args') + option_cflags)}
407147b30835SPaolo Bonziniif link_language == 'cpp'
40726a97f393SPaolo Bonzini  summary_info += {'CXXFLAGS':        ' '.join(get_option('cpp_args') + option_cflags)}
407347b30835SPaolo Bonziniendif
4074e910c7d9SPhilippe Mathieu-Daudéif targetos == 'darwin'
40756a97f393SPaolo Bonzini  summary_info += {'OBJCFLAGS':       ' '.join(get_option('objc_args') + option_cflags)}
4076e910c7d9SPhilippe Mathieu-Daudéendif
407747b30835SPaolo Bonzinilink_args = get_option(link_language + '_link_args')
407847b30835SPaolo Bonziniif link_args.length() > 0
407947b30835SPaolo Bonzini  summary_info += {'LDFLAGS':         ' '.join(link_args)}
408047b30835SPaolo Bonziniendif
4081d67212d4SPaolo Bonzinisummary_info += {'QEMU_CFLAGS':       ' '.join(qemu_common_flags + qemu_cflags)}
4082e5134024SPaolo Bonziniif 'cpp' in all_languages
4083d67212d4SPaolo Bonzini  summary_info += {'QEMU_CXXFLAGS':     ' '.join(qemu_common_flags + qemu_cxxflags)}
4084e5134024SPaolo Bonziniendif
4085e5134024SPaolo Bonziniif 'objc' in all_languages
408695caf1fbSPaolo Bonzini  summary_info += {'QEMU_OBJCFLAGS':    ' '.join(qemu_common_flags)}
4087e5134024SPaolo Bonziniendif
4088d065177eSPaolo Bonzinisummary_info += {'QEMU_LDFLAGS':      ' '.join(qemu_ldflags)}
4089c55cf6abSPaolo Bonzinisummary_info += {'profiler':          get_option('profiler')}
4090cdad781dSDaniele Buonosummary_info += {'link-time optimization (LTO)': get_option('b_lto')}
40912e864b8bSPhilippe Mathieu-Daudésummary_info += {'PIE':               get_option('b_pie')}
40923e8529ddSLaurent Viviersummary_info += {'static build':      config_host.has_key('CONFIG_STATIC')}
40932e864b8bSPhilippe Mathieu-Daudésummary_info += {'malloc trim support': has_malloc_trim}
4094b87df904SPaolo Bonzinisummary_info += {'membarrier':        have_membarrier}
409558a2e3f5SStefan Hajnoczisummary_info += {'debug graph lock':  get_option('debug_graph_lock')}
4096728c0a2fSPaolo Bonzinisummary_info += {'debug stack usage': get_option('debug_stack_usage')}
4097c55cf6abSPaolo Bonzinisummary_info += {'mutex debugging':   get_option('debug_mutex')}
40982e864b8bSPhilippe Mathieu-Daudésummary_info += {'memory allocator':  get_option('malloc')}
4099622753d2SPaolo Bonzinisummary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
410004ffce13Sling xusummary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')}
4101622753d2SPaolo Bonzinisummary_info += {'avx512f optimization': config_host_data.get('CONFIG_AVX512F_OPT')}
4102bb9ecae7SAlex Bennéeif get_option('gprof')
4103bb9ecae7SAlex Bennée  gprof_info = 'YES (deprecated)'
4104bb9ecae7SAlex Bennéeelse
4105bb9ecae7SAlex Bennée  gprof_info = get_option('gprof')
4106bb9ecae7SAlex Bennéeendif
4107bb9ecae7SAlex Bennéesummary_info += {'gprof':             gprof_info}
41082e864b8bSPhilippe Mathieu-Daudésummary_info += {'gcov':              get_option('b_coverage')}
410934f983d8SPaolo Bonzinisummary_info += {'thread sanitizer':  get_option('tsan')}
41102e864b8bSPhilippe Mathieu-Daudésummary_info += {'CFI support':       get_option('cfi')}
41112e864b8bSPhilippe Mathieu-Daudéif get_option('cfi')
41122e864b8bSPhilippe Mathieu-Daudé  summary_info += {'CFI debug support': get_option('cfi_debug')}
41132e864b8bSPhilippe Mathieu-Daudéendif
41142e864b8bSPhilippe Mathieu-Daudésummary_info += {'strip binaries':    get_option('strip')}
4115bb647c49SPaolo Bonzinisummary_info += {'sparse':            sparse}
41162e864b8bSPhilippe Mathieu-Daudésummary_info += {'mingw32 support':   targetos == 'windows'}
411712640f05SPaolo Bonzinisummary(summary_info, bool_yn: true, section: 'Compilation')
411849e8565bSAlex Bennée
411949e8565bSAlex Bennée# snarf the cross-compilation information for tests
412012640f05SPaolo Bonzinisummary_info = {}
412112640f05SPaolo Bonzinihave_cross = false
412249e8565bSAlex Bennéeforeach target: target_dirs
4123c7022a70SPaolo Bonzini  tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak'
412449e8565bSAlex Bennée  if fs.exists(tcg_mak)
412549e8565bSAlex Bennée    config_cross_tcg = keyval.load(tcg_mak)
412685b141eaSAlex Bennée    if 'CC' in config_cross_tcg
412712640f05SPaolo Bonzini      summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']}
412812640f05SPaolo Bonzini      have_cross = true
412949e8565bSAlex Bennée    endif
413049e8565bSAlex Bennée  endif
413149e8565bSAlex Bennéeendforeach
413212640f05SPaolo Bonziniif have_cross
413312640f05SPaolo Bonzini  summary(summary_info, bool_yn: true, section: 'Cross compilers')
413412640f05SPaolo Bonziniendif
41352e864b8bSPhilippe Mathieu-Daudé
4136aa3ca634SPhilippe Mathieu-Daudé# Targets and accelerators
41372e864b8bSPhilippe Mathieu-Daudésummary_info = {}
4138aa3ca634SPhilippe Mathieu-Daudéif have_system
4139aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'KVM support':       config_all.has_key('CONFIG_KVM')}
4140aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'HAX support':       config_all.has_key('CONFIG_HAX')}
4141aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'HVF support':       config_all.has_key('CONFIG_HVF')}
4142aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'WHPX support':      config_all.has_key('CONFIG_WHPX')}
414374a414a1SReinoud Zandijk  summary_info += {'NVMM support':      config_all.has_key('CONFIG_NVMM')}
414414efd8d3SPaolo Bonzini  summary_info += {'Xen support':       xen.found()}
414514efd8d3SPaolo Bonzini  if xen.found()
414614efd8d3SPaolo Bonzini    summary_info += {'xen ctrl version':  xen.version()}
4147aa3ca634SPhilippe Mathieu-Daudé  endif
4148820c1abaSDavid Woodhouse  summary_info += {'Xen emulation':     config_all.has_key('CONFIG_XEN_EMU')}
4149aa3ca634SPhilippe Mathieu-Daudéendif
4150aa3ca634SPhilippe Mathieu-Daudésummary_info += {'TCG support':       config_all.has_key('CONFIG_TCG')}
4151aa3ca634SPhilippe Mathieu-Daudéif config_all.has_key('CONFIG_TCG')
415239687acaSPhilippe Mathieu-Daudé  if get_option('tcg_interpreter')
4153f1f727acSPhilippe Mathieu-Daudé    summary_info += {'TCG backend':   'TCI (TCG with bytecode interpreter, slow)'}
415439687acaSPhilippe Mathieu-Daudé  else
415539687acaSPhilippe Mathieu-Daudé    summary_info += {'TCG backend':   'native (@0@)'.format(cpu)}
415639687acaSPhilippe Mathieu-Daudé  endif
4157029aa68fSAlex Bennée  summary_info += {'TCG plugins': config_host.has_key('CONFIG_PLUGIN')}
4158aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
4159aa3ca634SPhilippe Mathieu-Daudéendif
41602e864b8bSPhilippe Mathieu-Daudésummary_info += {'target list':       ' '.join(target_dirs)}
4161aa3ca634SPhilippe Mathieu-Daudéif have_system
4162aa3ca634SPhilippe Mathieu-Daudé  summary_info += {'default devices':   get_option('default_devices')}
4163106ad1f9SPaolo Bonzini  summary_info += {'out of process emulation': multiprocess_allowed}
416455116968SJagannathan Raman  summary_info += {'vfio-user server': vfio_user_server_allowed}
4165aa3ca634SPhilippe Mathieu-Daudéendif
4166aa3ca634SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Targets and accelerators')
4167aa3ca634SPhilippe Mathieu-Daudé
4168813803aaSPhilippe Mathieu-Daudé# Block layer
4169813803aaSPhilippe Mathieu-Daudésummary_info = {}
41706739825aSPaolo Bonzinisummary_info += {'coroutine backend': coroutine_backend}
4171728c0a2fSPaolo Bonzinisummary_info += {'coroutine pool':    have_coroutine_pool}
4172813803aaSPhilippe Mathieu-Daudéif have_block
4173622d64ffSPaolo Bonzini  summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')}
4174622d64ffSPaolo Bonzini  summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')}
4175c55cf6abSPaolo Bonzini  summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')}
41763887702eSChristian Schoenebeck  summary_info += {'VirtFS (9P) support':    have_virtfs}
41773887702eSChristian Schoenebeck  summary_info += {'VirtFS (9P) Proxy Helper support': have_virtfs_proxy_helper}
4178406523f6SPaolo Bonzini  summary_info += {'Live block migration': config_host_data.get('CONFIG_LIVE_BLOCK_MIGRATION')}
4179406523f6SPaolo Bonzini  summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')}
4180ed793c2cSPaolo Bonzini  summary_info += {'bochs support':     get_option('bochs').allowed()}
4181ed793c2cSPaolo Bonzini  summary_info += {'cloop support':     get_option('cloop').allowed()}
4182ed793c2cSPaolo Bonzini  summary_info += {'dmg support':       get_option('dmg').allowed()}
4183ed793c2cSPaolo Bonzini  summary_info += {'qcow v1 support':   get_option('qcow1').allowed()}
4184ed793c2cSPaolo Bonzini  summary_info += {'vdi support':       get_option('vdi').allowed()}
418511cea42eSVladimir Sementsov-Ogievskiy  summary_info += {'vhdx support':      get_option('vhdx').allowed()}
418611cea42eSVladimir Sementsov-Ogievskiy  summary_info += {'vmdk support':      get_option('vmdk').allowed()}
418711cea42eSVladimir Sementsov-Ogievskiy  summary_info += {'vpc support':       get_option('vpc').allowed()}
4188ed793c2cSPaolo Bonzini  summary_info += {'vvfat support':     get_option('vvfat').allowed()}
4189ed793c2cSPaolo Bonzini  summary_info += {'qed support':       get_option('qed').allowed()}
4190ed793c2cSPaolo Bonzini  summary_info += {'parallels support': get_option('parallels').allowed()}
4191bb647c49SPaolo Bonzini  summary_info += {'FUSE exports':      fuse}
41922a2359b8SXie Yongji  summary_info += {'VDUSE block exports': have_vduse_blk_export}
4193813803aaSPhilippe Mathieu-Daudéendif
4194813803aaSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Block layer support')
4195813803aaSPhilippe Mathieu-Daudé
4196aa58028aSPhilippe Mathieu-Daudé# Crypto
4197aa3ca634SPhilippe Mathieu-Daudésummary_info = {}
419841f2ae28SPaolo Bonzinisummary_info += {'TLS priority':      get_option('tls_priority')}
4199bb647c49SPaolo Bonzinisummary_info += {'GNUTLS support':    gnutls}
4200bb647c49SPaolo Bonziniif gnutls.found()
4201cc4c7c73SDaniel P. Berrangé  summary_info += {'  GNUTLS crypto':   gnutls_crypto.found()}
4202bb647c49SPaolo Bonziniendif
4203bb647c49SPaolo Bonzinisummary_info += {'libgcrypt':         gcrypt}
4204bb647c49SPaolo Bonzinisummary_info += {'nettle':            nettle}
420557612511SPaolo Bonziniif nettle.found()
420657612511SPaolo Bonzini   summary_info += {'  XTS':             xts != 'private'}
4207f9332757SPaolo Bonziniendif
420834b52615SPaolo Bonzinisummary_info += {'AF_ALG support':    have_afalg}
4209c55cf6abSPaolo Bonzinisummary_info += {'rng-none':          get_option('rng_none')}
42102edd2c04SPaolo Bonzinisummary_info += {'Linux keyring':     have_keyring}
4211aa58028aSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Crypto')
4212aa58028aSPhilippe Mathieu-Daudé
421369a78cceSPhilippe Mathieu-Daudé# Libraries
4214aa58028aSPhilippe Mathieu-Daudésummary_info = {}
4215aa58028aSPhilippe Mathieu-Daudéif targetos == 'darwin'
4216bb647c49SPaolo Bonzini  summary_info += {'Cocoa support':           cocoa}
4217e2c1d78dSVladislav Yaroshchuk  summary_info += {'vmnet.framework support': vmnet}
4218aa58028aSPhilippe Mathieu-Daudéendif
4219bb647c49SPaolo Bonzinisummary_info += {'SDL support':       sdl}
4220bb647c49SPaolo Bonzinisummary_info += {'SDL image support': sdl_image}
4221bb647c49SPaolo Bonzinisummary_info += {'GTK support':       gtk}
4222bb647c49SPaolo Bonzinisummary_info += {'pixman':            pixman}
4223bb647c49SPaolo Bonzinisummary_info += {'VTE support':       vte}
42245890258aSThomas Huthsummary_info += {'slirp support':     slirp}
4225bb647c49SPaolo Bonzinisummary_info += {'libtasn1':          tasn1}
4226bb647c49SPaolo Bonzinisummary_info += {'PAM':               pam}
4227bb647c49SPaolo Bonzinisummary_info += {'iconv support':     iconv}
4228bb647c49SPaolo Bonzinisummary_info += {'curses support':    curses}
4229bb647c49SPaolo Bonzinisummary_info += {'virgl support':     virgl}
4230fd66dbd4SStefan Hajnoczisummary_info += {'blkio support':     blkio}
4231bb647c49SPaolo Bonzinisummary_info += {'curl support':      curl}
4232bb647c49SPaolo Bonzinisummary_info += {'Multipath support': mpathpersist}
423395f8510eSKshitij Surisummary_info += {'PNG support':       png}
4234bb647c49SPaolo Bonzinisummary_info += {'VNC support':       vnc}
4235a0b93237SPaolo Bonziniif vnc.found()
4236bb647c49SPaolo Bonzini  summary_info += {'VNC SASL support':  sasl}
4237bb647c49SPaolo Bonzini  summary_info += {'VNC JPEG support':  jpeg}
4238f9332757SPaolo Bonziniendif
423987430d5bSPaolo Bonziniif targetos not in ['darwin', 'haiku', 'windows']
424087430d5bSPaolo Bonzini  summary_info += {'OSS support':     oss}
4241663df1ccSAlexandre Ratchov  summary_info += {'sndio support':   sndio}
424287430d5bSPaolo Bonzinielif targetos == 'darwin'
424387430d5bSPaolo Bonzini  summary_info += {'CoreAudio support': coreaudio}
424487430d5bSPaolo Bonzinielif targetos == 'windows'
424587430d5bSPaolo Bonzini  summary_info += {'DirectSound support': dsound}
424687430d5bSPaolo Bonziniendif
424787430d5bSPaolo Bonziniif targetos == 'linux'
424887430d5bSPaolo Bonzini  summary_info += {'ALSA support':    alsa}
424987430d5bSPaolo Bonzini  summary_info += {'PulseAudio support': pulse}
425087430d5bSPaolo Bonziniendif
4251c2d3d1c2SDorinda Basseysummary_info += {'Pipewire support':   pipewire}
425287430d5bSPaolo Bonzinisummary_info += {'JACK support':      jack}
4253bb647c49SPaolo Bonzinisummary_info += {'brlapi support':    brlapi}
4254e1723999SPaolo Bonzinisummary_info += {'vde support':       vde}
4255837b84b1SPaolo Bonzinisummary_info += {'netmap support':    have_netmap}
4256eea9453aSThomas Huthsummary_info += {'l2tpv3 support':    have_l2tpv3}
4257ff66f3e5SPaolo Bonzinisummary_info += {'Linux AIO support': libaio}
4258bb647c49SPaolo Bonzinisummary_info += {'Linux io_uring support': linux_io_uring}
4259bb647c49SPaolo Bonzinisummary_info += {'ATTR/XATTR support': libattr}
42603730a734SPaolo Bonzinisummary_info += {'RDMA support':      rdma}
42613730a734SPaolo Bonzinisummary_info += {'PVRDMA support':    have_pvrdma}
4262fbb4121dSPaolo Bonzinisummary_info += {'fdt support':       fdt_opt == 'disabled' ? false : fdt_opt}
4263bb647c49SPaolo Bonzinisummary_info += {'libcap-ng support': libcap_ng}
4264bb647c49SPaolo Bonzinisummary_info += {'bpf support':       libbpf}
42653f0a5d55SMarc-André Lureausummary_info += {'spice protocol support': spice_protocol}
42663f0a5d55SMarc-André Lureauif spice_protocol.found()
42673f0a5d55SMarc-André Lureau  summary_info += {'  spice server support': spice}
42683f0a5d55SMarc-André Lureauendif
4269bb647c49SPaolo Bonzinisummary_info += {'rbd support':       rbd}
4270bb647c49SPaolo Bonzinisummary_info += {'smartcard support': cacard}
4271bb647c49SPaolo Bonzinisummary_info += {'U2F support':       u2f}
4272bb647c49SPaolo Bonzinisummary_info += {'libusb':            libusb}
4273bb647c49SPaolo Bonzinisummary_info += {'usb net redir':     usbredir}
427488b6e618SPaolo Bonzinisummary_info += {'OpenGL support (epoxy)': opengl}
4275bb647c49SPaolo Bonzinisummary_info += {'GBM':               gbm}
4276bb647c49SPaolo Bonzinisummary_info += {'libiscsi support':  libiscsi}
4277bb647c49SPaolo Bonzinisummary_info += {'libnfs support':    libnfs}
4278f9332757SPaolo Bonziniif targetos == 'windows'
427920cf5cb4SPaolo Bonzini  if have_ga
42808821a389SMarc-André Lureau    summary_info += {'QGA VSS support':   have_qga_vss}
4281b846ab7cSPaolo Bonzini  endif
4282f9332757SPaolo Bonziniendif
4283bb647c49SPaolo Bonzinisummary_info += {'seccomp support':   seccomp}
4284bb647c49SPaolo Bonzinisummary_info += {'GlusterFS support': glusterfs}
42850d04c4c9SPaolo Bonzinisummary_info += {'TPM support':       have_tpm}
4286e6a52b36SThomas Huthsummary_info += {'libssh support':    libssh}
4287bb647c49SPaolo Bonzinisummary_info += {'lzo support':       lzo}
4288bb647c49SPaolo Bonzinisummary_info += {'snappy support':    snappy}
4289bb647c49SPaolo Bonzinisummary_info += {'bzip2 support':     libbzip2}
4290bb647c49SPaolo Bonzinisummary_info += {'lzfse support':     liblzfse}
4291bb647c49SPaolo Bonzinisummary_info += {'zstd support':      zstd}
4292488a8c73SPaolo Bonzinisummary_info += {'NUMA host support': numa}
429383602083SThomas Huthsummary_info += {'capstone':          capstone}
4294bb647c49SPaolo Bonzinisummary_info += {'libpmem support':   libpmem}
4295bb647c49SPaolo Bonzinisummary_info += {'libdaxctl support': libdaxctl}
4296bb647c49SPaolo Bonzinisummary_info += {'libudev':           libudev}
4297bb647c49SPaolo Bonzini# Dummy dependency, keep .found()
4298df4ea709SMax Reitzsummary_info += {'FUSE lseek':        fuse_lseek.found()}
42993d212b41SRichard W.M. Jonessummary_info += {'selinux':           selinux}
43007c10cb38SIlya Leoshkevichsummary_info += {'libdw':             libdw}
430169a78cceSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Dependencies')
4302f9332757SPaolo Bonzini
4303f9332757SPaolo Bonziniif not supported_cpus.contains(cpu)
4304f9332757SPaolo Bonzini  message()
4305f9332757SPaolo Bonzini  warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
4306f9332757SPaolo Bonzini  message()
4307f9332757SPaolo Bonzini  message('CPU host architecture ' + cpu + ' support is not currently maintained.')
4308f9332757SPaolo Bonzini  message('The QEMU project intends to remove support for this host CPU in')
4309f9332757SPaolo Bonzini  message('a future release if nobody volunteers to maintain it and to')
4310f9332757SPaolo Bonzini  message('provide a build host for our continuous integration setup.')
4311f9332757SPaolo Bonzini  message('configure has succeeded and you can continue to build, but')
4312f9332757SPaolo Bonzini  message('if you care about QEMU on this platform you should contact')
4313f9332757SPaolo Bonzini  message('us upstream at qemu-devel@nongnu.org.')
4314f9332757SPaolo Bonziniendif
4315f9332757SPaolo Bonzini
4316f9332757SPaolo Bonziniif not supported_oses.contains(targetos)
4317f9332757SPaolo Bonzini  message()
4318f9332757SPaolo Bonzini  warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
4319f9332757SPaolo Bonzini  message()
4320f9332757SPaolo Bonzini  message('Host OS ' + targetos + 'support is not currently maintained.')
4321f9332757SPaolo Bonzini  message('The QEMU project intends to remove support for this host OS in')
4322f9332757SPaolo Bonzini  message('a future release if nobody volunteers to maintain it and to')
4323f9332757SPaolo Bonzini  message('provide a build host for our continuous integration setup.')
4324f9332757SPaolo Bonzini  message('configure has succeeded and you can continue to build, but')
4325f9332757SPaolo Bonzini  message('if you care about QEMU on this platform you should contact')
4326f9332757SPaolo Bonzini  message('us upstream at qemu-devel@nongnu.org.')
4327f9332757SPaolo Bonziniendif
4328