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