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