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