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