xref: /openbmc/qemu/configure (revision 11fb99e6)
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=gnu99/-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=gnu99 -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 trace backend exists
4445
4446$python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
4447if test "$?" -ne 0 ; then
4448  error_exit "invalid trace backends" \
4449      "Please choose supported trace backends."
4450fi
4451
4452##########################################
4453# For 'ust' backend, test if ust headers are present
4454if have_backend "ust"; then
4455  cat > $TMPC << EOF
4456#include <lttng/tracepoint.h>
4457int main(void) { return 0; }
4458EOF
4459  if compile_prog "" "-Wl,--no-as-needed -ldl" ; then
4460    if $pkg_config lttng-ust --exists; then
4461      lttng_ust_libs=$($pkg_config --libs lttng-ust)
4462    else
4463      lttng_ust_libs="-llttng-ust -ldl"
4464    fi
4465    if $pkg_config liburcu-bp --exists; then
4466      urcu_bp_libs=$($pkg_config --libs liburcu-bp)
4467    else
4468      urcu_bp_libs="-lurcu-bp"
4469    fi
4470  else
4471    error_exit "Trace backend 'ust' missing lttng-ust header files"
4472  fi
4473fi
4474
4475##########################################
4476# For 'dtrace' backend, test if 'dtrace' command is present
4477if have_backend "dtrace"; then
4478  if ! has 'dtrace' ; then
4479    error_exit "dtrace command is not found in PATH $PATH"
4480  fi
4481  trace_backend_stap="no"
4482  if has 'stap' ; then
4483    trace_backend_stap="yes"
4484
4485    # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
4486    # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
4487    # instead. QEMU --enable-modules depends on this because the SystemTap
4488    # semaphores are linked into the main binary and not the module's shared
4489    # object.
4490    QEMU_CFLAGS="$QEMU_CFLAGS -DSTAP_SDT_V2"
4491  fi
4492fi
4493
4494##########################################
4495# check and set a backend for coroutine
4496
4497# We prefer ucontext, but it's not always possible. The fallback
4498# is sigcontext. On Windows the only valid backend is the Windows
4499# specific one.
4500
4501ucontext_works=no
4502if test "$darwin" != "yes"; then
4503  cat > $TMPC << EOF
4504#include <ucontext.h>
4505#ifdef __stub_makecontext
4506#error Ignoring glibc stub makecontext which will always fail
4507#endif
4508int main(void) { makecontext(0, 0, 0); return 0; }
4509EOF
4510  if compile_prog "" "" ; then
4511    ucontext_works=yes
4512  fi
4513fi
4514
4515if test "$coroutine" = ""; then
4516  if test "$mingw32" = "yes"; then
4517    coroutine=win32
4518  elif test "$ucontext_works" = "yes"; then
4519    coroutine=ucontext
4520  else
4521    coroutine=sigaltstack
4522  fi
4523else
4524  case $coroutine in
4525  windows)
4526    if test "$mingw32" != "yes"; then
4527      error_exit "'windows' coroutine backend only valid for Windows"
4528    fi
4529    # Unfortunately the user visible backend name doesn't match the
4530    # coroutine-*.c filename for this case, so we have to adjust it here.
4531    coroutine=win32
4532    ;;
4533  ucontext)
4534    if test "$ucontext_works" != "yes"; then
4535      feature_not_found "ucontext"
4536    fi
4537    ;;
4538  sigaltstack)
4539    if test "$mingw32" = "yes"; then
4540      error_exit "only the 'windows' coroutine backend is valid for Windows"
4541    fi
4542    ;;
4543  *)
4544    error_exit "unknown coroutine backend $coroutine"
4545    ;;
4546  esac
4547fi
4548
4549if test "$coroutine_pool" = ""; then
4550  coroutine_pool=yes
4551fi
4552
4553if test "$debug_stack_usage" = "yes"; then
4554  if test "$coroutine_pool" = "yes"; then
4555    echo "WARN: disabling coroutine pool for stack usage debugging"
4556    coroutine_pool=no
4557  fi
4558fi
4559
4560##################################################
4561# SafeStack
4562
4563
4564if test "$safe_stack" = "yes"; then
4565cat > $TMPC << EOF
4566int main(int argc, char *argv[])
4567{
4568#if ! __has_feature(safe_stack)
4569#error SafeStack Disabled
4570#endif
4571    return 0;
4572}
4573EOF
4574  flag="-fsanitize=safe-stack"
4575  # Check that safe-stack is supported and enabled.
4576  if compile_prog "-Werror $flag" "$flag"; then
4577    # Flag needed both at compilation and at linking
4578    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
4579    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
4580  else
4581    error_exit "SafeStack not supported by your compiler"
4582  fi
4583  if test "$coroutine" != "ucontext"; then
4584    error_exit "SafeStack is only supported by the coroutine backend ucontext"
4585  fi
4586else
4587cat > $TMPC << EOF
4588int main(int argc, char *argv[])
4589{
4590#if defined(__has_feature)
4591#if __has_feature(safe_stack)
4592#error SafeStack Enabled
4593#endif
4594#endif
4595    return 0;
4596}
4597EOF
4598if test "$safe_stack" = "no"; then
4599  # Make sure that safe-stack is disabled
4600  if ! compile_prog "-Werror" ""; then
4601    # SafeStack was already enabled, try to explicitly remove the feature
4602    flag="-fno-sanitize=safe-stack"
4603    if ! compile_prog "-Werror $flag" "$flag"; then
4604      error_exit "Configure cannot disable SafeStack"
4605    fi
4606    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
4607    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
4608  fi
4609else # "$safe_stack" = ""
4610  # Set safe_stack to yes or no based on pre-existing flags
4611  if compile_prog "-Werror" ""; then
4612    safe_stack="no"
4613  else
4614    safe_stack="yes"
4615    if test "$coroutine" != "ucontext"; then
4616      error_exit "SafeStack is only supported by the coroutine backend ucontext"
4617    fi
4618  fi
4619fi
4620fi
4621
4622##########################################
4623# check if we have open_by_handle_at
4624
4625open_by_handle_at=no
4626cat > $TMPC << EOF
4627#include <fcntl.h>
4628#if !defined(AT_EMPTY_PATH)
4629# error missing definition
4630#else
4631int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
4632#endif
4633EOF
4634if compile_prog "" "" ; then
4635    open_by_handle_at=yes
4636fi
4637
4638########################################
4639# check if we have linux/magic.h
4640
4641linux_magic_h=no
4642cat > $TMPC << EOF
4643#include <linux/magic.h>
4644int main(void) {
4645  return 0;
4646}
4647EOF
4648if compile_prog "" "" ; then
4649    linux_magic_h=yes
4650fi
4651
4652########################################
4653# check if we have valgrind/valgrind.h
4654
4655valgrind_h=no
4656cat > $TMPC << EOF
4657#include <valgrind/valgrind.h>
4658int main(void) {
4659  return 0;
4660}
4661EOF
4662if compile_prog "" "" ; then
4663    valgrind_h=yes
4664fi
4665
4666########################################
4667# check if environ is declared
4668
4669has_environ=no
4670cat > $TMPC << EOF
4671#include <unistd.h>
4672int main(void) {
4673    environ = 0;
4674    return 0;
4675}
4676EOF
4677if compile_prog "" "" ; then
4678    has_environ=yes
4679fi
4680
4681########################################
4682# check if cpuid.h is usable.
4683
4684cat > $TMPC << EOF
4685#include <cpuid.h>
4686int main(void) {
4687    unsigned a, b, c, d;
4688    int max = __get_cpuid_max(0, 0);
4689
4690    if (max >= 1) {
4691        __cpuid(1, a, b, c, d);
4692    }
4693
4694    if (max >= 7) {
4695        __cpuid_count(7, 0, a, b, c, d);
4696    }
4697
4698    return 0;
4699}
4700EOF
4701if compile_prog "" "" ; then
4702    cpuid_h=yes
4703fi
4704
4705##########################################
4706# avx2 optimization requirement check
4707#
4708# There is no point enabling this if cpuid.h is not usable,
4709# since we won't be able to select the new routines.
4710
4711if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
4712  cat > $TMPC << EOF
4713#pragma GCC push_options
4714#pragma GCC target("avx2")
4715#include <cpuid.h>
4716#include <immintrin.h>
4717static int bar(void *a) {
4718    __m256i x = *(__m256i *)a;
4719    return _mm256_testz_si256(x, x);
4720}
4721int main(int argc, char *argv[]) { return bar(argv[0]); }
4722EOF
4723  if compile_object "" ; then
4724    avx2_opt="yes"
4725  else
4726    avx2_opt="no"
4727  fi
4728fi
4729
4730##########################################
4731# avx512f optimization requirement check
4732#
4733# There is no point enabling this if cpuid.h is not usable,
4734# since we won't be able to select the new routines.
4735# by default, it is turned off.
4736# if user explicitly want to enable it, check environment
4737
4738if test "$cpuid_h" = "yes" && test "$avx512f_opt" = "yes"; then
4739  cat > $TMPC << EOF
4740#pragma GCC push_options
4741#pragma GCC target("avx512f")
4742#include <cpuid.h>
4743#include <immintrin.h>
4744static int bar(void *a) {
4745    __m512i x = *(__m512i *)a;
4746    return _mm512_test_epi64_mask(x, x);
4747}
4748int main(int argc, char *argv[])
4749{
4750	return bar(argv[0]);
4751}
4752EOF
4753  if ! compile_object "" ; then
4754    avx512f_opt="no"
4755  fi
4756else
4757  avx512f_opt="no"
4758fi
4759
4760########################################
4761# check if __[u]int128_t is usable.
4762
4763int128=no
4764cat > $TMPC << EOF
4765__int128_t a;
4766__uint128_t b;
4767int main (void) {
4768  a = a + b;
4769  b = a * b;
4770  a = a * a;
4771  return 0;
4772}
4773EOF
4774if compile_prog "" "" ; then
4775    int128=yes
4776fi
4777
4778#########################################
4779# See if 128-bit atomic operations are supported.
4780
4781atomic128=no
4782if test "$int128" = "yes"; then
4783  cat > $TMPC << EOF
4784int main(void)
4785{
4786  unsigned __int128 x = 0, y = 0;
4787  y = __atomic_load(&x, 0);
4788  __atomic_store(&x, y, 0);
4789  __atomic_compare_exchange(&x, &y, x, 0, 0, 0);
4790  return 0;
4791}
4792EOF
4793  if compile_prog "" "" ; then
4794    atomic128=yes
4795  fi
4796fi
4797
4798cmpxchg128=no
4799if test "$int128" = yes && test "$atomic128" = no; then
4800  cat > $TMPC << EOF
4801int main(void)
4802{
4803  unsigned __int128 x = 0, y = 0;
4804  __sync_val_compare_and_swap_16(&x, y, x);
4805  return 0;
4806}
4807EOF
4808  if compile_prog "" "" ; then
4809    cmpxchg128=yes
4810  fi
4811fi
4812
4813#########################################
4814# See if 64-bit atomic operations are supported.
4815# Note that without __atomic builtins, we can only
4816# assume atomic loads/stores max at pointer size.
4817
4818cat > $TMPC << EOF
4819#include <stdint.h>
4820int main(void)
4821{
4822  uint64_t x = 0, y = 0;
4823#ifdef __ATOMIC_RELAXED
4824  y = __atomic_load_n(&x, __ATOMIC_RELAXED);
4825  __atomic_store_n(&x, y, __ATOMIC_RELAXED);
4826  __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
4827  __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
4828  __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
4829#else
4830  typedef char is_host64[sizeof(void *) >= sizeof(uint64_t) ? 1 : -1];
4831  __sync_lock_test_and_set(&x, y);
4832  __sync_val_compare_and_swap(&x, y, 0);
4833  __sync_fetch_and_add(&x, y);
4834#endif
4835  return 0;
4836}
4837EOF
4838if compile_prog "" "" ; then
4839  atomic64=yes
4840fi
4841
4842#########################################
4843# See if --dynamic-list is supported by the linker
4844ld_dynamic_list="no"
4845if test "$static" = "no" ; then
4846    cat > $TMPTXT <<EOF
4847{
4848  foo;
4849};
4850EOF
4851
4852    cat > $TMPC <<EOF
4853#include <stdio.h>
4854void foo(void);
4855
4856void foo(void)
4857{
4858  printf("foo\n");
4859}
4860
4861int main(void)
4862{
4863  foo();
4864  return 0;
4865}
4866EOF
4867
4868    if compile_prog "" "-Wl,--dynamic-list=$TMPTXT" ; then
4869        ld_dynamic_list="yes"
4870    fi
4871fi
4872
4873#########################################
4874# See if -exported_symbols_list is supported by the linker
4875
4876ld_exported_symbols_list="no"
4877if test "$static" = "no" ; then
4878    cat > $TMPTXT <<EOF
4879  _foo
4880EOF
4881
4882    if compile_prog "" "-Wl,-exported_symbols_list,$TMPTXT" ; then
4883        ld_exported_symbols_list="yes"
4884    fi
4885fi
4886
4887if  test "$plugins" = "yes" &&
4888    test "$ld_dynamic_list" = "no" &&
4889    test "$ld_exported_symbols_list" = "no" ; then
4890  error_exit \
4891      "Plugin support requires dynamic linking and specifying a set of symbols " \
4892      "that are exported to plugins. Unfortunately your linker doesn't " \
4893      "support the flag (--dynamic-list or -exported_symbols_list) used " \
4894      "for this purpose. You can't build with --static."
4895fi
4896
4897########################################
4898# check if getauxval is available.
4899
4900getauxval=no
4901cat > $TMPC << EOF
4902#include <sys/auxv.h>
4903int main(void) {
4904  return getauxval(AT_HWCAP) == 0;
4905}
4906EOF
4907if compile_prog "" "" ; then
4908    getauxval=yes
4909fi
4910
4911########################################
4912# check if ccache is interfering with
4913# semantic analysis of macros
4914
4915unset CCACHE_CPP2
4916ccache_cpp2=no
4917cat > $TMPC << EOF
4918static const int Z = 1;
4919#define fn() ({ Z; })
4920#define TAUT(X) ((X) == Z)
4921#define PAREN(X, Y) (X == Y)
4922#define ID(X) (X)
4923int main(int argc, char *argv[])
4924{
4925    int x = 0, y = 0;
4926    x = ID(x);
4927    x = fn();
4928    fn();
4929    if (PAREN(x, y)) return 0;
4930    if (TAUT(Z)) return 0;
4931    return 0;
4932}
4933EOF
4934
4935if ! compile_object "-Werror"; then
4936    ccache_cpp2=yes
4937fi
4938
4939#################################################
4940# clang does not support glibc + FORTIFY_SOURCE.
4941
4942if test "$fortify_source" != "no"; then
4943  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
4944    fortify_source="no";
4945  elif test -n "$cxx" && has $cxx &&
4946       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
4947    fortify_source="no";
4948  else
4949    fortify_source="yes"
4950  fi
4951fi
4952
4953###############################################
4954# Check if copy_file_range is provided by glibc
4955have_copy_file_range=no
4956cat > $TMPC << EOF
4957#include <unistd.h>
4958int main(void) {
4959  copy_file_range(0, NULL, 0, NULL, 0, 0);
4960  return 0;
4961}
4962EOF
4963if compile_prog "" "" ; then
4964    have_copy_file_range=yes
4965fi
4966
4967##########################################
4968# check if struct fsxattr is available via linux/fs.h
4969
4970have_fsxattr=no
4971cat > $TMPC << EOF
4972#include <linux/fs.h>
4973struct fsxattr foo;
4974int main(void) {
4975  return 0;
4976}
4977EOF
4978if compile_prog "" "" ; then
4979    have_fsxattr=yes
4980fi
4981
4982##########################################
4983# check for usable membarrier system call
4984if test "$membarrier" = "yes"; then
4985    have_membarrier=no
4986    if test "$mingw32" = "yes" ; then
4987        have_membarrier=yes
4988    elif test "$linux" = "yes" ; then
4989        cat > $TMPC << EOF
4990    #include <linux/membarrier.h>
4991    #include <sys/syscall.h>
4992    #include <unistd.h>
4993    #include <stdlib.h>
4994    int main(void) {
4995        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
4996        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
4997	exit(0);
4998    }
4999EOF
5000        if compile_prog "" "" ; then
5001            have_membarrier=yes
5002        fi
5003    fi
5004    if test "$have_membarrier" = "no"; then
5005      feature_not_found "membarrier" "membarrier system call not available"
5006    fi
5007else
5008    # Do not enable it by default even for Mingw32, because it doesn't
5009    # work on Wine.
5010    membarrier=no
5011fi
5012
5013##########################################
5014# check if rtnetlink.h exists and is useful
5015have_rtnetlink=no
5016cat > $TMPC << EOF
5017#include <linux/rtnetlink.h>
5018int main(void) {
5019  return IFLA_PROTO_DOWN;
5020}
5021EOF
5022if compile_prog "" "" ; then
5023    have_rtnetlink=yes
5024fi
5025
5026##########################################
5027# check for usable AF_VSOCK environment
5028have_af_vsock=no
5029cat > $TMPC << EOF
5030#include <errno.h>
5031#include <sys/types.h>
5032#include <sys/socket.h>
5033#if !defined(AF_VSOCK)
5034# error missing AF_VSOCK flag
5035#endif
5036#include <linux/vm_sockets.h>
5037int main(void) {
5038    int sock, ret;
5039    struct sockaddr_vm svm;
5040    socklen_t len = sizeof(svm);
5041    sock = socket(AF_VSOCK, SOCK_STREAM, 0);
5042    ret = getpeername(sock, (struct sockaddr *)&svm, &len);
5043    if ((ret == -1) && (errno == ENOTCONN)) {
5044        return 0;
5045    }
5046    return -1;
5047}
5048EOF
5049if compile_prog "" "" ; then
5050    have_af_vsock=yes
5051fi
5052
5053##########################################
5054# check for usable AF_ALG environment
5055have_afalg=no
5056cat > $TMPC << EOF
5057#include <errno.h>
5058#include <sys/types.h>
5059#include <sys/socket.h>
5060#include <linux/if_alg.h>
5061int main(void) {
5062    int sock;
5063    sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
5064    return sock;
5065}
5066EOF
5067if compile_prog "" "" ; then
5068    have_afalg=yes
5069fi
5070if test "$crypto_afalg" = "yes"
5071then
5072    if test "$have_afalg" != "yes"
5073    then
5074	error_exit "AF_ALG requested but could not be detected"
5075    fi
5076fi
5077
5078
5079#################################################
5080# check for sysmacros.h
5081
5082have_sysmacros=no
5083cat > $TMPC << EOF
5084#include <sys/sysmacros.h>
5085int main(void) {
5086    return makedev(0, 0);
5087}
5088EOF
5089if compile_prog "" "" ; then
5090    have_sysmacros=yes
5091fi
5092
5093##########################################
5094# check for _Static_assert()
5095
5096have_static_assert=no
5097cat > $TMPC << EOF
5098_Static_assert(1, "success");
5099int main(void) {
5100    return 0;
5101}
5102EOF
5103if compile_prog "" "" ; then
5104    have_static_assert=yes
5105fi
5106
5107##########################################
5108# check for utmpx.h, it is missing e.g. on OpenBSD
5109
5110have_utmpx=no
5111cat > $TMPC << EOF
5112#include <utmpx.h>
5113struct utmpx user_info;
5114int main(void) {
5115    return 0;
5116}
5117EOF
5118if compile_prog "" "" ; then
5119    have_utmpx=yes
5120fi
5121
5122##########################################
5123# check for getrandom()
5124
5125have_getrandom=no
5126cat > $TMPC << EOF
5127#include <sys/random.h>
5128int main(void) {
5129    return getrandom(0, 0, GRND_NONBLOCK);
5130}
5131EOF
5132if compile_prog "" "" ; then
5133    have_getrandom=yes
5134fi
5135
5136##########################################
5137# checks for sanitizers
5138
5139have_asan=no
5140have_ubsan=no
5141have_asan_iface_h=no
5142have_asan_iface_fiber=no
5143
5144if test "$sanitizers" = "yes" ; then
5145  write_c_skeleton
5146  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
5147      have_asan=yes
5148  fi
5149
5150  # we could use a simple skeleton for flags checks, but this also
5151  # detect the static linking issue of ubsan, see also:
5152  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
5153  cat > $TMPC << EOF
5154#include <stdlib.h>
5155int main(void) {
5156    void *tmp = malloc(10);
5157    if (tmp != NULL) {
5158        return *(int *)(tmp + 2);
5159    }
5160    return 1;
5161}
5162EOF
5163  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
5164      have_ubsan=yes
5165  fi
5166
5167  if check_include "sanitizer/asan_interface.h" ; then
5168      have_asan_iface_h=yes
5169  fi
5170
5171  cat > $TMPC << EOF
5172#include <sanitizer/asan_interface.h>
5173int main(void) {
5174  __sanitizer_start_switch_fiber(0, 0, 0);
5175  return 0;
5176}
5177EOF
5178  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
5179      have_asan_iface_fiber=yes
5180  fi
5181fi
5182
5183##########################################
5184# checks for fuzzer
5185if test "$fuzzing" = "yes" && test -z "${LIB_FUZZING_ENGINE+xxx}"; then
5186  write_c_fuzzer_skeleton
5187  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=fuzzer" ""; then
5188    have_fuzzer=yes
5189  else
5190    error_exit "Your compiler doesn't support -fsanitize=fuzzer"
5191    exit 1
5192  fi
5193fi
5194
5195# Thread sanitizer is, for now, much noisier than the other sanitizers;
5196# keep it separate until that is not the case.
5197if test "$tsan" = "yes" && test "$sanitizers" = "yes"; then
5198  error_exit "TSAN is not supported with other sanitiziers."
5199fi
5200have_tsan=no
5201have_tsan_iface_fiber=no
5202if test "$tsan" = "yes" ; then
5203  write_c_skeleton
5204  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
5205      have_tsan=yes
5206  fi
5207  cat > $TMPC << EOF
5208#include <sanitizer/tsan_interface.h>
5209int main(void) {
5210  __tsan_create_fiber(0);
5211  return 0;
5212}
5213EOF
5214  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
5215      have_tsan_iface_fiber=yes
5216  fi
5217fi
5218
5219##########################################
5220# check for libpmem
5221
5222if test "$libpmem" != "no"; then
5223	if $pkg_config --exists "libpmem"; then
5224		libpmem="yes"
5225		libpmem_libs=$($pkg_config --libs libpmem)
5226		libpmem_cflags=$($pkg_config --cflags libpmem)
5227	else
5228		if test "$libpmem" = "yes" ; then
5229			feature_not_found "libpmem" "Install nvml or pmdk"
5230		fi
5231		libpmem="no"
5232	fi
5233fi
5234
5235##########################################
5236# check for libdaxctl
5237
5238if test "$libdaxctl" != "no"; then
5239	if $pkg_config --atleast-version=57 "libdaxctl"; then
5240		libdaxctl="yes"
5241		libdaxctl_libs=$($pkg_config --libs libdaxctl)
5242		libdaxctl_cflags=$($pkg_config --cflags libdaxctl)
5243	else
5244		if test "$libdaxctl" = "yes" ; then
5245			feature_not_found "libdaxctl" "Install libdaxctl"
5246		fi
5247		libdaxctl="no"
5248	fi
5249fi
5250
5251##########################################
5252# check for slirp
5253
5254case "$slirp" in
5255  auto | enabled | internal)
5256    # Simpler to always update submodule, even if not needed.
5257    git_submodules="${git_submodules} slirp"
5258    ;;
5259esac
5260
5261# Check for slirp smbd dupport
5262: ${smbd=${SMBD-/usr/sbin/smbd}}
5263if test "$slirp_smbd" != "no" ; then
5264  if test "$mingw32" = "yes" ; then
5265    if test "$slirp_smbd" = "yes" ; then
5266      error_exit "Host smbd not supported on this platform."
5267    fi
5268    slirp_smbd=no
5269  else
5270    slirp_smbd=yes
5271  fi
5272fi
5273
5274##########################################
5275# check for usable __NR_keyctl syscall
5276
5277if test "$linux" = "yes" ; then
5278
5279    have_keyring=no
5280    cat > $TMPC << EOF
5281#include <errno.h>
5282#include <asm/unistd.h>
5283#include <linux/keyctl.h>
5284#include <unistd.h>
5285int main(void) {
5286    return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
5287}
5288EOF
5289    if compile_prog "" "" ; then
5290        have_keyring=yes
5291    fi
5292fi
5293if test "$secret_keyring" != "no"
5294then
5295    if test "$have_keyring" = "yes"
5296    then
5297	secret_keyring=yes
5298    else
5299	if test "$secret_keyring" = "yes"
5300	then
5301	    error_exit "syscall __NR_keyctl requested, \
5302but not implemented on your system"
5303	else
5304	    secret_keyring=no
5305	fi
5306    fi
5307fi
5308
5309##########################################
5310# End of CC checks
5311# After here, no more $cc or $ld runs
5312
5313write_c_skeleton
5314
5315if test "$gcov" = "yes" ; then
5316  :
5317elif test "$fortify_source" = "yes" ; then
5318  QEMU_CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $QEMU_CFLAGS"
5319  debug=no
5320fi
5321
5322case "$ARCH" in
5323alpha)
5324  # Ensure there's only a single GP
5325  QEMU_CFLAGS="-msmall-data $QEMU_CFLAGS"
5326;;
5327esac
5328
5329if test "$gprof" = "yes" ; then
5330  QEMU_CFLAGS="-p $QEMU_CFLAGS"
5331  QEMU_LDFLAGS="-p $QEMU_LDFLAGS"
5332fi
5333
5334if test "$have_asan" = "yes"; then
5335  QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
5336  QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
5337  if test "$have_asan_iface_h" = "no" ; then
5338      echo "ASAN build enabled, but ASAN header missing." \
5339           "Without code annotation, the report may be inferior."
5340  elif test "$have_asan_iface_fiber" = "no" ; then
5341      echo "ASAN build enabled, but ASAN header is too old." \
5342           "Without code annotation, the report may be inferior."
5343  fi
5344fi
5345if test "$have_tsan" = "yes" ; then
5346  if test "$have_tsan_iface_fiber" = "yes" ; then
5347    QEMU_CFLAGS="-fsanitize=thread $QEMU_CFLAGS"
5348    QEMU_LDFLAGS="-fsanitize=thread $QEMU_LDFLAGS"
5349  else
5350    error_exit "Cannot enable TSAN due to missing fiber annotation interface."
5351  fi
5352elif test "$tsan" = "yes" ; then
5353  error_exit "Cannot enable TSAN due to missing sanitize thread interface."
5354fi
5355if test "$have_ubsan" = "yes"; then
5356  QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS"
5357  QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
5358fi
5359
5360##########################################
5361
5362# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
5363if test "$solaris" = "no" && test "$tsan" = "no"; then
5364    if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
5365        QEMU_LDFLAGS="-Wl,--warn-common $QEMU_LDFLAGS"
5366    fi
5367fi
5368
5369# Use ASLR, no-SEH and DEP if available
5370if test "$mingw32" = "yes" ; then
5371    flags="--no-seh --nxcompat"
5372
5373    # Disable ASLR for debug builds to allow debugging with gdb
5374    if test "$debug" = "no" ; then
5375        flags="--dynamicbase $flags"
5376    fi
5377
5378    for flag in $flags; do
5379        if ld_has $flag ; then
5380            QEMU_LDFLAGS="-Wl,$flag $QEMU_LDFLAGS"
5381        fi
5382    done
5383fi
5384
5385# We can only support ivshmem if we have eventfd
5386if [ "$eventfd" = "yes" ]; then
5387  ivshmem=yes
5388fi
5389
5390# Probe for guest agent support/options
5391
5392if [ "$guest_agent" != "no" ]; then
5393  if [ "$softmmu" = no -a "$want_tools" = no ] ; then
5394      guest_agent=no
5395  elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
5396      guest_agent=yes
5397  elif [ "$guest_agent" != yes ]; then
5398      guest_agent=no
5399  else
5400      error_exit "Guest agent is not supported on this platform"
5401  fi
5402fi
5403
5404# Guest agent Windows MSI package
5405
5406if test "$QEMU_GA_MANUFACTURER" = ""; then
5407  QEMU_GA_MANUFACTURER=QEMU
5408fi
5409if test "$QEMU_GA_DISTRO" = ""; then
5410  QEMU_GA_DISTRO=Linux
5411fi
5412if test "$QEMU_GA_VERSION" = ""; then
5413    QEMU_GA_VERSION=$(cat $source_path/VERSION)
5414fi
5415
5416QEMU_GA_MSI_MINGW_DLL_PATH="$($pkg_config --variable=prefix glib-2.0)/bin"
5417
5418# Mac OS X ships with a broken assembler
5419roms=
5420if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
5421        test "$targetos" != "Darwin" && test "$targetos" != "SunOS" && \
5422        test "$targetos" != "Haiku" && test "$softmmu" = yes ; then
5423    # Different host OS linkers have different ideas about the name of the ELF
5424    # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
5425    # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
5426    for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
5427        if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
5428            ld_i386_emulation="$emu"
5429            roms="optionrom"
5430            break
5431        fi
5432    done
5433fi
5434
5435# Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
5436# or -march=z10 (which is the lowest architecture level that Clang supports)
5437if test "$cpu" = "s390x" ; then
5438  write_c_skeleton
5439  compile_prog "-march=z900" ""
5440  has_z900=$?
5441  if [ $has_z900 = 0 ] || compile_prog "-march=z10" ""; then
5442    if [ $has_z900 != 0 ]; then
5443      echo "WARNING: Your compiler does not support the z900!"
5444      echo "         The s390-ccw bios will only work with guest CPUs >= z10."
5445    fi
5446    roms="$roms s390-ccw"
5447    # SLOF is required for building the s390-ccw firmware on s390x,
5448    # since it is using the libnet code from SLOF for network booting.
5449    git_submodules="${git_submodules} roms/SLOF"
5450  fi
5451fi
5452
5453# Check that the C++ compiler exists and works with the C compiler.
5454# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
5455if has $cxx; then
5456    cat > $TMPC <<EOF
5457int c_function(void);
5458int main(void) { return c_function(); }
5459EOF
5460
5461    compile_object
5462
5463    cat > $TMPCXX <<EOF
5464extern "C" {
5465   int c_function(void);
5466}
5467int c_function(void) { return 42; }
5468EOF
5469
5470    update_cxxflags
5471
5472    if do_cxx $CXXFLAGS $CONFIGURE_CXXFLAGS $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
5473        # C++ compiler $cxx works ok with C compiler $cc
5474        :
5475    else
5476        echo "C++ compiler $cxx does not work with C compiler $cc"
5477        echo "Disabling C++ specific optional code"
5478        cxx=
5479    fi
5480else
5481    echo "No C++ compiler available; disabling C++ specific optional code"
5482    cxx=
5483fi
5484
5485if !(GIT="$git" "$source_path/scripts/git-submodule.sh" "$git_submodules_action" "$git_submodules"); then
5486    exit 1
5487fi
5488
5489config_host_mak="config-host.mak"
5490
5491echo "# Automatically generated by configure - do not modify" > $config_host_mak
5492echo >> $config_host_mak
5493
5494echo all: >> $config_host_mak
5495echo "GIT=$git" >> $config_host_mak
5496echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
5497echo "GIT_SUBMODULES_ACTION=$git_submodules_action" >> $config_host_mak
5498
5499echo "ARCH=$ARCH" >> $config_host_mak
5500
5501if test "$debug_tcg" = "yes" ; then
5502  echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
5503fi
5504if test "$strip_opt" = "yes" ; then
5505  echo "STRIP=${strip}" >> $config_host_mak
5506fi
5507if test "$bigendian" = "yes" ; then
5508  echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
5509fi
5510if test "$mingw32" = "yes" ; then
5511  echo "CONFIG_WIN32=y" >> $config_host_mak
5512  if test "$guest_agent_with_vss" = "yes" ; then
5513    echo "CONFIG_QGA_VSS=y" >> $config_host_mak
5514    echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
5515    echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
5516  fi
5517  if test "$guest_agent_ntddscsi" = "yes" ; then
5518    echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
5519  fi
5520  echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
5521  echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
5522  echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
5523  echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
5524else
5525  echo "CONFIG_POSIX=y" >> $config_host_mak
5526fi
5527
5528if test "$linux" = "yes" ; then
5529  echo "CONFIG_LINUX=y" >> $config_host_mak
5530fi
5531
5532if test "$darwin" = "yes" ; then
5533  echo "CONFIG_DARWIN=y" >> $config_host_mak
5534fi
5535
5536if test "$solaris" = "yes" ; then
5537  echo "CONFIG_SOLARIS=y" >> $config_host_mak
5538fi
5539if test "$haiku" = "yes" ; then
5540  echo "CONFIG_HAIKU=y" >> $config_host_mak
5541fi
5542if test "$static" = "yes" ; then
5543  echo "CONFIG_STATIC=y" >> $config_host_mak
5544fi
5545if test "$profiler" = "yes" ; then
5546  echo "CONFIG_PROFILER=y" >> $config_host_mak
5547fi
5548if test "$want_tools" = "yes" ; then
5549  echo "CONFIG_TOOLS=y" >> $config_host_mak
5550fi
5551if test "$guest_agent" = "yes" ; then
5552  echo "CONFIG_GUEST_AGENT=y" >> $config_host_mak
5553fi
5554if test "$slirp_smbd" = "yes" ; then
5555  echo "CONFIG_SLIRP_SMBD=y" >> $config_host_mak
5556  echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
5557fi
5558if test "$vde" = "yes" ; then
5559  echo "CONFIG_VDE=y" >> $config_host_mak
5560  echo "VDE_LIBS=$vde_libs" >> $config_host_mak
5561fi
5562if test "$netmap" = "yes" ; then
5563  echo "CONFIG_NETMAP=y" >> $config_host_mak
5564fi
5565if test "$l2tpv3" = "yes" ; then
5566  echo "CONFIG_L2TPV3=y" >> $config_host_mak
5567fi
5568if test "$gprof" = "yes" ; then
5569  echo "CONFIG_GPROF=y" >> $config_host_mak
5570fi
5571echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
5572for drv in $audio_drv_list; do
5573    def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
5574    echo "$def=y" >> $config_host_mak
5575done
5576if test "$alsa" = "yes" ; then
5577    echo "CONFIG_ALSA=y" >> $config_host_mak
5578fi
5579echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak
5580echo "ALSA_CFLAGS=$alsa_cflags" >> $config_host_mak
5581if test "$libpulse" = "yes" ; then
5582    echo "CONFIG_LIBPULSE=y" >> $config_host_mak
5583fi
5584echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
5585echo "PULSE_CFLAGS=$pulse_cflags" >> $config_host_mak
5586echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak
5587echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak
5588echo "OSS_LIBS=$oss_libs" >> $config_host_mak
5589if test "$libjack" = "yes" ; then
5590    echo "CONFIG_LIBJACK=y" >> $config_host_mak
5591fi
5592echo "JACK_LIBS=$jack_libs" >> $config_host_mak
5593if test "$audio_win_int" = "yes" ; then
5594  echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
5595fi
5596echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
5597echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
5598if test "$xfs" = "yes" ; then
5599  echo "CONFIG_XFS=y" >> $config_host_mak
5600fi
5601qemu_version=$(head $source_path/VERSION)
5602echo "PKGVERSION=$pkgversion" >>$config_host_mak
5603echo "SRC_PATH=$source_path" >> $config_host_mak
5604echo "TARGET_DIRS=$target_list" >> $config_host_mak
5605if test "$modules" = "yes"; then
5606  # $shacmd can generate a hash started with digit, which the compiler doesn't
5607  # like as an symbol. So prefix it with an underscore
5608  echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
5609  echo "CONFIG_MODULES=y" >> $config_host_mak
5610fi
5611if test "$module_upgrades" = "yes"; then
5612  echo "CONFIG_MODULE_UPGRADES=y" >> $config_host_mak
5613fi
5614if test "$pipe2" = "yes" ; then
5615  echo "CONFIG_PIPE2=y" >> $config_host_mak
5616fi
5617if test "$accept4" = "yes" ; then
5618  echo "CONFIG_ACCEPT4=y" >> $config_host_mak
5619fi
5620if test "$splice" = "yes" ; then
5621  echo "CONFIG_SPLICE=y" >> $config_host_mak
5622fi
5623if test "$eventfd" = "yes" ; then
5624  echo "CONFIG_EVENTFD=y" >> $config_host_mak
5625fi
5626if test "$memfd" = "yes" ; then
5627  echo "CONFIG_MEMFD=y" >> $config_host_mak
5628fi
5629if test "$have_usbfs" = "yes" ; then
5630  echo "CONFIG_USBFS=y" >> $config_host_mak
5631fi
5632if test "$fallocate" = "yes" ; then
5633  echo "CONFIG_FALLOCATE=y" >> $config_host_mak
5634fi
5635if test "$fallocate_punch_hole" = "yes" ; then
5636  echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
5637fi
5638if test "$fallocate_zero_range" = "yes" ; then
5639  echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak
5640fi
5641if test "$posix_fallocate" = "yes" ; then
5642  echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
5643fi
5644if test "$sync_file_range" = "yes" ; then
5645  echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
5646fi
5647if test "$fiemap" = "yes" ; then
5648  echo "CONFIG_FIEMAP=y" >> $config_host_mak
5649fi
5650if test "$dup3" = "yes" ; then
5651  echo "CONFIG_DUP3=y" >> $config_host_mak
5652fi
5653if test "$ppoll" = "yes" ; then
5654  echo "CONFIG_PPOLL=y" >> $config_host_mak
5655fi
5656if test "$prctl_pr_set_timerslack" = "yes" ; then
5657  echo "CONFIG_PRCTL_PR_SET_TIMERSLACK=y" >> $config_host_mak
5658fi
5659if test "$epoll" = "yes" ; then
5660  echo "CONFIG_EPOLL=y" >> $config_host_mak
5661fi
5662if test "$epoll_create1" = "yes" ; then
5663  echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
5664fi
5665if test "$sendfile" = "yes" ; then
5666  echo "CONFIG_SENDFILE=y" >> $config_host_mak
5667fi
5668if test "$timerfd" = "yes" ; then
5669  echo "CONFIG_TIMERFD=y" >> $config_host_mak
5670fi
5671if test "$setns" = "yes" ; then
5672  echo "CONFIG_SETNS=y" >> $config_host_mak
5673fi
5674if test "$clock_adjtime" = "yes" ; then
5675  echo "CONFIG_CLOCK_ADJTIME=y" >> $config_host_mak
5676fi
5677if test "$syncfs" = "yes" ; then
5678  echo "CONFIG_SYNCFS=y" >> $config_host_mak
5679fi
5680if test "$inotify" = "yes" ; then
5681  echo "CONFIG_INOTIFY=y" >> $config_host_mak
5682fi
5683if test "$inotify1" = "yes" ; then
5684  echo "CONFIG_INOTIFY1=y" >> $config_host_mak
5685fi
5686if test "$sem_timedwait" = "yes" ; then
5687  echo "CONFIG_SEM_TIMEDWAIT=y" >> $config_host_mak
5688fi
5689if test "$strchrnul" = "yes" ; then
5690  echo "HAVE_STRCHRNUL=y" >> $config_host_mak
5691fi
5692if test "$st_atim" = "yes" ; then
5693  echo "HAVE_STRUCT_STAT_ST_ATIM=y" >> $config_host_mak
5694fi
5695if test "$byteswap_h" = "yes" ; then
5696  echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
5697fi
5698if test "$bswap_h" = "yes" ; then
5699  echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
5700fi
5701if test "$gio" = "yes" ; then
5702    echo "CONFIG_GIO=y" >> $config_host_mak
5703    echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
5704    echo "GIO_LIBS=$gio_libs" >> $config_host_mak
5705fi
5706if test "$gdbus_codegen" != "" ; then
5707    echo "GDBUS_CODEGEN=$gdbus_codegen" >> $config_host_mak
5708fi
5709echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
5710if test "$gnutls" = "yes" ; then
5711  echo "CONFIG_GNUTLS=y" >> $config_host_mak
5712  echo "GNUTLS_CFLAGS=$gnutls_cflags" >> $config_host_mak
5713  echo "GNUTLS_LIBS=$gnutls_libs" >> $config_host_mak
5714fi
5715if test "$gcrypt" = "yes" ; then
5716  echo "CONFIG_GCRYPT=y" >> $config_host_mak
5717  echo "GCRYPT_CFLAGS=$gcrypt_cflags" >> $config_host_mak
5718  echo "GCRYPT_LIBS=$gcrypt_libs" >> $config_host_mak
5719fi
5720if test "$nettle" = "yes" ; then
5721  echo "CONFIG_NETTLE=y" >> $config_host_mak
5722  echo "NETTLE_CFLAGS=$nettle_cflags" >> $config_host_mak
5723  echo "NETTLE_LIBS=$nettle_libs" >> $config_host_mak
5724fi
5725if test "$qemu_private_xts" = "yes" ; then
5726  echo "CONFIG_QEMU_PRIVATE_XTS=y" >> $config_host_mak
5727fi
5728if test "$tasn1" = "yes" ; then
5729  echo "CONFIG_TASN1=y" >> $config_host_mak
5730fi
5731if test "$auth_pam" = "yes" ; then
5732    echo "CONFIG_AUTH_PAM=y" >> $config_host_mak
5733fi
5734if test "$have_broken_size_max" = "yes" ; then
5735    echo "HAVE_BROKEN_SIZE_MAX=y" >> $config_host_mak
5736fi
5737if test "$have_openpty" = "yes" ; then
5738    echo "HAVE_OPENPTY=y" >> $config_host_mak
5739fi
5740
5741# Work around a system header bug with some kernel/XFS header
5742# versions where they both try to define 'struct fsxattr':
5743# xfs headers will not try to redefine structs from linux headers
5744# if this macro is set.
5745if test "$have_fsxattr" = "yes" ; then
5746    echo "HAVE_FSXATTR=y" >> $config_host_mak
5747fi
5748if test "$have_copy_file_range" = "yes" ; then
5749    echo "HAVE_COPY_FILE_RANGE=y" >> $config_host_mak
5750fi
5751if test "$vte" = "yes" ; then
5752  echo "CONFIG_VTE=y" >> $config_host_mak
5753  echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak
5754  echo "VTE_LIBS=$vte_libs" >> $config_host_mak
5755fi
5756if test "$virglrenderer" = "yes" ; then
5757  echo "CONFIG_VIRGL=y" >> $config_host_mak
5758  echo "VIRGL_CFLAGS=$virgl_cflags" >> $config_host_mak
5759  echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak
5760fi
5761if test "$xen" = "enabled" ; then
5762  echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
5763  echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
5764  echo "XEN_CFLAGS=$xen_cflags" >> $config_host_mak
5765  echo "XEN_LIBS=$xen_libs" >> $config_host_mak
5766fi
5767if test "$linux_aio" = "yes" ; then
5768  echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
5769fi
5770if test "$linux_io_uring" = "yes" ; then
5771  echo "CONFIG_LINUX_IO_URING=y" >> $config_host_mak
5772  echo "LINUX_IO_URING_CFLAGS=$linux_io_uring_cflags" >> $config_host_mak
5773  echo "LINUX_IO_URING_LIBS=$linux_io_uring_libs" >> $config_host_mak
5774fi
5775if test "$vhost_scsi" = "yes" ; then
5776  echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
5777fi
5778if test "$vhost_net" = "yes" ; then
5779  echo "CONFIG_VHOST_NET=y" >> $config_host_mak
5780fi
5781if test "$vhost_net_user" = "yes" ; then
5782  echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
5783fi
5784if test "$vhost_net_vdpa" = "yes" ; then
5785  echo "CONFIG_VHOST_NET_VDPA=y" >> $config_host_mak
5786fi
5787if test "$vhost_crypto" = "yes" ; then
5788  echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
5789fi
5790if test "$vhost_vsock" = "yes" ; then
5791  echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
5792  if test "$vhost_user" = "yes" ; then
5793    echo "CONFIG_VHOST_USER_VSOCK=y" >> $config_host_mak
5794  fi
5795fi
5796if test "$vhost_kernel" = "yes" ; then
5797  echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
5798fi
5799if test "$vhost_user" = "yes" ; then
5800  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
5801fi
5802if test "$vhost_vdpa" = "yes" ; then
5803  echo "CONFIG_VHOST_VDPA=y" >> $config_host_mak
5804fi
5805if test "$vhost_user_fs" = "yes" ; then
5806  echo "CONFIG_VHOST_USER_FS=y" >> $config_host_mak
5807fi
5808if test "$iovec" = "yes" ; then
5809  echo "CONFIG_IOVEC=y" >> $config_host_mak
5810fi
5811if test "$membarrier" = "yes" ; then
5812  echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
5813fi
5814if test "$signalfd" = "yes" ; then
5815  echo "CONFIG_SIGNALFD=y" >> $config_host_mak
5816fi
5817if test "$optreset" = "yes" ; then
5818  echo "HAVE_OPTRESET=y" >> $config_host_mak
5819fi
5820if test "$fdatasync" = "yes" ; then
5821  echo "CONFIG_FDATASYNC=y" >> $config_host_mak
5822fi
5823if test "$madvise" = "yes" ; then
5824  echo "CONFIG_MADVISE=y" >> $config_host_mak
5825fi
5826if test "$posix_madvise" = "yes" ; then
5827  echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak
5828fi
5829if test "$posix_memalign" = "yes" ; then
5830  echo "CONFIG_POSIX_MEMALIGN=y" >> $config_host_mak
5831fi
5832
5833if test "$spice_protocol" = "yes" ; then
5834  echo "CONFIG_SPICE_PROTOCOL=y" >> $config_host_mak
5835  echo "SPICE_PROTOCOL_CFLAGS=$spice_protocol_cflags" >> $config_host_mak
5836fi
5837if test "$spice" = "yes" ; then
5838  echo "CONFIG_SPICE=y" >> $config_host_mak
5839  echo "SPICE_CFLAGS=$spice_cflags $spice_protocol_cflags" >> $config_host_mak
5840  echo "SPICE_LIBS=$spice_libs" >> $config_host_mak
5841fi
5842
5843if test "$smartcard" = "yes" ; then
5844  echo "CONFIG_SMARTCARD=y" >> $config_host_mak
5845  echo "SMARTCARD_CFLAGS=$libcacard_cflags" >> $config_host_mak
5846  echo "SMARTCARD_LIBS=$libcacard_libs" >> $config_host_mak
5847fi
5848
5849if test "$libusb" = "yes" ; then
5850  echo "CONFIG_USB_LIBUSB=y" >> $config_host_mak
5851  echo "LIBUSB_CFLAGS=$libusb_cflags" >> $config_host_mak
5852  echo "LIBUSB_LIBS=$libusb_libs" >> $config_host_mak
5853fi
5854
5855if test "$usb_redir" = "yes" ; then
5856  echo "CONFIG_USB_REDIR=y" >> $config_host_mak
5857  echo "USB_REDIR_CFLAGS=$usb_redir_cflags" >> $config_host_mak
5858  echo "USB_REDIR_LIBS=$usb_redir_libs" >> $config_host_mak
5859fi
5860
5861if test "$opengl" = "yes" ; then
5862  echo "CONFIG_OPENGL=y" >> $config_host_mak
5863  echo "OPENGL_CFLAGS=$opengl_cflags" >> $config_host_mak
5864  echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
5865fi
5866
5867if test "$gbm" = "yes" ; then
5868    echo "CONFIG_GBM=y" >> $config_host_mak
5869    echo "GBM_LIBS=$gbm_libs" >> $config_host_mak
5870    echo "GBM_CFLAGS=$gbm_cflags" >> $config_host_mak
5871fi
5872
5873
5874if test "$avx2_opt" = "yes" ; then
5875  echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
5876fi
5877
5878if test "$avx512f_opt" = "yes" ; then
5879  echo "CONFIG_AVX512F_OPT=y" >> $config_host_mak
5880fi
5881
5882# XXX: suppress that
5883if [ "$bsd" = "yes" ] ; then
5884  echo "CONFIG_BSD=y" >> $config_host_mak
5885fi
5886
5887if test "$qom_cast_debug" = "yes" ; then
5888  echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
5889fi
5890
5891echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
5892if test "$coroutine_pool" = "yes" ; then
5893  echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
5894else
5895  echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
5896fi
5897
5898if test "$debug_stack_usage" = "yes" ; then
5899  echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
5900fi
5901
5902if test "$crypto_afalg" = "yes" ; then
5903  echo "CONFIG_AF_ALG=y" >> $config_host_mak
5904fi
5905
5906if test "$open_by_handle_at" = "yes" ; then
5907  echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
5908fi
5909
5910if test "$linux_magic_h" = "yes" ; then
5911  echo "CONFIG_LINUX_MAGIC_H=y" >> $config_host_mak
5912fi
5913
5914if test "$valgrind_h" = "yes" ; then
5915  echo "CONFIG_VALGRIND_H=y" >> $config_host_mak
5916fi
5917
5918if test "$have_asan_iface_fiber" = "yes" ; then
5919    echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
5920fi
5921
5922if test "$have_tsan" = "yes" && test "$have_tsan_iface_fiber" = "yes" ; then
5923    echo "CONFIG_TSAN=y" >> $config_host_mak
5924fi
5925
5926if test "$has_environ" = "yes" ; then
5927  echo "CONFIG_HAS_ENVIRON=y" >> $config_host_mak
5928fi
5929
5930if test "$cpuid_h" = "yes" ; then
5931  echo "CONFIG_CPUID_H=y" >> $config_host_mak
5932fi
5933
5934if test "$int128" = "yes" ; then
5935  echo "CONFIG_INT128=y" >> $config_host_mak
5936fi
5937
5938if test "$atomic128" = "yes" ; then
5939  echo "CONFIG_ATOMIC128=y" >> $config_host_mak
5940fi
5941
5942if test "$cmpxchg128" = "yes" ; then
5943  echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
5944fi
5945
5946if test "$atomic64" = "yes" ; then
5947  echo "CONFIG_ATOMIC64=y" >> $config_host_mak
5948fi
5949
5950if test "$getauxval" = "yes" ; then
5951  echo "CONFIG_GETAUXVAL=y" >> $config_host_mak
5952fi
5953
5954if test "$libssh" = "yes" ; then
5955  echo "CONFIG_LIBSSH=y" >> $config_host_mak
5956  echo "LIBSSH_CFLAGS=$libssh_cflags" >> $config_host_mak
5957  echo "LIBSSH_LIBS=$libssh_libs" >> $config_host_mak
5958fi
5959
5960if test "$live_block_migration" = "yes" ; then
5961  echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
5962fi
5963
5964if test "$tpm" = "yes"; then
5965  echo 'CONFIG_TPM=y' >> $config_host_mak
5966fi
5967
5968echo "TRACE_BACKENDS=$trace_backends" >> $config_host_mak
5969if have_backend "nop"; then
5970  echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
5971fi
5972if have_backend "simple"; then
5973  echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
5974  # Set the appropriate trace file.
5975  trace_file="\"$trace_file-\" FMT_pid"
5976fi
5977if have_backend "log"; then
5978  echo "CONFIG_TRACE_LOG=y" >> $config_host_mak
5979fi
5980if have_backend "ust"; then
5981  echo "CONFIG_TRACE_UST=y" >> $config_host_mak
5982  echo "LTTNG_UST_LIBS=$lttng_ust_libs" >> $config_host_mak
5983  echo "URCU_BP_LIBS=$urcu_bp_libs" >> $config_host_mak
5984fi
5985if have_backend "dtrace"; then
5986  echo "CONFIG_TRACE_DTRACE=y" >> $config_host_mak
5987  if test "$trace_backend_stap" = "yes" ; then
5988    echo "CONFIG_TRACE_SYSTEMTAP=y" >> $config_host_mak
5989  fi
5990fi
5991if have_backend "ftrace"; then
5992  if test "$linux" = "yes" ; then
5993    echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak
5994  else
5995    feature_not_found "ftrace(trace backend)" "ftrace requires Linux"
5996  fi
5997fi
5998if have_backend "syslog"; then
5999  if test "$posix_syslog" = "yes" ; then
6000    echo "CONFIG_TRACE_SYSLOG=y" >> $config_host_mak
6001  else
6002    feature_not_found "syslog(trace backend)" "syslog not available"
6003  fi
6004fi
6005echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
6006
6007if test "$rdma" = "yes" ; then
6008  echo "CONFIG_RDMA=y" >> $config_host_mak
6009  echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
6010fi
6011
6012if test "$pvrdma" = "yes" ; then
6013  echo "CONFIG_PVRDMA=y" >> $config_host_mak
6014fi
6015
6016if test "$have_rtnetlink" = "yes" ; then
6017  echo "CONFIG_RTNETLINK=y" >> $config_host_mak
6018fi
6019
6020if test "$libxml2" = "yes" ; then
6021  echo "CONFIG_LIBXML2=y" >> $config_host_mak
6022  echo "LIBXML2_CFLAGS=$libxml2_cflags" >> $config_host_mak
6023  echo "LIBXML2_LIBS=$libxml2_libs" >> $config_host_mak
6024fi
6025
6026if test "$replication" = "yes" ; then
6027  echo "CONFIG_REPLICATION=y" >> $config_host_mak
6028fi
6029
6030if test "$have_af_vsock" = "yes" ; then
6031  echo "CONFIG_AF_VSOCK=y" >> $config_host_mak
6032fi
6033
6034if test "$have_sysmacros" = "yes" ; then
6035  echo "CONFIG_SYSMACROS=y" >> $config_host_mak
6036fi
6037
6038if test "$have_static_assert" = "yes" ; then
6039  echo "CONFIG_STATIC_ASSERT=y" >> $config_host_mak
6040fi
6041
6042if test "$have_utmpx" = "yes" ; then
6043  echo "HAVE_UTMPX=y" >> $config_host_mak
6044fi
6045if test "$have_getrandom" = "yes" ; then
6046  echo "CONFIG_GETRANDOM=y" >> $config_host_mak
6047fi
6048if test "$ivshmem" = "yes" ; then
6049  echo "CONFIG_IVSHMEM=y" >> $config_host_mak
6050fi
6051if test "$debug_mutex" = "yes" ; then
6052  echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
6053fi
6054
6055# Hold two types of flag:
6056#   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
6057#                                     a thread we have a handle to
6058#   CONFIG_PTHREAD_SETNAME_NP_W_TID - A way of doing it on a particular
6059#                                     platform
6060if test "$pthread_setname_np_w_tid" = "yes" ; then
6061  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
6062  echo "CONFIG_PTHREAD_SETNAME_NP_W_TID=y" >> $config_host_mak
6063elif test "$pthread_setname_np_wo_tid" = "yes" ; then
6064  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
6065  echo "CONFIG_PTHREAD_SETNAME_NP_WO_TID=y" >> $config_host_mak
6066fi
6067
6068if test "$libpmem" = "yes" ; then
6069  echo "CONFIG_LIBPMEM=y" >> $config_host_mak
6070  echo "LIBPMEM_LIBS=$libpmem_libs" >> $config_host_mak
6071  echo "LIBPMEM_CFLAGS=$libpmem_cflags" >> $config_host_mak
6072fi
6073
6074if test "$libdaxctl" = "yes" ; then
6075  echo "CONFIG_LIBDAXCTL=y" >> $config_host_mak
6076  echo "LIBDAXCTL_LIBS=$libdaxctl_libs" >> $config_host_mak
6077fi
6078
6079if test "$bochs" = "yes" ; then
6080  echo "CONFIG_BOCHS=y" >> $config_host_mak
6081fi
6082if test "$cloop" = "yes" ; then
6083  echo "CONFIG_CLOOP=y" >> $config_host_mak
6084fi
6085if test "$dmg" = "yes" ; then
6086  echo "CONFIG_DMG=y" >> $config_host_mak
6087fi
6088if test "$qcow1" = "yes" ; then
6089  echo "CONFIG_QCOW1=y" >> $config_host_mak
6090fi
6091if test "$vdi" = "yes" ; then
6092  echo "CONFIG_VDI=y" >> $config_host_mak
6093fi
6094if test "$vvfat" = "yes" ; then
6095  echo "CONFIG_VVFAT=y" >> $config_host_mak
6096fi
6097if test "$qed" = "yes" ; then
6098  echo "CONFIG_QED=y" >> $config_host_mak
6099fi
6100if test "$parallels" = "yes" ; then
6101  echo "CONFIG_PARALLELS=y" >> $config_host_mak
6102fi
6103if test "$have_mlockall" = "yes" ; then
6104  echo "HAVE_MLOCKALL=y" >> $config_host_mak
6105fi
6106if test "$fuzzing" = "yes" ; then
6107  # If LIB_FUZZING_ENGINE is set, assume we are running on OSS-Fuzz, and the
6108  # needed CFLAGS have already been provided
6109  if test -z "${LIB_FUZZING_ENGINE+xxx}" ; then
6110    # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
6111    # compiled code.
6112    QEMU_CFLAGS="$QEMU_CFLAGS -fsanitize=fuzzer-no-link"
6113    # To build non-fuzzer binaries with --enable-fuzzing, link everything with
6114    # fsanitize=fuzzer-no-link. Otherwise, the linker will be unable to bind
6115    # the fuzzer-related callbacks added by instrumentation.
6116    QEMU_LDFLAGS="$QEMU_LDFLAGS -fsanitize=fuzzer-no-link"
6117    # For the actual fuzzer binaries, we need to link against the libfuzzer
6118    # library. Provide the flags for doing this in FUZZ_EXE_LDFLAGS. The meson
6119    # rule for the fuzzer adds these to the link_args. They need to be
6120    # configurable, to support OSS-Fuzz
6121    FUZZ_EXE_LDFLAGS="-fsanitize=fuzzer"
6122  else
6123    FUZZ_EXE_LDFLAGS="$LIB_FUZZING_ENGINE"
6124  fi
6125fi
6126
6127if test "$plugins" = "yes" ; then
6128    echo "CONFIG_PLUGIN=y" >> $config_host_mak
6129    # Copy the export object list to the build dir
6130    if test "$ld_dynamic_list" = "yes" ; then
6131	echo "CONFIG_HAS_LD_DYNAMIC_LIST=yes" >> $config_host_mak
6132	ld_symbols=qemu-plugins-ld.symbols
6133	cp "$source_path/plugins/qemu-plugins.symbols" $ld_symbols
6134    elif test "$ld_exported_symbols_list" = "yes" ; then
6135	echo "CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST=yes" >> $config_host_mak
6136	ld64_symbols=qemu-plugins-ld64.symbols
6137	echo "# Automatically generated by configure - do not modify" > $ld64_symbols
6138	grep 'qemu_' "$source_path/plugins/qemu-plugins.symbols" | sed 's/;//g' | \
6139	    sed -E 's/^[[:space:]]*(.*)/_\1/' >> $ld64_symbols
6140    else
6141	error_exit \
6142	    "If \$plugins=yes, either \$ld_dynamic_list or " \
6143	    "\$ld_exported_symbols_list should have been set to 'yes'."
6144    fi
6145fi
6146
6147if test -n "$gdb_bin"; then
6148    gdb_version=$($gdb_bin --version | head -n 1)
6149    if version_ge ${gdb_version##* } 9.1; then
6150        echo "HAVE_GDB_BIN=$gdb_bin" >> $config_host_mak
6151    fi
6152fi
6153
6154if test "$secret_keyring" = "yes" ; then
6155  echo "CONFIG_SECRET_KEYRING=y" >> $config_host_mak
6156fi
6157
6158echo "ROMS=$roms" >> $config_host_mak
6159echo "MAKE=$make" >> $config_host_mak
6160echo "PYTHON=$python" >> $config_host_mak
6161echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
6162echo "MESON=$meson" >> $config_host_mak
6163echo "NINJA=$ninja" >> $config_host_mak
6164echo "CC=$cc" >> $config_host_mak
6165echo "HOST_CC=$host_cc" >> $config_host_mak
6166if $iasl -h > /dev/null 2>&1; then
6167  echo "CONFIG_IASL=$iasl" >> $config_host_mak
6168fi
6169echo "CXX=$cxx" >> $config_host_mak
6170echo "OBJCC=$objcc" >> $config_host_mak
6171echo "AR=$ar" >> $config_host_mak
6172echo "ARFLAGS=$ARFLAGS" >> $config_host_mak
6173echo "AS=$as" >> $config_host_mak
6174echo "CCAS=$ccas" >> $config_host_mak
6175echo "CPP=$cpp" >> $config_host_mak
6176echo "OBJCOPY=$objcopy" >> $config_host_mak
6177echo "LD=$ld" >> $config_host_mak
6178echo "RANLIB=$ranlib" >> $config_host_mak
6179echo "NM=$nm" >> $config_host_mak
6180echo "PKG_CONFIG=$pkg_config_exe" >> $config_host_mak
6181echo "WINDRES=$windres" >> $config_host_mak
6182echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
6183echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
6184echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
6185echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
6186echo "GLIB_LIBS=$glib_libs" >> $config_host_mak
6187echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
6188echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
6189echo "EXESUF=$EXESUF" >> $config_host_mak
6190echo "HOST_DSOSUF=$HOST_DSOSUF" >> $config_host_mak
6191echo "LIBS_QGA=$libs_qga" >> $config_host_mak
6192echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak
6193echo "TASN1_CFLAGS=$tasn1_cflags" >> $config_host_mak
6194if test "$gcov" = "yes" ; then
6195  echo "CONFIG_GCOV=y" >> $config_host_mak
6196fi
6197
6198if test "$fuzzing" != "no"; then
6199    echo "CONFIG_FUZZ=y" >> $config_host_mak
6200fi
6201echo "FUZZ_EXE_LDFLAGS=$FUZZ_EXE_LDFLAGS" >> $config_host_mak
6202
6203if test "$rng_none" = "yes"; then
6204  echo "CONFIG_RNG_NONE=y" >> $config_host_mak
6205fi
6206
6207# use included Linux headers
6208if test "$linux" = "yes" ; then
6209  mkdir -p linux-headers
6210  case "$cpu" in
6211  i386|x86_64|x32)
6212    linux_arch=x86
6213    ;;
6214  ppc|ppc64|ppc64le)
6215    linux_arch=powerpc
6216    ;;
6217  s390x)
6218    linux_arch=s390
6219    ;;
6220  aarch64)
6221    linux_arch=arm64
6222    ;;
6223  mips64)
6224    linux_arch=mips
6225    ;;
6226  *)
6227    # For most CPUs the kernel architecture name and QEMU CPU name match.
6228    linux_arch="$cpu"
6229    ;;
6230  esac
6231    # For non-KVM architectures we will not have asm headers
6232    if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
6233      symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
6234    fi
6235fi
6236
6237for target in $target_list; do
6238    target_dir="$target"
6239    target_name=$(echo $target | cut -d '-' -f 1)
6240    mkdir -p $target_dir
6241    case $target in
6242        *-user) symlink "../qemu-$target_name" "$target_dir/qemu-$target_name" ;;
6243        *) symlink "../qemu-system-$target_name" "$target_dir/qemu-system-$target_name" ;;
6244    esac
6245done
6246
6247echo "CONFIG_QEMU_INTERP_PREFIX=$interp_prefix" | sed 's/%M/@0@/' >> $config_host_mak
6248if test "$default_targets" = "yes"; then
6249  echo "CONFIG_DEFAULT_TARGETS=y" >> $config_host_mak
6250fi
6251
6252if test "$numa" = "yes"; then
6253  echo "CONFIG_NUMA=y" >> $config_host_mak
6254  echo "NUMA_LIBS=$numa_libs" >> $config_host_mak
6255fi
6256
6257if test "$ccache_cpp2" = "yes"; then
6258  echo "export CCACHE_CPP2=y" >> $config_host_mak
6259fi
6260
6261if test "$safe_stack" = "yes"; then
6262  echo "CONFIG_SAFESTACK=y" >> $config_host_mak
6263fi
6264
6265# If we're using a separate build tree, set it up now.
6266# DIRS are directories which we simply mkdir in the build tree;
6267# LINKS are things to symlink back into the source tree
6268# (these can be both files and directories).
6269# Caution: do not add files or directories here using wildcards. This
6270# will result in problems later if a new file matching the wildcard is
6271# added to the source tree -- nothing will cause configure to be rerun
6272# so the build tree will be missing the link back to the new file, and
6273# tests might fail. Prefer to keep the relevant files in their own
6274# directory and symlink the directory instead.
6275# UNLINK is used to remove symlinks from older development versions
6276# that might get into the way when doing "git update" without doing
6277# a "make distclean" in between.
6278DIRS="tests tests/tcg tests/qapi-schema tests/qtest/libqos"
6279DIRS="$DIRS tests/qtest tests/qemu-iotests tests/vm tests/fp tests/qgraph"
6280DIRS="$DIRS docs docs/interop fsdev scsi"
6281DIRS="$DIRS pc-bios/optionrom pc-bios/s390-ccw"
6282DIRS="$DIRS roms/seabios"
6283DIRS="$DIRS contrib/plugins/"
6284LINKS="Makefile"
6285LINKS="$LINKS tests/tcg/Makefile.target"
6286LINKS="$LINKS pc-bios/optionrom/Makefile"
6287LINKS="$LINKS pc-bios/s390-ccw/Makefile"
6288LINKS="$LINKS roms/seabios/Makefile"
6289LINKS="$LINKS pc-bios/qemu-icon.bmp"
6290LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
6291LINKS="$LINKS tests/acceptance tests/data"
6292LINKS="$LINKS tests/qemu-iotests/check"
6293LINKS="$LINKS python"
6294LINKS="$LINKS contrib/plugins/Makefile "
6295UNLINK="pc-bios/keymaps"
6296for bios_file in \
6297    $source_path/pc-bios/*.bin \
6298    $source_path/pc-bios/*.elf \
6299    $source_path/pc-bios/*.lid \
6300    $source_path/pc-bios/*.rom \
6301    $source_path/pc-bios/*.dtb \
6302    $source_path/pc-bios/*.img \
6303    $source_path/pc-bios/openbios-* \
6304    $source_path/pc-bios/u-boot.* \
6305    $source_path/pc-bios/edk2-*.fd.bz2 \
6306    $source_path/pc-bios/palcode-*
6307do
6308    LINKS="$LINKS pc-bios/$(basename $bios_file)"
6309done
6310mkdir -p $DIRS
6311for f in $LINKS ; do
6312    if [ -e "$source_path/$f" ]; then
6313        symlink "$source_path/$f" "$f"
6314    fi
6315done
6316for f in $UNLINK ; do
6317    if [ -L "$f" ]; then
6318        rm -f "$f"
6319    fi
6320done
6321
6322(for i in $cross_cc_vars; do
6323  export $i
6324done
6325export target_list source_path use_containers ARCH
6326$source_path/tests/tcg/configure.sh)
6327
6328# temporary config to build submodules
6329for rom in seabios; do
6330    config_mak=roms/$rom/config.mak
6331    echo "# Automatically generated by configure - do not modify" > $config_mak
6332    echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
6333    echo "AS=$as" >> $config_mak
6334    echo "CCAS=$ccas" >> $config_mak
6335    echo "CC=$cc" >> $config_mak
6336    echo "BCC=bcc" >> $config_mak
6337    echo "CPP=$cpp" >> $config_mak
6338    echo "OBJCOPY=objcopy" >> $config_mak
6339    echo "IASL=$iasl" >> $config_mak
6340    echo "LD=$ld" >> $config_mak
6341    echo "RANLIB=$ranlib" >> $config_mak
6342done
6343
6344if test "$skip_meson" = no; then
6345  cross="config-meson.cross.new"
6346  meson_quote() {
6347    echo "'$(echo $* | sed "s/ /','/g")'"
6348  }
6349
6350  echo "# Automatically generated by configure - do not modify" > $cross
6351  echo "[properties]" >> $cross
6352  test -z "$cxx" && echo "link_language = 'c'" >> $cross
6353  echo "[built-in options]" >> $cross
6354  echo "c_args = [${CFLAGS:+$(meson_quote $CFLAGS)}]" >> $cross
6355  echo "cpp_args = [${CXXFLAGS:+$(meson_quote $CXXFLAGS)}]" >> $cross
6356  echo "c_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
6357  echo "cpp_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
6358  echo "[binaries]" >> $cross
6359  echo "c = [$(meson_quote $cc)]" >> $cross
6360  test -n "$cxx" && echo "cpp = [$(meson_quote $cxx)]" >> $cross
6361  test -n "$objcc" && echo "objc = [$(meson_quote $objcc)]" >> $cross
6362  echo "ar = [$(meson_quote $ar)]" >> $cross
6363  echo "nm = [$(meson_quote $nm)]" >> $cross
6364  echo "pkgconfig = [$(meson_quote $pkg_config_exe)]" >> $cross
6365  echo "ranlib = [$(meson_quote $ranlib)]" >> $cross
6366  if has $sdl2_config; then
6367    echo "sdl2-config = [$(meson_quote $sdl2_config)]" >> $cross
6368  fi
6369  echo "strip = [$(meson_quote $strip)]" >> $cross
6370  echo "windres = [$(meson_quote $windres)]" >> $cross
6371  if test "$cross_compile" = "yes"; then
6372    cross_arg="--cross-file config-meson.cross"
6373    echo "[host_machine]" >> $cross
6374    if test "$mingw32" = "yes" ; then
6375        echo "system = 'windows'" >> $cross
6376    fi
6377    if test "$linux" = "yes" ; then
6378        echo "system = 'linux'" >> $cross
6379    fi
6380    if test "$darwin" = "yes" ; then
6381        echo "system = 'darwin'" >> $cross
6382    fi
6383    case "$ARCH" in
6384        i386)
6385            echo "cpu_family = 'x86'" >> $cross
6386            ;;
6387        x86_64)
6388            echo "cpu_family = 'x86_64'" >> $cross
6389            ;;
6390        ppc64le)
6391            echo "cpu_family = 'ppc64'" >> $cross
6392            ;;
6393        *)
6394            echo "cpu_family = '$ARCH'" >> $cross
6395            ;;
6396    esac
6397    echo "cpu = '$cpu'" >> $cross
6398    if test "$bigendian" = "yes" ; then
6399        echo "endian = 'big'" >> $cross
6400    else
6401        echo "endian = 'little'" >> $cross
6402    fi
6403  else
6404    cross_arg="--native-file config-meson.cross"
6405  fi
6406  mv $cross config-meson.cross
6407
6408  rm -rf meson-private meson-info meson-logs
6409  unset staticpic
6410  if ! version_ge "$($meson --version)" 0.56.0; then
6411    staticpic=$(if test "$pie" = yes; then echo true; else echo false; fi)
6412  fi
6413  NINJA=$ninja $meson setup \
6414        --prefix "$prefix" \
6415        --libdir "$libdir" \
6416        --libexecdir "$libexecdir" \
6417        --bindir "$bindir" \
6418        --includedir "$includedir" \
6419        --datadir "$datadir" \
6420        --mandir "$mandir" \
6421        --sysconfdir "$sysconfdir" \
6422        --localedir "$localedir" \
6423        --localstatedir "$local_statedir" \
6424        -Ddocdir="$docdir" \
6425        -Dqemu_firmwarepath="$firmwarepath" \
6426        -Dqemu_suffix="$qemu_suffix" \
6427        -Doptimization=$(if test "$debug" = yes; then echo 0; else echo 2; fi) \
6428        -Ddebug=$(if test "$debug_info" = yes; then echo true; else echo false; fi) \
6429        -Dwerror=$(if test "$werror" = yes; then echo true; else echo false; fi) \
6430        -Dstrip=$(if test "$strip_opt" = yes; then echo true; else echo false; fi) \
6431        -Db_pie=$(if test "$pie" = yes; then echo true; else echo false; fi) \
6432        ${staticpic:+-Db_staticpic=$staticpic} \
6433        -Db_coverage=$(if test "$gcov" = yes; then echo true; else echo false; fi) \
6434        -Db_lto=$lto -Dcfi=$cfi -Dcfi_debug=$cfi_debug \
6435        -Dmalloc=$malloc -Dmalloc_trim=$malloc_trim -Dsparse=$sparse \
6436        -Dkvm=$kvm -Dhax=$hax -Dwhpx=$whpx -Dhvf=$hvf -Dnvmm=$nvmm \
6437        -Dxen=$xen -Dxen_pci_passthrough=$xen_pci_passthrough -Dtcg=$tcg \
6438        -Dcocoa=$cocoa -Dgtk=$gtk -Dmpath=$mpath -Dsdl=$sdl -Dsdl_image=$sdl_image \
6439        -Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg -Dvnc_png=$vnc_png \
6440        -Dgettext=$gettext -Dxkbcommon=$xkbcommon -Du2f=$u2f -Dvirtiofsd=$virtiofsd \
6441        -Dcapstone=$capstone -Dslirp=$slirp -Dfdt=$fdt -Dbrlapi=$brlapi \
6442        -Dcurl=$curl -Dglusterfs=$glusterfs -Dbzip2=$bzip2 -Dlibiscsi=$libiscsi \
6443        -Dlibnfs=$libnfs -Diconv=$iconv -Dcurses=$curses -Dlibudev=$libudev\
6444        -Drbd=$rbd -Dlzo=$lzo -Dsnappy=$snappy -Dlzfse=$lzfse \
6445        -Dzstd=$zstd -Dseccomp=$seccomp -Dvirtfs=$virtfs -Dcap_ng=$cap_ng \
6446        -Dattr=$attr -Ddefault_devices=$default_devices \
6447        -Ddocs=$docs -Dsphinx_build=$sphinx_build -Dinstall_blobs=$blobs \
6448        -Dvhost_user_blk_server=$vhost_user_blk_server -Dmultiprocess=$multiprocess \
6449        -Dfuse=$fuse -Dfuse_lseek=$fuse_lseek -Dguest_agent_msi=$guest_agent_msi -Dbpf=$bpf\
6450        $(if test "$default_features" = no; then echo "-Dauto_features=disabled"; fi) \
6451	-Dtcg_interpreter=$tcg_interpreter \
6452        $cross_arg \
6453        "$PWD" "$source_path"
6454
6455  if test "$?" -ne 0 ; then
6456      error_exit "meson setup failed"
6457  fi
6458else
6459  if test -f meson-private/cmd_line.txt; then
6460    # Adjust old command line options whose type was changed
6461    # Avoids having to use "setup --wipe" when Meson is upgraded
6462    perl -i -ne '
6463      s/^gettext = true$/gettext = auto/;
6464      s/^gettext = false$/gettext = disabled/;
6465      print;' meson-private/cmd_line.txt
6466  fi
6467fi
6468
6469if test -n "${deprecated_features}"; then
6470    echo "Warning, deprecated features enabled."
6471    echo "Please see docs/system/deprecated.rst"
6472    echo "  features: ${deprecated_features}"
6473fi
6474
6475# Create list of config switches that should be poisoned in common code...
6476# but filter out CONFIG_TCG and CONFIG_USER_ONLY which are special.
6477target_configs_h=$(ls *-config-devices.h *-config-target.h 2>/dev/null)
6478if test -n "$target_configs_h" ; then
6479    sed -n -e '/CONFIG_TCG/d' -e '/CONFIG_USER_ONLY/d' \
6480        -e '/^#define / { s///; s/ .*//; s/^/#pragma GCC poison /p; }' \
6481        $target_configs_h | sort -u > config-poison.h
6482else
6483    :> config-poison.h
6484fi
6485
6486# Save the configure command line for later reuse.
6487cat <<EOD >config.status
6488#!/bin/sh
6489# Generated by configure.
6490# Run this file to recreate the current configuration.
6491# Compiler output produced by configure, useful for debugging
6492# configure, is in config.log if it exists.
6493EOD
6494
6495preserve_env() {
6496    envname=$1
6497
6498    eval envval=\$$envname
6499
6500    if test -n "$envval"
6501    then
6502	echo "$envname='$envval'" >> config.status
6503	echo "export $envname" >> config.status
6504    else
6505	echo "unset $envname" >> config.status
6506    fi
6507}
6508
6509# Preserve various env variables that influence what
6510# features/build target configure will detect
6511preserve_env AR
6512preserve_env AS
6513preserve_env CC
6514preserve_env CPP
6515preserve_env CXX
6516preserve_env INSTALL
6517preserve_env LD
6518preserve_env LD_LIBRARY_PATH
6519preserve_env LIBTOOL
6520preserve_env MAKE
6521preserve_env NM
6522preserve_env OBJCOPY
6523preserve_env PATH
6524preserve_env PKG_CONFIG
6525preserve_env PKG_CONFIG_LIBDIR
6526preserve_env PKG_CONFIG_PATH
6527preserve_env PYTHON
6528preserve_env SDL2_CONFIG
6529preserve_env SMBD
6530preserve_env STRIP
6531preserve_env WINDRES
6532
6533printf "exec" >>config.status
6534for i in "$0" "$@"; do
6535  test "$i" = --skip-meson || printf " %s" "$(quote_sh "$i")" >>config.status
6536done
6537echo ' "$@"' >>config.status
6538chmod +x config.status
6539
6540rm -r "$TMPDIR1"
6541