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