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