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