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