xref: /openbmc/qemu/configure (revision e4ec5ad4)
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# Temporary directory used for files created while
15# configure runs. Since it is in the build directory
16# we can safely blow away any previous version of it
17# (and we need not jump through hoops to try to delete
18# it when configure exits.)
19TMPDIR1="config-temp"
20rm -rf "${TMPDIR1}"
21mkdir -p "${TMPDIR1}"
22if [ $? -ne 0 ]; then
23    echo "ERROR: failed to create temporary directory"
24    exit 1
25fi
26
27TMPB="qemu-conf"
28TMPC="${TMPDIR1}/${TMPB}.c"
29TMPO="${TMPDIR1}/${TMPB}.o"
30TMPCXX="${TMPDIR1}/${TMPB}.cxx"
31TMPE="${TMPDIR1}/${TMPB}.exe"
32TMPMO="${TMPDIR1}/${TMPB}.mo"
33
34rm -f config.log
35
36# Print a helpful header at the top of config.log
37echo "# QEMU configure log $(date)" >> config.log
38printf "# Configured with:" >> config.log
39printf " '%s'" "$0" "$@" >> config.log
40echo >> config.log
41echo "#" >> config.log
42
43print_error() {
44    (echo
45    echo "ERROR: $1"
46    while test -n "$2"; do
47        echo "       $2"
48        shift
49    done
50    echo) >&2
51}
52
53error_exit() {
54    print_error "$@"
55    exit 1
56}
57
58do_compiler() {
59    # Run the compiler, capturing its output to the log. First argument
60    # is compiler binary to execute.
61    local compiler="$1"
62    shift
63    if test -n "$BASH_VERSION"; then eval '
64        echo >>config.log "
65funcs: ${FUNCNAME[*]}
66lines: ${BASH_LINENO[*]}"
67    '; fi
68    echo $compiler "$@" >> config.log
69    $compiler "$@" >> config.log 2>&1 || return $?
70    # Test passed. If this is an --enable-werror build, rerun
71    # the test with -Werror and bail out if it fails. This
72    # makes warning-generating-errors in configure test code
73    # obvious to developers.
74    if test "$werror" != "yes"; then
75        return 0
76    fi
77    # Don't bother rerunning the compile if we were already using -Werror
78    case "$*" in
79        *-Werror*)
80           return 0
81        ;;
82    esac
83    echo $compiler -Werror "$@" >> config.log
84    $compiler -Werror "$@" >> config.log 2>&1 && return $?
85    error_exit "configure test passed without -Werror but failed with -Werror." \
86        "This is probably a bug in the configure script. The failing command" \
87        "will be at the bottom of config.log." \
88        "You can run configure with --disable-werror to bypass this check."
89}
90
91do_cc() {
92    do_compiler "$cc" "$@"
93}
94
95do_cxx() {
96    do_compiler "$cxx" "$@"
97}
98
99update_cxxflags() {
100    # Set QEMU_CXXFLAGS from QEMU_CFLAGS by filtering out those
101    # options which some versions of GCC's C++ compiler complain about
102    # because they only make sense for C programs.
103    QEMU_CXXFLAGS="$QEMU_CXXFLAGS -D__STDC_LIMIT_MACROS"
104
105    for arg in $QEMU_CFLAGS; do
106        case $arg in
107            -Wstrict-prototypes|-Wmissing-prototypes|-Wnested-externs|\
108            -Wold-style-declaration|-Wold-style-definition|-Wredundant-decls)
109                ;;
110            -std=gnu99)
111                QEMU_CXXFLAGS=${QEMU_CXXFLAGS:+$QEMU_CXXFLAGS }"-std=gnu++98"
112                ;;
113            *)
114                QEMU_CXXFLAGS=${QEMU_CXXFLAGS:+$QEMU_CXXFLAGS }$arg
115                ;;
116        esac
117    done
118}
119
120compile_object() {
121  local_cflags="$1"
122  do_cc $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
123}
124
125compile_prog() {
126  local_cflags="$1"
127  local_ldflags="$2"
128  do_cc $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC $LDFLAGS $local_ldflags
129}
130
131# symbolically link $1 to $2.  Portable version of "ln -sf".
132symlink() {
133  rm -rf "$2"
134  mkdir -p "$(dirname "$2")"
135  ln -s "$1" "$2"
136}
137
138# check whether a command is available to this shell (may be either an
139# executable or a builtin)
140has() {
141    type "$1" >/dev/null 2>&1
142}
143
144# search for an executable in PATH
145path_of() {
146    local_command="$1"
147    local_ifs="$IFS"
148    local_dir=""
149
150    # pathname has a dir component?
151    if [ "${local_command#*/}" != "$local_command" ]; then
152        if [ -x "$local_command" ] && [ ! -d "$local_command" ]; then
153            echo "$local_command"
154            return 0
155        fi
156    fi
157    if [ -z "$local_command" ]; then
158        return 1
159    fi
160
161    IFS=:
162    for local_dir in $PATH; do
163        if [ -x "$local_dir/$local_command" ] && [ ! -d "$local_dir/$local_command" ]; then
164            echo "$local_dir/$local_command"
165            IFS="${local_ifs:-$(printf ' \t\n')}"
166            return 0
167        fi
168    done
169    # not found
170    IFS="${local_ifs:-$(printf ' \t\n')}"
171    return 1
172}
173
174have_backend () {
175    echo "$trace_backends" | grep "$1" >/dev/null
176}
177
178glob() {
179    eval test -z '"${1#'"$2"'}"'
180}
181
182supported_hax_target() {
183    test "$hax" = "yes" || return 1
184    glob "$1" "*-softmmu" || return 1
185    case "${1%-softmmu}" in
186        i386|x86_64)
187            return 0
188        ;;
189    esac
190    return 1
191}
192
193supported_kvm_target() {
194    test "$kvm" = "yes" || return 1
195    glob "$1" "*-softmmu" || return 1
196    case "${1%-softmmu}:$cpu" in
197        arm:arm | aarch64:aarch64 | \
198        i386:i386 | i386:x86_64 | i386:x32 | \
199        x86_64:i386 | x86_64:x86_64 | x86_64:x32 | \
200        mips:mips | mipsel:mips | \
201        ppc:ppc | ppc64:ppc | ppc:ppc64 | ppc64:ppc64 | ppc64:ppc64le | \
202        s390x:s390x)
203            return 0
204        ;;
205    esac
206    return 1
207}
208
209supported_xen_target() {
210    test "$xen" = "yes" || return 1
211    glob "$1" "*-softmmu" || return 1
212    # Only i386 and x86_64 provide the xenpv machine.
213    case "${1%-softmmu}" in
214        i386|x86_64)
215            return 0
216        ;;
217    esac
218    return 1
219}
220
221supported_hvf_target() {
222    test "$hvf" = "yes" || return 1
223    glob "$1" "*-softmmu" || return 1
224    case "${1%-softmmu}" in
225        x86_64)
226            return 0
227        ;;
228    esac
229    return 1
230}
231
232supported_whpx_target() {
233    test "$whpx" = "yes" || return 1
234    glob "$1" "*-softmmu" || return 1
235    case "${1%-softmmu}" in
236        i386|x86_64)
237            return 0
238        ;;
239    esac
240    return 1
241}
242
243supported_target() {
244    case "$1" in
245        *-softmmu)
246            ;;
247        *-linux-user)
248            if test "$linux" != "yes"; then
249                print_error "Target '$target' is only available on a Linux host"
250                return 1
251            fi
252            ;;
253        *-bsd-user)
254            if test "$bsd" != "yes"; then
255                print_error "Target '$target' is only available on a BSD host"
256                return 1
257            fi
258            ;;
259        *)
260            print_error "Invalid target name '$target'"
261            return 1
262            ;;
263    esac
264    test "$tcg" = "yes" && return 0
265    supported_kvm_target "$1" && return 0
266    supported_xen_target "$1" && return 0
267    supported_hax_target "$1" && return 0
268    supported_hvf_target "$1" && return 0
269    supported_whpx_target "$1" && return 0
270    print_error "TCG disabled, but hardware accelerator not available for '$target'"
271    return 1
272}
273
274
275ld_has() {
276    $ld --help 2>/dev/null | grep ".$1" >/dev/null 2>&1
277}
278
279# make source path absolute
280source_path=$(cd "$(dirname -- "$0")"; pwd)
281
282if printf %s\\n "$source_path" "$PWD" | grep -q "[[:space:]:]";
283then
284  error_exit "main directory cannot contain spaces nor colons"
285fi
286
287# default parameters
288cpu=""
289iasl="iasl"
290interp_prefix="/usr/gnemul/qemu-%M"
291static="no"
292cross_prefix=""
293audio_drv_list=""
294block_drv_rw_whitelist=""
295block_drv_ro_whitelist=""
296host_cc="cc"
297libs_cpu=""
298libs_softmmu=""
299libs_tools=""
300audio_win_int=""
301libs_qga=""
302debug_info="yes"
303stack_protector=""
304
305if test -e "$source_path/.git"
306then
307    git_update=yes
308    git_submodules="ui/keycodemapdb"
309    git_submodules="$git_submodules tests/fp/berkeley-testfloat-3"
310    git_submodules="$git_submodules tests/fp/berkeley-softfloat-3"
311else
312    git_update=no
313    git_submodules=""
314
315    if ! test -f "$source_path/ui/keycodemapdb/README"
316    then
317        echo
318        echo "ERROR: missing file $source_path/ui/keycodemapdb/README"
319        echo
320        echo "This is not a GIT checkout but module content appears to"
321        echo "be missing. Do not use 'git archive' or GitHub download links"
322        echo "to acquire QEMU source archives. Non-GIT builds are only"
323        echo "supported with source archives linked from:"
324        echo
325        echo "  https://www.qemu.org/download/#source"
326        echo
327        echo "Developers working with GIT can use scripts/archive-source.sh"
328        echo "if they need to create valid source archives."
329        echo
330        exit 1
331    fi
332fi
333git="git"
334
335# Don't accept a target_list environment variable.
336unset target_list
337unset target_list_exclude
338
339# Default value for a variable defining feature "foo".
340#  * foo="no"  feature will only be used if --enable-foo arg is given
341#  * foo=""    feature will be searched for, and if found, will be used
342#              unless --disable-foo is given
343#  * foo="yes" this value will only be set by --enable-foo flag.
344#              feature will searched for,
345#              if not found, configure exits with error
346#
347# Always add --enable-foo and --disable-foo command line args.
348# Distributions want to ensure that several features are compiled in, and it
349# is impossible without a --enable-foo that exits if a feature is not found.
350
351bluez=""
352brlapi=""
353curl=""
354curses=""
355docs=""
356fdt=""
357netmap="no"
358sdl=""
359sdl_image=""
360virtfs=""
361mpath=""
362vnc="yes"
363sparse="no"
364vde=""
365vnc_sasl=""
366vnc_jpeg=""
367vnc_png=""
368xkbcommon=""
369xen=""
370xen_ctrl_version=""
371xen_pci_passthrough=""
372linux_aio=""
373cap_ng=""
374attr=""
375libattr=""
376xfs=""
377tcg="yes"
378membarrier=""
379vhost_net=""
380vhost_crypto=""
381vhost_scsi=""
382vhost_vsock=""
383vhost_user=""
384kvm="no"
385hax="no"
386hvf="no"
387whpx="no"
388rdma=""
389pvrdma=""
390gprof="no"
391debug_tcg="no"
392debug="no"
393sanitizers="no"
394fortify_source=""
395strip_opt="yes"
396tcg_interpreter="no"
397bigendian="no"
398mingw32="no"
399gcov="no"
400gcov_tool="gcov"
401EXESUF=""
402DSOSUF=".so"
403LDFLAGS_SHARED="-shared"
404modules="no"
405prefix="/usr/local"
406mandir="\${prefix}/share/man"
407datadir="\${prefix}/share"
408firmwarepath="\${prefix}/share/qemu-firmware"
409qemu_docdir="\${prefix}/share/doc/qemu"
410bindir="\${prefix}/bin"
411libdir="\${prefix}/lib"
412libexecdir="\${prefix}/libexec"
413includedir="\${prefix}/include"
414sysconfdir="\${prefix}/etc"
415local_statedir="\${prefix}/var"
416confsuffix="/qemu"
417slirp=""
418oss_lib=""
419bsd="no"
420linux="no"
421solaris="no"
422profiler="no"
423cocoa="no"
424softmmu="yes"
425linux_user="no"
426bsd_user="no"
427blobs="yes"
428pkgversion=""
429pie=""
430qom_cast_debug="yes"
431trace_backends="log"
432trace_file="trace"
433spice=""
434rbd=""
435smartcard=""
436libusb=""
437usb_redir=""
438opengl=""
439opengl_dmabuf="no"
440cpuid_h="no"
441avx2_opt=""
442zlib="yes"
443capstone=""
444lzo=""
445snappy=""
446bzip2=""
447lzfse=""
448guest_agent=""
449guest_agent_with_vss="no"
450guest_agent_ntddscsi="no"
451guest_agent_msi=""
452vss_win32_sdk=""
453win_sdk="no"
454want_tools="yes"
455libiscsi=""
456libnfs=""
457coroutine=""
458coroutine_pool=""
459debug_stack_usage="no"
460crypto_afalg="no"
461seccomp=""
462glusterfs=""
463glusterfs_xlator_opt="no"
464glusterfs_discard="no"
465glusterfs_fallocate="no"
466glusterfs_zerofill="no"
467glusterfs_ftruncate_has_stat="no"
468glusterfs_iocb_has_stat="no"
469gtk=""
470gtk_gl="no"
471tls_priority="NORMAL"
472gnutls=""
473nettle=""
474gcrypt=""
475gcrypt_hmac="no"
476auth_pam=""
477vte=""
478virglrenderer=""
479tpm=""
480libssh=""
481live_block_migration="yes"
482numa=""
483tcmalloc="no"
484jemalloc="no"
485replication="yes"
486vxhs=""
487bochs="yes"
488cloop="yes"
489dmg="yes"
490qcow1="yes"
491vdi="yes"
492vvfat="yes"
493qed="yes"
494parallels="yes"
495sheepdog="yes"
496libxml2=""
497debug_mutex="no"
498libpmem=""
499default_devices="yes"
500
501supported_cpu="no"
502supported_os="no"
503bogus_os="no"
504malloc_trim=""
505
506# parse CC options first
507for opt do
508  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
509  case "$opt" in
510  --cross-prefix=*) cross_prefix="$optarg"
511  ;;
512  --cc=*) CC="$optarg"
513  ;;
514  --cxx=*) CXX="$optarg"
515  ;;
516  --cpu=*) cpu="$optarg"
517  ;;
518  --extra-cflags=*) QEMU_CFLAGS="$QEMU_CFLAGS $optarg"
519  ;;
520  --extra-cxxflags=*) QEMU_CXXFLAGS="$QEMU_CXXFLAGS $optarg"
521  ;;
522  --extra-ldflags=*) LDFLAGS="$LDFLAGS $optarg"
523                     EXTRA_LDFLAGS="$optarg"
524  ;;
525  --enable-debug-info) debug_info="yes"
526  ;;
527  --disable-debug-info) debug_info="no"
528  ;;
529  --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"
530  ;;
531  --cross-cc-cflags-*) cc_arch=${opt#--cross-cc-flags-}; cc_arch=${cc_arch%%=*}
532                      eval "cross_cc_cflags_${cc_arch}=\$optarg"
533                      cross_cc_vars="$cross_cc_vars cross_cc_cflags_${cc_arch}"
534  ;;
535  --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}
536                cc_archs="$cc_archs $cc_arch"
537                eval "cross_cc_${cc_arch}=\$optarg"
538                cross_cc_vars="$cross_cc_vars cross_cc_${cc_arch}"
539  ;;
540  esac
541done
542# OS specific
543# Using uname is really, really broken.  Once we have the right set of checks
544# we can eliminate its usage altogether.
545
546# Preferred compiler:
547#  ${CC} (if set)
548#  ${cross_prefix}gcc (if cross-prefix specified)
549#  system compiler
550if test -z "${CC}${cross_prefix}"; then
551  cc="$host_cc"
552else
553  cc="${CC-${cross_prefix}gcc}"
554fi
555
556if test -z "${CXX}${cross_prefix}"; then
557  cxx="c++"
558else
559  cxx="${CXX-${cross_prefix}g++}"
560fi
561
562ar="${AR-${cross_prefix}ar}"
563as="${AS-${cross_prefix}as}"
564ccas="${CCAS-$cc}"
565cpp="${CPP-$cc -E}"
566objcopy="${OBJCOPY-${cross_prefix}objcopy}"
567ld="${LD-${cross_prefix}ld}"
568ranlib="${RANLIB-${cross_prefix}ranlib}"
569nm="${NM-${cross_prefix}nm}"
570strip="${STRIP-${cross_prefix}strip}"
571windres="${WINDRES-${cross_prefix}windres}"
572pkg_config_exe="${PKG_CONFIG-${cross_prefix}pkg-config}"
573query_pkg_config() {
574    "${pkg_config_exe}" ${QEMU_PKG_CONFIG_FLAGS} "$@"
575}
576pkg_config=query_pkg_config
577sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
578
579# If the user hasn't specified ARFLAGS, default to 'rv', just as make does.
580ARFLAGS="${ARFLAGS-rv}"
581
582# default flags for all hosts
583# We use -fwrapv to tell the compiler that we require a C dialect where
584# left shift of signed integers is well defined and has the expected
585# 2s-complement style results. (Both clang and gcc agree that it
586# provides these semantics.)
587QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv -std=gnu99 $QEMU_CFLAGS"
588QEMU_CFLAGS="-Wall -Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS"
589QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS"
590QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
591QEMU_INCLUDES="-iquote . -iquote \$(SRC_PATH) -iquote \$(SRC_PATH)/accel/tcg -iquote \$(SRC_PATH)/include"
592if test "$debug_info" = "yes"; then
593    CFLAGS="-g $CFLAGS"
594    LDFLAGS="-g $LDFLAGS"
595fi
596
597# running configure in the source tree?
598# we know that's the case if configure is there.
599if test -f "./configure"; then
600    pwd_is_source_path="y"
601else
602    pwd_is_source_path="n"
603fi
604
605check_define() {
606cat > $TMPC <<EOF
607#if !defined($1)
608#error $1 not defined
609#endif
610int main(void) { return 0; }
611EOF
612  compile_object
613}
614
615check_include() {
616cat > $TMPC <<EOF
617#include <$1>
618int main(void) { return 0; }
619EOF
620  compile_object
621}
622
623write_c_skeleton() {
624    cat > $TMPC <<EOF
625int main(void) { return 0; }
626EOF
627}
628
629if check_define __linux__ ; then
630  targetos="Linux"
631elif check_define _WIN32 ; then
632  targetos='MINGW32'
633elif check_define __OpenBSD__ ; then
634  targetos='OpenBSD'
635elif check_define __sun__ ; then
636  targetos='SunOS'
637elif check_define __HAIKU__ ; then
638  targetos='Haiku'
639elif check_define __FreeBSD__ ; then
640  targetos='FreeBSD'
641elif check_define __FreeBSD_kernel__ && check_define __GLIBC__; then
642  targetos='GNU/kFreeBSD'
643elif check_define __DragonFly__ ; then
644  targetos='DragonFly'
645elif check_define __NetBSD__; then
646  targetos='NetBSD'
647elif check_define __APPLE__; then
648  targetos='Darwin'
649else
650  # This is a fatal error, but don't report it yet, because we
651  # might be going to just print the --help text, or it might
652  # be the result of a missing compiler.
653  targetos='bogus'
654  bogus_os='yes'
655fi
656
657# Some host OSes need non-standard checks for which CPU to use.
658# Note that these checks are broken for cross-compilation: if you're
659# cross-compiling to one of these OSes then you'll need to specify
660# the correct CPU with the --cpu option.
661case $targetos in
662Darwin)
663  # on Leopard most of the system is 32-bit, so we have to ask the kernel if we can
664  # run 64-bit userspace code.
665  # If the user didn't specify a CPU explicitly and the kernel says this is
666  # 64 bit hw, then assume x86_64. Otherwise fall through to the usual detection code.
667  if test -z "$cpu" && test "$(sysctl -n hw.optional.x86_64)" = "1"; then
668    cpu="x86_64"
669  fi
670  ;;
671SunOS)
672  # $(uname -m) returns i86pc even on an x86_64 box, so default based on isainfo
673  if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then
674    cpu="x86_64"
675  fi
676esac
677
678if test ! -z "$cpu" ; then
679  # command line argument
680  :
681elif check_define __i386__ ; then
682  cpu="i386"
683elif check_define __x86_64__ ; then
684  if check_define __ILP32__ ; then
685    cpu="x32"
686  else
687    cpu="x86_64"
688  fi
689elif check_define __sparc__ ; then
690  if check_define __arch64__ ; then
691    cpu="sparc64"
692  else
693    cpu="sparc"
694  fi
695elif check_define _ARCH_PPC ; then
696  if check_define _ARCH_PPC64 ; then
697    if check_define _LITTLE_ENDIAN ; then
698      cpu="ppc64le"
699    else
700      cpu="ppc64"
701    fi
702  else
703    cpu="ppc"
704  fi
705elif check_define __mips__ ; then
706  cpu="mips"
707elif check_define __s390__ ; then
708  if check_define __s390x__ ; then
709    cpu="s390x"
710  else
711    cpu="s390"
712  fi
713elif check_define __riscv ; then
714  if check_define _LP64 ; then
715    cpu="riscv64"
716  else
717    cpu="riscv32"
718  fi
719elif check_define __arm__ ; then
720  cpu="arm"
721elif check_define __aarch64__ ; then
722  cpu="aarch64"
723else
724  cpu=$(uname -m)
725fi
726
727ARCH=
728# Normalise host CPU name and set ARCH.
729# Note that this case should only have supported host CPUs, not guests.
730case "$cpu" in
731  ppc|ppc64|s390x|sparc64|x32|riscv32|riscv64)
732    supported_cpu="yes"
733  ;;
734  ppc64le)
735    ARCH="ppc64"
736    supported_cpu="yes"
737  ;;
738  i386|i486|i586|i686|i86pc|BePC)
739    cpu="i386"
740    supported_cpu="yes"
741  ;;
742  x86_64|amd64)
743    cpu="x86_64"
744    supported_cpu="yes"
745  ;;
746  armv*b|armv*l|arm)
747    cpu="arm"
748    supported_cpu="yes"
749  ;;
750  aarch64)
751    cpu="aarch64"
752    supported_cpu="yes"
753  ;;
754  mips*)
755    cpu="mips"
756    supported_cpu="yes"
757  ;;
758  sparc|sun4[cdmuv])
759    cpu="sparc"
760    supported_cpu="yes"
761  ;;
762  *)
763    # This will result in either an error or falling back to TCI later
764    ARCH=unknown
765  ;;
766esac
767if test -z "$ARCH"; then
768  ARCH="$cpu"
769fi
770
771# OS specific
772
773# host *BSD for user mode
774HOST_VARIANT_DIR=""
775
776case $targetos in
777MINGW32*)
778  mingw32="yes"
779  hax="yes"
780  vhost_user="no"
781  audio_possible_drivers="dsound sdl"
782  if check_include dsound.h; then
783    audio_drv_list="dsound"
784  else
785    audio_drv_list=""
786  fi
787  supported_os="yes"
788;;
789GNU/kFreeBSD)
790  bsd="yes"
791  audio_drv_list="oss try-sdl"
792  audio_possible_drivers="oss sdl pa"
793;;
794FreeBSD)
795  bsd="yes"
796  make="${MAKE-gmake}"
797  audio_drv_list="oss try-sdl"
798  audio_possible_drivers="oss sdl pa"
799  # needed for kinfo_getvmmap(3) in libutil.h
800  LIBS="-lutil $LIBS"
801  # needed for kinfo_getproc
802  libs_qga="-lutil $libs_qga"
803  netmap=""  # enable netmap autodetect
804  HOST_VARIANT_DIR="freebsd"
805  supported_os="yes"
806;;
807DragonFly)
808  bsd="yes"
809  make="${MAKE-gmake}"
810  audio_drv_list="oss try-sdl"
811  audio_possible_drivers="oss sdl pa"
812  HOST_VARIANT_DIR="dragonfly"
813;;
814NetBSD)
815  bsd="yes"
816  hax="yes"
817  make="${MAKE-gmake}"
818  audio_drv_list="oss try-sdl"
819  audio_possible_drivers="oss sdl"
820  oss_lib="-lossaudio"
821  HOST_VARIANT_DIR="netbsd"
822  supported_os="yes"
823;;
824OpenBSD)
825  bsd="yes"
826  make="${MAKE-gmake}"
827  audio_drv_list="try-sdl"
828  audio_possible_drivers="sdl"
829  HOST_VARIANT_DIR="openbsd"
830  supported_os="yes"
831;;
832Darwin)
833  bsd="yes"
834  darwin="yes"
835  hax="yes"
836  hvf="yes"
837  LDFLAGS_SHARED="-bundle -undefined dynamic_lookup"
838  if [ "$cpu" = "x86_64" ] ; then
839    QEMU_CFLAGS="-arch x86_64 $QEMU_CFLAGS"
840    LDFLAGS="-arch x86_64 $LDFLAGS"
841  fi
842  cocoa="yes"
843  audio_drv_list="coreaudio try-sdl"
844  audio_possible_drivers="coreaudio sdl"
845  LDFLAGS="-framework CoreFoundation -framework IOKit $LDFLAGS"
846  libs_softmmu="-F/System/Library/Frameworks -framework Cocoa -framework IOKit $libs_softmmu"
847  # Disable attempts to use ObjectiveC features in os/object.h since they
848  # won't work when we're compiling with gcc as a C compiler.
849  QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS"
850  HOST_VARIANT_DIR="darwin"
851  supported_os="yes"
852;;
853SunOS)
854  solaris="yes"
855  make="${MAKE-gmake}"
856  install="${INSTALL-ginstall}"
857  smbd="${SMBD-/usr/sfw/sbin/smbd}"
858  if test -f /usr/include/sys/soundcard.h ; then
859    audio_drv_list="oss try-sdl"
860  fi
861  audio_possible_drivers="oss sdl"
862# needed for CMSG_ macros in sys/socket.h
863  QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS"
864# needed for TIOCWIN* defines in termios.h
865  QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
866  QEMU_CFLAGS="-std=gnu99 $QEMU_CFLAGS"
867  solarisnetlibs="-lsocket -lnsl -lresolv"
868  LIBS="$solarisnetlibs $LIBS"
869  libs_qga="$solarisnetlibs $libs_qga"
870;;
871Haiku)
872  haiku="yes"
873  QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS $QEMU_CFLAGS"
874  LIBS="-lposix_error_mapper -lnetwork $LIBS"
875;;
876Linux)
877  audio_drv_list="try-pa oss"
878  audio_possible_drivers="oss alsa sdl pa"
879  linux="yes"
880  linux_user="yes"
881  kvm="yes"
882  QEMU_INCLUDES="-I\$(SRC_PATH)/linux-headers -I$PWD/linux-headers $QEMU_INCLUDES"
883  supported_os="yes"
884  libudev="yes"
885;;
886esac
887
888if [ "$bsd" = "yes" ] ; then
889  if [ "$darwin" != "yes" ] ; then
890    bsd_user="yes"
891  fi
892fi
893
894: ${make=${MAKE-make}}
895: ${install=${INSTALL-install}}
896# We prefer python 3.x. A bare 'python' is traditionally
897# python 2.x, but some distros have it as python 3.x, so
898# we check that before python2
899python=
900for binary in "${PYTHON-python3}" python python2
901do
902    if has "$binary"
903    then
904        python="$binary"
905        break
906    fi
907done
908: ${smbd=${SMBD-/usr/sbin/smbd}}
909
910# Default objcc to clang if available, otherwise use CC
911if has clang; then
912  objcc=clang
913else
914  objcc="$cc"
915fi
916
917if test "$mingw32" = "yes" ; then
918  EXESUF=".exe"
919  DSOSUF=".dll"
920  # MinGW needs -mthreads for TLS and macro _MT.
921  QEMU_CFLAGS="-mthreads $QEMU_CFLAGS"
922  LIBS="-lwinmm -lws2_32 -liphlpapi $LIBS"
923  write_c_skeleton;
924  if compile_prog "" "-liberty" ; then
925    LIBS="-liberty $LIBS"
926  fi
927  prefix="c:/Program Files/QEMU"
928  mandir="\${prefix}"
929  datadir="\${prefix}"
930  qemu_docdir="\${prefix}"
931  bindir="\${prefix}"
932  sysconfdir="\${prefix}"
933  local_statedir=
934  confsuffix=""
935  libs_qga="-lws2_32 -lwinmm -lpowrprof -lwtsapi32 -lwininet -liphlpapi -lnetapi32 $libs_qga"
936fi
937
938werror=""
939
940for opt do
941  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
942  case "$opt" in
943  --help|-h) show_help=yes
944  ;;
945  --version|-V) exec cat $source_path/VERSION
946  ;;
947  --prefix=*) prefix="$optarg"
948  ;;
949  --interp-prefix=*) interp_prefix="$optarg"
950  ;;
951  --cross-prefix=*)
952  ;;
953  --cc=*)
954  ;;
955  --host-cc=*) host_cc="$optarg"
956  ;;
957  --cxx=*)
958  ;;
959  --iasl=*) iasl="$optarg"
960  ;;
961  --objcc=*) objcc="$optarg"
962  ;;
963  --make=*) make="$optarg"
964  ;;
965  --install=*) install="$optarg"
966  ;;
967  --python=*) python="$optarg"
968  ;;
969  --gcov=*) gcov_tool="$optarg"
970  ;;
971  --smbd=*) smbd="$optarg"
972  ;;
973  --extra-cflags=*)
974  ;;
975  --extra-cxxflags=*)
976  ;;
977  --extra-ldflags=*)
978  ;;
979  --enable-debug-info)
980  ;;
981  --disable-debug-info)
982  ;;
983  --cross-cc-*)
984  ;;
985  --enable-modules)
986      modules="yes"
987  ;;
988  --disable-modules)
989      modules="no"
990  ;;
991  --cpu=*)
992  ;;
993  --target-list=*) target_list="$optarg"
994                   if test "$target_list_exclude"; then
995                       error_exit "Can't mix --target-list with --target-list-exclude"
996                   fi
997  ;;
998  --target-list-exclude=*) target_list_exclude="$optarg"
999                   if test "$target_list"; then
1000                       error_exit "Can't mix --target-list-exclude with --target-list"
1001                   fi
1002  ;;
1003  --enable-trace-backends=*) trace_backends="$optarg"
1004  ;;
1005  # XXX: backwards compatibility
1006  --enable-trace-backend=*) trace_backends="$optarg"
1007  ;;
1008  --with-trace-file=*) trace_file="$optarg"
1009  ;;
1010  --with-default-devices) default_devices="yes"
1011  ;;
1012  --without-default-devices) default_devices="no"
1013  ;;
1014  --enable-gprof) gprof="yes"
1015  ;;
1016  --enable-gcov) gcov="yes"
1017  ;;
1018  --static)
1019    static="yes"
1020    LDFLAGS="-static $LDFLAGS"
1021    QEMU_PKG_CONFIG_FLAGS="--static $QEMU_PKG_CONFIG_FLAGS"
1022  ;;
1023  --mandir=*) mandir="$optarg"
1024  ;;
1025  --bindir=*) bindir="$optarg"
1026  ;;
1027  --libdir=*) libdir="$optarg"
1028  ;;
1029  --libexecdir=*) libexecdir="$optarg"
1030  ;;
1031  --includedir=*) includedir="$optarg"
1032  ;;
1033  --datadir=*) datadir="$optarg"
1034  ;;
1035  --with-confsuffix=*) confsuffix="$optarg"
1036  ;;
1037  --docdir=*) qemu_docdir="$optarg"
1038  ;;
1039  --sysconfdir=*) sysconfdir="$optarg"
1040  ;;
1041  --localstatedir=*) local_statedir="$optarg"
1042  ;;
1043  --firmwarepath=*) firmwarepath="$optarg"
1044  ;;
1045  --host=*|--build=*|\
1046  --disable-dependency-tracking|\
1047  --sbindir=*|--sharedstatedir=*|\
1048  --oldincludedir=*|--datarootdir=*|--infodir=*|--localedir=*|\
1049  --htmldir=*|--dvidir=*|--pdfdir=*|--psdir=*)
1050    # These switches are silently ignored, for compatibility with
1051    # autoconf-generated configure scripts. This allows QEMU's
1052    # configure to be used by RPM and similar macros that set
1053    # lots of directory switches by default.
1054  ;;
1055  --disable-sdl) sdl="no"
1056  ;;
1057  --enable-sdl) sdl="yes"
1058  ;;
1059  --disable-sdl-image) sdl_image="no"
1060  ;;
1061  --enable-sdl-image) sdl_image="yes"
1062  ;;
1063  --disable-qom-cast-debug) qom_cast_debug="no"
1064  ;;
1065  --enable-qom-cast-debug) qom_cast_debug="yes"
1066  ;;
1067  --disable-virtfs) virtfs="no"
1068  ;;
1069  --enable-virtfs) virtfs="yes"
1070  ;;
1071  --disable-mpath) mpath="no"
1072  ;;
1073  --enable-mpath) mpath="yes"
1074  ;;
1075  --disable-vnc) vnc="no"
1076  ;;
1077  --enable-vnc) vnc="yes"
1078  ;;
1079  --oss-lib=*) oss_lib="$optarg"
1080  ;;
1081  --audio-drv-list=*) audio_drv_list="$optarg"
1082  ;;
1083  --block-drv-rw-whitelist=*|--block-drv-whitelist=*) block_drv_rw_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
1084  ;;
1085  --block-drv-ro-whitelist=*) block_drv_ro_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
1086  ;;
1087  --enable-debug-tcg) debug_tcg="yes"
1088  ;;
1089  --disable-debug-tcg) debug_tcg="no"
1090  ;;
1091  --enable-debug)
1092      # Enable debugging options that aren't excessively noisy
1093      debug_tcg="yes"
1094      debug_mutex="yes"
1095      debug="yes"
1096      strip_opt="no"
1097      fortify_source="no"
1098  ;;
1099  --enable-sanitizers) sanitizers="yes"
1100  ;;
1101  --disable-sanitizers) sanitizers="no"
1102  ;;
1103  --enable-sparse) sparse="yes"
1104  ;;
1105  --disable-sparse) sparse="no"
1106  ;;
1107  --disable-strip) strip_opt="no"
1108  ;;
1109  --disable-vnc-sasl) vnc_sasl="no"
1110  ;;
1111  --enable-vnc-sasl) vnc_sasl="yes"
1112  ;;
1113  --disable-vnc-jpeg) vnc_jpeg="no"
1114  ;;
1115  --enable-vnc-jpeg) vnc_jpeg="yes"
1116  ;;
1117  --disable-vnc-png) vnc_png="no"
1118  ;;
1119  --enable-vnc-png) vnc_png="yes"
1120  ;;
1121  --disable-slirp) slirp="no"
1122  ;;
1123  --enable-slirp=git) slirp="git"
1124  ;;
1125  --enable-slirp=system) slirp="system"
1126  ;;
1127  --disable-vde) vde="no"
1128  ;;
1129  --enable-vde) vde="yes"
1130  ;;
1131  --disable-netmap) netmap="no"
1132  ;;
1133  --enable-netmap) netmap="yes"
1134  ;;
1135  --disable-xen) xen="no"
1136  ;;
1137  --enable-xen) xen="yes"
1138  ;;
1139  --disable-xen-pci-passthrough) xen_pci_passthrough="no"
1140  ;;
1141  --enable-xen-pci-passthrough) xen_pci_passthrough="yes"
1142  ;;
1143  --disable-brlapi) brlapi="no"
1144  ;;
1145  --enable-brlapi) brlapi="yes"
1146  ;;
1147  --disable-bluez) bluez="no"
1148  ;;
1149  --enable-bluez) bluez="yes"
1150  ;;
1151  --disable-kvm) kvm="no"
1152  ;;
1153  --enable-kvm) kvm="yes"
1154  ;;
1155  --disable-hax) hax="no"
1156  ;;
1157  --enable-hax) hax="yes"
1158  ;;
1159  --disable-hvf) hvf="no"
1160  ;;
1161  --enable-hvf) hvf="yes"
1162  ;;
1163  --disable-whpx) whpx="no"
1164  ;;
1165  --enable-whpx) whpx="yes"
1166  ;;
1167  --disable-tcg-interpreter) tcg_interpreter="no"
1168  ;;
1169  --enable-tcg-interpreter) tcg_interpreter="yes"
1170  ;;
1171  --disable-cap-ng)  cap_ng="no"
1172  ;;
1173  --enable-cap-ng) cap_ng="yes"
1174  ;;
1175  --disable-tcg) tcg="no"
1176  ;;
1177  --enable-tcg) tcg="yes"
1178  ;;
1179  --disable-malloc-trim) malloc_trim="no"
1180  ;;
1181  --enable-malloc-trim) malloc_trim="yes"
1182  ;;
1183  --disable-spice) spice="no"
1184  ;;
1185  --enable-spice) spice="yes"
1186  ;;
1187  --disable-libiscsi) libiscsi="no"
1188  ;;
1189  --enable-libiscsi) libiscsi="yes"
1190  ;;
1191  --disable-libnfs) libnfs="no"
1192  ;;
1193  --enable-libnfs) libnfs="yes"
1194  ;;
1195  --enable-profiler) profiler="yes"
1196  ;;
1197  --disable-cocoa) cocoa="no"
1198  ;;
1199  --enable-cocoa)
1200      cocoa="yes" ;
1201      audio_drv_list="coreaudio $(echo $audio_drv_list | sed s,coreaudio,,g)"
1202  ;;
1203  --disable-system) softmmu="no"
1204  ;;
1205  --enable-system) softmmu="yes"
1206  ;;
1207  --disable-user)
1208      linux_user="no" ;
1209      bsd_user="no" ;
1210  ;;
1211  --enable-user) ;;
1212  --disable-linux-user) linux_user="no"
1213  ;;
1214  --enable-linux-user) linux_user="yes"
1215  ;;
1216  --disable-bsd-user) bsd_user="no"
1217  ;;
1218  --enable-bsd-user) bsd_user="yes"
1219  ;;
1220  --enable-pie) pie="yes"
1221  ;;
1222  --disable-pie) pie="no"
1223  ;;
1224  --enable-werror) werror="yes"
1225  ;;
1226  --disable-werror) werror="no"
1227  ;;
1228  --enable-stack-protector) stack_protector="yes"
1229  ;;
1230  --disable-stack-protector) stack_protector="no"
1231  ;;
1232  --disable-curses) curses="no"
1233  ;;
1234  --enable-curses) curses="yes"
1235  ;;
1236  --disable-iconv) iconv="no"
1237  ;;
1238  --enable-iconv) iconv="yes"
1239  ;;
1240  --disable-curl) curl="no"
1241  ;;
1242  --enable-curl) curl="yes"
1243  ;;
1244  --disable-fdt) fdt="no"
1245  ;;
1246  --enable-fdt) fdt="yes"
1247  ;;
1248  --disable-linux-aio) linux_aio="no"
1249  ;;
1250  --enable-linux-aio) linux_aio="yes"
1251  ;;
1252  --disable-attr) attr="no"
1253  ;;
1254  --enable-attr) attr="yes"
1255  ;;
1256  --disable-membarrier) membarrier="no"
1257  ;;
1258  --enable-membarrier) membarrier="yes"
1259  ;;
1260  --disable-blobs) blobs="no"
1261  ;;
1262  --with-pkgversion=*) pkgversion="$optarg"
1263  ;;
1264  --with-coroutine=*) coroutine="$optarg"
1265  ;;
1266  --disable-coroutine-pool) coroutine_pool="no"
1267  ;;
1268  --enable-coroutine-pool) coroutine_pool="yes"
1269  ;;
1270  --enable-debug-stack-usage) debug_stack_usage="yes"
1271  ;;
1272  --enable-crypto-afalg) crypto_afalg="yes"
1273  ;;
1274  --disable-crypto-afalg) crypto_afalg="no"
1275  ;;
1276  --disable-docs) docs="no"
1277  ;;
1278  --enable-docs) docs="yes"
1279  ;;
1280  --disable-vhost-net) vhost_net="no"
1281  ;;
1282  --enable-vhost-net) vhost_net="yes"
1283  ;;
1284  --disable-vhost-crypto) vhost_crypto="no"
1285  ;;
1286  --enable-vhost-crypto) vhost_crypto="yes"
1287  ;;
1288  --disable-vhost-scsi) vhost_scsi="no"
1289  ;;
1290  --enable-vhost-scsi) vhost_scsi="yes"
1291  ;;
1292  --disable-vhost-vsock) vhost_vsock="no"
1293  ;;
1294  --enable-vhost-vsock) vhost_vsock="yes"
1295  ;;
1296  --disable-opengl) opengl="no"
1297  ;;
1298  --enable-opengl) opengl="yes"
1299  ;;
1300  --disable-rbd) rbd="no"
1301  ;;
1302  --enable-rbd) rbd="yes"
1303  ;;
1304  --disable-xfsctl) xfs="no"
1305  ;;
1306  --enable-xfsctl) xfs="yes"
1307  ;;
1308  --disable-smartcard) smartcard="no"
1309  ;;
1310  --enable-smartcard) smartcard="yes"
1311  ;;
1312  --disable-libusb) libusb="no"
1313  ;;
1314  --enable-libusb) libusb="yes"
1315  ;;
1316  --disable-usb-redir) usb_redir="no"
1317  ;;
1318  --enable-usb-redir) usb_redir="yes"
1319  ;;
1320  --disable-zlib-test) zlib="no"
1321  ;;
1322  --disable-lzo) lzo="no"
1323  ;;
1324  --enable-lzo) lzo="yes"
1325  ;;
1326  --disable-snappy) snappy="no"
1327  ;;
1328  --enable-snappy) snappy="yes"
1329  ;;
1330  --disable-bzip2) bzip2="no"
1331  ;;
1332  --enable-bzip2) bzip2="yes"
1333  ;;
1334  --enable-lzfse) lzfse="yes"
1335  ;;
1336  --disable-lzfse) lzfse="no"
1337  ;;
1338  --enable-guest-agent) guest_agent="yes"
1339  ;;
1340  --disable-guest-agent) guest_agent="no"
1341  ;;
1342  --enable-guest-agent-msi) guest_agent_msi="yes"
1343  ;;
1344  --disable-guest-agent-msi) guest_agent_msi="no"
1345  ;;
1346  --with-vss-sdk) vss_win32_sdk=""
1347  ;;
1348  --with-vss-sdk=*) vss_win32_sdk="$optarg"
1349  ;;
1350  --without-vss-sdk) vss_win32_sdk="no"
1351  ;;
1352  --with-win-sdk) win_sdk=""
1353  ;;
1354  --with-win-sdk=*) win_sdk="$optarg"
1355  ;;
1356  --without-win-sdk) win_sdk="no"
1357  ;;
1358  --enable-tools) want_tools="yes"
1359  ;;
1360  --disable-tools) want_tools="no"
1361  ;;
1362  --enable-seccomp) seccomp="yes"
1363  ;;
1364  --disable-seccomp) seccomp="no"
1365  ;;
1366  --disable-glusterfs) glusterfs="no"
1367  ;;
1368  --disable-avx2) avx2_opt="no"
1369  ;;
1370  --enable-avx2) avx2_opt="yes"
1371  ;;
1372  --enable-glusterfs) glusterfs="yes"
1373  ;;
1374  --disable-virtio-blk-data-plane|--enable-virtio-blk-data-plane)
1375      echo "$0: $opt is obsolete, virtio-blk data-plane is always on" >&2
1376  ;;
1377  --enable-vhdx|--disable-vhdx)
1378      echo "$0: $opt is obsolete, VHDX driver is always built" >&2
1379  ;;
1380  --enable-uuid|--disable-uuid)
1381      echo "$0: $opt is obsolete, UUID support is always built" >&2
1382  ;;
1383  --disable-gtk) gtk="no"
1384  ;;
1385  --enable-gtk) gtk="yes"
1386  ;;
1387  --tls-priority=*) tls_priority="$optarg"
1388  ;;
1389  --disable-gnutls) gnutls="no"
1390  ;;
1391  --enable-gnutls) gnutls="yes"
1392  ;;
1393  --disable-nettle) nettle="no"
1394  ;;
1395  --enable-nettle) nettle="yes"
1396  ;;
1397  --disable-gcrypt) gcrypt="no"
1398  ;;
1399  --enable-gcrypt) gcrypt="yes"
1400  ;;
1401  --disable-auth-pam) auth_pam="no"
1402  ;;
1403  --enable-auth-pam) auth_pam="yes"
1404  ;;
1405  --enable-rdma) rdma="yes"
1406  ;;
1407  --disable-rdma) rdma="no"
1408  ;;
1409  --enable-pvrdma) pvrdma="yes"
1410  ;;
1411  --disable-pvrdma) pvrdma="no"
1412  ;;
1413  --disable-vte) vte="no"
1414  ;;
1415  --enable-vte) vte="yes"
1416  ;;
1417  --disable-virglrenderer) virglrenderer="no"
1418  ;;
1419  --enable-virglrenderer) virglrenderer="yes"
1420  ;;
1421  --disable-tpm) tpm="no"
1422  ;;
1423  --enable-tpm) tpm="yes"
1424  ;;
1425  --disable-libssh) libssh="no"
1426  ;;
1427  --enable-libssh) libssh="yes"
1428  ;;
1429  --disable-live-block-migration) live_block_migration="no"
1430  ;;
1431  --enable-live-block-migration) live_block_migration="yes"
1432  ;;
1433  --disable-numa) numa="no"
1434  ;;
1435  --enable-numa) numa="yes"
1436  ;;
1437  --disable-libxml2) libxml2="no"
1438  ;;
1439  --enable-libxml2) libxml2="yes"
1440  ;;
1441  --disable-tcmalloc) tcmalloc="no"
1442  ;;
1443  --enable-tcmalloc) tcmalloc="yes"
1444  ;;
1445  --disable-jemalloc) jemalloc="no"
1446  ;;
1447  --enable-jemalloc) jemalloc="yes"
1448  ;;
1449  --disable-replication) replication="no"
1450  ;;
1451  --enable-replication) replication="yes"
1452  ;;
1453  --disable-vxhs) vxhs="no"
1454  ;;
1455  --enable-vxhs) vxhs="yes"
1456  ;;
1457  --disable-bochs) bochs="no"
1458  ;;
1459  --enable-bochs) bochs="yes"
1460  ;;
1461  --disable-cloop) cloop="no"
1462  ;;
1463  --enable-cloop) cloop="yes"
1464  ;;
1465  --disable-dmg) dmg="no"
1466  ;;
1467  --enable-dmg) dmg="yes"
1468  ;;
1469  --disable-qcow1) qcow1="no"
1470  ;;
1471  --enable-qcow1) qcow1="yes"
1472  ;;
1473  --disable-vdi) vdi="no"
1474  ;;
1475  --enable-vdi) vdi="yes"
1476  ;;
1477  --disable-vvfat) vvfat="no"
1478  ;;
1479  --enable-vvfat) vvfat="yes"
1480  ;;
1481  --disable-qed) qed="no"
1482  ;;
1483  --enable-qed) qed="yes"
1484  ;;
1485  --disable-parallels) parallels="no"
1486  ;;
1487  --enable-parallels) parallels="yes"
1488  ;;
1489  --disable-sheepdog) sheepdog="no"
1490  ;;
1491  --enable-sheepdog) sheepdog="yes"
1492  ;;
1493  --disable-vhost-user) vhost_user="no"
1494  ;;
1495  --enable-vhost-user) vhost_user="yes"
1496  ;;
1497  --disable-vhost-kernel) vhost_kernel="no"
1498  ;;
1499  --enable-vhost-kernel) vhost_kernel="yes"
1500  ;;
1501  --disable-capstone) capstone="no"
1502  ;;
1503  --enable-capstone) capstone="yes"
1504  ;;
1505  --enable-capstone=git) capstone="git"
1506  ;;
1507  --enable-capstone=system) capstone="system"
1508  ;;
1509  --with-git=*) git="$optarg"
1510  ;;
1511  --enable-git-update) git_update=yes
1512  ;;
1513  --disable-git-update) git_update=no
1514  ;;
1515  --enable-debug-mutex) debug_mutex=yes
1516  ;;
1517  --disable-debug-mutex) debug_mutex=no
1518  ;;
1519  --enable-libpmem) libpmem=yes
1520  ;;
1521  --disable-libpmem) libpmem=no
1522  ;;
1523  --enable-xkbcommon) xkbcommon=yes
1524  ;;
1525  --disable-xkbcommon) xkbcommon=no
1526  ;;
1527  *)
1528      echo "ERROR: unknown option $opt"
1529      echo "Try '$0 --help' for more information"
1530      exit 1
1531  ;;
1532  esac
1533done
1534
1535case "$cpu" in
1536    ppc)
1537           CPU_CFLAGS="-m32"
1538           LDFLAGS="-m32 $LDFLAGS"
1539           ;;
1540    ppc64)
1541           CPU_CFLAGS="-m64"
1542           LDFLAGS="-m64 $LDFLAGS"
1543           ;;
1544    sparc)
1545           CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc"
1546           LDFLAGS="-m32 -mv8plus $LDFLAGS"
1547           ;;
1548    sparc64)
1549           CPU_CFLAGS="-m64 -mcpu=ultrasparc"
1550           LDFLAGS="-m64 $LDFLAGS"
1551           ;;
1552    s390)
1553           CPU_CFLAGS="-m31"
1554           LDFLAGS="-m31 $LDFLAGS"
1555           ;;
1556    s390x)
1557           CPU_CFLAGS="-m64"
1558           LDFLAGS="-m64 $LDFLAGS"
1559           ;;
1560    i386)
1561           CPU_CFLAGS="-m32"
1562           LDFLAGS="-m32 $LDFLAGS"
1563           ;;
1564    x86_64)
1565           # ??? Only extremely old AMD cpus do not have cmpxchg16b.
1566           # If we truly care, we should simply detect this case at
1567           # runtime and generate the fallback to serial emulation.
1568           CPU_CFLAGS="-m64 -mcx16"
1569           LDFLAGS="-m64 $LDFLAGS"
1570           ;;
1571    x32)
1572           CPU_CFLAGS="-mx32"
1573           LDFLAGS="-mx32 $LDFLAGS"
1574           ;;
1575    # No special flags required for other host CPUs
1576esac
1577
1578eval "cross_cc_${cpu}=\$host_cc"
1579cross_cc_vars="$cross_cc_vars cross_cc_${cpu}"
1580QEMU_CFLAGS="$CPU_CFLAGS $QEMU_CFLAGS"
1581
1582# For user-mode emulation the host arch has to be one we explicitly
1583# support, even if we're using TCI.
1584if [ "$ARCH" = "unknown" ]; then
1585  bsd_user="no"
1586  linux_user="no"
1587fi
1588
1589default_target_list=""
1590
1591mak_wilds=""
1592
1593if [ "$softmmu" = "yes" ]; then
1594    mak_wilds="${mak_wilds} $source_path/default-configs/*-softmmu.mak"
1595fi
1596if [ "$linux_user" = "yes" ]; then
1597    mak_wilds="${mak_wilds} $source_path/default-configs/*-linux-user.mak"
1598fi
1599if [ "$bsd_user" = "yes" ]; then
1600    mak_wilds="${mak_wilds} $source_path/default-configs/*-bsd-user.mak"
1601fi
1602
1603if test -z "$target_list_exclude"; then
1604    for config in $mak_wilds; do
1605        default_target_list="${default_target_list} $(basename "$config" .mak)"
1606    done
1607else
1608    exclude_list=$(echo "$target_list_exclude" | sed -e 's/,/ /g')
1609    for config in $mak_wilds; do
1610        target="$(basename "$config" .mak)"
1611        exclude="no"
1612        for excl in $exclude_list; do
1613            if test "$excl" = "$target"; then
1614                exclude="yes"
1615                break;
1616            fi
1617        done
1618        if test "$exclude" = "no"; then
1619            default_target_list="${default_target_list} $target"
1620        fi
1621    done
1622fi
1623
1624# Enumerate public trace backends for --help output
1625trace_backend_list=$(echo $(grep -le '^PUBLIC = True$' "$source_path"/scripts/tracetool/backend/*.py | sed -e 's/^.*\/\(.*\)\.py$/\1/'))
1626
1627if test x"$show_help" = x"yes" ; then
1628cat << EOF
1629
1630Usage: configure [options]
1631Options: [defaults in brackets after descriptions]
1632
1633Standard options:
1634  --help                   print this message
1635  --prefix=PREFIX          install in PREFIX [$prefix]
1636  --interp-prefix=PREFIX   where to find shared libraries, etc.
1637                           use %M for cpu name [$interp_prefix]
1638  --target-list=LIST       set target list (default: build everything)
1639$(echo Available targets: $default_target_list | \
1640  fold -s -w 53 | sed -e 's/^/                           /')
1641  --target-list-exclude=LIST exclude a set of targets from the default target-list
1642
1643Advanced options (experts only):
1644  --cross-prefix=PREFIX    use PREFIX for compile tools [$cross_prefix]
1645  --cc=CC                  use C compiler CC [$cc]
1646  --iasl=IASL              use ACPI compiler IASL [$iasl]
1647  --host-cc=CC             use C compiler CC [$host_cc] for code run at
1648                           build time
1649  --cxx=CXX                use C++ compiler CXX [$cxx]
1650  --objcc=OBJCC            use Objective-C compiler OBJCC [$objcc]
1651  --extra-cflags=CFLAGS    append extra C compiler flags QEMU_CFLAGS
1652  --extra-cxxflags=CXXFLAGS append extra C++ compiler flags QEMU_CXXFLAGS
1653  --extra-ldflags=LDFLAGS  append extra linker flags LDFLAGS
1654  --cross-cc-ARCH=CC       use compiler when building ARCH guest test cases
1655  --cross-cc-flags-ARCH=   use compiler flags when building ARCH guest tests
1656  --make=MAKE              use specified make [$make]
1657  --install=INSTALL        use specified install [$install]
1658  --python=PYTHON          use specified python [$python]
1659  --smbd=SMBD              use specified smbd [$smbd]
1660  --with-git=GIT           use specified git [$git]
1661  --static                 enable static build [$static]
1662  --mandir=PATH            install man pages in PATH
1663  --datadir=PATH           install firmware in PATH$confsuffix
1664  --docdir=PATH            install documentation in PATH$confsuffix
1665  --bindir=PATH            install binaries in PATH
1666  --libdir=PATH            install libraries in PATH
1667  --libexecdir=PATH        install helper binaries in PATH
1668  --sysconfdir=PATH        install config in PATH$confsuffix
1669  --localstatedir=PATH     install local state in PATH (set at runtime on win32)
1670  --firmwarepath=PATH      search PATH for firmware files
1671  --with-confsuffix=SUFFIX suffix for QEMU data inside datadir/libdir/sysconfdir [$confsuffix]
1672  --with-pkgversion=VERS   use specified string as sub-version of the package
1673  --enable-debug           enable common debug build options
1674  --enable-sanitizers      enable default sanitizers
1675  --disable-strip          disable stripping binaries
1676  --disable-werror         disable compilation abort on warning
1677  --disable-stack-protector disable compiler-provided stack protection
1678  --audio-drv-list=LIST    set audio drivers list:
1679                           Available drivers: $audio_possible_drivers
1680  --block-drv-whitelist=L  Same as --block-drv-rw-whitelist=L
1681  --block-drv-rw-whitelist=L
1682                           set block driver read-write whitelist
1683                           (affects only QEMU, not qemu-img)
1684  --block-drv-ro-whitelist=L
1685                           set block driver read-only whitelist
1686                           (affects only QEMU, not qemu-img)
1687  --enable-trace-backends=B Set trace backend
1688                           Available backends: $trace_backend_list
1689  --with-trace-file=NAME   Full PATH,NAME of file to store traces
1690                           Default:trace-<pid>
1691  --disable-slirp          disable SLIRP userspace network connectivity
1692  --enable-tcg-interpreter enable TCG with bytecode interpreter (TCI)
1693  --enable-malloc-trim     enable libc malloc_trim() for memory optimization
1694  --oss-lib                path to OSS library
1695  --cpu=CPU                Build for host CPU [$cpu]
1696  --with-coroutine=BACKEND coroutine backend. Supported options:
1697                           ucontext, sigaltstack, windows
1698  --enable-gcov            enable test coverage analysis with gcov
1699  --gcov=GCOV              use specified gcov [$gcov_tool]
1700  --disable-blobs          disable installing provided firmware blobs
1701  --with-vss-sdk=SDK-path  enable Windows VSS support in QEMU Guest Agent
1702  --with-win-sdk=SDK-path  path to Windows Platform SDK (to build VSS .tlb)
1703  --tls-priority           default TLS protocol/cipher priority string
1704  --enable-gprof           QEMU profiling with gprof
1705  --enable-profiler        profiler support
1706  --enable-debug-stack-usage
1707                           track the maximum stack usage of stacks created by qemu_alloc_stack
1708
1709Optional features, enabled with --enable-FEATURE and
1710disabled with --disable-FEATURE, default is enabled if available:
1711
1712  system          all system emulation targets
1713  user            supported user emulation targets
1714  linux-user      all linux usermode emulation targets
1715  bsd-user        all BSD usermode emulation targets
1716  docs            build documentation
1717  guest-agent     build the QEMU Guest Agent
1718  guest-agent-msi build guest agent Windows MSI installation package
1719  pie             Position Independent Executables
1720  modules         modules support (non-Windows)
1721  debug-tcg       TCG debugging (default is disabled)
1722  debug-info      debugging information
1723  sparse          sparse checker
1724
1725  gnutls          GNUTLS cryptography support
1726  nettle          nettle cryptography support
1727  gcrypt          libgcrypt cryptography support
1728  auth-pam        PAM access control
1729  sdl             SDL UI
1730  sdl-image       SDL Image support for icons
1731  gtk             gtk UI
1732  vte             vte support for the gtk UI
1733  curses          curses UI
1734  iconv           font glyph conversion support
1735  vnc             VNC UI support
1736  vnc-sasl        SASL encryption for VNC server
1737  vnc-jpeg        JPEG lossy compression for VNC server
1738  vnc-png         PNG compression for VNC server
1739  cocoa           Cocoa UI (Mac OS X only)
1740  virtfs          VirtFS
1741  mpath           Multipath persistent reservation passthrough
1742  xen             xen backend driver support
1743  xen-pci-passthrough    PCI passthrough support for Xen
1744  brlapi          BrlAPI (Braile)
1745  curl            curl connectivity
1746  membarrier      membarrier system call (for Linux 4.14+ or Windows)
1747  fdt             fdt device tree
1748  bluez           bluez stack connectivity
1749  kvm             KVM acceleration support
1750  hax             HAX acceleration support
1751  hvf             Hypervisor.framework acceleration support
1752  whpx            Windows Hypervisor Platform acceleration support
1753  rdma            Enable RDMA-based migration
1754  pvrdma          Enable PVRDMA support
1755  vde             support for vde network
1756  netmap          support for netmap network
1757  linux-aio       Linux AIO support
1758  cap-ng          libcap-ng support
1759  attr            attr and xattr support
1760  vhost-net       vhost-net kernel acceleration support
1761  vhost-vsock     virtio sockets device support
1762  vhost-scsi      vhost-scsi kernel target support
1763  vhost-crypto    vhost-user-crypto backend support
1764  vhost-kernel    vhost kernel backend support
1765  vhost-user      vhost-user backend support
1766  spice           spice
1767  rbd             rados block device (rbd)
1768  libiscsi        iscsi support
1769  libnfs          nfs support
1770  smartcard       smartcard support (libcacard)
1771  libusb          libusb (for usb passthrough)
1772  live-block-migration   Block migration in the main migration stream
1773  usb-redir       usb network redirection support
1774  lzo             support of lzo compression library
1775  snappy          support of snappy compression library
1776  bzip2           support of bzip2 compression library
1777                  (for reading bzip2-compressed dmg images)
1778  lzfse           support of lzfse compression library
1779                  (for reading lzfse-compressed dmg images)
1780  seccomp         seccomp support
1781  coroutine-pool  coroutine freelist (better performance)
1782  glusterfs       GlusterFS backend
1783  tpm             TPM support
1784  libssh          ssh block device support
1785  numa            libnuma support
1786  libxml2         for Parallels image format
1787  tcmalloc        tcmalloc support
1788  jemalloc        jemalloc support
1789  avx2            AVX2 optimization support
1790  replication     replication support
1791  opengl          opengl support
1792  virglrenderer   virgl rendering support
1793  xfsctl          xfsctl support
1794  qom-cast-debug  cast debugging support
1795  tools           build qemu-io, qemu-nbd and qemu-img tools
1796  vxhs            Veritas HyperScale vDisk backend support
1797  bochs           bochs image format support
1798  cloop           cloop image format support
1799  dmg             dmg image format support
1800  qcow1           qcow v1 image format support
1801  vdi             vdi image format support
1802  vvfat           vvfat image format support
1803  qed             qed image format support
1804  parallels       parallels image format support
1805  sheepdog        sheepdog block driver support
1806  crypto-afalg    Linux AF_ALG crypto backend driver
1807  capstone        capstone disassembler support
1808  debug-mutex     mutex debugging support
1809  libpmem         libpmem support
1810  xkbcommon       xkbcommon support
1811
1812NOTE: The object files are built at the place where configure is launched
1813EOF
1814exit 0
1815fi
1816
1817# Remove old dependency files to make sure that they get properly regenerated
1818rm -f */config-devices.mak.d
1819
1820if test -z "$python"
1821then
1822    error_exit "Python not found. Use --python=/path/to/python"
1823fi
1824
1825# Note that if the Python conditional here evaluates True we will exit
1826# with status 1 which is a shell 'false' value.
1827if ! $python -c 'import sys; sys.exit(sys.version_info < (2,7))'; then
1828  error_exit "Cannot use '$python', Python 2 >= 2.7 or Python 3 is required." \
1829      "Use --python=/path/to/python to specify a supported Python."
1830fi
1831
1832# Preserve python version since some functionality is dependent on it
1833python_version=$($python -c 'import sys; print("%d.%d.%d" % (sys.version_info[0], sys.version_info[1], sys.version_info[2]))' 2>/dev/null)
1834
1835# Suppress writing compiled files
1836python="$python -B"
1837
1838# Check that the C compiler works. Doing this here before testing
1839# the host CPU ensures that we had a valid CC to autodetect the
1840# $cpu var (and we should bail right here if that's not the case).
1841# It also allows the help message to be printed without a CC.
1842write_c_skeleton;
1843if compile_object ; then
1844  : C compiler works ok
1845else
1846    error_exit "\"$cc\" either does not exist or does not work"
1847fi
1848if ! compile_prog ; then
1849    error_exit "\"$cc\" cannot build an executable (is your linker broken?)"
1850fi
1851
1852# Now we have handled --enable-tcg-interpreter and know we're not just
1853# printing the help message, bail out if the host CPU isn't supported.
1854if test "$ARCH" = "unknown"; then
1855    if test "$tcg_interpreter" = "yes" ; then
1856        echo "Unsupported CPU = $cpu, will use TCG with TCI (experimental)"
1857    else
1858        error_exit "Unsupported CPU = $cpu, try --enable-tcg-interpreter"
1859    fi
1860fi
1861
1862# Consult white-list to determine whether to enable werror
1863# by default.  Only enable by default for git builds
1864if test -z "$werror" ; then
1865    if test -e "$source_path/.git" && \
1866        { test "$linux" = "yes" || test "$mingw32" = "yes"; }; then
1867        werror="yes"
1868    else
1869        werror="no"
1870    fi
1871fi
1872
1873if test "$bogus_os" = "yes"; then
1874    # Now that we know that we're not printing the help and that
1875    # the compiler works (so the results of the check_defines we used
1876    # to identify the OS are reliable), if we didn't recognize the
1877    # host OS we should stop now.
1878    error_exit "Unrecognized host OS (uname -s reports '$(uname -s)')"
1879fi
1880
1881# Check whether the compiler matches our minimum requirements:
1882cat > $TMPC << EOF
1883#if defined(__clang_major__) && defined(__clang_minor__)
1884# ifdef __apple_build_version__
1885#  if __clang_major__ < 5 || (__clang_major__ == 5 && __clang_minor__ < 1)
1886#   error You need at least XCode Clang v5.1 to compile QEMU
1887#  endif
1888# else
1889#  if __clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ < 4)
1890#   error You need at least Clang v3.4 to compile QEMU
1891#  endif
1892# endif
1893#elif defined(__GNUC__) && defined(__GNUC_MINOR__)
1894# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8)
1895#  error You need at least GCC v4.8 to compile QEMU
1896# endif
1897#else
1898# error You either need GCC or Clang to compiler QEMU
1899#endif
1900int main (void) { return 0; }
1901EOF
1902if ! compile_prog "" "" ; then
1903    error_exit "You need at least GCC v4.8 or Clang v3.4 (or XCode Clang v5.1)"
1904fi
1905
1906gcc_flags="-Wold-style-declaration -Wold-style-definition -Wtype-limits"
1907gcc_flags="-Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers $gcc_flags"
1908gcc_flags="-Wno-missing-include-dirs -Wempty-body -Wnested-externs $gcc_flags"
1909gcc_flags="-Wendif-labels -Wno-shift-negative-value $gcc_flags"
1910gcc_flags="-Wno-initializer-overrides -Wexpansion-to-defined $gcc_flags"
1911gcc_flags="-Wno-string-plus-int -Wno-typedef-redefinition $gcc_flags"
1912# Note that we do not add -Werror to gcc_flags here, because that would
1913# enable it for all configure tests. If a configure test failed due
1914# to -Werror this would just silently disable some features,
1915# so it's too error prone.
1916
1917cc_has_warning_flag() {
1918    write_c_skeleton;
1919
1920    # Use the positive sense of the flag when testing for -Wno-wombat
1921    # support (gcc will happily accept the -Wno- form of unknown
1922    # warning options).
1923    optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
1924    compile_prog "-Werror $optflag" ""
1925}
1926
1927for flag in $gcc_flags; do
1928    if cc_has_warning_flag $flag ; then
1929        QEMU_CFLAGS="$QEMU_CFLAGS $flag"
1930    fi
1931done
1932
1933if test "$stack_protector" != "no"; then
1934  cat > $TMPC << EOF
1935int main(int argc, char *argv[])
1936{
1937    char arr[64], *p = arr, *c = argv[0];
1938    while (*c) {
1939        *p++ = *c++;
1940    }
1941    return 0;
1942}
1943EOF
1944  gcc_flags="-fstack-protector-strong -fstack-protector-all"
1945  sp_on=0
1946  for flag in $gcc_flags; do
1947    # We need to check both a compile and a link, since some compiler
1948    # setups fail only on a .c->.o compile and some only at link time
1949    if do_cc $QEMU_CFLAGS -Werror $flag -c -o $TMPO $TMPC &&
1950       compile_prog "-Werror $flag" ""; then
1951      QEMU_CFLAGS="$QEMU_CFLAGS $flag"
1952      sp_on=1
1953      break
1954    fi
1955  done
1956  if test "$stack_protector" = yes; then
1957    if test $sp_on = 0; then
1958      error_exit "Stack protector not supported"
1959    fi
1960  fi
1961fi
1962
1963# Disable -Wmissing-braces on older compilers that warn even for
1964# the "universal" C zero initializer {0}.
1965cat > $TMPC << EOF
1966struct {
1967  int a[2];
1968} x = {0};
1969EOF
1970if compile_object "-Werror" "" ; then
1971  :
1972else
1973  QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces"
1974fi
1975
1976# Our module code doesn't support Windows
1977if test "$modules" = "yes" && test "$mingw32" = "yes" ; then
1978  error_exit "Modules are not available for Windows"
1979fi
1980
1981# Static linking is not possible with modules or PIE
1982if test "$static" = "yes" ; then
1983  if test "$modules" = "yes" ; then
1984    error_exit "static and modules are mutually incompatible"
1985  fi
1986  if test "$pie" = "yes" ; then
1987    error_exit "static and pie are mutually incompatible"
1988  else
1989    pie="no"
1990  fi
1991fi
1992
1993# Unconditional check for compiler __thread support
1994  cat > $TMPC << EOF
1995static __thread int tls_var;
1996int main(void) { return tls_var; }
1997EOF
1998
1999if ! compile_prog "-Werror" "" ; then
2000    error_exit "Your compiler does not support the __thread specifier for " \
2001	"Thread-Local Storage (TLS). Please upgrade to a version that does."
2002fi
2003
2004if test "$pie" = ""; then
2005  case "$cpu-$targetos" in
2006    i386-Linux|x86_64-Linux|x32-Linux|i386-OpenBSD|x86_64-OpenBSD)
2007      ;;
2008    *)
2009      pie="no"
2010      ;;
2011  esac
2012fi
2013
2014if test "$pie" != "no" ; then
2015  cat > $TMPC << EOF
2016
2017#ifdef __linux__
2018#  define THREAD __thread
2019#else
2020#  define THREAD
2021#endif
2022
2023static THREAD int tls_var;
2024
2025int main(void) { return tls_var; }
2026
2027EOF
2028  # check we support --no-pie first...
2029  if compile_prog "-Werror -fno-pie" "-no-pie"; then
2030    CFLAGS_NOPIE="-fno-pie"
2031    LDFLAGS_NOPIE="-nopie"
2032  fi
2033
2034  if compile_prog "-fPIE -DPIE" "-pie"; then
2035    QEMU_CFLAGS="-fPIE -DPIE $QEMU_CFLAGS"
2036    LDFLAGS="-pie $LDFLAGS"
2037    pie="yes"
2038    if compile_prog "" "-Wl,-z,relro -Wl,-z,now" ; then
2039      LDFLAGS="-Wl,-z,relro -Wl,-z,now $LDFLAGS"
2040    fi
2041  else
2042    if test "$pie" = "yes"; then
2043      error_exit "PIE not available due to missing toolchain support"
2044    else
2045      echo "Disabling PIE due to missing toolchain support"
2046      pie="no"
2047    fi
2048  fi
2049fi
2050
2051##########################################
2052# __sync_fetch_and_and requires at least -march=i486. Many toolchains
2053# use i686 as default anyway, but for those that don't, an explicit
2054# specification is necessary
2055
2056if test "$cpu" = "i386"; then
2057  cat > $TMPC << EOF
2058static int sfaa(int *ptr)
2059{
2060  return __sync_fetch_and_and(ptr, 0);
2061}
2062
2063int main(void)
2064{
2065  int val = 42;
2066  val = __sync_val_compare_and_swap(&val, 0, 1);
2067  sfaa(&val);
2068  return val;
2069}
2070EOF
2071  if ! compile_prog "" "" ; then
2072    QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS"
2073  fi
2074fi
2075
2076#########################################
2077# Solaris specific configure tool chain decisions
2078
2079if test "$solaris" = "yes" ; then
2080  if has $install; then
2081    :
2082  else
2083    error_exit "Solaris install program not found. Use --install=/usr/ucb/install or" \
2084        "install fileutils from www.blastwave.org using pkg-get -i fileutils" \
2085        "to get ginstall which is used by default (which lives in /opt/csw/bin)"
2086  fi
2087  if test "$(path_of $install)" = "/usr/sbin/install" ; then
2088    error_exit "Solaris /usr/sbin/install is not an appropriate install program." \
2089        "try ginstall from the GNU fileutils available from www.blastwave.org" \
2090        "using pkg-get -i fileutils, or use --install=/usr/ucb/install"
2091  fi
2092  if has ar; then
2093    :
2094  else
2095    if test -f /usr/ccs/bin/ar ; then
2096      error_exit "No path includes ar" \
2097          "Add /usr/ccs/bin to your path and rerun configure"
2098    fi
2099    error_exit "No path includes ar"
2100  fi
2101fi
2102
2103if test -z "${target_list+xxx}" ; then
2104    for target in $default_target_list; do
2105        supported_target $target 2>/dev/null && \
2106            target_list="$target_list $target"
2107    done
2108    target_list="${target_list# }"
2109else
2110    target_list=$(echo "$target_list" | sed -e 's/,/ /g')
2111    for target in $target_list; do
2112        # Check that we recognised the target name; this allows a more
2113        # friendly error message than if we let it fall through.
2114        case " $default_target_list " in
2115            *" $target "*)
2116                ;;
2117            *)
2118                error_exit "Unknown target name '$target'"
2119                ;;
2120        esac
2121        supported_target $target || exit 1
2122    done
2123fi
2124
2125# see if system emulation was really requested
2126case " $target_list " in
2127  *"-softmmu "*) softmmu=yes
2128  ;;
2129  *) softmmu=no
2130  ;;
2131esac
2132
2133feature_not_found() {
2134  feature=$1
2135  remedy=$2
2136
2137  error_exit "User requested feature $feature" \
2138      "configure was not able to find it." \
2139      "$remedy"
2140}
2141
2142# ---
2143# big/little endian test
2144cat > $TMPC << EOF
2145short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, };
2146short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, };
2147extern int foo(short *, short *);
2148int main(int argc, char *argv[]) {
2149    return foo(big_endian, little_endian);
2150}
2151EOF
2152
2153if compile_object ; then
2154    if strings -a $TMPO | grep -q BiGeNdIaN ; then
2155        bigendian="yes"
2156    elif strings -a $TMPO | grep -q LiTtLeEnDiAn ; then
2157        bigendian="no"
2158    else
2159        echo big/little test failed
2160    fi
2161else
2162    echo big/little test failed
2163fi
2164
2165##########################################
2166# cocoa implies not SDL or GTK
2167# (the cocoa UI code currently assumes it is always the active UI
2168# and doesn't interact well with other UI frontend code)
2169if test "$cocoa" = "yes"; then
2170    if test "$sdl" = "yes"; then
2171        error_exit "Cocoa and SDL UIs cannot both be enabled at once"
2172    fi
2173    if test "$gtk" = "yes"; then
2174        error_exit "Cocoa and GTK UIs cannot both be enabled at once"
2175    fi
2176    gtk=no
2177    sdl=no
2178fi
2179
2180# Some versions of Mac OS X incorrectly define SIZE_MAX
2181cat > $TMPC << EOF
2182#include <stdint.h>
2183#include <stdio.h>
2184int main(int argc, char *argv[]) {
2185    return printf("%zu", SIZE_MAX);
2186}
2187EOF
2188have_broken_size_max=no
2189if ! compile_object -Werror ; then
2190    have_broken_size_max=yes
2191fi
2192
2193##########################################
2194# L2TPV3 probe
2195
2196cat > $TMPC <<EOF
2197#include <sys/socket.h>
2198#include <linux/ip.h>
2199int main(void) { return sizeof(struct mmsghdr); }
2200EOF
2201if compile_prog "" "" ; then
2202  l2tpv3=yes
2203else
2204  l2tpv3=no
2205fi
2206
2207#########################################
2208# vhost interdependencies and host support
2209
2210# vhost backends
2211test "$vhost_user" = "" && vhost_user=yes
2212if test "$vhost_user" = "yes" && test "$mingw32" = "yes"; then
2213  error_exit "vhost-user isn't available on win32"
2214fi
2215test "$vhost_kernel" = "" && vhost_kernel=$linux
2216if test "$vhost_kernel" = "yes" && test "$linux" != "yes"; then
2217  error_exit "vhost-kernel is only available on Linux"
2218fi
2219
2220# vhost-kernel devices
2221test "$vhost_scsi" = "" && vhost_scsi=$vhost_kernel
2222if test "$vhost_scsi" = "yes" && test "$vhost_kernel" != "yes"; then
2223  error_exit "--enable-vhost-scsi requires --enable-vhost-kernel"
2224fi
2225test "$vhost_vsock" = "" && vhost_vsock=$vhost_kernel
2226if test "$vhost_vsock" = "yes" && test "$vhost_kernel" != "yes"; then
2227  error_exit "--enable-vhost-vsock requires --enable-vhost-kernel"
2228fi
2229
2230# vhost-user backends
2231test "$vhost_net_user" = "" && vhost_net_user=$vhost_user
2232if test "$vhost_net_user" = "yes" && test "$vhost_user" = "no"; then
2233  error_exit "--enable-vhost-net-user requires --enable-vhost-user"
2234fi
2235test "$vhost_crypto" = "" && vhost_crypto=$vhost_user
2236if test "$vhost_crypto" = "yes" && test "$vhost_user" = "no"; then
2237  error_exit "--enable-vhost-crypto requires --enable-vhost-user"
2238fi
2239
2240# OR the vhost-kernel and vhost-user values for simplicity
2241if test "$vhost_net" = ""; then
2242  test "$vhost_net_user" = "yes" && vhost_net=yes
2243  test "$vhost_kernel" = "yes" && vhost_net=yes
2244fi
2245
2246##########################################
2247# MinGW / Mingw-w64 localtime_r/gmtime_r check
2248
2249if test "$mingw32" = "yes"; then
2250    # Some versions of MinGW / Mingw-w64 lack localtime_r
2251    # and gmtime_r entirely.
2252    #
2253    # Some versions of Mingw-w64 define a macro for
2254    # localtime_r/gmtime_r.
2255    #
2256    # Some versions of Mingw-w64 will define functions
2257    # for localtime_r/gmtime_r, but only if you have
2258    # _POSIX_THREAD_SAFE_FUNCTIONS defined. For fun
2259    # though, unistd.h and pthread.h both define
2260    # that for you.
2261    #
2262    # So this #undef localtime_r and #include <unistd.h>
2263    # are not in fact redundant.
2264cat > $TMPC << EOF
2265#include <unistd.h>
2266#include <time.h>
2267#undef localtime_r
2268int main(void) { localtime_r(NULL, NULL); return 0; }
2269EOF
2270    if compile_prog "" "" ; then
2271        localtime_r="yes"
2272    else
2273        localtime_r="no"
2274    fi
2275fi
2276
2277##########################################
2278# pkg-config probe
2279
2280if ! has "$pkg_config_exe"; then
2281  error_exit "pkg-config binary '$pkg_config_exe' not found"
2282fi
2283
2284##########################################
2285# NPTL probe
2286
2287if test "$linux_user" = "yes"; then
2288  cat > $TMPC <<EOF
2289#include <sched.h>
2290#include <linux/futex.h>
2291int main(void) {
2292#if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
2293#error bork
2294#endif
2295  return 0;
2296}
2297EOF
2298  if ! compile_object ; then
2299    feature_not_found "nptl" "Install glibc and linux kernel headers."
2300  fi
2301fi
2302
2303##########################################
2304# lzo check
2305
2306if test "$lzo" != "no" ; then
2307    cat > $TMPC << EOF
2308#include <lzo/lzo1x.h>
2309int main(void) { lzo_version(); return 0; }
2310EOF
2311    if compile_prog "" "-llzo2" ; then
2312        libs_softmmu="$libs_softmmu -llzo2"
2313        lzo="yes"
2314    else
2315        if test "$lzo" = "yes"; then
2316            feature_not_found "liblzo2" "Install liblzo2 devel"
2317        fi
2318        lzo="no"
2319    fi
2320fi
2321
2322##########################################
2323# snappy check
2324
2325if test "$snappy" != "no" ; then
2326    cat > $TMPC << EOF
2327#include <snappy-c.h>
2328int main(void) { snappy_max_compressed_length(4096); return 0; }
2329EOF
2330    if compile_prog "" "-lsnappy" ; then
2331        libs_softmmu="$libs_softmmu -lsnappy"
2332        snappy="yes"
2333    else
2334        if test "$snappy" = "yes"; then
2335            feature_not_found "libsnappy" "Install libsnappy devel"
2336        fi
2337        snappy="no"
2338    fi
2339fi
2340
2341##########################################
2342# bzip2 check
2343
2344if test "$bzip2" != "no" ; then
2345    cat > $TMPC << EOF
2346#include <bzlib.h>
2347int main(void) { BZ2_bzlibVersion(); return 0; }
2348EOF
2349    if compile_prog "" "-lbz2" ; then
2350        bzip2="yes"
2351    else
2352        if test "$bzip2" = "yes"; then
2353            feature_not_found "libbzip2" "Install libbzip2 devel"
2354        fi
2355        bzip2="no"
2356    fi
2357fi
2358
2359##########################################
2360# lzfse check
2361
2362if test "$lzfse" != "no" ; then
2363    cat > $TMPC << EOF
2364#include <lzfse.h>
2365int main(void) { lzfse_decode_scratch_size(); return 0; }
2366EOF
2367    if compile_prog "" "-llzfse" ; then
2368        lzfse="yes"
2369    else
2370        if test "$lzfse" = "yes"; then
2371            feature_not_found "lzfse" "Install lzfse devel"
2372        fi
2373        lzfse="no"
2374    fi
2375fi
2376
2377##########################################
2378# libseccomp check
2379
2380if test "$seccomp" != "no" ; then
2381    libseccomp_minver="2.3.0"
2382    if $pkg_config --atleast-version=$libseccomp_minver libseccomp ; then
2383        seccomp_cflags="$($pkg_config --cflags libseccomp)"
2384        seccomp_libs="$($pkg_config --libs libseccomp)"
2385        seccomp="yes"
2386    else
2387        if test "$seccomp" = "yes" ; then
2388            feature_not_found "libseccomp" \
2389                 "Install libseccomp devel >= $libseccomp_minver"
2390        fi
2391        seccomp="no"
2392    fi
2393fi
2394##########################################
2395# xen probe
2396
2397if test "$xen" != "no" ; then
2398  # Check whether Xen library path is specified via --extra-ldflags to avoid
2399  # overriding this setting with pkg-config output. If not, try pkg-config
2400  # to obtain all needed flags.
2401
2402  if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
2403     $pkg_config --exists xencontrol ; then
2404    xen_ctrl_version="$(printf '%d%02d%02d' \
2405      $($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
2406    xen=yes
2407    xen_pc="xencontrol xenstore xenguest xenforeignmemory xengnttab"
2408    xen_pc="$xen_pc xenevtchn xendevicemodel"
2409    if $pkg_config --exists xentoolcore; then
2410      xen_pc="$xen_pc xentoolcore"
2411    fi
2412    QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags $xen_pc)"
2413    libs_softmmu="$($pkg_config --libs $xen_pc) $libs_softmmu"
2414  else
2415
2416    xen_libs="-lxenstore -lxenctrl -lxenguest"
2417    xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
2418
2419    # First we test whether Xen headers and libraries are available.
2420    # If no, we are done and there is no Xen support.
2421    # If yes, more tests are run to detect the Xen version.
2422
2423    # Xen (any)
2424    cat > $TMPC <<EOF
2425#include <xenctrl.h>
2426int main(void) {
2427  return 0;
2428}
2429EOF
2430    if ! compile_prog "" "$xen_libs" ; then
2431      # Xen not found
2432      if test "$xen" = "yes" ; then
2433        feature_not_found "xen" "Install xen devel"
2434      fi
2435      xen=no
2436
2437    # Xen unstable
2438    elif
2439        cat > $TMPC <<EOF &&
2440#undef XC_WANT_COMPAT_DEVICEMODEL_API
2441#define __XEN_TOOLS__
2442#include <xendevicemodel.h>
2443#include <xenforeignmemory.h>
2444int main(void) {
2445  xendevicemodel_handle *xd;
2446  xenforeignmemory_handle *xfmem;
2447
2448  xd = xendevicemodel_open(0, 0);
2449  xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
2450
2451  xfmem = xenforeignmemory_open(0, 0);
2452  xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
2453
2454  return 0;
2455}
2456EOF
2457        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2458      then
2459      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2460      xen_ctrl_version=41100
2461      xen=yes
2462    elif
2463        cat > $TMPC <<EOF &&
2464#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2465#include <xenforeignmemory.h>
2466#include <xentoolcore.h>
2467int main(void) {
2468  xenforeignmemory_handle *xfmem;
2469
2470  xfmem = xenforeignmemory_open(0, 0);
2471  xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
2472  xentoolcore_restrict_all(0);
2473
2474  return 0;
2475}
2476EOF
2477        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2478      then
2479      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2480      xen_ctrl_version=41000
2481      xen=yes
2482    elif
2483        cat > $TMPC <<EOF &&
2484#undef XC_WANT_COMPAT_DEVICEMODEL_API
2485#define __XEN_TOOLS__
2486#include <xendevicemodel.h>
2487int main(void) {
2488  xendevicemodel_handle *xd;
2489
2490  xd = xendevicemodel_open(0, 0);
2491  xendevicemodel_close(xd);
2492
2493  return 0;
2494}
2495EOF
2496        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
2497      then
2498      xen_stable_libs="-lxendevicemodel $xen_stable_libs"
2499      xen_ctrl_version=40900
2500      xen=yes
2501    elif
2502        cat > $TMPC <<EOF &&
2503/*
2504 * If we have stable libs the we don't want the libxc compat
2505 * layers, regardless of what CFLAGS we may have been given.
2506 *
2507 * Also, check if xengnttab_grant_copy_segment_t is defined and
2508 * grant copy operation is implemented.
2509 */
2510#undef XC_WANT_COMPAT_EVTCHN_API
2511#undef XC_WANT_COMPAT_GNTTAB_API
2512#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2513#include <xenctrl.h>
2514#include <xenstore.h>
2515#include <xenevtchn.h>
2516#include <xengnttab.h>
2517#include <xenforeignmemory.h>
2518#include <stdint.h>
2519#include <xen/hvm/hvm_info_table.h>
2520#if !defined(HVM_MAX_VCPUS)
2521# error HVM_MAX_VCPUS not defined
2522#endif
2523int main(void) {
2524  xc_interface *xc = NULL;
2525  xenforeignmemory_handle *xfmem;
2526  xenevtchn_handle *xe;
2527  xengnttab_handle *xg;
2528  xengnttab_grant_copy_segment_t* seg = NULL;
2529
2530  xs_daemon_open();
2531
2532  xc = xc_interface_open(0, 0, 0);
2533  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2534  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2535  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2536  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2537
2538  xfmem = xenforeignmemory_open(0, 0);
2539  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2540
2541  xe = xenevtchn_open(0, 0);
2542  xenevtchn_fd(xe);
2543
2544  xg = xengnttab_open(0, 0);
2545  xengnttab_grant_copy(xg, 0, seg);
2546
2547  return 0;
2548}
2549EOF
2550        compile_prog "" "$xen_libs $xen_stable_libs"
2551      then
2552      xen_ctrl_version=40800
2553      xen=yes
2554    elif
2555        cat > $TMPC <<EOF &&
2556/*
2557 * If we have stable libs the we don't want the libxc compat
2558 * layers, regardless of what CFLAGS we may have been given.
2559 */
2560#undef XC_WANT_COMPAT_EVTCHN_API
2561#undef XC_WANT_COMPAT_GNTTAB_API
2562#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2563#include <xenctrl.h>
2564#include <xenstore.h>
2565#include <xenevtchn.h>
2566#include <xengnttab.h>
2567#include <xenforeignmemory.h>
2568#include <stdint.h>
2569#include <xen/hvm/hvm_info_table.h>
2570#if !defined(HVM_MAX_VCPUS)
2571# error HVM_MAX_VCPUS not defined
2572#endif
2573int main(void) {
2574  xc_interface *xc = NULL;
2575  xenforeignmemory_handle *xfmem;
2576  xenevtchn_handle *xe;
2577  xengnttab_handle *xg;
2578
2579  xs_daemon_open();
2580
2581  xc = xc_interface_open(0, 0, 0);
2582  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2583  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2584  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2585  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2586
2587  xfmem = xenforeignmemory_open(0, 0);
2588  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2589
2590  xe = xenevtchn_open(0, 0);
2591  xenevtchn_fd(xe);
2592
2593  xg = xengnttab_open(0, 0);
2594  xengnttab_map_grant_ref(xg, 0, 0, 0);
2595
2596  return 0;
2597}
2598EOF
2599        compile_prog "" "$xen_libs $xen_stable_libs"
2600      then
2601      xen_ctrl_version=40701
2602      xen=yes
2603
2604    # Xen 4.6
2605    elif
2606        cat > $TMPC <<EOF &&
2607#include <xenctrl.h>
2608#include <xenstore.h>
2609#include <stdint.h>
2610#include <xen/hvm/hvm_info_table.h>
2611#if !defined(HVM_MAX_VCPUS)
2612# error HVM_MAX_VCPUS not defined
2613#endif
2614int main(void) {
2615  xc_interface *xc;
2616  xs_daemon_open();
2617  xc = xc_interface_open(0, 0, 0);
2618  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2619  xc_gnttab_open(NULL, 0);
2620  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2621  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2622  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2623  xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
2624  return 0;
2625}
2626EOF
2627        compile_prog "" "$xen_libs"
2628      then
2629      xen_ctrl_version=40600
2630      xen=yes
2631
2632    # Xen 4.5
2633    elif
2634        cat > $TMPC <<EOF &&
2635#include <xenctrl.h>
2636#include <xenstore.h>
2637#include <stdint.h>
2638#include <xen/hvm/hvm_info_table.h>
2639#if !defined(HVM_MAX_VCPUS)
2640# error HVM_MAX_VCPUS not defined
2641#endif
2642int main(void) {
2643  xc_interface *xc;
2644  xs_daemon_open();
2645  xc = xc_interface_open(0, 0, 0);
2646  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2647  xc_gnttab_open(NULL, 0);
2648  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2649  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2650  xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
2651  return 0;
2652}
2653EOF
2654        compile_prog "" "$xen_libs"
2655      then
2656      xen_ctrl_version=40500
2657      xen=yes
2658
2659    elif
2660        cat > $TMPC <<EOF &&
2661#include <xenctrl.h>
2662#include <xenstore.h>
2663#include <stdint.h>
2664#include <xen/hvm/hvm_info_table.h>
2665#if !defined(HVM_MAX_VCPUS)
2666# error HVM_MAX_VCPUS not defined
2667#endif
2668int main(void) {
2669  xc_interface *xc;
2670  xs_daemon_open();
2671  xc = xc_interface_open(0, 0, 0);
2672  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2673  xc_gnttab_open(NULL, 0);
2674  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2675  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2676  return 0;
2677}
2678EOF
2679        compile_prog "" "$xen_libs"
2680      then
2681      xen_ctrl_version=40200
2682      xen=yes
2683
2684    else
2685      if test "$xen" = "yes" ; then
2686        feature_not_found "xen (unsupported version)" \
2687                          "Install a supported xen (xen 4.2 or newer)"
2688      fi
2689      xen=no
2690    fi
2691
2692    if test "$xen" = yes; then
2693      if test $xen_ctrl_version -ge 40701  ; then
2694        libs_softmmu="$xen_stable_libs $libs_softmmu"
2695      fi
2696      libs_softmmu="$xen_libs $libs_softmmu"
2697    fi
2698  fi
2699fi
2700
2701if test "$xen_pci_passthrough" != "no"; then
2702  if test "$xen" = "yes" && test "$linux" = "yes"; then
2703    xen_pci_passthrough=yes
2704  else
2705    if test "$xen_pci_passthrough" = "yes"; then
2706      error_exit "User requested feature Xen PCI Passthrough" \
2707          " but this feature requires /sys from Linux"
2708    fi
2709    xen_pci_passthrough=no
2710  fi
2711fi
2712
2713##########################################
2714# Windows Hypervisor Platform accelerator (WHPX) check
2715if test "$whpx" != "no" ; then
2716    if check_include "WinHvPlatform.h" && check_include "WinHvEmulation.h"; then
2717        whpx="yes"
2718    else
2719        if test "$whpx" = "yes"; then
2720            feature_not_found "WinHvPlatform" "WinHvEmulation is not installed"
2721        fi
2722        whpx="no"
2723    fi
2724fi
2725
2726##########################################
2727# Sparse probe
2728if test "$sparse" != "no" ; then
2729  if has cgcc; then
2730    sparse=yes
2731  else
2732    if test "$sparse" = "yes" ; then
2733      feature_not_found "sparse" "Install sparse binary"
2734    fi
2735    sparse=no
2736  fi
2737fi
2738
2739##########################################
2740# X11 probe
2741if $pkg_config --exists "x11"; then
2742    have_x11=yes
2743    x11_cflags=$($pkg_config --cflags x11)
2744    x11_libs=$($pkg_config --libs x11)
2745fi
2746
2747##########################################
2748# GTK probe
2749
2750if test "$gtk" != "no"; then
2751    gtkpackage="gtk+-3.0"
2752    gtkx11package="gtk+-x11-3.0"
2753    gtkversion="3.14.0"
2754    if $pkg_config --exists "$gtkpackage >= $gtkversion"; then
2755        gtk_cflags=$($pkg_config --cflags $gtkpackage)
2756        gtk_libs=$($pkg_config --libs $gtkpackage)
2757        gtk_version=$($pkg_config --modversion $gtkpackage)
2758        if $pkg_config --exists "$gtkx11package >= $gtkversion"; then
2759            need_x11=yes
2760            gtk_cflags="$gtk_cflags $x11_cflags"
2761            gtk_libs="$gtk_libs $x11_libs"
2762        fi
2763        gtk="yes"
2764    elif test "$gtk" = "yes"; then
2765        feature_not_found "gtk" "Install gtk3-devel"
2766    else
2767        gtk="no"
2768    fi
2769fi
2770
2771
2772##########################################
2773# GNUTLS probe
2774
2775if test "$gnutls" != "no"; then
2776    pass="no"
2777    if $pkg_config --exists "gnutls >= 3.1.18"; then
2778        gnutls_cflags=$($pkg_config --cflags gnutls)
2779        gnutls_libs=$($pkg_config --libs gnutls)
2780        # Packaging for the static libraries is not always correct.
2781        # At least ubuntu 18.04 ships only shared libraries.
2782        write_c_skeleton
2783        if compile_prog "" "$gnutls_libs" ; then
2784            LIBS="$gnutls_libs $LIBS"
2785            QEMU_CFLAGS="$QEMU_CFLAGS $gnutls_cflags"
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            LIBS="$nettle_libs $LIBS"
2856            QEMU_CFLAGS="$QEMU_CFLAGS $nettle_cflags"
2857            if test -z "$gcrypt"; then
2858               gcrypt="no"
2859            fi
2860            pass="yes"
2861        fi
2862    fi
2863    if test "$pass" = "no" && test "$nettle" = "yes"; then
2864        feature_not_found "nettle" "Install nettle devel >= 2.7.1"
2865    else
2866        nettle="$pass"
2867    fi
2868fi
2869
2870if test "$gcrypt" != "no"; then
2871    pass="no"
2872    if has_libgcrypt; then
2873        gcrypt_cflags=$(libgcrypt-config --cflags)
2874        gcrypt_libs=$(libgcrypt-config --libs)
2875        # Debian has removed -lgpg-error from libgcrypt-config
2876        # as it "spreads unnecessary dependencies" which in
2877        # turn breaks static builds...
2878        if test "$static" = "yes"
2879        then
2880            gcrypt_libs="$gcrypt_libs -lgpg-error"
2881        fi
2882
2883        # Link test to make sure the given libraries work (e.g for static).
2884        write_c_skeleton
2885        if compile_prog "" "$gcrypt_libs" ; then
2886            LIBS="$gcrypt_libs $LIBS"
2887            QEMU_CFLAGS="$QEMU_CFLAGS $gcrypt_cflags"
2888            pass="yes"
2889        fi
2890    fi
2891    if test "$pass" = "yes"; then
2892        gcrypt="yes"
2893        cat > $TMPC << EOF
2894#include <gcrypt.h>
2895int main(void) {
2896  gcry_mac_hd_t handle;
2897  gcry_mac_open(&handle, GCRY_MAC_HMAC_MD5,
2898                GCRY_MAC_FLAG_SECURE, NULL);
2899  return 0;
2900}
2901EOF
2902        if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
2903            gcrypt_hmac=yes
2904        fi
2905    elif test "$gcrypt" = "yes"; then
2906        feature_not_found "gcrypt" "Install gcrypt devel >= 1.5.0"
2907    else
2908        gcrypt="no"
2909    fi
2910fi
2911
2912
2913if test "$gcrypt" = "yes" && test "$nettle" = "yes"
2914then
2915    error_exit "Only one of gcrypt & nettle can be enabled"
2916fi
2917
2918##########################################
2919# libtasn1 - only for the TLS creds/session test suite
2920
2921tasn1=yes
2922tasn1_cflags=""
2923tasn1_libs=""
2924if $pkg_config --exists "libtasn1"; then
2925    tasn1_cflags=$($pkg_config --cflags libtasn1)
2926    tasn1_libs=$($pkg_config --libs libtasn1)
2927else
2928    tasn1=no
2929fi
2930
2931
2932##########################################
2933# PAM probe
2934
2935if test "$auth_pam" != "no"; then
2936    cat > $TMPC <<EOF
2937#include <security/pam_appl.h>
2938#include <stdio.h>
2939int main(void) {
2940   const char *service_name = "qemu";
2941   const char *user = "frank";
2942   const struct pam_conv pam_conv = { 0 };
2943   pam_handle_t *pamh = NULL;
2944   pam_start(service_name, user, &pam_conv, &pamh);
2945   return 0;
2946}
2947EOF
2948    if compile_prog "" "-lpam" ; then
2949        auth_pam=yes
2950    else
2951        if test "$auth_pam" = "yes"; then
2952            feature_not_found "PAM" "Install PAM development package"
2953        else
2954            auth_pam=no
2955        fi
2956    fi
2957fi
2958
2959##########################################
2960# getifaddrs (for tests/test-io-channel-socket )
2961
2962have_ifaddrs_h=yes
2963if ! check_include "ifaddrs.h" ; then
2964  have_ifaddrs_h=no
2965fi
2966
2967##########################################
2968# VTE probe
2969
2970if test "$vte" != "no"; then
2971    vteminversion="0.32.0"
2972    if $pkg_config --exists "vte-2.91"; then
2973      vtepackage="vte-2.91"
2974    else
2975      vtepackage="vte-2.90"
2976    fi
2977    if $pkg_config --exists "$vtepackage >= $vteminversion"; then
2978        vte_cflags=$($pkg_config --cflags $vtepackage)
2979        vte_libs=$($pkg_config --libs $vtepackage)
2980        vteversion=$($pkg_config --modversion $vtepackage)
2981        vte="yes"
2982    elif test "$vte" = "yes"; then
2983        feature_not_found "vte" "Install libvte-2.90/2.91 devel"
2984    else
2985        vte="no"
2986    fi
2987fi
2988
2989##########################################
2990# SDL probe
2991
2992# Look for sdl configuration program (pkg-config or sdl2-config).  Try
2993# sdl2-config even without cross prefix, and favour pkg-config over sdl2-config.
2994
2995sdl_probe ()
2996{
2997  if $pkg_config sdl2 --exists; then
2998    sdlconfig="$pkg_config sdl2"
2999    sdlversion=$($sdlconfig --modversion 2>/dev/null)
3000  elif has "$sdl2_config"; then
3001    sdlconfig="$sdl2_config"
3002    sdlversion=$($sdlconfig --version)
3003  else
3004    if test "$sdl" = "yes" ; then
3005      feature_not_found "sdl" "Install SDL2-devel"
3006    fi
3007    sdl=no
3008    # no need to do the rest
3009    return
3010  fi
3011  if test -n "$cross_prefix" && test "$(basename "$sdlconfig")" = sdl2-config; then
3012    echo warning: using "\"$sdlconfig\"" to detect cross-compiled sdl >&2
3013  fi
3014
3015  cat > $TMPC << EOF
3016#include <SDL.h>
3017#undef main /* We don't want SDL to override our main() */
3018int main( void ) { return SDL_Init (SDL_INIT_VIDEO); }
3019EOF
3020  sdl_cflags=$($sdlconfig --cflags 2>/dev/null)
3021  sdl_cflags="$sdl_cflags -Wno-undef"  # workaround 2.0.8 bug
3022  if test "$static" = "yes" ; then
3023    if $pkg_config sdl2 --exists; then
3024      sdl_libs=$($pkg_config sdl2 --static --libs 2>/dev/null)
3025    else
3026      sdl_libs=$($sdlconfig --static-libs 2>/dev/null)
3027    fi
3028  else
3029    sdl_libs=$($sdlconfig --libs 2>/dev/null)
3030  fi
3031  if compile_prog "$sdl_cflags" "$sdl_libs" ; then
3032    sdl=yes
3033
3034    # static link with sdl ? (note: sdl.pc's --static --libs is broken)
3035    if test "$sdl" = "yes" && test "$static" = "yes" ; then
3036      if test $? = 0 && echo $sdl_libs | grep -- -laa > /dev/null; then
3037         sdl_libs="$sdl_libs $(aalib-config --static-libs 2>/dev/null)"
3038         sdl_cflags="$sdl_cflags $(aalib-config --cflags 2>/dev/null)"
3039      fi
3040      if compile_prog "$sdl_cflags" "$sdl_libs" ; then
3041	:
3042      else
3043        sdl=no
3044      fi
3045    fi # static link
3046  else # sdl not found
3047    if test "$sdl" = "yes" ; then
3048      feature_not_found "sdl" "Install SDL2 devel"
3049    fi
3050    sdl=no
3051  fi # sdl compile test
3052}
3053
3054sdl_image_probe ()
3055{
3056    if test "$sdl_image" != "no" ; then
3057        if $pkg_config SDL2_image --exists; then
3058            if test "$static" = "yes"; then
3059                sdl_image_libs=$($pkg_config SDL2_image --libs --static 2>/dev/null)
3060            else
3061                sdl_image_libs=$($pkg_config SDL2_image --libs 2>/dev/null)
3062            fi
3063            sdl_image_cflags=$($pkg_config SDL2_image --cflags 2>/dev/null)
3064            sdl_image=yes
3065
3066            sdl_cflags="$sdl_cflags $sdl_image_cflags"
3067            sdl_libs="$sdl_libs $sdl_image_libs"
3068        else
3069            if test "$sdl_image" = "yes" ; then
3070                feature_not_found "sdl_image" "Install SDL Image devel"
3071            else
3072                sdl_image=no
3073            fi
3074        fi
3075    fi
3076}
3077
3078if test "$sdl" != "no" ; then
3079  sdl_probe
3080fi
3081
3082if test "$sdl" = "yes" ; then
3083  sdl_image_probe
3084else
3085  if test "$sdl_image" = "yes"; then
3086    echo "warning: SDL Image requested, but SDL is not available, disabling"
3087  fi
3088  sdl_image=no
3089fi
3090
3091if test "$sdl" = "yes" ; then
3092  cat > $TMPC <<EOF
3093#include <SDL.h>
3094#if defined(SDL_VIDEO_DRIVER_X11)
3095#include <X11/XKBlib.h>
3096#else
3097#error No x11 support
3098#endif
3099int main(void) { return 0; }
3100EOF
3101  if compile_prog "$sdl_cflags $x11_cflags" "$sdl_libs $x11_libs" ; then
3102    need_x11=yes
3103    sdl_cflags="$sdl_cflags $x11_cflags"
3104    sdl_libs="$sdl_libs $x11_libs"
3105  fi
3106fi
3107
3108##########################################
3109# RDMA needs OpenFabrics libraries
3110if test "$rdma" != "no" ; then
3111  cat > $TMPC <<EOF
3112#include <rdma/rdma_cma.h>
3113int main(void) { return 0; }
3114EOF
3115  rdma_libs="-lrdmacm -libverbs -libumad"
3116  if compile_prog "" "$rdma_libs" ; then
3117    rdma="yes"
3118    libs_softmmu="$libs_softmmu $rdma_libs"
3119  else
3120    if test "$rdma" = "yes" ; then
3121        error_exit \
3122            " OpenFabrics librdmacm/libibverbs/libibumad not present." \
3123            " Your options:" \
3124            "  (1) Fast: Install infiniband packages (devel) from your distro." \
3125            "  (2) Cleanest: Install libraries from www.openfabrics.org" \
3126            "  (3) Also: Install softiwarp if you don't have RDMA hardware"
3127    fi
3128    rdma="no"
3129  fi
3130fi
3131
3132##########################################
3133# PVRDMA detection
3134
3135cat > $TMPC <<EOF &&
3136#include <sys/mman.h>
3137
3138int
3139main(void)
3140{
3141    char buf = 0;
3142    void *addr = &buf;
3143    addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
3144
3145    return 0;
3146}
3147EOF
3148
3149if test "$rdma" = "yes" ; then
3150    case "$pvrdma" in
3151    "")
3152        if compile_prog "" ""; then
3153            pvrdma="yes"
3154        else
3155            pvrdma="no"
3156        fi
3157        ;;
3158    "yes")
3159        if ! compile_prog "" ""; then
3160            error_exit "PVRDMA is not supported since mremap is not implemented"
3161        fi
3162        pvrdma="yes"
3163        ;;
3164    "no")
3165        pvrdma="no"
3166        ;;
3167    esac
3168else
3169    if test "$pvrdma" = "yes" ; then
3170        error_exit "PVRDMA requires rdma suppport"
3171    fi
3172    pvrdma="no"
3173fi
3174
3175##########################################
3176# VNC SASL detection
3177if test "$vnc" = "yes" && test "$vnc_sasl" != "no" ; then
3178  cat > $TMPC <<EOF
3179#include <sasl/sasl.h>
3180#include <stdio.h>
3181int main(void) { sasl_server_init(NULL, "qemu"); return 0; }
3182EOF
3183  # Assuming Cyrus-SASL installed in /usr prefix
3184  vnc_sasl_cflags=""
3185  vnc_sasl_libs="-lsasl2"
3186  if compile_prog "$vnc_sasl_cflags" "$vnc_sasl_libs" ; then
3187    vnc_sasl=yes
3188    libs_softmmu="$vnc_sasl_libs $libs_softmmu"
3189    QEMU_CFLAGS="$QEMU_CFLAGS $vnc_sasl_cflags"
3190  else
3191    if test "$vnc_sasl" = "yes" ; then
3192      feature_not_found "vnc-sasl" "Install Cyrus SASL devel"
3193    fi
3194    vnc_sasl=no
3195  fi
3196fi
3197
3198##########################################
3199# VNC JPEG detection
3200if test "$vnc" = "yes" && test "$vnc_jpeg" != "no" ; then
3201cat > $TMPC <<EOF
3202#include <stdio.h>
3203#include <jpeglib.h>
3204int main(void) { struct jpeg_compress_struct s; jpeg_create_compress(&s); return 0; }
3205EOF
3206    vnc_jpeg_cflags=""
3207    vnc_jpeg_libs="-ljpeg"
3208  if compile_prog "$vnc_jpeg_cflags" "$vnc_jpeg_libs" ; then
3209    vnc_jpeg=yes
3210    libs_softmmu="$vnc_jpeg_libs $libs_softmmu"
3211    QEMU_CFLAGS="$QEMU_CFLAGS $vnc_jpeg_cflags"
3212  else
3213    if test "$vnc_jpeg" = "yes" ; then
3214      feature_not_found "vnc-jpeg" "Install libjpeg-turbo devel"
3215    fi
3216    vnc_jpeg=no
3217  fi
3218fi
3219
3220##########################################
3221# VNC PNG detection
3222if test "$vnc" = "yes" && test "$vnc_png" != "no" ; then
3223cat > $TMPC <<EOF
3224//#include <stdio.h>
3225#include <png.h>
3226#include <stddef.h>
3227int main(void) {
3228    png_structp png_ptr;
3229    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
3230    return png_ptr != 0;
3231}
3232EOF
3233  if $pkg_config libpng --exists; then
3234    vnc_png_cflags=$($pkg_config libpng --cflags)
3235    vnc_png_libs=$($pkg_config libpng --libs)
3236  else
3237    vnc_png_cflags=""
3238    vnc_png_libs="-lpng"
3239  fi
3240  if compile_prog "$vnc_png_cflags" "$vnc_png_libs" ; then
3241    vnc_png=yes
3242    libs_softmmu="$vnc_png_libs $libs_softmmu"
3243    QEMU_CFLAGS="$QEMU_CFLAGS $vnc_png_cflags"
3244  else
3245    if test "$vnc_png" = "yes" ; then
3246      feature_not_found "vnc-png" "Install libpng devel"
3247    fi
3248    vnc_png=no
3249  fi
3250fi
3251
3252##########################################
3253# xkbcommon probe
3254if test "$xkbcommon" != "no" ; then
3255  if $pkg_config xkbcommon --exists; then
3256    xkbcommon_cflags=$($pkg_config xkbcommon --cflags)
3257    xkbcommon_libs=$($pkg_config xkbcommon --libs)
3258    xkbcommon=yes
3259  else
3260    if test "$xkbcommon" = "yes" ; then
3261      feature_not_found "xkbcommon" "Install libxkbcommon-devel"
3262    fi
3263    xkbcommon=no
3264  fi
3265fi
3266
3267
3268##########################################
3269# xfsctl() probe, used for file-posix.c
3270if test "$xfs" != "no" ; then
3271  cat > $TMPC << EOF
3272#include <stddef.h>  /* NULL */
3273#include <xfs/xfs.h>
3274int main(void)
3275{
3276    xfsctl(NULL, 0, 0, NULL);
3277    return 0;
3278}
3279EOF
3280  if compile_prog "" "" ; then
3281    xfs="yes"
3282  else
3283    if test "$xfs" = "yes" ; then
3284      feature_not_found "xfs" "Instal xfsprogs/xfslibs devel"
3285    fi
3286    xfs=no
3287  fi
3288fi
3289
3290##########################################
3291# vde libraries probe
3292if test "$vde" != "no" ; then
3293  vde_libs="-lvdeplug"
3294  cat > $TMPC << EOF
3295#include <libvdeplug.h>
3296int main(void)
3297{
3298    struct vde_open_args a = {0, 0, 0};
3299    char s[] = "";
3300    vde_open(s, s, &a);
3301    return 0;
3302}
3303EOF
3304  if compile_prog "" "$vde_libs" ; then
3305    vde=yes
3306  else
3307    if test "$vde" = "yes" ; then
3308      feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
3309    fi
3310    vde=no
3311  fi
3312fi
3313
3314##########################################
3315# netmap support probe
3316# Apart from looking for netmap headers, we make sure that the host API version
3317# supports the netmap backend (>=11). The upper bound (15) is meant to simulate
3318# a minor/major version number. Minor new features will be marked with values up
3319# to 15, and if something happens that requires a change to the backend we will
3320# move above 15, submit the backend fixes and modify this two bounds.
3321if test "$netmap" != "no" ; then
3322  cat > $TMPC << EOF
3323#include <inttypes.h>
3324#include <net/if.h>
3325#include <net/netmap.h>
3326#include <net/netmap_user.h>
3327#if (NETMAP_API < 11) || (NETMAP_API > 15)
3328#error
3329#endif
3330int main(void) { return 0; }
3331EOF
3332  if compile_prog "" "" ; then
3333    netmap=yes
3334  else
3335    if test "$netmap" = "yes" ; then
3336      feature_not_found "netmap"
3337    fi
3338    netmap=no
3339  fi
3340fi
3341
3342##########################################
3343# libcap-ng library probe
3344if test "$cap_ng" != "no" ; then
3345  cap_libs="-lcap-ng"
3346  cat > $TMPC << EOF
3347#include <cap-ng.h>
3348int main(void)
3349{
3350    capng_capability_to_name(CAPNG_EFFECTIVE);
3351    return 0;
3352}
3353EOF
3354  if compile_prog "" "$cap_libs" ; then
3355    cap_ng=yes
3356    libs_tools="$cap_libs $libs_tools"
3357  else
3358    if test "$cap_ng" = "yes" ; then
3359      feature_not_found "cap_ng" "Install libcap-ng devel"
3360    fi
3361    cap_ng=no
3362  fi
3363fi
3364
3365##########################################
3366# Sound support libraries probe
3367
3368audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
3369for drv in $audio_drv_list; do
3370    case $drv in
3371    alsa | try-alsa)
3372    if $pkg_config alsa --exists; then
3373        alsa_libs=$($pkg_config alsa --libs)
3374        if test "$drv" = "try-alsa"; then
3375            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa/alsa/')
3376        fi
3377    else
3378        if test "$drv" = "try-alsa"; then
3379            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa//')
3380        else
3381            error_exit "$drv check failed" \
3382                "Make sure to have the $drv libs and headers installed."
3383        fi
3384    fi
3385    ;;
3386
3387    pa | try-pa)
3388    if $pkg_config libpulse --exists; then
3389        pulse_libs=$($pkg_config libpulse --libs)
3390        if test "$drv" = "try-pa"; then
3391            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa/pa/')
3392        fi
3393    else
3394        if test "$drv" = "try-pa"; then
3395            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa//')
3396        else
3397            error_exit "$drv check failed" \
3398                "Make sure to have the $drv libs and headers installed."
3399        fi
3400    fi
3401    ;;
3402
3403    sdl)
3404    if test "$sdl" = "no"; then
3405        error_exit "sdl not found or disabled, can not use sdl audio driver"
3406    fi
3407    ;;
3408
3409    try-sdl)
3410    if test "$sdl" = "no"; then
3411        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl//')
3412    else
3413        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl/sdl/')
3414    fi
3415    ;;
3416
3417    coreaudio)
3418      coreaudio_libs="-framework CoreAudio"
3419    ;;
3420
3421    dsound)
3422      dsound_libs="-lole32 -ldxguid"
3423      audio_win_int="yes"
3424    ;;
3425
3426    oss)
3427      oss_libs="$oss_lib"
3428    ;;
3429
3430    *)
3431    echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
3432        error_exit "Unknown driver '$drv' selected" \
3433            "Possible drivers are: $audio_possible_drivers"
3434    }
3435    ;;
3436    esac
3437done
3438
3439##########################################
3440# BrlAPI probe
3441
3442if test "$brlapi" != "no" ; then
3443  brlapi_libs="-lbrlapi"
3444  cat > $TMPC << EOF
3445#include <brlapi.h>
3446#include <stddef.h>
3447int main( void ) { return brlapi__openConnection (NULL, NULL, NULL); }
3448EOF
3449  if compile_prog "" "$brlapi_libs" ; then
3450    brlapi=yes
3451  else
3452    if test "$brlapi" = "yes" ; then
3453      feature_not_found "brlapi" "Install brlapi devel"
3454    fi
3455    brlapi=no
3456  fi
3457fi
3458
3459##########################################
3460# iconv probe
3461if test "$iconv" != "no" ; then
3462  cat > $TMPC << EOF
3463#include <iconv.h>
3464int main(void) {
3465  iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
3466  return conv != (iconv_t) -1;
3467}
3468EOF
3469  iconv_prefix_list="/usr/local:/usr"
3470  iconv_lib_list=":-liconv"
3471  IFS=:
3472  for iconv_prefix in $iconv_prefix_list; do
3473    IFS=:
3474    iconv_cflags="-I$iconv_prefix/include"
3475    iconv_ldflags="-L$iconv_prefix/lib"
3476    for iconv_link in $iconv_lib_list; do
3477      unset IFS
3478      iconv_lib="$iconv_ldflags $iconv_link"
3479      echo "looking at iconv in '$iconv_cflags' '$iconv_lib'" >> config.log
3480      if compile_prog "$iconv_cflags" "$iconv_lib" ; then
3481        iconv_found=yes
3482        break
3483      fi
3484    done
3485    if test "$iconv_found" = yes ; then
3486      break
3487    fi
3488  done
3489  if test "$iconv_found" = "yes" ; then
3490    iconv=yes
3491  else
3492    if test "$iconv" = "yes" ; then
3493      feature_not_found "iconv" "Install iconv devel"
3494    fi
3495    iconv=no
3496  fi
3497fi
3498
3499##########################################
3500# curses probe
3501if test "$iconv" = "no" ; then
3502  # curses will need iconv
3503  curses=no
3504fi
3505if test "$curses" != "no" ; then
3506  if test "$mingw32" = "yes" ; then
3507    curses_inc_list="$($pkg_config --cflags ncurses 2>/dev/null):"
3508    curses_lib_list="$($pkg_config --libs ncurses 2>/dev/null):-lpdcurses"
3509  else
3510    curses_inc_list="$($pkg_config --cflags ncursesw 2>/dev/null):-I/usr/include/ncursesw:"
3511    curses_lib_list="$($pkg_config --libs ncursesw 2>/dev/null):-lncursesw:-lcursesw"
3512  fi
3513  curses_found=no
3514  cat > $TMPC << EOF
3515#include <locale.h>
3516#include <curses.h>
3517#include <wchar.h>
3518#include <langinfo.h>
3519int main(void) {
3520  const char *codeset;
3521  wchar_t wch = L'w';
3522  setlocale(LC_ALL, "");
3523  resize_term(0, 0);
3524  addwstr(L"wide chars\n");
3525  addnwstr(&wch, 1);
3526  add_wch(WACS_DEGREE);
3527  codeset = nl_langinfo(CODESET);
3528  return codeset != 0;
3529}
3530EOF
3531  IFS=:
3532  for curses_inc in $curses_inc_list; do
3533    # Make sure we get the wide character prototypes
3534    curses_inc="-DNCURSES_WIDECHAR $curses_inc"
3535    IFS=:
3536    for curses_lib in $curses_lib_list; do
3537      unset IFS
3538      if compile_prog "$curses_inc" "$curses_lib" ; then
3539        curses_found=yes
3540        break
3541      fi
3542    done
3543    if test "$curses_found" = yes ; then
3544      break
3545    fi
3546  done
3547  unset IFS
3548  if test "$curses_found" = "yes" ; then
3549    curses=yes
3550  else
3551    if test "$curses" = "yes" ; then
3552      feature_not_found "curses" "Install ncurses devel"
3553    fi
3554    curses=no
3555  fi
3556fi
3557
3558##########################################
3559# curl probe
3560if test "$curl" != "no" ; then
3561  if $pkg_config libcurl --exists; then
3562    curlconfig="$pkg_config libcurl"
3563  else
3564    curlconfig=curl-config
3565  fi
3566  cat > $TMPC << EOF
3567#include <curl/curl.h>
3568int main(void) { curl_easy_init(); curl_multi_setopt(0, 0, 0); return 0; }
3569EOF
3570  curl_cflags=$($curlconfig --cflags 2>/dev/null)
3571  curl_libs=$($curlconfig --libs 2>/dev/null)
3572  if compile_prog "$curl_cflags" "$curl_libs" ; then
3573    curl=yes
3574  else
3575    if test "$curl" = "yes" ; then
3576      feature_not_found "curl" "Install libcurl devel"
3577    fi
3578    curl=no
3579  fi
3580fi # test "$curl"
3581
3582##########################################
3583# bluez support probe
3584if test "$bluez" != "no" ; then
3585  cat > $TMPC << EOF
3586#include <bluetooth/bluetooth.h>
3587int main(void) { return bt_error(0); }
3588EOF
3589  bluez_cflags=$($pkg_config --cflags bluez 2>/dev/null)
3590  bluez_libs=$($pkg_config --libs bluez 2>/dev/null)
3591  if compile_prog "$bluez_cflags" "$bluez_libs" ; then
3592    bluez=yes
3593    libs_softmmu="$bluez_libs $libs_softmmu"
3594  else
3595    if test "$bluez" = "yes" ; then
3596      feature_not_found "bluez" "Install bluez-libs/libbluetooth devel"
3597    fi
3598    bluez="no"
3599  fi
3600fi
3601
3602##########################################
3603# glib support probe
3604
3605glib_req_ver=2.48
3606glib_modules=gthread-2.0
3607if test "$modules" = yes; then
3608    glib_modules="$glib_modules gmodule-export-2.0"
3609fi
3610
3611# This workaround is required due to a bug in pkg-config file for glib as it
3612# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
3613
3614if test "$static" = yes && test "$mingw32" = yes; then
3615    QEMU_CFLAGS="-DGLIB_STATIC_COMPILATION $QEMU_CFLAGS"
3616fi
3617
3618for i in $glib_modules; do
3619    if $pkg_config --atleast-version=$glib_req_ver $i; then
3620        glib_cflags=$($pkg_config --cflags $i)
3621        glib_libs=$($pkg_config --libs $i)
3622        QEMU_CFLAGS="$glib_cflags $QEMU_CFLAGS"
3623        LIBS="$glib_libs $LIBS"
3624        libs_qga="$glib_libs $libs_qga"
3625    else
3626        error_exit "glib-$glib_req_ver $i is required to compile QEMU"
3627    fi
3628done
3629
3630if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
3631    gio=yes
3632    gio_cflags=$($pkg_config --cflags gio-2.0)
3633    gio_libs=$($pkg_config --libs gio-2.0)
3634else
3635    gio=no
3636fi
3637
3638# Sanity check that the current size_t matches the
3639# size that glib thinks it should be. This catches
3640# problems on multi-arch where people try to build
3641# 32-bit QEMU while pointing at 64-bit glib headers
3642cat > $TMPC <<EOF
3643#include <glib.h>
3644#include <unistd.h>
3645
3646#define QEMU_BUILD_BUG_ON(x) \
3647  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
3648
3649int main(void) {
3650   QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
3651   return 0;
3652}
3653EOF
3654
3655if ! compile_prog "$CFLAGS" "$LIBS" ; then
3656    error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
3657               "You probably need to set PKG_CONFIG_LIBDIR"\
3658	       "to point to the right pkg-config files for your"\
3659	       "build target"
3660fi
3661
3662# Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
3663cat > $TMPC << EOF
3664#include <glib.h>
3665int main(void) { return 0; }
3666EOF
3667if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3668    if cc_has_warning_flag "-Wno-unknown-attributes"; then
3669        glib_cflags="-Wno-unknown-attributes $glib_cflags"
3670        CFLAGS="-Wno-unknown-attributes $CFLAGS"
3671    fi
3672fi
3673
3674#########################################
3675# zlib check
3676
3677if test "$zlib" != "no" ; then
3678    if $pkg_config --exists zlib; then
3679        zlib_cflags=$($pkg_config --cflags zlib)
3680        zlib_libs=$($pkg_config --libs zlib)
3681        QEMU_CFLAGS="$zlib_cflags $QEMU_CFLAGS"
3682        LIBS="$zlib_libs $LIBS"
3683    else
3684        cat > $TMPC << EOF
3685#include <zlib.h>
3686int main(void) { zlibVersion(); return 0; }
3687EOF
3688        if compile_prog "" "-lz" ; then
3689            LIBS="$LIBS -lz"
3690        else
3691            error_exit "zlib check failed" \
3692                "Make sure to have the zlib libs and headers installed."
3693        fi
3694    fi
3695fi
3696
3697##########################################
3698# SHA command probe for modules
3699if test "$modules" = yes; then
3700    shacmd_probe="sha1sum sha1 shasum"
3701    for c in $shacmd_probe; do
3702        if has $c; then
3703            shacmd="$c"
3704            break
3705        fi
3706    done
3707    if test "$shacmd" = ""; then
3708        error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
3709    fi
3710fi
3711
3712##########################################
3713# pixman support probe
3714
3715if test "$want_tools" = "no" && test "$softmmu" = "no"; then
3716  pixman_cflags=
3717  pixman_libs=
3718elif $pkg_config --atleast-version=0.21.8 pixman-1 > /dev/null 2>&1; then
3719  pixman_cflags=$($pkg_config --cflags pixman-1)
3720  pixman_libs=$($pkg_config --libs pixman-1)
3721else
3722  error_exit "pixman >= 0.21.8 not present." \
3723      "Please install the pixman devel package."
3724fi
3725
3726##########################################
3727# libmpathpersist probe
3728
3729if test "$mpath" != "no" ; then
3730  # probe for the new API
3731  cat > $TMPC <<EOF
3732#include <libudev.h>
3733#include <mpath_persist.h>
3734unsigned mpath_mx_alloc_len = 1024;
3735int logsink;
3736static struct config *multipath_conf;
3737extern struct udev *udev;
3738extern struct config *get_multipath_config(void);
3739extern void put_multipath_config(struct config *conf);
3740struct udev *udev;
3741struct config *get_multipath_config(void) { return multipath_conf; }
3742void put_multipath_config(struct config *conf) { }
3743
3744int main(void) {
3745    udev = udev_new();
3746    multipath_conf = mpath_lib_init();
3747    return 0;
3748}
3749EOF
3750  if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
3751    mpathpersist=yes
3752    mpathpersist_new_api=yes
3753  else
3754    # probe for the old API
3755    cat > $TMPC <<EOF
3756#include <libudev.h>
3757#include <mpath_persist.h>
3758unsigned mpath_mx_alloc_len = 1024;
3759int logsink;
3760int main(void) {
3761    struct udev *udev = udev_new();
3762    mpath_lib_init(udev);
3763    return 0;
3764}
3765EOF
3766    if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
3767      mpathpersist=yes
3768      mpathpersist_new_api=no
3769    else
3770      mpathpersist=no
3771    fi
3772  fi
3773else
3774  mpathpersist=no
3775fi
3776
3777##########################################
3778# libcap probe
3779
3780if test "$cap" != "no" ; then
3781  cat > $TMPC <<EOF
3782#include <stdio.h>
3783#include <sys/capability.h>
3784int main(void) { cap_t caps; caps = cap_init(); return caps != NULL; }
3785EOF
3786  if compile_prog "" "-lcap" ; then
3787    cap=yes
3788  else
3789    cap=no
3790  fi
3791fi
3792
3793##########################################
3794# pthread probe
3795PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
3796
3797pthread=no
3798cat > $TMPC << EOF
3799#include <pthread.h>
3800static void *f(void *p) { return NULL; }
3801int main(void) {
3802  pthread_t thread;
3803  pthread_create(&thread, 0, f, 0);
3804  return 0;
3805}
3806EOF
3807if compile_prog "" "" ; then
3808  pthread=yes
3809else
3810  for pthread_lib in $PTHREADLIBS_LIST; do
3811    if compile_prog "" "$pthread_lib" ; then
3812      pthread=yes
3813      found=no
3814      for lib_entry in $LIBS; do
3815        if test "$lib_entry" = "$pthread_lib"; then
3816          found=yes
3817          break
3818        fi
3819      done
3820      if test "$found" = "no"; then
3821        LIBS="$pthread_lib $LIBS"
3822        libs_qga="$pthread_lib $libs_qga"
3823      fi
3824      PTHREAD_LIB="$pthread_lib"
3825      break
3826    fi
3827  done
3828fi
3829
3830if test "$mingw32" != yes && test "$pthread" = no; then
3831  error_exit "pthread check failed" \
3832      "Make sure to have the pthread libs and headers installed."
3833fi
3834
3835# check for pthread_setname_np with thread id
3836pthread_setname_np_w_tid=no
3837cat > $TMPC << EOF
3838#include <pthread.h>
3839
3840static void *f(void *p) { return NULL; }
3841int main(void)
3842{
3843    pthread_t thread;
3844    pthread_create(&thread, 0, f, 0);
3845    pthread_setname_np(thread, "QEMU");
3846    return 0;
3847}
3848EOF
3849if compile_prog "" "$pthread_lib" ; then
3850  pthread_setname_np_w_tid=yes
3851fi
3852
3853# check for pthread_setname_np without thread id
3854pthread_setname_np_wo_tid=no
3855cat > $TMPC << EOF
3856#include <pthread.h>
3857
3858static void *f(void *p) { pthread_setname_np("QEMU"); }
3859int main(void)
3860{
3861    pthread_t thread;
3862    pthread_create(&thread, 0, f, 0);
3863    return 0;
3864}
3865EOF
3866if compile_prog "" "$pthread_lib" ; then
3867  pthread_setname_np_wo_tid=yes
3868fi
3869
3870##########################################
3871# rbd probe
3872if test "$rbd" != "no" ; then
3873  cat > $TMPC <<EOF
3874#include <stdio.h>
3875#include <rbd/librbd.h>
3876int main(void) {
3877    rados_t cluster;
3878    rados_create(&cluster, NULL);
3879    return 0;
3880}
3881EOF
3882  rbd_libs="-lrbd -lrados"
3883  if compile_prog "" "$rbd_libs" ; then
3884    rbd=yes
3885  else
3886    if test "$rbd" = "yes" ; then
3887      feature_not_found "rados block device" "Install librbd/ceph devel"
3888    fi
3889    rbd=no
3890  fi
3891fi
3892
3893##########################################
3894# libssh probe
3895if test "$libssh" != "no" ; then
3896  if $pkg_config --exists libssh; then
3897    libssh_cflags=$($pkg_config libssh --cflags)
3898    libssh_libs=$($pkg_config libssh --libs)
3899    libssh=yes
3900  else
3901    if test "$libssh" = "yes" ; then
3902      error_exit "libssh required for --enable-libssh"
3903    fi
3904    libssh=no
3905  fi
3906fi
3907
3908##########################################
3909# Check for libssh 0.8
3910# This is done like this instead of using the LIBSSH_VERSION_* and
3911# SSH_VERSION_* macros because some distributions in the past shipped
3912# snapshots of the future 0.8 from Git, and those snapshots did not
3913# have updated version numbers (still referring to 0.7.0).
3914
3915if test "$libssh" = "yes"; then
3916  cat > $TMPC <<EOF
3917#include <libssh/libssh.h>
3918int main(void) { return ssh_get_server_publickey(NULL, NULL); }
3919EOF
3920  if compile_prog "$libssh_cflags" "$libssh_libs"; then
3921    libssh_cflags="-DHAVE_LIBSSH_0_8 $libssh_cflags"
3922  fi
3923fi
3924
3925##########################################
3926# linux-aio probe
3927
3928if test "$linux_aio" != "no" ; then
3929  cat > $TMPC <<EOF
3930#include <libaio.h>
3931#include <sys/eventfd.h>
3932#include <stddef.h>
3933int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
3934EOF
3935  if compile_prog "" "-laio" ; then
3936    linux_aio=yes
3937  else
3938    if test "$linux_aio" = "yes" ; then
3939      feature_not_found "linux AIO" "Install libaio devel"
3940    fi
3941    linux_aio=no
3942  fi
3943fi
3944
3945##########################################
3946# TPM emulation is only on POSIX
3947
3948if test "$tpm" = ""; then
3949  if test "$mingw32" = "yes"; then
3950    tpm=no
3951  else
3952    tpm=yes
3953  fi
3954elif test "$tpm" = "yes"; then
3955  if test "$mingw32" = "yes" ; then
3956    error_exit "TPM emulation only available on POSIX systems"
3957  fi
3958fi
3959
3960##########################################
3961# attr probe
3962
3963if test "$attr" != "no" ; then
3964  cat > $TMPC <<EOF
3965#include <stdio.h>
3966#include <sys/types.h>
3967#ifdef CONFIG_LIBATTR
3968#include <attr/xattr.h>
3969#else
3970#include <sys/xattr.h>
3971#endif
3972int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }
3973EOF
3974  if compile_prog "" "" ; then
3975    attr=yes
3976  # Older distros have <attr/xattr.h>, and need -lattr:
3977  elif compile_prog "-DCONFIG_LIBATTR" "-lattr" ; then
3978    attr=yes
3979    LIBS="-lattr $LIBS"
3980    libattr=yes
3981  else
3982    if test "$attr" = "yes" ; then
3983      feature_not_found "ATTR" "Install libc6 or libattr devel"
3984    fi
3985    attr=no
3986  fi
3987fi
3988
3989##########################################
3990# iovec probe
3991cat > $TMPC <<EOF
3992#include <sys/types.h>
3993#include <sys/uio.h>
3994#include <unistd.h>
3995int main(void) { return sizeof(struct iovec); }
3996EOF
3997iovec=no
3998if compile_prog "" "" ; then
3999  iovec=yes
4000fi
4001
4002##########################################
4003# preadv probe
4004cat > $TMPC <<EOF
4005#include <sys/types.h>
4006#include <sys/uio.h>
4007#include <unistd.h>
4008int main(void) { return preadv(0, 0, 0, 0); }
4009EOF
4010preadv=no
4011if compile_prog "" "" ; then
4012  preadv=yes
4013fi
4014
4015##########################################
4016# fdt probe
4017# fdt support is mandatory for at least some target architectures,
4018# so insist on it if we're building those system emulators.
4019fdt_required=no
4020for target in $target_list; do
4021  case $target in
4022    aarch64*-softmmu|arm*-softmmu|ppc*-softmmu|microblaze*-softmmu|mips64el-softmmu|riscv*-softmmu)
4023      fdt_required=yes
4024    ;;
4025  esac
4026done
4027
4028if test "$fdt_required" = "yes"; then
4029  if test "$fdt" = "no"; then
4030    error_exit "fdt disabled but some requested targets require it." \
4031      "You can turn off fdt only if you also disable all the system emulation" \
4032      "targets which need it (by specifying a cut down --target-list)."
4033  fi
4034  fdt=yes
4035fi
4036
4037if test "$fdt" != "no" ; then
4038  fdt_libs="-lfdt"
4039  # explicitly check for libfdt_env.h as it is missing in some stable installs
4040  # and test for required functions to make sure we are on a version >= 1.4.2
4041  cat > $TMPC << EOF
4042#include <libfdt.h>
4043#include <libfdt_env.h>
4044int main(void) { fdt_check_full(NULL, 0); return 0; }
4045EOF
4046  if compile_prog "" "$fdt_libs" ; then
4047    # system DTC is good - use it
4048    fdt=system
4049  else
4050      # have GIT checkout, so activate dtc submodule
4051      if test -e "${source_path}/.git" ; then
4052          git_submodules="${git_submodules} dtc"
4053      fi
4054      if test -d "${source_path}/dtc/libfdt" || test -e "${source_path}/.git" ; then
4055          fdt=git
4056          mkdir -p dtc
4057          if [ "$pwd_is_source_path" != "y" ] ; then
4058              symlink "$source_path/dtc/Makefile" "dtc/Makefile"
4059              symlink "$source_path/dtc/scripts" "dtc/scripts"
4060          fi
4061          fdt_cflags="-I\$(SRC_PATH)/dtc/libfdt"
4062          fdt_ldflags="-L\$(BUILD_DIR)/dtc/libfdt"
4063          fdt_libs="$fdt_libs"
4064      elif test "$fdt" = "yes" ; then
4065          # Not a git build & no libfdt found, prompt for system install
4066          error_exit "DTC (libfdt) version >= 1.4.2 not present." \
4067                     "Please install the DTC (libfdt) devel package"
4068      else
4069          # don't have and don't want
4070          fdt_libs=
4071          fdt=no
4072      fi
4073  fi
4074fi
4075
4076libs_softmmu="$libs_softmmu $fdt_libs"
4077
4078##########################################
4079# opengl probe (for sdl2, gtk, milkymist-tmu2)
4080
4081gbm="no"
4082if $pkg_config gbm; then
4083    gbm_cflags="$($pkg_config --cflags gbm)"
4084    gbm_libs="$($pkg_config --libs gbm)"
4085    gbm="yes"
4086fi
4087
4088if test "$opengl" != "no" ; then
4089  opengl_pkgs="epoxy gbm"
4090  if $pkg_config $opengl_pkgs; then
4091    opengl_cflags="$($pkg_config --cflags $opengl_pkgs)"
4092    opengl_libs="$($pkg_config --libs $opengl_pkgs)"
4093    opengl=yes
4094    if test "$gtk" = "yes" && $pkg_config --exists "$gtkpackage >= 3.16"; then
4095        gtk_gl="yes"
4096    fi
4097    QEMU_CFLAGS="$QEMU_CFLAGS $opengl_cflags"
4098  else
4099    if test "$opengl" = "yes" ; then
4100      feature_not_found "opengl" "Please install opengl (mesa) devel pkgs: $opengl_pkgs"
4101    fi
4102    opengl_cflags=""
4103    opengl_libs=""
4104    opengl=no
4105  fi
4106fi
4107
4108if test "$opengl" = "yes"; then
4109  cat > $TMPC << EOF
4110#include <epoxy/egl.h>
4111#ifndef EGL_MESA_image_dma_buf_export
4112# error mesa/epoxy lacks support for dmabufs (mesa 10.6+)
4113#endif
4114int main(void) { return 0; }
4115EOF
4116  if compile_prog "" "" ; then
4117    opengl_dmabuf=yes
4118  fi
4119fi
4120
4121if test "$opengl" = "yes" && test "$have_x11" = "yes"; then
4122  for target in $target_list; do
4123    case $target in
4124      lm32-softmmu) # milkymist-tmu2 requires X11 and OpenGL
4125        need_x11=yes
4126      ;;
4127    esac
4128  done
4129fi
4130
4131##########################################
4132# libxml2 probe
4133if test "$libxml2" != "no" ; then
4134    if $pkg_config --exists libxml-2.0; then
4135        libxml2="yes"
4136        libxml2_cflags=$($pkg_config --cflags libxml-2.0)
4137        libxml2_libs=$($pkg_config --libs libxml-2.0)
4138    else
4139        if test "$libxml2" = "yes"; then
4140            feature_not_found "libxml2" "Install libxml2 devel"
4141        fi
4142        libxml2="no"
4143    fi
4144fi
4145
4146##########################################
4147# glusterfs probe
4148if test "$glusterfs" != "no" ; then
4149  if $pkg_config --atleast-version=3 glusterfs-api; then
4150    glusterfs="yes"
4151    glusterfs_cflags=$($pkg_config --cflags glusterfs-api)
4152    glusterfs_libs=$($pkg_config --libs glusterfs-api)
4153    if $pkg_config --atleast-version=4 glusterfs-api; then
4154      glusterfs_xlator_opt="yes"
4155    fi
4156    if $pkg_config --atleast-version=5 glusterfs-api; then
4157      glusterfs_discard="yes"
4158    fi
4159    if $pkg_config --atleast-version=6 glusterfs-api; then
4160      glusterfs_fallocate="yes"
4161      glusterfs_zerofill="yes"
4162    fi
4163    cat > $TMPC << EOF
4164#include <glusterfs/api/glfs.h>
4165
4166int
4167main(void)
4168{
4169	/* new glfs_ftruncate() passes two additional args */
4170	return glfs_ftruncate(NULL, 0, NULL, NULL);
4171}
4172EOF
4173    if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
4174      glusterfs_ftruncate_has_stat="yes"
4175    fi
4176    cat > $TMPC << EOF
4177#include <glusterfs/api/glfs.h>
4178
4179/* new glfs_io_cbk() passes two additional glfs_stat structs */
4180static void
4181glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
4182{}
4183
4184int
4185main(void)
4186{
4187	glfs_io_cbk iocb = &glusterfs_iocb;
4188	iocb(NULL, 0 , NULL, NULL, NULL);
4189	return 0;
4190}
4191EOF
4192    if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
4193      glusterfs_iocb_has_stat="yes"
4194    fi
4195  else
4196    if test "$glusterfs" = "yes" ; then
4197      feature_not_found "GlusterFS backend support" \
4198          "Install glusterfs-api devel >= 3"
4199    fi
4200    glusterfs="no"
4201  fi
4202fi
4203
4204# Check for inotify functions when we are building linux-user
4205# emulator.  This is done because older glibc versions don't
4206# have syscall stubs for these implemented.  In that case we
4207# don't provide them even if kernel supports them.
4208#
4209inotify=no
4210cat > $TMPC << EOF
4211#include <sys/inotify.h>
4212
4213int
4214main(void)
4215{
4216	/* try to start inotify */
4217	return inotify_init();
4218}
4219EOF
4220if compile_prog "" "" ; then
4221  inotify=yes
4222fi
4223
4224inotify1=no
4225cat > $TMPC << EOF
4226#include <sys/inotify.h>
4227
4228int
4229main(void)
4230{
4231    /* try to start inotify */
4232    return inotify_init1(0);
4233}
4234EOF
4235if compile_prog "" "" ; then
4236  inotify1=yes
4237fi
4238
4239# check if pipe2 is there
4240pipe2=no
4241cat > $TMPC << EOF
4242#include <unistd.h>
4243#include <fcntl.h>
4244
4245int main(void)
4246{
4247    int pipefd[2];
4248    return pipe2(pipefd, O_CLOEXEC);
4249}
4250EOF
4251if compile_prog "" "" ; then
4252  pipe2=yes
4253fi
4254
4255# check if accept4 is there
4256accept4=no
4257cat > $TMPC << EOF
4258#include <sys/socket.h>
4259#include <stddef.h>
4260
4261int main(void)
4262{
4263    accept4(0, NULL, NULL, SOCK_CLOEXEC);
4264    return 0;
4265}
4266EOF
4267if compile_prog "" "" ; then
4268  accept4=yes
4269fi
4270
4271# check if tee/splice is there. vmsplice was added same time.
4272splice=no
4273cat > $TMPC << EOF
4274#include <unistd.h>
4275#include <fcntl.h>
4276#include <limits.h>
4277
4278int main(void)
4279{
4280    int len, fd = 0;
4281    len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
4282    splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
4283    return 0;
4284}
4285EOF
4286if compile_prog "" "" ; then
4287  splice=yes
4288fi
4289
4290##########################################
4291# libnuma probe
4292
4293if test "$numa" != "no" ; then
4294  cat > $TMPC << EOF
4295#include <numa.h>
4296int main(void) { return numa_available(); }
4297EOF
4298
4299  if compile_prog "" "-lnuma" ; then
4300    numa=yes
4301    libs_softmmu="-lnuma $libs_softmmu"
4302  else
4303    if test "$numa" = "yes" ; then
4304      feature_not_found "numa" "install numactl devel"
4305    fi
4306    numa=no
4307  fi
4308fi
4309
4310if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
4311    echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
4312    exit 1
4313fi
4314
4315# Even if malloc_trim() is available, these non-libc memory allocators
4316# do not support it.
4317if test "$tcmalloc" = "yes" || test "$jemalloc" = "yes" ; then
4318    if test "$malloc_trim" = "yes" ; then
4319        echo "Disabling malloc_trim with non-libc memory allocator"
4320    fi
4321    malloc_trim="no"
4322fi
4323
4324#######################################
4325# malloc_trim
4326
4327if test "$malloc_trim" != "no" ; then
4328    cat > $TMPC << EOF
4329#include <malloc.h>
4330int main(void) { malloc_trim(0); return 0; }
4331EOF
4332    if compile_prog "" "" ; then
4333        malloc_trim="yes"
4334    else
4335        malloc_trim="no"
4336    fi
4337fi
4338
4339##########################################
4340# tcmalloc probe
4341
4342if test "$tcmalloc" = "yes" ; then
4343  cat > $TMPC << EOF
4344#include <stdlib.h>
4345int main(void) { malloc(1); return 0; }
4346EOF
4347
4348  if compile_prog "" "-ltcmalloc" ; then
4349    LIBS="-ltcmalloc $LIBS"
4350  else
4351    feature_not_found "tcmalloc" "install gperftools devel"
4352  fi
4353fi
4354
4355##########################################
4356# jemalloc probe
4357
4358if test "$jemalloc" = "yes" ; then
4359  cat > $TMPC << EOF
4360#include <stdlib.h>
4361int main(void) { malloc(1); return 0; }
4362EOF
4363
4364  if compile_prog "" "-ljemalloc" ; then
4365    LIBS="-ljemalloc $LIBS"
4366  else
4367    feature_not_found "jemalloc" "install jemalloc devel"
4368  fi
4369fi
4370
4371##########################################
4372# signalfd probe
4373signalfd="no"
4374cat > $TMPC << EOF
4375#include <unistd.h>
4376#include <sys/syscall.h>
4377#include <signal.h>
4378int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }
4379EOF
4380
4381if compile_prog "" "" ; then
4382  signalfd=yes
4383fi
4384
4385# check if optreset global is declared by <getopt.h>
4386optreset="no"
4387cat > $TMPC << EOF
4388#include <getopt.h>
4389int main(void) { return optreset; }
4390EOF
4391
4392if compile_prog "" "" ; then
4393  optreset=yes
4394fi
4395
4396# check if eventfd is supported
4397eventfd=no
4398cat > $TMPC << EOF
4399#include <sys/eventfd.h>
4400
4401int main(void)
4402{
4403    return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
4404}
4405EOF
4406if compile_prog "" "" ; then
4407  eventfd=yes
4408fi
4409
4410# check if memfd is supported
4411memfd=no
4412cat > $TMPC << EOF
4413#include <sys/mman.h>
4414
4415int main(void)
4416{
4417    return memfd_create("foo", MFD_ALLOW_SEALING);
4418}
4419EOF
4420if compile_prog "" "" ; then
4421  memfd=yes
4422fi
4423
4424# check for usbfs
4425have_usbfs=no
4426if test "$linux_user" = "yes"; then
4427  cat > $TMPC << EOF
4428#include <linux/usbdevice_fs.h>
4429
4430#ifndef USBDEVFS_GET_CAPABILITIES
4431#error "USBDEVFS_GET_CAPABILITIES undefined"
4432#endif
4433
4434#ifndef USBDEVFS_DISCONNECT_CLAIM
4435#error "USBDEVFS_DISCONNECT_CLAIM undefined"
4436#endif
4437
4438int main(void)
4439{
4440    return 0;
4441}
4442EOF
4443  if compile_prog "" ""; then
4444    have_usbfs=yes
4445  fi
4446fi
4447
4448# check for fallocate
4449fallocate=no
4450cat > $TMPC << EOF
4451#include <fcntl.h>
4452
4453int main(void)
4454{
4455    fallocate(0, 0, 0, 0);
4456    return 0;
4457}
4458EOF
4459if compile_prog "" "" ; then
4460  fallocate=yes
4461fi
4462
4463# check for fallocate hole punching
4464fallocate_punch_hole=no
4465cat > $TMPC << EOF
4466#include <fcntl.h>
4467#include <linux/falloc.h>
4468
4469int main(void)
4470{
4471    fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
4472    return 0;
4473}
4474EOF
4475if compile_prog "" "" ; then
4476  fallocate_punch_hole=yes
4477fi
4478
4479# check that fallocate supports range zeroing inside the file
4480fallocate_zero_range=no
4481cat > $TMPC << EOF
4482#include <fcntl.h>
4483#include <linux/falloc.h>
4484
4485int main(void)
4486{
4487    fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0);
4488    return 0;
4489}
4490EOF
4491if compile_prog "" "" ; then
4492  fallocate_zero_range=yes
4493fi
4494
4495# check for posix_fallocate
4496posix_fallocate=no
4497cat > $TMPC << EOF
4498#include <fcntl.h>
4499
4500int main(void)
4501{
4502    posix_fallocate(0, 0, 0);
4503    return 0;
4504}
4505EOF
4506if compile_prog "" "" ; then
4507    posix_fallocate=yes
4508fi
4509
4510# check for sync_file_range
4511sync_file_range=no
4512cat > $TMPC << EOF
4513#include <fcntl.h>
4514
4515int main(void)
4516{
4517    sync_file_range(0, 0, 0, 0);
4518    return 0;
4519}
4520EOF
4521if compile_prog "" "" ; then
4522  sync_file_range=yes
4523fi
4524
4525# check for linux/fiemap.h and FS_IOC_FIEMAP
4526fiemap=no
4527cat > $TMPC << EOF
4528#include <sys/ioctl.h>
4529#include <linux/fs.h>
4530#include <linux/fiemap.h>
4531
4532int main(void)
4533{
4534    ioctl(0, FS_IOC_FIEMAP, 0);
4535    return 0;
4536}
4537EOF
4538if compile_prog "" "" ; then
4539  fiemap=yes
4540fi
4541
4542# check for dup3
4543dup3=no
4544cat > $TMPC << EOF
4545#include <unistd.h>
4546
4547int main(void)
4548{
4549    dup3(0, 0, 0);
4550    return 0;
4551}
4552EOF
4553if compile_prog "" "" ; then
4554  dup3=yes
4555fi
4556
4557# check for ppoll support
4558ppoll=no
4559cat > $TMPC << EOF
4560#include <poll.h>
4561
4562int main(void)
4563{
4564    struct pollfd pfd = { .fd = 0, .events = 0, .revents = 0 };
4565    ppoll(&pfd, 1, 0, 0);
4566    return 0;
4567}
4568EOF
4569if compile_prog "" "" ; then
4570  ppoll=yes
4571fi
4572
4573# check for prctl(PR_SET_TIMERSLACK , ... ) support
4574prctl_pr_set_timerslack=no
4575cat > $TMPC << EOF
4576#include <sys/prctl.h>
4577
4578int main(void)
4579{
4580    prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0);
4581    return 0;
4582}
4583EOF
4584if compile_prog "" "" ; then
4585  prctl_pr_set_timerslack=yes
4586fi
4587
4588# check for epoll support
4589epoll=no
4590cat > $TMPC << EOF
4591#include <sys/epoll.h>
4592
4593int main(void)
4594{
4595    epoll_create(0);
4596    return 0;
4597}
4598EOF
4599if compile_prog "" "" ; then
4600  epoll=yes
4601fi
4602
4603# epoll_create1 is a later addition
4604# so we must check separately for its presence
4605epoll_create1=no
4606cat > $TMPC << EOF
4607#include <sys/epoll.h>
4608
4609int main(void)
4610{
4611    /* Note that we use epoll_create1 as a value, not as
4612     * a function being called. This is necessary so that on
4613     * old SPARC glibc versions where the function was present in
4614     * the library but not declared in the header file we will
4615     * fail the configure check. (Otherwise we will get a compiler
4616     * warning but not an error, and will proceed to fail the
4617     * qemu compile where we compile with -Werror.)
4618     */
4619    return (int)(uintptr_t)&epoll_create1;
4620}
4621EOF
4622if compile_prog "" "" ; then
4623  epoll_create1=yes
4624fi
4625
4626# check for sendfile support
4627sendfile=no
4628cat > $TMPC << EOF
4629#include <sys/sendfile.h>
4630
4631int main(void)
4632{
4633    return sendfile(0, 0, 0, 0);
4634}
4635EOF
4636if compile_prog "" "" ; then
4637  sendfile=yes
4638fi
4639
4640# check for timerfd support (glibc 2.8 and newer)
4641timerfd=no
4642cat > $TMPC << EOF
4643#include <sys/timerfd.h>
4644
4645int main(void)
4646{
4647    return(timerfd_create(CLOCK_REALTIME, 0));
4648}
4649EOF
4650if compile_prog "" "" ; then
4651  timerfd=yes
4652fi
4653
4654# check for setns and unshare support
4655setns=no
4656cat > $TMPC << EOF
4657#include <sched.h>
4658
4659int main(void)
4660{
4661    int ret;
4662    ret = setns(0, 0);
4663    ret = unshare(0);
4664    return ret;
4665}
4666EOF
4667if compile_prog "" "" ; then
4668  setns=yes
4669fi
4670
4671# clock_adjtime probe
4672clock_adjtime=no
4673cat > $TMPC <<EOF
4674#include <time.h>
4675
4676int main(void)
4677{
4678    return clock_adjtime(0, 0);
4679}
4680EOF
4681clock_adjtime=no
4682if compile_prog "" "" ; then
4683  clock_adjtime=yes
4684fi
4685
4686# syncfs probe
4687syncfs=no
4688cat > $TMPC <<EOF
4689#include <unistd.h>
4690
4691int main(void)
4692{
4693    return syncfs(0);
4694}
4695EOF
4696syncfs=no
4697if compile_prog "" "" ; then
4698  syncfs=yes
4699fi
4700
4701# Check we have a new enough version of sphinx-build
4702has_sphinx_build() {
4703    # This is a bit awkward but works: create a trivial document and
4704    # try to run it with our configuration file (which enforces a
4705    # version requirement). This will fail if either
4706    # sphinx-build doesn't exist at all or if it is too old.
4707    mkdir -p "$TMPDIR1/sphinx"
4708    touch "$TMPDIR1/sphinx/index.rst"
4709    sphinx-build -c "$source_path/docs" -b html "$TMPDIR1/sphinx" "$TMPDIR1/sphinx/out" >/dev/null 2>&1
4710}
4711
4712# Check if tools are available to build documentation.
4713if test "$docs" != "no" ; then
4714  if has makeinfo && has pod2man && has_sphinx_build; then
4715    docs=yes
4716  else
4717    if test "$docs" = "yes" ; then
4718      feature_not_found "docs" "Install texinfo, Perl/perl-podlators and python-sphinx"
4719    fi
4720    docs=no
4721  fi
4722fi
4723
4724# Search for bswap_32 function
4725byteswap_h=no
4726cat > $TMPC << EOF
4727#include <byteswap.h>
4728int main(void) { return bswap_32(0); }
4729EOF
4730if compile_prog "" "" ; then
4731  byteswap_h=yes
4732fi
4733
4734# Search for bswap32 function
4735bswap_h=no
4736cat > $TMPC << EOF
4737#include <sys/endian.h>
4738#include <sys/types.h>
4739#include <machine/bswap.h>
4740int main(void) { return bswap32(0); }
4741EOF
4742if compile_prog "" "" ; then
4743  bswap_h=yes
4744fi
4745
4746##########################################
4747# Do we have libiscsi >= 1.9.0
4748if test "$libiscsi" != "no" ; then
4749  if $pkg_config --atleast-version=1.9.0 libiscsi; then
4750    libiscsi="yes"
4751    libiscsi_cflags=$($pkg_config --cflags libiscsi)
4752    libiscsi_libs=$($pkg_config --libs libiscsi)
4753  else
4754    if test "$libiscsi" = "yes" ; then
4755      feature_not_found "libiscsi" "Install libiscsi >= 1.9.0"
4756    fi
4757    libiscsi="no"
4758  fi
4759fi
4760
4761##########################################
4762# Do we need libm
4763cat > $TMPC << EOF
4764#include <math.h>
4765int main(int argc, char **argv) { return isnan(sin((double)argc)); }
4766EOF
4767if compile_prog "" "" ; then
4768  :
4769elif compile_prog "" "-lm" ; then
4770  LIBS="-lm $LIBS"
4771  libs_qga="-lm $libs_qga"
4772else
4773  error_exit "libm check failed"
4774fi
4775
4776##########################################
4777# Do we need librt
4778# uClibc provides 2 versions of clock_gettime(), one with realtime
4779# support and one without. This means that the clock_gettime() don't
4780# need -lrt. We still need it for timer_create() so we check for this
4781# function in addition.
4782cat > $TMPC <<EOF
4783#include <signal.h>
4784#include <time.h>
4785int main(void) {
4786  timer_create(CLOCK_REALTIME, NULL, NULL);
4787  return clock_gettime(CLOCK_REALTIME, NULL);
4788}
4789EOF
4790
4791if compile_prog "" "" ; then
4792  :
4793# we need pthread for static linking. use previous pthread test result
4794elif compile_prog "" "$pthread_lib -lrt" ; then
4795  LIBS="$LIBS -lrt"
4796  libs_qga="$libs_qga -lrt"
4797fi
4798
4799# Check whether we need to link libutil for openpty()
4800cat > $TMPC << EOF
4801extern int openpty(int *am, int *as, char *name, void *termp, void *winp);
4802int main(void) { return openpty(0, 0, 0, 0, 0); }
4803EOF
4804
4805if ! compile_prog "" "" ; then
4806  if compile_prog "" "-lutil" ; then
4807    libs_softmmu="-lutil $libs_softmmu"
4808    libs_tools="-lutil $libs_tools"
4809  fi
4810fi
4811
4812##########################################
4813# spice probe
4814if test "$spice" != "no" ; then
4815  cat > $TMPC << EOF
4816#include <spice.h>
4817int main(void) { spice_server_new(); return 0; }
4818EOF
4819  spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
4820  spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
4821  if $pkg_config --atleast-version=0.12.5 spice-server && \
4822     $pkg_config --atleast-version=0.12.3 spice-protocol && \
4823     compile_prog "$spice_cflags" "$spice_libs" ; then
4824    spice="yes"
4825    libs_softmmu="$libs_softmmu $spice_libs"
4826    QEMU_CFLAGS="$QEMU_CFLAGS $spice_cflags"
4827    spice_protocol_version=$($pkg_config --modversion spice-protocol)
4828    spice_server_version=$($pkg_config --modversion spice-server)
4829  else
4830    if test "$spice" = "yes" ; then
4831      feature_not_found "spice" \
4832          "Install spice-server(>=0.12.5) and spice-protocol(>=0.12.3) devel"
4833    fi
4834    spice="no"
4835  fi
4836fi
4837
4838# check for smartcard support
4839if test "$smartcard" != "no"; then
4840    if $pkg_config --atleast-version=2.5.1 libcacard; then
4841        libcacard_cflags=$($pkg_config --cflags libcacard)
4842        libcacard_libs=$($pkg_config --libs libcacard)
4843        smartcard="yes"
4844    else
4845        if test "$smartcard" = "yes"; then
4846            feature_not_found "smartcard" "Install libcacard devel"
4847        fi
4848        smartcard="no"
4849    fi
4850fi
4851
4852# check for libusb
4853if test "$libusb" != "no" ; then
4854    if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
4855        libusb="yes"
4856        libusb_cflags=$($pkg_config --cflags libusb-1.0)
4857        libusb_libs=$($pkg_config --libs libusb-1.0)
4858    else
4859        if test "$libusb" = "yes"; then
4860            feature_not_found "libusb" "Install libusb devel >= 1.0.13"
4861        fi
4862        libusb="no"
4863    fi
4864fi
4865
4866# check for usbredirparser for usb network redirection support
4867if test "$usb_redir" != "no" ; then
4868    if $pkg_config --atleast-version=0.6 libusbredirparser-0.5; then
4869        usb_redir="yes"
4870        usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5)
4871        usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5)
4872    else
4873        if test "$usb_redir" = "yes"; then
4874            feature_not_found "usb-redir" "Install usbredir devel"
4875        fi
4876        usb_redir="no"
4877    fi
4878fi
4879
4880##########################################
4881# check if we have VSS SDK headers for win
4882
4883if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
4884        test "$vss_win32_sdk" != "no" ; then
4885  case "$vss_win32_sdk" in
4886    "")   vss_win32_include="-isystem $source_path" ;;
4887    *\ *) # The SDK is installed in "Program Files" by default, but we cannot
4888          # handle path with spaces. So we symlink the headers into ".sdk/vss".
4889          vss_win32_include="-isystem $source_path/.sdk/vss"
4890	  symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
4891	  ;;
4892    *)    vss_win32_include="-isystem $vss_win32_sdk"
4893  esac
4894  cat > $TMPC << EOF
4895#define __MIDL_user_allocate_free_DEFINED__
4896#include <inc/win2003/vss.h>
4897int main(void) { return VSS_CTX_BACKUP; }
4898EOF
4899  if compile_prog "$vss_win32_include" "" ; then
4900    guest_agent_with_vss="yes"
4901    QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
4902    libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
4903    qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
4904  else
4905    if test "$vss_win32_sdk" != "" ; then
4906      echo "ERROR: Please download and install Microsoft VSS SDK:"
4907      echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
4908      echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
4909      echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
4910      echo "ERROR: The headers are extracted in the directory \`inc'."
4911      feature_not_found "VSS support"
4912    fi
4913    guest_agent_with_vss="no"
4914  fi
4915fi
4916
4917##########################################
4918# lookup Windows platform SDK (if not specified)
4919# The SDK is needed only to build .tlb (type library) file of guest agent
4920# VSS provider from the source. It is usually unnecessary because the
4921# pre-compiled .tlb file is included.
4922
4923if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
4924        test "$guest_agent_with_vss" = "yes" ; then
4925  if test -z "$win_sdk"; then
4926    programfiles="$PROGRAMFILES"
4927    test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
4928    if test -n "$programfiles"; then
4929      win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
4930    else
4931      feature_not_found "Windows SDK"
4932    fi
4933  elif test "$win_sdk" = "no"; then
4934    win_sdk=""
4935  fi
4936fi
4937
4938##########################################
4939# check if mingw environment provides a recent ntddscsi.h
4940if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
4941  cat > $TMPC << EOF
4942#include <windows.h>
4943#include <ntddscsi.h>
4944int main(void) {
4945#if !defined(IOCTL_SCSI_GET_ADDRESS)
4946#error Missing required ioctl definitions
4947#endif
4948  SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
4949  return addr.Lun;
4950}
4951EOF
4952  if compile_prog "" "" ; then
4953    guest_agent_ntddscsi=yes
4954    libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
4955  fi
4956fi
4957
4958##########################################
4959# virgl renderer probe
4960
4961if test "$virglrenderer" != "no" ; then
4962  cat > $TMPC << EOF
4963#include <virglrenderer.h>
4964int main(void) { virgl_renderer_poll(); return 0; }
4965EOF
4966  virgl_cflags=$($pkg_config --cflags virglrenderer 2>/dev/null)
4967  virgl_libs=$($pkg_config --libs virglrenderer 2>/dev/null)
4968  virgl_version=$($pkg_config --modversion virglrenderer 2>/dev/null)
4969  if $pkg_config virglrenderer >/dev/null 2>&1 && \
4970     compile_prog "$virgl_cflags" "$virgl_libs" ; then
4971    virglrenderer="yes"
4972  else
4973    if test "$virglrenderer" = "yes" ; then
4974      feature_not_found "virglrenderer"
4975    fi
4976    virglrenderer="no"
4977  fi
4978fi
4979
4980##########################################
4981# capstone
4982
4983case "$capstone" in
4984  "" | yes)
4985    if $pkg_config capstone; then
4986      capstone=system
4987    elif test -e "${source_path}/.git" && test $git_update = 'yes' ; then
4988      capstone=git
4989    elif test -e "${source_path}/capstone/Makefile" ; then
4990      capstone=internal
4991    elif test -z "$capstone" ; then
4992      capstone=no
4993    else
4994      feature_not_found "capstone" "Install capstone devel or git submodule"
4995    fi
4996    ;;
4997
4998  system)
4999    if ! $pkg_config capstone; then
5000      feature_not_found "capstone" "Install capstone devel"
5001    fi
5002    ;;
5003esac
5004
5005case "$capstone" in
5006  git | internal)
5007    if test "$capstone" = git; then
5008      git_submodules="${git_submodules} capstone"
5009    fi
5010    mkdir -p capstone
5011    QEMU_CFLAGS="$QEMU_CFLAGS -I\$(SRC_PATH)/capstone/include"
5012    if test "$mingw32" = "yes"; then
5013      LIBCAPSTONE=capstone.lib
5014    else
5015      LIBCAPSTONE=libcapstone.a
5016    fi
5017    libs_cpu="-L\$(BUILD_DIR)/capstone -lcapstone $libs_cpu"
5018    ;;
5019
5020  system)
5021    QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags capstone)"
5022    libs_cpu="$($pkg_config --libs capstone) $libs_cpu"
5023    ;;
5024
5025  no)
5026    ;;
5027  *)
5028    error_exit "Unknown state for capstone: $capstone"
5029    ;;
5030esac
5031
5032##########################################
5033# check if we have fdatasync
5034
5035fdatasync=no
5036cat > $TMPC << EOF
5037#include <unistd.h>
5038int main(void) {
5039#if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
5040return fdatasync(0);
5041#else
5042#error Not supported
5043#endif
5044}
5045EOF
5046if compile_prog "" "" ; then
5047    fdatasync=yes
5048fi
5049
5050##########################################
5051# check if we have madvise
5052
5053madvise=no
5054cat > $TMPC << EOF
5055#include <sys/types.h>
5056#include <sys/mman.h>
5057#include <stddef.h>
5058int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }
5059EOF
5060if compile_prog "" "" ; then
5061    madvise=yes
5062fi
5063
5064##########################################
5065# check if we have posix_madvise
5066
5067posix_madvise=no
5068cat > $TMPC << EOF
5069#include <sys/mman.h>
5070#include <stddef.h>
5071int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }
5072EOF
5073if compile_prog "" "" ; then
5074    posix_madvise=yes
5075fi
5076
5077##########################################
5078# check if we have posix_memalign()
5079
5080posix_memalign=no
5081cat > $TMPC << EOF
5082#include <stdlib.h>
5083int main(void) {
5084    void *p;
5085    return posix_memalign(&p, 8, 8);
5086}
5087EOF
5088if compile_prog "" "" ; then
5089    posix_memalign=yes
5090fi
5091
5092##########################################
5093# check if we have posix_syslog
5094
5095posix_syslog=no
5096cat > $TMPC << EOF
5097#include <syslog.h>
5098int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; }
5099EOF
5100if compile_prog "" "" ; then
5101    posix_syslog=yes
5102fi
5103
5104##########################################
5105# check if we have sem_timedwait
5106
5107sem_timedwait=no
5108cat > $TMPC << EOF
5109#include <semaphore.h>
5110int main(void) { sem_t s; struct timespec t = {0}; return sem_timedwait(&s, &t); }
5111EOF
5112if compile_prog "" "" ; then
5113    sem_timedwait=yes
5114fi
5115
5116##########################################
5117# check if we have strchrnul
5118
5119strchrnul=no
5120cat > $TMPC << EOF
5121#include <string.h>
5122int main(void);
5123// Use a haystack that the compiler shouldn't be able to constant fold
5124char *haystack = (char*)&main;
5125int main(void) { return strchrnul(haystack, 'x') != &haystack[6]; }
5126EOF
5127if compile_prog "" "" ; then
5128    strchrnul=yes
5129fi
5130
5131##########################################
5132# check if trace backend exists
5133
5134$python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
5135if test "$?" -ne 0 ; then
5136  error_exit "invalid trace backends" \
5137      "Please choose supported trace backends."
5138fi
5139
5140##########################################
5141# For 'ust' backend, test if ust headers are present
5142if have_backend "ust"; then
5143  cat > $TMPC << EOF
5144#include <lttng/tracepoint.h>
5145int main(void) { return 0; }
5146EOF
5147  if compile_prog "" "-Wl,--no-as-needed -ldl" ; then
5148    if $pkg_config lttng-ust --exists; then
5149      lttng_ust_libs=$($pkg_config --libs lttng-ust)
5150    else
5151      lttng_ust_libs="-llttng-ust -ldl"
5152    fi
5153    if $pkg_config liburcu-bp --exists; then
5154      urcu_bp_libs=$($pkg_config --libs liburcu-bp)
5155    else
5156      urcu_bp_libs="-lurcu-bp"
5157    fi
5158
5159    LIBS="$lttng_ust_libs $urcu_bp_libs $LIBS"
5160    libs_qga="$lttng_ust_libs $urcu_bp_libs $libs_qga"
5161  else
5162    error_exit "Trace backend 'ust' missing lttng-ust header files"
5163  fi
5164fi
5165
5166##########################################
5167# For 'dtrace' backend, test if 'dtrace' command is present
5168if have_backend "dtrace"; then
5169  if ! has 'dtrace' ; then
5170    error_exit "dtrace command is not found in PATH $PATH"
5171  fi
5172  trace_backend_stap="no"
5173  if has 'stap' ; then
5174    trace_backend_stap="yes"
5175  fi
5176fi
5177
5178##########################################
5179# check and set a backend for coroutine
5180
5181# We prefer ucontext, but it's not always possible. The fallback
5182# is sigcontext. On Windows the only valid backend is the Windows
5183# specific one.
5184
5185ucontext_works=no
5186if test "$darwin" != "yes"; then
5187  cat > $TMPC << EOF
5188#include <ucontext.h>
5189#ifdef __stub_makecontext
5190#error Ignoring glibc stub makecontext which will always fail
5191#endif
5192int main(void) { makecontext(0, 0, 0); return 0; }
5193EOF
5194  if compile_prog "" "" ; then
5195    ucontext_works=yes
5196  fi
5197fi
5198
5199if test "$coroutine" = ""; then
5200  if test "$mingw32" = "yes"; then
5201    coroutine=win32
5202  elif test "$ucontext_works" = "yes"; then
5203    coroutine=ucontext
5204  else
5205    coroutine=sigaltstack
5206  fi
5207else
5208  case $coroutine in
5209  windows)
5210    if test "$mingw32" != "yes"; then
5211      error_exit "'windows' coroutine backend only valid for Windows"
5212    fi
5213    # Unfortunately the user visible backend name doesn't match the
5214    # coroutine-*.c filename for this case, so we have to adjust it here.
5215    coroutine=win32
5216    ;;
5217  ucontext)
5218    if test "$ucontext_works" != "yes"; then
5219      feature_not_found "ucontext"
5220    fi
5221    ;;
5222  sigaltstack)
5223    if test "$mingw32" = "yes"; then
5224      error_exit "only the 'windows' coroutine backend is valid for Windows"
5225    fi
5226    ;;
5227  *)
5228    error_exit "unknown coroutine backend $coroutine"
5229    ;;
5230  esac
5231fi
5232
5233if test "$coroutine_pool" = ""; then
5234  coroutine_pool=yes
5235fi
5236
5237if test "$debug_stack_usage" = "yes"; then
5238  if test "$coroutine_pool" = "yes"; then
5239    echo "WARN: disabling coroutine pool for stack usage debugging"
5240    coroutine_pool=no
5241  fi
5242fi
5243
5244
5245##########################################
5246# check if we have open_by_handle_at
5247
5248open_by_handle_at=no
5249cat > $TMPC << EOF
5250#include <fcntl.h>
5251#if !defined(AT_EMPTY_PATH)
5252# error missing definition
5253#else
5254int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
5255#endif
5256EOF
5257if compile_prog "" "" ; then
5258    open_by_handle_at=yes
5259fi
5260
5261########################################
5262# check if we have linux/magic.h
5263
5264linux_magic_h=no
5265cat > $TMPC << EOF
5266#include <linux/magic.h>
5267int main(void) {
5268  return 0;
5269}
5270EOF
5271if compile_prog "" "" ; then
5272    linux_magic_h=yes
5273fi
5274
5275########################################
5276# check whether we can disable warning option with a pragma (this is needed
5277# to silence warnings in the headers of some versions of external libraries).
5278# This test has to be compiled with -Werror as otherwise an unknown pragma is
5279# only a warning.
5280#
5281# If we can't selectively disable warning in the code, disable -Werror so that
5282# the build doesn't fail anyway.
5283
5284pragma_disable_unused_but_set=no
5285cat > $TMPC << EOF
5286#pragma GCC diagnostic push
5287#pragma GCC diagnostic ignored "-Wstrict-prototypes"
5288#pragma GCC diagnostic pop
5289
5290int main(void) {
5291    return 0;
5292}
5293EOF
5294if compile_prog "-Werror" "" ; then
5295    pragma_diagnostic_available=yes
5296else
5297    werror=no
5298fi
5299
5300########################################
5301# check if we have valgrind/valgrind.h
5302
5303valgrind_h=no
5304cat > $TMPC << EOF
5305#include <valgrind/valgrind.h>
5306int main(void) {
5307  return 0;
5308}
5309EOF
5310if compile_prog "" "" ; then
5311    valgrind_h=yes
5312fi
5313
5314########################################
5315# check if environ is declared
5316
5317has_environ=no
5318cat > $TMPC << EOF
5319#include <unistd.h>
5320int main(void) {
5321    environ = 0;
5322    return 0;
5323}
5324EOF
5325if compile_prog "" "" ; then
5326    has_environ=yes
5327fi
5328
5329########################################
5330# check if cpuid.h is usable.
5331
5332cat > $TMPC << EOF
5333#include <cpuid.h>
5334int main(void) {
5335    unsigned a, b, c, d;
5336    int max = __get_cpuid_max(0, 0);
5337
5338    if (max >= 1) {
5339        __cpuid(1, a, b, c, d);
5340    }
5341
5342    if (max >= 7) {
5343        __cpuid_count(7, 0, a, b, c, d);
5344    }
5345
5346    return 0;
5347}
5348EOF
5349if compile_prog "" "" ; then
5350    cpuid_h=yes
5351fi
5352
5353##########################################
5354# avx2 optimization requirement check
5355#
5356# There is no point enabling this if cpuid.h is not usable,
5357# since we won't be able to select the new routines.
5358
5359if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
5360  cat > $TMPC << EOF
5361#pragma GCC push_options
5362#pragma GCC target("avx2")
5363#include <cpuid.h>
5364#include <immintrin.h>
5365static int bar(void *a) {
5366    __m256i x = *(__m256i *)a;
5367    return _mm256_testz_si256(x, x);
5368}
5369int main(int argc, char *argv[]) { return bar(argv[0]); }
5370EOF
5371  if compile_object "" ; then
5372    avx2_opt="yes"
5373  else
5374    avx2_opt="no"
5375  fi
5376fi
5377
5378########################################
5379# check if __[u]int128_t is usable.
5380
5381int128=no
5382cat > $TMPC << EOF
5383__int128_t a;
5384__uint128_t b;
5385int main (void) {
5386  a = a + b;
5387  b = a * b;
5388  a = a * a;
5389  return 0;
5390}
5391EOF
5392if compile_prog "" "" ; then
5393    int128=yes
5394fi
5395
5396#########################################
5397# See if 128-bit atomic operations are supported.
5398
5399atomic128=no
5400if test "$int128" = "yes"; then
5401  cat > $TMPC << EOF
5402int main(void)
5403{
5404  unsigned __int128 x = 0, y = 0;
5405  y = __atomic_load_16(&x, 0);
5406  __atomic_store_16(&x, y, 0);
5407  __atomic_compare_exchange_16(&x, &y, x, 0, 0, 0);
5408  return 0;
5409}
5410EOF
5411  if compile_prog "" "" ; then
5412    atomic128=yes
5413  fi
5414fi
5415
5416cmpxchg128=no
5417if test "$int128" = yes && test "$atomic128" = no; then
5418  cat > $TMPC << EOF
5419int main(void)
5420{
5421  unsigned __int128 x = 0, y = 0;
5422  __sync_val_compare_and_swap_16(&x, y, x);
5423  return 0;
5424}
5425EOF
5426  if compile_prog "" "" ; then
5427    cmpxchg128=yes
5428  fi
5429fi
5430
5431#########################################
5432# See if 64-bit atomic operations are supported.
5433# Note that without __atomic builtins, we can only
5434# assume atomic loads/stores max at pointer size.
5435
5436cat > $TMPC << EOF
5437#include <stdint.h>
5438int main(void)
5439{
5440  uint64_t x = 0, y = 0;
5441#ifdef __ATOMIC_RELAXED
5442  y = __atomic_load_8(&x, 0);
5443  __atomic_store_8(&x, y, 0);
5444  __atomic_compare_exchange_8(&x, &y, x, 0, 0, 0);
5445  __atomic_exchange_8(&x, y, 0);
5446  __atomic_fetch_add_8(&x, y, 0);
5447#else
5448  typedef char is_host64[sizeof(void *) >= sizeof(uint64_t) ? 1 : -1];
5449  __sync_lock_test_and_set(&x, y);
5450  __sync_val_compare_and_swap(&x, y, 0);
5451  __sync_fetch_and_add(&x, y);
5452#endif
5453  return 0;
5454}
5455EOF
5456if compile_prog "" "" ; then
5457  atomic64=yes
5458fi
5459
5460########################################
5461# See if 16-byte vector operations are supported.
5462# Even without a vector unit the compiler may expand these.
5463# There is a bug in old GCC for PPC that crashes here.
5464# Unfortunately it's the system compiler for Centos 7.
5465
5466cat > $TMPC << EOF
5467typedef unsigned char U1 __attribute__((vector_size(16)));
5468typedef unsigned short U2 __attribute__((vector_size(16)));
5469typedef unsigned int U4 __attribute__((vector_size(16)));
5470typedef unsigned long long U8 __attribute__((vector_size(16)));
5471typedef signed char S1 __attribute__((vector_size(16)));
5472typedef signed short S2 __attribute__((vector_size(16)));
5473typedef signed int S4 __attribute__((vector_size(16)));
5474typedef signed long long S8 __attribute__((vector_size(16)));
5475static U1 a1, b1;
5476static U2 a2, b2;
5477static U4 a4, b4;
5478static U8 a8, b8;
5479static S1 c1;
5480static S2 c2;
5481static S4 c4;
5482static S8 c8;
5483static int i;
5484void helper(void *d, void *a, int shift, int i);
5485void helper(void *d, void *a, int shift, int i)
5486{
5487  *(U1 *)(d + i) = *(U1 *)(a + i) << shift;
5488  *(U2 *)(d + i) = *(U2 *)(a + i) << shift;
5489  *(U4 *)(d + i) = *(U4 *)(a + i) << shift;
5490  *(U8 *)(d + i) = *(U8 *)(a + i) << shift;
5491}
5492int main(void)
5493{
5494  a1 += b1; a2 += b2; a4 += b4; a8 += b8;
5495  a1 -= b1; a2 -= b2; a4 -= b4; a8 -= b8;
5496  a1 *= b1; a2 *= b2; a4 *= b4; a8 *= b8;
5497  a1 &= b1; a2 &= b2; a4 &= b4; a8 &= b8;
5498  a1 |= b1; a2 |= b2; a4 |= b4; a8 |= b8;
5499  a1 ^= b1; a2 ^= b2; a4 ^= b4; a8 ^= b8;
5500  a1 <<= i; a2 <<= i; a4 <<= i; a8 <<= i;
5501  a1 >>= i; a2 >>= i; a4 >>= i; a8 >>= i;
5502  c1 >>= i; c2 >>= i; c4 >>= i; c8 >>= i;
5503  return 0;
5504}
5505EOF
5506
5507vector16=no
5508if compile_prog "" "" ; then
5509  vector16=yes
5510fi
5511
5512########################################
5513# check if getauxval is available.
5514
5515getauxval=no
5516cat > $TMPC << EOF
5517#include <sys/auxv.h>
5518int main(void) {
5519  return getauxval(AT_HWCAP) == 0;
5520}
5521EOF
5522if compile_prog "" "" ; then
5523    getauxval=yes
5524fi
5525
5526########################################
5527# check if ccache is interfering with
5528# semantic analysis of macros
5529
5530unset CCACHE_CPP2
5531ccache_cpp2=no
5532cat > $TMPC << EOF
5533static const int Z = 1;
5534#define fn() ({ Z; })
5535#define TAUT(X) ((X) == Z)
5536#define PAREN(X, Y) (X == Y)
5537#define ID(X) (X)
5538int main(int argc, char *argv[])
5539{
5540    int x = 0, y = 0;
5541    x = ID(x);
5542    x = fn();
5543    fn();
5544    if (PAREN(x, y)) return 0;
5545    if (TAUT(Z)) return 0;
5546    return 0;
5547}
5548EOF
5549
5550if ! compile_object "-Werror"; then
5551    ccache_cpp2=yes
5552fi
5553
5554#################################################
5555# clang does not support glibc + FORTIFY_SOURCE.
5556
5557if test "$fortify_source" != "no"; then
5558  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
5559    fortify_source="no";
5560  elif test -n "$cxx" && has $cxx &&
5561       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
5562    fortify_source="no";
5563  else
5564    fortify_source="yes"
5565  fi
5566fi
5567
5568###############################################
5569# Check if copy_file_range is provided by glibc
5570have_copy_file_range=no
5571cat > $TMPC << EOF
5572#include <unistd.h>
5573int main(void) {
5574  copy_file_range(0, NULL, 0, NULL, 0, 0);
5575  return 0;
5576}
5577EOF
5578if compile_prog "" "" ; then
5579    have_copy_file_range=yes
5580fi
5581
5582##########################################
5583# check if struct fsxattr is available via linux/fs.h
5584
5585have_fsxattr=no
5586cat > $TMPC << EOF
5587#include <linux/fs.h>
5588struct fsxattr foo;
5589int main(void) {
5590  return 0;
5591}
5592EOF
5593if compile_prog "" "" ; then
5594    have_fsxattr=yes
5595fi
5596
5597##########################################
5598# check for usable membarrier system call
5599if test "$membarrier" = "yes"; then
5600    have_membarrier=no
5601    if test "$mingw32" = "yes" ; then
5602        have_membarrier=yes
5603    elif test "$linux" = "yes" ; then
5604        cat > $TMPC << EOF
5605    #include <linux/membarrier.h>
5606    #include <sys/syscall.h>
5607    #include <unistd.h>
5608    #include <stdlib.h>
5609    int main(void) {
5610        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
5611        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
5612	exit(0);
5613    }
5614EOF
5615        if compile_prog "" "" ; then
5616            have_membarrier=yes
5617        fi
5618    fi
5619    if test "$have_membarrier" = "no"; then
5620      feature_not_found "membarrier" "membarrier system call not available"
5621    fi
5622else
5623    # Do not enable it by default even for Mingw32, because it doesn't
5624    # work on Wine.
5625    membarrier=no
5626fi
5627
5628##########################################
5629# check if rtnetlink.h exists and is useful
5630have_rtnetlink=no
5631cat > $TMPC << EOF
5632#include <linux/rtnetlink.h>
5633int main(void) {
5634  return IFLA_PROTO_DOWN;
5635}
5636EOF
5637if compile_prog "" "" ; then
5638    have_rtnetlink=yes
5639fi
5640
5641##########################################
5642# check for usable AF_VSOCK environment
5643have_af_vsock=no
5644cat > $TMPC << EOF
5645#include <errno.h>
5646#include <sys/types.h>
5647#include <sys/socket.h>
5648#if !defined(AF_VSOCK)
5649# error missing AF_VSOCK flag
5650#endif
5651#include <linux/vm_sockets.h>
5652int main(void) {
5653    int sock, ret;
5654    struct sockaddr_vm svm;
5655    socklen_t len = sizeof(svm);
5656    sock = socket(AF_VSOCK, SOCK_STREAM, 0);
5657    ret = getpeername(sock, (struct sockaddr *)&svm, &len);
5658    if ((ret == -1) && (errno == ENOTCONN)) {
5659        return 0;
5660    }
5661    return -1;
5662}
5663EOF
5664if compile_prog "" "" ; then
5665    have_af_vsock=yes
5666fi
5667
5668##########################################
5669# check for usable AF_ALG environment
5670hava_afalg=no
5671cat > $TMPC << EOF
5672#include <errno.h>
5673#include <sys/types.h>
5674#include <sys/socket.h>
5675#include <linux/if_alg.h>
5676int main(void) {
5677    int sock;
5678    sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
5679    return sock;
5680}
5681EOF
5682if compile_prog "" "" ; then
5683    have_afalg=yes
5684fi
5685if test "$crypto_afalg" = "yes"
5686then
5687    if test "$have_afalg" != "yes"
5688    then
5689	error_exit "AF_ALG requested but could not be detected"
5690    fi
5691fi
5692
5693
5694#################################################
5695# Check to see if we have the Hypervisor framework
5696if [ "$darwin" = "yes" ] ; then
5697  cat > $TMPC << EOF
5698#include <Hypervisor/hv.h>
5699int main() { return 0;}
5700EOF
5701  if ! compile_object ""; then
5702    hvf='no'
5703  else
5704    hvf='yes'
5705    LDFLAGS="-framework Hypervisor $LDFLAGS"
5706  fi
5707fi
5708
5709#################################################
5710# Sparc implicitly links with --relax, which is
5711# incompatible with -r, so --no-relax should be
5712# given. It does no harm to give it on other
5713# platforms too.
5714
5715# Note: the prototype is needed since QEMU_CFLAGS
5716#       contains -Wmissing-prototypes
5717cat > $TMPC << EOF
5718extern int foo(void);
5719int foo(void) { return 0; }
5720EOF
5721if ! compile_object ""; then
5722  error_exit "Failed to compile object file for LD_REL_FLAGS test"
5723fi
5724for i in '-Wl,-r -Wl,--no-relax' -Wl,-r -r; do
5725  if do_cc -nostdlib $i -o $TMPMO $TMPO; then
5726    LD_REL_FLAGS=$i
5727    break
5728  fi
5729done
5730if test "$modules" = "yes" && test "$LD_REL_FLAGS" = ""; then
5731  feature_not_found "modules" "Cannot find how to build relocatable objects"
5732fi
5733
5734##########################################
5735# check for sysmacros.h
5736
5737have_sysmacros=no
5738cat > $TMPC << EOF
5739#include <sys/sysmacros.h>
5740int main(void) {
5741    return makedev(0, 0);
5742}
5743EOF
5744if compile_prog "" "" ; then
5745    have_sysmacros=yes
5746fi
5747
5748##########################################
5749# Veritas HyperScale block driver VxHS
5750# Check if libvxhs is installed
5751
5752if test "$vxhs" != "no" ; then
5753  cat > $TMPC <<EOF
5754#include <stdint.h>
5755#include <qnio/qnio_api.h>
5756
5757void *vxhs_callback;
5758
5759int main(void) {
5760    iio_init(QNIO_VERSION, vxhs_callback);
5761    return 0;
5762}
5763EOF
5764  vxhs_libs="-lvxhs -lssl"
5765  if compile_prog "" "$vxhs_libs" ; then
5766    vxhs=yes
5767  else
5768    if test "$vxhs" = "yes" ; then
5769      feature_not_found "vxhs block device" "Install libvxhs See github"
5770    fi
5771    vxhs=no
5772  fi
5773fi
5774
5775##########################################
5776# check for _Static_assert()
5777
5778have_static_assert=no
5779cat > $TMPC << EOF
5780_Static_assert(1, "success");
5781int main(void) {
5782    return 0;
5783}
5784EOF
5785if compile_prog "" "" ; then
5786    have_static_assert=yes
5787fi
5788
5789##########################################
5790# check for utmpx.h, it is missing e.g. on OpenBSD
5791
5792have_utmpx=no
5793cat > $TMPC << EOF
5794#include <utmpx.h>
5795struct utmpx user_info;
5796int main(void) {
5797    return 0;
5798}
5799EOF
5800if compile_prog "" "" ; then
5801    have_utmpx=yes
5802fi
5803
5804##########################################
5805# check for getrandom()
5806
5807have_getrandom=no
5808cat > $TMPC << EOF
5809#include <sys/random.h>
5810int main(void) {
5811    return getrandom(0, 0, GRND_NONBLOCK);
5812}
5813EOF
5814if compile_prog "" "" ; then
5815    have_getrandom=yes
5816fi
5817
5818##########################################
5819# checks for sanitizers
5820
5821have_asan=no
5822have_ubsan=no
5823have_asan_iface_h=no
5824have_asan_iface_fiber=no
5825
5826if test "$sanitizers" = "yes" ; then
5827  write_c_skeleton
5828  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
5829      have_asan=yes
5830  fi
5831
5832  # we could use a simple skeleton for flags checks, but this also
5833  # detect the static linking issue of ubsan, see also:
5834  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
5835  cat > $TMPC << EOF
5836#include <stdlib.h>
5837int main(void) {
5838    void *tmp = malloc(10);
5839    return *(int *)(tmp + 2);
5840}
5841EOF
5842  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
5843      have_ubsan=yes
5844  fi
5845
5846  if check_include "sanitizer/asan_interface.h" ; then
5847      have_asan_iface_h=yes
5848  fi
5849
5850  cat > $TMPC << EOF
5851#include <sanitizer/asan_interface.h>
5852int main(void) {
5853  __sanitizer_start_switch_fiber(0, 0, 0);
5854  return 0;
5855}
5856EOF
5857  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
5858      have_asan_iface_fiber=yes
5859  fi
5860fi
5861
5862##########################################
5863# check for libpmem
5864
5865if test "$libpmem" != "no"; then
5866	if $pkg_config --exists "libpmem"; then
5867		libpmem="yes"
5868		libpmem_libs=$($pkg_config --libs libpmem)
5869		libpmem_cflags=$($pkg_config --cflags libpmem)
5870		libs_softmmu="$libs_softmmu $libpmem_libs"
5871		QEMU_CFLAGS="$QEMU_CFLAGS $libpmem_cflags"
5872	else
5873		if test "$libpmem" = "yes" ; then
5874			feature_not_found "libpmem" "Install nvml or pmdk"
5875		fi
5876		libpmem="no"
5877	fi
5878fi
5879
5880##########################################
5881# check for slirp
5882
5883case "$slirp" in
5884  "" | yes)
5885    if $pkg_config slirp; then
5886      slirp=system
5887    elif test -e "${source_path}/.git" && test $git_update = 'yes' ; then
5888      slirp=git
5889    elif test -e "${source_path}/slirp/Makefile" ; then
5890      slirp=internal
5891    elif test -z "$slirp" ; then
5892      slirp=no
5893    else
5894      feature_not_found "slirp" "Install slirp devel or git submodule"
5895    fi
5896    ;;
5897
5898  system)
5899    if ! $pkg_config slirp; then
5900      feature_not_found "slirp" "Install slirp devel"
5901    fi
5902    ;;
5903esac
5904
5905case "$slirp" in
5906  git | internal)
5907    if test "$slirp" = git; then
5908      git_submodules="${git_submodules} slirp"
5909    fi
5910    mkdir -p slirp
5911    slirp_cflags="-I\$(SRC_PATH)/slirp/src -I\$(BUILD_DIR)/slirp/src"
5912    slirp_libs="-L\$(BUILD_DIR)/slirp -lslirp"
5913    ;;
5914
5915  system)
5916    slirp_version=$($pkg_config --modversion slirp 2>/dev/null)
5917    slirp_cflags=$($pkg_config --cflags slirp 2>/dev/null)
5918    slirp_libs=$($pkg_config --libs slirp 2>/dev/null)
5919    ;;
5920
5921  no)
5922    ;;
5923  *)
5924    error_exit "Unknown state for slirp: $slirp"
5925    ;;
5926esac
5927
5928
5929##########################################
5930# End of CC checks
5931# After here, no more $cc or $ld runs
5932
5933write_c_skeleton
5934
5935if test "$gcov" = "yes" ; then
5936  CFLAGS="-fprofile-arcs -ftest-coverage -g $CFLAGS"
5937  LDFLAGS="-fprofile-arcs -ftest-coverage $LDFLAGS"
5938elif test "$fortify_source" = "yes" ; then
5939  CFLAGS="-O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $CFLAGS"
5940elif test "$debug" = "no"; then
5941  CFLAGS="-O2 $CFLAGS"
5942fi
5943
5944if test "$have_asan" = "yes"; then
5945  CFLAGS="-fsanitize=address $CFLAGS"
5946  if test "$have_asan_iface_h" = "no" ; then
5947      echo "ASAN build enabled, but ASAN header missing." \
5948           "Without code annotation, the report may be inferior."
5949  elif test "$have_asan_iface_fiber" = "no" ; then
5950      echo "ASAN build enabled, but ASAN header is too old." \
5951           "Without code annotation, the report may be inferior."
5952  fi
5953fi
5954if test "$have_ubsan" = "yes"; then
5955  CFLAGS="-fsanitize=undefined $CFLAGS"
5956fi
5957
5958##########################################
5959# Do we have libnfs
5960if test "$libnfs" != "no" ; then
5961  if $pkg_config --atleast-version=1.9.3 libnfs; then
5962    libnfs="yes"
5963    libnfs_libs=$($pkg_config --libs libnfs)
5964  else
5965    if test "$libnfs" = "yes" ; then
5966      feature_not_found "libnfs" "Install libnfs devel >= 1.9.3"
5967    fi
5968    libnfs="no"
5969  fi
5970fi
5971
5972##########################################
5973# Do we have libudev
5974if test "$libudev" != "no" ; then
5975  if $pkg_config libudev && test "$static" != "yes"; then
5976    libudev="yes"
5977    libudev_libs=$($pkg_config --libs libudev)
5978  else
5979    libudev="no"
5980  fi
5981fi
5982
5983# Now we've finished running tests it's OK to add -Werror to the compiler flags
5984if test "$werror" = "yes"; then
5985    QEMU_CFLAGS="-Werror $QEMU_CFLAGS"
5986fi
5987
5988if test "$solaris" = "no" ; then
5989    if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
5990        LDFLAGS="-Wl,--warn-common $LDFLAGS"
5991    fi
5992fi
5993
5994# test if pod2man has --utf8 option
5995if pod2man --help | grep -q utf8; then
5996    POD2MAN="pod2man --utf8"
5997else
5998    POD2MAN="pod2man"
5999fi
6000
6001# Use ASLR, no-SEH and DEP if available
6002if test "$mingw32" = "yes" ; then
6003    for flag in --dynamicbase --no-seh --nxcompat; do
6004        if ld_has $flag ; then
6005            LDFLAGS="-Wl,$flag $LDFLAGS"
6006        fi
6007    done
6008fi
6009
6010# Disable OpenBSD W^X if available
6011if test "$tcg" = "yes" && test "$targetos" = "OpenBSD"; then
6012    cat > $TMPC <<EOF
6013    int main(void) { return 0; }
6014EOF
6015    wx_ldflags="-Wl,-z,wxneeded"
6016    if compile_prog "" "$wx_ldflags"; then
6017        QEMU_LDFLAGS="$QEMU_LDFLAGS $wx_ldflags"
6018    fi
6019fi
6020
6021qemu_confdir=$sysconfdir$confsuffix
6022qemu_moddir=$libdir$confsuffix
6023qemu_datadir=$datadir$confsuffix
6024qemu_localedir="$datadir/locale"
6025qemu_icondir="$datadir/icons"
6026qemu_desktopdir="$datadir/applications"
6027
6028# We can only support ivshmem if we have eventfd
6029if [ "$eventfd" = "yes" ]; then
6030  ivshmem=yes
6031fi
6032
6033tools=""
6034if test "$want_tools" = "yes" ; then
6035  tools="qemu-img\$(EXESUF) qemu-io\$(EXESUF) qemu-edid\$(EXESUF) $tools"
6036  if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" ] ; then
6037    tools="qemu-nbd\$(EXESUF) $tools"
6038  fi
6039  if [ "$ivshmem" = "yes" ]; then
6040    tools="ivshmem-client\$(EXESUF) ivshmem-server\$(EXESUF) $tools"
6041  fi
6042  if [ "$curl" = "yes" ]; then
6043      tools="elf2dmp\$(EXESUF) $tools"
6044  fi
6045fi
6046if test "$softmmu" = yes ; then
6047  if test "$linux" = yes; then
6048    if test "$virtfs" != no && test "$cap" = yes && test "$attr" = yes ; then
6049      virtfs=yes
6050      tools="$tools fsdev/virtfs-proxy-helper\$(EXESUF)"
6051    else
6052      if test "$virtfs" = yes; then
6053        error_exit "VirtFS requires libcap devel and libattr devel"
6054      fi
6055      virtfs=no
6056    fi
6057    if test "$mpath" != no && test "$mpathpersist" = yes ; then
6058      mpath=yes
6059    else
6060      if test "$mpath" = yes; then
6061        error_exit "Multipath requires libmpathpersist devel"
6062      fi
6063      mpath=no
6064    fi
6065    tools="$tools scsi/qemu-pr-helper\$(EXESUF)"
6066  else
6067    if test "$virtfs" = yes; then
6068      error_exit "VirtFS is supported only on Linux"
6069    fi
6070    virtfs=no
6071    if test "$mpath" = yes; then
6072      error_exit "Multipath is supported only on Linux"
6073    fi
6074    mpath=no
6075  fi
6076  if test "$xkbcommon" = "yes"; then
6077    tools="qemu-keymap\$(EXESUF) $tools"
6078  fi
6079fi
6080
6081# Probe for guest agent support/options
6082
6083if [ "$guest_agent" != "no" ]; then
6084  if [ "$softmmu" = no -a "$want_tools" = no ] ; then
6085      guest_agent=no
6086  elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
6087      tools="qemu-ga\$(EXESUF) $tools"
6088      guest_agent=yes
6089  elif [ "$guest_agent" != yes ]; then
6090      guest_agent=no
6091  else
6092      error_exit "Guest agent is not supported on this platform"
6093  fi
6094fi
6095
6096# Guest agent Window MSI  package
6097
6098if test "$guest_agent" != yes; then
6099  if test "$guest_agent_msi" = yes; then
6100    error_exit "MSI guest agent package requires guest agent enabled"
6101  fi
6102  guest_agent_msi=no
6103elif test "$mingw32" != "yes"; then
6104  if test "$guest_agent_msi" = "yes"; then
6105    error_exit "MSI guest agent package is available only for MinGW Windows cross-compilation"
6106  fi
6107  guest_agent_msi=no
6108elif ! has wixl; then
6109  if test "$guest_agent_msi" = "yes"; then
6110    error_exit "MSI guest agent package requires wixl tool installed ( usually from msitools package )"
6111  fi
6112  guest_agent_msi=no
6113else
6114  # we support qemu-ga, mingw32, and wixl: default to MSI enabled if it wasn't
6115  # disabled explicitly
6116  if test "$guest_agent_msi" != "no"; then
6117    guest_agent_msi=yes
6118  fi
6119fi
6120
6121if test "$guest_agent_msi" = "yes"; then
6122  if test "$guest_agent_with_vss" = "yes"; then
6123    QEMU_GA_MSI_WITH_VSS="-D InstallVss"
6124  fi
6125
6126  if test "$QEMU_GA_MANUFACTURER" = ""; then
6127    QEMU_GA_MANUFACTURER=QEMU
6128  fi
6129
6130  if test "$QEMU_GA_DISTRO" = ""; then
6131    QEMU_GA_DISTRO=Linux
6132  fi
6133
6134  if test "$QEMU_GA_VERSION" = ""; then
6135      QEMU_GA_VERSION=$(cat $source_path/VERSION)
6136  fi
6137
6138  QEMU_GA_MSI_MINGW_DLL_PATH="-D Mingw_dlls=$($pkg_config --variable=prefix glib-2.0)/bin"
6139
6140  case "$cpu" in
6141  x86_64)
6142    QEMU_GA_MSI_ARCH="-a x64 -D Arch=64"
6143    ;;
6144  i386)
6145    QEMU_GA_MSI_ARCH="-D Arch=32"
6146    ;;
6147  *)
6148    error_exit "CPU $cpu not supported for building installation package"
6149    ;;
6150  esac
6151fi
6152
6153# Mac OS X ships with a broken assembler
6154roms=
6155if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
6156        test "$targetos" != "Darwin" && test "$targetos" != "SunOS" && \
6157        test "$softmmu" = yes ; then
6158    # Different host OS linkers have different ideas about the name of the ELF
6159    # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
6160    # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
6161    for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
6162        if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
6163            ld_i386_emulation="$emu"
6164            roms="optionrom"
6165            break
6166        fi
6167    done
6168fi
6169
6170# Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
6171if test "$cpu" = "s390x" ; then
6172  write_c_skeleton
6173  if compile_prog "-march=z900" ""; then
6174    roms="$roms s390-ccw"
6175  fi
6176fi
6177
6178# Probe for the need for relocating the user-only binary.
6179if ( [ "$linux_user" = yes ] || [ "$bsd_user" = yes ] ) && [ "$pie" = no ]; then
6180  textseg_addr=
6181  case "$cpu" in
6182    arm | i386 | ppc* | s390* | sparc* | x86_64 | x32)
6183      # ??? Rationale for choosing this address
6184      textseg_addr=0x60000000
6185      ;;
6186    mips)
6187      # A 256M aligned address, high in the address space, with enough
6188      # room for the code_gen_buffer above it before the stack.
6189      textseg_addr=0x60000000
6190      ;;
6191  esac
6192  if [ -n "$textseg_addr" ]; then
6193    cat > $TMPC <<EOF
6194    int main(void) { return 0; }
6195EOF
6196    textseg_ldflags="-Wl,-Ttext-segment=$textseg_addr"
6197    if ! compile_prog "" "$textseg_ldflags"; then
6198      # In case ld does not support -Ttext-segment, edit the default linker
6199      # script via sed to set the .text start addr.  This is needed on FreeBSD
6200      # at least.
6201      if ! $ld --verbose >/dev/null 2>&1; then
6202        error_exit \
6203            "We need to link the QEMU user mode binaries at a" \
6204            "specific text address. Unfortunately your linker" \
6205            "doesn't support either the -Ttext-segment option or" \
6206            "printing the default linker script with --verbose." \
6207            "If you don't want the user mode binaries, pass the" \
6208            "--disable-user option to configure."
6209      fi
6210
6211      $ld --verbose | sed \
6212        -e '1,/==================================================/d' \
6213        -e '/==================================================/,$d' \
6214        -e "s/[.] = [0-9a-fx]* [+] SIZEOF_HEADERS/. = $textseg_addr + SIZEOF_HEADERS/" \
6215        -e "s/__executable_start = [0-9a-fx]*/__executable_start = $textseg_addr/" > config-host.ld
6216      textseg_ldflags="-Wl,-T../config-host.ld"
6217    fi
6218  fi
6219fi
6220
6221# Check that the C++ compiler exists and works with the C compiler.
6222# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
6223if has $cxx; then
6224    cat > $TMPC <<EOF
6225int c_function(void);
6226int main(void) { return c_function(); }
6227EOF
6228
6229    compile_object
6230
6231    cat > $TMPCXX <<EOF
6232extern "C" {
6233   int c_function(void);
6234}
6235int c_function(void) { return 42; }
6236EOF
6237
6238    update_cxxflags
6239
6240    if do_cxx $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $LDFLAGS; then
6241        # C++ compiler $cxx works ok with C compiler $cc
6242        :
6243    else
6244        echo "C++ compiler $cxx does not work with C compiler $cc"
6245        echo "Disabling C++ specific optional code"
6246        cxx=
6247    fi
6248else
6249    echo "No C++ compiler available; disabling C++ specific optional code"
6250    cxx=
6251fi
6252
6253echo_version() {
6254    if test "$1" = "yes" ; then
6255        echo "($2)"
6256    fi
6257}
6258
6259# prepend pixman and ftd flags after all config tests are done
6260QEMU_CFLAGS="$pixman_cflags $fdt_cflags $QEMU_CFLAGS"
6261QEMU_LDFLAGS="$fdt_ldflags $QEMU_LDFLAGS"
6262libs_softmmu="$pixman_libs $libs_softmmu"
6263
6264echo "Install prefix    $prefix"
6265echo "BIOS directory    $(eval echo $qemu_datadir)"
6266echo "firmware path     $(eval echo $firmwarepath)"
6267echo "binary directory  $(eval echo $bindir)"
6268echo "library directory $(eval echo $libdir)"
6269echo "module directory  $(eval echo $qemu_moddir)"
6270echo "libexec directory $(eval echo $libexecdir)"
6271echo "include directory $(eval echo $includedir)"
6272echo "config directory  $(eval echo $sysconfdir)"
6273if test "$mingw32" = "no" ; then
6274echo "local state directory   $(eval echo $local_statedir)"
6275echo "Manual directory  $(eval echo $mandir)"
6276echo "ELF interp prefix $interp_prefix"
6277else
6278echo "local state directory   queried at runtime"
6279echo "Windows SDK       $win_sdk"
6280fi
6281echo "Source path       $source_path"
6282echo "GIT binary        $git"
6283echo "GIT submodules    $git_submodules"
6284echo "C compiler        $cc"
6285echo "Host C compiler   $host_cc"
6286echo "C++ compiler      $cxx"
6287echo "Objective-C compiler $objcc"
6288echo "ARFLAGS           $ARFLAGS"
6289echo "CFLAGS            $CFLAGS"
6290echo "QEMU_CFLAGS       $QEMU_CFLAGS"
6291echo "LDFLAGS           $LDFLAGS"
6292echo "QEMU_LDFLAGS      $QEMU_LDFLAGS"
6293echo "make              $make"
6294echo "install           $install"
6295echo "python            $python ($python_version)"
6296echo "slirp support     $slirp $(echo_version $slirp $slirp_version)"
6297if test "$slirp" != "no" ; then
6298    echo "smbd              $smbd"
6299fi
6300echo "module support    $modules"
6301echo "host CPU          $cpu"
6302echo "host big endian   $bigendian"
6303echo "target list       $target_list"
6304echo "gprof enabled     $gprof"
6305echo "sparse enabled    $sparse"
6306echo "strip binaries    $strip_opt"
6307echo "profiler          $profiler"
6308echo "static build      $static"
6309if test "$darwin" = "yes" ; then
6310    echo "Cocoa support     $cocoa"
6311fi
6312echo "SDL support       $sdl $(echo_version $sdl $sdlversion)"
6313echo "SDL image support $sdl_image"
6314echo "GTK support       $gtk $(echo_version $gtk $gtk_version)"
6315echo "GTK GL support    $gtk_gl"
6316echo "VTE support       $vte $(echo_version $vte $vteversion)"
6317echo "TLS priority      $tls_priority"
6318echo "GNUTLS support    $gnutls"
6319echo "libgcrypt         $gcrypt"
6320echo "nettle            $nettle $(echo_version $nettle $nettle_version)"
6321echo "libtasn1          $tasn1"
6322echo "PAM               $auth_pam"
6323echo "iconv support     $iconv"
6324echo "curses support    $curses"
6325echo "virgl support     $virglrenderer $(echo_version $virglrenderer $virgl_version)"
6326echo "curl support      $curl"
6327echo "mingw32 support   $mingw32"
6328echo "Audio drivers     $audio_drv_list"
6329echo "Block whitelist (rw) $block_drv_rw_whitelist"
6330echo "Block whitelist (ro) $block_drv_ro_whitelist"
6331echo "VirtFS support    $virtfs"
6332echo "Multipath support $mpath"
6333echo "VNC support       $vnc"
6334if test "$vnc" = "yes" ; then
6335    echo "VNC SASL support  $vnc_sasl"
6336    echo "VNC JPEG support  $vnc_jpeg"
6337    echo "VNC PNG support   $vnc_png"
6338fi
6339echo "xen support       $xen"
6340if test "$xen" = "yes" ; then
6341  echo "xen ctrl version  $xen_ctrl_version"
6342fi
6343echo "brlapi support    $brlapi"
6344echo "bluez  support    $bluez"
6345echo "Documentation     $docs"
6346echo "PIE               $pie"
6347echo "vde support       $vde"
6348echo "netmap support    $netmap"
6349echo "Linux AIO support $linux_aio"
6350echo "ATTR/XATTR support $attr"
6351echo "Install blobs     $blobs"
6352echo "KVM support       $kvm"
6353echo "HAX support       $hax"
6354echo "HVF support       $hvf"
6355echo "WHPX support      $whpx"
6356echo "TCG support       $tcg"
6357if test "$tcg" = "yes" ; then
6358    echo "TCG debug enabled $debug_tcg"
6359    echo "TCG interpreter   $tcg_interpreter"
6360fi
6361echo "malloc trim support $malloc_trim"
6362echo "RDMA support      $rdma"
6363echo "PVRDMA support    $pvrdma"
6364echo "fdt support       $fdt"
6365echo "membarrier        $membarrier"
6366echo "preadv support    $preadv"
6367echo "fdatasync         $fdatasync"
6368echo "madvise           $madvise"
6369echo "posix_madvise     $posix_madvise"
6370echo "posix_memalign    $posix_memalign"
6371echo "libcap-ng support $cap_ng"
6372echo "vhost-net support $vhost_net"
6373echo "vhost-crypto support $vhost_crypto"
6374echo "vhost-scsi support $vhost_scsi"
6375echo "vhost-vsock support $vhost_vsock"
6376echo "vhost-user support $vhost_user"
6377echo "Trace backends    $trace_backends"
6378if have_backend "simple"; then
6379echo "Trace output file $trace_file-<pid>"
6380fi
6381echo "spice support     $spice $(echo_version $spice $spice_protocol_version/$spice_server_version)"
6382echo "rbd support       $rbd"
6383echo "xfsctl support    $xfs"
6384echo "smartcard support $smartcard"
6385echo "libusb            $libusb"
6386echo "usb net redir     $usb_redir"
6387echo "OpenGL support    $opengl"
6388echo "OpenGL dmabufs    $opengl_dmabuf"
6389echo "libiscsi support  $libiscsi"
6390echo "libnfs support    $libnfs"
6391echo "build guest agent $guest_agent"
6392echo "QGA VSS support   $guest_agent_with_vss"
6393echo "QGA w32 disk info $guest_agent_ntddscsi"
6394echo "QGA MSI support   $guest_agent_msi"
6395echo "seccomp support   $seccomp"
6396echo "coroutine backend $coroutine"
6397echo "coroutine pool    $coroutine_pool"
6398echo "debug stack usage $debug_stack_usage"
6399echo "mutex debugging   $debug_mutex"
6400echo "crypto afalg      $crypto_afalg"
6401echo "GlusterFS support $glusterfs"
6402echo "gcov              $gcov_tool"
6403echo "gcov enabled      $gcov"
6404echo "TPM support       $tpm"
6405echo "libssh support    $libssh"
6406echo "QOM debugging     $qom_cast_debug"
6407echo "Live block migration $live_block_migration"
6408echo "lzo support       $lzo"
6409echo "snappy support    $snappy"
6410echo "bzip2 support     $bzip2"
6411echo "lzfse support     $lzfse"
6412echo "NUMA host support $numa"
6413echo "libxml2           $libxml2"
6414echo "tcmalloc support  $tcmalloc"
6415echo "jemalloc support  $jemalloc"
6416echo "avx2 optimization $avx2_opt"
6417echo "replication support $replication"
6418echo "VxHS block device $vxhs"
6419echo "bochs support     $bochs"
6420echo "cloop support     $cloop"
6421echo "dmg support       $dmg"
6422echo "qcow v1 support   $qcow1"
6423echo "vdi support       $vdi"
6424echo "vvfat support     $vvfat"
6425echo "qed support       $qed"
6426echo "parallels support $parallels"
6427echo "sheepdog support  $sheepdog"
6428echo "capstone          $capstone"
6429echo "libpmem support   $libpmem"
6430echo "libudev           $libudev"
6431echo "default devices   $default_devices"
6432
6433if test "$supported_cpu" = "no"; then
6434    echo
6435    echo "WARNING: SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!"
6436    echo
6437    echo "CPU host architecture $cpu support is not currently maintained."
6438    echo "The QEMU project intends to remove support for this host CPU in"
6439    echo "a future release if nobody volunteers to maintain it and to"
6440    echo "provide a build host for our continuous integration setup."
6441    echo "configure has succeeded and you can continue to build, but"
6442    echo "if you care about QEMU on this platform you should contact"
6443    echo "us upstream at qemu-devel@nongnu.org."
6444fi
6445
6446if test "$supported_os" = "no"; then
6447    echo
6448    echo "WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!"
6449    echo
6450    echo "Host OS $targetos support is not currently maintained."
6451    echo "The QEMU project intends to remove support for this host OS in"
6452    echo "a future release if nobody volunteers to maintain it and to"
6453    echo "provide a build host for our continuous integration setup."
6454    echo "configure has succeeded and you can continue to build, but"
6455    echo "if you care about QEMU on this platform you should contact"
6456    echo "us upstream at qemu-devel@nongnu.org."
6457fi
6458
6459# Note that if the Python conditional here evaluates True we will exit
6460# with status 1 which is a shell 'false' value.
6461if ! $python -c 'import sys; sys.exit(sys.version_info < (3,0))'; then
6462  echo
6463  echo "warning: Python 2 support is deprecated" >&2
6464  echo "warning: Python 3 will be required for building future versions of QEMU" >&2
6465  python2="y"
6466fi
6467
6468config_host_mak="config-host.mak"
6469
6470echo "# Automatically generated by configure - do not modify" >config-all-disas.mak
6471
6472echo "# Automatically generated by configure - do not modify" > $config_host_mak
6473echo >> $config_host_mak
6474
6475echo all: >> $config_host_mak
6476echo "prefix=$prefix" >> $config_host_mak
6477echo "bindir=$bindir" >> $config_host_mak
6478echo "libdir=$libdir" >> $config_host_mak
6479echo "libexecdir=$libexecdir" >> $config_host_mak
6480echo "includedir=$includedir" >> $config_host_mak
6481echo "mandir=$mandir" >> $config_host_mak
6482echo "sysconfdir=$sysconfdir" >> $config_host_mak
6483echo "qemu_confdir=$qemu_confdir" >> $config_host_mak
6484echo "qemu_datadir=$qemu_datadir" >> $config_host_mak
6485echo "qemu_firmwarepath=$firmwarepath" >> $config_host_mak
6486echo "qemu_docdir=$qemu_docdir" >> $config_host_mak
6487echo "qemu_moddir=$qemu_moddir" >> $config_host_mak
6488if test "$mingw32" = "no" ; then
6489  echo "qemu_localstatedir=$local_statedir" >> $config_host_mak
6490fi
6491echo "qemu_helperdir=$libexecdir" >> $config_host_mak
6492echo "qemu_localedir=$qemu_localedir" >> $config_host_mak
6493echo "qemu_icondir=$qemu_icondir" >> $config_host_mak
6494echo "qemu_desktopdir=$qemu_desktopdir" >> $config_host_mak
6495echo "libs_cpu=$libs_cpu" >> $config_host_mak
6496echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
6497echo "GIT=$git" >> $config_host_mak
6498echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
6499echo "GIT_UPDATE=$git_update" >> $config_host_mak
6500
6501echo "ARCH=$ARCH" >> $config_host_mak
6502
6503if test "$default_devices" = "yes" ; then
6504  echo "CONFIG_MINIKCONF_MODE=--defconfig" >> $config_host_mak
6505else
6506  echo "CONFIG_MINIKCONF_MODE=--allnoconfig" >> $config_host_mak
6507fi
6508if test "$debug_tcg" = "yes" ; then
6509  echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
6510fi
6511if test "$strip_opt" = "yes" ; then
6512  echo "STRIP=${strip}" >> $config_host_mak
6513fi
6514if test "$bigendian" = "yes" ; then
6515  echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
6516fi
6517if test "$mingw32" = "yes" ; then
6518  echo "CONFIG_WIN32=y" >> $config_host_mak
6519  rc_version=$(cat $source_path/VERSION)
6520  version_major=${rc_version%%.*}
6521  rc_version=${rc_version#*.}
6522  version_minor=${rc_version%%.*}
6523  rc_version=${rc_version#*.}
6524  version_subminor=${rc_version%%.*}
6525  version_micro=0
6526  echo "CONFIG_FILEVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
6527  echo "CONFIG_PRODUCTVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
6528  if test "$guest_agent_with_vss" = "yes" ; then
6529    echo "CONFIG_QGA_VSS=y" >> $config_host_mak
6530    echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
6531    echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
6532  fi
6533  if test "$guest_agent_ntddscsi" = "yes" ; then
6534    echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
6535  fi
6536  if test "$guest_agent_msi" = "yes"; then
6537    echo "QEMU_GA_MSI_ENABLED=yes" >> $config_host_mak
6538    echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
6539    echo "QEMU_GA_MSI_WITH_VSS=${QEMU_GA_MSI_WITH_VSS}" >> $config_host_mak
6540    echo "QEMU_GA_MSI_ARCH=${QEMU_GA_MSI_ARCH}" >> $config_host_mak
6541    echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
6542    echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
6543    echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
6544  fi
6545else
6546  echo "CONFIG_POSIX=y" >> $config_host_mak
6547fi
6548
6549if test "$linux" = "yes" ; then
6550  echo "CONFIG_LINUX=y" >> $config_host_mak
6551fi
6552
6553if test "$darwin" = "yes" ; then
6554  echo "CONFIG_DARWIN=y" >> $config_host_mak
6555fi
6556
6557if test "$solaris" = "yes" ; then
6558  echo "CONFIG_SOLARIS=y" >> $config_host_mak
6559fi
6560if test "$haiku" = "yes" ; then
6561  echo "CONFIG_HAIKU=y" >> $config_host_mak
6562fi
6563if test "$static" = "yes" ; then
6564  echo "CONFIG_STATIC=y" >> $config_host_mak
6565fi
6566if test "$profiler" = "yes" ; then
6567  echo "CONFIG_PROFILER=y" >> $config_host_mak
6568fi
6569if test "$want_tools" = "yes" ; then
6570  echo "CONFIG_TOOLS=y" >> $config_host_mak
6571fi
6572if test "$slirp" != "no"; then
6573  echo "CONFIG_SLIRP=y" >> $config_host_mak
6574  echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
6575  echo "SLIRP_CFLAGS=$slirp_cflags" >> $config_host_mak
6576  echo "SLIRP_LIBS=$slirp_libs" >> $config_host_mak
6577fi
6578if [ "$slirp" = "git" -o "$slirp" = "internal" ]; then
6579    echo "config-host.h: slirp/all" >> $config_host_mak
6580fi
6581if test "$vde" = "yes" ; then
6582  echo "CONFIG_VDE=y" >> $config_host_mak
6583  echo "VDE_LIBS=$vde_libs" >> $config_host_mak
6584fi
6585if test "$netmap" = "yes" ; then
6586  echo "CONFIG_NETMAP=y" >> $config_host_mak
6587fi
6588if test "$l2tpv3" = "yes" ; then
6589  echo "CONFIG_L2TPV3=y" >> $config_host_mak
6590fi
6591if test "$cap_ng" = "yes" ; then
6592  echo "CONFIG_LIBCAP=y" >> $config_host_mak
6593fi
6594echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
6595for drv in $audio_drv_list; do
6596    def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
6597    case "$drv" in
6598	alsa | oss | pa | sdl)
6599	    echo "$def=m" >> $config_host_mak ;;
6600	*)
6601	    echo "$def=y" >> $config_host_mak ;;
6602    esac
6603done
6604echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak
6605echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
6606echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak
6607echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak
6608echo "OSS_LIBS=$oss_libs" >> $config_host_mak
6609if test "$audio_win_int" = "yes" ; then
6610  echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
6611fi
6612echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
6613echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
6614if test "$vnc" = "yes" ; then
6615  echo "CONFIG_VNC=y" >> $config_host_mak
6616fi
6617if test "$vnc_sasl" = "yes" ; then
6618  echo "CONFIG_VNC_SASL=y" >> $config_host_mak
6619fi
6620if test "$vnc_jpeg" = "yes" ; then
6621  echo "CONFIG_VNC_JPEG=y" >> $config_host_mak
6622fi
6623if test "$vnc_png" = "yes" ; then
6624  echo "CONFIG_VNC_PNG=y" >> $config_host_mak
6625fi
6626if test "$xkbcommon" = "yes" ; then
6627  echo "XKBCOMMON_CFLAGS=$xkbcommon_cflags" >> $config_host_mak
6628  echo "XKBCOMMON_LIBS=$xkbcommon_libs" >> $config_host_mak
6629fi
6630if test "$xfs" = "yes" ; then
6631  echo "CONFIG_XFS=y" >> $config_host_mak
6632fi
6633qemu_version=$(head $source_path/VERSION)
6634echo "VERSION=$qemu_version" >>$config_host_mak
6635echo "PKGVERSION=$pkgversion" >>$config_host_mak
6636echo "SRC_PATH=$source_path" >> $config_host_mak
6637echo "TARGET_DIRS=$target_list" >> $config_host_mak
6638if [ "$docs" = "yes" ] ; then
6639  echo "BUILD_DOCS=yes" >> $config_host_mak
6640fi
6641if test "$modules" = "yes"; then
6642  # $shacmd can generate a hash started with digit, which the compiler doesn't
6643  # like as an symbol. So prefix it with an underscore
6644  echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
6645  echo "CONFIG_MODULES=y" >> $config_host_mak
6646fi
6647if test "$have_x11" = "yes" && test "$need_x11" = "yes"; then
6648  echo "CONFIG_X11=y" >> $config_host_mak
6649  echo "X11_CFLAGS=$x11_cflags" >> $config_host_mak
6650  echo "X11_LIBS=$x11_libs" >> $config_host_mak
6651fi
6652if test "$sdl" = "yes" ; then
6653  echo "CONFIG_SDL=m" >> $config_host_mak
6654  echo "SDL_CFLAGS=$sdl_cflags" >> $config_host_mak
6655  echo "SDL_LIBS=$sdl_libs" >> $config_host_mak
6656  if test "$sdl_image" = "yes" ; then
6657      echo "CONFIG_SDL_IMAGE=y" >> $config_host_mak
6658  fi
6659fi
6660if test "$cocoa" = "yes" ; then
6661  echo "CONFIG_COCOA=y" >> $config_host_mak
6662fi
6663if test "$iconv" = "yes" ; then
6664  echo "CONFIG_ICONV=y" >> $config_host_mak
6665  echo "ICONV_CFLAGS=$iconv_cflags" >> $config_host_mak
6666  echo "ICONV_LIBS=$iconv_lib" >> $config_host_mak
6667fi
6668if test "$curses" = "yes" ; then
6669  echo "CONFIG_CURSES=m" >> $config_host_mak
6670  echo "CURSES_CFLAGS=$curses_inc" >> $config_host_mak
6671  echo "CURSES_LIBS=$curses_lib" >> $config_host_mak
6672fi
6673if test "$pipe2" = "yes" ; then
6674  echo "CONFIG_PIPE2=y" >> $config_host_mak
6675fi
6676if test "$accept4" = "yes" ; then
6677  echo "CONFIG_ACCEPT4=y" >> $config_host_mak
6678fi
6679if test "$splice" = "yes" ; then
6680  echo "CONFIG_SPLICE=y" >> $config_host_mak
6681fi
6682if test "$eventfd" = "yes" ; then
6683  echo "CONFIG_EVENTFD=y" >> $config_host_mak
6684fi
6685if test "$memfd" = "yes" ; then
6686  echo "CONFIG_MEMFD=y" >> $config_host_mak
6687fi
6688if test "$have_usbfs" = "yes" ; then
6689  echo "CONFIG_USBFS=y" >> $config_host_mak
6690fi
6691if test "$fallocate" = "yes" ; then
6692  echo "CONFIG_FALLOCATE=y" >> $config_host_mak
6693fi
6694if test "$fallocate_punch_hole" = "yes" ; then
6695  echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
6696fi
6697if test "$fallocate_zero_range" = "yes" ; then
6698  echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak
6699fi
6700if test "$posix_fallocate" = "yes" ; then
6701  echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
6702fi
6703if test "$sync_file_range" = "yes" ; then
6704  echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
6705fi
6706if test "$fiemap" = "yes" ; then
6707  echo "CONFIG_FIEMAP=y" >> $config_host_mak
6708fi
6709if test "$dup3" = "yes" ; then
6710  echo "CONFIG_DUP3=y" >> $config_host_mak
6711fi
6712if test "$ppoll" = "yes" ; then
6713  echo "CONFIG_PPOLL=y" >> $config_host_mak
6714fi
6715if test "$prctl_pr_set_timerslack" = "yes" ; then
6716  echo "CONFIG_PRCTL_PR_SET_TIMERSLACK=y" >> $config_host_mak
6717fi
6718if test "$epoll" = "yes" ; then
6719  echo "CONFIG_EPOLL=y" >> $config_host_mak
6720fi
6721if test "$epoll_create1" = "yes" ; then
6722  echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
6723fi
6724if test "$sendfile" = "yes" ; then
6725  echo "CONFIG_SENDFILE=y" >> $config_host_mak
6726fi
6727if test "$timerfd" = "yes" ; then
6728  echo "CONFIG_TIMERFD=y" >> $config_host_mak
6729fi
6730if test "$setns" = "yes" ; then
6731  echo "CONFIG_SETNS=y" >> $config_host_mak
6732fi
6733if test "$clock_adjtime" = "yes" ; then
6734  echo "CONFIG_CLOCK_ADJTIME=y" >> $config_host_mak
6735fi
6736if test "$syncfs" = "yes" ; then
6737  echo "CONFIG_SYNCFS=y" >> $config_host_mak
6738fi
6739if test "$inotify" = "yes" ; then
6740  echo "CONFIG_INOTIFY=y" >> $config_host_mak
6741fi
6742if test "$inotify1" = "yes" ; then
6743  echo "CONFIG_INOTIFY1=y" >> $config_host_mak
6744fi
6745if test "$sem_timedwait" = "yes" ; then
6746  echo "CONFIG_SEM_TIMEDWAIT=y" >> $config_host_mak
6747fi
6748if test "$strchrnul" = "yes" ; then
6749  echo "HAVE_STRCHRNUL=y" >> $config_host_mak
6750fi
6751if test "$byteswap_h" = "yes" ; then
6752  echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
6753fi
6754if test "$bswap_h" = "yes" ; then
6755  echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
6756fi
6757if test "$curl" = "yes" ; then
6758  echo "CONFIG_CURL=m" >> $config_host_mak
6759  echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak
6760  echo "CURL_LIBS=$curl_libs" >> $config_host_mak
6761fi
6762if test "$brlapi" = "yes" ; then
6763  echo "CONFIG_BRLAPI=y" >> $config_host_mak
6764  echo "BRLAPI_LIBS=$brlapi_libs" >> $config_host_mak
6765fi
6766if test "$bluez" = "yes" ; then
6767  echo "CONFIG_BLUEZ=y" >> $config_host_mak
6768  echo "BLUEZ_CFLAGS=$bluez_cflags" >> $config_host_mak
6769fi
6770if test "$gtk" = "yes" ; then
6771  echo "CONFIG_GTK=m" >> $config_host_mak
6772  echo "GTK_CFLAGS=$gtk_cflags" >> $config_host_mak
6773  echo "GTK_LIBS=$gtk_libs" >> $config_host_mak
6774  if test "$gtk_gl" = "yes" ; then
6775    echo "CONFIG_GTK_GL=y" >> $config_host_mak
6776  fi
6777fi
6778if test "$gio" = "yes" ; then
6779    echo "CONFIG_GIO=y" >> $config_host_mak
6780    echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
6781    echo "GIO_LIBS=$gio_libs" >> $config_host_mak
6782fi
6783echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
6784if test "$gnutls" = "yes" ; then
6785  echo "CONFIG_GNUTLS=y" >> $config_host_mak
6786fi
6787if test "$gcrypt" = "yes" ; then
6788  echo "CONFIG_GCRYPT=y" >> $config_host_mak
6789  if test "$gcrypt_hmac" = "yes" ; then
6790    echo "CONFIG_GCRYPT_HMAC=y" >> $config_host_mak
6791  fi
6792fi
6793if test "$nettle" = "yes" ; then
6794  echo "CONFIG_NETTLE=y" >> $config_host_mak
6795  echo "CONFIG_NETTLE_VERSION_MAJOR=${nettle_version%%.*}" >> $config_host_mak
6796fi
6797if test "$tasn1" = "yes" ; then
6798  echo "CONFIG_TASN1=y" >> $config_host_mak
6799fi
6800if test "$auth_pam" = "yes" ; then
6801    echo "CONFIG_AUTH_PAM=y" >> $config_host_mak
6802fi
6803if test "$have_ifaddrs_h" = "yes" ; then
6804    echo "HAVE_IFADDRS_H=y" >> $config_host_mak
6805fi
6806if test "$have_broken_size_max" = "yes" ; then
6807    echo "HAVE_BROKEN_SIZE_MAX=y" >> $config_host_mak
6808fi
6809
6810# Work around a system header bug with some kernel/XFS header
6811# versions where they both try to define 'struct fsxattr':
6812# xfs headers will not try to redefine structs from linux headers
6813# if this macro is set.
6814if test "$have_fsxattr" = "yes" ; then
6815    echo "HAVE_FSXATTR=y" >> $config_host_mak
6816fi
6817if test "$have_copy_file_range" = "yes" ; then
6818    echo "HAVE_COPY_FILE_RANGE=y" >> $config_host_mak
6819fi
6820if test "$vte" = "yes" ; then
6821  echo "CONFIG_VTE=y" >> $config_host_mak
6822  echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak
6823  echo "VTE_LIBS=$vte_libs" >> $config_host_mak
6824fi
6825if test "$virglrenderer" = "yes" ; then
6826  echo "CONFIG_VIRGL=y" >> $config_host_mak
6827  echo "VIRGL_CFLAGS=$virgl_cflags" >> $config_host_mak
6828  echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak
6829fi
6830if test "$xen" = "yes" ; then
6831  echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
6832  echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
6833fi
6834if test "$linux_aio" = "yes" ; then
6835  echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
6836fi
6837if test "$attr" = "yes" ; then
6838  echo "CONFIG_ATTR=y" >> $config_host_mak
6839fi
6840if test "$libattr" = "yes" ; then
6841  echo "CONFIG_LIBATTR=y" >> $config_host_mak
6842fi
6843if test "$virtfs" = "yes" ; then
6844  echo "CONFIG_VIRTFS=y" >> $config_host_mak
6845fi
6846if test "$mpath" = "yes" ; then
6847  echo "CONFIG_MPATH=y" >> $config_host_mak
6848  if test "$mpathpersist_new_api" = "yes"; then
6849    echo "CONFIG_MPATH_NEW_API=y" >> $config_host_mak
6850  fi
6851fi
6852if test "$vhost_scsi" = "yes" ; then
6853  echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
6854fi
6855if test "$vhost_net" = "yes" ; then
6856  echo "CONFIG_VHOST_NET=y" >> $config_host_mak
6857fi
6858if test "$vhost_net_user" = "yes" ; then
6859  echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
6860fi
6861if test "$vhost_crypto" = "yes" ; then
6862  echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
6863fi
6864if test "$vhost_vsock" = "yes" ; then
6865  echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
6866fi
6867if test "$vhost_kernel" = "yes" ; then
6868  echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
6869fi
6870if test "$vhost_user" = "yes" ; then
6871  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
6872fi
6873if test "$blobs" = "yes" ; then
6874  echo "INSTALL_BLOBS=yes" >> $config_host_mak
6875fi
6876if test "$iovec" = "yes" ; then
6877  echo "CONFIG_IOVEC=y" >> $config_host_mak
6878fi
6879if test "$preadv" = "yes" ; then
6880  echo "CONFIG_PREADV=y" >> $config_host_mak
6881fi
6882if test "$fdt" != "no" ; then
6883  echo "CONFIG_FDT=y" >> $config_host_mak
6884fi
6885if test "$membarrier" = "yes" ; then
6886  echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
6887fi
6888if test "$signalfd" = "yes" ; then
6889  echo "CONFIG_SIGNALFD=y" >> $config_host_mak
6890fi
6891if test "$optreset" = "yes" ; then
6892  echo "HAVE_OPTRESET=y" >> $config_host_mak
6893fi
6894if test "$tcg" = "yes"; then
6895  echo "CONFIG_TCG=y" >> $config_host_mak
6896  if test "$tcg_interpreter" = "yes" ; then
6897    echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
6898  fi
6899fi
6900if test "$fdatasync" = "yes" ; then
6901  echo "CONFIG_FDATASYNC=y" >> $config_host_mak
6902fi
6903if test "$madvise" = "yes" ; then
6904  echo "CONFIG_MADVISE=y" >> $config_host_mak
6905fi
6906if test "$posix_madvise" = "yes" ; then
6907  echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak
6908fi
6909if test "$posix_memalign" = "yes" ; then
6910  echo "CONFIG_POSIX_MEMALIGN=y" >> $config_host_mak
6911fi
6912
6913if test "$spice" = "yes" ; then
6914  echo "CONFIG_SPICE=y" >> $config_host_mak
6915fi
6916
6917if test "$smartcard" = "yes" ; then
6918  echo "CONFIG_SMARTCARD=y" >> $config_host_mak
6919  echo "SMARTCARD_CFLAGS=$libcacard_cflags" >> $config_host_mak
6920  echo "SMARTCARD_LIBS=$libcacard_libs" >> $config_host_mak
6921fi
6922
6923if test "$libusb" = "yes" ; then
6924  echo "CONFIG_USB_LIBUSB=y" >> $config_host_mak
6925  echo "LIBUSB_CFLAGS=$libusb_cflags" >> $config_host_mak
6926  echo "LIBUSB_LIBS=$libusb_libs" >> $config_host_mak
6927fi
6928
6929if test "$usb_redir" = "yes" ; then
6930  echo "CONFIG_USB_REDIR=y" >> $config_host_mak
6931  echo "USB_REDIR_CFLAGS=$usb_redir_cflags" >> $config_host_mak
6932  echo "USB_REDIR_LIBS=$usb_redir_libs" >> $config_host_mak
6933fi
6934
6935if test "$opengl" = "yes" ; then
6936  echo "CONFIG_OPENGL=y" >> $config_host_mak
6937  echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
6938  if test "$opengl_dmabuf" = "yes" ; then
6939    echo "CONFIG_OPENGL_DMABUF=y" >> $config_host_mak
6940  fi
6941fi
6942
6943if test "$gbm" = "yes" ; then
6944    echo "CONFIG_GBM=y" >> $config_host_mak
6945    echo "GBM_LIBS=$gbm_libs" >> $config_host_mak
6946    echo "GBM_CFLAGS=$gbm_cflags" >> $config_host_mak
6947fi
6948
6949
6950if test "$malloc_trim" = "yes" ; then
6951  echo "CONFIG_MALLOC_TRIM=y" >> $config_host_mak
6952fi
6953
6954if test "$avx2_opt" = "yes" ; then
6955  echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
6956fi
6957
6958if test "$lzo" = "yes" ; then
6959  echo "CONFIG_LZO=y" >> $config_host_mak
6960fi
6961
6962if test "$snappy" = "yes" ; then
6963  echo "CONFIG_SNAPPY=y" >> $config_host_mak
6964fi
6965
6966if test "$bzip2" = "yes" ; then
6967  echo "CONFIG_BZIP2=y" >> $config_host_mak
6968  echo "BZIP2_LIBS=-lbz2" >> $config_host_mak
6969fi
6970
6971if test "$lzfse" = "yes" ; then
6972  echo "CONFIG_LZFSE=y" >> $config_host_mak
6973  echo "LZFSE_LIBS=-llzfse" >> $config_host_mak
6974fi
6975
6976if test "$libiscsi" = "yes" ; then
6977  echo "CONFIG_LIBISCSI=m" >> $config_host_mak
6978  echo "LIBISCSI_CFLAGS=$libiscsi_cflags" >> $config_host_mak
6979  echo "LIBISCSI_LIBS=$libiscsi_libs" >> $config_host_mak
6980fi
6981
6982if test "$libnfs" = "yes" ; then
6983  echo "CONFIG_LIBNFS=m" >> $config_host_mak
6984  echo "LIBNFS_LIBS=$libnfs_libs" >> $config_host_mak
6985fi
6986
6987if test "$seccomp" = "yes"; then
6988  echo "CONFIG_SECCOMP=y" >> $config_host_mak
6989  echo "SECCOMP_CFLAGS=$seccomp_cflags" >> $config_host_mak
6990  echo "SECCOMP_LIBS=$seccomp_libs" >> $config_host_mak
6991fi
6992
6993# XXX: suppress that
6994if [ "$bsd" = "yes" ] ; then
6995  echo "CONFIG_BSD=y" >> $config_host_mak
6996fi
6997
6998if test "$localtime_r" = "yes" ; then
6999  echo "CONFIG_LOCALTIME_R=y" >> $config_host_mak
7000fi
7001if test "$qom_cast_debug" = "yes" ; then
7002  echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
7003fi
7004if test "$rbd" = "yes" ; then
7005  echo "CONFIG_RBD=m" >> $config_host_mak
7006  echo "RBD_CFLAGS=$rbd_cflags" >> $config_host_mak
7007  echo "RBD_LIBS=$rbd_libs" >> $config_host_mak
7008fi
7009
7010echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
7011if test "$coroutine_pool" = "yes" ; then
7012  echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
7013else
7014  echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
7015fi
7016
7017if test "$debug_stack_usage" = "yes" ; then
7018  echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
7019fi
7020
7021if test "$crypto_afalg" = "yes" ; then
7022  echo "CONFIG_AF_ALG=y" >> $config_host_mak
7023fi
7024
7025if test "$open_by_handle_at" = "yes" ; then
7026  echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
7027fi
7028
7029if test "$linux_magic_h" = "yes" ; then
7030  echo "CONFIG_LINUX_MAGIC_H=y" >> $config_host_mak
7031fi
7032
7033if test "$pragma_diagnostic_available" = "yes" ; then
7034  echo "CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE=y" >> $config_host_mak
7035fi
7036
7037if test "$valgrind_h" = "yes" ; then
7038  echo "CONFIG_VALGRIND_H=y" >> $config_host_mak
7039fi
7040
7041if test "$have_asan_iface_fiber" = "yes" ; then
7042    echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
7043fi
7044
7045if test "$has_environ" = "yes" ; then
7046  echo "CONFIG_HAS_ENVIRON=y" >> $config_host_mak
7047fi
7048
7049if test "$cpuid_h" = "yes" ; then
7050  echo "CONFIG_CPUID_H=y" >> $config_host_mak
7051fi
7052
7053if test "$int128" = "yes" ; then
7054  echo "CONFIG_INT128=y" >> $config_host_mak
7055fi
7056
7057if test "$atomic128" = "yes" ; then
7058  echo "CONFIG_ATOMIC128=y" >> $config_host_mak
7059fi
7060
7061if test "$cmpxchg128" = "yes" ; then
7062  echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
7063fi
7064
7065if test "$atomic64" = "yes" ; then
7066  echo "CONFIG_ATOMIC64=y" >> $config_host_mak
7067fi
7068
7069if test "$vector16" = "yes" ; then
7070  echo "CONFIG_VECTOR16=y" >> $config_host_mak
7071fi
7072
7073if test "$getauxval" = "yes" ; then
7074  echo "CONFIG_GETAUXVAL=y" >> $config_host_mak
7075fi
7076
7077if test "$glusterfs" = "yes" ; then
7078  echo "CONFIG_GLUSTERFS=m" >> $config_host_mak
7079  echo "GLUSTERFS_CFLAGS=$glusterfs_cflags" >> $config_host_mak
7080  echo "GLUSTERFS_LIBS=$glusterfs_libs" >> $config_host_mak
7081fi
7082
7083if test "$glusterfs_xlator_opt" = "yes" ; then
7084  echo "CONFIG_GLUSTERFS_XLATOR_OPT=y" >> $config_host_mak
7085fi
7086
7087if test "$glusterfs_discard" = "yes" ; then
7088  echo "CONFIG_GLUSTERFS_DISCARD=y" >> $config_host_mak
7089fi
7090
7091if test "$glusterfs_fallocate" = "yes" ; then
7092  echo "CONFIG_GLUSTERFS_FALLOCATE=y" >> $config_host_mak
7093fi
7094
7095if test "$glusterfs_zerofill" = "yes" ; then
7096  echo "CONFIG_GLUSTERFS_ZEROFILL=y" >> $config_host_mak
7097fi
7098
7099if test "$glusterfs_ftruncate_has_stat" = "yes" ; then
7100  echo "CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT=y" >> $config_host_mak
7101fi
7102
7103if test "$glusterfs_iocb_has_stat" = "yes" ; then
7104  echo "CONFIG_GLUSTERFS_IOCB_HAS_STAT=y" >> $config_host_mak
7105fi
7106
7107if test "$libssh" = "yes" ; then
7108  echo "CONFIG_LIBSSH=m" >> $config_host_mak
7109  echo "LIBSSH_CFLAGS=$libssh_cflags" >> $config_host_mak
7110  echo "LIBSSH_LIBS=$libssh_libs" >> $config_host_mak
7111fi
7112
7113if test "$live_block_migration" = "yes" ; then
7114  echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
7115fi
7116
7117if test "$tpm" = "yes"; then
7118  echo 'CONFIG_TPM=y' >> $config_host_mak
7119fi
7120
7121echo "TRACE_BACKENDS=$trace_backends" >> $config_host_mak
7122if have_backend "nop"; then
7123  echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
7124fi
7125if have_backend "simple"; then
7126  echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
7127  # Set the appropriate trace file.
7128  trace_file="\"$trace_file-\" FMT_pid"
7129fi
7130if have_backend "log"; then
7131  echo "CONFIG_TRACE_LOG=y" >> $config_host_mak
7132fi
7133if have_backend "ust"; then
7134  echo "CONFIG_TRACE_UST=y" >> $config_host_mak
7135fi
7136if have_backend "dtrace"; then
7137  echo "CONFIG_TRACE_DTRACE=y" >> $config_host_mak
7138  if test "$trace_backend_stap" = "yes" ; then
7139    echo "CONFIG_TRACE_SYSTEMTAP=y" >> $config_host_mak
7140  fi
7141fi
7142if have_backend "ftrace"; then
7143  if test "$linux" = "yes" ; then
7144    echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak
7145  else
7146    feature_not_found "ftrace(trace backend)" "ftrace requires Linux"
7147  fi
7148fi
7149if have_backend "syslog"; then
7150  if test "$posix_syslog" = "yes" ; then
7151    echo "CONFIG_TRACE_SYSLOG=y" >> $config_host_mak
7152  else
7153    feature_not_found "syslog(trace backend)" "syslog not available"
7154  fi
7155fi
7156echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
7157
7158if test "$rdma" = "yes" ; then
7159  echo "CONFIG_RDMA=y" >> $config_host_mak
7160  echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
7161fi
7162
7163if test "$pvrdma" = "yes" ; then
7164  echo "CONFIG_PVRDMA=y" >> $config_host_mak
7165fi
7166
7167if test "$have_rtnetlink" = "yes" ; then
7168  echo "CONFIG_RTNETLINK=y" >> $config_host_mak
7169fi
7170
7171if test "$libxml2" = "yes" ; then
7172  echo "CONFIG_LIBXML2=y" >> $config_host_mak
7173  echo "LIBXML2_CFLAGS=$libxml2_cflags" >> $config_host_mak
7174  echo "LIBXML2_LIBS=$libxml2_libs" >> $config_host_mak
7175fi
7176
7177if test "$replication" = "yes" ; then
7178  echo "CONFIG_REPLICATION=y" >> $config_host_mak
7179fi
7180
7181if test "$have_af_vsock" = "yes" ; then
7182  echo "CONFIG_AF_VSOCK=y" >> $config_host_mak
7183fi
7184
7185if test "$have_sysmacros" = "yes" ; then
7186  echo "CONFIG_SYSMACROS=y" >> $config_host_mak
7187fi
7188
7189if test "$have_static_assert" = "yes" ; then
7190  echo "CONFIG_STATIC_ASSERT=y" >> $config_host_mak
7191fi
7192
7193if test "$have_utmpx" = "yes" ; then
7194  echo "HAVE_UTMPX=y" >> $config_host_mak
7195fi
7196if test "$have_getrandom" = "yes" ; then
7197  echo "CONFIG_GETRANDOM=y" >> $config_host_mak
7198fi
7199if test "$ivshmem" = "yes" ; then
7200  echo "CONFIG_IVSHMEM=y" >> $config_host_mak
7201fi
7202if test "$capstone" != "no" ; then
7203  echo "CONFIG_CAPSTONE=y" >> $config_host_mak
7204fi
7205if test "$debug_mutex" = "yes" ; then
7206  echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
7207fi
7208
7209# Hold two types of flag:
7210#   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
7211#                                     a thread we have a handle to
7212#   CONFIG_PTHREAD_SETNAME_NP_W_TID - A way of doing it on a particular
7213#                                     platform
7214if test "$pthread_setname_np_w_tid" = "yes" ; then
7215  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
7216  echo "CONFIG_PTHREAD_SETNAME_NP_W_TID=y" >> $config_host_mak
7217elif test "$pthread_setname_np_wo_tid" = "yes" ; then
7218  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
7219  echo "CONFIG_PTHREAD_SETNAME_NP_WO_TID=y" >> $config_host_mak
7220fi
7221
7222if test "$vxhs" = "yes" ; then
7223  echo "CONFIG_VXHS=y" >> $config_host_mak
7224  echo "VXHS_LIBS=$vxhs_libs" >> $config_host_mak
7225fi
7226
7227if test "$libpmem" = "yes" ; then
7228  echo "CONFIG_LIBPMEM=y" >> $config_host_mak
7229fi
7230
7231if test "$bochs" = "yes" ; then
7232  echo "CONFIG_BOCHS=y" >> $config_host_mak
7233fi
7234if test "$cloop" = "yes" ; then
7235  echo "CONFIG_CLOOP=y" >> $config_host_mak
7236fi
7237if test "$dmg" = "yes" ; then
7238  echo "CONFIG_DMG=y" >> $config_host_mak
7239fi
7240if test "$qcow1" = "yes" ; then
7241  echo "CONFIG_QCOW1=y" >> $config_host_mak
7242fi
7243if test "$vdi" = "yes" ; then
7244  echo "CONFIG_VDI=y" >> $config_host_mak
7245fi
7246if test "$vvfat" = "yes" ; then
7247  echo "CONFIG_VVFAT=y" >> $config_host_mak
7248fi
7249if test "$qed" = "yes" ; then
7250  echo "CONFIG_QED=y" >> $config_host_mak
7251fi
7252if test "$parallels" = "yes" ; then
7253  echo "CONFIG_PARALLELS=y" >> $config_host_mak
7254fi
7255if test "$sheepdog" = "yes" ; then
7256  echo "CONFIG_SHEEPDOG=y" >> $config_host_mak
7257fi
7258
7259if test "$tcg_interpreter" = "yes"; then
7260  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/tci $QEMU_INCLUDES"
7261elif test "$ARCH" = "sparc64" ; then
7262  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/sparc $QEMU_INCLUDES"
7263elif test "$ARCH" = "s390x" ; then
7264  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/s390 $QEMU_INCLUDES"
7265elif test "$ARCH" = "x86_64" || test "$ARCH" = "x32" ; then
7266  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/i386 $QEMU_INCLUDES"
7267elif test "$ARCH" = "ppc64" ; then
7268  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/ppc $QEMU_INCLUDES"
7269elif test "$ARCH" = "riscv32" || test "$ARCH" = "riscv64" ; then
7270  QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/riscv $QEMU_INCLUDES"
7271else
7272  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/\$(ARCH) $QEMU_INCLUDES"
7273fi
7274QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg $QEMU_INCLUDES"
7275
7276echo "TOOLS=$tools" >> $config_host_mak
7277echo "ROMS=$roms" >> $config_host_mak
7278echo "MAKE=$make" >> $config_host_mak
7279echo "INSTALL=$install" >> $config_host_mak
7280echo "INSTALL_DIR=$install -d -m 0755" >> $config_host_mak
7281echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
7282echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
7283echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
7284echo "PYTHON=$python" >> $config_host_mak
7285echo "PYTHON2=$python2" >> $config_host_mak
7286echo "CC=$cc" >> $config_host_mak
7287if $iasl -h > /dev/null 2>&1; then
7288  echo "IASL=$iasl" >> $config_host_mak
7289fi
7290echo "HOST_CC=$host_cc" >> $config_host_mak
7291echo "CXX=$cxx" >> $config_host_mak
7292echo "OBJCC=$objcc" >> $config_host_mak
7293echo "AR=$ar" >> $config_host_mak
7294echo "ARFLAGS=$ARFLAGS" >> $config_host_mak
7295echo "AS=$as" >> $config_host_mak
7296echo "CCAS=$ccas" >> $config_host_mak
7297echo "CPP=$cpp" >> $config_host_mak
7298echo "OBJCOPY=$objcopy" >> $config_host_mak
7299echo "LD=$ld" >> $config_host_mak
7300echo "RANLIB=$ranlib" >> $config_host_mak
7301echo "NM=$nm" >> $config_host_mak
7302echo "PKG_CONFIG=$pkg_config_exe" >> $config_host_mak
7303echo "WINDRES=$windres" >> $config_host_mak
7304echo "CFLAGS=$CFLAGS" >> $config_host_mak
7305echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
7306echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
7307echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
7308echo "QEMU_INCLUDES=$QEMU_INCLUDES" >> $config_host_mak
7309if test "$sparse" = "yes" ; then
7310  echo "CC           := REAL_CC=\"\$(CC)\" cgcc"       >> $config_host_mak
7311  echo "CPP          := REAL_CC=\"\$(CPP)\" cgcc"      >> $config_host_mak
7312  echo "CXX          := REAL_CC=\"\$(CXX)\" cgcc"      >> $config_host_mak
7313  echo "HOST_CC      := REAL_CC=\"\$(HOST_CC)\" cgcc"  >> $config_host_mak
7314  echo "QEMU_CFLAGS  += -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-non-pointer-null" >> $config_host_mak
7315fi
7316echo "LDFLAGS=$LDFLAGS" >> $config_host_mak
7317echo "LDFLAGS_NOPIE=$LDFLAGS_NOPIE" >> $config_host_mak
7318echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
7319echo "LD_REL_FLAGS=$LD_REL_FLAGS" >> $config_host_mak
7320echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
7321echo "LIBS+=$LIBS" >> $config_host_mak
7322echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak
7323echo "PTHREAD_LIB=$PTHREAD_LIB" >> $config_host_mak
7324echo "EXESUF=$EXESUF" >> $config_host_mak
7325echo "DSOSUF=$DSOSUF" >> $config_host_mak
7326echo "LDFLAGS_SHARED=$LDFLAGS_SHARED" >> $config_host_mak
7327echo "LIBS_QGA+=$libs_qga" >> $config_host_mak
7328echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak
7329echo "TASN1_CFLAGS=$tasn1_cflags" >> $config_host_mak
7330echo "POD2MAN=$POD2MAN" >> $config_host_mak
7331if test "$gcov" = "yes" ; then
7332  echo "CONFIG_GCOV=y" >> $config_host_mak
7333  echo "GCOV=$gcov_tool" >> $config_host_mak
7334fi
7335
7336if test "$libudev" != "no"; then
7337    echo "CONFIG_LIBUDEV=y" >> $config_host_mak
7338    echo "LIBUDEV_LIBS=$libudev_libs" >> $config_host_mak
7339fi
7340
7341# use included Linux headers
7342if test "$linux" = "yes" ; then
7343  mkdir -p linux-headers
7344  case "$cpu" in
7345  i386|x86_64|x32)
7346    linux_arch=x86
7347    ;;
7348  ppc|ppc64|ppc64le)
7349    linux_arch=powerpc
7350    ;;
7351  s390x)
7352    linux_arch=s390
7353    ;;
7354  aarch64)
7355    linux_arch=arm64
7356    ;;
7357  mips64)
7358    linux_arch=mips
7359    ;;
7360  *)
7361    # For most CPUs the kernel architecture name and QEMU CPU name match.
7362    linux_arch="$cpu"
7363    ;;
7364  esac
7365    # For non-KVM architectures we will not have asm headers
7366    if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
7367      symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
7368    fi
7369fi
7370
7371for target in $target_list; do
7372target_dir="$target"
7373config_target_mak=$target_dir/config-target.mak
7374target_name=$(echo $target | cut -d '-' -f 1)
7375target_aligned_only="no"
7376case "$target_name" in
7377  alpha|hppa|mips64el|mips64|mipsel|mips|mipsn32|mipsn32el|sh4|sh4eb|sparc|sparc64|sparc32plus|xtensa|xtensaeb)
7378  target_aligned_only="yes"
7379  ;;
7380esac
7381target_bigendian="no"
7382case "$target_name" in
7383  armeb|aarch64_be|hppa|lm32|m68k|microblaze|mips|mipsn32|mips64|moxie|or1k|ppc|ppc64|ppc64abi32|s390x|sh4eb|sparc|sparc64|sparc32plus|xtensaeb)
7384  target_bigendian="yes"
7385  ;;
7386esac
7387target_softmmu="no"
7388target_user_only="no"
7389target_linux_user="no"
7390target_bsd_user="no"
7391case "$target" in
7392  ${target_name}-softmmu)
7393    target_softmmu="yes"
7394    ;;
7395  ${target_name}-linux-user)
7396    target_user_only="yes"
7397    target_linux_user="yes"
7398    ;;
7399  ${target_name}-bsd-user)
7400    target_user_only="yes"
7401    target_bsd_user="yes"
7402    ;;
7403  *)
7404    error_exit "Target '$target' not recognised"
7405    exit 1
7406    ;;
7407esac
7408
7409mkdir -p $target_dir
7410echo "# Automatically generated by configure - do not modify" > $config_target_mak
7411
7412bflt="no"
7413mttcg="no"
7414interp_prefix1=$(echo "$interp_prefix" | sed "s/%M/$target_name/g")
7415gdb_xml_files=""
7416
7417TARGET_ARCH="$target_name"
7418TARGET_BASE_ARCH=""
7419TARGET_ABI_DIR=""
7420
7421case "$target_name" in
7422  i386)
7423    mttcg="yes"
7424	gdb_xml_files="i386-32bit.xml"
7425  ;;
7426  x86_64)
7427    TARGET_BASE_ARCH=i386
7428    mttcg="yes"
7429	gdb_xml_files="i386-64bit.xml"
7430  ;;
7431  alpha)
7432    mttcg="yes"
7433  ;;
7434  arm|armeb)
7435    TARGET_ARCH=arm
7436    bflt="yes"
7437    mttcg="yes"
7438    gdb_xml_files="arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"
7439  ;;
7440  aarch64|aarch64_be)
7441    TARGET_ARCH=aarch64
7442    TARGET_BASE_ARCH=arm
7443    bflt="yes"
7444    mttcg="yes"
7445    gdb_xml_files="aarch64-core.xml aarch64-fpu.xml arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"
7446  ;;
7447  cris)
7448  ;;
7449  hppa)
7450    mttcg="yes"
7451  ;;
7452  lm32)
7453  ;;
7454  m68k)
7455    bflt="yes"
7456    gdb_xml_files="cf-core.xml cf-fp.xml m68k-fp.xml"
7457  ;;
7458  microblaze|microblazeel)
7459    TARGET_ARCH=microblaze
7460    bflt="yes"
7461    echo "TARGET_ABI32=y" >> $config_target_mak
7462  ;;
7463  mips|mipsel)
7464    mttcg="yes"
7465    TARGET_ARCH=mips
7466    echo "TARGET_ABI_MIPSO32=y" >> $config_target_mak
7467  ;;
7468  mipsn32|mipsn32el)
7469    mttcg="yes"
7470    TARGET_ARCH=mips64
7471    TARGET_BASE_ARCH=mips
7472    echo "TARGET_ABI_MIPSN32=y" >> $config_target_mak
7473    echo "TARGET_ABI32=y" >> $config_target_mak
7474  ;;
7475  mips64|mips64el)
7476    mttcg="yes"
7477    TARGET_ARCH=mips64
7478    TARGET_BASE_ARCH=mips
7479    echo "TARGET_ABI_MIPSN64=y" >> $config_target_mak
7480  ;;
7481  moxie)
7482  ;;
7483  nios2)
7484  ;;
7485  or1k)
7486    TARGET_ARCH=openrisc
7487    TARGET_BASE_ARCH=openrisc
7488  ;;
7489  ppc)
7490    gdb_xml_files="power-core.xml power-fpu.xml power-altivec.xml power-spe.xml"
7491  ;;
7492  ppc64)
7493    TARGET_BASE_ARCH=ppc
7494    TARGET_ABI_DIR=ppc
7495    mttcg=yes
7496    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
7497  ;;
7498  ppc64le)
7499    TARGET_ARCH=ppc64
7500    TARGET_BASE_ARCH=ppc
7501    TARGET_ABI_DIR=ppc
7502    mttcg=yes
7503    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
7504  ;;
7505  ppc64abi32)
7506    TARGET_ARCH=ppc64
7507    TARGET_BASE_ARCH=ppc
7508    TARGET_ABI_DIR=ppc
7509    echo "TARGET_ABI32=y" >> $config_target_mak
7510    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
7511  ;;
7512  riscv32)
7513    TARGET_BASE_ARCH=riscv
7514    TARGET_ABI_DIR=riscv
7515    mttcg=yes
7516    gdb_xml_files="riscv-32bit-cpu.xml riscv-32bit-fpu.xml riscv-32bit-csr.xml"
7517  ;;
7518  riscv64)
7519    TARGET_BASE_ARCH=riscv
7520    TARGET_ABI_DIR=riscv
7521    mttcg=yes
7522    gdb_xml_files="riscv-64bit-cpu.xml riscv-64bit-fpu.xml riscv-64bit-csr.xml"
7523  ;;
7524  sh4|sh4eb)
7525    TARGET_ARCH=sh4
7526    bflt="yes"
7527  ;;
7528  sparc)
7529  ;;
7530  sparc64)
7531    TARGET_BASE_ARCH=sparc
7532  ;;
7533  sparc32plus)
7534    TARGET_ARCH=sparc64
7535    TARGET_BASE_ARCH=sparc
7536    TARGET_ABI_DIR=sparc
7537    echo "TARGET_ABI32=y" >> $config_target_mak
7538  ;;
7539  s390x)
7540    mttcg=yes
7541    gdb_xml_files="s390x-core64.xml s390-acr.xml s390-fpr.xml s390-vx.xml s390-cr.xml s390-virt.xml s390-gs.xml"
7542  ;;
7543  tilegx)
7544  ;;
7545  tricore)
7546  ;;
7547  unicore32)
7548  ;;
7549  xtensa|xtensaeb)
7550    TARGET_ARCH=xtensa
7551    bflt="yes"
7552    mttcg="yes"
7553  ;;
7554  *)
7555    error_exit "Unsupported target CPU"
7556  ;;
7557esac
7558# TARGET_BASE_ARCH needs to be defined after TARGET_ARCH
7559if [ "$TARGET_BASE_ARCH" = "" ]; then
7560  TARGET_BASE_ARCH=$TARGET_ARCH
7561fi
7562
7563symlink "$source_path/Makefile.target" "$target_dir/Makefile"
7564
7565upper() {
7566    echo "$@"| LC_ALL=C tr '[a-z]' '[A-Z]'
7567}
7568
7569target_arch_name="$(upper $TARGET_ARCH)"
7570echo "TARGET_$target_arch_name=y" >> $config_target_mak
7571echo "TARGET_NAME=$target_name" >> $config_target_mak
7572echo "TARGET_BASE_ARCH=$TARGET_BASE_ARCH" >> $config_target_mak
7573if [ "$TARGET_ABI_DIR" = "" ]; then
7574  TARGET_ABI_DIR=$TARGET_ARCH
7575fi
7576echo "TARGET_ABI_DIR=$TARGET_ABI_DIR" >> $config_target_mak
7577if [ "$HOST_VARIANT_DIR" != "" ]; then
7578    echo "HOST_VARIANT_DIR=$HOST_VARIANT_DIR" >> $config_target_mak
7579fi
7580
7581if supported_xen_target $target; then
7582    echo "CONFIG_XEN=y" >> $config_target_mak
7583    echo "$target/config-devices.mak: CONFIG_XEN=y" >> $config_host_mak
7584    if test "$xen_pci_passthrough" = yes; then
7585        echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak"
7586    fi
7587else
7588    echo "$target/config-devices.mak: CONFIG_XEN=n" >> $config_host_mak
7589fi
7590if supported_kvm_target $target; then
7591    echo "CONFIG_KVM=y" >> $config_target_mak
7592    echo "$target/config-devices.mak: CONFIG_KVM=y" >> $config_host_mak
7593else
7594    echo "$target/config-devices.mak: CONFIG_KVM=n" >> $config_host_mak
7595fi
7596if supported_hax_target $target; then
7597    echo "CONFIG_HAX=y" >> $config_target_mak
7598fi
7599if supported_hvf_target $target; then
7600    echo "CONFIG_HVF=y" >> $config_target_mak
7601fi
7602if supported_whpx_target $target; then
7603    echo "CONFIG_WHPX=y" >> $config_target_mak
7604fi
7605if test "$target_aligned_only" = "yes" ; then
7606  echo "TARGET_ALIGNED_ONLY=y" >> $config_target_mak
7607fi
7608if test "$target_bigendian" = "yes" ; then
7609  echo "TARGET_WORDS_BIGENDIAN=y" >> $config_target_mak
7610fi
7611if test "$target_softmmu" = "yes" ; then
7612  echo "CONFIG_SOFTMMU=y" >> $config_target_mak
7613  if test "$mttcg" = "yes" ; then
7614    echo "TARGET_SUPPORTS_MTTCG=y" >> $config_target_mak
7615  fi
7616fi
7617if test "$target_user_only" = "yes" ; then
7618  echo "CONFIG_USER_ONLY=y" >> $config_target_mak
7619  echo "CONFIG_QEMU_INTERP_PREFIX=\"$interp_prefix1\"" >> $config_target_mak
7620fi
7621if test "$target_linux_user" = "yes" ; then
7622  echo "CONFIG_LINUX_USER=y" >> $config_target_mak
7623fi
7624list=""
7625if test ! -z "$gdb_xml_files" ; then
7626  for x in $gdb_xml_files; do
7627    list="$list $source_path/gdb-xml/$x"
7628  done
7629  echo "TARGET_XML_FILES=$list" >> $config_target_mak
7630fi
7631
7632if test "$target_user_only" = "yes" && test "$bflt" = "yes"; then
7633  echo "TARGET_HAS_BFLT=y" >> $config_target_mak
7634fi
7635if test "$target_bsd_user" = "yes" ; then
7636  echo "CONFIG_BSD_USER=y" >> $config_target_mak
7637fi
7638
7639
7640# generate QEMU_CFLAGS/LDFLAGS for targets
7641
7642cflags=""
7643ldflags=""
7644
7645disas_config() {
7646  echo "CONFIG_${1}_DIS=y" >> $config_target_mak
7647  echo "CONFIG_${1}_DIS=y" >> config-all-disas.mak
7648}
7649
7650for i in $ARCH $TARGET_BASE_ARCH ; do
7651  case "$i" in
7652  alpha)
7653    disas_config "ALPHA"
7654  ;;
7655  aarch64)
7656    if test -n "${cxx}"; then
7657      disas_config "ARM_A64"
7658    fi
7659  ;;
7660  arm)
7661    disas_config "ARM"
7662    if test -n "${cxx}"; then
7663      disas_config "ARM_A64"
7664    fi
7665  ;;
7666  cris)
7667    disas_config "CRIS"
7668  ;;
7669  hppa)
7670    disas_config "HPPA"
7671  ;;
7672  i386|x86_64|x32)
7673    disas_config "I386"
7674  ;;
7675  lm32)
7676    disas_config "LM32"
7677  ;;
7678  m68k)
7679    disas_config "M68K"
7680  ;;
7681  microblaze*)
7682    disas_config "MICROBLAZE"
7683  ;;
7684  mips*)
7685    disas_config "MIPS"
7686    if test -n "${cxx}"; then
7687      disas_config "NANOMIPS"
7688    fi
7689  ;;
7690  moxie*)
7691    disas_config "MOXIE"
7692  ;;
7693  nios2)
7694    disas_config "NIOS2"
7695  ;;
7696  or1k)
7697    disas_config "OPENRISC"
7698  ;;
7699  ppc*)
7700    disas_config "PPC"
7701  ;;
7702  riscv*)
7703    disas_config "RISCV"
7704  ;;
7705  s390*)
7706    disas_config "S390"
7707  ;;
7708  sh4)
7709    disas_config "SH4"
7710  ;;
7711  sparc*)
7712    disas_config "SPARC"
7713  ;;
7714  xtensa*)
7715    disas_config "XTENSA"
7716  ;;
7717  esac
7718done
7719if test "$tcg_interpreter" = "yes" ; then
7720  disas_config "TCI"
7721fi
7722
7723case "$ARCH" in
7724alpha)
7725  # Ensure there's only a single GP
7726  cflags="-msmall-data $cflags"
7727;;
7728esac
7729
7730if test "$gprof" = "yes" ; then
7731  echo "TARGET_GPROF=y" >> $config_target_mak
7732  if test "$target_linux_user" = "yes" ; then
7733    cflags="-p $cflags"
7734    ldflags="-p $ldflags"
7735  fi
7736  if test "$target_softmmu" = "yes" ; then
7737    ldflags="-p $ldflags"
7738    echo "GPROF_CFLAGS=-p" >> $config_target_mak
7739  fi
7740fi
7741
7742if test "$target_linux_user" = "yes" || test "$target_bsd_user" = "yes" ; then
7743  ldflags="$ldflags $textseg_ldflags"
7744fi
7745
7746# Newer kernels on s390 check for an S390_PGSTE program header and
7747# enable the pgste page table extensions in that case. This makes
7748# the vm.allocate_pgste sysctl unnecessary. We enable this program
7749# header if
7750#  - we build on s390x
7751#  - we build the system emulation for s390x (qemu-system-s390x)
7752#  - KVM is enabled
7753#  - the linker supports --s390-pgste
7754if test "$TARGET_ARCH" = "s390x" && test "$target_softmmu" = "yes" && \
7755        test "$ARCH" = "s390x" && test "$kvm" = "yes"; then
7756    if ld_has --s390-pgste ; then
7757        ldflags="-Wl,--s390-pgste $ldflags"
7758    fi
7759fi
7760
7761echo "LDFLAGS+=$ldflags" >> $config_target_mak
7762echo "QEMU_CFLAGS+=$cflags" >> $config_target_mak
7763
7764done # for target in $targets
7765
7766echo "PIXMAN_CFLAGS=$pixman_cflags" >> $config_host_mak
7767echo "PIXMAN_LIBS=$pixman_libs" >> $config_host_mak
7768
7769if [ "$fdt" = "git" ]; then
7770  echo "config-host.h: dtc/all" >> $config_host_mak
7771fi
7772if [ "$capstone" = "git" -o "$capstone" = "internal" ]; then
7773  echo "config-host.h: capstone/all" >> $config_host_mak
7774fi
7775if test -n "$LIBCAPSTONE"; then
7776  echo "LIBCAPSTONE=$LIBCAPSTONE" >> $config_host_mak
7777fi
7778
7779if test "$numa" = "yes"; then
7780  echo "CONFIG_NUMA=y" >> $config_host_mak
7781fi
7782
7783if test "$ccache_cpp2" = "yes"; then
7784  echo "export CCACHE_CPP2=y" >> $config_host_mak
7785fi
7786
7787# If we're using a separate build tree, set it up now.
7788# DIRS are directories which we simply mkdir in the build tree;
7789# LINKS are things to symlink back into the source tree
7790# (these can be both files and directories).
7791# Caution: do not add files or directories here using wildcards. This
7792# will result in problems later if a new file matching the wildcard is
7793# added to the source tree -- nothing will cause configure to be rerun
7794# so the build tree will be missing the link back to the new file, and
7795# tests might fail. Prefer to keep the relevant files in their own
7796# directory and symlink the directory instead.
7797DIRS="tests tests/tcg tests/tcg/lm32 tests/libqos tests/qapi-schema tests/qemu-iotests tests/vm"
7798DIRS="$DIRS tests/fp tests/qgraph"
7799DIRS="$DIRS docs docs/interop fsdev scsi"
7800DIRS="$DIRS pc-bios/optionrom pc-bios/s390-ccw"
7801DIRS="$DIRS roms/seabios roms/vgabios"
7802LINKS="Makefile"
7803LINKS="$LINKS tests/tcg/lm32/Makefile po/Makefile"
7804LINKS="$LINKS tests/tcg/Makefile.target tests/fp/Makefile"
7805LINKS="$LINKS pc-bios/optionrom/Makefile pc-bios/keymaps"
7806LINKS="$LINKS pc-bios/s390-ccw/Makefile"
7807LINKS="$LINKS roms/seabios/Makefile roms/vgabios/Makefile"
7808LINKS="$LINKS pc-bios/qemu-icon.bmp"
7809LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
7810LINKS="$LINKS tests/acceptance tests/data"
7811LINKS="$LINKS tests/qemu-iotests/check"
7812LINKS="$LINKS python"
7813for bios_file in \
7814    $source_path/pc-bios/*.bin \
7815    $source_path/pc-bios/*.lid \
7816    $source_path/pc-bios/*.rom \
7817    $source_path/pc-bios/*.dtb \
7818    $source_path/pc-bios/*.img \
7819    $source_path/pc-bios/openbios-* \
7820    $source_path/pc-bios/u-boot.* \
7821    $source_path/pc-bios/edk2-*.fd.bz2 \
7822    $source_path/pc-bios/palcode-*
7823do
7824    LINKS="$LINKS pc-bios/$(basename $bios_file)"
7825done
7826mkdir -p $DIRS
7827for f in $LINKS ; do
7828    if [ -e "$source_path/$f" ] && [ "$pwd_is_source_path" != "y" ]; then
7829        symlink "$source_path/$f" "$f"
7830    fi
7831done
7832
7833(for i in $cross_cc_vars; do
7834  export $i
7835done
7836export target_list source_path
7837$source_path/tests/tcg/configure.sh)
7838
7839# temporary config to build submodules
7840for rom in seabios vgabios ; do
7841    config_mak=roms/$rom/config.mak
7842    echo "# Automatically generated by configure - do not modify" > $config_mak
7843    echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
7844    echo "AS=$as" >> $config_mak
7845    echo "CCAS=$ccas" >> $config_mak
7846    echo "CC=$cc" >> $config_mak
7847    echo "BCC=bcc" >> $config_mak
7848    echo "CPP=$cpp" >> $config_mak
7849    echo "OBJCOPY=objcopy" >> $config_mak
7850    echo "IASL=$iasl" >> $config_mak
7851    echo "LD=$ld" >> $config_mak
7852    echo "RANLIB=$ranlib" >> $config_mak
7853done
7854
7855# set up qemu-iotests in this build directory
7856iotests_common_env="tests/qemu-iotests/common.env"
7857
7858echo "# Automatically generated by configure - do not modify" > "$iotests_common_env"
7859echo >> "$iotests_common_env"
7860echo "export PYTHON='$python'" >> "$iotests_common_env"
7861
7862# Save the configure command line for later reuse.
7863cat <<EOD >config.status
7864#!/bin/sh
7865# Generated by configure.
7866# Run this file to recreate the current configuration.
7867# Compiler output produced by configure, useful for debugging
7868# configure, is in config.log if it exists.
7869EOD
7870
7871preserve_env() {
7872    envname=$1
7873
7874    eval envval=\$$envname
7875
7876    if test -n "$envval"
7877    then
7878	echo "$envname='$envval'" >> config.status
7879	echo "export $envname" >> config.status
7880    else
7881	echo "unset $envname" >> config.status
7882    fi
7883}
7884
7885# Preserve various env variables that influence what
7886# features/build target configure will detect
7887preserve_env AR
7888preserve_env AS
7889preserve_env CC
7890preserve_env CPP
7891preserve_env CXX
7892preserve_env INSTALL
7893preserve_env LD
7894preserve_env LD_LIBRARY_PATH
7895preserve_env LIBTOOL
7896preserve_env MAKE
7897preserve_env NM
7898preserve_env OBJCOPY
7899preserve_env PATH
7900preserve_env PKG_CONFIG
7901preserve_env PKG_CONFIG_LIBDIR
7902preserve_env PKG_CONFIG_PATH
7903preserve_env PYTHON
7904preserve_env SDL2_CONFIG
7905preserve_env SMBD
7906preserve_env STRIP
7907preserve_env WINDRES
7908
7909printf "exec" >>config.status
7910printf " '%s'" "$0" "$@" >>config.status
7911echo ' "$@"' >>config.status
7912chmod +x config.status
7913
7914rm -r "$TMPDIR1"
7915