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