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