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