xref: /openbmc/qemu/configure (revision f101c9fe)
1#!/bin/sh
2#
3# qemu configure script (c) 2003 Fabrice Bellard
4#
5
6# Unset some variables known to interfere with behavior of common tools,
7# just as autoconf does.
8CLICOLOR_FORCE= GREP_OPTIONS=
9unset CLICOLOR_FORCE GREP_OPTIONS
10
11# Don't allow CCACHE, if present, to use cached results of compile tests!
12export CCACHE_RECACHE=yes
13
14# make source path absolute
15source_path=$(cd "$(dirname -- "$0")"; pwd)
16
17if test "$PWD" = "$source_path"
18then
19    echo "Using './build' as the directory for build output"
20
21    MARKER=build/auto-created-by-configure
22
23    if test -e build
24    then
25        if test -f $MARKER
26        then
27           rm -rf build
28        else
29            echo "ERROR: ./build dir already exists and was not previously created by configure"
30            exit 1
31        fi
32    fi
33
34    mkdir build
35    touch $MARKER
36
37    cat > GNUmakefile <<'EOF'
38# This file is auto-generated by configure to support in-source tree
39# 'make' command invocation
40
41ifeq ($(MAKECMDGOALS),)
42recurse: all
43endif
44
45.NOTPARALLEL: %
46%: force
47	@echo 'changing dir to build for $(MAKE) "$(MAKECMDGOALS)"...'
48	@$(MAKE) -C build -f Makefile $(MAKECMDGOALS)
49	@if test "$(MAKECMDGOALS)" = "distclean" && \
50	    test -e build/auto-created-by-configure ; \
51	then \
52	    rm -rf build GNUmakefile ; \
53	fi
54force: ;
55.PHONY: force
56GNUmakefile: ;
57
58EOF
59    cd build
60    exec $source_path/configure "$@"
61fi
62
63# Temporary directory used for files created while
64# configure runs. Since it is in the build directory
65# we can safely blow away any previous version of it
66# (and we need not jump through hoops to try to delete
67# it when configure exits.)
68TMPDIR1="config-temp"
69rm -rf "${TMPDIR1}"
70mkdir -p "${TMPDIR1}"
71if [ $? -ne 0 ]; then
72    echo "ERROR: failed to create temporary directory"
73    exit 1
74fi
75
76TMPB="qemu-conf"
77TMPC="${TMPDIR1}/${TMPB}.c"
78TMPO="${TMPDIR1}/${TMPB}.o"
79TMPCXX="${TMPDIR1}/${TMPB}.cxx"
80TMPE="${TMPDIR1}/${TMPB}.exe"
81TMPTXT="${TMPDIR1}/${TMPB}.txt"
82
83rm -f config.log
84
85# Print a helpful header at the top of config.log
86echo "# QEMU configure log $(date)" >> config.log
87printf "# Configured with:" >> config.log
88printf " '%s'" "$0" "$@" >> config.log
89echo >> config.log
90echo "#" >> config.log
91
92quote_sh() {
93    printf "%s" "$1" | sed "s,','\\\\'',g; s,.*,'&',"
94}
95
96print_error() {
97    (echo
98    echo "ERROR: $1"
99    while test -n "$2"; do
100        echo "       $2"
101        shift
102    done
103    echo) >&2
104}
105
106error_exit() {
107    print_error "$@"
108    exit 1
109}
110
111do_compiler() {
112    # Run the compiler, capturing its output to the log. First argument
113    # is compiler binary to execute.
114    compiler="$1"
115    shift
116    if test -n "$BASH_VERSION"; then eval '
117        echo >>config.log "
118funcs: ${FUNCNAME[*]}
119lines: ${BASH_LINENO[*]}"
120    '; fi
121    echo $compiler "$@" >> config.log
122    $compiler "$@" >> config.log 2>&1 || return $?
123    # Test passed. If this is an --enable-werror build, rerun
124    # the test with -Werror and bail out if it fails. This
125    # makes warning-generating-errors in configure test code
126    # obvious to developers.
127    if test "$werror" != "yes"; then
128        return 0
129    fi
130    # Don't bother rerunning the compile if we were already using -Werror
131    case "$*" in
132        *-Werror*)
133           return 0
134        ;;
135    esac
136    echo $compiler -Werror "$@" >> config.log
137    $compiler -Werror "$@" >> config.log 2>&1 && return $?
138    error_exit "configure test passed without -Werror but failed with -Werror." \
139        "This is probably a bug in the configure script. The failing command" \
140        "will be at the bottom of config.log." \
141        "You can run configure with --disable-werror to bypass this check."
142}
143
144do_cc() {
145    do_compiler "$cc" "$@"
146}
147
148do_cxx() {
149    do_compiler "$cxx" "$@"
150}
151
152# Append $2 to the variable named $1, with space separation
153add_to() {
154    eval $1=\${$1:+\"\$$1 \"}\$2
155}
156
157update_cxxflags() {
158    # Set QEMU_CXXFLAGS from QEMU_CFLAGS by filtering out those
159    # options which some versions of GCC's C++ compiler complain about
160    # because they only make sense for C programs.
161    QEMU_CXXFLAGS="$QEMU_CXXFLAGS -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"
162    CONFIGURE_CXXFLAGS=$(echo "$CONFIGURE_CFLAGS" | sed s/-std=gnu11/-std=gnu++11/)
163    for arg in $QEMU_CFLAGS; do
164        case $arg in
165            -Wstrict-prototypes|-Wmissing-prototypes|-Wnested-externs|\
166            -Wold-style-declaration|-Wold-style-definition|-Wredundant-decls)
167                ;;
168            *)
169                QEMU_CXXFLAGS=${QEMU_CXXFLAGS:+$QEMU_CXXFLAGS }$arg
170                ;;
171        esac
172    done
173}
174
175compile_object() {
176  local_cflags="$1"
177  do_cc $CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
178}
179
180compile_prog() {
181  local_cflags="$1"
182  local_ldflags="$2"
183  do_cc $CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC \
184      $LDFLAGS $CONFIGURE_LDFLAGS $QEMU_LDFLAGS $local_ldflags
185}
186
187# symbolically link $1 to $2.  Portable version of "ln -sf".
188symlink() {
189  rm -rf "$2"
190  mkdir -p "$(dirname "$2")"
191  ln -s "$1" "$2"
192}
193
194# check whether a command is available to this shell (may be either an
195# executable or a builtin)
196has() {
197    type "$1" >/dev/null 2>&1
198}
199
200version_ge () {
201    local_ver1=$(expr "$1" : '\([0-9.]*\)' | tr . ' ')
202    local_ver2=$(echo "$2" | tr . ' ')
203    while true; do
204        set x $local_ver1
205        local_first=${2-0}
206        # 'shift 2' if $2 is set, or 'shift' if $2 is not set
207        shift ${2:+2}
208        local_ver1=$*
209        set x $local_ver2
210        # the second argument finished, the first must be greater or equal
211        test $# = 1 && return 0
212        test $local_first -lt $2 && return 1
213        test $local_first -gt $2 && return 0
214        shift ${2:+2}
215        local_ver2=$*
216    done
217}
218
219have_backend () {
220    echo "$trace_backends" | grep "$1" >/dev/null
221}
222
223glob() {
224    eval test -z '"${1#'"$2"'}"'
225}
226
227ld_has() {
228    $ld --help 2>/dev/null | grep ".$1" >/dev/null 2>&1
229}
230
231if printf %s\\n "$source_path" "$PWD" | grep -q "[[:space:]:]";
232then
233  error_exit "main directory cannot contain spaces nor colons"
234fi
235
236# default parameters
237cpu=""
238iasl="iasl"
239interp_prefix="/usr/gnemul/qemu-%M"
240static="no"
241cross_compile="no"
242cross_prefix=""
243audio_drv_list=""
244block_drv_rw_whitelist=""
245block_drv_ro_whitelist=""
246host_cc="cc"
247audio_win_int=""
248libs_qga=""
249debug_info="yes"
250lto="false"
251stack_protector=""
252safe_stack=""
253use_containers="yes"
254gdb_bin=$(command -v "gdb-multiarch" || command -v "gdb")
255
256if test -e "$source_path/.git"
257then
258    git_submodules_action="update"
259else
260    git_submodules_action="ignore"
261fi
262
263git_submodules="ui/keycodemapdb"
264git="git"
265
266# Don't accept a target_list environment variable.
267unset target_list
268unset target_list_exclude
269
270# Default value for a variable defining feature "foo".
271#  * foo="no"  feature will only be used if --enable-foo arg is given
272#  * foo=""    feature will be searched for, and if found, will be used
273#              unless --disable-foo is given
274#  * foo="yes" this value will only be set by --enable-foo flag.
275#              feature will searched for,
276#              if not found, configure exits with error
277#
278# Always add --enable-foo and --disable-foo command line args.
279# Distributions want to ensure that several features are compiled in, and it
280# is impossible without a --enable-foo that exits if a feature is not found.
281
282default_feature=""
283# parse CC options second
284for opt do
285  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
286  case "$opt" in
287      --without-default-features)
288          default_feature="no"
289  ;;
290  esac
291done
292
293brlapi="auto"
294curl="auto"
295iconv="auto"
296curses="auto"
297docs="auto"
298fdt="auto"
299netmap="no"
300sdl="auto"
301sdl_image="auto"
302coreaudio="auto"
303virtiofsd="auto"
304virtfs="auto"
305libudev="auto"
306mpath="auto"
307vnc="enabled"
308sparse="auto"
309vde="$default_feature"
310vnc_sasl="auto"
311vnc_jpeg="auto"
312vnc_png="auto"
313xkbcommon="auto"
314xen="$default_feature"
315xen_ctrl_version="$default_feature"
316xen_pci_passthrough="auto"
317linux_aio="$default_feature"
318linux_io_uring="$default_feature"
319cap_ng="auto"
320attr="auto"
321xfs="$default_feature"
322tcg="enabled"
323membarrier="$default_feature"
324vhost_net="$default_feature"
325vhost_crypto="$default_feature"
326vhost_scsi="$default_feature"
327vhost_vsock="$default_feature"
328vhost_user="no"
329vhost_user_blk_server="auto"
330vhost_user_fs="$default_feature"
331bpf="auto"
332kvm="auto"
333hax="auto"
334hvf="auto"
335whpx="auto"
336nvmm="auto"
337rdma="$default_feature"
338pvrdma="$default_feature"
339gprof="no"
340debug_tcg="no"
341debug="no"
342sanitizers="no"
343tsan="no"
344fortify_source="$default_feature"
345strip_opt="yes"
346tcg_interpreter="false"
347bigendian="no"
348mingw32="no"
349gcov="no"
350EXESUF=""
351HOST_DSOSUF=".so"
352modules="no"
353module_upgrades="no"
354prefix="/usr/local"
355qemu_suffix="qemu"
356slirp="auto"
357oss_lib=""
358bsd="no"
359linux="no"
360solaris="no"
361profiler="no"
362cocoa="auto"
363softmmu="yes"
364linux_user="no"
365bsd_user="no"
366blobs="true"
367pkgversion=""
368pie=""
369qom_cast_debug="yes"
370trace_backends="log"
371trace_file="trace"
372spice="$default_feature"
373spice_protocol="auto"
374rbd="auto"
375smartcard="$default_feature"
376u2f="auto"
377libusb="$default_feature"
378usb_redir="$default_feature"
379opengl="$default_feature"
380cpuid_h="no"
381avx2_opt="$default_feature"
382capstone="auto"
383lzo="auto"
384snappy="auto"
385bzip2="auto"
386lzfse="auto"
387zstd="auto"
388guest_agent="$default_feature"
389guest_agent_with_vss="no"
390guest_agent_ntddscsi="no"
391guest_agent_msi="auto"
392vss_win32_sdk="$default_feature"
393win_sdk="no"
394want_tools="$default_feature"
395libiscsi="auto"
396libnfs="auto"
397coroutine=""
398coroutine_pool="$default_feature"
399debug_stack_usage="no"
400crypto_afalg="no"
401cfi="false"
402cfi_debug="false"
403seccomp="auto"
404glusterfs="auto"
405gtk="auto"
406tls_priority="NORMAL"
407gnutls="$default_feature"
408nettle="$default_feature"
409nettle_xts="no"
410gcrypt="$default_feature"
411gcrypt_xts="no"
412qemu_private_xts="yes"
413auth_pam="$default_feature"
414vte="$default_feature"
415virglrenderer="$default_feature"
416tpm="$default_feature"
417libssh="$default_feature"
418live_block_migration=${default_feature:-yes}
419numa="$default_feature"
420tcmalloc="no"
421jemalloc="no"
422replication=${default_feature:-yes}
423bochs=${default_feature:-yes}
424cloop=${default_feature:-yes}
425dmg=${default_feature:-yes}
426qcow1=${default_feature:-yes}
427vdi=${default_feature:-yes}
428vvfat=${default_feature:-yes}
429qed=${default_feature:-yes}
430parallels=${default_feature:-yes}
431libxml2="$default_feature"
432debug_mutex="no"
433libpmem="$default_feature"
434default_devices="true"
435plugins="no"
436fuzzing="no"
437rng_none="no"
438secret_keyring="$default_feature"
439libdaxctl="$default_feature"
440meson=""
441ninja=""
442skip_meson=no
443gettext="auto"
444fuse="auto"
445fuse_lseek="auto"
446multiprocess="auto"
447slirp_smbd="$default_feature"
448
449malloc_trim="auto"
450gio="$default_feature"
451
452# parse CC options second
453for opt do
454  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
455  case "$opt" in
456  --cross-prefix=*) cross_prefix="$optarg"
457                    cross_compile="yes"
458  ;;
459  --cc=*) CC="$optarg"
460  ;;
461  --cxx=*) CXX="$optarg"
462  ;;
463  --cpu=*) cpu="$optarg"
464  ;;
465  --extra-cflags=*) QEMU_CFLAGS="$QEMU_CFLAGS $optarg"
466                    QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg"
467  ;;
468  --extra-cxxflags=*) QEMU_CXXFLAGS="$QEMU_CXXFLAGS $optarg"
469  ;;
470  --extra-ldflags=*) QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg"
471                     EXTRA_LDFLAGS="$optarg"
472  ;;
473  --enable-debug-info) debug_info="yes"
474  ;;
475  --disable-debug-info) debug_info="no"
476  ;;
477  --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"
478  ;;
479  --cross-cc-cflags-*) cc_arch=${opt#--cross-cc-flags-}; cc_arch=${cc_arch%%=*}
480                      eval "cross_cc_cflags_${cc_arch}=\$optarg"
481                      cross_cc_vars="$cross_cc_vars cross_cc_cflags_${cc_arch}"
482  ;;
483  --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}
484                cc_archs="$cc_archs $cc_arch"
485                eval "cross_cc_${cc_arch}=\$optarg"
486                cross_cc_vars="$cross_cc_vars cross_cc_${cc_arch}"
487  ;;
488  esac
489done
490# OS specific
491# Using uname is really, really broken.  Once we have the right set of checks
492# we can eliminate its usage altogether.
493
494# Preferred compiler:
495#  ${CC} (if set)
496#  ${cross_prefix}gcc (if cross-prefix specified)
497#  system compiler
498if test -z "${CC}${cross_prefix}"; then
499  cc="$host_cc"
500else
501  cc="${CC-${cross_prefix}gcc}"
502fi
503
504if test -z "${CXX}${cross_prefix}"; then
505  cxx="c++"
506else
507  cxx="${CXX-${cross_prefix}g++}"
508fi
509
510ar="${AR-${cross_prefix}ar}"
511as="${AS-${cross_prefix}as}"
512ccas="${CCAS-$cc}"
513cpp="${CPP-$cc -E}"
514objcopy="${OBJCOPY-${cross_prefix}objcopy}"
515ld="${LD-${cross_prefix}ld}"
516ranlib="${RANLIB-${cross_prefix}ranlib}"
517nm="${NM-${cross_prefix}nm}"
518strip="${STRIP-${cross_prefix}strip}"
519windres="${WINDRES-${cross_prefix}windres}"
520pkg_config_exe="${PKG_CONFIG-${cross_prefix}pkg-config}"
521query_pkg_config() {
522    "${pkg_config_exe}" ${QEMU_PKG_CONFIG_FLAGS} "$@"
523}
524pkg_config=query_pkg_config
525sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
526
527# If the user hasn't specified ARFLAGS, default to 'rv', just as make does.
528ARFLAGS="${ARFLAGS-rv}"
529
530# default flags for all hosts
531# We use -fwrapv to tell the compiler that we require a C dialect where
532# left shift of signed integers is well defined and has the expected
533# 2s-complement style results. (Both clang and gcc agree that it
534# provides these semantics.)
535QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv $QEMU_CFLAGS"
536QEMU_CFLAGS="-Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS"
537QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS"
538QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
539
540# Flags that are needed during configure but later taken care of by Meson
541CONFIGURE_CFLAGS="-std=gnu11 -Wall"
542CONFIGURE_LDFLAGS=
543
544
545check_define() {
546cat > $TMPC <<EOF
547#if !defined($1)
548#error $1 not defined
549#endif
550int main(void) { return 0; }
551EOF
552  compile_object
553}
554
555check_include() {
556cat > $TMPC <<EOF
557#include <$1>
558int main(void) { return 0; }
559EOF
560  compile_object
561}
562
563write_c_skeleton() {
564    cat > $TMPC <<EOF
565int main(void) { return 0; }
566EOF
567}
568
569write_c_fuzzer_skeleton() {
570    cat > $TMPC <<EOF
571#include <stdint.h>
572#include <sys/types.h>
573int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
574int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
575EOF
576}
577
578if check_define __linux__ ; then
579  targetos="Linux"
580elif check_define _WIN32 ; then
581  targetos='MINGW32'
582elif check_define __OpenBSD__ ; then
583  targetos='OpenBSD'
584elif check_define __sun__ ; then
585  targetos='SunOS'
586elif check_define __HAIKU__ ; then
587  targetos='Haiku'
588elif check_define __FreeBSD__ ; then
589  targetos='FreeBSD'
590elif check_define __FreeBSD_kernel__ && check_define __GLIBC__; then
591  targetos='GNU/kFreeBSD'
592elif check_define __DragonFly__ ; then
593  targetos='DragonFly'
594elif check_define __NetBSD__; then
595  targetos='NetBSD'
596elif check_define __APPLE__; then
597  targetos='Darwin'
598else
599  # This is a fatal error, but don't report it yet, because we
600  # might be going to just print the --help text, or it might
601  # be the result of a missing compiler.
602  targetos='bogus'
603fi
604
605# Some host OSes need non-standard checks for which CPU to use.
606# Note that these checks are broken for cross-compilation: if you're
607# cross-compiling to one of these OSes then you'll need to specify
608# the correct CPU with the --cpu option.
609case $targetos in
610Darwin)
611  HOST_DSOSUF=".dylib"
612  ;;
613SunOS)
614  # $(uname -m) returns i86pc even on an x86_64 box, so default based on isainfo
615  if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then
616    cpu="x86_64"
617  fi
618esac
619
620if test ! -z "$cpu" ; then
621  # command line argument
622  :
623elif check_define __i386__ ; then
624  cpu="i386"
625elif check_define __x86_64__ ; then
626  if check_define __ILP32__ ; then
627    cpu="x32"
628  else
629    cpu="x86_64"
630  fi
631elif check_define __sparc__ ; then
632  if check_define __arch64__ ; then
633    cpu="sparc64"
634  else
635    cpu="sparc"
636  fi
637elif check_define _ARCH_PPC ; then
638  if check_define _ARCH_PPC64 ; then
639    if check_define _LITTLE_ENDIAN ; then
640      cpu="ppc64le"
641    else
642      cpu="ppc64"
643    fi
644  else
645    cpu="ppc"
646  fi
647elif check_define __mips__ ; then
648  cpu="mips"
649elif check_define __s390__ ; then
650  if check_define __s390x__ ; then
651    cpu="s390x"
652  else
653    cpu="s390"
654  fi
655elif check_define __riscv ; then
656  if check_define _LP64 ; then
657    cpu="riscv64"
658  else
659    cpu="riscv32"
660  fi
661elif check_define __arm__ ; then
662  cpu="arm"
663elif check_define __aarch64__ ; then
664  cpu="aarch64"
665else
666  cpu=$(uname -m)
667fi
668
669ARCH=
670# Normalise host CPU name and set ARCH.
671# Note that this case should only have supported host CPUs, not guests.
672case "$cpu" in
673  ppc|ppc64|s390x|sparc64|x32|riscv32|riscv64)
674  ;;
675  ppc64le)
676    ARCH="ppc64"
677  ;;
678  i386|i486|i586|i686|i86pc|BePC)
679    cpu="i386"
680  ;;
681  x86_64|amd64)
682    cpu="x86_64"
683  ;;
684  armv*b|armv*l|arm)
685    cpu="arm"
686  ;;
687  aarch64)
688    cpu="aarch64"
689  ;;
690  mips*)
691    cpu="mips"
692  ;;
693  sparc|sun4[cdmuv])
694    cpu="sparc"
695  ;;
696  *)
697    # This will result in either an error or falling back to TCI later
698    ARCH=unknown
699  ;;
700esac
701if test -z "$ARCH"; then
702  ARCH="$cpu"
703fi
704
705# OS specific
706
707case $targetos in
708MINGW32*)
709  mingw32="yes"
710  audio_possible_drivers="dsound sdl"
711  if check_include dsound.h; then
712    audio_drv_list="dsound"
713  else
714    audio_drv_list=""
715  fi
716  supported_os="yes"
717  pie="no"
718;;
719GNU/kFreeBSD)
720  bsd="yes"
721  audio_drv_list="oss try-sdl"
722  audio_possible_drivers="oss sdl pa"
723;;
724FreeBSD)
725  bsd="yes"
726  make="${MAKE-gmake}"
727  audio_drv_list="oss try-sdl"
728  audio_possible_drivers="oss sdl pa"
729  # needed for kinfo_getvmmap(3) in libutil.h
730  netmap=""  # enable netmap autodetect
731;;
732DragonFly)
733  bsd="yes"
734  make="${MAKE-gmake}"
735  audio_drv_list="oss try-sdl"
736  audio_possible_drivers="oss sdl pa"
737;;
738NetBSD)
739  bsd="yes"
740  make="${MAKE-gmake}"
741  audio_drv_list="oss try-sdl"
742  audio_possible_drivers="oss sdl"
743  oss_lib="-lossaudio"
744;;
745OpenBSD)
746  bsd="yes"
747  make="${MAKE-gmake}"
748  audio_drv_list="try-sdl"
749  audio_possible_drivers="sdl"
750;;
751Darwin)
752  bsd="yes"
753  darwin="yes"
754  audio_drv_list="try-coreaudio try-sdl"
755  audio_possible_drivers="coreaudio sdl"
756  # Disable attempts to use ObjectiveC features in os/object.h since they
757  # won't work when we're compiling with gcc as a C compiler.
758  QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS"
759;;
760SunOS)
761  solaris="yes"
762  make="${MAKE-gmake}"
763  smbd="${SMBD-/usr/sfw/sbin/smbd}"
764  if test -f /usr/include/sys/soundcard.h ; then
765    audio_drv_list="oss try-sdl"
766  fi
767  audio_possible_drivers="oss sdl"
768# needed for CMSG_ macros in sys/socket.h
769  QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS"
770# needed for TIOCWIN* defines in termios.h
771  QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
772;;
773Haiku)
774  haiku="yes"
775  QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS -D_BSD_SOURCE $QEMU_CFLAGS"
776;;
777Linux)
778  audio_drv_list="try-pa oss"
779  audio_possible_drivers="oss alsa sdl pa"
780  linux="yes"
781  linux_user="yes"
782  vhost_user=${default_feature:-yes}
783;;
784esac
785
786if [ "$bsd" = "yes" ] ; then
787  if [ "$darwin" != "yes" ] ; then
788    bsd_user="yes"
789  fi
790fi
791
792: ${make=${MAKE-make}}
793
794# We prefer python 3.x. A bare 'python' is traditionally
795# python 2.x, but some distros have it as python 3.x, so
796# we check that too
797python=
798explicit_python=no
799for binary in "${PYTHON-python3}" python
800do
801    if has "$binary"
802    then
803        python=$(command -v "$binary")
804        break
805    fi
806done
807
808
809# Check for ancillary tools used in testing
810genisoimage=
811for binary in genisoimage mkisofs
812do
813    if has $binary
814    then
815        genisoimage=$(command -v "$binary")
816        break
817    fi
818done
819
820# Default objcc to clang if available, otherwise use CC
821if has clang; then
822  objcc=clang
823else
824  objcc="$cc"
825fi
826
827if test "$mingw32" = "yes" ; then
828  EXESUF=".exe"
829  HOST_DSOSUF=".dll"
830  # MinGW needs -mthreads for TLS and macro _MT.
831  CONFIGURE_CFLAGS="-mthreads $CONFIGURE_CFLAGS"
832  write_c_skeleton;
833  prefix="/qemu"
834  qemu_suffix=""
835  libs_qga="-lws2_32 -lwinmm -lpowrprof -lwtsapi32 -lwininet -liphlpapi -lnetapi32 $libs_qga"
836fi
837
838werror=""
839
840for opt do
841  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
842  case "$opt" in
843  --help|-h) show_help=yes
844  ;;
845  --version|-V) exec cat $source_path/VERSION
846  ;;
847  --prefix=*) prefix="$optarg"
848  ;;
849  --interp-prefix=*) interp_prefix="$optarg"
850  ;;
851  --cross-prefix=*)
852  ;;
853  --cc=*)
854  ;;
855  --host-cc=*) host_cc="$optarg"
856  ;;
857  --cxx=*)
858  ;;
859  --iasl=*) iasl="$optarg"
860  ;;
861  --objcc=*) objcc="$optarg"
862  ;;
863  --make=*) make="$optarg"
864  ;;
865  --install=*)
866  ;;
867  --python=*) python="$optarg" ; explicit_python=yes
868  ;;
869  --sphinx-build=*) sphinx_build="$optarg"
870  ;;
871  --skip-meson) skip_meson=yes
872  ;;
873  --meson=*) meson="$optarg"
874  ;;
875  --ninja=*) ninja="$optarg"
876  ;;
877  --smbd=*) smbd="$optarg"
878  ;;
879  --extra-cflags=*)
880  ;;
881  --extra-cxxflags=*)
882  ;;
883  --extra-ldflags=*)
884  ;;
885  --enable-debug-info)
886  ;;
887  --disable-debug-info)
888  ;;
889  --cross-cc-*)
890  ;;
891  --enable-modules)
892      modules="yes"
893  ;;
894  --disable-modules)
895      modules="no"
896  ;;
897  --disable-module-upgrades) module_upgrades="no"
898  ;;
899  --enable-module-upgrades) module_upgrades="yes"
900  ;;
901  --cpu=*)
902  ;;
903  --target-list=*) target_list="$optarg"
904                   if test "$target_list_exclude"; then
905                       error_exit "Can't mix --target-list with --target-list-exclude"
906                   fi
907  ;;
908  --target-list-exclude=*) target_list_exclude="$optarg"
909                   if test "$target_list"; then
910                       error_exit "Can't mix --target-list-exclude with --target-list"
911                   fi
912  ;;
913  --enable-trace-backends=*) trace_backends="$optarg"
914  ;;
915  # XXX: backwards compatibility
916  --enable-trace-backend=*) trace_backends="$optarg"
917  ;;
918  --with-trace-file=*) trace_file="$optarg"
919  ;;
920  --with-default-devices) default_devices="true"
921  ;;
922  --without-default-devices) default_devices="false"
923  ;;
924  --without-default-features) # processed above
925  ;;
926  --enable-gprof) gprof="yes"
927  ;;
928  --enable-gcov) gcov="yes"
929  ;;
930  --static)
931    static="yes"
932    QEMU_PKG_CONFIG_FLAGS="--static $QEMU_PKG_CONFIG_FLAGS"
933  ;;
934  --mandir=*) mandir="$optarg"
935  ;;
936  --bindir=*) bindir="$optarg"
937  ;;
938  --libdir=*) libdir="$optarg"
939  ;;
940  --libexecdir=*) libexecdir="$optarg"
941  ;;
942  --includedir=*) includedir="$optarg"
943  ;;
944  --datadir=*) datadir="$optarg"
945  ;;
946  --with-suffix=*) qemu_suffix="$optarg"
947  ;;
948  --docdir=*) docdir="$optarg"
949  ;;
950  --localedir=*) localedir="$optarg"
951  ;;
952  --sysconfdir=*) sysconfdir="$optarg"
953  ;;
954  --localstatedir=*) local_statedir="$optarg"
955  ;;
956  --firmwarepath=*) firmwarepath="$optarg"
957  ;;
958  --host=*|--build=*|\
959  --disable-dependency-tracking|\
960  --sbindir=*|--sharedstatedir=*|\
961  --oldincludedir=*|--datarootdir=*|--infodir=*|\
962  --htmldir=*|--dvidir=*|--pdfdir=*|--psdir=*)
963    # These switches are silently ignored, for compatibility with
964    # autoconf-generated configure scripts. This allows QEMU's
965    # configure to be used by RPM and similar macros that set
966    # lots of directory switches by default.
967  ;;
968  --disable-sdl) sdl="disabled"
969  ;;
970  --enable-sdl) sdl="enabled"
971  ;;
972  --disable-sdl-image) sdl_image="disabled"
973  ;;
974  --enable-sdl-image) sdl_image="enabled"
975  ;;
976  --disable-qom-cast-debug) qom_cast_debug="no"
977  ;;
978  --enable-qom-cast-debug) qom_cast_debug="yes"
979  ;;
980  --disable-virtfs) virtfs="disabled"
981  ;;
982  --enable-virtfs) virtfs="enabled"
983  ;;
984  --disable-libudev) libudev="disabled"
985  ;;
986  --enable-libudev) libudev="enabled"
987  ;;
988  --disable-virtiofsd) virtiofsd="disabled"
989  ;;
990  --enable-virtiofsd) virtiofsd="enabled"
991  ;;
992  --disable-mpath) mpath="disabled"
993  ;;
994  --enable-mpath) mpath="enabled"
995  ;;
996  --disable-vnc) vnc="disabled"
997  ;;
998  --enable-vnc) vnc="enabled"
999  ;;
1000  --disable-gettext) gettext="disabled"
1001  ;;
1002  --enable-gettext) gettext="enabled"
1003  ;;
1004  --oss-lib=*) oss_lib="$optarg"
1005  ;;
1006  --audio-drv-list=*) audio_drv_list="$optarg"
1007  ;;
1008  --block-drv-rw-whitelist=*|--block-drv-whitelist=*) block_drv_rw_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
1009  ;;
1010  --block-drv-ro-whitelist=*) block_drv_ro_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
1011  ;;
1012  --enable-debug-tcg) debug_tcg="yes"
1013  ;;
1014  --disable-debug-tcg) debug_tcg="no"
1015  ;;
1016  --enable-debug)
1017      # Enable debugging options that aren't excessively noisy
1018      debug_tcg="yes"
1019      debug_mutex="yes"
1020      debug="yes"
1021      strip_opt="no"
1022      fortify_source="no"
1023  ;;
1024  --enable-sanitizers) sanitizers="yes"
1025  ;;
1026  --disable-sanitizers) sanitizers="no"
1027  ;;
1028  --enable-tsan) tsan="yes"
1029  ;;
1030  --disable-tsan) tsan="no"
1031  ;;
1032  --enable-sparse) sparse="enabled"
1033  ;;
1034  --disable-sparse) sparse="disabled"
1035  ;;
1036  --disable-strip) strip_opt="no"
1037  ;;
1038  --disable-vnc-sasl) vnc_sasl="disabled"
1039  ;;
1040  --enable-vnc-sasl) vnc_sasl="enabled"
1041  ;;
1042  --disable-vnc-jpeg) vnc_jpeg="disabled"
1043  ;;
1044  --enable-vnc-jpeg) vnc_jpeg="enabled"
1045  ;;
1046  --disable-vnc-png) vnc_png="disabled"
1047  ;;
1048  --enable-vnc-png) vnc_png="enabled"
1049  ;;
1050  --disable-slirp) slirp="disabled"
1051  ;;
1052  --enable-slirp) slirp="enabled"
1053  ;;
1054  --enable-slirp=git) slirp="internal"
1055  ;;
1056  --enable-slirp=system) slirp="system"
1057  ;;
1058  --disable-vde) vde="no"
1059  ;;
1060  --enable-vde) vde="yes"
1061  ;;
1062  --disable-netmap) netmap="no"
1063  ;;
1064  --enable-netmap) netmap="yes"
1065  ;;
1066  --disable-xen) xen="disabled"
1067  ;;
1068  --enable-xen) xen="enabled"
1069  ;;
1070  --disable-xen-pci-passthrough) xen_pci_passthrough="disabled"
1071  ;;
1072  --enable-xen-pci-passthrough) xen_pci_passthrough="enabled"
1073  ;;
1074  --disable-brlapi) brlapi="disabled"
1075  ;;
1076  --enable-brlapi) brlapi="enabled"
1077  ;;
1078  --disable-kvm) kvm="disabled"
1079  ;;
1080  --enable-kvm) kvm="enabled"
1081  ;;
1082  --disable-hax) hax="disabled"
1083  ;;
1084  --enable-hax) hax="enabled"
1085  ;;
1086  --disable-hvf) hvf="disabled"
1087  ;;
1088  --enable-hvf) hvf="enabled"
1089  ;;
1090  --disable-nvmm) nvmm="disabled"
1091  ;;
1092  --enable-nvmm) nvmm="enabled"
1093  ;;
1094  --disable-whpx) whpx="disabled"
1095  ;;
1096  --enable-whpx) whpx="enabled"
1097  ;;
1098  --disable-tcg-interpreter) tcg_interpreter="false"
1099  ;;
1100  --enable-tcg-interpreter) tcg_interpreter="true"
1101  ;;
1102  --disable-cap-ng)  cap_ng="disabled"
1103  ;;
1104  --enable-cap-ng) cap_ng="enabled"
1105  ;;
1106  --disable-tcg) tcg="disabled"
1107  ;;
1108  --enable-tcg) tcg="enabled"
1109  ;;
1110  --disable-malloc-trim) malloc_trim="disabled"
1111  ;;
1112  --enable-malloc-trim) malloc_trim="enabled"
1113  ;;
1114  --disable-spice) spice="no"
1115  ;;
1116  --enable-spice)
1117      spice_protocol="yes"
1118      spice="yes"
1119  ;;
1120  --disable-spice-protocol)
1121      spice_protocol="no"
1122      spice="no"
1123  ;;
1124  --enable-spice-protocol) spice_protocol="yes"
1125  ;;
1126  --disable-libiscsi) libiscsi="disabled"
1127  ;;
1128  --enable-libiscsi) libiscsi="enabled"
1129  ;;
1130  --disable-libnfs) libnfs="disabled"
1131  ;;
1132  --enable-libnfs) libnfs="enabled"
1133  ;;
1134  --enable-profiler) profiler="yes"
1135  ;;
1136  --disable-cocoa) cocoa="disabled"
1137  ;;
1138  --enable-cocoa) cocoa="enabled"
1139  ;;
1140  --disable-system) softmmu="no"
1141  ;;
1142  --enable-system) softmmu="yes"
1143  ;;
1144  --disable-user)
1145      linux_user="no" ;
1146      bsd_user="no" ;
1147  ;;
1148  --enable-user) ;;
1149  --disable-linux-user) linux_user="no"
1150  ;;
1151  --enable-linux-user) linux_user="yes"
1152  ;;
1153  --disable-bsd-user) bsd_user="no"
1154  ;;
1155  --enable-bsd-user) bsd_user="yes"
1156  ;;
1157  --enable-pie) pie="yes"
1158  ;;
1159  --disable-pie) pie="no"
1160  ;;
1161  --enable-werror) werror="yes"
1162  ;;
1163  --disable-werror) werror="no"
1164  ;;
1165  --enable-lto) lto="true"
1166  ;;
1167  --disable-lto) lto="false"
1168  ;;
1169  --enable-stack-protector) stack_protector="yes"
1170  ;;
1171  --disable-stack-protector) stack_protector="no"
1172  ;;
1173  --enable-safe-stack) safe_stack="yes"
1174  ;;
1175  --disable-safe-stack) safe_stack="no"
1176  ;;
1177  --enable-cfi)
1178      cfi="true";
1179      lto="true";
1180  ;;
1181  --disable-cfi) cfi="false"
1182  ;;
1183  --enable-cfi-debug) cfi_debug="true"
1184  ;;
1185  --disable-cfi-debug) cfi_debug="false"
1186  ;;
1187  --disable-curses) curses="disabled"
1188  ;;
1189  --enable-curses) curses="enabled"
1190  ;;
1191  --disable-iconv) iconv="disabled"
1192  ;;
1193  --enable-iconv) iconv="enabled"
1194  ;;
1195  --disable-curl) curl="disabled"
1196  ;;
1197  --enable-curl) curl="enabled"
1198  ;;
1199  --disable-fdt) fdt="disabled"
1200  ;;
1201  --enable-fdt) fdt="enabled"
1202  ;;
1203  --enable-fdt=git) fdt="internal"
1204  ;;
1205  --enable-fdt=system) fdt="system"
1206  ;;
1207  --disable-linux-aio) linux_aio="no"
1208  ;;
1209  --enable-linux-aio) linux_aio="yes"
1210  ;;
1211  --disable-linux-io-uring) linux_io_uring="no"
1212  ;;
1213  --enable-linux-io-uring) linux_io_uring="yes"
1214  ;;
1215  --disable-attr) attr="disabled"
1216  ;;
1217  --enable-attr) attr="enabled"
1218  ;;
1219  --disable-membarrier) membarrier="no"
1220  ;;
1221  --enable-membarrier) membarrier="yes"
1222  ;;
1223  --disable-bpf) bpf="disabled"
1224  ;;
1225  --enable-bpf) bpf="enabled"
1226  ;;
1227  --disable-blobs) blobs="false"
1228  ;;
1229  --with-pkgversion=*) pkgversion="$optarg"
1230  ;;
1231  --with-coroutine=*) coroutine="$optarg"
1232  ;;
1233  --disable-coroutine-pool) coroutine_pool="no"
1234  ;;
1235  --enable-coroutine-pool) coroutine_pool="yes"
1236  ;;
1237  --enable-debug-stack-usage) debug_stack_usage="yes"
1238  ;;
1239  --enable-crypto-afalg) crypto_afalg="yes"
1240  ;;
1241  --disable-crypto-afalg) crypto_afalg="no"
1242  ;;
1243  --disable-docs) docs="disabled"
1244  ;;
1245  --enable-docs) docs="enabled"
1246  ;;
1247  --disable-vhost-net) vhost_net="no"
1248  ;;
1249  --enable-vhost-net) vhost_net="yes"
1250  ;;
1251  --disable-vhost-crypto) vhost_crypto="no"
1252  ;;
1253  --enable-vhost-crypto) vhost_crypto="yes"
1254  ;;
1255  --disable-vhost-scsi) vhost_scsi="no"
1256  ;;
1257  --enable-vhost-scsi) vhost_scsi="yes"
1258  ;;
1259  --disable-vhost-vsock) vhost_vsock="no"
1260  ;;
1261  --enable-vhost-vsock) vhost_vsock="yes"
1262  ;;
1263  --disable-vhost-user-blk-server) vhost_user_blk_server="disabled"
1264  ;;
1265  --enable-vhost-user-blk-server) vhost_user_blk_server="enabled"
1266  ;;
1267  --disable-vhost-user-fs) vhost_user_fs="no"
1268  ;;
1269  --enable-vhost-user-fs) vhost_user_fs="yes"
1270  ;;
1271  --disable-opengl) opengl="no"
1272  ;;
1273  --enable-opengl) opengl="yes"
1274  ;;
1275  --disable-rbd) rbd="disabled"
1276  ;;
1277  --enable-rbd) rbd="enabled"
1278  ;;
1279  --disable-xfsctl) xfs="no"
1280  ;;
1281  --enable-xfsctl) xfs="yes"
1282  ;;
1283  --disable-smartcard) smartcard="no"
1284  ;;
1285  --enable-smartcard) smartcard="yes"
1286  ;;
1287  --disable-u2f) u2f="disabled"
1288  ;;
1289  --enable-u2f) u2f="enabled"
1290  ;;
1291  --disable-libusb) libusb="no"
1292  ;;
1293  --enable-libusb) libusb="yes"
1294  ;;
1295  --disable-usb-redir) usb_redir="no"
1296  ;;
1297  --enable-usb-redir) usb_redir="yes"
1298  ;;
1299  --disable-zlib-test)
1300  ;;
1301  --disable-lzo) lzo="disabled"
1302  ;;
1303  --enable-lzo) lzo="enabled"
1304  ;;
1305  --disable-snappy) snappy="disabled"
1306  ;;
1307  --enable-snappy) snappy="enabled"
1308  ;;
1309  --disable-bzip2) bzip2="disabled"
1310  ;;
1311  --enable-bzip2) bzip2="enabled"
1312  ;;
1313  --enable-lzfse) lzfse="enabled"
1314  ;;
1315  --disable-lzfse) lzfse="disabled"
1316  ;;
1317  --disable-zstd) zstd="disabled"
1318  ;;
1319  --enable-zstd) zstd="enabled"
1320  ;;
1321  --enable-guest-agent) guest_agent="yes"
1322  ;;
1323  --disable-guest-agent) guest_agent="no"
1324  ;;
1325  --enable-guest-agent-msi) guest_agent_msi="enabled"
1326  ;;
1327  --disable-guest-agent-msi) guest_agent_msi="disabled"
1328  ;;
1329  --with-vss-sdk) vss_win32_sdk=""
1330  ;;
1331  --with-vss-sdk=*) vss_win32_sdk="$optarg"
1332  ;;
1333  --without-vss-sdk) vss_win32_sdk="no"
1334  ;;
1335  --with-win-sdk) win_sdk=""
1336  ;;
1337  --with-win-sdk=*) win_sdk="$optarg"
1338  ;;
1339  --without-win-sdk) win_sdk="no"
1340  ;;
1341  --enable-tools) want_tools="yes"
1342  ;;
1343  --disable-tools) want_tools="no"
1344  ;;
1345  --enable-seccomp) seccomp="enabled"
1346  ;;
1347  --disable-seccomp) seccomp="disabled"
1348  ;;
1349  --disable-glusterfs) glusterfs="disabled"
1350  ;;
1351  --disable-avx2) avx2_opt="no"
1352  ;;
1353  --enable-avx2) avx2_opt="yes"
1354  ;;
1355  --disable-avx512f) avx512f_opt="no"
1356  ;;
1357  --enable-avx512f) avx512f_opt="yes"
1358  ;;
1359
1360  --enable-glusterfs) glusterfs="enabled"
1361  ;;
1362  --disable-virtio-blk-data-plane|--enable-virtio-blk-data-plane)
1363      echo "$0: $opt is obsolete, virtio-blk data-plane is always on" >&2
1364  ;;
1365  --enable-vhdx|--disable-vhdx)
1366      echo "$0: $opt is obsolete, VHDX driver is always built" >&2
1367  ;;
1368  --enable-uuid|--disable-uuid)
1369      echo "$0: $opt is obsolete, UUID support is always built" >&2
1370  ;;
1371  --disable-gtk) gtk="disabled"
1372  ;;
1373  --enable-gtk) gtk="enabled"
1374  ;;
1375  --tls-priority=*) tls_priority="$optarg"
1376  ;;
1377  --disable-gnutls) gnutls="no"
1378  ;;
1379  --enable-gnutls) gnutls="yes"
1380  ;;
1381  --disable-nettle) nettle="no"
1382  ;;
1383  --enable-nettle) nettle="yes"
1384  ;;
1385  --disable-gcrypt) gcrypt="no"
1386  ;;
1387  --enable-gcrypt) gcrypt="yes"
1388  ;;
1389  --disable-auth-pam) auth_pam="no"
1390  ;;
1391  --enable-auth-pam) auth_pam="yes"
1392  ;;
1393  --enable-rdma) rdma="yes"
1394  ;;
1395  --disable-rdma) rdma="no"
1396  ;;
1397  --enable-pvrdma) pvrdma="yes"
1398  ;;
1399  --disable-pvrdma) pvrdma="no"
1400  ;;
1401  --disable-vte) vte="no"
1402  ;;
1403  --enable-vte) vte="yes"
1404  ;;
1405  --disable-virglrenderer) virglrenderer="no"
1406  ;;
1407  --enable-virglrenderer) virglrenderer="yes"
1408  ;;
1409  --disable-tpm) tpm="no"
1410  ;;
1411  --enable-tpm) tpm="yes"
1412  ;;
1413  --disable-libssh) libssh="no"
1414  ;;
1415  --enable-libssh) libssh="yes"
1416  ;;
1417  --disable-live-block-migration) live_block_migration="no"
1418  ;;
1419  --enable-live-block-migration) live_block_migration="yes"
1420  ;;
1421  --disable-numa) numa="no"
1422  ;;
1423  --enable-numa) numa="yes"
1424  ;;
1425  --disable-libxml2) libxml2="no"
1426  ;;
1427  --enable-libxml2) libxml2="yes"
1428  ;;
1429  --disable-tcmalloc) tcmalloc="no"
1430  ;;
1431  --enable-tcmalloc) tcmalloc="yes"
1432  ;;
1433  --disable-jemalloc) jemalloc="no"
1434  ;;
1435  --enable-jemalloc) jemalloc="yes"
1436  ;;
1437  --disable-replication) replication="no"
1438  ;;
1439  --enable-replication) replication="yes"
1440  ;;
1441  --disable-bochs) bochs="no"
1442  ;;
1443  --enable-bochs) bochs="yes"
1444  ;;
1445  --disable-cloop) cloop="no"
1446  ;;
1447  --enable-cloop) cloop="yes"
1448  ;;
1449  --disable-dmg) dmg="no"
1450  ;;
1451  --enable-dmg) dmg="yes"
1452  ;;
1453  --disable-qcow1) qcow1="no"
1454  ;;
1455  --enable-qcow1) qcow1="yes"
1456  ;;
1457  --disable-vdi) vdi="no"
1458  ;;
1459  --enable-vdi) vdi="yes"
1460  ;;
1461  --disable-vvfat) vvfat="no"
1462  ;;
1463  --enable-vvfat) vvfat="yes"
1464  ;;
1465  --disable-qed) qed="no"
1466  ;;
1467  --enable-qed) qed="yes"
1468  ;;
1469  --disable-parallels) parallels="no"
1470  ;;
1471  --enable-parallels) parallels="yes"
1472  ;;
1473  --disable-vhost-user) vhost_user="no"
1474  ;;
1475  --enable-vhost-user) vhost_user="yes"
1476  ;;
1477  --disable-vhost-vdpa) vhost_vdpa="no"
1478  ;;
1479  --enable-vhost-vdpa) vhost_vdpa="yes"
1480  ;;
1481  --disable-vhost-kernel) vhost_kernel="no"
1482  ;;
1483  --enable-vhost-kernel) vhost_kernel="yes"
1484  ;;
1485  --disable-capstone) capstone="disabled"
1486  ;;
1487  --enable-capstone) capstone="enabled"
1488  ;;
1489  --enable-capstone=git) capstone="internal"
1490  ;;
1491  --enable-capstone=system) capstone="system"
1492  ;;
1493  --with-git=*) git="$optarg"
1494  ;;
1495  --enable-git-update)
1496      git_submodules_action="update"
1497      echo "--enable-git-update deprecated, use --with-git-submodules=update"
1498  ;;
1499  --disable-git-update)
1500      git_submodules_action="validate"
1501      echo "--disable-git-update deprecated, use --with-git-submodules=validate"
1502  ;;
1503  --with-git-submodules=*)
1504      git_submodules_action="$optarg"
1505  ;;
1506  --enable-debug-mutex) debug_mutex=yes
1507  ;;
1508  --disable-debug-mutex) debug_mutex=no
1509  ;;
1510  --enable-libpmem) libpmem=yes
1511  ;;
1512  --disable-libpmem) libpmem=no
1513  ;;
1514  --enable-xkbcommon) xkbcommon="enabled"
1515  ;;
1516  --disable-xkbcommon) xkbcommon="disabled"
1517  ;;
1518  --enable-plugins) plugins="yes"
1519  ;;
1520  --disable-plugins) plugins="no"
1521  ;;
1522  --enable-containers) use_containers="yes"
1523  ;;
1524  --disable-containers) use_containers="no"
1525  ;;
1526  --enable-fuzzing) fuzzing=yes
1527  ;;
1528  --disable-fuzzing) fuzzing=no
1529  ;;
1530  --gdb=*) gdb_bin="$optarg"
1531  ;;
1532  --enable-rng-none) rng_none=yes
1533  ;;
1534  --disable-rng-none) rng_none=no
1535  ;;
1536  --enable-keyring) secret_keyring="yes"
1537  ;;
1538  --disable-keyring) secret_keyring="no"
1539  ;;
1540  --enable-libdaxctl) libdaxctl=yes
1541  ;;
1542  --disable-libdaxctl) libdaxctl=no
1543  ;;
1544  --enable-fuse) fuse="enabled"
1545  ;;
1546  --disable-fuse) fuse="disabled"
1547  ;;
1548  --enable-fuse-lseek) fuse_lseek="enabled"
1549  ;;
1550  --disable-fuse-lseek) fuse_lseek="disabled"
1551  ;;
1552  --enable-multiprocess) multiprocess="enabled"
1553  ;;
1554  --disable-multiprocess) multiprocess="disabled"
1555  ;;
1556  --enable-gio) gio=yes
1557  ;;
1558  --disable-gio) gio=no
1559  ;;
1560  --enable-slirp-smbd) slirp_smbd=yes
1561  ;;
1562  --disable-slirp-smbd) slirp_smbd=no
1563  ;;
1564  *)
1565      echo "ERROR: unknown option $opt"
1566      echo "Try '$0 --help' for more information"
1567      exit 1
1568  ;;
1569  esac
1570done
1571
1572case $git_submodules_action in
1573    update|validate)
1574        if test ! -e "$source_path/.git"; then
1575            echo "ERROR: cannot $git_submodules_action git submodules without .git"
1576            exit 1
1577        fi
1578    ;;
1579    ignore)
1580        if ! test -f "$source_path/ui/keycodemapdb/README"
1581        then
1582            echo
1583            echo "ERROR: missing GIT submodules"
1584            echo
1585            if test -e "$source_path/.git"; then
1586                echo "--with-git-submodules=ignore specified but submodules were not"
1587                echo "checked out.  Please initialize and update submodules."
1588            else
1589                echo "This is not a GIT checkout but module content appears to"
1590                echo "be missing. Do not use 'git archive' or GitHub download links"
1591                echo "to acquire QEMU source archives. Non-GIT builds are only"
1592                echo "supported with source archives linked from:"
1593                echo
1594                echo "  https://www.qemu.org/download/#source"
1595                echo
1596                echo "Developers working with GIT can use scripts/archive-source.sh"
1597                echo "if they need to create valid source archives."
1598            fi
1599            echo
1600            exit 1
1601        fi
1602    ;;
1603    *)
1604        echo "ERROR: invalid --with-git-submodules= value '$git_submodules_action'"
1605        exit 1
1606    ;;
1607esac
1608
1609libdir="${libdir:-$prefix/lib}"
1610libexecdir="${libexecdir:-$prefix/libexec}"
1611includedir="${includedir:-$prefix/include}"
1612
1613if test "$mingw32" = "yes" ; then
1614    bindir="${bindir:-$prefix}"
1615else
1616    bindir="${bindir:-$prefix/bin}"
1617fi
1618mandir="${mandir:-$prefix/share/man}"
1619datadir="${datadir:-$prefix/share}"
1620docdir="${docdir:-$prefix/share/doc}"
1621sysconfdir="${sysconfdir:-$prefix/etc}"
1622local_statedir="${local_statedir:-$prefix/var}"
1623firmwarepath="${firmwarepath:-$datadir/qemu-firmware}"
1624localedir="${localedir:-$datadir/locale}"
1625
1626case "$cpu" in
1627    ppc)
1628           CPU_CFLAGS="-m32"
1629           QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS"
1630           ;;
1631    ppc64)
1632           CPU_CFLAGS="-m64"
1633           QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1634           ;;
1635    sparc)
1636           CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc"
1637           QEMU_LDFLAGS="-m32 -mv8plus $QEMU_LDFLAGS"
1638           ;;
1639    sparc64)
1640           CPU_CFLAGS="-m64 -mcpu=ultrasparc"
1641           QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1642           ;;
1643    s390)
1644           CPU_CFLAGS="-m31"
1645           QEMU_LDFLAGS="-m31 $QEMU_LDFLAGS"
1646           ;;
1647    s390x)
1648           CPU_CFLAGS="-m64"
1649           QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1650           ;;
1651    i386)
1652           CPU_CFLAGS="-m32"
1653           QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS"
1654           ;;
1655    x86_64)
1656           # ??? Only extremely old AMD cpus do not have cmpxchg16b.
1657           # If we truly care, we should simply detect this case at
1658           # runtime and generate the fallback to serial emulation.
1659           CPU_CFLAGS="-m64 -mcx16"
1660           QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1661           ;;
1662    x32)
1663           CPU_CFLAGS="-mx32"
1664           QEMU_LDFLAGS="-mx32 $QEMU_LDFLAGS"
1665           ;;
1666    # No special flags required for other host CPUs
1667esac
1668
1669eval "cross_cc_${cpu}=\$cc"
1670cross_cc_vars="$cross_cc_vars cross_cc_${cpu}"
1671QEMU_CFLAGS="$CPU_CFLAGS $QEMU_CFLAGS"
1672
1673# For user-mode emulation the host arch has to be one we explicitly
1674# support, even if we're using TCI.
1675if [ "$ARCH" = "unknown" ]; then
1676  bsd_user="no"
1677  linux_user="no"
1678fi
1679
1680default_target_list=""
1681deprecated_targets_list=ppc64abi32-linux-user
1682deprecated_features=""
1683mak_wilds=""
1684
1685if [ "$softmmu" = "yes" ]; then
1686    mak_wilds="${mak_wilds} $source_path/default-configs/targets/*-softmmu.mak"
1687fi
1688if [ "$linux_user" = "yes" ]; then
1689    mak_wilds="${mak_wilds} $source_path/default-configs/targets/*-linux-user.mak"
1690fi
1691if [ "$bsd_user" = "yes" ]; then
1692    mak_wilds="${mak_wilds} $source_path/default-configs/targets/*-bsd-user.mak"
1693fi
1694
1695# If the user doesn't explicitly specify a deprecated target we will
1696# skip it.
1697if test -z "$target_list"; then
1698    if test -z "$target_list_exclude"; then
1699        target_list_exclude="$deprecated_targets_list"
1700    else
1701        target_list_exclude="$target_list_exclude,$deprecated_targets_list"
1702    fi
1703fi
1704
1705for config in $mak_wilds; do
1706    target="$(basename "$config" .mak)"
1707    if echo "$target_list_exclude" | grep -vq "$target"; then
1708        default_target_list="${default_target_list} $target"
1709    fi
1710done
1711
1712# Enumerate public trace backends for --help output
1713trace_backend_list=$(echo $(grep -le '^PUBLIC = True$' "$source_path"/scripts/tracetool/backend/*.py | sed -e 's/^.*\/\(.*\)\.py$/\1/'))
1714
1715if test x"$show_help" = x"yes" ; then
1716cat << EOF
1717
1718Usage: configure [options]
1719Options: [defaults in brackets after descriptions]
1720
1721Standard options:
1722  --help                   print this message
1723  --prefix=PREFIX          install in PREFIX [$prefix]
1724  --interp-prefix=PREFIX   where to find shared libraries, etc.
1725                           use %M for cpu name [$interp_prefix]
1726  --target-list=LIST       set target list (default: build all non-deprecated)
1727$(echo Available targets: $default_target_list | \
1728  fold -s -w 53 | sed -e 's/^/                           /')
1729$(echo Deprecated targets: $deprecated_targets_list | \
1730  fold -s -w 53 | sed -e 's/^/                           /')
1731  --target-list-exclude=LIST exclude a set of targets from the default target-list
1732
1733Advanced options (experts only):
1734  --cross-prefix=PREFIX    use PREFIX for compile tools, PREFIX can be blank [$cross_prefix]
1735  --cc=CC                  use C compiler CC [$cc]
1736  --iasl=IASL              use ACPI compiler IASL [$iasl]
1737  --host-cc=CC             use C compiler CC [$host_cc] for code run at
1738                           build time
1739  --cxx=CXX                use C++ compiler CXX [$cxx]
1740  --objcc=OBJCC            use Objective-C compiler OBJCC [$objcc]
1741  --extra-cflags=CFLAGS    append extra C compiler flags QEMU_CFLAGS
1742  --extra-cxxflags=CXXFLAGS append extra C++ compiler flags QEMU_CXXFLAGS
1743  --extra-ldflags=LDFLAGS  append extra linker flags LDFLAGS
1744  --cross-cc-ARCH=CC       use compiler when building ARCH guest test cases
1745  --cross-cc-flags-ARCH=   use compiler flags when building ARCH guest tests
1746  --make=MAKE              use specified make [$make]
1747  --python=PYTHON          use specified python [$python]
1748  --sphinx-build=SPHINX    use specified sphinx-build [$sphinx_build]
1749  --meson=MESON            use specified meson [$meson]
1750  --ninja=NINJA            use specified ninja [$ninja]
1751  --smbd=SMBD              use specified smbd [$smbd]
1752  --with-git=GIT           use specified git [$git]
1753  --with-git-submodules=update   update git submodules (default if .git dir exists)
1754  --with-git-submodules=validate fail if git submodules are not up to date
1755  --with-git-submodules=ignore   do not update or check git submodules (default if no .git dir)
1756  --static                 enable static build [$static]
1757  --mandir=PATH            install man pages in PATH
1758  --datadir=PATH           install firmware in PATH/$qemu_suffix
1759  --localedir=PATH         install translation in PATH/$qemu_suffix
1760  --docdir=PATH            install documentation in PATH/$qemu_suffix
1761  --bindir=PATH            install binaries in PATH
1762  --libdir=PATH            install libraries in PATH
1763  --libexecdir=PATH        install helper binaries in PATH
1764  --sysconfdir=PATH        install config in PATH/$qemu_suffix
1765  --localstatedir=PATH     install local state in PATH (set at runtime on win32)
1766  --firmwarepath=PATH      search PATH for firmware files
1767  --efi-aarch64=PATH       PATH of efi file to use for aarch64 VMs.
1768  --with-suffix=SUFFIX     suffix for QEMU data inside datadir/libdir/sysconfdir/docdir [$qemu_suffix]
1769  --with-pkgversion=VERS   use specified string as sub-version of the package
1770  --without-default-features default all --enable-* options to "disabled"
1771  --without-default-devices  do not include any device that is not needed to
1772                           start the emulator (only use if you are including
1773                           desired devices in default-configs/devices/)
1774  --enable-debug           enable common debug build options
1775  --enable-sanitizers      enable default sanitizers
1776  --enable-tsan            enable thread sanitizer
1777  --disable-strip          disable stripping binaries
1778  --disable-werror         disable compilation abort on warning
1779  --disable-stack-protector disable compiler-provided stack protection
1780  --audio-drv-list=LIST    set audio drivers list:
1781                           Available drivers: $audio_possible_drivers
1782  --block-drv-whitelist=L  Same as --block-drv-rw-whitelist=L
1783  --block-drv-rw-whitelist=L
1784                           set block driver read-write whitelist
1785                           (affects only QEMU, not qemu-img)
1786  --block-drv-ro-whitelist=L
1787                           set block driver read-only whitelist
1788                           (affects only QEMU, not qemu-img)
1789  --enable-trace-backends=B Set trace backend
1790                           Available backends: $trace_backend_list
1791  --with-trace-file=NAME   Full PATH,NAME of file to store traces
1792                           Default:trace-<pid>
1793  --disable-slirp          disable SLIRP userspace network connectivity
1794  --enable-tcg-interpreter enable TCI (TCG with bytecode interpreter, experimental and slow)
1795  --enable-malloc-trim     enable libc malloc_trim() for memory optimization
1796  --oss-lib                path to OSS library
1797  --cpu=CPU                Build for host CPU [$cpu]
1798  --with-coroutine=BACKEND coroutine backend. Supported options:
1799                           ucontext, sigaltstack, windows
1800  --enable-gcov            enable test coverage analysis with gcov
1801  --disable-blobs          disable installing provided firmware blobs
1802  --with-vss-sdk=SDK-path  enable Windows VSS support in QEMU Guest Agent
1803  --with-win-sdk=SDK-path  path to Windows Platform SDK (to build VSS .tlb)
1804  --tls-priority           default TLS protocol/cipher priority string
1805  --enable-gprof           QEMU profiling with gprof
1806  --enable-profiler        profiler support
1807  --enable-debug-stack-usage
1808                           track the maximum stack usage of stacks created by qemu_alloc_stack
1809  --enable-plugins
1810                           enable plugins via shared library loading
1811  --disable-containers     don't use containers for cross-building
1812  --gdb=GDB-path           gdb to use for gdbstub tests [$gdb_bin]
1813
1814Optional features, enabled with --enable-FEATURE and
1815disabled with --disable-FEATURE, default is enabled if available
1816(unless built with --without-default-features):
1817
1818  system          all system emulation targets
1819  user            supported user emulation targets
1820  linux-user      all linux usermode emulation targets
1821  bsd-user        all BSD usermode emulation targets
1822  docs            build documentation
1823  guest-agent     build the QEMU Guest Agent
1824  guest-agent-msi build guest agent Windows MSI installation package
1825  pie             Position Independent Executables
1826  modules         modules support (non-Windows)
1827  module-upgrades try to load modules from alternate paths for upgrades
1828  debug-tcg       TCG debugging (default is disabled)
1829  debug-info      debugging information
1830  lto             Enable Link-Time Optimization.
1831  sparse          sparse checker
1832  safe-stack      SafeStack Stack Smash Protection. Depends on
1833                  clang/llvm >= 3.7 and requires coroutine backend ucontext.
1834  cfi             Enable Control-Flow Integrity for indirect function calls.
1835                  In case of a cfi violation, QEMU is terminated with SIGILL
1836                  Depends on lto and is incompatible with modules
1837                  Automatically enables Link-Time Optimization (lto)
1838  cfi-debug       In case of a cfi violation, a message containing the line that
1839                  triggered the error is written to stderr. After the error,
1840                  QEMU is still terminated with SIGILL
1841  gnutls          GNUTLS cryptography support
1842  nettle          nettle cryptography support
1843  gcrypt          libgcrypt cryptography support
1844  auth-pam        PAM access control
1845  sdl             SDL UI
1846  sdl-image       SDL Image support for icons
1847  gtk             gtk UI
1848  vte             vte support for the gtk UI
1849  curses          curses UI
1850  iconv           font glyph conversion support
1851  vnc             VNC UI support
1852  vnc-sasl        SASL encryption for VNC server
1853  vnc-jpeg        JPEG lossy compression for VNC server
1854  vnc-png         PNG compression for VNC server
1855  cocoa           Cocoa UI (Mac OS X only)
1856  virtfs          VirtFS
1857  virtiofsd       build virtiofs daemon (virtiofsd)
1858  libudev         Use libudev to enumerate host devices
1859  mpath           Multipath persistent reservation passthrough
1860  xen             xen backend driver support
1861  xen-pci-passthrough    PCI passthrough support for Xen
1862  brlapi          BrlAPI (Braile)
1863  curl            curl connectivity
1864  membarrier      membarrier system call (for Linux 4.14+ or Windows)
1865  fdt             fdt device tree
1866  kvm             KVM acceleration support
1867  hax             HAX acceleration support
1868  hvf             Hypervisor.framework acceleration support
1869  nvmm            NVMM acceleration support
1870  whpx            Windows Hypervisor Platform acceleration support
1871  rdma            Enable RDMA-based migration
1872  pvrdma          Enable PVRDMA support
1873  vde             support for vde network
1874  netmap          support for netmap network
1875  linux-aio       Linux AIO support
1876  linux-io-uring  Linux io_uring support
1877  cap-ng          libcap-ng support
1878  attr            attr and xattr support
1879  vhost-net       vhost-net kernel acceleration support
1880  vhost-vsock     virtio sockets device support
1881  vhost-scsi      vhost-scsi kernel target support
1882  vhost-crypto    vhost-user-crypto backend support
1883  vhost-kernel    vhost kernel backend support
1884  vhost-user      vhost-user backend support
1885  vhost-user-blk-server    vhost-user-blk server support
1886  vhost-vdpa      vhost-vdpa kernel backend support
1887  bpf             BPF kernel support
1888  spice           spice
1889  spice-protocol  spice-protocol
1890  rbd             rados block device (rbd)
1891  libiscsi        iscsi support
1892  libnfs          nfs support
1893  smartcard       smartcard support (libcacard)
1894  u2f             U2F support (u2f-emu)
1895  libusb          libusb (for usb passthrough)
1896  live-block-migration   Block migration in the main migration stream
1897  usb-redir       usb network redirection support
1898  lzo             support of lzo compression library
1899  snappy          support of snappy compression library
1900  bzip2           support of bzip2 compression library
1901                  (for reading bzip2-compressed dmg images)
1902  lzfse           support of lzfse compression library
1903                  (for reading lzfse-compressed dmg images)
1904  zstd            support for zstd compression library
1905                  (for migration compression and qcow2 cluster compression)
1906  seccomp         seccomp support
1907  coroutine-pool  coroutine freelist (better performance)
1908  glusterfs       GlusterFS backend
1909  tpm             TPM support
1910  libssh          ssh block device support
1911  numa            libnuma support
1912  libxml2         for Parallels image format
1913  tcmalloc        tcmalloc support
1914  jemalloc        jemalloc support
1915  avx2            AVX2 optimization support
1916  avx512f         AVX512F optimization support
1917  replication     replication support
1918  opengl          opengl support
1919  virglrenderer   virgl rendering support
1920  xfsctl          xfsctl support
1921  qom-cast-debug  cast debugging support
1922  tools           build qemu-io, qemu-nbd and qemu-img tools
1923  bochs           bochs image format support
1924  cloop           cloop image format support
1925  dmg             dmg image format support
1926  qcow1           qcow v1 image format support
1927  vdi             vdi image format support
1928  vvfat           vvfat image format support
1929  qed             qed image format support
1930  parallels       parallels image format support
1931  crypto-afalg    Linux AF_ALG crypto backend driver
1932  capstone        capstone disassembler support
1933  debug-mutex     mutex debugging support
1934  libpmem         libpmem support
1935  xkbcommon       xkbcommon support
1936  rng-none        dummy RNG, avoid using /dev/(u)random and getrandom()
1937  libdaxctl       libdaxctl support
1938  fuse            FUSE block device export
1939  fuse-lseek      SEEK_HOLE/SEEK_DATA support for FUSE exports
1940  multiprocess    Out of process device emulation support
1941  gio             libgio support
1942  slirp-smbd      use smbd (at path --smbd=*) in slirp networking
1943
1944NOTE: The object files are built at the place where configure is launched
1945EOF
1946exit 0
1947fi
1948
1949# Remove old dependency files to make sure that they get properly regenerated
1950rm -f */config-devices.mak.d
1951
1952if test -z "$python"
1953then
1954    error_exit "Python not found. Use --python=/path/to/python"
1955fi
1956if ! has "$make"
1957then
1958    error_exit "GNU make ($make) not found"
1959fi
1960
1961# Note that if the Python conditional here evaluates True we will exit
1962# with status 1 which is a shell 'false' value.
1963if ! $python -c 'import sys; sys.exit(sys.version_info < (3,6))'; then
1964  error_exit "Cannot use '$python', Python >= 3.6 is required." \
1965      "Use --python=/path/to/python to specify a supported Python."
1966fi
1967
1968# Preserve python version since some functionality is dependent on it
1969python_version=$($python -c 'import sys; print("%d.%d.%d" % (sys.version_info[0], sys.version_info[1], sys.version_info[2]))' 2>/dev/null)
1970
1971# Suppress writing compiled files
1972python="$python -B"
1973
1974if test -z "$meson"; then
1975    if test "$explicit_python" = no && has meson && version_ge "$(meson --version)" 0.55.3; then
1976        meson=meson
1977    elif test $git_submodules_action != 'ignore' ; then
1978        meson=git
1979    elif test -e "${source_path}/meson/meson.py" ; then
1980        meson=internal
1981    else
1982        if test "$explicit_python" = yes; then
1983            error_exit "--python requires using QEMU's embedded Meson distribution, but it was not found."
1984        else
1985            error_exit "Meson not found.  Use --meson=/path/to/meson"
1986        fi
1987    fi
1988else
1989    # Meson uses its own Python interpreter to invoke other Python scripts,
1990    # but the user wants to use the one they specified with --python.
1991    #
1992    # We do not want to override the distro Python interpreter (and sometimes
1993    # cannot: for example in Homebrew /usr/bin/meson is a bash script), so
1994    # just require --meson=git|internal together with --python.
1995    if test "$explicit_python" = yes; then
1996        case "$meson" in
1997            git | internal) ;;
1998            *) error_exit "--python requires using QEMU's embedded Meson distribution." ;;
1999        esac
2000    fi
2001fi
2002
2003if test "$meson" = git; then
2004    git_submodules="${git_submodules} meson"
2005fi
2006
2007case "$meson" in
2008    git | internal)
2009        meson="$python ${source_path}/meson/meson.py"
2010        ;;
2011    *) meson=$(command -v "$meson") ;;
2012esac
2013
2014# Probe for ninja
2015
2016if test -z "$ninja"; then
2017    for c in ninja ninja-build samu; do
2018        if has $c; then
2019            ninja=$(command -v "$c")
2020            break
2021        fi
2022    done
2023    if test -z "$ninja"; then
2024      error_exit "Cannot find Ninja"
2025    fi
2026fi
2027
2028# Check that the C compiler works. Doing this here before testing
2029# the host CPU ensures that we had a valid CC to autodetect the
2030# $cpu var (and we should bail right here if that's not the case).
2031# It also allows the help message to be printed without a CC.
2032write_c_skeleton;
2033if compile_object ; then
2034  : C compiler works ok
2035else
2036    error_exit "\"$cc\" either does not exist or does not work"
2037fi
2038if ! compile_prog ; then
2039    error_exit "\"$cc\" cannot build an executable (is your linker broken?)"
2040fi
2041
2042# Consult white-list to determine whether to enable werror
2043# by default.  Only enable by default for git builds
2044if test -z "$werror" ; then
2045    if test "$git_submodules_action" != "ignore" && \
2046        { test "$linux" = "yes" || test "$mingw32" = "yes"; }; then
2047        werror="yes"
2048    else
2049        werror="no"
2050    fi
2051fi
2052
2053if test "$targetos" = "bogus"; then
2054    # Now that we know that we're not printing the help and that
2055    # the compiler works (so the results of the check_defines we used
2056    # to identify the OS are reliable), if we didn't recognize the
2057    # host OS we should stop now.
2058    error_exit "Unrecognized host OS (uname -s reports '$(uname -s)')"
2059fi
2060
2061# Check whether the compiler matches our minimum requirements:
2062cat > $TMPC << EOF
2063#if defined(__clang_major__) && defined(__clang_minor__)
2064# ifdef __apple_build_version__
2065#  if __clang_major__ < 10 || (__clang_major__ == 10 && __clang_minor__ < 0)
2066#   error You need at least XCode Clang v10.0 to compile QEMU
2067#  endif
2068# else
2069#  if __clang_major__ < 6 || (__clang_major__ == 6 && __clang_minor__ < 0)
2070#   error You need at least Clang v6.0 to compile QEMU
2071#  endif
2072# endif
2073#elif defined(__GNUC__) && defined(__GNUC_MINOR__)
2074# if __GNUC__ < 7 || (__GNUC__ == 7 && __GNUC_MINOR__ < 5)
2075#  error You need at least GCC v7.5.0 to compile QEMU
2076# endif
2077#else
2078# error You either need GCC or Clang to compiler QEMU
2079#endif
2080int main (void) { return 0; }
2081EOF
2082if ! compile_prog "" "" ; then
2083    error_exit "You need at least GCC v7.5 or Clang v6.0 (or XCode Clang v10.0)"
2084fi
2085
2086# Accumulate -Wfoo and -Wno-bar separately.
2087# We will list all of the enable flags first, and the disable flags second.
2088# Note that we do not add -Werror, because that would enable it for all
2089# configure tests. If a configure test failed due to -Werror this would
2090# just silently disable some features, so it's too error prone.
2091
2092warn_flags=
2093add_to warn_flags -Wold-style-declaration
2094add_to warn_flags -Wold-style-definition
2095add_to warn_flags -Wtype-limits
2096add_to warn_flags -Wformat-security
2097add_to warn_flags -Wformat-y2k
2098add_to warn_flags -Winit-self
2099add_to warn_flags -Wignored-qualifiers
2100add_to warn_flags -Wempty-body
2101add_to warn_flags -Wnested-externs
2102add_to warn_flags -Wendif-labels
2103add_to warn_flags -Wexpansion-to-defined
2104add_to warn_flags -Wimplicit-fallthrough=2
2105
2106nowarn_flags=
2107add_to nowarn_flags -Wno-initializer-overrides
2108add_to nowarn_flags -Wno-missing-include-dirs
2109add_to nowarn_flags -Wno-shift-negative-value
2110add_to nowarn_flags -Wno-string-plus-int
2111add_to nowarn_flags -Wno-typedef-redefinition
2112add_to nowarn_flags -Wno-tautological-type-limit-compare
2113add_to nowarn_flags -Wno-psabi
2114
2115gcc_flags="$warn_flags $nowarn_flags"
2116
2117cc_has_warning_flag() {
2118    write_c_skeleton;
2119
2120    # Use the positive sense of the flag when testing for -Wno-wombat
2121    # support (gcc will happily accept the -Wno- form of unknown
2122    # warning options).
2123    optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
2124    compile_prog "-Werror $optflag" ""
2125}
2126
2127for flag in $gcc_flags; do
2128    if cc_has_warning_flag $flag ; then
2129        QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2130    fi
2131done
2132
2133if test "$stack_protector" != "no"; then
2134  cat > $TMPC << EOF
2135int main(int argc, char *argv[])
2136{
2137    char arr[64], *p = arr, *c = argv[0];
2138    while (*c) {
2139        *p++ = *c++;
2140    }
2141    return 0;
2142}
2143EOF
2144  gcc_flags="-fstack-protector-strong -fstack-protector-all"
2145  sp_on=0
2146  for flag in $gcc_flags; do
2147    # We need to check both a compile and a link, since some compiler
2148    # setups fail only on a .c->.o compile and some only at link time
2149    if compile_object "-Werror $flag" &&
2150       compile_prog "-Werror $flag" ""; then
2151      QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2152      QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
2153      sp_on=1
2154      break
2155    fi
2156  done
2157  if test "$stack_protector" = yes; then
2158    if test $sp_on = 0; then
2159      error_exit "Stack protector not supported"
2160    fi
2161  fi
2162fi
2163
2164# Disable -Wmissing-braces on older compilers that warn even for
2165# the "universal" C zero initializer {0}.
2166cat > $TMPC << EOF
2167struct {
2168  int a[2];
2169} x = {0};
2170EOF
2171if compile_object "-Werror" "" ; then
2172  :
2173else
2174  QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces"
2175fi
2176
2177# Our module code doesn't support Windows
2178if test "$modules" = "yes" && test "$mingw32" = "yes" ; then
2179  error_exit "Modules are not available for Windows"
2180fi
2181
2182# module_upgrades is only reasonable if modules are enabled
2183if test "$modules" = "no" && test "$module_upgrades" = "yes" ; then
2184  error_exit "Can't enable module-upgrades as Modules are not enabled"
2185fi
2186
2187# Static linking is not possible with modules or PIE
2188if test "$static" = "yes" ; then
2189  if test "$modules" = "yes" ; then
2190    error_exit "static and modules are mutually incompatible"
2191  fi
2192fi
2193
2194# Unconditional check for compiler __thread support
2195  cat > $TMPC << EOF
2196static __thread int tls_var;
2197int main(void) { return tls_var; }
2198EOF
2199
2200if ! compile_prog "-Werror" "" ; then
2201    error_exit "Your compiler does not support the __thread specifier for " \
2202	"Thread-Local Storage (TLS). Please upgrade to a version that does."
2203fi
2204
2205cat > $TMPC << EOF
2206
2207#ifdef __linux__
2208#  define THREAD __thread
2209#else
2210#  define THREAD
2211#endif
2212static THREAD int tls_var;
2213int main(void) { return tls_var; }
2214EOF
2215
2216# Check we support --no-pie first; we will need this for building ROMs.
2217if compile_prog "-Werror -fno-pie" "-no-pie"; then
2218  CFLAGS_NOPIE="-fno-pie"
2219fi
2220
2221if test "$static" = "yes"; then
2222  if test "$pie" != "no" && compile_prog "-Werror -fPIE -DPIE" "-static-pie"; then
2223    CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
2224    QEMU_LDFLAGS="-static-pie $QEMU_LDFLAGS"
2225    pie="yes"
2226  elif test "$pie" = "yes"; then
2227    error_exit "-static-pie not available due to missing toolchain support"
2228  else
2229    QEMU_LDFLAGS="-static $QEMU_LDFLAGS"
2230    pie="no"
2231  fi
2232elif test "$pie" = "no"; then
2233  CONFIGURE_CFLAGS="$CFLAGS_NOPIE $CONFIGURE_CFLAGS"
2234elif compile_prog "-Werror -fPIE -DPIE" "-pie"; then
2235  CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
2236  CONFIGURE_LDFLAGS="-pie $CONFIGURE_LDFLAGS"
2237  pie="yes"
2238elif test "$pie" = "yes"; then
2239  error_exit "PIE not available due to missing toolchain support"
2240else
2241  echo "Disabling PIE due to missing toolchain support"
2242  pie="no"
2243fi
2244
2245# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
2246# The combination is known as "full relro", because .got.plt is read-only too.
2247if compile_prog "" "-Wl,-z,relro -Wl,-z,now" ; then
2248  QEMU_LDFLAGS="-Wl,-z,relro -Wl,-z,now $QEMU_LDFLAGS"
2249fi
2250
2251##########################################
2252# __sync_fetch_and_and requires at least -march=i486. Many toolchains
2253# use i686 as default anyway, but for those that don't, an explicit
2254# specification is necessary
2255
2256if test "$cpu" = "i386"; then
2257  cat > $TMPC << EOF
2258static int sfaa(int *ptr)
2259{
2260  return __sync_fetch_and_and(ptr, 0);
2261}
2262
2263int main(void)
2264{
2265  int val = 42;
2266  val = __sync_val_compare_and_swap(&val, 0, 1);
2267  sfaa(&val);
2268  return val;
2269}
2270EOF
2271  if ! compile_prog "" "" ; then
2272    QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS"
2273  fi
2274fi
2275
2276#########################################
2277# Solaris specific configure tool chain decisions
2278
2279if test "$solaris" = "yes" ; then
2280  if has ar; then
2281    :
2282  else
2283    if test -f /usr/ccs/bin/ar ; then
2284      error_exit "No path includes ar" \
2285          "Add /usr/ccs/bin to your path and rerun configure"
2286    fi
2287    error_exit "No path includes ar"
2288  fi
2289fi
2290
2291if test "$tcg" = "enabled"; then
2292    git_submodules="$git_submodules tests/fp/berkeley-testfloat-3"
2293    git_submodules="$git_submodules tests/fp/berkeley-softfloat-3"
2294fi
2295
2296if test -z "${target_list+xxx}" ; then
2297    default_targets=yes
2298    for target in $default_target_list; do
2299        target_list="$target_list $target"
2300    done
2301    target_list="${target_list# }"
2302else
2303    default_targets=no
2304    target_list=$(echo "$target_list" | sed -e 's/,/ /g')
2305    for target in $target_list; do
2306        # Check that we recognised the target name; this allows a more
2307        # friendly error message than if we let it fall through.
2308        case " $default_target_list " in
2309            *" $target "*)
2310                ;;
2311            *)
2312                error_exit "Unknown target name '$target'"
2313                ;;
2314        esac
2315    done
2316fi
2317
2318for target in $target_list; do
2319    # if a deprecated target is enabled we note it here
2320    if echo "$deprecated_targets_list" | grep -q "$target"; then
2321        add_to deprecated_features $target
2322    fi
2323done
2324
2325# see if system emulation was really requested
2326case " $target_list " in
2327  *"-softmmu "*) softmmu=yes
2328  ;;
2329  *) softmmu=no
2330  ;;
2331esac
2332
2333feature_not_found() {
2334  feature=$1
2335  remedy=$2
2336
2337  error_exit "User requested feature $feature" \
2338      "configure was not able to find it." \
2339      "$remedy"
2340}
2341
2342# ---
2343# big/little endian test
2344cat > $TMPC << EOF
2345short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, };
2346short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, };
2347extern int foo(short *, short *);
2348int main(int argc, char *argv[]) {
2349    return foo(big_endian, little_endian);
2350}
2351EOF
2352
2353if compile_object ; then
2354    if strings -a $TMPO | grep -q BiGeNdIaN ; then
2355        bigendian="yes"
2356    elif strings -a $TMPO | grep -q LiTtLeEnDiAn ; then
2357        bigendian="no"
2358    else
2359        echo big/little test failed
2360    fi
2361else
2362    echo big/little test failed
2363fi
2364
2365##########################################
2366# system tools
2367if test -z "$want_tools"; then
2368    if test "$softmmu" = "no"; then
2369        want_tools=no
2370    else
2371        want_tools=yes
2372    fi
2373fi
2374
2375##########################################
2376# Disable features only meaningful for system-mode emulation
2377if test "$softmmu" = "no"; then
2378    audio_drv_list=""
2379fi
2380
2381##########################################
2382# Some versions of Mac OS X incorrectly define SIZE_MAX
2383cat > $TMPC << EOF
2384#include <stdint.h>
2385#include <stdio.h>
2386int main(int argc, char *argv[]) {
2387    return printf("%zu", SIZE_MAX);
2388}
2389EOF
2390have_broken_size_max=no
2391if ! compile_object -Werror ; then
2392    have_broken_size_max=yes
2393fi
2394
2395##########################################
2396# L2TPV3 probe
2397
2398cat > $TMPC <<EOF
2399#include <sys/socket.h>
2400#include <linux/ip.h>
2401int main(void) { return sizeof(struct mmsghdr); }
2402EOF
2403if compile_prog "" "" ; then
2404  l2tpv3=yes
2405else
2406  l2tpv3=no
2407fi
2408
2409cat > $TMPC <<EOF
2410#include <sys/mman.h>
2411int main(int argc, char *argv[]) {
2412    return mlockall(MCL_FUTURE);
2413}
2414EOF
2415if compile_prog "" "" ; then
2416  have_mlockall=yes
2417else
2418  have_mlockall=no
2419fi
2420
2421#########################################
2422# vhost interdependencies and host support
2423
2424# vhost backends
2425if test "$vhost_user" = "yes" && test "$linux" != "yes"; then
2426  error_exit "vhost-user is only available on Linux"
2427fi
2428test "$vhost_vdpa" = "" && vhost_vdpa=$linux
2429if test "$vhost_vdpa" = "yes" && test "$linux" != "yes"; then
2430  error_exit "vhost-vdpa is only available on Linux"
2431fi
2432test "$vhost_kernel" = "" && vhost_kernel=$linux
2433if test "$vhost_kernel" = "yes" && test "$linux" != "yes"; then
2434  error_exit "vhost-kernel is only available on Linux"
2435fi
2436
2437# vhost-kernel devices
2438test "$vhost_scsi" = "" && vhost_scsi=$vhost_kernel
2439if test "$vhost_scsi" = "yes" && test "$vhost_kernel" != "yes"; then
2440  error_exit "--enable-vhost-scsi requires --enable-vhost-kernel"
2441fi
2442test "$vhost_vsock" = "" && vhost_vsock=$vhost_kernel
2443if test "$vhost_vsock" = "yes" && test "$vhost_kernel" != "yes"; then
2444  error_exit "--enable-vhost-vsock requires --enable-vhost-kernel"
2445fi
2446
2447# vhost-user backends
2448test "$vhost_net_user" = "" && vhost_net_user=$vhost_user
2449if test "$vhost_net_user" = "yes" && test "$vhost_user" = "no"; then
2450  error_exit "--enable-vhost-net-user requires --enable-vhost-user"
2451fi
2452test "$vhost_crypto" = "" && vhost_crypto=$vhost_user
2453if test "$vhost_crypto" = "yes" && test "$vhost_user" = "no"; then
2454  error_exit "--enable-vhost-crypto requires --enable-vhost-user"
2455fi
2456test "$vhost_user_fs" = "" && vhost_user_fs=$vhost_user
2457if test "$vhost_user_fs" = "yes" && test "$vhost_user" = "no"; then
2458  error_exit "--enable-vhost-user-fs requires --enable-vhost-user"
2459fi
2460#vhost-vdpa backends
2461test "$vhost_net_vdpa" = "" && vhost_net_vdpa=$vhost_vdpa
2462if test "$vhost_net_vdpa" = "yes" && test "$vhost_vdpa" = "no"; then
2463  error_exit "--enable-vhost-net-vdpa requires --enable-vhost-vdpa"
2464fi
2465
2466# OR the vhost-kernel, vhost-vdpa and vhost-user values for simplicity
2467if test "$vhost_net" = ""; then
2468  test "$vhost_net_user" = "yes" && vhost_net=yes
2469  test "$vhost_net_vdpa" = "yes" && vhost_net=yes
2470  test "$vhost_kernel" = "yes" && vhost_net=yes
2471fi
2472
2473##########################################
2474# pkg-config probe
2475
2476if ! has "$pkg_config_exe"; then
2477  error_exit "pkg-config binary '$pkg_config_exe' not found"
2478fi
2479
2480##########################################
2481# NPTL probe
2482
2483if test "$linux_user" = "yes"; then
2484  cat > $TMPC <<EOF
2485#include <sched.h>
2486#include <linux/futex.h>
2487int main(void) {
2488#if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
2489#error bork
2490#endif
2491  return 0;
2492}
2493EOF
2494  if ! compile_object ; then
2495    feature_not_found "nptl" "Install glibc and linux kernel headers."
2496  fi
2497fi
2498
2499##########################################
2500# xen probe
2501
2502if test "$xen" != "disabled" ; then
2503  # Check whether Xen library path is specified via --extra-ldflags to avoid
2504  # overriding this setting with pkg-config output. If not, try pkg-config
2505  # to obtain all needed flags.
2506
2507  if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
2508     $pkg_config --exists xencontrol ; then
2509    xen_ctrl_version="$(printf '%d%02d%02d' \
2510      $($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
2511    xen=enabled
2512    xen_pc="xencontrol xenstore xenforeignmemory xengnttab"
2513    xen_pc="$xen_pc xenevtchn xendevicemodel"
2514    if $pkg_config --exists xentoolcore; then
2515      xen_pc="$xen_pc xentoolcore"
2516    fi
2517    xen_cflags="$($pkg_config --cflags $xen_pc)"
2518    xen_libs="$($pkg_config --libs $xen_pc)"
2519  else
2520
2521    xen_libs="-lxenstore -lxenctrl"
2522    xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
2523
2524    # First we test whether Xen headers and libraries are available.
2525    # If no, we are done and there is no Xen support.
2526    # If yes, more tests are run to detect the Xen version.
2527
2528    # Xen (any)
2529    cat > $TMPC <<EOF
2530#include <xenctrl.h>
2531int main(void) {
2532  return 0;
2533}
2534EOF
2535    if ! compile_prog "" "$xen_libs" ; then
2536      # Xen not found
2537      if test "$xen" = "enabled" ; then
2538        feature_not_found "xen" "Install xen devel"
2539      fi
2540      xen=disabled
2541
2542    # Xen unstable
2543    elif
2544        cat > $TMPC <<EOF &&
2545#undef XC_WANT_COMPAT_DEVICEMODEL_API
2546#define __XEN_TOOLS__
2547#include <xendevicemodel.h>
2548#include <xenforeignmemory.h>
2549int main(void) {
2550  xendevicemodel_handle *xd;
2551  xenforeignmemory_handle *xfmem;
2552
2553  xd = xendevicemodel_open(0, 0);
2554  xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
2555
2556  xfmem = xenforeignmemory_open(0, 0);
2557  xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
2558
2559  return 0;
2560}
2561EOF
2562        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2563      then
2564      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2565      xen_ctrl_version=41100
2566      xen=enabled
2567    elif
2568        cat > $TMPC <<EOF &&
2569#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2570#include <xenforeignmemory.h>
2571#include <xentoolcore.h>
2572int main(void) {
2573  xenforeignmemory_handle *xfmem;
2574
2575  xfmem = xenforeignmemory_open(0, 0);
2576  xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
2577  xentoolcore_restrict_all(0);
2578
2579  return 0;
2580}
2581EOF
2582        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2583      then
2584      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2585      xen_ctrl_version=41000
2586      xen=enabled
2587    elif
2588        cat > $TMPC <<EOF &&
2589#undef XC_WANT_COMPAT_DEVICEMODEL_API
2590#define __XEN_TOOLS__
2591#include <xendevicemodel.h>
2592int main(void) {
2593  xendevicemodel_handle *xd;
2594
2595  xd = xendevicemodel_open(0, 0);
2596  xendevicemodel_close(xd);
2597
2598  return 0;
2599}
2600EOF
2601        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
2602      then
2603      xen_stable_libs="-lxendevicemodel $xen_stable_libs"
2604      xen_ctrl_version=40900
2605      xen=enabled
2606    elif
2607        cat > $TMPC <<EOF &&
2608/*
2609 * If we have stable libs the we don't want the libxc compat
2610 * layers, regardless of what CFLAGS we may have been given.
2611 *
2612 * Also, check if xengnttab_grant_copy_segment_t is defined and
2613 * grant copy operation is implemented.
2614 */
2615#undef XC_WANT_COMPAT_EVTCHN_API
2616#undef XC_WANT_COMPAT_GNTTAB_API
2617#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2618#include <xenctrl.h>
2619#include <xenstore.h>
2620#include <xenevtchn.h>
2621#include <xengnttab.h>
2622#include <xenforeignmemory.h>
2623#include <stdint.h>
2624#include <xen/hvm/hvm_info_table.h>
2625#if !defined(HVM_MAX_VCPUS)
2626# error HVM_MAX_VCPUS not defined
2627#endif
2628int main(void) {
2629  xc_interface *xc = NULL;
2630  xenforeignmemory_handle *xfmem;
2631  xenevtchn_handle *xe;
2632  xengnttab_handle *xg;
2633  xengnttab_grant_copy_segment_t* seg = NULL;
2634
2635  xs_daemon_open();
2636
2637  xc = xc_interface_open(0, 0, 0);
2638  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2639  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2640  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2641  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2642
2643  xfmem = xenforeignmemory_open(0, 0);
2644  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2645
2646  xe = xenevtchn_open(0, 0);
2647  xenevtchn_fd(xe);
2648
2649  xg = xengnttab_open(0, 0);
2650  xengnttab_grant_copy(xg, 0, seg);
2651
2652  return 0;
2653}
2654EOF
2655        compile_prog "" "$xen_libs $xen_stable_libs"
2656      then
2657      xen_ctrl_version=40800
2658      xen=enabled
2659    elif
2660        cat > $TMPC <<EOF &&
2661/*
2662 * If we have stable libs the we don't want the libxc compat
2663 * layers, regardless of what CFLAGS we may have been given.
2664 */
2665#undef XC_WANT_COMPAT_EVTCHN_API
2666#undef XC_WANT_COMPAT_GNTTAB_API
2667#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2668#include <xenctrl.h>
2669#include <xenstore.h>
2670#include <xenevtchn.h>
2671#include <xengnttab.h>
2672#include <xenforeignmemory.h>
2673#include <stdint.h>
2674#include <xen/hvm/hvm_info_table.h>
2675#if !defined(HVM_MAX_VCPUS)
2676# error HVM_MAX_VCPUS not defined
2677#endif
2678int main(void) {
2679  xc_interface *xc = NULL;
2680  xenforeignmemory_handle *xfmem;
2681  xenevtchn_handle *xe;
2682  xengnttab_handle *xg;
2683
2684  xs_daemon_open();
2685
2686  xc = xc_interface_open(0, 0, 0);
2687  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2688  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2689  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2690  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2691
2692  xfmem = xenforeignmemory_open(0, 0);
2693  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2694
2695  xe = xenevtchn_open(0, 0);
2696  xenevtchn_fd(xe);
2697
2698  xg = xengnttab_open(0, 0);
2699  xengnttab_map_grant_ref(xg, 0, 0, 0);
2700
2701  return 0;
2702}
2703EOF
2704        compile_prog "" "$xen_libs $xen_stable_libs"
2705      then
2706      xen_ctrl_version=40701
2707      xen=enabled
2708
2709    # Xen 4.6
2710    elif
2711        cat > $TMPC <<EOF &&
2712#include <xenctrl.h>
2713#include <xenstore.h>
2714#include <stdint.h>
2715#include <xen/hvm/hvm_info_table.h>
2716#if !defined(HVM_MAX_VCPUS)
2717# error HVM_MAX_VCPUS not defined
2718#endif
2719int main(void) {
2720  xc_interface *xc;
2721  xs_daemon_open();
2722  xc = xc_interface_open(0, 0, 0);
2723  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2724  xc_gnttab_open(NULL, 0);
2725  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2726  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2727  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2728  xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
2729  return 0;
2730}
2731EOF
2732        compile_prog "" "$xen_libs"
2733      then
2734      xen_ctrl_version=40600
2735      xen=enabled
2736
2737    # Xen 4.5
2738    elif
2739        cat > $TMPC <<EOF &&
2740#include <xenctrl.h>
2741#include <xenstore.h>
2742#include <stdint.h>
2743#include <xen/hvm/hvm_info_table.h>
2744#if !defined(HVM_MAX_VCPUS)
2745# error HVM_MAX_VCPUS not defined
2746#endif
2747int main(void) {
2748  xc_interface *xc;
2749  xs_daemon_open();
2750  xc = xc_interface_open(0, 0, 0);
2751  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2752  xc_gnttab_open(NULL, 0);
2753  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2754  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2755  xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
2756  return 0;
2757}
2758EOF
2759        compile_prog "" "$xen_libs"
2760      then
2761      xen_ctrl_version=40500
2762      xen=enabled
2763
2764    elif
2765        cat > $TMPC <<EOF &&
2766#include <xenctrl.h>
2767#include <xenstore.h>
2768#include <stdint.h>
2769#include <xen/hvm/hvm_info_table.h>
2770#if !defined(HVM_MAX_VCPUS)
2771# error HVM_MAX_VCPUS not defined
2772#endif
2773int main(void) {
2774  xc_interface *xc;
2775  xs_daemon_open();
2776  xc = xc_interface_open(0, 0, 0);
2777  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2778  xc_gnttab_open(NULL, 0);
2779  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2780  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2781  return 0;
2782}
2783EOF
2784        compile_prog "" "$xen_libs"
2785      then
2786      xen_ctrl_version=40200
2787      xen=enabled
2788
2789    else
2790      if test "$xen" = "enabled" ; then
2791        feature_not_found "xen (unsupported version)" \
2792                          "Install a supported xen (xen 4.2 or newer)"
2793      fi
2794      xen=disabled
2795    fi
2796
2797    if test "$xen" = enabled; then
2798      if test $xen_ctrl_version -ge 40701  ; then
2799        xen_libs="$xen_libs $xen_stable_libs "
2800      fi
2801    fi
2802  fi
2803fi
2804
2805##########################################
2806# GNUTLS probe
2807
2808if test "$gnutls" != "no"; then
2809    pass="no"
2810    if $pkg_config --exists "gnutls >= 3.5.18"; then
2811        gnutls_cflags=$($pkg_config --cflags gnutls)
2812        gnutls_libs=$($pkg_config --libs gnutls)
2813        # Packaging for the static libraries is not always correct.
2814        # At least ubuntu 18.04 ships only shared libraries.
2815        write_c_skeleton
2816        if compile_prog "" "$gnutls_libs" ; then
2817            pass="yes"
2818        fi
2819    fi
2820    if test "$pass" = "no" && test "$gnutls" = "yes"; then
2821	feature_not_found "gnutls" "Install gnutls devel >= 3.1.18"
2822    else
2823        gnutls="$pass"
2824    fi
2825fi
2826
2827
2828# If user didn't give a --disable/enable-gcrypt flag,
2829# then mark as disabled if user requested nettle
2830# explicitly
2831if test -z "$gcrypt"
2832then
2833    if test "$nettle" = "yes"
2834    then
2835        gcrypt="no"
2836    fi
2837fi
2838
2839# If user didn't give a --disable/enable-nettle flag,
2840# then mark as disabled if user requested gcrypt
2841# explicitly
2842if test -z "$nettle"
2843then
2844    if test "$gcrypt" = "yes"
2845    then
2846        nettle="no"
2847    fi
2848fi
2849
2850has_libgcrypt() {
2851    if ! has "libgcrypt-config"
2852    then
2853	return 1
2854    fi
2855
2856    if test -n "$cross_prefix"
2857    then
2858	host=$(libgcrypt-config --host)
2859	if test "$host-" != $cross_prefix
2860	then
2861	    return 1
2862	fi
2863    fi
2864
2865    maj=`libgcrypt-config --version | awk -F . '{print $1}'`
2866    min=`libgcrypt-config --version | awk -F . '{print $2}'`
2867
2868    if test $maj != 1 || test $min -lt 8
2869    then
2870       return 1
2871    fi
2872
2873    return 0
2874}
2875
2876
2877if test "$nettle" != "no"; then
2878    pass="no"
2879    if $pkg_config --exists "nettle >= 3.4"; then
2880        nettle_cflags=$($pkg_config --cflags nettle)
2881        nettle_libs=$($pkg_config --libs nettle)
2882        # Link test to make sure the given libraries work (e.g for static).
2883        write_c_skeleton
2884        if compile_prog "" "$nettle_libs" ; then
2885            if test -z "$gcrypt"; then
2886               gcrypt="no"
2887            fi
2888            pass="yes"
2889        fi
2890    fi
2891    if test "$pass" = "yes"
2892    then
2893        cat > $TMPC << EOF
2894#include <nettle/xts.h>
2895int main(void) {
2896  return 0;
2897}
2898EOF
2899        if compile_prog "$nettle_cflags" "$nettle_libs" ; then
2900            nettle_xts=yes
2901            qemu_private_xts=no
2902        fi
2903    fi
2904    if test "$pass" = "no" && test "$nettle" = "yes"; then
2905        feature_not_found "nettle" "Install nettle devel >= 2.7.1"
2906    else
2907        nettle="$pass"
2908    fi
2909fi
2910
2911if test "$gcrypt" != "no"; then
2912    pass="no"
2913    if has_libgcrypt; then
2914        gcrypt_cflags=$(libgcrypt-config --cflags)
2915        gcrypt_libs=$(libgcrypt-config --libs)
2916        # Debian has removed -lgpg-error from libgcrypt-config
2917        # as it "spreads unnecessary dependencies" which in
2918        # turn breaks static builds...
2919        if test "$static" = "yes"
2920        then
2921            gcrypt_libs="$gcrypt_libs -lgpg-error"
2922        fi
2923
2924        # Link test to make sure the given libraries work (e.g for static).
2925        write_c_skeleton
2926        if compile_prog "" "$gcrypt_libs" ; then
2927            pass="yes"
2928        fi
2929    fi
2930    if test "$pass" = "yes"; then
2931        gcrypt="yes"
2932        cat > $TMPC << EOF
2933#include <gcrypt.h>
2934int main(void) {
2935  gcry_cipher_hd_t handle;
2936  gcry_cipher_open(&handle, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_XTS, 0);
2937  return 0;
2938}
2939EOF
2940        if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
2941            gcrypt_xts=yes
2942            qemu_private_xts=no
2943        fi
2944    elif test "$gcrypt" = "yes"; then
2945        feature_not_found "gcrypt" "Install gcrypt devel >= 1.5.0"
2946    else
2947        gcrypt="no"
2948    fi
2949fi
2950
2951
2952if test "$gcrypt" = "yes" && test "$nettle" = "yes"
2953then
2954    error_exit "Only one of gcrypt & nettle can be enabled"
2955fi
2956
2957##########################################
2958# libtasn1 - only for the TLS creds/session test suite
2959
2960tasn1=yes
2961tasn1_cflags=""
2962tasn1_libs=""
2963if $pkg_config --exists "libtasn1"; then
2964    tasn1_cflags=$($pkg_config --cflags libtasn1)
2965    tasn1_libs=$($pkg_config --libs libtasn1)
2966else
2967    tasn1=no
2968fi
2969
2970
2971##########################################
2972# PAM probe
2973
2974if test "$auth_pam" != "no"; then
2975    cat > $TMPC <<EOF
2976#include <security/pam_appl.h>
2977#include <stdio.h>
2978int main(void) {
2979   const char *service_name = "qemu";
2980   const char *user = "frank";
2981   const struct pam_conv pam_conv = { 0 };
2982   pam_handle_t *pamh = NULL;
2983   pam_start(service_name, user, &pam_conv, &pamh);
2984   return 0;
2985}
2986EOF
2987    if compile_prog "" "-lpam" ; then
2988        auth_pam=yes
2989    else
2990        if test "$auth_pam" = "yes"; then
2991            feature_not_found "PAM" "Install PAM development package"
2992        else
2993            auth_pam=no
2994        fi
2995    fi
2996fi
2997
2998##########################################
2999# VTE probe
3000
3001if test "$vte" != "no"; then
3002    vteminversion="0.32.0"
3003    if $pkg_config --exists "vte-2.91"; then
3004      vtepackage="vte-2.91"
3005    else
3006      vtepackage="vte-2.90"
3007    fi
3008    if $pkg_config --exists "$vtepackage >= $vteminversion"; then
3009        vte_cflags=$($pkg_config --cflags $vtepackage)
3010        vte_libs=$($pkg_config --libs $vtepackage)
3011        vteversion=$($pkg_config --modversion $vtepackage)
3012        vte="yes"
3013    elif test "$vte" = "yes"; then
3014        feature_not_found "vte" "Install libvte-2.90/2.91 devel"
3015    else
3016        vte="no"
3017    fi
3018fi
3019
3020##########################################
3021# RDMA needs OpenFabrics libraries
3022if test "$rdma" != "no" ; then
3023  cat > $TMPC <<EOF
3024#include <rdma/rdma_cma.h>
3025int main(void) { return 0; }
3026EOF
3027  rdma_libs="-lrdmacm -libverbs -libumad"
3028  if compile_prog "" "$rdma_libs" ; then
3029    rdma="yes"
3030  else
3031    if test "$rdma" = "yes" ; then
3032        error_exit \
3033            " OpenFabrics librdmacm/libibverbs/libibumad not present." \
3034            " Your options:" \
3035            "  (1) Fast: Install infiniband packages (devel) from your distro." \
3036            "  (2) Cleanest: Install libraries from www.openfabrics.org" \
3037            "  (3) Also: Install softiwarp if you don't have RDMA hardware"
3038    fi
3039    rdma="no"
3040  fi
3041fi
3042
3043##########################################
3044# PVRDMA detection
3045
3046cat > $TMPC <<EOF &&
3047#include <sys/mman.h>
3048
3049int
3050main(void)
3051{
3052    char buf = 0;
3053    void *addr = &buf;
3054    addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
3055
3056    return 0;
3057}
3058EOF
3059
3060if test "$rdma" = "yes" ; then
3061    case "$pvrdma" in
3062    "")
3063        if compile_prog "" ""; then
3064            pvrdma="yes"
3065        else
3066            pvrdma="no"
3067        fi
3068        ;;
3069    "yes")
3070        if ! compile_prog "" ""; then
3071            error_exit "PVRDMA is not supported since mremap is not implemented"
3072        fi
3073        pvrdma="yes"
3074        ;;
3075    "no")
3076        pvrdma="no"
3077        ;;
3078    esac
3079else
3080    if test "$pvrdma" = "yes" ; then
3081        error_exit "PVRDMA requires rdma suppport"
3082    fi
3083    pvrdma="no"
3084fi
3085
3086# Let's see if enhanced reg_mr is supported
3087if test "$pvrdma" = "yes" ; then
3088
3089cat > $TMPC <<EOF &&
3090#include <infiniband/verbs.h>
3091
3092int
3093main(void)
3094{
3095    struct ibv_mr *mr;
3096    struct ibv_pd *pd = NULL;
3097    size_t length = 10;
3098    uint64_t iova = 0;
3099    int access = 0;
3100    void *addr = NULL;
3101
3102    mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
3103
3104    ibv_dereg_mr(mr);
3105
3106    return 0;
3107}
3108EOF
3109    if ! compile_prog "" "-libverbs"; then
3110        QEMU_CFLAGS="$QEMU_CFLAGS -DLEGACY_RDMA_REG_MR"
3111    fi
3112fi
3113
3114##########################################
3115# xfsctl() probe, used for file-posix.c
3116if test "$xfs" != "no" ; then
3117  cat > $TMPC << EOF
3118#include <stddef.h>  /* NULL */
3119#include <xfs/xfs.h>
3120int main(void)
3121{
3122    xfsctl(NULL, 0, 0, NULL);
3123    return 0;
3124}
3125EOF
3126  if compile_prog "" "" ; then
3127    xfs="yes"
3128  else
3129    if test "$xfs" = "yes" ; then
3130      feature_not_found "xfs" "Install xfsprogs/xfslibs devel"
3131    fi
3132    xfs=no
3133  fi
3134fi
3135
3136##########################################
3137# vde libraries probe
3138if test "$vde" != "no" ; then
3139  vde_libs="-lvdeplug"
3140  cat > $TMPC << EOF
3141#include <libvdeplug.h>
3142int main(void)
3143{
3144    struct vde_open_args a = {0, 0, 0};
3145    char s[] = "";
3146    vde_open(s, s, &a);
3147    return 0;
3148}
3149EOF
3150  if compile_prog "" "$vde_libs" ; then
3151    vde=yes
3152  else
3153    if test "$vde" = "yes" ; then
3154      feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
3155    fi
3156    vde=no
3157  fi
3158fi
3159
3160##########################################
3161# netmap support probe
3162# Apart from looking for netmap headers, we make sure that the host API version
3163# supports the netmap backend (>=11). The upper bound (15) is meant to simulate
3164# a minor/major version number. Minor new features will be marked with values up
3165# to 15, and if something happens that requires a change to the backend we will
3166# move above 15, submit the backend fixes and modify this two bounds.
3167if test "$netmap" != "no" ; then
3168  cat > $TMPC << EOF
3169#include <inttypes.h>
3170#include <net/if.h>
3171#include <net/netmap.h>
3172#include <net/netmap_user.h>
3173#if (NETMAP_API < 11) || (NETMAP_API > 15)
3174#error
3175#endif
3176int main(void) { return 0; }
3177EOF
3178  if compile_prog "" "" ; then
3179    netmap=yes
3180  else
3181    if test "$netmap" = "yes" ; then
3182      feature_not_found "netmap"
3183    fi
3184    netmap=no
3185  fi
3186fi
3187
3188##########################################
3189# detect CoreAudio
3190if test "$coreaudio" != "no" ; then
3191  coreaudio_libs="-framework CoreAudio"
3192  cat > $TMPC << EOF
3193#include <CoreAudio/CoreAudio.h>
3194int main(void)
3195{
3196  return (int)AudioGetCurrentHostTime();
3197}
3198EOF
3199  if compile_prog "" "$coreaudio_libs" ; then
3200    coreaudio=yes
3201  else
3202    coreaudio=no
3203  fi
3204fi
3205
3206##########################################
3207# Sound support libraries probe
3208
3209audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
3210for drv in $audio_drv_list; do
3211    case $drv in
3212    alsa | try-alsa)
3213    if $pkg_config alsa --exists; then
3214        alsa_libs=$($pkg_config alsa --libs)
3215        alsa_cflags=$($pkg_config alsa --cflags)
3216        alsa=yes
3217        if test "$drv" = "try-alsa"; then
3218            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa/alsa/')
3219        fi
3220    else
3221        if test "$drv" = "try-alsa"; then
3222            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa//')
3223        else
3224            error_exit "$drv check failed" \
3225                "Make sure to have the $drv libs and headers installed."
3226        fi
3227    fi
3228    ;;
3229
3230    pa | try-pa)
3231    if $pkg_config libpulse --exists; then
3232        libpulse=yes
3233        pulse_libs=$($pkg_config libpulse --libs)
3234        pulse_cflags=$($pkg_config libpulse --cflags)
3235        if test "$drv" = "try-pa"; then
3236            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa/pa/')
3237        fi
3238    else
3239        if test "$drv" = "try-pa"; then
3240            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa//')
3241        else
3242            error_exit "$drv check failed" \
3243                "Make sure to have the $drv libs and headers installed."
3244        fi
3245    fi
3246    ;;
3247
3248    sdl)
3249    if test "$sdl" = "no"; then
3250        error_exit "sdl not found or disabled, can not use sdl audio driver"
3251    fi
3252    ;;
3253
3254    try-sdl)
3255    if test "$sdl" = "no"; then
3256        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl//')
3257    else
3258        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl/sdl/')
3259    fi
3260    ;;
3261
3262    coreaudio | try-coreaudio)
3263    if test "$coreaudio" = "no"; then
3264      if test "$drv" = "try-coreaudio"; then
3265        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-coreaudio//')
3266      else
3267        error_exit "$drv check failed" \
3268                "Make sure to have the $drv is available."
3269      fi
3270    else
3271      coreaudio_libs="-framework CoreAudio"
3272      if test "$drv" = "try-coreaudio"; then
3273        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-coreaudio/coreaudio/')
3274      fi
3275    fi
3276    ;;
3277
3278    dsound)
3279      dsound_libs="-lole32 -ldxguid"
3280      audio_win_int="yes"
3281    ;;
3282
3283    oss)
3284      oss_libs="$oss_lib"
3285    ;;
3286
3287    jack | try-jack)
3288    if $pkg_config jack --exists; then
3289        libjack=yes
3290        jack_libs=$($pkg_config jack --libs)
3291        if test "$drv" = "try-jack"; then
3292            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack/jack/')
3293        fi
3294    else
3295        if test "$drv" = "try-jack"; then
3296            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack//')
3297        else
3298            error_exit "$drv check failed" \
3299                "Make sure to have the $drv libs and headers installed."
3300        fi
3301    fi
3302    ;;
3303
3304    *)
3305    echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
3306        error_exit "Unknown driver '$drv' selected" \
3307            "Possible drivers are: $audio_possible_drivers"
3308    }
3309    ;;
3310    esac
3311done
3312
3313##########################################
3314# glib support probe
3315
3316glib_req_ver=2.56
3317glib_modules=gthread-2.0
3318if test "$modules" = yes; then
3319    glib_modules="$glib_modules gmodule-export-2.0"
3320fi
3321if test "$plugins" = yes; then
3322    glib_modules="$glib_modules gmodule-2.0"
3323fi
3324
3325for i in $glib_modules; do
3326    if $pkg_config --atleast-version=$glib_req_ver $i; then
3327        glib_cflags=$($pkg_config --cflags $i)
3328        glib_libs=$($pkg_config --libs $i)
3329    else
3330        error_exit "glib-$glib_req_ver $i is required to compile QEMU"
3331    fi
3332done
3333
3334# This workaround is required due to a bug in pkg-config file for glib as it
3335# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
3336
3337if test "$static" = yes && test "$mingw32" = yes; then
3338    glib_cflags="-DGLIB_STATIC_COMPILATION $glib_cflags"
3339fi
3340
3341if ! test "$gio" = "no"; then
3342    pass=no
3343    if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
3344        gio_cflags=$($pkg_config --cflags gio-2.0)
3345        gio_libs=$($pkg_config --libs gio-2.0)
3346        gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
3347        if ! has "$gdbus_codegen"; then
3348            gdbus_codegen=
3349        fi
3350        # Check that the libraries actually work -- Ubuntu 18.04 ships
3351        # with pkg-config --static --libs data for gio-2.0 that is missing
3352        # -lblkid and will give a link error.
3353        cat > $TMPC <<EOF
3354#include <gio/gio.h>
3355int main(void)
3356{
3357    g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
3358    return 0;
3359}
3360EOF
3361        if compile_prog "$gio_cflags" "$gio_libs" ; then
3362            pass=yes
3363        else
3364            pass=no
3365        fi
3366
3367        if test "$pass" = "yes" &&
3368            $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
3369            gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
3370            gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
3371        fi
3372    fi
3373
3374    if test "$pass" = "no"; then
3375        if test "$gio" = "yes"; then
3376            feature_not_found "gio" "Install libgio >= 2.0"
3377        else
3378            gio=no
3379        fi
3380    else
3381        gio=yes
3382    fi
3383fi
3384
3385# Sanity check that the current size_t matches the
3386# size that glib thinks it should be. This catches
3387# problems on multi-arch where people try to build
3388# 32-bit QEMU while pointing at 64-bit glib headers
3389cat > $TMPC <<EOF
3390#include <glib.h>
3391#include <unistd.h>
3392
3393#define QEMU_BUILD_BUG_ON(x) \
3394  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
3395
3396int main(void) {
3397   QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
3398   return 0;
3399}
3400EOF
3401
3402if ! compile_prog "$glib_cflags" "$glib_libs" ; then
3403    error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
3404               "You probably need to set PKG_CONFIG_LIBDIR"\
3405	       "to point to the right pkg-config files for your"\
3406	       "build target"
3407fi
3408
3409# Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
3410cat > $TMPC << EOF
3411#include <glib.h>
3412int main(void) { return 0; }
3413EOF
3414if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3415    if cc_has_warning_flag "-Wno-unknown-attributes"; then
3416        glib_cflags="-Wno-unknown-attributes $glib_cflags"
3417        CONFIGURE_CFLAGS="-Wno-unknown-attributes $CONFIGURE_CFLAGS"
3418    fi
3419fi
3420
3421# Silence clang warnings triggered by glib < 2.57.2
3422cat > $TMPC << EOF
3423#include <glib.h>
3424typedef struct Foo {
3425    int i;
3426} Foo;
3427static void foo_free(Foo *f)
3428{
3429    g_free(f);
3430}
3431G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free);
3432int main(void) { return 0; }
3433EOF
3434if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3435    if cc_has_warning_flag "-Wno-unused-function"; then
3436        glib_cflags="$glib_cflags -Wno-unused-function"
3437        CONFIGURE_CFLAGS="$CONFIGURE_CFLAGS -Wno-unused-function"
3438    fi
3439fi
3440
3441##########################################
3442# SHA command probe for modules
3443if test "$modules" = yes; then
3444    shacmd_probe="sha1sum sha1 shasum"
3445    for c in $shacmd_probe; do
3446        if has $c; then
3447            shacmd="$c"
3448            break
3449        fi
3450    done
3451    if test "$shacmd" = ""; then
3452        error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
3453    fi
3454fi
3455
3456##########################################
3457# pthread probe
3458PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
3459
3460pthread=no
3461cat > $TMPC << EOF
3462#include <pthread.h>
3463static void *f(void *p) { return NULL; }
3464int main(void) {
3465  pthread_t thread;
3466  pthread_create(&thread, 0, f, 0);
3467  return 0;
3468}
3469EOF
3470if compile_prog "" "" ; then
3471  pthread=yes
3472else
3473  for pthread_lib in $PTHREADLIBS_LIST; do
3474    if compile_prog "" "$pthread_lib" ; then
3475      pthread=yes
3476      break
3477    fi
3478  done
3479fi
3480
3481if test "$mingw32" != yes && test "$pthread" = no; then
3482  error_exit "pthread check failed" \
3483      "Make sure to have the pthread libs and headers installed."
3484fi
3485
3486# check for pthread_setname_np with thread id
3487pthread_setname_np_w_tid=no
3488cat > $TMPC << EOF
3489#include <pthread.h>
3490
3491static void *f(void *p) { return NULL; }
3492int main(void)
3493{
3494    pthread_t thread;
3495    pthread_create(&thread, 0, f, 0);
3496    pthread_setname_np(thread, "QEMU");
3497    return 0;
3498}
3499EOF
3500if compile_prog "" "$pthread_lib" ; then
3501  pthread_setname_np_w_tid=yes
3502fi
3503
3504# check for pthread_setname_np without thread id
3505pthread_setname_np_wo_tid=no
3506cat > $TMPC << EOF
3507#include <pthread.h>
3508
3509static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
3510int main(void)
3511{
3512    pthread_t thread;
3513    pthread_create(&thread, 0, f, 0);
3514    return 0;
3515}
3516EOF
3517if compile_prog "" "$pthread_lib" ; then
3518  pthread_setname_np_wo_tid=yes
3519fi
3520
3521##########################################
3522# libssh probe
3523if test "$libssh" != "no" ; then
3524  if $pkg_config --exists "libssh >= 0.8.7"; then
3525    libssh_cflags=$($pkg_config libssh --cflags)
3526    libssh_libs=$($pkg_config libssh --libs)
3527    libssh=yes
3528  else
3529    if test "$libssh" = "yes" ; then
3530      error_exit "libssh required for --enable-libssh"
3531    fi
3532    libssh=no
3533  fi
3534fi
3535
3536##########################################
3537# linux-aio probe
3538
3539if test "$linux_aio" != "no" ; then
3540  cat > $TMPC <<EOF
3541#include <libaio.h>
3542#include <sys/eventfd.h>
3543#include <stddef.h>
3544int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
3545EOF
3546  if compile_prog "" "-laio" ; then
3547    linux_aio=yes
3548  else
3549    if test "$linux_aio" = "yes" ; then
3550      feature_not_found "linux AIO" "Install libaio devel"
3551    fi
3552    linux_aio=no
3553  fi
3554fi
3555##########################################
3556# linux-io-uring probe
3557
3558if test "$linux_io_uring" != "no" ; then
3559  if $pkg_config liburing; then
3560    linux_io_uring_cflags=$($pkg_config --cflags liburing)
3561    linux_io_uring_libs=$($pkg_config --libs liburing)
3562    linux_io_uring=yes
3563  else
3564    if test "$linux_io_uring" = "yes" ; then
3565      feature_not_found "linux io_uring" "Install liburing devel"
3566    fi
3567    linux_io_uring=no
3568  fi
3569fi
3570
3571##########################################
3572# TPM emulation is only on POSIX
3573
3574if test "$tpm" = ""; then
3575  if test "$mingw32" = "yes"; then
3576    tpm=no
3577  else
3578    tpm=yes
3579  fi
3580elif test "$tpm" = "yes"; then
3581  if test "$mingw32" = "yes" ; then
3582    error_exit "TPM emulation only available on POSIX systems"
3583  fi
3584fi
3585
3586##########################################
3587# iovec probe
3588cat > $TMPC <<EOF
3589#include <sys/types.h>
3590#include <sys/uio.h>
3591#include <unistd.h>
3592int main(void) { return sizeof(struct iovec); }
3593EOF
3594iovec=no
3595if compile_prog "" "" ; then
3596  iovec=yes
3597fi
3598
3599##########################################
3600# fdt probe
3601
3602case "$fdt" in
3603  auto | enabled | internal)
3604    # Simpler to always update submodule, even if not needed.
3605    git_submodules="${git_submodules} dtc"
3606    ;;
3607esac
3608
3609##########################################
3610# opengl probe (for sdl2, gtk)
3611
3612gbm="no"
3613if $pkg_config gbm; then
3614    gbm_cflags="$($pkg_config --cflags gbm)"
3615    gbm_libs="$($pkg_config --libs gbm)"
3616    gbm="yes"
3617fi
3618
3619if test "$opengl" != "no" ; then
3620  epoxy=no
3621  if $pkg_config epoxy; then
3622    cat > $TMPC << EOF
3623#include <epoxy/egl.h>
3624int main(void) { return 0; }
3625EOF
3626    if compile_prog "" "" ; then
3627      epoxy=yes
3628    fi
3629  fi
3630
3631  if test "$epoxy" = "yes" ; then
3632    opengl_cflags="$($pkg_config --cflags epoxy)"
3633    opengl_libs="$($pkg_config --libs epoxy)"
3634    opengl=yes
3635  else
3636    if test "$opengl" = "yes" ; then
3637      feature_not_found "opengl" "Please install epoxy with EGL"
3638    fi
3639    opengl_cflags=""
3640    opengl_libs=""
3641    opengl=no
3642  fi
3643fi
3644
3645##########################################
3646# libxml2 probe
3647if test "$libxml2" != "no" ; then
3648    if $pkg_config --exists libxml-2.0; then
3649        libxml2="yes"
3650        libxml2_cflags=$($pkg_config --cflags libxml-2.0)
3651        libxml2_libs=$($pkg_config --libs libxml-2.0)
3652    else
3653        if test "$libxml2" = "yes"; then
3654            feature_not_found "libxml2" "Install libxml2 devel"
3655        fi
3656        libxml2="no"
3657    fi
3658fi
3659
3660# Check for inotify functions when we are building linux-user
3661# emulator.  This is done because older glibc versions don't
3662# have syscall stubs for these implemented.  In that case we
3663# don't provide them even if kernel supports them.
3664#
3665inotify=no
3666cat > $TMPC << EOF
3667#include <sys/inotify.h>
3668
3669int
3670main(void)
3671{
3672	/* try to start inotify */
3673	return inotify_init();
3674}
3675EOF
3676if compile_prog "" "" ; then
3677  inotify=yes
3678fi
3679
3680inotify1=no
3681cat > $TMPC << EOF
3682#include <sys/inotify.h>
3683
3684int
3685main(void)
3686{
3687    /* try to start inotify */
3688    return inotify_init1(0);
3689}
3690EOF
3691if compile_prog "" "" ; then
3692  inotify1=yes
3693fi
3694
3695# check if pipe2 is there
3696pipe2=no
3697cat > $TMPC << EOF
3698#include <unistd.h>
3699#include <fcntl.h>
3700
3701int main(void)
3702{
3703    int pipefd[2];
3704    return pipe2(pipefd, O_CLOEXEC);
3705}
3706EOF
3707if compile_prog "" "" ; then
3708  pipe2=yes
3709fi
3710
3711# check if accept4 is there
3712accept4=no
3713cat > $TMPC << EOF
3714#include <sys/socket.h>
3715#include <stddef.h>
3716
3717int main(void)
3718{
3719    accept4(0, NULL, NULL, SOCK_CLOEXEC);
3720    return 0;
3721}
3722EOF
3723if compile_prog "" "" ; then
3724  accept4=yes
3725fi
3726
3727# check if tee/splice is there. vmsplice was added same time.
3728splice=no
3729cat > $TMPC << EOF
3730#include <unistd.h>
3731#include <fcntl.h>
3732#include <limits.h>
3733
3734int main(void)
3735{
3736    int len, fd = 0;
3737    len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
3738    splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
3739    return 0;
3740}
3741EOF
3742if compile_prog "" "" ; then
3743  splice=yes
3744fi
3745
3746##########################################
3747# libnuma probe
3748
3749if test "$numa" != "no" ; then
3750  cat > $TMPC << EOF
3751#include <numa.h>
3752int main(void) { return numa_available(); }
3753EOF
3754
3755  if compile_prog "" "-lnuma" ; then
3756    numa=yes
3757    numa_libs="-lnuma"
3758  else
3759    if test "$numa" = "yes" ; then
3760      feature_not_found "numa" "install numactl devel"
3761    fi
3762    numa=no
3763  fi
3764fi
3765
3766malloc=system
3767if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
3768    echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
3769    exit 1
3770elif test "$tcmalloc" = "yes" ; then
3771    malloc=tcmalloc
3772elif test "$jemalloc" = "yes" ; then
3773    malloc=jemalloc
3774fi
3775
3776##########################################
3777# signalfd probe
3778signalfd="no"
3779cat > $TMPC << EOF
3780#include <unistd.h>
3781#include <sys/syscall.h>
3782#include <signal.h>
3783int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }
3784EOF
3785
3786if compile_prog "" "" ; then
3787  signalfd=yes
3788fi
3789
3790# check if optreset global is declared by <getopt.h>
3791optreset="no"
3792cat > $TMPC << EOF
3793#include <getopt.h>
3794int main(void) { return optreset; }
3795EOF
3796
3797if compile_prog "" "" ; then
3798  optreset=yes
3799fi
3800
3801# check if eventfd is supported
3802eventfd=no
3803cat > $TMPC << EOF
3804#include <sys/eventfd.h>
3805
3806int main(void)
3807{
3808    return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
3809}
3810EOF
3811if compile_prog "" "" ; then
3812  eventfd=yes
3813fi
3814
3815# check if memfd is supported
3816memfd=no
3817cat > $TMPC << EOF
3818#include <sys/mman.h>
3819
3820int main(void)
3821{
3822    return memfd_create("foo", MFD_ALLOW_SEALING);
3823}
3824EOF
3825if compile_prog "" "" ; then
3826  memfd=yes
3827fi
3828
3829# check for usbfs
3830have_usbfs=no
3831if test "$linux_user" = "yes"; then
3832  cat > $TMPC << EOF
3833#include <linux/usbdevice_fs.h>
3834
3835#ifndef USBDEVFS_GET_CAPABILITIES
3836#error "USBDEVFS_GET_CAPABILITIES undefined"
3837#endif
3838
3839#ifndef USBDEVFS_DISCONNECT_CLAIM
3840#error "USBDEVFS_DISCONNECT_CLAIM undefined"
3841#endif
3842
3843int main(void)
3844{
3845    return 0;
3846}
3847EOF
3848  if compile_prog "" ""; then
3849    have_usbfs=yes
3850  fi
3851fi
3852
3853# check for fallocate
3854fallocate=no
3855cat > $TMPC << EOF
3856#include <fcntl.h>
3857
3858int main(void)
3859{
3860    fallocate(0, 0, 0, 0);
3861    return 0;
3862}
3863EOF
3864if compile_prog "" "" ; then
3865  fallocate=yes
3866fi
3867
3868# check for fallocate hole punching
3869fallocate_punch_hole=no
3870cat > $TMPC << EOF
3871#include <fcntl.h>
3872#include <linux/falloc.h>
3873
3874int main(void)
3875{
3876    fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
3877    return 0;
3878}
3879EOF
3880if compile_prog "" "" ; then
3881  fallocate_punch_hole=yes
3882fi
3883
3884# check that fallocate supports range zeroing inside the file
3885fallocate_zero_range=no
3886cat > $TMPC << EOF
3887#include <fcntl.h>
3888#include <linux/falloc.h>
3889
3890int main(void)
3891{
3892    fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0);
3893    return 0;
3894}
3895EOF
3896if compile_prog "" "" ; then
3897  fallocate_zero_range=yes
3898fi
3899
3900# check for posix_fallocate
3901posix_fallocate=no
3902cat > $TMPC << EOF
3903#include <fcntl.h>
3904
3905int main(void)
3906{
3907    posix_fallocate(0, 0, 0);
3908    return 0;
3909}
3910EOF
3911if compile_prog "" "" ; then
3912    posix_fallocate=yes
3913fi
3914
3915# check for sync_file_range
3916sync_file_range=no
3917cat > $TMPC << EOF
3918#include <fcntl.h>
3919
3920int main(void)
3921{
3922    sync_file_range(0, 0, 0, 0);
3923    return 0;
3924}
3925EOF
3926if compile_prog "" "" ; then
3927  sync_file_range=yes
3928fi
3929
3930# check for linux/fiemap.h and FS_IOC_FIEMAP
3931fiemap=no
3932cat > $TMPC << EOF
3933#include <sys/ioctl.h>
3934#include <linux/fs.h>
3935#include <linux/fiemap.h>
3936
3937int main(void)
3938{
3939    ioctl(0, FS_IOC_FIEMAP, 0);
3940    return 0;
3941}
3942EOF
3943if compile_prog "" "" ; then
3944  fiemap=yes
3945fi
3946
3947# check for dup3
3948dup3=no
3949cat > $TMPC << EOF
3950#include <unistd.h>
3951
3952int main(void)
3953{
3954    dup3(0, 0, 0);
3955    return 0;
3956}
3957EOF
3958if compile_prog "" "" ; then
3959  dup3=yes
3960fi
3961
3962# check for ppoll support
3963ppoll=no
3964cat > $TMPC << EOF
3965#include <poll.h>
3966
3967int main(void)
3968{
3969    struct pollfd pfd = { .fd = 0, .events = 0, .revents = 0 };
3970    ppoll(&pfd, 1, 0, 0);
3971    return 0;
3972}
3973EOF
3974if compile_prog "" "" ; then
3975  ppoll=yes
3976fi
3977
3978# check for prctl(PR_SET_TIMERSLACK , ... ) support
3979prctl_pr_set_timerslack=no
3980cat > $TMPC << EOF
3981#include <sys/prctl.h>
3982
3983int main(void)
3984{
3985    prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0);
3986    return 0;
3987}
3988EOF
3989if compile_prog "" "" ; then
3990  prctl_pr_set_timerslack=yes
3991fi
3992
3993# check for epoll support
3994epoll=no
3995cat > $TMPC << EOF
3996#include <sys/epoll.h>
3997
3998int main(void)
3999{
4000    epoll_create(0);
4001    return 0;
4002}
4003EOF
4004if compile_prog "" "" ; then
4005  epoll=yes
4006fi
4007
4008# epoll_create1 is a later addition
4009# so we must check separately for its presence
4010epoll_create1=no
4011cat > $TMPC << EOF
4012#include <sys/epoll.h>
4013
4014int main(void)
4015{
4016    /* Note that we use epoll_create1 as a value, not as
4017     * a function being called. This is necessary so that on
4018     * old SPARC glibc versions where the function was present in
4019     * the library but not declared in the header file we will
4020     * fail the configure check. (Otherwise we will get a compiler
4021     * warning but not an error, and will proceed to fail the
4022     * qemu compile where we compile with -Werror.)
4023     */
4024    return (int)(uintptr_t)&epoll_create1;
4025}
4026EOF
4027if compile_prog "" "" ; then
4028  epoll_create1=yes
4029fi
4030
4031# check for sendfile support
4032sendfile=no
4033cat > $TMPC << EOF
4034#include <sys/sendfile.h>
4035
4036int main(void)
4037{
4038    return sendfile(0, 0, 0, 0);
4039}
4040EOF
4041if compile_prog "" "" ; then
4042  sendfile=yes
4043fi
4044
4045# check for timerfd support (glibc 2.8 and newer)
4046timerfd=no
4047cat > $TMPC << EOF
4048#include <sys/timerfd.h>
4049
4050int main(void)
4051{
4052    return(timerfd_create(CLOCK_REALTIME, 0));
4053}
4054EOF
4055if compile_prog "" "" ; then
4056  timerfd=yes
4057fi
4058
4059# check for setns and unshare support
4060setns=no
4061cat > $TMPC << EOF
4062#include <sched.h>
4063
4064int main(void)
4065{
4066    int ret;
4067    ret = setns(0, 0);
4068    ret = unshare(0);
4069    return ret;
4070}
4071EOF
4072if compile_prog "" "" ; then
4073  setns=yes
4074fi
4075
4076# clock_adjtime probe
4077clock_adjtime=no
4078cat > $TMPC <<EOF
4079#include <time.h>
4080#include <sys/timex.h>
4081
4082int main(void)
4083{
4084    return clock_adjtime(0, 0);
4085}
4086EOF
4087clock_adjtime=no
4088if compile_prog "" "" ; then
4089  clock_adjtime=yes
4090fi
4091
4092# syncfs probe
4093syncfs=no
4094cat > $TMPC <<EOF
4095#include <unistd.h>
4096
4097int main(void)
4098{
4099    return syncfs(0);
4100}
4101EOF
4102syncfs=no
4103if compile_prog "" "" ; then
4104  syncfs=yes
4105fi
4106
4107# Search for bswap_32 function
4108byteswap_h=no
4109cat > $TMPC << EOF
4110#include <byteswap.h>
4111int main(void) { return bswap_32(0); }
4112EOF
4113if compile_prog "" "" ; then
4114  byteswap_h=yes
4115fi
4116
4117# Search for bswap32 function
4118bswap_h=no
4119cat > $TMPC << EOF
4120#include <sys/endian.h>
4121#include <sys/types.h>
4122#include <machine/bswap.h>
4123int main(void) { return bswap32(0); }
4124EOF
4125if compile_prog "" "" ; then
4126  bswap_h=yes
4127fi
4128
4129# Check whether we have openpty() in either libc or libutil
4130cat > $TMPC << EOF
4131extern int openpty(int *am, int *as, char *name, void *termp, void *winp);
4132int main(void) { return openpty(0, 0, 0, 0, 0); }
4133EOF
4134
4135have_openpty="no"
4136if compile_prog "" "" ; then
4137  have_openpty="yes"
4138else
4139  if compile_prog "" "-lutil" ; then
4140    have_openpty="yes"
4141  fi
4142fi
4143
4144##########################################
4145# spice probe
4146if test "$spice_protocol" != "no" ; then
4147  spice_protocol_cflags=$($pkg_config --cflags spice-protocol 2>/dev/null)
4148  if $pkg_config --atleast-version=0.12.3 spice-protocol; then
4149    spice_protocol="yes"
4150  else
4151    if test "$spice_protocol" = "yes" ; then
4152      feature_not_found "spice_protocol" \
4153          "Install spice-protocol(>=0.12.3) devel"
4154    fi
4155    spice_protocol="no"
4156  fi
4157fi
4158
4159if test "$spice" != "no" ; then
4160  cat > $TMPC << EOF
4161#include <spice.h>
4162int main(void) { spice_server_new(); return 0; }
4163EOF
4164  spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
4165  spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
4166  if $pkg_config --atleast-version=0.12.5 spice-server && \
4167     test "$spice_protocol" = "yes" && \
4168     compile_prog "$spice_cflags" "$spice_libs" ; then
4169    spice="yes"
4170  else
4171    if test "$spice" = "yes" ; then
4172      feature_not_found "spice" \
4173          "Install spice-server(>=0.12.5) devel"
4174    fi
4175    spice="no"
4176  fi
4177fi
4178
4179# check for smartcard support
4180if test "$smartcard" != "no"; then
4181    if $pkg_config --atleast-version=2.5.1 libcacard; then
4182        libcacard_cflags=$($pkg_config --cflags libcacard)
4183        libcacard_libs=$($pkg_config --libs libcacard)
4184        smartcard="yes"
4185    else
4186        if test "$smartcard" = "yes"; then
4187            feature_not_found "smartcard" "Install libcacard devel"
4188        fi
4189        smartcard="no"
4190    fi
4191fi
4192
4193# check for libusb
4194if test "$libusb" != "no" ; then
4195    if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
4196        libusb="yes"
4197        libusb_cflags=$($pkg_config --cflags libusb-1.0)
4198        libusb_libs=$($pkg_config --libs libusb-1.0)
4199    else
4200        if test "$libusb" = "yes"; then
4201            feature_not_found "libusb" "Install libusb devel >= 1.0.13"
4202        fi
4203        libusb="no"
4204    fi
4205fi
4206
4207# check for usbredirparser for usb network redirection support
4208if test "$usb_redir" != "no" ; then
4209    if $pkg_config --atleast-version=0.6 libusbredirparser-0.5; then
4210        usb_redir="yes"
4211        usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5)
4212        usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5)
4213    else
4214        if test "$usb_redir" = "yes"; then
4215            feature_not_found "usb-redir" "Install usbredir devel"
4216        fi
4217        usb_redir="no"
4218    fi
4219fi
4220
4221##########################################
4222# check if we have VSS SDK headers for win
4223
4224if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
4225        test "$vss_win32_sdk" != "no" ; then
4226  case "$vss_win32_sdk" in
4227    "")   vss_win32_include="-isystem $source_path" ;;
4228    *\ *) # The SDK is installed in "Program Files" by default, but we cannot
4229          # handle path with spaces. So we symlink the headers into ".sdk/vss".
4230          vss_win32_include="-isystem $source_path/.sdk/vss"
4231	  symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
4232	  ;;
4233    *)    vss_win32_include="-isystem $vss_win32_sdk"
4234  esac
4235  cat > $TMPC << EOF
4236#define __MIDL_user_allocate_free_DEFINED__
4237#include <inc/win2003/vss.h>
4238int main(void) { return VSS_CTX_BACKUP; }
4239EOF
4240  if compile_prog "$vss_win32_include" "" ; then
4241    guest_agent_with_vss="yes"
4242    QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
4243    libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
4244    qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
4245  else
4246    if test "$vss_win32_sdk" != "" ; then
4247      echo "ERROR: Please download and install Microsoft VSS SDK:"
4248      echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
4249      echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
4250      echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
4251      echo "ERROR: The headers are extracted in the directory \`inc'."
4252      feature_not_found "VSS support"
4253    fi
4254    guest_agent_with_vss="no"
4255  fi
4256fi
4257
4258##########################################
4259# lookup Windows platform SDK (if not specified)
4260# The SDK is needed only to build .tlb (type library) file of guest agent
4261# VSS provider from the source. It is usually unnecessary because the
4262# pre-compiled .tlb file is included.
4263
4264if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
4265        test "$guest_agent_with_vss" = "yes" ; then
4266  if test -z "$win_sdk"; then
4267    programfiles="$PROGRAMFILES"
4268    test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
4269    if test -n "$programfiles"; then
4270      win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
4271    else
4272      feature_not_found "Windows SDK"
4273    fi
4274  elif test "$win_sdk" = "no"; then
4275    win_sdk=""
4276  fi
4277fi
4278
4279##########################################
4280# check if mingw environment provides a recent ntddscsi.h
4281if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
4282  cat > $TMPC << EOF
4283#include <windows.h>
4284#include <ntddscsi.h>
4285int main(void) {
4286#if !defined(IOCTL_SCSI_GET_ADDRESS)
4287#error Missing required ioctl definitions
4288#endif
4289  SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
4290  return addr.Lun;
4291}
4292EOF
4293  if compile_prog "" "" ; then
4294    guest_agent_ntddscsi=yes
4295    libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
4296  fi
4297fi
4298
4299##########################################
4300# virgl renderer probe
4301
4302if test "$virglrenderer" != "no" ; then
4303  cat > $TMPC << EOF
4304#include <virglrenderer.h>
4305int main(void) { virgl_renderer_poll(); return 0; }
4306EOF
4307  virgl_cflags=$($pkg_config --cflags virglrenderer 2>/dev/null)
4308  virgl_libs=$($pkg_config --libs virglrenderer 2>/dev/null)
4309  virgl_version=$($pkg_config --modversion virglrenderer 2>/dev/null)
4310  if $pkg_config virglrenderer >/dev/null 2>&1 && \
4311     compile_prog "$virgl_cflags" "$virgl_libs" ; then
4312    virglrenderer="yes"
4313  else
4314    if test "$virglrenderer" = "yes" ; then
4315      feature_not_found "virglrenderer"
4316    fi
4317    virglrenderer="no"
4318  fi
4319fi
4320
4321##########################################
4322# capstone
4323
4324case "$capstone" in
4325  auto | enabled | internal)
4326    # Simpler to always update submodule, even if not needed.
4327    git_submodules="${git_submodules} capstone"
4328    ;;
4329esac
4330
4331##########################################
4332# check if we have fdatasync
4333
4334fdatasync=no
4335cat > $TMPC << EOF
4336#include <unistd.h>
4337int main(void) {
4338#if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
4339return fdatasync(0);
4340#else
4341#error Not supported
4342#endif
4343}
4344EOF
4345if compile_prog "" "" ; then
4346    fdatasync=yes
4347fi
4348
4349##########################################
4350# check if we have madvise
4351
4352madvise=no
4353cat > $TMPC << EOF
4354#include <sys/types.h>
4355#include <sys/mman.h>
4356#include <stddef.h>
4357int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }
4358EOF
4359if compile_prog "" "" ; then
4360    madvise=yes
4361fi
4362
4363##########################################
4364# check if we have posix_madvise
4365
4366posix_madvise=no
4367cat > $TMPC << EOF
4368#include <sys/mman.h>
4369#include <stddef.h>
4370int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }
4371EOF
4372if compile_prog "" "" ; then
4373    posix_madvise=yes
4374fi
4375
4376##########################################
4377# check if we have posix_memalign()
4378
4379posix_memalign=no
4380cat > $TMPC << EOF
4381#include <stdlib.h>
4382int main(void) {
4383    void *p;
4384    return posix_memalign(&p, 8, 8);
4385}
4386EOF
4387if compile_prog "" "" ; then
4388    posix_memalign=yes
4389fi
4390
4391##########################################
4392# check if we have posix_syslog
4393
4394posix_syslog=no
4395cat > $TMPC << EOF
4396#include <syslog.h>
4397int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; }
4398EOF
4399if compile_prog "" "" ; then
4400    posix_syslog=yes
4401fi
4402
4403##########################################
4404# check if we have sem_timedwait
4405
4406sem_timedwait=no
4407cat > $TMPC << EOF
4408#include <semaphore.h>
4409int main(void) { sem_t s; struct timespec t = {0}; return sem_timedwait(&s, &t); }
4410EOF
4411if compile_prog "" "" ; then
4412    sem_timedwait=yes
4413fi
4414
4415##########################################
4416# check if we have strchrnul
4417
4418strchrnul=no
4419cat > $TMPC << EOF
4420#include <string.h>
4421int main(void);
4422// Use a haystack that the compiler shouldn't be able to constant fold
4423char *haystack = (char*)&main;
4424int main(void) { return strchrnul(haystack, 'x') != &haystack[6]; }
4425EOF
4426if compile_prog "" "" ; then
4427    strchrnul=yes
4428fi
4429
4430#########################################
4431# check if we have st_atim
4432
4433st_atim=no
4434cat > $TMPC << EOF
4435#include <sys/stat.h>
4436#include <stddef.h>
4437int main(void) { return offsetof(struct stat, st_atim); }
4438EOF
4439if compile_prog "" "" ; then
4440    st_atim=yes
4441fi
4442
4443##########################################
4444# check if we have sigev_notify_thread_id
4445
4446sigev_notify_thread_id=no
4447cat > $TMPC << EOF
4448#include <stddef.h>
4449#include <signal.h>
4450int main(void) { return offsetof(struct sigevent, sigev_notify_thread_id); }
4451EOF
4452if compile_prog "" "" ; then
4453    sigev_notify_thread_id=yes
4454fi
4455
4456##########################################
4457# check if trace backend exists
4458
4459$python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
4460if test "$?" -ne 0 ; then
4461  error_exit "invalid trace backends" \
4462      "Please choose supported trace backends."
4463fi
4464
4465##########################################
4466# For 'ust' backend, test if ust headers are present
4467if have_backend "ust"; then
4468  cat > $TMPC << EOF
4469#include <lttng/tracepoint.h>
4470int main(void) { return 0; }
4471EOF
4472  if compile_prog "" "-Wl,--no-as-needed -ldl" ; then
4473    if $pkg_config lttng-ust --exists; then
4474      lttng_ust_libs=$($pkg_config --libs lttng-ust)
4475    else
4476      lttng_ust_libs="-llttng-ust -ldl"
4477    fi
4478    if $pkg_config liburcu-bp --exists; then
4479      urcu_bp_libs=$($pkg_config --libs liburcu-bp)
4480    else
4481      urcu_bp_libs="-lurcu-bp"
4482    fi
4483  else
4484    error_exit "Trace backend 'ust' missing lttng-ust header files"
4485  fi
4486fi
4487
4488##########################################
4489# For 'dtrace' backend, test if 'dtrace' command is present
4490if have_backend "dtrace"; then
4491  if ! has 'dtrace' ; then
4492    error_exit "dtrace command is not found in PATH $PATH"
4493  fi
4494  trace_backend_stap="no"
4495  if has 'stap' ; then
4496    trace_backend_stap="yes"
4497
4498    # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
4499    # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
4500    # instead. QEMU --enable-modules depends on this because the SystemTap
4501    # semaphores are linked into the main binary and not the module's shared
4502    # object.
4503    QEMU_CFLAGS="$QEMU_CFLAGS -DSTAP_SDT_V2"
4504  fi
4505fi
4506
4507##########################################
4508# check and set a backend for coroutine
4509
4510# We prefer ucontext, but it's not always possible. The fallback
4511# is sigcontext. On Windows the only valid backend is the Windows
4512# specific one.
4513
4514ucontext_works=no
4515if test "$darwin" != "yes"; then
4516  cat > $TMPC << EOF
4517#include <ucontext.h>
4518#ifdef __stub_makecontext
4519#error Ignoring glibc stub makecontext which will always fail
4520#endif
4521int main(void) { makecontext(0, 0, 0); return 0; }
4522EOF
4523  if compile_prog "" "" ; then
4524    ucontext_works=yes
4525  fi
4526fi
4527
4528if test "$coroutine" = ""; then
4529  if test "$mingw32" = "yes"; then
4530    coroutine=win32
4531  elif test "$ucontext_works" = "yes"; then
4532    coroutine=ucontext
4533  else
4534    coroutine=sigaltstack
4535  fi
4536else
4537  case $coroutine in
4538  windows)
4539    if test "$mingw32" != "yes"; then
4540      error_exit "'windows' coroutine backend only valid for Windows"
4541    fi
4542    # Unfortunately the user visible backend name doesn't match the
4543    # coroutine-*.c filename for this case, so we have to adjust it here.
4544    coroutine=win32
4545    ;;
4546  ucontext)
4547    if test "$ucontext_works" != "yes"; then
4548      feature_not_found "ucontext"
4549    fi
4550    ;;
4551  sigaltstack)
4552    if test "$mingw32" = "yes"; then
4553      error_exit "only the 'windows' coroutine backend is valid for Windows"
4554    fi
4555    ;;
4556  *)
4557    error_exit "unknown coroutine backend $coroutine"
4558    ;;
4559  esac
4560fi
4561
4562if test "$coroutine_pool" = ""; then
4563  coroutine_pool=yes
4564fi
4565
4566if test "$debug_stack_usage" = "yes"; then
4567  if test "$coroutine_pool" = "yes"; then
4568    echo "WARN: disabling coroutine pool for stack usage debugging"
4569    coroutine_pool=no
4570  fi
4571fi
4572
4573##################################################
4574# SafeStack
4575
4576
4577if test "$safe_stack" = "yes"; then
4578cat > $TMPC << EOF
4579int main(int argc, char *argv[])
4580{
4581#if ! __has_feature(safe_stack)
4582#error SafeStack Disabled
4583#endif
4584    return 0;
4585}
4586EOF
4587  flag="-fsanitize=safe-stack"
4588  # Check that safe-stack is supported and enabled.
4589  if compile_prog "-Werror $flag" "$flag"; then
4590    # Flag needed both at compilation and at linking
4591    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
4592    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
4593  else
4594    error_exit "SafeStack not supported by your compiler"
4595  fi
4596  if test "$coroutine" != "ucontext"; then
4597    error_exit "SafeStack is only supported by the coroutine backend ucontext"
4598  fi
4599else
4600cat > $TMPC << EOF
4601int main(int argc, char *argv[])
4602{
4603#if defined(__has_feature)
4604#if __has_feature(safe_stack)
4605#error SafeStack Enabled
4606#endif
4607#endif
4608    return 0;
4609}
4610EOF
4611if test "$safe_stack" = "no"; then
4612  # Make sure that safe-stack is disabled
4613  if ! compile_prog "-Werror" ""; then
4614    # SafeStack was already enabled, try to explicitly remove the feature
4615    flag="-fno-sanitize=safe-stack"
4616    if ! compile_prog "-Werror $flag" "$flag"; then
4617      error_exit "Configure cannot disable SafeStack"
4618    fi
4619    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
4620    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
4621  fi
4622else # "$safe_stack" = ""
4623  # Set safe_stack to yes or no based on pre-existing flags
4624  if compile_prog "-Werror" ""; then
4625    safe_stack="no"
4626  else
4627    safe_stack="yes"
4628    if test "$coroutine" != "ucontext"; then
4629      error_exit "SafeStack is only supported by the coroutine backend ucontext"
4630    fi
4631  fi
4632fi
4633fi
4634
4635##########################################
4636# check if we have open_by_handle_at
4637
4638open_by_handle_at=no
4639cat > $TMPC << EOF
4640#include <fcntl.h>
4641#if !defined(AT_EMPTY_PATH)
4642# error missing definition
4643#else
4644int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
4645#endif
4646EOF
4647if compile_prog "" "" ; then
4648    open_by_handle_at=yes
4649fi
4650
4651########################################
4652# check if we have linux/magic.h
4653
4654linux_magic_h=no
4655cat > $TMPC << EOF
4656#include <linux/magic.h>
4657int main(void) {
4658  return 0;
4659}
4660EOF
4661if compile_prog "" "" ; then
4662    linux_magic_h=yes
4663fi
4664
4665########################################
4666# check if we have valgrind/valgrind.h
4667
4668valgrind_h=no
4669cat > $TMPC << EOF
4670#include <valgrind/valgrind.h>
4671int main(void) {
4672  return 0;
4673}
4674EOF
4675if compile_prog "" "" ; then
4676    valgrind_h=yes
4677fi
4678
4679########################################
4680# check if environ is declared
4681
4682has_environ=no
4683cat > $TMPC << EOF
4684#include <unistd.h>
4685int main(void) {
4686    environ = 0;
4687    return 0;
4688}
4689EOF
4690if compile_prog "" "" ; then
4691    has_environ=yes
4692fi
4693
4694########################################
4695# check if cpuid.h is usable.
4696
4697cat > $TMPC << EOF
4698#include <cpuid.h>
4699int main(void) {
4700    unsigned a, b, c, d;
4701    int max = __get_cpuid_max(0, 0);
4702
4703    if (max >= 1) {
4704        __cpuid(1, a, b, c, d);
4705    }
4706
4707    if (max >= 7) {
4708        __cpuid_count(7, 0, a, b, c, d);
4709    }
4710
4711    return 0;
4712}
4713EOF
4714if compile_prog "" "" ; then
4715    cpuid_h=yes
4716fi
4717
4718##########################################
4719# avx2 optimization requirement check
4720#
4721# There is no point enabling this if cpuid.h is not usable,
4722# since we won't be able to select the new routines.
4723
4724if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
4725  cat > $TMPC << EOF
4726#pragma GCC push_options
4727#pragma GCC target("avx2")
4728#include <cpuid.h>
4729#include <immintrin.h>
4730static int bar(void *a) {
4731    __m256i x = *(__m256i *)a;
4732    return _mm256_testz_si256(x, x);
4733}
4734int main(int argc, char *argv[]) { return bar(argv[0]); }
4735EOF
4736  if compile_object "" ; then
4737    avx2_opt="yes"
4738  else
4739    avx2_opt="no"
4740  fi
4741fi
4742
4743##########################################
4744# avx512f optimization requirement check
4745#
4746# There is no point enabling this if cpuid.h is not usable,
4747# since we won't be able to select the new routines.
4748# by default, it is turned off.
4749# if user explicitly want to enable it, check environment
4750
4751if test "$cpuid_h" = "yes" && test "$avx512f_opt" = "yes"; then
4752  cat > $TMPC << EOF
4753#pragma GCC push_options
4754#pragma GCC target("avx512f")
4755#include <cpuid.h>
4756#include <immintrin.h>
4757static int bar(void *a) {
4758    __m512i x = *(__m512i *)a;
4759    return _mm512_test_epi64_mask(x, x);
4760}
4761int main(int argc, char *argv[])
4762{
4763	return bar(argv[0]);
4764}
4765EOF
4766  if ! compile_object "" ; then
4767    avx512f_opt="no"
4768  fi
4769else
4770  avx512f_opt="no"
4771fi
4772
4773########################################
4774# check if __[u]int128_t is usable.
4775
4776int128=no
4777cat > $TMPC << EOF
4778__int128_t a;
4779__uint128_t b;
4780int main (void) {
4781  a = a + b;
4782  b = a * b;
4783  a = a * a;
4784  return 0;
4785}
4786EOF
4787if compile_prog "" "" ; then
4788    int128=yes
4789fi
4790
4791#########################################
4792# See if 128-bit atomic operations are supported.
4793
4794atomic128=no
4795if test "$int128" = "yes"; then
4796  cat > $TMPC << EOF
4797int main(void)
4798{
4799  unsigned __int128 x = 0, y = 0;
4800  y = __atomic_load(&x, 0);
4801  __atomic_store(&x, y, 0);
4802  __atomic_compare_exchange(&x, &y, x, 0, 0, 0);
4803  return 0;
4804}
4805EOF
4806  if compile_prog "" "" ; then
4807    atomic128=yes
4808  fi
4809fi
4810
4811cmpxchg128=no
4812if test "$int128" = yes && test "$atomic128" = no; then
4813  cat > $TMPC << EOF
4814int main(void)
4815{
4816  unsigned __int128 x = 0, y = 0;
4817  __sync_val_compare_and_swap_16(&x, y, x);
4818  return 0;
4819}
4820EOF
4821  if compile_prog "" "" ; then
4822    cmpxchg128=yes
4823  fi
4824fi
4825
4826#########################################
4827# See if 64-bit atomic operations are supported.
4828# Note that without __atomic builtins, we can only
4829# assume atomic loads/stores max at pointer size.
4830
4831cat > $TMPC << EOF
4832#include <stdint.h>
4833int main(void)
4834{
4835  uint64_t x = 0, y = 0;
4836#ifdef __ATOMIC_RELAXED
4837  y = __atomic_load_n(&x, __ATOMIC_RELAXED);
4838  __atomic_store_n(&x, y, __ATOMIC_RELAXED);
4839  __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
4840  __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
4841  __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
4842#else
4843  typedef char is_host64[sizeof(void *) >= sizeof(uint64_t) ? 1 : -1];
4844  __sync_lock_test_and_set(&x, y);
4845  __sync_val_compare_and_swap(&x, y, 0);
4846  __sync_fetch_and_add(&x, y);
4847#endif
4848  return 0;
4849}
4850EOF
4851if compile_prog "" "" ; then
4852  atomic64=yes
4853fi
4854
4855#########################################
4856# See if --dynamic-list is supported by the linker
4857ld_dynamic_list="no"
4858if test "$static" = "no" ; then
4859    cat > $TMPTXT <<EOF
4860{
4861  foo;
4862};
4863EOF
4864
4865    cat > $TMPC <<EOF
4866#include <stdio.h>
4867void foo(void);
4868
4869void foo(void)
4870{
4871  printf("foo\n");
4872}
4873
4874int main(void)
4875{
4876  foo();
4877  return 0;
4878}
4879EOF
4880
4881    if compile_prog "" "-Wl,--dynamic-list=$TMPTXT" ; then
4882        ld_dynamic_list="yes"
4883    fi
4884fi
4885
4886#########################################
4887# See if -exported_symbols_list is supported by the linker
4888
4889ld_exported_symbols_list="no"
4890if test "$static" = "no" ; then
4891    cat > $TMPTXT <<EOF
4892  _foo
4893EOF
4894
4895    if compile_prog "" "-Wl,-exported_symbols_list,$TMPTXT" ; then
4896        ld_exported_symbols_list="yes"
4897    fi
4898fi
4899
4900if  test "$plugins" = "yes" &&
4901    test "$ld_dynamic_list" = "no" &&
4902    test "$ld_exported_symbols_list" = "no" ; then
4903  error_exit \
4904      "Plugin support requires dynamic linking and specifying a set of symbols " \
4905      "that are exported to plugins. Unfortunately your linker doesn't " \
4906      "support the flag (--dynamic-list or -exported_symbols_list) used " \
4907      "for this purpose. You can't build with --static."
4908fi
4909
4910########################################
4911# check if getauxval is available.
4912
4913getauxval=no
4914cat > $TMPC << EOF
4915#include <sys/auxv.h>
4916int main(void) {
4917  return getauxval(AT_HWCAP) == 0;
4918}
4919EOF
4920if compile_prog "" "" ; then
4921    getauxval=yes
4922fi
4923
4924########################################
4925# check if ccache is interfering with
4926# semantic analysis of macros
4927
4928unset CCACHE_CPP2
4929ccache_cpp2=no
4930cat > $TMPC << EOF
4931static const int Z = 1;
4932#define fn() ({ Z; })
4933#define TAUT(X) ((X) == Z)
4934#define PAREN(X, Y) (X == Y)
4935#define ID(X) (X)
4936int main(int argc, char *argv[])
4937{
4938    int x = 0, y = 0;
4939    x = ID(x);
4940    x = fn();
4941    fn();
4942    if (PAREN(x, y)) return 0;
4943    if (TAUT(Z)) return 0;
4944    return 0;
4945}
4946EOF
4947
4948if ! compile_object "-Werror"; then
4949    ccache_cpp2=yes
4950fi
4951
4952#################################################
4953# clang does not support glibc + FORTIFY_SOURCE.
4954
4955if test "$fortify_source" != "no"; then
4956  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
4957    fortify_source="no";
4958  elif test -n "$cxx" && has $cxx &&
4959       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
4960    fortify_source="no";
4961  else
4962    fortify_source="yes"
4963  fi
4964fi
4965
4966###############################################
4967# Check if copy_file_range is provided by glibc
4968have_copy_file_range=no
4969cat > $TMPC << EOF
4970#include <unistd.h>
4971int main(void) {
4972  copy_file_range(0, NULL, 0, NULL, 0, 0);
4973  return 0;
4974}
4975EOF
4976if compile_prog "" "" ; then
4977    have_copy_file_range=yes
4978fi
4979
4980##########################################
4981# check if struct fsxattr is available via linux/fs.h
4982
4983have_fsxattr=no
4984cat > $TMPC << EOF
4985#include <linux/fs.h>
4986struct fsxattr foo;
4987int main(void) {
4988  return 0;
4989}
4990EOF
4991if compile_prog "" "" ; then
4992    have_fsxattr=yes
4993fi
4994
4995##########################################
4996# check for usable membarrier system call
4997if test "$membarrier" = "yes"; then
4998    have_membarrier=no
4999    if test "$mingw32" = "yes" ; then
5000        have_membarrier=yes
5001    elif test "$linux" = "yes" ; then
5002        cat > $TMPC << EOF
5003    #include <linux/membarrier.h>
5004    #include <sys/syscall.h>
5005    #include <unistd.h>
5006    #include <stdlib.h>
5007    int main(void) {
5008        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
5009        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
5010	exit(0);
5011    }
5012EOF
5013        if compile_prog "" "" ; then
5014            have_membarrier=yes
5015        fi
5016    fi
5017    if test "$have_membarrier" = "no"; then
5018      feature_not_found "membarrier" "membarrier system call not available"
5019    fi
5020else
5021    # Do not enable it by default even for Mingw32, because it doesn't
5022    # work on Wine.
5023    membarrier=no
5024fi
5025
5026##########################################
5027# check if rtnetlink.h exists and is useful
5028have_rtnetlink=no
5029cat > $TMPC << EOF
5030#include <linux/rtnetlink.h>
5031int main(void) {
5032  return IFLA_PROTO_DOWN;
5033}
5034EOF
5035if compile_prog "" "" ; then
5036    have_rtnetlink=yes
5037fi
5038
5039##########################################
5040# check for usable AF_VSOCK environment
5041have_af_vsock=no
5042cat > $TMPC << EOF
5043#include <errno.h>
5044#include <sys/types.h>
5045#include <sys/socket.h>
5046#if !defined(AF_VSOCK)
5047# error missing AF_VSOCK flag
5048#endif
5049#include <linux/vm_sockets.h>
5050int main(void) {
5051    int sock, ret;
5052    struct sockaddr_vm svm;
5053    socklen_t len = sizeof(svm);
5054    sock = socket(AF_VSOCK, SOCK_STREAM, 0);
5055    ret = getpeername(sock, (struct sockaddr *)&svm, &len);
5056    if ((ret == -1) && (errno == ENOTCONN)) {
5057        return 0;
5058    }
5059    return -1;
5060}
5061EOF
5062if compile_prog "" "" ; then
5063    have_af_vsock=yes
5064fi
5065
5066##########################################
5067# check for usable AF_ALG environment
5068have_afalg=no
5069cat > $TMPC << EOF
5070#include <errno.h>
5071#include <sys/types.h>
5072#include <sys/socket.h>
5073#include <linux/if_alg.h>
5074int main(void) {
5075    int sock;
5076    sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
5077    return sock;
5078}
5079EOF
5080if compile_prog "" "" ; then
5081    have_afalg=yes
5082fi
5083if test "$crypto_afalg" = "yes"
5084then
5085    if test "$have_afalg" != "yes"
5086    then
5087	error_exit "AF_ALG requested but could not be detected"
5088    fi
5089fi
5090
5091
5092#################################################
5093# check for sysmacros.h
5094
5095have_sysmacros=no
5096cat > $TMPC << EOF
5097#include <sys/sysmacros.h>
5098int main(void) {
5099    return makedev(0, 0);
5100}
5101EOF
5102if compile_prog "" "" ; then
5103    have_sysmacros=yes
5104fi
5105
5106##########################################
5107# check for utmpx.h, it is missing e.g. on OpenBSD
5108
5109have_utmpx=no
5110cat > $TMPC << EOF
5111#include <utmpx.h>
5112struct utmpx user_info;
5113int main(void) {
5114    return 0;
5115}
5116EOF
5117if compile_prog "" "" ; then
5118    have_utmpx=yes
5119fi
5120
5121##########################################
5122# check for getrandom()
5123
5124have_getrandom=no
5125cat > $TMPC << EOF
5126#include <sys/random.h>
5127int main(void) {
5128    return getrandom(0, 0, GRND_NONBLOCK);
5129}
5130EOF
5131if compile_prog "" "" ; then
5132    have_getrandom=yes
5133fi
5134
5135##########################################
5136# checks for sanitizers
5137
5138have_asan=no
5139have_ubsan=no
5140have_asan_iface_h=no
5141have_asan_iface_fiber=no
5142
5143if test "$sanitizers" = "yes" ; then
5144  write_c_skeleton
5145  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
5146      have_asan=yes
5147  fi
5148
5149  # we could use a simple skeleton for flags checks, but this also
5150  # detect the static linking issue of ubsan, see also:
5151  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
5152  cat > $TMPC << EOF
5153#include <stdlib.h>
5154int main(void) {
5155    void *tmp = malloc(10);
5156    if (tmp != NULL) {
5157        return *(int *)(tmp + 2);
5158    }
5159    return 1;
5160}
5161EOF
5162  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
5163      have_ubsan=yes
5164  fi
5165
5166  if check_include "sanitizer/asan_interface.h" ; then
5167      have_asan_iface_h=yes
5168  fi
5169
5170  cat > $TMPC << EOF
5171#include <sanitizer/asan_interface.h>
5172int main(void) {
5173  __sanitizer_start_switch_fiber(0, 0, 0);
5174  return 0;
5175}
5176EOF
5177  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
5178      have_asan_iface_fiber=yes
5179  fi
5180fi
5181
5182##########################################
5183# checks for fuzzer
5184if test "$fuzzing" = "yes" && test -z "${LIB_FUZZING_ENGINE+xxx}"; then
5185  write_c_fuzzer_skeleton
5186  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=fuzzer" ""; then
5187    have_fuzzer=yes
5188  else
5189    error_exit "Your compiler doesn't support -fsanitize=fuzzer"
5190    exit 1
5191  fi
5192fi
5193
5194# Thread sanitizer is, for now, much noisier than the other sanitizers;
5195# keep it separate until that is not the case.
5196if test "$tsan" = "yes" && test "$sanitizers" = "yes"; then
5197  error_exit "TSAN is not supported with other sanitiziers."
5198fi
5199have_tsan=no
5200have_tsan_iface_fiber=no
5201if test "$tsan" = "yes" ; then
5202  write_c_skeleton
5203  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
5204      have_tsan=yes
5205  fi
5206  cat > $TMPC << EOF
5207#include <sanitizer/tsan_interface.h>
5208int main(void) {
5209  __tsan_create_fiber(0);
5210  return 0;
5211}
5212EOF
5213  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
5214      have_tsan_iface_fiber=yes
5215  fi
5216fi
5217
5218##########################################
5219# check for libpmem
5220
5221if test "$libpmem" != "no"; then
5222	if $pkg_config --exists "libpmem"; then
5223		libpmem="yes"
5224		libpmem_libs=$($pkg_config --libs libpmem)
5225		libpmem_cflags=$($pkg_config --cflags libpmem)
5226	else
5227		if test "$libpmem" = "yes" ; then
5228			feature_not_found "libpmem" "Install nvml or pmdk"
5229		fi
5230		libpmem="no"
5231	fi
5232fi
5233
5234##########################################
5235# check for libdaxctl
5236
5237if test "$libdaxctl" != "no"; then
5238	if $pkg_config --atleast-version=57 "libdaxctl"; then
5239		libdaxctl="yes"
5240		libdaxctl_libs=$($pkg_config --libs libdaxctl)
5241		libdaxctl_cflags=$($pkg_config --cflags libdaxctl)
5242	else
5243		if test "$libdaxctl" = "yes" ; then
5244			feature_not_found "libdaxctl" "Install libdaxctl"
5245		fi
5246		libdaxctl="no"
5247	fi
5248fi
5249
5250##########################################
5251# check for slirp
5252
5253case "$slirp" in
5254  auto | enabled | internal)
5255    # Simpler to always update submodule, even if not needed.
5256    git_submodules="${git_submodules} slirp"
5257    ;;
5258esac
5259
5260# Check for slirp smbd dupport
5261: ${smbd=${SMBD-/usr/sbin/smbd}}
5262if test "$slirp_smbd" != "no" ; then
5263  if test "$mingw32" = "yes" ; then
5264    if test "$slirp_smbd" = "yes" ; then
5265      error_exit "Host smbd not supported on this platform."
5266    fi
5267    slirp_smbd=no
5268  else
5269    slirp_smbd=yes
5270  fi
5271fi
5272
5273##########################################
5274# check for usable __NR_keyctl syscall
5275
5276if test "$linux" = "yes" ; then
5277
5278    have_keyring=no
5279    cat > $TMPC << EOF
5280#include <errno.h>
5281#include <asm/unistd.h>
5282#include <linux/keyctl.h>
5283#include <unistd.h>
5284int main(void) {
5285    return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
5286}
5287EOF
5288    if compile_prog "" "" ; then
5289        have_keyring=yes
5290    fi
5291fi
5292if test "$secret_keyring" != "no"
5293then
5294    if test "$have_keyring" = "yes"
5295    then
5296	secret_keyring=yes
5297    else
5298	if test "$secret_keyring" = "yes"
5299	then
5300	    error_exit "syscall __NR_keyctl requested, \
5301but not implemented on your system"
5302	else
5303	    secret_keyring=no
5304	fi
5305    fi
5306fi
5307
5308##########################################
5309# End of CC checks
5310# After here, no more $cc or $ld runs
5311
5312write_c_skeleton
5313
5314if test "$gcov" = "yes" ; then
5315  :
5316elif test "$fortify_source" = "yes" ; then
5317  QEMU_CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $QEMU_CFLAGS"
5318  debug=no
5319fi
5320
5321case "$ARCH" in
5322alpha)
5323  # Ensure there's only a single GP
5324  QEMU_CFLAGS="-msmall-data $QEMU_CFLAGS"
5325;;
5326esac
5327
5328if test "$gprof" = "yes" ; then
5329  QEMU_CFLAGS="-p $QEMU_CFLAGS"
5330  QEMU_LDFLAGS="-p $QEMU_LDFLAGS"
5331fi
5332
5333if test "$have_asan" = "yes"; then
5334  QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
5335  QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
5336  if test "$have_asan_iface_h" = "no" ; then
5337      echo "ASAN build enabled, but ASAN header missing." \
5338           "Without code annotation, the report may be inferior."
5339  elif test "$have_asan_iface_fiber" = "no" ; then
5340      echo "ASAN build enabled, but ASAN header is too old." \
5341           "Without code annotation, the report may be inferior."
5342  fi
5343fi
5344if test "$have_tsan" = "yes" ; then
5345  if test "$have_tsan_iface_fiber" = "yes" ; then
5346    QEMU_CFLAGS="-fsanitize=thread $QEMU_CFLAGS"
5347    QEMU_LDFLAGS="-fsanitize=thread $QEMU_LDFLAGS"
5348  else
5349    error_exit "Cannot enable TSAN due to missing fiber annotation interface."
5350  fi
5351elif test "$tsan" = "yes" ; then
5352  error_exit "Cannot enable TSAN due to missing sanitize thread interface."
5353fi
5354if test "$have_ubsan" = "yes"; then
5355  QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS"
5356  QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
5357fi
5358
5359##########################################
5360
5361# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
5362if test "$solaris" = "no" && test "$tsan" = "no"; then
5363    if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
5364        QEMU_LDFLAGS="-Wl,--warn-common $QEMU_LDFLAGS"
5365    fi
5366fi
5367
5368# Use ASLR, no-SEH and DEP if available
5369if test "$mingw32" = "yes" ; then
5370    flags="--no-seh --nxcompat"
5371
5372    # Disable ASLR for debug builds to allow debugging with gdb
5373    if test "$debug" = "no" ; then
5374        flags="--dynamicbase $flags"
5375    fi
5376
5377    for flag in $flags; do
5378        if ld_has $flag ; then
5379            QEMU_LDFLAGS="-Wl,$flag $QEMU_LDFLAGS"
5380        fi
5381    done
5382fi
5383
5384# We can only support ivshmem if we have eventfd
5385if [ "$eventfd" = "yes" ]; then
5386  ivshmem=yes
5387fi
5388
5389# Probe for guest agent support/options
5390
5391if [ "$guest_agent" != "no" ]; then
5392  if [ "$softmmu" = no -a "$want_tools" = no ] ; then
5393      guest_agent=no
5394  elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
5395      guest_agent=yes
5396  elif [ "$guest_agent" != yes ]; then
5397      guest_agent=no
5398  else
5399      error_exit "Guest agent is not supported on this platform"
5400  fi
5401fi
5402
5403# Guest agent Windows MSI package
5404
5405if test "$QEMU_GA_MANUFACTURER" = ""; then
5406  QEMU_GA_MANUFACTURER=QEMU
5407fi
5408if test "$QEMU_GA_DISTRO" = ""; then
5409  QEMU_GA_DISTRO=Linux
5410fi
5411if test "$QEMU_GA_VERSION" = ""; then
5412    QEMU_GA_VERSION=$(cat $source_path/VERSION)
5413fi
5414
5415QEMU_GA_MSI_MINGW_DLL_PATH="$($pkg_config --variable=prefix glib-2.0)/bin"
5416
5417# Mac OS X ships with a broken assembler
5418roms=
5419if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
5420        test "$targetos" != "Darwin" && test "$targetos" != "SunOS" && \
5421        test "$targetos" != "Haiku" && test "$softmmu" = yes ; then
5422    # Different host OS linkers have different ideas about the name of the ELF
5423    # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
5424    # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
5425    for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
5426        if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
5427            ld_i386_emulation="$emu"
5428            roms="optionrom"
5429            break
5430        fi
5431    done
5432fi
5433
5434# Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
5435# or -march=z10 (which is the lowest architecture level that Clang supports)
5436if test "$cpu" = "s390x" ; then
5437  write_c_skeleton
5438  compile_prog "-march=z900" ""
5439  has_z900=$?
5440  if [ $has_z900 = 0 ] || compile_object "-march=z10 -msoft-float -Werror"; then
5441    if [ $has_z900 != 0 ]; then
5442      echo "WARNING: Your compiler does not support the z900!"
5443      echo "         The s390-ccw bios will only work with guest CPUs >= z10."
5444    fi
5445    roms="$roms s390-ccw"
5446    # SLOF is required for building the s390-ccw firmware on s390x,
5447    # since it is using the libnet code from SLOF for network booting.
5448    git_submodules="${git_submodules} roms/SLOF"
5449  fi
5450fi
5451
5452# Check that the C++ compiler exists and works with the C compiler.
5453# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
5454if has $cxx; then
5455    cat > $TMPC <<EOF
5456int c_function(void);
5457int main(void) { return c_function(); }
5458EOF
5459
5460    compile_object
5461
5462    cat > $TMPCXX <<EOF
5463extern "C" {
5464   int c_function(void);
5465}
5466int c_function(void) { return 42; }
5467EOF
5468
5469    update_cxxflags
5470
5471    if do_cxx $CXXFLAGS $CONFIGURE_CXXFLAGS $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
5472        # C++ compiler $cxx works ok with C compiler $cc
5473        :
5474    else
5475        echo "C++ compiler $cxx does not work with C compiler $cc"
5476        echo "Disabling C++ specific optional code"
5477        cxx=
5478    fi
5479else
5480    echo "No C++ compiler available; disabling C++ specific optional code"
5481    cxx=
5482fi
5483
5484if !(GIT="$git" "$source_path/scripts/git-submodule.sh" "$git_submodules_action" "$git_submodules"); then
5485    exit 1
5486fi
5487
5488config_host_mak="config-host.mak"
5489
5490echo "# Automatically generated by configure - do not modify" > $config_host_mak
5491echo >> $config_host_mak
5492
5493echo all: >> $config_host_mak
5494echo "GIT=$git" >> $config_host_mak
5495echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
5496echo "GIT_SUBMODULES_ACTION=$git_submodules_action" >> $config_host_mak
5497
5498echo "ARCH=$ARCH" >> $config_host_mak
5499
5500if test "$debug_tcg" = "yes" ; then
5501  echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
5502fi
5503if test "$strip_opt" = "yes" ; then
5504  echo "STRIP=${strip}" >> $config_host_mak
5505fi
5506if test "$bigendian" = "yes" ; then
5507  echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
5508fi
5509if test "$mingw32" = "yes" ; then
5510  echo "CONFIG_WIN32=y" >> $config_host_mak
5511  if test "$guest_agent_with_vss" = "yes" ; then
5512    echo "CONFIG_QGA_VSS=y" >> $config_host_mak
5513    echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
5514    echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
5515  fi
5516  if test "$guest_agent_ntddscsi" = "yes" ; then
5517    echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
5518  fi
5519  echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
5520  echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
5521  echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
5522  echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
5523else
5524  echo "CONFIG_POSIX=y" >> $config_host_mak
5525fi
5526
5527if test "$linux" = "yes" ; then
5528  echo "CONFIG_LINUX=y" >> $config_host_mak
5529fi
5530
5531if test "$darwin" = "yes" ; then
5532  echo "CONFIG_DARWIN=y" >> $config_host_mak
5533fi
5534
5535if test "$solaris" = "yes" ; then
5536  echo "CONFIG_SOLARIS=y" >> $config_host_mak
5537fi
5538if test "$haiku" = "yes" ; then
5539  echo "CONFIG_HAIKU=y" >> $config_host_mak
5540fi
5541if test "$static" = "yes" ; then
5542  echo "CONFIG_STATIC=y" >> $config_host_mak
5543fi
5544if test "$profiler" = "yes" ; then
5545  echo "CONFIG_PROFILER=y" >> $config_host_mak
5546fi
5547if test "$want_tools" = "yes" ; then
5548  echo "CONFIG_TOOLS=y" >> $config_host_mak
5549fi
5550if test "$guest_agent" = "yes" ; then
5551  echo "CONFIG_GUEST_AGENT=y" >> $config_host_mak
5552fi
5553if test "$slirp_smbd" = "yes" ; then
5554  echo "CONFIG_SLIRP_SMBD=y" >> $config_host_mak
5555  echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
5556fi
5557if test "$vde" = "yes" ; then
5558  echo "CONFIG_VDE=y" >> $config_host_mak
5559  echo "VDE_LIBS=$vde_libs" >> $config_host_mak
5560fi
5561if test "$netmap" = "yes" ; then
5562  echo "CONFIG_NETMAP=y" >> $config_host_mak
5563fi
5564if test "$l2tpv3" = "yes" ; then
5565  echo "CONFIG_L2TPV3=y" >> $config_host_mak
5566fi
5567if test "$gprof" = "yes" ; then
5568  echo "CONFIG_GPROF=y" >> $config_host_mak
5569fi
5570echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
5571for drv in $audio_drv_list; do
5572    def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
5573    echo "$def=y" >> $config_host_mak
5574done
5575if test "$alsa" = "yes" ; then
5576    echo "CONFIG_ALSA=y" >> $config_host_mak
5577fi
5578echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak
5579echo "ALSA_CFLAGS=$alsa_cflags" >> $config_host_mak
5580if test "$libpulse" = "yes" ; then
5581    echo "CONFIG_LIBPULSE=y" >> $config_host_mak
5582fi
5583echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
5584echo "PULSE_CFLAGS=$pulse_cflags" >> $config_host_mak
5585echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak
5586echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak
5587echo "OSS_LIBS=$oss_libs" >> $config_host_mak
5588if test "$libjack" = "yes" ; then
5589    echo "CONFIG_LIBJACK=y" >> $config_host_mak
5590fi
5591echo "JACK_LIBS=$jack_libs" >> $config_host_mak
5592if test "$audio_win_int" = "yes" ; then
5593  echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
5594fi
5595echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
5596echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
5597if test "$xfs" = "yes" ; then
5598  echo "CONFIG_XFS=y" >> $config_host_mak
5599fi
5600qemu_version=$(head $source_path/VERSION)
5601echo "PKGVERSION=$pkgversion" >>$config_host_mak
5602echo "SRC_PATH=$source_path" >> $config_host_mak
5603echo "TARGET_DIRS=$target_list" >> $config_host_mak
5604if test "$modules" = "yes"; then
5605  # $shacmd can generate a hash started with digit, which the compiler doesn't
5606  # like as an symbol. So prefix it with an underscore
5607  echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
5608  echo "CONFIG_MODULES=y" >> $config_host_mak
5609fi
5610if test "$module_upgrades" = "yes"; then
5611  echo "CONFIG_MODULE_UPGRADES=y" >> $config_host_mak
5612fi
5613if test "$pipe2" = "yes" ; then
5614  echo "CONFIG_PIPE2=y" >> $config_host_mak
5615fi
5616if test "$accept4" = "yes" ; then
5617  echo "CONFIG_ACCEPT4=y" >> $config_host_mak
5618fi
5619if test "$splice" = "yes" ; then
5620  echo "CONFIG_SPLICE=y" >> $config_host_mak
5621fi
5622if test "$eventfd" = "yes" ; then
5623  echo "CONFIG_EVENTFD=y" >> $config_host_mak
5624fi
5625if test "$memfd" = "yes" ; then
5626  echo "CONFIG_MEMFD=y" >> $config_host_mak
5627fi
5628if test "$have_usbfs" = "yes" ; then
5629  echo "CONFIG_USBFS=y" >> $config_host_mak
5630fi
5631if test "$fallocate" = "yes" ; then
5632  echo "CONFIG_FALLOCATE=y" >> $config_host_mak
5633fi
5634if test "$fallocate_punch_hole" = "yes" ; then
5635  echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
5636fi
5637if test "$fallocate_zero_range" = "yes" ; then
5638  echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak
5639fi
5640if test "$posix_fallocate" = "yes" ; then
5641  echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
5642fi
5643if test "$sync_file_range" = "yes" ; then
5644  echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
5645fi
5646if test "$fiemap" = "yes" ; then
5647  echo "CONFIG_FIEMAP=y" >> $config_host_mak
5648fi
5649if test "$dup3" = "yes" ; then
5650  echo "CONFIG_DUP3=y" >> $config_host_mak
5651fi
5652if test "$ppoll" = "yes" ; then
5653  echo "CONFIG_PPOLL=y" >> $config_host_mak
5654fi
5655if test "$prctl_pr_set_timerslack" = "yes" ; then
5656  echo "CONFIG_PRCTL_PR_SET_TIMERSLACK=y" >> $config_host_mak
5657fi
5658if test "$epoll" = "yes" ; then
5659  echo "CONFIG_EPOLL=y" >> $config_host_mak
5660fi
5661if test "$epoll_create1" = "yes" ; then
5662  echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
5663fi
5664if test "$sendfile" = "yes" ; then
5665  echo "CONFIG_SENDFILE=y" >> $config_host_mak
5666fi
5667if test "$timerfd" = "yes" ; then
5668  echo "CONFIG_TIMERFD=y" >> $config_host_mak
5669fi
5670if test "$setns" = "yes" ; then
5671  echo "CONFIG_SETNS=y" >> $config_host_mak
5672fi
5673if test "$clock_adjtime" = "yes" ; then
5674  echo "CONFIG_CLOCK_ADJTIME=y" >> $config_host_mak
5675fi
5676if test "$syncfs" = "yes" ; then
5677  echo "CONFIG_SYNCFS=y" >> $config_host_mak
5678fi
5679if test "$inotify" = "yes" ; then
5680  echo "CONFIG_INOTIFY=y" >> $config_host_mak
5681fi
5682if test "$inotify1" = "yes" ; then
5683  echo "CONFIG_INOTIFY1=y" >> $config_host_mak
5684fi
5685if test "$sem_timedwait" = "yes" ; then
5686  echo "CONFIG_SEM_TIMEDWAIT=y" >> $config_host_mak
5687fi
5688if test "$strchrnul" = "yes" ; then
5689  echo "HAVE_STRCHRNUL=y" >> $config_host_mak
5690fi
5691if test "$st_atim" = "yes" ; then
5692  echo "HAVE_STRUCT_STAT_ST_ATIM=y" >> $config_host_mak
5693fi
5694if test "$sigev_notify_thread_id" = "yes" ; then
5695  echo "HAVE_SIGEV_NOTIFY_THREAD_ID=y" >> $config_host_mak
5696fi
5697if test "$byteswap_h" = "yes" ; then
5698  echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
5699fi
5700if test "$bswap_h" = "yes" ; then
5701  echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
5702fi
5703if test "$gio" = "yes" ; then
5704    echo "CONFIG_GIO=y" >> $config_host_mak
5705    echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
5706    echo "GIO_LIBS=$gio_libs" >> $config_host_mak
5707fi
5708if test "$gdbus_codegen" != "" ; then
5709    echo "GDBUS_CODEGEN=$gdbus_codegen" >> $config_host_mak
5710fi
5711echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
5712if test "$gnutls" = "yes" ; then
5713  echo "CONFIG_GNUTLS=y" >> $config_host_mak
5714  echo "GNUTLS_CFLAGS=$gnutls_cflags" >> $config_host_mak
5715  echo "GNUTLS_LIBS=$gnutls_libs" >> $config_host_mak
5716fi
5717if test "$gcrypt" = "yes" ; then
5718  echo "CONFIG_GCRYPT=y" >> $config_host_mak
5719  echo "GCRYPT_CFLAGS=$gcrypt_cflags" >> $config_host_mak
5720  echo "GCRYPT_LIBS=$gcrypt_libs" >> $config_host_mak
5721fi
5722if test "$nettle" = "yes" ; then
5723  echo "CONFIG_NETTLE=y" >> $config_host_mak
5724  echo "NETTLE_CFLAGS=$nettle_cflags" >> $config_host_mak
5725  echo "NETTLE_LIBS=$nettle_libs" >> $config_host_mak
5726fi
5727if test "$qemu_private_xts" = "yes" ; then
5728  echo "CONFIG_QEMU_PRIVATE_XTS=y" >> $config_host_mak
5729fi
5730if test "$tasn1" = "yes" ; then
5731  echo "CONFIG_TASN1=y" >> $config_host_mak
5732fi
5733if test "$auth_pam" = "yes" ; then
5734    echo "CONFIG_AUTH_PAM=y" >> $config_host_mak
5735fi
5736if test "$have_broken_size_max" = "yes" ; then
5737    echo "HAVE_BROKEN_SIZE_MAX=y" >> $config_host_mak
5738fi
5739if test "$have_openpty" = "yes" ; then
5740    echo "HAVE_OPENPTY=y" >> $config_host_mak
5741fi
5742
5743# Work around a system header bug with some kernel/XFS header
5744# versions where they both try to define 'struct fsxattr':
5745# xfs headers will not try to redefine structs from linux headers
5746# if this macro is set.
5747if test "$have_fsxattr" = "yes" ; then
5748    echo "HAVE_FSXATTR=y" >> $config_host_mak
5749fi
5750if test "$have_copy_file_range" = "yes" ; then
5751    echo "HAVE_COPY_FILE_RANGE=y" >> $config_host_mak
5752fi
5753if test "$vte" = "yes" ; then
5754  echo "CONFIG_VTE=y" >> $config_host_mak
5755  echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak
5756  echo "VTE_LIBS=$vte_libs" >> $config_host_mak
5757fi
5758if test "$virglrenderer" = "yes" ; then
5759  echo "CONFIG_VIRGL=y" >> $config_host_mak
5760  echo "VIRGL_CFLAGS=$virgl_cflags" >> $config_host_mak
5761  echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak
5762fi
5763if test "$xen" = "enabled" ; then
5764  echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
5765  echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
5766  echo "XEN_CFLAGS=$xen_cflags" >> $config_host_mak
5767  echo "XEN_LIBS=$xen_libs" >> $config_host_mak
5768fi
5769if test "$linux_aio" = "yes" ; then
5770  echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
5771fi
5772if test "$linux_io_uring" = "yes" ; then
5773  echo "CONFIG_LINUX_IO_URING=y" >> $config_host_mak
5774  echo "LINUX_IO_URING_CFLAGS=$linux_io_uring_cflags" >> $config_host_mak
5775  echo "LINUX_IO_URING_LIBS=$linux_io_uring_libs" >> $config_host_mak
5776fi
5777if test "$vhost_scsi" = "yes" ; then
5778  echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
5779fi
5780if test "$vhost_net" = "yes" ; then
5781  echo "CONFIG_VHOST_NET=y" >> $config_host_mak
5782fi
5783if test "$vhost_net_user" = "yes" ; then
5784  echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
5785fi
5786if test "$vhost_net_vdpa" = "yes" ; then
5787  echo "CONFIG_VHOST_NET_VDPA=y" >> $config_host_mak
5788fi
5789if test "$vhost_crypto" = "yes" ; then
5790  echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
5791fi
5792if test "$vhost_vsock" = "yes" ; then
5793  echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
5794  if test "$vhost_user" = "yes" ; then
5795    echo "CONFIG_VHOST_USER_VSOCK=y" >> $config_host_mak
5796  fi
5797fi
5798if test "$vhost_kernel" = "yes" ; then
5799  echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
5800fi
5801if test "$vhost_user" = "yes" ; then
5802  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
5803fi
5804if test "$vhost_vdpa" = "yes" ; then
5805  echo "CONFIG_VHOST_VDPA=y" >> $config_host_mak
5806fi
5807if test "$vhost_user_fs" = "yes" ; then
5808  echo "CONFIG_VHOST_USER_FS=y" >> $config_host_mak
5809fi
5810if test "$iovec" = "yes" ; then
5811  echo "CONFIG_IOVEC=y" >> $config_host_mak
5812fi
5813if test "$membarrier" = "yes" ; then
5814  echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
5815fi
5816if test "$signalfd" = "yes" ; then
5817  echo "CONFIG_SIGNALFD=y" >> $config_host_mak
5818fi
5819if test "$optreset" = "yes" ; then
5820  echo "HAVE_OPTRESET=y" >> $config_host_mak
5821fi
5822if test "$tcg" = "enabled" -a "$tcg_interpreter" = "true" ; then
5823  echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
5824fi
5825if test "$fdatasync" = "yes" ; then
5826  echo "CONFIG_FDATASYNC=y" >> $config_host_mak
5827fi
5828if test "$madvise" = "yes" ; then
5829  echo "CONFIG_MADVISE=y" >> $config_host_mak
5830fi
5831if test "$posix_madvise" = "yes" ; then
5832  echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak
5833fi
5834if test "$posix_memalign" = "yes" ; then
5835  echo "CONFIG_POSIX_MEMALIGN=y" >> $config_host_mak
5836fi
5837
5838if test "$spice_protocol" = "yes" ; then
5839  echo "CONFIG_SPICE_PROTOCOL=y" >> $config_host_mak
5840  echo "SPICE_PROTOCOL_CFLAGS=$spice_protocol_cflags" >> $config_host_mak
5841fi
5842if test "$spice" = "yes" ; then
5843  echo "CONFIG_SPICE=y" >> $config_host_mak
5844  echo "SPICE_CFLAGS=$spice_cflags $spice_protocol_cflags" >> $config_host_mak
5845  echo "SPICE_LIBS=$spice_libs" >> $config_host_mak
5846fi
5847
5848if test "$smartcard" = "yes" ; then
5849  echo "CONFIG_SMARTCARD=y" >> $config_host_mak
5850  echo "SMARTCARD_CFLAGS=$libcacard_cflags" >> $config_host_mak
5851  echo "SMARTCARD_LIBS=$libcacard_libs" >> $config_host_mak
5852fi
5853
5854if test "$libusb" = "yes" ; then
5855  echo "CONFIG_USB_LIBUSB=y" >> $config_host_mak
5856  echo "LIBUSB_CFLAGS=$libusb_cflags" >> $config_host_mak
5857  echo "LIBUSB_LIBS=$libusb_libs" >> $config_host_mak
5858fi
5859
5860if test "$usb_redir" = "yes" ; then
5861  echo "CONFIG_USB_REDIR=y" >> $config_host_mak
5862  echo "USB_REDIR_CFLAGS=$usb_redir_cflags" >> $config_host_mak
5863  echo "USB_REDIR_LIBS=$usb_redir_libs" >> $config_host_mak
5864fi
5865
5866if test "$opengl" = "yes" ; then
5867  echo "CONFIG_OPENGL=y" >> $config_host_mak
5868  echo "OPENGL_CFLAGS=$opengl_cflags" >> $config_host_mak
5869  echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
5870fi
5871
5872if test "$gbm" = "yes" ; then
5873    echo "CONFIG_GBM=y" >> $config_host_mak
5874    echo "GBM_LIBS=$gbm_libs" >> $config_host_mak
5875    echo "GBM_CFLAGS=$gbm_cflags" >> $config_host_mak
5876fi
5877
5878
5879if test "$avx2_opt" = "yes" ; then
5880  echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
5881fi
5882
5883if test "$avx512f_opt" = "yes" ; then
5884  echo "CONFIG_AVX512F_OPT=y" >> $config_host_mak
5885fi
5886
5887# XXX: suppress that
5888if [ "$bsd" = "yes" ] ; then
5889  echo "CONFIG_BSD=y" >> $config_host_mak
5890fi
5891
5892if test "$qom_cast_debug" = "yes" ; then
5893  echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
5894fi
5895
5896echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
5897if test "$coroutine_pool" = "yes" ; then
5898  echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
5899else
5900  echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
5901fi
5902
5903if test "$debug_stack_usage" = "yes" ; then
5904  echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
5905fi
5906
5907if test "$crypto_afalg" = "yes" ; then
5908  echo "CONFIG_AF_ALG=y" >> $config_host_mak
5909fi
5910
5911if test "$open_by_handle_at" = "yes" ; then
5912  echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
5913fi
5914
5915if test "$linux_magic_h" = "yes" ; then
5916  echo "CONFIG_LINUX_MAGIC_H=y" >> $config_host_mak
5917fi
5918
5919if test "$valgrind_h" = "yes" ; then
5920  echo "CONFIG_VALGRIND_H=y" >> $config_host_mak
5921fi
5922
5923if test "$have_asan_iface_fiber" = "yes" ; then
5924    echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
5925fi
5926
5927if test "$have_tsan" = "yes" && test "$have_tsan_iface_fiber" = "yes" ; then
5928    echo "CONFIG_TSAN=y" >> $config_host_mak
5929fi
5930
5931if test "$has_environ" = "yes" ; then
5932  echo "CONFIG_HAS_ENVIRON=y" >> $config_host_mak
5933fi
5934
5935if test "$cpuid_h" = "yes" ; then
5936  echo "CONFIG_CPUID_H=y" >> $config_host_mak
5937fi
5938
5939if test "$int128" = "yes" ; then
5940  echo "CONFIG_INT128=y" >> $config_host_mak
5941fi
5942
5943if test "$atomic128" = "yes" ; then
5944  echo "CONFIG_ATOMIC128=y" >> $config_host_mak
5945fi
5946
5947if test "$cmpxchg128" = "yes" ; then
5948  echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
5949fi
5950
5951if test "$atomic64" = "yes" ; then
5952  echo "CONFIG_ATOMIC64=y" >> $config_host_mak
5953fi
5954
5955if test "$getauxval" = "yes" ; then
5956  echo "CONFIG_GETAUXVAL=y" >> $config_host_mak
5957fi
5958
5959if test "$libssh" = "yes" ; then
5960  echo "CONFIG_LIBSSH=y" >> $config_host_mak
5961  echo "LIBSSH_CFLAGS=$libssh_cflags" >> $config_host_mak
5962  echo "LIBSSH_LIBS=$libssh_libs" >> $config_host_mak
5963fi
5964
5965if test "$live_block_migration" = "yes" ; then
5966  echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
5967fi
5968
5969if test "$tpm" = "yes"; then
5970  echo 'CONFIG_TPM=y' >> $config_host_mak
5971fi
5972
5973echo "TRACE_BACKENDS=$trace_backends" >> $config_host_mak
5974if have_backend "nop"; then
5975  echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
5976fi
5977if have_backend "simple"; then
5978  echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
5979  # Set the appropriate trace file.
5980  trace_file="\"$trace_file-\" FMT_pid"
5981fi
5982if have_backend "log"; then
5983  echo "CONFIG_TRACE_LOG=y" >> $config_host_mak
5984fi
5985if have_backend "ust"; then
5986  echo "CONFIG_TRACE_UST=y" >> $config_host_mak
5987  echo "LTTNG_UST_LIBS=$lttng_ust_libs" >> $config_host_mak
5988  echo "URCU_BP_LIBS=$urcu_bp_libs" >> $config_host_mak
5989fi
5990if have_backend "dtrace"; then
5991  echo "CONFIG_TRACE_DTRACE=y" >> $config_host_mak
5992  if test "$trace_backend_stap" = "yes" ; then
5993    echo "CONFIG_TRACE_SYSTEMTAP=y" >> $config_host_mak
5994  fi
5995fi
5996if have_backend "ftrace"; then
5997  if test "$linux" = "yes" ; then
5998    echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak
5999  else
6000    feature_not_found "ftrace(trace backend)" "ftrace requires Linux"
6001  fi
6002fi
6003if have_backend "syslog"; then
6004  if test "$posix_syslog" = "yes" ; then
6005    echo "CONFIG_TRACE_SYSLOG=y" >> $config_host_mak
6006  else
6007    feature_not_found "syslog(trace backend)" "syslog not available"
6008  fi
6009fi
6010echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
6011
6012if test "$rdma" = "yes" ; then
6013  echo "CONFIG_RDMA=y" >> $config_host_mak
6014  echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
6015fi
6016
6017if test "$pvrdma" = "yes" ; then
6018  echo "CONFIG_PVRDMA=y" >> $config_host_mak
6019fi
6020
6021if test "$have_rtnetlink" = "yes" ; then
6022  echo "CONFIG_RTNETLINK=y" >> $config_host_mak
6023fi
6024
6025if test "$libxml2" = "yes" ; then
6026  echo "CONFIG_LIBXML2=y" >> $config_host_mak
6027  echo "LIBXML2_CFLAGS=$libxml2_cflags" >> $config_host_mak
6028  echo "LIBXML2_LIBS=$libxml2_libs" >> $config_host_mak
6029fi
6030
6031if test "$replication" = "yes" ; then
6032  echo "CONFIG_REPLICATION=y" >> $config_host_mak
6033fi
6034
6035if test "$have_af_vsock" = "yes" ; then
6036  echo "CONFIG_AF_VSOCK=y" >> $config_host_mak
6037fi
6038
6039if test "$have_sysmacros" = "yes" ; then
6040  echo "CONFIG_SYSMACROS=y" >> $config_host_mak
6041fi
6042
6043if test "$have_utmpx" = "yes" ; then
6044  echo "HAVE_UTMPX=y" >> $config_host_mak
6045fi
6046if test "$have_getrandom" = "yes" ; then
6047  echo "CONFIG_GETRANDOM=y" >> $config_host_mak
6048fi
6049if test "$ivshmem" = "yes" ; then
6050  echo "CONFIG_IVSHMEM=y" >> $config_host_mak
6051fi
6052if test "$debug_mutex" = "yes" ; then
6053  echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
6054fi
6055
6056# Hold two types of flag:
6057#   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
6058#                                     a thread we have a handle to
6059#   CONFIG_PTHREAD_SETNAME_NP_W_TID - A way of doing it on a particular
6060#                                     platform
6061if test "$pthread_setname_np_w_tid" = "yes" ; then
6062  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
6063  echo "CONFIG_PTHREAD_SETNAME_NP_W_TID=y" >> $config_host_mak
6064elif test "$pthread_setname_np_wo_tid" = "yes" ; then
6065  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
6066  echo "CONFIG_PTHREAD_SETNAME_NP_WO_TID=y" >> $config_host_mak
6067fi
6068
6069if test "$libpmem" = "yes" ; then
6070  echo "CONFIG_LIBPMEM=y" >> $config_host_mak
6071  echo "LIBPMEM_LIBS=$libpmem_libs" >> $config_host_mak
6072  echo "LIBPMEM_CFLAGS=$libpmem_cflags" >> $config_host_mak
6073fi
6074
6075if test "$libdaxctl" = "yes" ; then
6076  echo "CONFIG_LIBDAXCTL=y" >> $config_host_mak
6077  echo "LIBDAXCTL_LIBS=$libdaxctl_libs" >> $config_host_mak
6078fi
6079
6080if test "$bochs" = "yes" ; then
6081  echo "CONFIG_BOCHS=y" >> $config_host_mak
6082fi
6083if test "$cloop" = "yes" ; then
6084  echo "CONFIG_CLOOP=y" >> $config_host_mak
6085fi
6086if test "$dmg" = "yes" ; then
6087  echo "CONFIG_DMG=y" >> $config_host_mak
6088fi
6089if test "$qcow1" = "yes" ; then
6090  echo "CONFIG_QCOW1=y" >> $config_host_mak
6091fi
6092if test "$vdi" = "yes" ; then
6093  echo "CONFIG_VDI=y" >> $config_host_mak
6094fi
6095if test "$vvfat" = "yes" ; then
6096  echo "CONFIG_VVFAT=y" >> $config_host_mak
6097fi
6098if test "$qed" = "yes" ; then
6099  echo "CONFIG_QED=y" >> $config_host_mak
6100fi
6101if test "$parallels" = "yes" ; then
6102  echo "CONFIG_PARALLELS=y" >> $config_host_mak
6103fi
6104if test "$have_mlockall" = "yes" ; then
6105  echo "HAVE_MLOCKALL=y" >> $config_host_mak
6106fi
6107if test "$fuzzing" = "yes" ; then
6108  # If LIB_FUZZING_ENGINE is set, assume we are running on OSS-Fuzz, and the
6109  # needed CFLAGS have already been provided
6110  if test -z "${LIB_FUZZING_ENGINE+xxx}" ; then
6111    # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
6112    # compiled code.
6113    QEMU_CFLAGS="$QEMU_CFLAGS -fsanitize=fuzzer-no-link"
6114    # To build non-fuzzer binaries with --enable-fuzzing, link everything with
6115    # fsanitize=fuzzer-no-link. Otherwise, the linker will be unable to bind
6116    # the fuzzer-related callbacks added by instrumentation.
6117    QEMU_LDFLAGS="$QEMU_LDFLAGS -fsanitize=fuzzer-no-link"
6118    # For the actual fuzzer binaries, we need to link against the libfuzzer
6119    # library. Provide the flags for doing this in FUZZ_EXE_LDFLAGS. The meson
6120    # rule for the fuzzer adds these to the link_args. They need to be
6121    # configurable, to support OSS-Fuzz
6122    FUZZ_EXE_LDFLAGS="-fsanitize=fuzzer"
6123  else
6124    FUZZ_EXE_LDFLAGS="$LIB_FUZZING_ENGINE"
6125  fi
6126fi
6127
6128if test "$plugins" = "yes" ; then
6129    echo "CONFIG_PLUGIN=y" >> $config_host_mak
6130    # Copy the export object list to the build dir
6131    if test "$ld_dynamic_list" = "yes" ; then
6132	echo "CONFIG_HAS_LD_DYNAMIC_LIST=yes" >> $config_host_mak
6133	ld_symbols=qemu-plugins-ld.symbols
6134	cp "$source_path/plugins/qemu-plugins.symbols" $ld_symbols
6135    elif test "$ld_exported_symbols_list" = "yes" ; then
6136	echo "CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST=yes" >> $config_host_mak
6137	ld64_symbols=qemu-plugins-ld64.symbols
6138	echo "# Automatically generated by configure - do not modify" > $ld64_symbols
6139	grep 'qemu_' "$source_path/plugins/qemu-plugins.symbols" | sed 's/;//g' | \
6140	    sed -E 's/^[[:space:]]*(.*)/_\1/' >> $ld64_symbols
6141    else
6142	error_exit \
6143	    "If \$plugins=yes, either \$ld_dynamic_list or " \
6144	    "\$ld_exported_symbols_list should have been set to 'yes'."
6145    fi
6146fi
6147
6148if test -n "$gdb_bin"; then
6149    gdb_version=$($gdb_bin --version | head -n 1)
6150    if version_ge ${gdb_version##* } 9.1; then
6151        echo "HAVE_GDB_BIN=$gdb_bin" >> $config_host_mak
6152    fi
6153fi
6154
6155if test "$secret_keyring" = "yes" ; then
6156  echo "CONFIG_SECRET_KEYRING=y" >> $config_host_mak
6157fi
6158
6159echo "ROMS=$roms" >> $config_host_mak
6160echo "MAKE=$make" >> $config_host_mak
6161echo "PYTHON=$python" >> $config_host_mak
6162echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
6163echo "MESON=$meson" >> $config_host_mak
6164echo "NINJA=$ninja" >> $config_host_mak
6165echo "CC=$cc" >> $config_host_mak
6166echo "HOST_CC=$host_cc" >> $config_host_mak
6167if $iasl -h > /dev/null 2>&1; then
6168  echo "CONFIG_IASL=$iasl" >> $config_host_mak
6169fi
6170echo "CXX=$cxx" >> $config_host_mak
6171echo "OBJCC=$objcc" >> $config_host_mak
6172echo "AR=$ar" >> $config_host_mak
6173echo "ARFLAGS=$ARFLAGS" >> $config_host_mak
6174echo "AS=$as" >> $config_host_mak
6175echo "CCAS=$ccas" >> $config_host_mak
6176echo "CPP=$cpp" >> $config_host_mak
6177echo "OBJCOPY=$objcopy" >> $config_host_mak
6178echo "LD=$ld" >> $config_host_mak
6179echo "RANLIB=$ranlib" >> $config_host_mak
6180echo "NM=$nm" >> $config_host_mak
6181echo "PKG_CONFIG=$pkg_config_exe" >> $config_host_mak
6182echo "WINDRES=$windres" >> $config_host_mak
6183echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
6184echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
6185echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
6186echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
6187echo "GLIB_LIBS=$glib_libs" >> $config_host_mak
6188echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
6189echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
6190echo "EXESUF=$EXESUF" >> $config_host_mak
6191echo "HOST_DSOSUF=$HOST_DSOSUF" >> $config_host_mak
6192echo "LIBS_QGA=$libs_qga" >> $config_host_mak
6193echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak
6194echo "TASN1_CFLAGS=$tasn1_cflags" >> $config_host_mak
6195if test "$gcov" = "yes" ; then
6196  echo "CONFIG_GCOV=y" >> $config_host_mak
6197fi
6198
6199if test "$fuzzing" != "no"; then
6200    echo "CONFIG_FUZZ=y" >> $config_host_mak
6201fi
6202echo "FUZZ_EXE_LDFLAGS=$FUZZ_EXE_LDFLAGS" >> $config_host_mak
6203
6204if test "$rng_none" = "yes"; then
6205  echo "CONFIG_RNG_NONE=y" >> $config_host_mak
6206fi
6207
6208# use included Linux headers
6209if test "$linux" = "yes" ; then
6210  mkdir -p linux-headers
6211  case "$cpu" in
6212  i386|x86_64|x32)
6213    linux_arch=x86
6214    ;;
6215  ppc|ppc64|ppc64le)
6216    linux_arch=powerpc
6217    ;;
6218  s390x)
6219    linux_arch=s390
6220    ;;
6221  aarch64)
6222    linux_arch=arm64
6223    ;;
6224  mips64)
6225    linux_arch=mips
6226    ;;
6227  *)
6228    # For most CPUs the kernel architecture name and QEMU CPU name match.
6229    linux_arch="$cpu"
6230    ;;
6231  esac
6232    # For non-KVM architectures we will not have asm headers
6233    if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
6234      symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
6235    fi
6236fi
6237
6238for target in $target_list; do
6239    target_dir="$target"
6240    target_name=$(echo $target | cut -d '-' -f 1)
6241    mkdir -p $target_dir
6242    case $target in
6243        *-user) symlink "../qemu-$target_name" "$target_dir/qemu-$target_name" ;;
6244        *) symlink "../qemu-system-$target_name" "$target_dir/qemu-system-$target_name" ;;
6245    esac
6246done
6247
6248echo "CONFIG_QEMU_INTERP_PREFIX=$interp_prefix" | sed 's/%M/@0@/' >> $config_host_mak
6249if test "$default_targets" = "yes"; then
6250  echo "CONFIG_DEFAULT_TARGETS=y" >> $config_host_mak
6251fi
6252
6253if test "$numa" = "yes"; then
6254  echo "CONFIG_NUMA=y" >> $config_host_mak
6255  echo "NUMA_LIBS=$numa_libs" >> $config_host_mak
6256fi
6257
6258if test "$ccache_cpp2" = "yes"; then
6259  echo "export CCACHE_CPP2=y" >> $config_host_mak
6260fi
6261
6262if test "$safe_stack" = "yes"; then
6263  echo "CONFIG_SAFESTACK=y" >> $config_host_mak
6264fi
6265
6266# If we're using a separate build tree, set it up now.
6267# DIRS are directories which we simply mkdir in the build tree;
6268# LINKS are things to symlink back into the source tree
6269# (these can be both files and directories).
6270# Caution: do not add files or directories here using wildcards. This
6271# will result in problems later if a new file matching the wildcard is
6272# added to the source tree -- nothing will cause configure to be rerun
6273# so the build tree will be missing the link back to the new file, and
6274# tests might fail. Prefer to keep the relevant files in their own
6275# directory and symlink the directory instead.
6276# UNLINK is used to remove symlinks from older development versions
6277# that might get into the way when doing "git update" without doing
6278# a "make distclean" in between.
6279DIRS="tests tests/tcg tests/qapi-schema tests/qtest/libqos"
6280DIRS="$DIRS tests/qtest tests/qemu-iotests tests/vm tests/fp tests/qgraph"
6281DIRS="$DIRS docs docs/interop fsdev scsi"
6282DIRS="$DIRS pc-bios/optionrom pc-bios/s390-ccw"
6283DIRS="$DIRS roms/seabios"
6284DIRS="$DIRS contrib/plugins/"
6285LINKS="Makefile"
6286LINKS="$LINKS tests/tcg/Makefile.target"
6287LINKS="$LINKS pc-bios/optionrom/Makefile"
6288LINKS="$LINKS pc-bios/s390-ccw/Makefile"
6289LINKS="$LINKS roms/seabios/Makefile"
6290LINKS="$LINKS pc-bios/qemu-icon.bmp"
6291LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
6292LINKS="$LINKS tests/acceptance tests/data"
6293LINKS="$LINKS tests/qemu-iotests/check"
6294LINKS="$LINKS python"
6295LINKS="$LINKS contrib/plugins/Makefile "
6296UNLINK="pc-bios/keymaps"
6297for bios_file in \
6298    $source_path/pc-bios/*.bin \
6299    $source_path/pc-bios/*.elf \
6300    $source_path/pc-bios/*.lid \
6301    $source_path/pc-bios/*.rom \
6302    $source_path/pc-bios/*.dtb \
6303    $source_path/pc-bios/*.img \
6304    $source_path/pc-bios/openbios-* \
6305    $source_path/pc-bios/u-boot.* \
6306    $source_path/pc-bios/edk2-*.fd.bz2 \
6307    $source_path/pc-bios/palcode-*
6308do
6309    LINKS="$LINKS pc-bios/$(basename $bios_file)"
6310done
6311mkdir -p $DIRS
6312for f in $LINKS ; do
6313    if [ -e "$source_path/$f" ]; then
6314        symlink "$source_path/$f" "$f"
6315    fi
6316done
6317for f in $UNLINK ; do
6318    if [ -L "$f" ]; then
6319        rm -f "$f"
6320    fi
6321done
6322
6323(for i in $cross_cc_vars; do
6324  export $i
6325done
6326export target_list source_path use_containers ARCH
6327$source_path/tests/tcg/configure.sh)
6328
6329# temporary config to build submodules
6330for rom in seabios; do
6331    config_mak=roms/$rom/config.mak
6332    echo "# Automatically generated by configure - do not modify" > $config_mak
6333    echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
6334    echo "AS=$as" >> $config_mak
6335    echo "CCAS=$ccas" >> $config_mak
6336    echo "CC=$cc" >> $config_mak
6337    echo "BCC=bcc" >> $config_mak
6338    echo "CPP=$cpp" >> $config_mak
6339    echo "OBJCOPY=objcopy" >> $config_mak
6340    echo "IASL=$iasl" >> $config_mak
6341    echo "LD=$ld" >> $config_mak
6342    echo "RANLIB=$ranlib" >> $config_mak
6343done
6344
6345if test "$skip_meson" = no; then
6346  cross="config-meson.cross.new"
6347  meson_quote() {
6348    echo "'$(echo $* | sed "s/ /','/g")'"
6349  }
6350
6351  echo "# Automatically generated by configure - do not modify" > $cross
6352  echo "[properties]" >> $cross
6353  test -z "$cxx" && echo "link_language = 'c'" >> $cross
6354  echo "[built-in options]" >> $cross
6355  echo "c_args = [${CFLAGS:+$(meson_quote $CFLAGS)}]" >> $cross
6356  echo "cpp_args = [${CXXFLAGS:+$(meson_quote $CXXFLAGS)}]" >> $cross
6357  echo "c_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
6358  echo "cpp_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
6359  echo "[binaries]" >> $cross
6360  echo "c = [$(meson_quote $cc)]" >> $cross
6361  test -n "$cxx" && echo "cpp = [$(meson_quote $cxx)]" >> $cross
6362  test -n "$objcc" && echo "objc = [$(meson_quote $objcc)]" >> $cross
6363  echo "ar = [$(meson_quote $ar)]" >> $cross
6364  echo "nm = [$(meson_quote $nm)]" >> $cross
6365  echo "pkgconfig = [$(meson_quote $pkg_config_exe)]" >> $cross
6366  echo "ranlib = [$(meson_quote $ranlib)]" >> $cross
6367  if has $sdl2_config; then
6368    echo "sdl2-config = [$(meson_quote $sdl2_config)]" >> $cross
6369  fi
6370  echo "strip = [$(meson_quote $strip)]" >> $cross
6371  echo "windres = [$(meson_quote $windres)]" >> $cross
6372  if test "$cross_compile" = "yes"; then
6373    cross_arg="--cross-file config-meson.cross"
6374    echo "[host_machine]" >> $cross
6375    if test "$mingw32" = "yes" ; then
6376        echo "system = 'windows'" >> $cross
6377    fi
6378    if test "$linux" = "yes" ; then
6379        echo "system = 'linux'" >> $cross
6380    fi
6381    if test "$darwin" = "yes" ; then
6382        echo "system = 'darwin'" >> $cross
6383    fi
6384    case "$ARCH" in
6385        i386)
6386            echo "cpu_family = 'x86'" >> $cross
6387            ;;
6388        x86_64|x32)
6389            echo "cpu_family = 'x86_64'" >> $cross
6390            ;;
6391        ppc64le)
6392            echo "cpu_family = 'ppc64'" >> $cross
6393            ;;
6394        *)
6395            echo "cpu_family = '$ARCH'" >> $cross
6396            ;;
6397    esac
6398    echo "cpu = '$cpu'" >> $cross
6399    if test "$bigendian" = "yes" ; then
6400        echo "endian = 'big'" >> $cross
6401    else
6402        echo "endian = 'little'" >> $cross
6403    fi
6404  else
6405    cross_arg="--native-file config-meson.cross"
6406  fi
6407  mv $cross config-meson.cross
6408
6409  rm -rf meson-private meson-info meson-logs
6410  unset staticpic
6411  if ! version_ge "$($meson --version)" 0.56.0; then
6412    staticpic=$(if test "$pie" = yes; then echo true; else echo false; fi)
6413  fi
6414  NINJA=$ninja $meson setup \
6415        --prefix "$prefix" \
6416        --libdir "$libdir" \
6417        --libexecdir "$libexecdir" \
6418        --bindir "$bindir" \
6419        --includedir "$includedir" \
6420        --datadir "$datadir" \
6421        --mandir "$mandir" \
6422        --sysconfdir "$sysconfdir" \
6423        --localedir "$localedir" \
6424        --localstatedir "$local_statedir" \
6425        -Ddocdir="$docdir" \
6426        -Dqemu_firmwarepath="$firmwarepath" \
6427        -Dqemu_suffix="$qemu_suffix" \
6428        -Doptimization=$(if test "$debug" = yes; then echo 0; else echo 2; fi) \
6429        -Ddebug=$(if test "$debug_info" = yes; then echo true; else echo false; fi) \
6430        -Dwerror=$(if test "$werror" = yes; then echo true; else echo false; fi) \
6431        -Dstrip=$(if test "$strip_opt" = yes; then echo true; else echo false; fi) \
6432        -Db_pie=$(if test "$pie" = yes; then echo true; else echo false; fi) \
6433        ${staticpic:+-Db_staticpic=$staticpic} \
6434        -Db_coverage=$(if test "$gcov" = yes; then echo true; else echo false; fi) \
6435        -Db_lto=$lto -Dcfi=$cfi -Dcfi_debug=$cfi_debug \
6436        -Dmalloc=$malloc -Dmalloc_trim=$malloc_trim -Dsparse=$sparse \
6437        -Dkvm=$kvm -Dhax=$hax -Dwhpx=$whpx -Dhvf=$hvf -Dnvmm=$nvmm \
6438        -Dxen=$xen -Dxen_pci_passthrough=$xen_pci_passthrough -Dtcg=$tcg \
6439        -Dcocoa=$cocoa -Dgtk=$gtk -Dmpath=$mpath -Dsdl=$sdl -Dsdl_image=$sdl_image \
6440        -Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg -Dvnc_png=$vnc_png \
6441        -Dgettext=$gettext -Dxkbcommon=$xkbcommon -Du2f=$u2f -Dvirtiofsd=$virtiofsd \
6442        -Dcapstone=$capstone -Dslirp=$slirp -Dfdt=$fdt -Dbrlapi=$brlapi \
6443        -Dcurl=$curl -Dglusterfs=$glusterfs -Dbzip2=$bzip2 -Dlibiscsi=$libiscsi \
6444        -Dlibnfs=$libnfs -Diconv=$iconv -Dcurses=$curses -Dlibudev=$libudev\
6445        -Drbd=$rbd -Dlzo=$lzo -Dsnappy=$snappy -Dlzfse=$lzfse \
6446        -Dzstd=$zstd -Dseccomp=$seccomp -Dvirtfs=$virtfs -Dcap_ng=$cap_ng \
6447        -Dattr=$attr -Ddefault_devices=$default_devices \
6448        -Ddocs=$docs -Dsphinx_build=$sphinx_build -Dinstall_blobs=$blobs \
6449        -Dvhost_user_blk_server=$vhost_user_blk_server -Dmultiprocess=$multiprocess \
6450        -Dfuse=$fuse -Dfuse_lseek=$fuse_lseek -Dguest_agent_msi=$guest_agent_msi -Dbpf=$bpf\
6451        $(if test "$default_features" = no; then echo "-Dauto_features=disabled"; fi) \
6452	-Dtcg_interpreter=$tcg_interpreter \
6453        $cross_arg \
6454        "$PWD" "$source_path"
6455
6456  if test "$?" -ne 0 ; then
6457      error_exit "meson setup failed"
6458  fi
6459else
6460  if test -f meson-private/cmd_line.txt; then
6461    # Adjust old command line options whose type was changed
6462    # Avoids having to use "setup --wipe" when Meson is upgraded
6463    perl -i -ne '
6464      s/^gettext = true$/gettext = auto/;
6465      s/^gettext = false$/gettext = disabled/;
6466      print;' meson-private/cmd_line.txt
6467  fi
6468fi
6469
6470if test -n "${deprecated_features}"; then
6471    echo "Warning, deprecated features enabled."
6472    echo "Please see docs/system/deprecated.rst"
6473    echo "  features: ${deprecated_features}"
6474fi
6475
6476# Create list of config switches that should be poisoned in common code...
6477# but filter out CONFIG_TCG and CONFIG_USER_ONLY which are special.
6478target_configs_h=$(ls *-config-devices.h *-config-target.h 2>/dev/null)
6479if test -n "$target_configs_h" ; then
6480    sed -n -e '/CONFIG_TCG/d' -e '/CONFIG_USER_ONLY/d' \
6481        -e '/^#define / { s///; s/ .*//; s/^/#pragma GCC poison /p; }' \
6482        $target_configs_h | sort -u > config-poison.h
6483else
6484    :> config-poison.h
6485fi
6486
6487# Save the configure command line for later reuse.
6488cat <<EOD >config.status
6489#!/bin/sh
6490# Generated by configure.
6491# Run this file to recreate the current configuration.
6492# Compiler output produced by configure, useful for debugging
6493# configure, is in config.log if it exists.
6494EOD
6495
6496preserve_env() {
6497    envname=$1
6498
6499    eval envval=\$$envname
6500
6501    if test -n "$envval"
6502    then
6503	echo "$envname='$envval'" >> config.status
6504	echo "export $envname" >> config.status
6505    else
6506	echo "unset $envname" >> config.status
6507    fi
6508}
6509
6510# Preserve various env variables that influence what
6511# features/build target configure will detect
6512preserve_env AR
6513preserve_env AS
6514preserve_env CC
6515preserve_env CPP
6516preserve_env CXX
6517preserve_env INSTALL
6518preserve_env LD
6519preserve_env LD_LIBRARY_PATH
6520preserve_env LIBTOOL
6521preserve_env MAKE
6522preserve_env NM
6523preserve_env OBJCOPY
6524preserve_env PATH
6525preserve_env PKG_CONFIG
6526preserve_env PKG_CONFIG_LIBDIR
6527preserve_env PKG_CONFIG_PATH
6528preserve_env PYTHON
6529preserve_env SDL2_CONFIG
6530preserve_env SMBD
6531preserve_env STRIP
6532preserve_env WINDRES
6533
6534printf "exec" >>config.status
6535for i in "$0" "$@"; do
6536  test "$i" = --skip-meson || printf " %s" "$(quote_sh "$i")" >>config.status
6537done
6538echo ' "$@"' >>config.status
6539chmod +x config.status
6540
6541rm -r "$TMPDIR1"
6542