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