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