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