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