xref: /openbmc/qemu/configure (revision 1d52866f)
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  # probe for the new API
3616  cat > $TMPC <<EOF
3617#include <libudev.h>
3618#include <mpath_persist.h>
3619unsigned mpath_mx_alloc_len = 1024;
3620int logsink;
3621static struct config *multipath_conf;
3622extern struct udev *udev;
3623extern struct config *get_multipath_config(void);
3624extern void put_multipath_config(struct config *conf);
3625struct udev *udev;
3626struct config *get_multipath_config(void) { return multipath_conf; }
3627void put_multipath_config(struct config *conf) { }
3628
3629int main(void) {
3630    udev = udev_new();
3631    multipath_conf = mpath_lib_init();
3632    return 0;
3633}
3634EOF
3635  if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
3636    mpathpersist=yes
3637    mpathpersist_new_api=yes
3638  else
3639    # probe for the old API
3640    cat > $TMPC <<EOF
3641#include <libudev.h>
3642#include <mpath_persist.h>
3643unsigned mpath_mx_alloc_len = 1024;
3644int logsink;
3645int main(void) {
3646    struct udev *udev = udev_new();
3647    mpath_lib_init(udev);
3648    return 0;
3649}
3650EOF
3651    if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
3652      mpathpersist=yes
3653      mpathpersist_new_api=no
3654    else
3655      mpathpersist=no
3656    fi
3657  fi
3658else
3659  mpathpersist=no
3660fi
3661
3662##########################################
3663# libcap probe
3664
3665if test "$cap" != "no" ; then
3666  cat > $TMPC <<EOF
3667#include <stdio.h>
3668#include <sys/capability.h>
3669int main(void) { cap_t caps; caps = cap_init(); return caps != NULL; }
3670EOF
3671  if compile_prog "" "-lcap" ; then
3672    cap=yes
3673  else
3674    cap=no
3675  fi
3676fi
3677
3678##########################################
3679# pthread probe
3680PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
3681
3682pthread=no
3683cat > $TMPC << EOF
3684#include <pthread.h>
3685static void *f(void *p) { return NULL; }
3686int main(void) {
3687  pthread_t thread;
3688  pthread_create(&thread, 0, f, 0);
3689  return 0;
3690}
3691EOF
3692if compile_prog "" "" ; then
3693  pthread=yes
3694else
3695  for pthread_lib in $PTHREADLIBS_LIST; do
3696    if compile_prog "" "$pthread_lib" ; then
3697      pthread=yes
3698      found=no
3699      for lib_entry in $LIBS; do
3700        if test "$lib_entry" = "$pthread_lib"; then
3701          found=yes
3702          break
3703        fi
3704      done
3705      if test "$found" = "no"; then
3706        LIBS="$pthread_lib $LIBS"
3707        libs_qga="$pthread_lib $libs_qga"
3708      fi
3709      PTHREAD_LIB="$pthread_lib"
3710      break
3711    fi
3712  done
3713fi
3714
3715if test "$mingw32" != yes -a "$pthread" = no; then
3716  error_exit "pthread check failed" \
3717      "Make sure to have the pthread libs and headers installed."
3718fi
3719
3720# check for pthread_setname_np
3721pthread_setname_np=no
3722cat > $TMPC << EOF
3723#include <pthread.h>
3724
3725static void *f(void *p) { return NULL; }
3726int main(void)
3727{
3728    pthread_t thread;
3729    pthread_create(&thread, 0, f, 0);
3730    pthread_setname_np(thread, "QEMU");
3731    return 0;
3732}
3733EOF
3734if compile_prog "" "$pthread_lib" ; then
3735  pthread_setname_np=yes
3736fi
3737
3738##########################################
3739# rbd probe
3740if test "$rbd" != "no" ; then
3741  cat > $TMPC <<EOF
3742#include <stdio.h>
3743#include <rbd/librbd.h>
3744int main(void) {
3745    rados_t cluster;
3746    rados_create(&cluster, NULL);
3747    return 0;
3748}
3749EOF
3750  rbd_libs="-lrbd -lrados"
3751  if compile_prog "" "$rbd_libs" ; then
3752    rbd=yes
3753  else
3754    if test "$rbd" = "yes" ; then
3755      feature_not_found "rados block device" "Install librbd/ceph devel"
3756    fi
3757    rbd=no
3758  fi
3759fi
3760
3761##########################################
3762# libssh2 probe
3763min_libssh2_version=1.2.8
3764if test "$libssh2" != "no" ; then
3765  if $pkg_config --atleast-version=$min_libssh2_version libssh2; then
3766    libssh2_cflags=$($pkg_config libssh2 --cflags)
3767    libssh2_libs=$($pkg_config libssh2 --libs)
3768    libssh2=yes
3769  else
3770    if test "$libssh2" = "yes" ; then
3771      error_exit "libssh2 >= $min_libssh2_version required for --enable-libssh2"
3772    fi
3773    libssh2=no
3774  fi
3775fi
3776
3777##########################################
3778# libssh2_sftp_fsync probe
3779
3780if test "$libssh2" = "yes"; then
3781  cat > $TMPC <<EOF
3782#include <stdio.h>
3783#include <libssh2.h>
3784#include <libssh2_sftp.h>
3785int main(void) {
3786    LIBSSH2_SESSION *session;
3787    LIBSSH2_SFTP *sftp;
3788    LIBSSH2_SFTP_HANDLE *sftp_handle;
3789    session = libssh2_session_init ();
3790    sftp = libssh2_sftp_init (session);
3791    sftp_handle = libssh2_sftp_open (sftp, "/", 0, 0);
3792    libssh2_sftp_fsync (sftp_handle);
3793    return 0;
3794}
3795EOF
3796  # libssh2_cflags/libssh2_libs defined in previous test.
3797  if compile_prog "$libssh2_cflags" "$libssh2_libs" ; then
3798    QEMU_CFLAGS="-DHAS_LIBSSH2_SFTP_FSYNC $QEMU_CFLAGS"
3799  fi
3800fi
3801
3802##########################################
3803# linux-aio probe
3804
3805if test "$linux_aio" != "no" ; then
3806  cat > $TMPC <<EOF
3807#include <libaio.h>
3808#include <sys/eventfd.h>
3809#include <stddef.h>
3810int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
3811EOF
3812  if compile_prog "" "-laio" ; then
3813    linux_aio=yes
3814  else
3815    if test "$linux_aio" = "yes" ; then
3816      feature_not_found "linux AIO" "Install libaio devel"
3817    fi
3818    linux_aio=no
3819  fi
3820fi
3821
3822##########################################
3823# TPM passthrough is only on x86 Linux
3824
3825if test "$targetos" = Linux && test "$cpu" = i386 -o "$cpu" = x86_64; then
3826  tpm_passthrough=$tpm
3827else
3828  tpm_passthrough=no
3829fi
3830
3831# TPM emulator is for all posix systems
3832if test "$mingw32" != "yes"; then
3833  tpm_emulator=$tpm
3834else
3835  tpm_emulator=no
3836fi
3837##########################################
3838# attr probe
3839
3840if test "$attr" != "no" ; then
3841  cat > $TMPC <<EOF
3842#include <stdio.h>
3843#include <sys/types.h>
3844#ifdef CONFIG_LIBATTR
3845#include <attr/xattr.h>
3846#else
3847#include <sys/xattr.h>
3848#endif
3849int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }
3850EOF
3851  if compile_prog "" "" ; then
3852    attr=yes
3853  # Older distros have <attr/xattr.h>, and need -lattr:
3854  elif compile_prog "-DCONFIG_LIBATTR" "-lattr" ; then
3855    attr=yes
3856    LIBS="-lattr $LIBS"
3857    libattr=yes
3858  else
3859    if test "$attr" = "yes" ; then
3860      feature_not_found "ATTR" "Install libc6 or libattr devel"
3861    fi
3862    attr=no
3863  fi
3864fi
3865
3866##########################################
3867# iovec probe
3868cat > $TMPC <<EOF
3869#include <sys/types.h>
3870#include <sys/uio.h>
3871#include <unistd.h>
3872int main(void) { return sizeof(struct iovec); }
3873EOF
3874iovec=no
3875if compile_prog "" "" ; then
3876  iovec=yes
3877fi
3878
3879##########################################
3880# preadv probe
3881cat > $TMPC <<EOF
3882#include <sys/types.h>
3883#include <sys/uio.h>
3884#include <unistd.h>
3885int main(void) { return preadv(0, 0, 0, 0); }
3886EOF
3887preadv=no
3888if compile_prog "" "" ; then
3889  preadv=yes
3890fi
3891
3892##########################################
3893# fdt probe
3894# fdt support is mandatory for at least some target architectures,
3895# so insist on it if we're building those system emulators.
3896fdt_required=no
3897for target in $target_list; do
3898  case $target in
3899    aarch64*-softmmu|arm*-softmmu|ppc*-softmmu|microblaze*-softmmu|mips64el-softmmu|riscv*-softmmu)
3900      fdt_required=yes
3901    ;;
3902  esac
3903done
3904
3905if test "$fdt_required" = "yes"; then
3906  if test "$fdt" = "no"; then
3907    error_exit "fdt disabled but some requested targets require it." \
3908      "You can turn off fdt only if you also disable all the system emulation" \
3909      "targets which need it (by specifying a cut down --target-list)."
3910  fi
3911  fdt=yes
3912fi
3913
3914if test "$fdt" != "no" ; then
3915  fdt_libs="-lfdt"
3916  # explicitly check for libfdt_env.h as it is missing in some stable installs
3917  # and test for required functions to make sure we are on a version >= 1.4.2
3918  cat > $TMPC << EOF
3919#include <libfdt.h>
3920#include <libfdt_env.h>
3921int main(void) { fdt_first_subnode(0, 0); return 0; }
3922EOF
3923  if compile_prog "" "$fdt_libs" ; then
3924    # system DTC is good - use it
3925    fdt=system
3926  else
3927      # have GIT checkout, so activate dtc submodule
3928      if test -e "${source_path}/.git" ; then
3929          git_submodules="${git_submodules} dtc"
3930      fi
3931      if test -d "${source_path}/dtc/libfdt" || test -e "${source_path}/.git" ; then
3932          fdt=git
3933          mkdir -p dtc
3934          if [ "$pwd_is_source_path" != "y" ] ; then
3935              symlink "$source_path/dtc/Makefile" "dtc/Makefile"
3936              symlink "$source_path/dtc/scripts" "dtc/scripts"
3937          fi
3938          fdt_cflags="-I\$(SRC_PATH)/dtc/libfdt"
3939          fdt_ldflags="-L\$(BUILD_DIR)/dtc/libfdt"
3940          fdt_libs="$fdt_libs"
3941      elif test "$fdt" = "yes" ; then
3942          # Not a git build & no libfdt found, prompt for system install
3943          error_exit "DTC (libfdt) version >= 1.4.2 not present." \
3944                     "Please install the DTC (libfdt) devel package"
3945      else
3946          # don't have and don't want
3947          fdt_libs=
3948          fdt=no
3949      fi
3950  fi
3951fi
3952
3953libs_softmmu="$libs_softmmu $fdt_libs"
3954
3955##########################################
3956# opengl probe (for sdl2, gtk, milkymist-tmu2)
3957
3958if test "$opengl" != "no" ; then
3959  opengl_pkgs="epoxy gbm"
3960  if $pkg_config $opengl_pkgs; then
3961    opengl_cflags="$($pkg_config --cflags $opengl_pkgs)"
3962    opengl_libs="$($pkg_config --libs $opengl_pkgs)"
3963    opengl=yes
3964    if test "$gtk" = "yes" && $pkg_config --exists "$gtkpackage >= 3.16"; then
3965        gtk_gl="yes"
3966    fi
3967    QEMU_CFLAGS="$QEMU_CFLAGS $opengl_cflags"
3968  else
3969    if test "$opengl" = "yes" ; then
3970      feature_not_found "opengl" "Please install opengl (mesa) devel pkgs: $opengl_pkgs"
3971    fi
3972    opengl_cflags=""
3973    opengl_libs=""
3974    opengl=no
3975  fi
3976fi
3977
3978if test "$opengl" = "yes"; then
3979  cat > $TMPC << EOF
3980#include <epoxy/egl.h>
3981#ifndef EGL_MESA_image_dma_buf_export
3982# error mesa/epoxy lacks support for dmabufs (mesa 10.6+)
3983#endif
3984int main(void) { return 0; }
3985EOF
3986  if compile_prog "" "" ; then
3987    opengl_dmabuf=yes
3988  fi
3989fi
3990
3991##########################################
3992# libxml2 probe
3993if test "$libxml2" != "no" ; then
3994    if $pkg_config --exists libxml-2.0; then
3995        libxml2="yes"
3996        libxml2_cflags=$($pkg_config --cflags libxml-2.0)
3997        libxml2_libs=$($pkg_config --libs libxml-2.0)
3998    else
3999        if test "$libxml2" = "yes"; then
4000            feature_not_found "libxml2" "Install libxml2 devel"
4001        fi
4002        libxml2="no"
4003    fi
4004fi
4005
4006##########################################
4007# glusterfs probe
4008if test "$glusterfs" != "no" ; then
4009  if $pkg_config --atleast-version=3 glusterfs-api; then
4010    glusterfs="yes"
4011    glusterfs_cflags=$($pkg_config --cflags glusterfs-api)
4012    glusterfs_libs=$($pkg_config --libs glusterfs-api)
4013    if $pkg_config --atleast-version=4 glusterfs-api; then
4014      glusterfs_xlator_opt="yes"
4015    fi
4016    if $pkg_config --atleast-version=5 glusterfs-api; then
4017      glusterfs_discard="yes"
4018    fi
4019    if $pkg_config --atleast-version=6 glusterfs-api; then
4020      glusterfs_fallocate="yes"
4021      glusterfs_zerofill="yes"
4022    fi
4023  else
4024    if test "$glusterfs" = "yes" ; then
4025      feature_not_found "GlusterFS backend support" \
4026          "Install glusterfs-api devel >= 3"
4027    fi
4028    glusterfs="no"
4029  fi
4030fi
4031
4032# Check for inotify functions when we are building linux-user
4033# emulator.  This is done because older glibc versions don't
4034# have syscall stubs for these implemented.  In that case we
4035# don't provide them even if kernel supports them.
4036#
4037inotify=no
4038cat > $TMPC << EOF
4039#include <sys/inotify.h>
4040
4041int
4042main(void)
4043{
4044	/* try to start inotify */
4045	return inotify_init();
4046}
4047EOF
4048if compile_prog "" "" ; then
4049  inotify=yes
4050fi
4051
4052inotify1=no
4053cat > $TMPC << EOF
4054#include <sys/inotify.h>
4055
4056int
4057main(void)
4058{
4059    /* try to start inotify */
4060    return inotify_init1(0);
4061}
4062EOF
4063if compile_prog "" "" ; then
4064  inotify1=yes
4065fi
4066
4067# check if pipe2 is there
4068pipe2=no
4069cat > $TMPC << EOF
4070#include <unistd.h>
4071#include <fcntl.h>
4072
4073int main(void)
4074{
4075    int pipefd[2];
4076    return pipe2(pipefd, O_CLOEXEC);
4077}
4078EOF
4079if compile_prog "" "" ; then
4080  pipe2=yes
4081fi
4082
4083# check if accept4 is there
4084accept4=no
4085cat > $TMPC << EOF
4086#include <sys/socket.h>
4087#include <stddef.h>
4088
4089int main(void)
4090{
4091    accept4(0, NULL, NULL, SOCK_CLOEXEC);
4092    return 0;
4093}
4094EOF
4095if compile_prog "" "" ; then
4096  accept4=yes
4097fi
4098
4099# check if tee/splice is there. vmsplice was added same time.
4100splice=no
4101cat > $TMPC << EOF
4102#include <unistd.h>
4103#include <fcntl.h>
4104#include <limits.h>
4105
4106int main(void)
4107{
4108    int len, fd = 0;
4109    len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
4110    splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
4111    return 0;
4112}
4113EOF
4114if compile_prog "" "" ; then
4115  splice=yes
4116fi
4117
4118##########################################
4119# libnuma probe
4120
4121if test "$numa" != "no" ; then
4122  cat > $TMPC << EOF
4123#include <numa.h>
4124int main(void) { return numa_available(); }
4125EOF
4126
4127  if compile_prog "" "-lnuma" ; then
4128    numa=yes
4129    libs_softmmu="-lnuma $libs_softmmu"
4130  else
4131    if test "$numa" = "yes" ; then
4132      feature_not_found "numa" "install numactl devel"
4133    fi
4134    numa=no
4135  fi
4136fi
4137
4138if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
4139    echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
4140    exit 1
4141fi
4142
4143# Even if malloc_trim() is available, these non-libc memory allocators
4144# do not support it.
4145if test "$tcmalloc" = "yes" || test "$jemalloc" = "yes" ; then
4146    if test "$malloc_trim" = "yes" ; then
4147        echo "Disabling malloc_trim with non-libc memory allocator"
4148    fi
4149    malloc_trim="no"
4150fi
4151
4152#######################################
4153# malloc_trim
4154
4155if test "$malloc_trim" != "no" ; then
4156    cat > $TMPC << EOF
4157#include <malloc.h>
4158int main(void) { malloc_trim(0); return 0; }
4159EOF
4160    if compile_prog "" "" ; then
4161        malloc_trim="yes"
4162    else
4163        malloc_trim="no"
4164    fi
4165fi
4166
4167##########################################
4168# tcmalloc probe
4169
4170if test "$tcmalloc" = "yes" ; then
4171  cat > $TMPC << EOF
4172#include <stdlib.h>
4173int main(void) { malloc(1); return 0; }
4174EOF
4175
4176  if compile_prog "" "-ltcmalloc" ; then
4177    LIBS="-ltcmalloc $LIBS"
4178  else
4179    feature_not_found "tcmalloc" "install gperftools devel"
4180  fi
4181fi
4182
4183##########################################
4184# jemalloc probe
4185
4186if test "$jemalloc" = "yes" ; then
4187  cat > $TMPC << EOF
4188#include <stdlib.h>
4189int main(void) { malloc(1); return 0; }
4190EOF
4191
4192  if compile_prog "" "-ljemalloc" ; then
4193    LIBS="-ljemalloc $LIBS"
4194  else
4195    feature_not_found "jemalloc" "install jemalloc devel"
4196  fi
4197fi
4198
4199##########################################
4200# signalfd probe
4201signalfd="no"
4202cat > $TMPC << EOF
4203#include <unistd.h>
4204#include <sys/syscall.h>
4205#include <signal.h>
4206int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }
4207EOF
4208
4209if compile_prog "" "" ; then
4210  signalfd=yes
4211fi
4212
4213# check if eventfd is supported
4214eventfd=no
4215cat > $TMPC << EOF
4216#include <sys/eventfd.h>
4217
4218int main(void)
4219{
4220    return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
4221}
4222EOF
4223if compile_prog "" "" ; then
4224  eventfd=yes
4225fi
4226
4227# check if memfd is supported
4228memfd=no
4229cat > $TMPC << EOF
4230#include <sys/mman.h>
4231
4232int main(void)
4233{
4234    return memfd_create("foo", MFD_ALLOW_SEALING);
4235}
4236EOF
4237if compile_prog "" "" ; then
4238  memfd=yes
4239fi
4240
4241
4242
4243# check for fallocate
4244fallocate=no
4245cat > $TMPC << EOF
4246#include <fcntl.h>
4247
4248int main(void)
4249{
4250    fallocate(0, 0, 0, 0);
4251    return 0;
4252}
4253EOF
4254if compile_prog "" "" ; then
4255  fallocate=yes
4256fi
4257
4258# check for fallocate hole punching
4259fallocate_punch_hole=no
4260cat > $TMPC << EOF
4261#include <fcntl.h>
4262#include <linux/falloc.h>
4263
4264int main(void)
4265{
4266    fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
4267    return 0;
4268}
4269EOF
4270if compile_prog "" "" ; then
4271  fallocate_punch_hole=yes
4272fi
4273
4274# check that fallocate supports range zeroing inside the file
4275fallocate_zero_range=no
4276cat > $TMPC << EOF
4277#include <fcntl.h>
4278#include <linux/falloc.h>
4279
4280int main(void)
4281{
4282    fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0);
4283    return 0;
4284}
4285EOF
4286if compile_prog "" "" ; then
4287  fallocate_zero_range=yes
4288fi
4289
4290# check for posix_fallocate
4291posix_fallocate=no
4292cat > $TMPC << EOF
4293#include <fcntl.h>
4294
4295int main(void)
4296{
4297    posix_fallocate(0, 0, 0);
4298    return 0;
4299}
4300EOF
4301if compile_prog "" "" ; then
4302    posix_fallocate=yes
4303fi
4304
4305# check for sync_file_range
4306sync_file_range=no
4307cat > $TMPC << EOF
4308#include <fcntl.h>
4309
4310int main(void)
4311{
4312    sync_file_range(0, 0, 0, 0);
4313    return 0;
4314}
4315EOF
4316if compile_prog "" "" ; then
4317  sync_file_range=yes
4318fi
4319
4320# check for linux/fiemap.h and FS_IOC_FIEMAP
4321fiemap=no
4322cat > $TMPC << EOF
4323#include <sys/ioctl.h>
4324#include <linux/fs.h>
4325#include <linux/fiemap.h>
4326
4327int main(void)
4328{
4329    ioctl(0, FS_IOC_FIEMAP, 0);
4330    return 0;
4331}
4332EOF
4333if compile_prog "" "" ; then
4334  fiemap=yes
4335fi
4336
4337# check for dup3
4338dup3=no
4339cat > $TMPC << EOF
4340#include <unistd.h>
4341
4342int main(void)
4343{
4344    dup3(0, 0, 0);
4345    return 0;
4346}
4347EOF
4348if compile_prog "" "" ; then
4349  dup3=yes
4350fi
4351
4352# check for ppoll support
4353ppoll=no
4354cat > $TMPC << EOF
4355#include <poll.h>
4356
4357int main(void)
4358{
4359    struct pollfd pfd = { .fd = 0, .events = 0, .revents = 0 };
4360    ppoll(&pfd, 1, 0, 0);
4361    return 0;
4362}
4363EOF
4364if compile_prog "" "" ; then
4365  ppoll=yes
4366fi
4367
4368# check for prctl(PR_SET_TIMERSLACK , ... ) support
4369prctl_pr_set_timerslack=no
4370cat > $TMPC << EOF
4371#include <sys/prctl.h>
4372
4373int main(void)
4374{
4375    prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0);
4376    return 0;
4377}
4378EOF
4379if compile_prog "" "" ; then
4380  prctl_pr_set_timerslack=yes
4381fi
4382
4383# check for epoll support
4384epoll=no
4385cat > $TMPC << EOF
4386#include <sys/epoll.h>
4387
4388int main(void)
4389{
4390    epoll_create(0);
4391    return 0;
4392}
4393EOF
4394if compile_prog "" "" ; then
4395  epoll=yes
4396fi
4397
4398# epoll_create1 is a later addition
4399# so we must check separately for its presence
4400epoll_create1=no
4401cat > $TMPC << EOF
4402#include <sys/epoll.h>
4403
4404int main(void)
4405{
4406    /* Note that we use epoll_create1 as a value, not as
4407     * a function being called. This is necessary so that on
4408     * old SPARC glibc versions where the function was present in
4409     * the library but not declared in the header file we will
4410     * fail the configure check. (Otherwise we will get a compiler
4411     * warning but not an error, and will proceed to fail the
4412     * qemu compile where we compile with -Werror.)
4413     */
4414    return (int)(uintptr_t)&epoll_create1;
4415}
4416EOF
4417if compile_prog "" "" ; then
4418  epoll_create1=yes
4419fi
4420
4421# check for sendfile support
4422sendfile=no
4423cat > $TMPC << EOF
4424#include <sys/sendfile.h>
4425
4426int main(void)
4427{
4428    return sendfile(0, 0, 0, 0);
4429}
4430EOF
4431if compile_prog "" "" ; then
4432  sendfile=yes
4433fi
4434
4435# check for timerfd support (glibc 2.8 and newer)
4436timerfd=no
4437cat > $TMPC << EOF
4438#include <sys/timerfd.h>
4439
4440int main(void)
4441{
4442    return(timerfd_create(CLOCK_REALTIME, 0));
4443}
4444EOF
4445if compile_prog "" "" ; then
4446  timerfd=yes
4447fi
4448
4449# check for setns and unshare support
4450setns=no
4451cat > $TMPC << EOF
4452#include <sched.h>
4453
4454int main(void)
4455{
4456    int ret;
4457    ret = setns(0, 0);
4458    ret = unshare(0);
4459    return ret;
4460}
4461EOF
4462if compile_prog "" "" ; then
4463  setns=yes
4464fi
4465
4466# clock_adjtime probe
4467clock_adjtime=no
4468cat > $TMPC <<EOF
4469#include <time.h>
4470
4471int main(void)
4472{
4473    return clock_adjtime(0, 0);
4474}
4475EOF
4476clock_adjtime=no
4477if compile_prog "" "" ; then
4478  clock_adjtime=yes
4479fi
4480
4481# syncfs probe
4482syncfs=no
4483cat > $TMPC <<EOF
4484#include <unistd.h>
4485
4486int main(void)
4487{
4488    return syncfs(0);
4489}
4490EOF
4491syncfs=no
4492if compile_prog "" "" ; then
4493  syncfs=yes
4494fi
4495
4496# Check if tools are available to build documentation.
4497if test "$docs" != "no" ; then
4498  if has makeinfo && has pod2man; then
4499    docs=yes
4500  else
4501    if test "$docs" = "yes" ; then
4502      feature_not_found "docs" "Install texinfo and Perl/perl-podlators"
4503    fi
4504    docs=no
4505  fi
4506fi
4507
4508# Search for bswap_32 function
4509byteswap_h=no
4510cat > $TMPC << EOF
4511#include <byteswap.h>
4512int main(void) { return bswap_32(0); }
4513EOF
4514if compile_prog "" "" ; then
4515  byteswap_h=yes
4516fi
4517
4518# Search for bswap32 function
4519bswap_h=no
4520cat > $TMPC << EOF
4521#include <sys/endian.h>
4522#include <sys/types.h>
4523#include <machine/bswap.h>
4524int main(void) { return bswap32(0); }
4525EOF
4526if compile_prog "" "" ; then
4527  bswap_h=yes
4528fi
4529
4530##########################################
4531# Do we have libiscsi >= 1.9.0
4532if test "$libiscsi" != "no" ; then
4533  if $pkg_config --atleast-version=1.9.0 libiscsi; then
4534    libiscsi="yes"
4535    libiscsi_cflags=$($pkg_config --cflags libiscsi)
4536    libiscsi_libs=$($pkg_config --libs libiscsi)
4537  else
4538    if test "$libiscsi" = "yes" ; then
4539      feature_not_found "libiscsi" "Install libiscsi >= 1.9.0"
4540    fi
4541    libiscsi="no"
4542  fi
4543fi
4544
4545##########################################
4546# Do we need libm
4547cat > $TMPC << EOF
4548#include <math.h>
4549int main(int argc, char **argv) { return isnan(sin((double)argc)); }
4550EOF
4551if compile_prog "" "" ; then
4552  :
4553elif compile_prog "" "-lm" ; then
4554  LIBS="-lm $LIBS"
4555  libs_qga="-lm $libs_qga"
4556else
4557  error_exit "libm check failed"
4558fi
4559
4560##########################################
4561# Do we need librt
4562# uClibc provides 2 versions of clock_gettime(), one with realtime
4563# support and one without. This means that the clock_gettime() don't
4564# need -lrt. We still need it for timer_create() so we check for this
4565# function in addition.
4566cat > $TMPC <<EOF
4567#include <signal.h>
4568#include <time.h>
4569int main(void) {
4570  timer_create(CLOCK_REALTIME, NULL, NULL);
4571  return clock_gettime(CLOCK_REALTIME, NULL);
4572}
4573EOF
4574
4575if compile_prog "" "" ; then
4576  :
4577# we need pthread for static linking. use previous pthread test result
4578elif compile_prog "" "$pthread_lib -lrt" ; then
4579  LIBS="$LIBS -lrt"
4580  libs_qga="$libs_qga -lrt"
4581fi
4582
4583if test "$darwin" != "yes" -a "$mingw32" != "yes" -a "$solaris" != yes -a \
4584        "$haiku" != "yes" ; then
4585    libs_softmmu="-lutil $libs_softmmu"
4586fi
4587
4588##########################################
4589# spice probe
4590if test "$spice" != "no" ; then
4591  cat > $TMPC << EOF
4592#include <spice.h>
4593int main(void) { spice_server_new(); return 0; }
4594EOF
4595  spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
4596  spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
4597  if $pkg_config --atleast-version=0.12.0 spice-server && \
4598     $pkg_config --atleast-version=0.12.3 spice-protocol && \
4599     compile_prog "$spice_cflags" "$spice_libs" ; then
4600    spice="yes"
4601    libs_softmmu="$libs_softmmu $spice_libs"
4602    QEMU_CFLAGS="$QEMU_CFLAGS $spice_cflags"
4603    spice_protocol_version=$($pkg_config --modversion spice-protocol)
4604    spice_server_version=$($pkg_config --modversion spice-server)
4605  else
4606    if test "$spice" = "yes" ; then
4607      feature_not_found "spice" \
4608          "Install spice-server(>=0.12.0) and spice-protocol(>=0.12.3) devel"
4609    fi
4610    spice="no"
4611  fi
4612fi
4613
4614# check for smartcard support
4615if test "$smartcard" != "no"; then
4616    if $pkg_config --atleast-version=2.5.1 libcacard; then
4617        libcacard_cflags=$($pkg_config --cflags libcacard)
4618        libcacard_libs=$($pkg_config --libs libcacard)
4619        smartcard="yes"
4620    else
4621        if test "$smartcard" = "yes"; then
4622            feature_not_found "smartcard" "Install libcacard devel"
4623        fi
4624        smartcard="no"
4625    fi
4626fi
4627
4628# check for libusb
4629if test "$libusb" != "no" ; then
4630    if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
4631        libusb="yes"
4632        libusb_cflags=$($pkg_config --cflags libusb-1.0)
4633        libusb_libs=$($pkg_config --libs libusb-1.0)
4634    else
4635        if test "$libusb" = "yes"; then
4636            feature_not_found "libusb" "Install libusb devel >= 1.0.13"
4637        fi
4638        libusb="no"
4639    fi
4640fi
4641
4642# check for usbredirparser for usb network redirection support
4643if test "$usb_redir" != "no" ; then
4644    if $pkg_config --atleast-version=0.6 libusbredirparser-0.5; then
4645        usb_redir="yes"
4646        usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5)
4647        usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5)
4648    else
4649        if test "$usb_redir" = "yes"; then
4650            feature_not_found "usb-redir" "Install usbredir devel"
4651        fi
4652        usb_redir="no"
4653    fi
4654fi
4655
4656##########################################
4657# check if we have VSS SDK headers for win
4658
4659if test "$mingw32" = "yes" -a "$guest_agent" != "no" -a "$vss_win32_sdk" != "no" ; then
4660  case "$vss_win32_sdk" in
4661    "")   vss_win32_include="-isystem $source_path" ;;
4662    *\ *) # The SDK is installed in "Program Files" by default, but we cannot
4663          # handle path with spaces. So we symlink the headers into ".sdk/vss".
4664          vss_win32_include="-isystem $source_path/.sdk/vss"
4665	  symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
4666	  ;;
4667    *)    vss_win32_include="-isystem $vss_win32_sdk"
4668  esac
4669  cat > $TMPC << EOF
4670#define __MIDL_user_allocate_free_DEFINED__
4671#include <inc/win2003/vss.h>
4672int main(void) { return VSS_CTX_BACKUP; }
4673EOF
4674  if compile_prog "$vss_win32_include" "" ; then
4675    guest_agent_with_vss="yes"
4676    QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
4677    libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
4678    qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
4679  else
4680    if test "$vss_win32_sdk" != "" ; then
4681      echo "ERROR: Please download and install Microsoft VSS SDK:"
4682      echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
4683      echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
4684      echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
4685      echo "ERROR: The headers are extracted in the directory \`inc'."
4686      feature_not_found "VSS support"
4687    fi
4688    guest_agent_with_vss="no"
4689  fi
4690fi
4691
4692##########################################
4693# lookup Windows platform SDK (if not specified)
4694# The SDK is needed only to build .tlb (type library) file of guest agent
4695# VSS provider from the source. It is usually unnecessary because the
4696# pre-compiled .tlb file is included.
4697
4698if test "$mingw32" = "yes" -a "$guest_agent" != "no" -a "$guest_agent_with_vss" = "yes" ; then
4699  if test -z "$win_sdk"; then
4700    programfiles="$PROGRAMFILES"
4701    test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
4702    if test -n "$programfiles"; then
4703      win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
4704    else
4705      feature_not_found "Windows SDK"
4706    fi
4707  elif test "$win_sdk" = "no"; then
4708    win_sdk=""
4709  fi
4710fi
4711
4712##########################################
4713# check if mingw environment provides a recent ntddscsi.h
4714if test "$mingw32" = "yes" -a "$guest_agent" != "no"; then
4715  cat > $TMPC << EOF
4716#include <windows.h>
4717#include <ntddscsi.h>
4718int main(void) {
4719#if !defined(IOCTL_SCSI_GET_ADDRESS)
4720#error Missing required ioctl definitions
4721#endif
4722  SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
4723  return addr.Lun;
4724}
4725EOF
4726  if compile_prog "" "" ; then
4727    guest_agent_ntddscsi=yes
4728    libs_qga="-lsetupapi $libs_qga"
4729  fi
4730fi
4731
4732##########################################
4733# virgl renderer probe
4734
4735if test "$virglrenderer" != "no" ; then
4736  cat > $TMPC << EOF
4737#include <virglrenderer.h>
4738int main(void) { virgl_renderer_poll(); return 0; }
4739EOF
4740  virgl_cflags=$($pkg_config --cflags virglrenderer 2>/dev/null)
4741  virgl_libs=$($pkg_config --libs virglrenderer 2>/dev/null)
4742  virgl_version=$($pkg_config --modversion virglrenderer 2>/dev/null)
4743  if $pkg_config virglrenderer >/dev/null 2>&1 && \
4744     compile_prog "$virgl_cflags" "$virgl_libs" ; then
4745    virglrenderer="yes"
4746  else
4747    if test "$virglrenderer" = "yes" ; then
4748      feature_not_found "virglrenderer"
4749    fi
4750    virglrenderer="no"
4751  fi
4752fi
4753
4754##########################################
4755# capstone
4756
4757case "$capstone" in
4758  "" | yes)
4759    if $pkg_config capstone; then
4760      capstone=system
4761    elif test -e "${source_path}/.git" -a $git_update = 'yes' ; then
4762      capstone=git
4763    elif test -e "${source_path}/capstone/Makefile" ; then
4764      capstone=internal
4765    elif test -z "$capstone" ; then
4766      capstone=no
4767    else
4768      feature_not_found "capstone" "Install capstone devel or git submodule"
4769    fi
4770    ;;
4771
4772  system)
4773    if ! $pkg_config capstone; then
4774      feature_not_found "capstone" "Install capstone devel"
4775    fi
4776    ;;
4777esac
4778
4779case "$capstone" in
4780  git | internal)
4781    if test "$capstone" = git; then
4782      git_submodules="${git_submodules} capstone"
4783    fi
4784    mkdir -p capstone
4785    QEMU_CFLAGS="$QEMU_CFLAGS -I\$(SRC_PATH)/capstone/include"
4786    if test "$mingw32" = "yes"; then
4787      LIBCAPSTONE=capstone.lib
4788    else
4789      LIBCAPSTONE=libcapstone.a
4790    fi
4791    LIBS="-L\$(BUILD_DIR)/capstone -lcapstone $LIBS"
4792    ;;
4793
4794  system)
4795    QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags capstone)"
4796    LIBS="$($pkg_config --libs capstone) $LIBS"
4797    ;;
4798
4799  no)
4800    ;;
4801  *)
4802    error_exit "Unknown state for capstone: $capstone"
4803    ;;
4804esac
4805
4806##########################################
4807# check if we have fdatasync
4808
4809fdatasync=no
4810cat > $TMPC << EOF
4811#include <unistd.h>
4812int main(void) {
4813#if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
4814return fdatasync(0);
4815#else
4816#error Not supported
4817#endif
4818}
4819EOF
4820if compile_prog "" "" ; then
4821    fdatasync=yes
4822fi
4823
4824##########################################
4825# check if we have madvise
4826
4827madvise=no
4828cat > $TMPC << EOF
4829#include <sys/types.h>
4830#include <sys/mman.h>
4831#include <stddef.h>
4832int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }
4833EOF
4834if compile_prog "" "" ; then
4835    madvise=yes
4836fi
4837
4838##########################################
4839# check if we have posix_madvise
4840
4841posix_madvise=no
4842cat > $TMPC << EOF
4843#include <sys/mman.h>
4844#include <stddef.h>
4845int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }
4846EOF
4847if compile_prog "" "" ; then
4848    posix_madvise=yes
4849fi
4850
4851##########################################
4852# check if we have posix_memalign()
4853
4854posix_memalign=no
4855cat > $TMPC << EOF
4856#include <stdlib.h>
4857int main(void) {
4858    void *p;
4859    return posix_memalign(&p, 8, 8);
4860}
4861EOF
4862if compile_prog "" "" ; then
4863    posix_memalign=yes
4864fi
4865
4866##########################################
4867# check if we have posix_syslog
4868
4869posix_syslog=no
4870cat > $TMPC << EOF
4871#include <syslog.h>
4872int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; }
4873EOF
4874if compile_prog "" "" ; then
4875    posix_syslog=yes
4876fi
4877
4878##########################################
4879# check if we have sem_timedwait
4880
4881sem_timedwait=no
4882cat > $TMPC << EOF
4883#include <semaphore.h>
4884int main(void) { return sem_timedwait(0, 0); }
4885EOF
4886if compile_prog "" "" ; then
4887    sem_timedwait=yes
4888fi
4889
4890##########################################
4891# check if we have strchrnul
4892
4893strchrnul=no
4894cat > $TMPC << EOF
4895#include <string.h>
4896int main(void);
4897// Use a haystack that the compiler shouldn't be able to constant fold
4898char *haystack = (char*)&main;
4899int main(void) { return strchrnul(haystack, 'x') != &haystack[6]; }
4900EOF
4901if compile_prog "" "" ; then
4902    strchrnul=yes
4903fi
4904
4905##########################################
4906# check if trace backend exists
4907
4908$python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
4909if test "$?" -ne 0 ; then
4910  error_exit "invalid trace backends" \
4911      "Please choose supported trace backends."
4912fi
4913
4914##########################################
4915# For 'ust' backend, test if ust headers are present
4916if have_backend "ust"; then
4917  cat > $TMPC << EOF
4918#include <lttng/tracepoint.h>
4919int main(void) { return 0; }
4920EOF
4921  if compile_prog "" "-Wl,--no-as-needed -ldl" ; then
4922    if $pkg_config lttng-ust --exists; then
4923      lttng_ust_libs=$($pkg_config --libs lttng-ust)
4924    else
4925      lttng_ust_libs="-llttng-ust -ldl"
4926    fi
4927    if $pkg_config liburcu-bp --exists; then
4928      urcu_bp_libs=$($pkg_config --libs liburcu-bp)
4929    else
4930      urcu_bp_libs="-lurcu-bp"
4931    fi
4932
4933    LIBS="$lttng_ust_libs $urcu_bp_libs $LIBS"
4934    libs_qga="$lttng_ust_libs $urcu_bp_libs $libs_qga"
4935  else
4936    error_exit "Trace backend 'ust' missing lttng-ust header files"
4937  fi
4938fi
4939
4940##########################################
4941# For 'dtrace' backend, test if 'dtrace' command is present
4942if have_backend "dtrace"; then
4943  if ! has 'dtrace' ; then
4944    error_exit "dtrace command is not found in PATH $PATH"
4945  fi
4946  trace_backend_stap="no"
4947  if has 'stap' ; then
4948    trace_backend_stap="yes"
4949  fi
4950fi
4951
4952##########################################
4953# check and set a backend for coroutine
4954
4955# We prefer ucontext, but it's not always possible. The fallback
4956# is sigcontext. On Windows the only valid backend is the Windows
4957# specific one.
4958
4959ucontext_works=no
4960if test "$darwin" != "yes"; then
4961  cat > $TMPC << EOF
4962#include <ucontext.h>
4963#ifdef __stub_makecontext
4964#error Ignoring glibc stub makecontext which will always fail
4965#endif
4966int main(void) { makecontext(0, 0, 0); return 0; }
4967EOF
4968  if compile_prog "" "" ; then
4969    ucontext_works=yes
4970  fi
4971fi
4972
4973if test "$coroutine" = ""; then
4974  if test "$mingw32" = "yes"; then
4975    coroutine=win32
4976  elif test "$ucontext_works" = "yes"; then
4977    coroutine=ucontext
4978  else
4979    coroutine=sigaltstack
4980  fi
4981else
4982  case $coroutine in
4983  windows)
4984    if test "$mingw32" != "yes"; then
4985      error_exit "'windows' coroutine backend only valid for Windows"
4986    fi
4987    # Unfortunately the user visible backend name doesn't match the
4988    # coroutine-*.c filename for this case, so we have to adjust it here.
4989    coroutine=win32
4990    ;;
4991  ucontext)
4992    if test "$ucontext_works" != "yes"; then
4993      feature_not_found "ucontext"
4994    fi
4995    ;;
4996  sigaltstack)
4997    if test "$mingw32" = "yes"; then
4998      error_exit "only the 'windows' coroutine backend is valid for Windows"
4999    fi
5000    ;;
5001  *)
5002    error_exit "unknown coroutine backend $coroutine"
5003    ;;
5004  esac
5005fi
5006
5007if test "$coroutine_pool" = ""; then
5008  coroutine_pool=yes
5009fi
5010
5011if test "$debug_stack_usage" = "yes"; then
5012  if test "$coroutine_pool" = "yes"; then
5013    echo "WARN: disabling coroutine pool for stack usage debugging"
5014    coroutine_pool=no
5015  fi
5016fi
5017
5018
5019##########################################
5020# check if we have open_by_handle_at
5021
5022open_by_handle_at=no
5023cat > $TMPC << EOF
5024#include <fcntl.h>
5025#if !defined(AT_EMPTY_PATH)
5026# error missing definition
5027#else
5028int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
5029#endif
5030EOF
5031if compile_prog "" "" ; then
5032    open_by_handle_at=yes
5033fi
5034
5035########################################
5036# check if we have linux/magic.h
5037
5038linux_magic_h=no
5039cat > $TMPC << EOF
5040#include <linux/magic.h>
5041int main(void) {
5042  return 0;
5043}
5044EOF
5045if compile_prog "" "" ; then
5046    linux_magic_h=yes
5047fi
5048
5049########################################
5050# check whether we can disable warning option with a pragma (this is needed
5051# to silence warnings in the headers of some versions of external libraries).
5052# This test has to be compiled with -Werror as otherwise an unknown pragma is
5053# only a warning.
5054#
5055# If we can't selectively disable warning in the code, disable -Werror so that
5056# the build doesn't fail anyway.
5057
5058pragma_disable_unused_but_set=no
5059cat > $TMPC << EOF
5060#pragma GCC diagnostic push
5061#pragma GCC diagnostic ignored "-Wstrict-prototypes"
5062#pragma GCC diagnostic pop
5063
5064int main(void) {
5065    return 0;
5066}
5067EOF
5068if compile_prog "-Werror" "" ; then
5069    pragma_diagnostic_available=yes
5070else
5071    werror=no
5072fi
5073
5074########################################
5075# check if we have valgrind/valgrind.h
5076
5077valgrind_h=no
5078cat > $TMPC << EOF
5079#include <valgrind/valgrind.h>
5080int main(void) {
5081  return 0;
5082}
5083EOF
5084if compile_prog "" "" ; then
5085    valgrind_h=yes
5086fi
5087
5088########################################
5089# check if environ is declared
5090
5091has_environ=no
5092cat > $TMPC << EOF
5093#include <unistd.h>
5094int main(void) {
5095    environ = 0;
5096    return 0;
5097}
5098EOF
5099if compile_prog "" "" ; then
5100    has_environ=yes
5101fi
5102
5103########################################
5104# check if cpuid.h is usable.
5105
5106cat > $TMPC << EOF
5107#include <cpuid.h>
5108int main(void) {
5109    unsigned a, b, c, d;
5110    int max = __get_cpuid_max(0, 0);
5111
5112    if (max >= 1) {
5113        __cpuid(1, a, b, c, d);
5114    }
5115
5116    if (max >= 7) {
5117        __cpuid_count(7, 0, a, b, c, d);
5118    }
5119
5120    return 0;
5121}
5122EOF
5123if compile_prog "" "" ; then
5124    cpuid_h=yes
5125fi
5126
5127##########################################
5128# avx2 optimization requirement check
5129#
5130# There is no point enabling this if cpuid.h is not usable,
5131# since we won't be able to select the new routines.
5132
5133if test $cpuid_h = yes; then
5134  cat > $TMPC << EOF
5135#pragma GCC push_options
5136#pragma GCC target("avx2")
5137#include <cpuid.h>
5138#include <immintrin.h>
5139static int bar(void *a) {
5140    __m256i x = *(__m256i *)a;
5141    return _mm256_testz_si256(x, x);
5142}
5143int main(int argc, char *argv[]) { return bar(argv[0]); }
5144EOF
5145  if compile_object "" ; then
5146    avx2_opt="yes"
5147  fi
5148fi
5149
5150########################################
5151# check if __[u]int128_t is usable.
5152
5153int128=no
5154cat > $TMPC << EOF
5155#if defined(__clang_major__) && defined(__clang_minor__)
5156# if ((__clang_major__ < 3) || (__clang_major__ == 3) && (__clang_minor__ < 2))
5157#  error __int128_t does not work in CLANG before 3.2
5158# endif
5159#endif
5160__int128_t a;
5161__uint128_t b;
5162int main (void) {
5163  a = a + b;
5164  b = a * b;
5165  a = a * a;
5166  return 0;
5167}
5168EOF
5169if compile_prog "" "" ; then
5170    int128=yes
5171fi
5172
5173#########################################
5174# See if 128-bit atomic operations are supported.
5175
5176atomic128=no
5177if test "$int128" = "yes"; then
5178  cat > $TMPC << EOF
5179int main(void)
5180{
5181  unsigned __int128 x = 0, y = 0;
5182  y = __atomic_load_16(&x, 0);
5183  __atomic_store_16(&x, y, 0);
5184  __atomic_compare_exchange_16(&x, &y, x, 0, 0, 0);
5185  return 0;
5186}
5187EOF
5188  if compile_prog "" "" ; then
5189    atomic128=yes
5190  fi
5191fi
5192
5193#########################################
5194# See if 64-bit atomic operations are supported.
5195# Note that without __atomic builtins, we can only
5196# assume atomic loads/stores max at pointer size.
5197
5198cat > $TMPC << EOF
5199#include <stdint.h>
5200int main(void)
5201{
5202  uint64_t x = 0, y = 0;
5203#ifdef __ATOMIC_RELAXED
5204  y = __atomic_load_8(&x, 0);
5205  __atomic_store_8(&x, y, 0);
5206  __atomic_compare_exchange_8(&x, &y, x, 0, 0, 0);
5207  __atomic_exchange_8(&x, y, 0);
5208  __atomic_fetch_add_8(&x, y, 0);
5209#else
5210  typedef char is_host64[sizeof(void *) >= sizeof(uint64_t) ? 1 : -1];
5211  __sync_lock_test_and_set(&x, y);
5212  __sync_val_compare_and_swap(&x, y, 0);
5213  __sync_fetch_and_add(&x, y);
5214#endif
5215  return 0;
5216}
5217EOF
5218if compile_prog "" "" ; then
5219  atomic64=yes
5220fi
5221
5222########################################
5223# See if 16-byte vector operations are supported.
5224# Even without a vector unit the compiler may expand these.
5225# There is a bug in old GCC for PPC that crashes here.
5226# Unfortunately it's the system compiler for Centos 7.
5227
5228cat > $TMPC << EOF
5229typedef unsigned char U1 __attribute__((vector_size(16)));
5230typedef unsigned short U2 __attribute__((vector_size(16)));
5231typedef unsigned int U4 __attribute__((vector_size(16)));
5232typedef unsigned long long U8 __attribute__((vector_size(16)));
5233typedef signed char S1 __attribute__((vector_size(16)));
5234typedef signed short S2 __attribute__((vector_size(16)));
5235typedef signed int S4 __attribute__((vector_size(16)));
5236typedef signed long long S8 __attribute__((vector_size(16)));
5237static U1 a1, b1;
5238static U2 a2, b2;
5239static U4 a4, b4;
5240static U8 a8, b8;
5241static S1 c1;
5242static S2 c2;
5243static S4 c4;
5244static S8 c8;
5245static int i;
5246void helper(void *d, void *a, int shift, int i);
5247void helper(void *d, void *a, int shift, int i)
5248{
5249  *(U1 *)(d + i) = *(U1 *)(a + i) << shift;
5250  *(U2 *)(d + i) = *(U2 *)(a + i) << shift;
5251  *(U4 *)(d + i) = *(U4 *)(a + i) << shift;
5252  *(U8 *)(d + i) = *(U8 *)(a + i) << shift;
5253}
5254int main(void)
5255{
5256  a1 += b1; a2 += b2; a4 += b4; a8 += b8;
5257  a1 -= b1; a2 -= b2; a4 -= b4; a8 -= b8;
5258  a1 *= b1; a2 *= b2; a4 *= b4; a8 *= b8;
5259  a1 &= b1; a2 &= b2; a4 &= b4; a8 &= b8;
5260  a1 |= b1; a2 |= b2; a4 |= b4; a8 |= b8;
5261  a1 ^= b1; a2 ^= b2; a4 ^= b4; a8 ^= b8;
5262  a1 <<= i; a2 <<= i; a4 <<= i; a8 <<= i;
5263  a1 >>= i; a2 >>= i; a4 >>= i; a8 >>= i;
5264  c1 >>= i; c2 >>= i; c4 >>= i; c8 >>= i;
5265  return 0;
5266}
5267EOF
5268
5269vector16=no
5270if compile_prog "" "" ; then
5271  vector16=yes
5272fi
5273
5274########################################
5275# check if getauxval is available.
5276
5277getauxval=no
5278cat > $TMPC << EOF
5279#include <sys/auxv.h>
5280int main(void) {
5281  return getauxval(AT_HWCAP) == 0;
5282}
5283EOF
5284if compile_prog "" "" ; then
5285    getauxval=yes
5286fi
5287
5288########################################
5289# check if ccache is interfering with
5290# semantic analysis of macros
5291
5292unset CCACHE_CPP2
5293ccache_cpp2=no
5294cat > $TMPC << EOF
5295static const int Z = 1;
5296#define fn() ({ Z; })
5297#define TAUT(X) ((X) == Z)
5298#define PAREN(X, Y) (X == Y)
5299#define ID(X) (X)
5300int main(int argc, char *argv[])
5301{
5302    int x = 0, y = 0;
5303    x = ID(x);
5304    x = fn();
5305    fn();
5306    if (PAREN(x, y)) return 0;
5307    if (TAUT(Z)) return 0;
5308    return 0;
5309}
5310EOF
5311
5312if ! compile_object "-Werror"; then
5313    ccache_cpp2=yes
5314fi
5315
5316#################################################
5317# clang does not support glibc + FORTIFY_SOURCE.
5318
5319if test "$fortify_source" != "no"; then
5320  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
5321    fortify_source="no";
5322  elif test -n "$cxx" && has $cxx &&
5323       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
5324    fortify_source="no";
5325  else
5326    fortify_source="yes"
5327  fi
5328fi
5329
5330###############################################
5331# Check if copy_file_range is provided by glibc
5332have_copy_file_range=no
5333cat > $TMPC << EOF
5334#include <unistd.h>
5335int main(void) {
5336  copy_file_range(0, NULL, 0, NULL, 0, 0);
5337  return 0;
5338}
5339EOF
5340if compile_prog "" "" ; then
5341    have_copy_file_range=yes
5342fi
5343
5344##########################################
5345# check if struct fsxattr is available via linux/fs.h
5346
5347have_fsxattr=no
5348cat > $TMPC << EOF
5349#include <linux/fs.h>
5350struct fsxattr foo;
5351int main(void) {
5352  return 0;
5353}
5354EOF
5355if compile_prog "" "" ; then
5356    have_fsxattr=yes
5357fi
5358
5359##########################################
5360# check for usable membarrier system call
5361if test "$membarrier" = "yes"; then
5362    have_membarrier=no
5363    if test "$mingw32" = "yes" ; then
5364        have_membarrier=yes
5365    elif test "$linux" = "yes" ; then
5366        cat > $TMPC << EOF
5367    #include <linux/membarrier.h>
5368    #include <sys/syscall.h>
5369    #include <unistd.h>
5370    #include <stdlib.h>
5371    int main(void) {
5372        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
5373        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
5374	exit(0);
5375    }
5376EOF
5377        if compile_prog "" "" ; then
5378            have_membarrier=yes
5379        fi
5380    fi
5381    if test "$have_membarrier" = "no"; then
5382      feature_not_found "membarrier" "membarrier system call not available"
5383    fi
5384else
5385    # Do not enable it by default even for Mingw32, because it doesn't
5386    # work on Wine.
5387    membarrier=no
5388fi
5389
5390##########################################
5391# check if rtnetlink.h exists and is useful
5392have_rtnetlink=no
5393cat > $TMPC << EOF
5394#include <linux/rtnetlink.h>
5395int main(void) {
5396  return IFLA_PROTO_DOWN;
5397}
5398EOF
5399if compile_prog "" "" ; then
5400    have_rtnetlink=yes
5401fi
5402
5403##########################################
5404# check for usable AF_VSOCK environment
5405have_af_vsock=no
5406cat > $TMPC << EOF
5407#include <errno.h>
5408#include <sys/types.h>
5409#include <sys/socket.h>
5410#if !defined(AF_VSOCK)
5411# error missing AF_VSOCK flag
5412#endif
5413#include <linux/vm_sockets.h>
5414int main(void) {
5415    int sock, ret;
5416    struct sockaddr_vm svm;
5417    socklen_t len = sizeof(svm);
5418    sock = socket(AF_VSOCK, SOCK_STREAM, 0);
5419    ret = getpeername(sock, (struct sockaddr *)&svm, &len);
5420    if ((ret == -1) && (errno == ENOTCONN)) {
5421        return 0;
5422    }
5423    return -1;
5424}
5425EOF
5426if compile_prog "" "" ; then
5427    have_af_vsock=yes
5428fi
5429
5430##########################################
5431# check for usable AF_ALG environment
5432hava_afalg=no
5433cat > $TMPC << EOF
5434#include <errno.h>
5435#include <sys/types.h>
5436#include <sys/socket.h>
5437#include <linux/if_alg.h>
5438int main(void) {
5439    int sock;
5440    sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
5441    return sock;
5442}
5443EOF
5444if compile_prog "" "" ; then
5445    have_afalg=yes
5446fi
5447if test "$crypto_afalg" = "yes"
5448then
5449    if test "$have_afalg" != "yes"
5450    then
5451	error_exit "AF_ALG requested but could not be detected"
5452    fi
5453fi
5454
5455
5456#################################################
5457# Check to see if we have the Hypervisor framework
5458if [ "$darwin" = "yes" ] ; then
5459  cat > $TMPC << EOF
5460#include <Hypervisor/hv.h>
5461int main() { return 0;}
5462EOF
5463  if ! compile_object ""; then
5464    hvf='no'
5465  else
5466    hvf='yes'
5467    LDFLAGS="-framework Hypervisor $LDFLAGS"
5468  fi
5469fi
5470
5471#################################################
5472# Sparc implicitly links with --relax, which is
5473# incompatible with -r, so --no-relax should be
5474# given. It does no harm to give it on other
5475# platforms too.
5476
5477# Note: the prototype is needed since QEMU_CFLAGS
5478#       contains -Wmissing-prototypes
5479cat > $TMPC << EOF
5480extern int foo(void);
5481int foo(void) { return 0; }
5482EOF
5483if ! compile_object ""; then
5484  error_exit "Failed to compile object file for LD_REL_FLAGS test"
5485fi
5486for i in '-Wl,-r -Wl,--no-relax' -Wl,-r -r; do
5487  if do_cc -nostdlib $i -o $TMPMO $TMPO; then
5488    LD_REL_FLAGS=$i
5489    break
5490  fi
5491done
5492if test "$modules" = "yes" && test "$LD_REL_FLAGS" = ""; then
5493  feature_not_found "modules" "Cannot find how to build relocatable objects"
5494fi
5495
5496##########################################
5497# check for sysmacros.h
5498
5499have_sysmacros=no
5500cat > $TMPC << EOF
5501#include <sys/sysmacros.h>
5502int main(void) {
5503    return makedev(0, 0);
5504}
5505EOF
5506if compile_prog "" "" ; then
5507    have_sysmacros=yes
5508fi
5509
5510##########################################
5511# Veritas HyperScale block driver VxHS
5512# Check if libvxhs is installed
5513
5514if test "$vxhs" != "no" ; then
5515  cat > $TMPC <<EOF
5516#include <stdint.h>
5517#include <qnio/qnio_api.h>
5518
5519void *vxhs_callback;
5520
5521int main(void) {
5522    iio_init(QNIO_VERSION, vxhs_callback);
5523    return 0;
5524}
5525EOF
5526  vxhs_libs="-lvxhs -lssl"
5527  if compile_prog "" "$vxhs_libs" ; then
5528    vxhs=yes
5529  else
5530    if test "$vxhs" = "yes" ; then
5531      feature_not_found "vxhs block device" "Install libvxhs See github"
5532    fi
5533    vxhs=no
5534  fi
5535fi
5536
5537##########################################
5538# check for _Static_assert()
5539
5540have_static_assert=no
5541cat > $TMPC << EOF
5542_Static_assert(1, "success");
5543int main(void) {
5544    return 0;
5545}
5546EOF
5547if compile_prog "" "" ; then
5548    have_static_assert=yes
5549fi
5550
5551##########################################
5552# check for utmpx.h, it is missing e.g. on OpenBSD
5553
5554have_utmpx=no
5555cat > $TMPC << EOF
5556#include <utmpx.h>
5557struct utmpx user_info;
5558int main(void) {
5559    return 0;
5560}
5561EOF
5562if compile_prog "" "" ; then
5563    have_utmpx=yes
5564fi
5565
5566##########################################
5567# checks for sanitizers
5568
5569have_asan=no
5570have_ubsan=no
5571have_asan_iface_h=no
5572have_asan_iface_fiber=no
5573
5574if test "$sanitizers" = "yes" ; then
5575  write_c_skeleton
5576  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
5577      have_asan=yes
5578  fi
5579
5580  # we could use a simple skeleton for flags checks, but this also
5581  # detect the static linking issue of ubsan, see also:
5582  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
5583  cat > $TMPC << EOF
5584#include <stdlib.h>
5585int main(void) {
5586    void *tmp = malloc(10);
5587    return *(int *)(tmp + 2);
5588}
5589EOF
5590  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
5591      have_ubsan=yes
5592  fi
5593
5594  if check_include "sanitizer/asan_interface.h" ; then
5595      have_asan_iface_h=yes
5596  fi
5597
5598  cat > $TMPC << EOF
5599#include <sanitizer/asan_interface.h>
5600int main(void) {
5601  __sanitizer_start_switch_fiber(0, 0, 0);
5602  return 0;
5603}
5604EOF
5605  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
5606      have_asan_iface_fiber=yes
5607  fi
5608fi
5609
5610##########################################
5611# Docker and cross-compiler support
5612#
5613# This is specifically for building test
5614# cases for foreign architectures, not
5615# cross-compiling QEMU itself.
5616
5617if has "docker"; then
5618    docker=$($python $source_path/tests/docker/docker.py probe)
5619fi
5620
5621##########################################
5622# check for libpmem
5623
5624if test "$libpmem" != "no"; then
5625	if $pkg_config --exists "libpmem"; then
5626		libpmem="yes"
5627		libpmem_libs=$($pkg_config --libs libpmem)
5628		libpmem_cflags=$($pkg_config --cflags libpmem)
5629		libs_softmmu="$libs_softmmu $libpmem_libs"
5630		QEMU_CFLAGS="$QEMU_CFLAGS $libpmem_cflags"
5631	else
5632		if test "$libpmem" = "yes" ; then
5633			feature_not_found "libpmem" "Install nvml or pmdk"
5634		fi
5635		libpmem="no"
5636	fi
5637fi
5638
5639##########################################
5640# End of CC checks
5641# After here, no more $cc or $ld runs
5642
5643write_c_skeleton
5644
5645if test "$gcov" = "yes" ; then
5646  CFLAGS="-fprofile-arcs -ftest-coverage -g $CFLAGS"
5647  LDFLAGS="-fprofile-arcs -ftest-coverage $LDFLAGS"
5648elif test "$fortify_source" = "yes" ; then
5649  CFLAGS="-O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $CFLAGS"
5650elif test "$debug" = "no"; then
5651  CFLAGS="-O2 $CFLAGS"
5652fi
5653
5654if test "$have_asan" = "yes"; then
5655  CFLAGS="-fsanitize=address $CFLAGS"
5656  if test "$have_asan_iface_h" = "no" ; then
5657      echo "ASAN build enabled, but ASAN header missing." \
5658           "Without code annotation, the report may be inferior."
5659  elif test "$have_asan_iface_fiber" = "no" ; then
5660      echo "ASAN build enabled, but ASAN header is too old." \
5661           "Without code annotation, the report may be inferior."
5662  fi
5663fi
5664if test "$have_ubsan" = "yes"; then
5665  CFLAGS="-fsanitize=undefined $CFLAGS"
5666fi
5667
5668##########################################
5669# Do we have libnfs
5670if test "$libnfs" != "no" ; then
5671  if $pkg_config --atleast-version=1.9.3 libnfs; then
5672    libnfs="yes"
5673    libnfs_libs=$($pkg_config --libs libnfs)
5674  else
5675    if test "$libnfs" = "yes" ; then
5676      feature_not_found "libnfs" "Install libnfs devel >= 1.9.3"
5677    fi
5678    libnfs="no"
5679  fi
5680fi
5681
5682# Now we've finished running tests it's OK to add -Werror to the compiler flags
5683if test "$werror" = "yes"; then
5684    QEMU_CFLAGS="-Werror $QEMU_CFLAGS"
5685fi
5686
5687if test "$solaris" = "no" ; then
5688    if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
5689        LDFLAGS="-Wl,--warn-common $LDFLAGS"
5690    fi
5691fi
5692
5693# test if pod2man has --utf8 option
5694if pod2man --help | grep -q utf8; then
5695    POD2MAN="pod2man --utf8"
5696else
5697    POD2MAN="pod2man"
5698fi
5699
5700# Use ASLR, no-SEH and DEP if available
5701if test "$mingw32" = "yes" ; then
5702    for flag in --dynamicbase --no-seh --nxcompat; do
5703        if ld_has $flag ; then
5704            LDFLAGS="-Wl,$flag $LDFLAGS"
5705        fi
5706    done
5707fi
5708
5709qemu_confdir=$sysconfdir$confsuffix
5710qemu_moddir=$libdir$confsuffix
5711qemu_datadir=$datadir$confsuffix
5712qemu_localedir="$datadir/locale"
5713
5714# We can only support ivshmem if we have eventfd
5715if [ "$eventfd" = "yes" ]; then
5716  ivshmem=yes
5717fi
5718
5719tools=""
5720if test "$want_tools" = "yes" ; then
5721  tools="qemu-img\$(EXESUF) qemu-io\$(EXESUF) $tools"
5722  if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" ] ; then
5723    tools="qemu-nbd\$(EXESUF) $tools"
5724  fi
5725  if [ "$ivshmem" = "yes" ]; then
5726    tools="ivshmem-client\$(EXESUF) ivshmem-server\$(EXESUF) $tools"
5727  fi
5728fi
5729if test "$softmmu" = yes ; then
5730  if test "$linux" = yes; then
5731    if test "$virtfs" != no && test "$cap" = yes && test "$attr" = yes ; then
5732      virtfs=yes
5733      tools="$tools fsdev/virtfs-proxy-helper\$(EXESUF)"
5734    else
5735      if test "$virtfs" = yes; then
5736        error_exit "VirtFS requires libcap devel and libattr devel"
5737      fi
5738      virtfs=no
5739    fi
5740    if test "$mpath" != no && test "$mpathpersist" = yes ; then
5741      mpath=yes
5742    else
5743      if test "$mpath" = yes; then
5744        error_exit "Multipath requires libmpathpersist devel"
5745      fi
5746      mpath=no
5747    fi
5748    tools="$tools scsi/qemu-pr-helper\$(EXESUF)"
5749  else
5750    if test "$virtfs" = yes; then
5751      error_exit "VirtFS is supported only on Linux"
5752    fi
5753    virtfs=no
5754    if test "$mpath" = yes; then
5755      error_exit "Multipath is supported only on Linux"
5756    fi
5757    mpath=no
5758  fi
5759  if test "$xkbcommon" = "yes"; then
5760    tools="qemu-keymap\$(EXESUF) $tools"
5761  fi
5762fi
5763
5764# Probe for guest agent support/options
5765
5766if [ "$guest_agent" != "no" ]; then
5767  if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
5768      tools="qemu-ga $tools"
5769      guest_agent=yes
5770  elif [ "$guest_agent" != yes ]; then
5771      guest_agent=no
5772  else
5773      error_exit "Guest agent is not supported on this platform"
5774  fi
5775fi
5776
5777# Guest agent Window MSI  package
5778
5779if test "$guest_agent" != yes; then
5780  if test "$guest_agent_msi" = yes; then
5781    error_exit "MSI guest agent package requires guest agent enabled"
5782  fi
5783  guest_agent_msi=no
5784elif test "$mingw32" != "yes"; then
5785  if test "$guest_agent_msi" = "yes"; then
5786    error_exit "MSI guest agent package is available only for MinGW Windows cross-compilation"
5787  fi
5788  guest_agent_msi=no
5789elif ! has wixl; then
5790  if test "$guest_agent_msi" = "yes"; then
5791    error_exit "MSI guest agent package requires wixl tool installed ( usually from msitools package )"
5792  fi
5793  guest_agent_msi=no
5794else
5795  # we support qemu-ga, mingw32, and wixl: default to MSI enabled if it wasn't
5796  # disabled explicitly
5797  if test "$guest_agent_msi" != "no"; then
5798    guest_agent_msi=yes
5799  fi
5800fi
5801
5802if test "$guest_agent_msi" = "yes"; then
5803  if test "$guest_agent_with_vss" = "yes"; then
5804    QEMU_GA_MSI_WITH_VSS="-D InstallVss"
5805  fi
5806
5807  if test "$QEMU_GA_MANUFACTURER" = ""; then
5808    QEMU_GA_MANUFACTURER=QEMU
5809  fi
5810
5811  if test "$QEMU_GA_DISTRO" = ""; then
5812    QEMU_GA_DISTRO=Linux
5813  fi
5814
5815  if test "$QEMU_GA_VERSION" = ""; then
5816      QEMU_GA_VERSION=$(cat $source_path/VERSION)
5817  fi
5818
5819  QEMU_GA_MSI_MINGW_DLL_PATH="-D Mingw_dlls=$($pkg_config --variable=prefix glib-2.0)/bin"
5820
5821  case "$cpu" in
5822  x86_64)
5823    QEMU_GA_MSI_ARCH="-a x64 -D Arch=64"
5824    ;;
5825  i386)
5826    QEMU_GA_MSI_ARCH="-D Arch=32"
5827    ;;
5828  *)
5829    error_exit "CPU $cpu not supported for building installation package"
5830    ;;
5831  esac
5832fi
5833
5834# Mac OS X ships with a broken assembler
5835roms=
5836if test \( "$cpu" = "i386" -o "$cpu" = "x86_64" \) -a \
5837        "$targetos" != "Darwin" -a "$targetos" != "SunOS" -a \
5838        "$softmmu" = yes ; then
5839    # Different host OS linkers have different ideas about the name of the ELF
5840    # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
5841    # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
5842    for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
5843        if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
5844            ld_i386_emulation="$emu"
5845            roms="optionrom"
5846            break
5847        fi
5848    done
5849fi
5850if test "$cpu" = "ppc64" -a "$targetos" != "Darwin" ; then
5851  roms="$roms spapr-rtas"
5852fi
5853
5854if test "$cpu" = "s390x" ; then
5855  roms="$roms s390-ccw"
5856fi
5857
5858# Probe for the need for relocating the user-only binary.
5859if ( [ "$linux_user" = yes ] || [ "$bsd_user" = yes ] ) && [ "$pie" = no ]; then
5860  textseg_addr=
5861  case "$cpu" in
5862    arm | i386 | ppc* | s390* | sparc* | x86_64 | x32)
5863      # ??? Rationale for choosing this address
5864      textseg_addr=0x60000000
5865      ;;
5866    mips)
5867      # A 256M aligned address, high in the address space, with enough
5868      # room for the code_gen_buffer above it before the stack.
5869      textseg_addr=0x60000000
5870      ;;
5871  esac
5872  if [ -n "$textseg_addr" ]; then
5873    cat > $TMPC <<EOF
5874    int main(void) { return 0; }
5875EOF
5876    textseg_ldflags="-Wl,-Ttext-segment=$textseg_addr"
5877    if ! compile_prog "" "$textseg_ldflags"; then
5878      # In case ld does not support -Ttext-segment, edit the default linker
5879      # script via sed to set the .text start addr.  This is needed on FreeBSD
5880      # at least.
5881      if ! $ld --verbose >/dev/null 2>&1; then
5882        error_exit \
5883            "We need to link the QEMU user mode binaries at a" \
5884            "specific text address. Unfortunately your linker" \
5885            "doesn't support either the -Ttext-segment option or" \
5886            "printing the default linker script with --verbose." \
5887            "If you don't want the user mode binaries, pass the" \
5888            "--disable-user option to configure."
5889      fi
5890
5891      $ld --verbose | sed \
5892        -e '1,/==================================================/d' \
5893        -e '/==================================================/,$d' \
5894        -e "s/[.] = [0-9a-fx]* [+] SIZEOF_HEADERS/. = $textseg_addr + SIZEOF_HEADERS/" \
5895        -e "s/__executable_start = [0-9a-fx]*/__executable_start = $textseg_addr/" > config-host.ld
5896      textseg_ldflags="-Wl,-T../config-host.ld"
5897    fi
5898  fi
5899fi
5900
5901# Check that the C++ compiler exists and works with the C compiler.
5902# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
5903if has $cxx; then
5904    cat > $TMPC <<EOF
5905int c_function(void);
5906int main(void) { return c_function(); }
5907EOF
5908
5909    compile_object
5910
5911    cat > $TMPCXX <<EOF
5912extern "C" {
5913   int c_function(void);
5914}
5915int c_function(void) { return 42; }
5916EOF
5917
5918    update_cxxflags
5919
5920    if do_cxx $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $LDFLAGS; then
5921        # C++ compiler $cxx works ok with C compiler $cc
5922        :
5923    else
5924        echo "C++ compiler $cxx does not work with C compiler $cc"
5925        echo "Disabling C++ specific optional code"
5926        cxx=
5927    fi
5928else
5929    echo "No C++ compiler available; disabling C++ specific optional code"
5930    cxx=
5931fi
5932
5933echo_version() {
5934    if test "$1" = "yes" ; then
5935        echo "($2)"
5936    fi
5937}
5938
5939# prepend pixman and ftd flags after all config tests are done
5940QEMU_CFLAGS="$pixman_cflags $fdt_cflags $QEMU_CFLAGS"
5941QEMU_LDFLAGS="$fdt_ldflags $QEMU_LDFLAGS"
5942libs_softmmu="$pixman_libs $libs_softmmu"
5943
5944echo "Install prefix    $prefix"
5945echo "BIOS directory    $(eval echo $qemu_datadir)"
5946echo "firmware path     $(eval echo $firmwarepath)"
5947echo "binary directory  $(eval echo $bindir)"
5948echo "library directory $(eval echo $libdir)"
5949echo "module directory  $(eval echo $qemu_moddir)"
5950echo "libexec directory $(eval echo $libexecdir)"
5951echo "include directory $(eval echo $includedir)"
5952echo "config directory  $(eval echo $sysconfdir)"
5953if test "$mingw32" = "no" ; then
5954echo "local state directory   $(eval echo $local_statedir)"
5955echo "Manual directory  $(eval echo $mandir)"
5956echo "ELF interp prefix $interp_prefix"
5957else
5958echo "local state directory   queried at runtime"
5959echo "Windows SDK       $win_sdk"
5960fi
5961echo "Source path       $source_path"
5962echo "GIT binary        $git"
5963echo "GIT submodules    $git_submodules"
5964echo "C compiler        $cc"
5965echo "Host C compiler   $host_cc"
5966echo "C++ compiler      $cxx"
5967echo "Objective-C compiler $objcc"
5968echo "ARFLAGS           $ARFLAGS"
5969echo "CFLAGS            $CFLAGS"
5970echo "QEMU_CFLAGS       $QEMU_CFLAGS"
5971echo "LDFLAGS           $LDFLAGS"
5972echo "QEMU_LDFLAGS      $QEMU_LDFLAGS"
5973echo "make              $make"
5974echo "install           $install"
5975echo "python            $python"
5976if test "$slirp" = "yes" ; then
5977    echo "smbd              $smbd"
5978fi
5979echo "module support    $modules"
5980echo "host CPU          $cpu"
5981echo "host big endian   $bigendian"
5982echo "target list       $target_list"
5983echo "gprof enabled     $gprof"
5984echo "sparse enabled    $sparse"
5985echo "strip binaries    $strip_opt"
5986echo "profiler          $profiler"
5987echo "static build      $static"
5988if test "$darwin" = "yes" ; then
5989    echo "Cocoa support     $cocoa"
5990fi
5991echo "SDL support       $sdl $(echo_version $sdl $sdlversion)"
5992echo "GTK support       $gtk $(echo_version $gtk $gtk_version)"
5993echo "GTK GL support    $gtk_gl"
5994echo "VTE support       $vte $(echo_version $vte $vteversion)"
5995echo "TLS priority      $tls_priority"
5996echo "GNUTLS support    $gnutls"
5997echo "GNUTLS rnd        $gnutls_rnd"
5998echo "libgcrypt         $gcrypt"
5999echo "libgcrypt kdf     $gcrypt_kdf"
6000echo "nettle            $nettle $(echo_version $nettle $nettle_version)"
6001echo "nettle kdf        $nettle_kdf"
6002echo "libtasn1          $tasn1"
6003echo "curses support    $curses"
6004echo "virgl support     $virglrenderer $(echo_version $virglrenderer $virgl_version)"
6005echo "curl support      $curl"
6006echo "mingw32 support   $mingw32"
6007echo "Audio drivers     $audio_drv_list"
6008echo "Block whitelist (rw) $block_drv_rw_whitelist"
6009echo "Block whitelist (ro) $block_drv_ro_whitelist"
6010echo "VirtFS support    $virtfs"
6011echo "Multipath support $mpath"
6012echo "VNC support       $vnc"
6013if test "$vnc" = "yes" ; then
6014    echo "VNC SASL support  $vnc_sasl"
6015    echo "VNC JPEG support  $vnc_jpeg"
6016    echo "VNC PNG support   $vnc_png"
6017fi
6018if test -n "$sparc_cpu"; then
6019    echo "Target Sparc Arch $sparc_cpu"
6020fi
6021echo "xen support       $xen"
6022if test "$xen" = "yes" ; then
6023  echo "xen ctrl version  $xen_ctrl_version"
6024  echo "pv dom build      $xen_pv_domain_build"
6025fi
6026echo "brlapi support    $brlapi"
6027echo "bluez  support    $bluez"
6028echo "Documentation     $docs"
6029echo "PIE               $pie"
6030echo "vde support       $vde"
6031echo "netmap support    $netmap"
6032echo "Linux AIO support $linux_aio"
6033echo "ATTR/XATTR support $attr"
6034echo "Install blobs     $blobs"
6035echo "KVM support       $kvm"
6036echo "HAX support       $hax"
6037echo "HVF support       $hvf"
6038echo "WHPX support      $whpx"
6039echo "TCG support       $tcg"
6040if test "$tcg" = "yes" ; then
6041    echo "TCG debug enabled $debug_tcg"
6042    echo "TCG interpreter   $tcg_interpreter"
6043fi
6044echo "malloc trim support $malloc_trim"
6045echo "RDMA support      $rdma"
6046echo "PVRDMA support    $pvrdma"
6047echo "fdt support       $fdt"
6048echo "membarrier        $membarrier"
6049echo "preadv support    $preadv"
6050echo "fdatasync         $fdatasync"
6051echo "madvise           $madvise"
6052echo "posix_madvise     $posix_madvise"
6053echo "posix_memalign    $posix_memalign"
6054echo "libcap-ng support $cap_ng"
6055echo "vhost-net support $vhost_net"
6056echo "vhost-crypto support $vhost_crypto"
6057echo "vhost-scsi support $vhost_scsi"
6058echo "vhost-vsock support $vhost_vsock"
6059echo "vhost-user support $vhost_user"
6060echo "Trace backends    $trace_backends"
6061if have_backend "simple"; then
6062echo "Trace output file $trace_file-<pid>"
6063fi
6064echo "spice support     $spice $(echo_version $spice $spice_protocol_version/$spice_server_version)"
6065echo "rbd support       $rbd"
6066echo "xfsctl support    $xfs"
6067echo "smartcard support $smartcard"
6068echo "libusb            $libusb"
6069echo "usb net redir     $usb_redir"
6070echo "OpenGL support    $opengl"
6071echo "OpenGL dmabufs    $opengl_dmabuf"
6072echo "libiscsi support  $libiscsi"
6073echo "libnfs support    $libnfs"
6074echo "build guest agent $guest_agent"
6075echo "QGA VSS support   $guest_agent_with_vss"
6076echo "QGA w32 disk info $guest_agent_ntddscsi"
6077echo "QGA MSI support   $guest_agent_msi"
6078echo "seccomp support   $seccomp"
6079echo "coroutine backend $coroutine"
6080echo "coroutine pool    $coroutine_pool"
6081echo "debug stack usage $debug_stack_usage"
6082echo "mutex debugging   $debug_mutex"
6083echo "crypto afalg      $crypto_afalg"
6084echo "GlusterFS support $glusterfs"
6085echo "gcov              $gcov_tool"
6086echo "gcov enabled      $gcov"
6087echo "TPM support       $tpm"
6088echo "libssh2 support   $libssh2"
6089echo "TPM passthrough   $tpm_passthrough"
6090echo "TPM emulator      $tpm_emulator"
6091echo "QOM debugging     $qom_cast_debug"
6092echo "Live block migration $live_block_migration"
6093echo "lzo support       $lzo"
6094echo "snappy support    $snappy"
6095echo "bzip2 support     $bzip2"
6096echo "NUMA host support $numa"
6097echo "libxml2           $libxml2"
6098echo "tcmalloc support  $tcmalloc"
6099echo "jemalloc support  $jemalloc"
6100echo "avx2 optimization $avx2_opt"
6101echo "replication support $replication"
6102echo "VxHS block device $vxhs"
6103echo "capstone          $capstone"
6104echo "docker            $docker"
6105echo "libpmem support   $libpmem"
6106
6107if test "$sdl_too_old" = "yes"; then
6108echo "-> Your SDL version is too old - please upgrade to have SDL support"
6109fi
6110
6111if test "$gtkabi" = "2.0"; then
6112    echo
6113    echo "WARNING: Use of GTK 2.0 is deprecated and will be removed in"
6114    echo "WARNING: future releases. Please switch to using GTK 3.0"
6115fi
6116
6117if test "$sdlabi" = "1.2"; then
6118    echo
6119    echo "WARNING: Use of SDL 1.2 is deprecated and will be removed in"
6120    echo "WARNING: future releases. Please switch to using SDL 2.0"
6121fi
6122
6123if test "$supported_cpu" = "no"; then
6124    echo
6125    echo "WARNING: SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!"
6126    echo
6127    echo "CPU host architecture $cpu support is not currently maintained."
6128    echo "The QEMU project intends to remove support for this host CPU in"
6129    echo "a future release if nobody volunteers to maintain it and to"
6130    echo "provide a build host for our continuous integration setup."
6131    echo "configure has succeeded and you can continue to build, but"
6132    echo "if you care about QEMU on this platform you should contact"
6133    echo "us upstream at qemu-devel@nongnu.org."
6134fi
6135
6136if test "$supported_os" = "no"; then
6137    echo
6138    echo "WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!"
6139    echo
6140    echo "Host OS $targetos support is not currently maintained."
6141    echo "The QEMU project intends to remove support for this host OS in"
6142    echo "a future release if nobody volunteers to maintain it and to"
6143    echo "provide a build host for our continuous integration setup."
6144    echo "configure has succeeded and you can continue to build, but"
6145    echo "if you care about QEMU on this platform you should contact"
6146    echo "us upstream at qemu-devel@nongnu.org."
6147fi
6148
6149config_host_mak="config-host.mak"
6150
6151echo "# Automatically generated by configure - do not modify" >config-all-disas.mak
6152
6153echo "# Automatically generated by configure - do not modify" > $config_host_mak
6154echo >> $config_host_mak
6155
6156echo all: >> $config_host_mak
6157echo "prefix=$prefix" >> $config_host_mak
6158echo "bindir=$bindir" >> $config_host_mak
6159echo "libdir=$libdir" >> $config_host_mak
6160echo "libexecdir=$libexecdir" >> $config_host_mak
6161echo "includedir=$includedir" >> $config_host_mak
6162echo "mandir=$mandir" >> $config_host_mak
6163echo "sysconfdir=$sysconfdir" >> $config_host_mak
6164echo "qemu_confdir=$qemu_confdir" >> $config_host_mak
6165echo "qemu_datadir=$qemu_datadir" >> $config_host_mak
6166echo "qemu_firmwarepath=$firmwarepath" >> $config_host_mak
6167echo "qemu_docdir=$qemu_docdir" >> $config_host_mak
6168echo "qemu_moddir=$qemu_moddir" >> $config_host_mak
6169if test "$mingw32" = "no" ; then
6170  echo "qemu_localstatedir=$local_statedir" >> $config_host_mak
6171fi
6172echo "qemu_helperdir=$libexecdir" >> $config_host_mak
6173echo "qemu_localedir=$qemu_localedir" >> $config_host_mak
6174echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
6175echo "GIT=$git" >> $config_host_mak
6176echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
6177echo "GIT_UPDATE=$git_update" >> $config_host_mak
6178
6179echo "ARCH=$ARCH" >> $config_host_mak
6180
6181if test "$debug_tcg" = "yes" ; then
6182  echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
6183fi
6184if test "$strip_opt" = "yes" ; then
6185  echo "STRIP=${strip}" >> $config_host_mak
6186fi
6187if test "$bigendian" = "yes" ; then
6188  echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
6189fi
6190if test "$mingw32" = "yes" ; then
6191  echo "CONFIG_WIN32=y" >> $config_host_mak
6192  rc_version=$(cat $source_path/VERSION)
6193  version_major=${rc_version%%.*}
6194  rc_version=${rc_version#*.}
6195  version_minor=${rc_version%%.*}
6196  rc_version=${rc_version#*.}
6197  version_subminor=${rc_version%%.*}
6198  version_micro=0
6199  echo "CONFIG_FILEVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
6200  echo "CONFIG_PRODUCTVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
6201  if test "$guest_agent_with_vss" = "yes" ; then
6202    echo "CONFIG_QGA_VSS=y" >> $config_host_mak
6203    echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
6204    echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
6205  fi
6206  if test "$guest_agent_ntddscsi" = "yes" ; then
6207    echo "CONFIG_QGA_NTDDDISK=y" >> $config_host_mak
6208  fi
6209  if test "$guest_agent_msi" = "yes"; then
6210    echo "QEMU_GA_MSI_ENABLED=yes" >> $config_host_mak
6211    echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
6212    echo "QEMU_GA_MSI_WITH_VSS=${QEMU_GA_MSI_WITH_VSS}" >> $config_host_mak
6213    echo "QEMU_GA_MSI_ARCH=${QEMU_GA_MSI_ARCH}" >> $config_host_mak
6214    echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
6215    echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
6216    echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
6217  fi
6218else
6219  echo "CONFIG_POSIX=y" >> $config_host_mak
6220fi
6221
6222if test "$linux" = "yes" ; then
6223  echo "CONFIG_LINUX=y" >> $config_host_mak
6224fi
6225
6226if test "$darwin" = "yes" ; then
6227  echo "CONFIG_DARWIN=y" >> $config_host_mak
6228fi
6229
6230if test "$solaris" = "yes" ; then
6231  echo "CONFIG_SOLARIS=y" >> $config_host_mak
6232fi
6233if test "$haiku" = "yes" ; then
6234  echo "CONFIG_HAIKU=y" >> $config_host_mak
6235fi
6236if test "$static" = "yes" ; then
6237  echo "CONFIG_STATIC=y" >> $config_host_mak
6238fi
6239if test "$profiler" = "yes" ; then
6240  echo "CONFIG_PROFILER=y" >> $config_host_mak
6241fi
6242if test "$slirp" = "yes" ; then
6243  echo "CONFIG_SLIRP=y" >> $config_host_mak
6244  echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
6245fi
6246if test "$vde" = "yes" ; then
6247  echo "CONFIG_VDE=y" >> $config_host_mak
6248  echo "VDE_LIBS=$vde_libs" >> $config_host_mak
6249fi
6250if test "$netmap" = "yes" ; then
6251  echo "CONFIG_NETMAP=y" >> $config_host_mak
6252fi
6253if test "$l2tpv3" = "yes" ; then
6254  echo "CONFIG_L2TPV3=y" >> $config_host_mak
6255fi
6256if test "$cap_ng" = "yes" ; then
6257  echo "CONFIG_LIBCAP=y" >> $config_host_mak
6258fi
6259echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
6260for drv in $audio_drv_list; do
6261    def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
6262    case "$drv" in
6263	alsa | oss | pa | sdl)
6264	    echo "$def=m" >> $config_host_mak ;;
6265	*)
6266	    echo "$def=y" >> $config_host_mak ;;
6267    esac
6268done
6269echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak
6270echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
6271echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak
6272echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak
6273echo "OSS_LIBS=$oss_libs" >> $config_host_mak
6274if test "$audio_pt_int" = "yes" ; then
6275  echo "CONFIG_AUDIO_PT_INT=y" >> $config_host_mak
6276fi
6277if test "$audio_win_int" = "yes" ; then
6278  echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
6279fi
6280echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
6281echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
6282if test "$vnc" = "yes" ; then
6283  echo "CONFIG_VNC=y" >> $config_host_mak
6284fi
6285if test "$vnc_sasl" = "yes" ; then
6286  echo "CONFIG_VNC_SASL=y" >> $config_host_mak
6287fi
6288if test "$vnc_jpeg" = "yes" ; then
6289  echo "CONFIG_VNC_JPEG=y" >> $config_host_mak
6290fi
6291if test "$vnc_png" = "yes" ; then
6292  echo "CONFIG_VNC_PNG=y" >> $config_host_mak
6293fi
6294if test "$xkbcommon" = "yes" ; then
6295  echo "XKBCOMMON_CFLAGS=$xkbcommon_cflags" >> $config_host_mak
6296  echo "XKBCOMMON_LIBS=$xkbcommon_libs" >> $config_host_mak
6297fi
6298if test "$fnmatch" = "yes" ; then
6299  echo "CONFIG_FNMATCH=y" >> $config_host_mak
6300fi
6301if test "$xfs" = "yes" ; then
6302  echo "CONFIG_XFS=y" >> $config_host_mak
6303fi
6304qemu_version=$(head $source_path/VERSION)
6305echo "VERSION=$qemu_version" >>$config_host_mak
6306echo "PKGVERSION=$pkgversion" >>$config_host_mak
6307echo "SRC_PATH=$source_path" >> $config_host_mak
6308echo "TARGET_DIRS=$target_list" >> $config_host_mak
6309if [ "$docs" = "yes" ] ; then
6310  echo "BUILD_DOCS=yes" >> $config_host_mak
6311fi
6312if test "$modules" = "yes"; then
6313  # $shacmd can generate a hash started with digit, which the compiler doesn't
6314  # like as an symbol. So prefix it with an underscore
6315  echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
6316  echo "CONFIG_MODULES=y" >> $config_host_mak
6317fi
6318if test "$have_x11" = "yes" -a "$need_x11" = "yes"; then
6319  echo "CONFIG_X11=y" >> $config_host_mak
6320  echo "X11_CFLAGS=$x11_cflags" >> $config_host_mak
6321  echo "X11_LIBS=$x11_libs" >> $config_host_mak
6322fi
6323if test "$sdl" = "yes" ; then
6324  echo "CONFIG_SDL=m" >> $config_host_mak
6325  echo "CONFIG_SDLABI=$sdlabi" >> $config_host_mak
6326  echo "SDL_CFLAGS=$sdl_cflags" >> $config_host_mak
6327  echo "SDL_LIBS=$sdl_libs" >> $config_host_mak
6328fi
6329if test "$cocoa" = "yes" ; then
6330  echo "CONFIG_COCOA=y" >> $config_host_mak
6331fi
6332if test "$curses" = "yes" ; then
6333  echo "CONFIG_CURSES=m" >> $config_host_mak
6334  echo "CURSES_CFLAGS=$curses_inc" >> $config_host_mak
6335  echo "CURSES_LIBS=$curses_lib" >> $config_host_mak
6336fi
6337if test "$pipe2" = "yes" ; then
6338  echo "CONFIG_PIPE2=y" >> $config_host_mak
6339fi
6340if test "$accept4" = "yes" ; then
6341  echo "CONFIG_ACCEPT4=y" >> $config_host_mak
6342fi
6343if test "$splice" = "yes" ; then
6344  echo "CONFIG_SPLICE=y" >> $config_host_mak
6345fi
6346if test "$eventfd" = "yes" ; then
6347  echo "CONFIG_EVENTFD=y" >> $config_host_mak
6348fi
6349if test "$memfd" = "yes" ; then
6350  echo "CONFIG_MEMFD=y" >> $config_host_mak
6351fi
6352if test "$fallocate" = "yes" ; then
6353  echo "CONFIG_FALLOCATE=y" >> $config_host_mak
6354fi
6355if test "$fallocate_punch_hole" = "yes" ; then
6356  echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
6357fi
6358if test "$fallocate_zero_range" = "yes" ; then
6359  echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak
6360fi
6361if test "$posix_fallocate" = "yes" ; then
6362  echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
6363fi
6364if test "$sync_file_range" = "yes" ; then
6365  echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
6366fi
6367if test "$fiemap" = "yes" ; then
6368  echo "CONFIG_FIEMAP=y" >> $config_host_mak
6369fi
6370if test "$dup3" = "yes" ; then
6371  echo "CONFIG_DUP3=y" >> $config_host_mak
6372fi
6373if test "$ppoll" = "yes" ; then
6374  echo "CONFIG_PPOLL=y" >> $config_host_mak
6375fi
6376if test "$prctl_pr_set_timerslack" = "yes" ; then
6377  echo "CONFIG_PRCTL_PR_SET_TIMERSLACK=y" >> $config_host_mak
6378fi
6379if test "$epoll" = "yes" ; then
6380  echo "CONFIG_EPOLL=y" >> $config_host_mak
6381fi
6382if test "$epoll_create1" = "yes" ; then
6383  echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
6384fi
6385if test "$sendfile" = "yes" ; then
6386  echo "CONFIG_SENDFILE=y" >> $config_host_mak
6387fi
6388if test "$timerfd" = "yes" ; then
6389  echo "CONFIG_TIMERFD=y" >> $config_host_mak
6390fi
6391if test "$setns" = "yes" ; then
6392  echo "CONFIG_SETNS=y" >> $config_host_mak
6393fi
6394if test "$clock_adjtime" = "yes" ; then
6395  echo "CONFIG_CLOCK_ADJTIME=y" >> $config_host_mak
6396fi
6397if test "$syncfs" = "yes" ; then
6398  echo "CONFIG_SYNCFS=y" >> $config_host_mak
6399fi
6400if test "$inotify" = "yes" ; then
6401  echo "CONFIG_INOTIFY=y" >> $config_host_mak
6402fi
6403if test "$inotify1" = "yes" ; then
6404  echo "CONFIG_INOTIFY1=y" >> $config_host_mak
6405fi
6406if test "$sem_timedwait" = "yes" ; then
6407  echo "CONFIG_SEM_TIMEDWAIT=y" >> $config_host_mak
6408fi
6409if test "$strchrnul" = "yes" ; then
6410  echo "HAVE_STRCHRNUL=y" >> $config_host_mak
6411fi
6412if test "$byteswap_h" = "yes" ; then
6413  echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
6414fi
6415if test "$bswap_h" = "yes" ; then
6416  echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
6417fi
6418if test "$curl" = "yes" ; then
6419  echo "CONFIG_CURL=m" >> $config_host_mak
6420  echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak
6421  echo "CURL_LIBS=$curl_libs" >> $config_host_mak
6422fi
6423if test "$brlapi" = "yes" ; then
6424  echo "CONFIG_BRLAPI=y" >> $config_host_mak
6425  echo "BRLAPI_LIBS=$brlapi_libs" >> $config_host_mak
6426fi
6427if test "$bluez" = "yes" ; then
6428  echo "CONFIG_BLUEZ=y" >> $config_host_mak
6429  echo "BLUEZ_CFLAGS=$bluez_cflags" >> $config_host_mak
6430fi
6431if test "$gtk" = "yes" ; then
6432  echo "CONFIG_GTK=m" >> $config_host_mak
6433  echo "CONFIG_GTKABI=$gtkabi" >> $config_host_mak
6434  echo "GTK_CFLAGS=$gtk_cflags" >> $config_host_mak
6435  echo "GTK_LIBS=$gtk_libs" >> $config_host_mak
6436  if test "$gtk_gl" = "yes" ; then
6437    echo "CONFIG_GTK_GL=y" >> $config_host_mak
6438  fi
6439fi
6440echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
6441if test "$gnutls" = "yes" ; then
6442  echo "CONFIG_GNUTLS=y" >> $config_host_mak
6443fi
6444if test "$gnutls_rnd" = "yes" ; then
6445  echo "CONFIG_GNUTLS_RND=y" >> $config_host_mak
6446fi
6447if test "$gcrypt" = "yes" ; then
6448  echo "CONFIG_GCRYPT=y" >> $config_host_mak
6449  if test "$gcrypt_hmac" = "yes" ; then
6450    echo "CONFIG_GCRYPT_HMAC=y" >> $config_host_mak
6451  fi
6452  if test "$gcrypt_kdf" = "yes" ; then
6453    echo "CONFIG_GCRYPT_KDF=y" >> $config_host_mak
6454  fi
6455fi
6456if test "$nettle" = "yes" ; then
6457  echo "CONFIG_NETTLE=y" >> $config_host_mak
6458  echo "CONFIG_NETTLE_VERSION_MAJOR=${nettle_version%%.*}" >> $config_host_mak
6459  if test "$nettle_kdf" = "yes" ; then
6460    echo "CONFIG_NETTLE_KDF=y" >> $config_host_mak
6461  fi
6462fi
6463if test "$tasn1" = "yes" ; then
6464  echo "CONFIG_TASN1=y" >> $config_host_mak
6465fi
6466if test "$have_ifaddrs_h" = "yes" ; then
6467    echo "HAVE_IFADDRS_H=y" >> $config_host_mak
6468fi
6469if test "$have_broken_size_max" = "yes" ; then
6470    echo "HAVE_BROKEN_SIZE_MAX=y" >> $config_host_mak
6471fi
6472
6473# Work around a system header bug with some kernel/XFS header
6474# versions where they both try to define 'struct fsxattr':
6475# xfs headers will not try to redefine structs from linux headers
6476# if this macro is set.
6477if test "$have_fsxattr" = "yes" ; then
6478    echo "HAVE_FSXATTR=y" >> $config_host_mak
6479fi
6480if test "$have_copy_file_range" = "yes" ; then
6481    echo "HAVE_COPY_FILE_RANGE=y" >> $config_host_mak
6482fi
6483if test "$vte" = "yes" ; then
6484  echo "CONFIG_VTE=y" >> $config_host_mak
6485  echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak
6486  echo "VTE_LIBS=$vte_libs" >> $config_host_mak
6487fi
6488if test "$virglrenderer" = "yes" ; then
6489  echo "CONFIG_VIRGL=y" >> $config_host_mak
6490  echo "VIRGL_CFLAGS=$virgl_cflags" >> $config_host_mak
6491  echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak
6492fi
6493if test "$xen" = "yes" ; then
6494  echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
6495  echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
6496  if test "$xen_pv_domain_build" = "yes" ; then
6497    echo "CONFIG_XEN_PV_DOMAIN_BUILD=y" >> $config_host_mak
6498  fi
6499fi
6500if test "$linux_aio" = "yes" ; then
6501  echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
6502fi
6503if test "$attr" = "yes" ; then
6504  echo "CONFIG_ATTR=y" >> $config_host_mak
6505fi
6506if test "$libattr" = "yes" ; then
6507  echo "CONFIG_LIBATTR=y" >> $config_host_mak
6508fi
6509if test "$virtfs" = "yes" ; then
6510  echo "CONFIG_VIRTFS=y" >> $config_host_mak
6511fi
6512if test "$mpath" = "yes" ; then
6513  echo "CONFIG_MPATH=y" >> $config_host_mak
6514  if test "$mpathpersist_new_api" = "yes"; then
6515    echo "CONFIG_MPATH_NEW_API=y" >> $config_host_mak
6516  fi
6517fi
6518if test "$vhost_scsi" = "yes" ; then
6519  echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
6520fi
6521if test "$vhost_net" = "yes" -a "$vhost_user" = "yes"; then
6522  echo "CONFIG_VHOST_NET_USED=y" >> $config_host_mak
6523fi
6524if test "$vhost_crypto" = "yes" ; then
6525  echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
6526fi
6527if test "$vhost_vsock" = "yes" ; then
6528  echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
6529fi
6530if test "$vhost_user" = "yes" ; then
6531  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
6532fi
6533if test "$blobs" = "yes" ; then
6534  echo "INSTALL_BLOBS=yes" >> $config_host_mak
6535fi
6536if test "$iovec" = "yes" ; then
6537  echo "CONFIG_IOVEC=y" >> $config_host_mak
6538fi
6539if test "$preadv" = "yes" ; then
6540  echo "CONFIG_PREADV=y" >> $config_host_mak
6541fi
6542if test "$fdt" != "no" ; then
6543  echo "CONFIG_FDT=y" >> $config_host_mak
6544fi
6545if test "$membarrier" = "yes" ; then
6546  echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
6547fi
6548if test "$signalfd" = "yes" ; then
6549  echo "CONFIG_SIGNALFD=y" >> $config_host_mak
6550fi
6551if test "$tcg" = "yes"; then
6552  echo "CONFIG_TCG=y" >> $config_host_mak
6553  if test "$tcg_interpreter" = "yes" ; then
6554    echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
6555  fi
6556fi
6557if test "$fdatasync" = "yes" ; then
6558  echo "CONFIG_FDATASYNC=y" >> $config_host_mak
6559fi
6560if test "$madvise" = "yes" ; then
6561  echo "CONFIG_MADVISE=y" >> $config_host_mak
6562fi
6563if test "$posix_madvise" = "yes" ; then
6564  echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak
6565fi
6566if test "$posix_memalign" = "yes" ; then
6567  echo "CONFIG_POSIX_MEMALIGN=y" >> $config_host_mak
6568fi
6569
6570if test "$spice" = "yes" ; then
6571  echo "CONFIG_SPICE=y" >> $config_host_mak
6572fi
6573
6574if test "$smartcard" = "yes" ; then
6575  echo "CONFIG_SMARTCARD=y" >> $config_host_mak
6576  echo "SMARTCARD_CFLAGS=$libcacard_cflags" >> $config_host_mak
6577  echo "SMARTCARD_LIBS=$libcacard_libs" >> $config_host_mak
6578fi
6579
6580if test "$libusb" = "yes" ; then
6581  echo "CONFIG_USB_LIBUSB=y" >> $config_host_mak
6582  echo "LIBUSB_CFLAGS=$libusb_cflags" >> $config_host_mak
6583  echo "LIBUSB_LIBS=$libusb_libs" >> $config_host_mak
6584fi
6585
6586if test "$usb_redir" = "yes" ; then
6587  echo "CONFIG_USB_REDIR=y" >> $config_host_mak
6588  echo "USB_REDIR_CFLAGS=$usb_redir_cflags" >> $config_host_mak
6589  echo "USB_REDIR_LIBS=$usb_redir_libs" >> $config_host_mak
6590fi
6591
6592if test "$opengl" = "yes" ; then
6593  echo "CONFIG_OPENGL=y" >> $config_host_mak
6594  echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
6595  if test "$opengl_dmabuf" = "yes" ; then
6596    echo "CONFIG_OPENGL_DMABUF=y" >> $config_host_mak
6597  fi
6598fi
6599
6600if test "$malloc_trim" = "yes" ; then
6601  echo "CONFIG_MALLOC_TRIM=y" >> $config_host_mak
6602fi
6603
6604if test "$avx2_opt" = "yes" ; then
6605  echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
6606fi
6607
6608if test "$lzo" = "yes" ; then
6609  echo "CONFIG_LZO=y" >> $config_host_mak
6610fi
6611
6612if test "$snappy" = "yes" ; then
6613  echo "CONFIG_SNAPPY=y" >> $config_host_mak
6614fi
6615
6616if test "$bzip2" = "yes" ; then
6617  echo "CONFIG_BZIP2=y" >> $config_host_mak
6618  echo "BZIP2_LIBS=-lbz2" >> $config_host_mak
6619fi
6620
6621if test "$libiscsi" = "yes" ; then
6622  echo "CONFIG_LIBISCSI=m" >> $config_host_mak
6623  echo "LIBISCSI_CFLAGS=$libiscsi_cflags" >> $config_host_mak
6624  echo "LIBISCSI_LIBS=$libiscsi_libs" >> $config_host_mak
6625fi
6626
6627if test "$libnfs" = "yes" ; then
6628  echo "CONFIG_LIBNFS=m" >> $config_host_mak
6629  echo "LIBNFS_LIBS=$libnfs_libs" >> $config_host_mak
6630fi
6631
6632if test "$seccomp" = "yes"; then
6633  echo "CONFIG_SECCOMP=y" >> $config_host_mak
6634  echo "SECCOMP_CFLAGS=$seccomp_cflags" >> $config_host_mak
6635  echo "SECCOMP_LIBS=$seccomp_libs" >> $config_host_mak
6636fi
6637
6638# XXX: suppress that
6639if [ "$bsd" = "yes" ] ; then
6640  echo "CONFIG_BSD=y" >> $config_host_mak
6641fi
6642
6643if test "$localtime_r" = "yes" ; then
6644  echo "CONFIG_LOCALTIME_R=y" >> $config_host_mak
6645fi
6646if test "$qom_cast_debug" = "yes" ; then
6647  echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
6648fi
6649if test "$rbd" = "yes" ; then
6650  echo "CONFIG_RBD=m" >> $config_host_mak
6651  echo "RBD_CFLAGS=$rbd_cflags" >> $config_host_mak
6652  echo "RBD_LIBS=$rbd_libs" >> $config_host_mak
6653fi
6654
6655echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
6656if test "$coroutine_pool" = "yes" ; then
6657  echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
6658else
6659  echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
6660fi
6661
6662if test "$debug_stack_usage" = "yes" ; then
6663  echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
6664fi
6665
6666if test "$crypto_afalg" = "yes" ; then
6667  echo "CONFIG_AF_ALG=y" >> $config_host_mak
6668fi
6669
6670if test "$open_by_handle_at" = "yes" ; then
6671  echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
6672fi
6673
6674if test "$linux_magic_h" = "yes" ; then
6675  echo "CONFIG_LINUX_MAGIC_H=y" >> $config_host_mak
6676fi
6677
6678if test "$pragma_diagnostic_available" = "yes" ; then
6679  echo "CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE=y" >> $config_host_mak
6680fi
6681
6682if test "$valgrind_h" = "yes" ; then
6683  echo "CONFIG_VALGRIND_H=y" >> $config_host_mak
6684fi
6685
6686if test "$have_asan_iface_fiber" = "yes" ; then
6687    echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
6688fi
6689
6690if test "$has_environ" = "yes" ; then
6691  echo "CONFIG_HAS_ENVIRON=y" >> $config_host_mak
6692fi
6693
6694if test "$cpuid_h" = "yes" ; then
6695  echo "CONFIG_CPUID_H=y" >> $config_host_mak
6696fi
6697
6698if test "$int128" = "yes" ; then
6699  echo "CONFIG_INT128=y" >> $config_host_mak
6700fi
6701
6702if test "$atomic128" = "yes" ; then
6703  echo "CONFIG_ATOMIC128=y" >> $config_host_mak
6704fi
6705
6706if test "$atomic64" = "yes" ; then
6707  echo "CONFIG_ATOMIC64=y" >> $config_host_mak
6708fi
6709
6710if test "$vector16" = "yes" ; then
6711  echo "CONFIG_VECTOR16=y" >> $config_host_mak
6712fi
6713
6714if test "$getauxval" = "yes" ; then
6715  echo "CONFIG_GETAUXVAL=y" >> $config_host_mak
6716fi
6717
6718if test "$glusterfs" = "yes" ; then
6719  echo "CONFIG_GLUSTERFS=m" >> $config_host_mak
6720  echo "GLUSTERFS_CFLAGS=$glusterfs_cflags" >> $config_host_mak
6721  echo "GLUSTERFS_LIBS=$glusterfs_libs" >> $config_host_mak
6722fi
6723
6724if test "$glusterfs_xlator_opt" = "yes" ; then
6725  echo "CONFIG_GLUSTERFS_XLATOR_OPT=y" >> $config_host_mak
6726fi
6727
6728if test "$glusterfs_discard" = "yes" ; then
6729  echo "CONFIG_GLUSTERFS_DISCARD=y" >> $config_host_mak
6730fi
6731
6732if test "$glusterfs_fallocate" = "yes" ; then
6733  echo "CONFIG_GLUSTERFS_FALLOCATE=y" >> $config_host_mak
6734fi
6735
6736if test "$glusterfs_zerofill" = "yes" ; then
6737  echo "CONFIG_GLUSTERFS_ZEROFILL=y" >> $config_host_mak
6738fi
6739
6740if test "$libssh2" = "yes" ; then
6741  echo "CONFIG_LIBSSH2=m" >> $config_host_mak
6742  echo "LIBSSH2_CFLAGS=$libssh2_cflags" >> $config_host_mak
6743  echo "LIBSSH2_LIBS=$libssh2_libs" >> $config_host_mak
6744fi
6745
6746if test "$live_block_migration" = "yes" ; then
6747  echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
6748fi
6749
6750if test "$tpm" = "yes"; then
6751  echo 'CONFIG_TPM=$(CONFIG_SOFTMMU)' >> $config_host_mak
6752  # TPM passthrough support?
6753  if test "$tpm_passthrough" = "yes"; then
6754    echo "CONFIG_TPM_PASSTHROUGH=y" >> $config_host_mak
6755  fi
6756  # TPM emulator support?
6757  if test "$tpm_emulator" = "yes"; then
6758    echo "CONFIG_TPM_EMULATOR=y" >> $config_host_mak
6759  fi
6760fi
6761
6762echo "TRACE_BACKENDS=$trace_backends" >> $config_host_mak
6763if have_backend "nop"; then
6764  echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
6765fi
6766if have_backend "simple"; then
6767  echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
6768  # Set the appropriate trace file.
6769  trace_file="\"$trace_file-\" FMT_pid"
6770fi
6771if have_backend "log"; then
6772  echo "CONFIG_TRACE_LOG=y" >> $config_host_mak
6773fi
6774if have_backend "ust"; then
6775  echo "CONFIG_TRACE_UST=y" >> $config_host_mak
6776fi
6777if have_backend "dtrace"; then
6778  echo "CONFIG_TRACE_DTRACE=y" >> $config_host_mak
6779  if test "$trace_backend_stap" = "yes" ; then
6780    echo "CONFIG_TRACE_SYSTEMTAP=y" >> $config_host_mak
6781  fi
6782fi
6783if have_backend "ftrace"; then
6784  if test "$linux" = "yes" ; then
6785    echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak
6786  else
6787    feature_not_found "ftrace(trace backend)" "ftrace requires Linux"
6788  fi
6789fi
6790if have_backend "syslog"; then
6791  if test "$posix_syslog" = "yes" ; then
6792    echo "CONFIG_TRACE_SYSLOG=y" >> $config_host_mak
6793  else
6794    feature_not_found "syslog(trace backend)" "syslog not available"
6795  fi
6796fi
6797echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
6798
6799if test "$rdma" = "yes" ; then
6800  echo "CONFIG_RDMA=y" >> $config_host_mak
6801  echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
6802fi
6803
6804if test "$pvrdma" = "yes" ; then
6805  echo "CONFIG_PVRDMA=y" >> $config_host_mak
6806fi
6807
6808if test "$have_rtnetlink" = "yes" ; then
6809  echo "CONFIG_RTNETLINK=y" >> $config_host_mak
6810fi
6811
6812if test "$libxml2" = "yes" ; then
6813  echo "CONFIG_LIBXML2=y" >> $config_host_mak
6814  echo "LIBXML2_CFLAGS=$libxml2_cflags" >> $config_host_mak
6815  echo "LIBXML2_LIBS=$libxml2_libs" >> $config_host_mak
6816fi
6817
6818if test "$replication" = "yes" ; then
6819  echo "CONFIG_REPLICATION=y" >> $config_host_mak
6820fi
6821
6822if test "$have_af_vsock" = "yes" ; then
6823  echo "CONFIG_AF_VSOCK=y" >> $config_host_mak
6824fi
6825
6826if test "$have_sysmacros" = "yes" ; then
6827  echo "CONFIG_SYSMACROS=y" >> $config_host_mak
6828fi
6829
6830if test "$have_static_assert" = "yes" ; then
6831  echo "CONFIG_STATIC_ASSERT=y" >> $config_host_mak
6832fi
6833
6834if test "$have_utmpx" = "yes" ; then
6835  echo "HAVE_UTMPX=y" >> $config_host_mak
6836fi
6837
6838if test "$ivshmem" = "yes" ; then
6839  echo "CONFIG_IVSHMEM=y" >> $config_host_mak
6840fi
6841if test "$capstone" != "no" ; then
6842  echo "CONFIG_CAPSTONE=y" >> $config_host_mak
6843fi
6844if test "$debug_mutex" = "yes" ; then
6845  echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
6846fi
6847
6848# Hold two types of flag:
6849#   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
6850#                                     a thread we have a handle to
6851#   CONFIG_PTHREAD_SETNAME_NP       - A way of doing it on a particular
6852#                                     platform
6853if test "$pthread_setname_np" = "yes" ; then
6854  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
6855  echo "CONFIG_PTHREAD_SETNAME_NP=y" >> $config_host_mak
6856fi
6857
6858if test "$vxhs" = "yes" ; then
6859  echo "CONFIG_VXHS=y" >> $config_host_mak
6860  echo "VXHS_LIBS=$vxhs_libs" >> $config_host_mak
6861fi
6862
6863if test "$libpmem" = "yes" ; then
6864  echo "CONFIG_LIBPMEM=y" >> $config_host_mak
6865fi
6866
6867if test "$tcg_interpreter" = "yes"; then
6868  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/tci $QEMU_INCLUDES"
6869elif test "$ARCH" = "sparc64" ; then
6870  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/sparc $QEMU_INCLUDES"
6871elif test "$ARCH" = "s390x" ; then
6872  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/s390 $QEMU_INCLUDES"
6873elif test "$ARCH" = "x86_64" -o "$ARCH" = "x32" ; then
6874  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/i386 $QEMU_INCLUDES"
6875elif test "$ARCH" = "ppc64" ; then
6876  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/ppc $QEMU_INCLUDES"
6877else
6878  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/\$(ARCH) $QEMU_INCLUDES"
6879fi
6880QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg $QEMU_INCLUDES"
6881
6882echo "TOOLS=$tools" >> $config_host_mak
6883echo "ROMS=$roms" >> $config_host_mak
6884echo "MAKE=$make" >> $config_host_mak
6885echo "INSTALL=$install" >> $config_host_mak
6886echo "INSTALL_DIR=$install -d -m 0755" >> $config_host_mak
6887echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
6888echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
6889echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
6890echo "PYTHON=$python" >> $config_host_mak
6891echo "CC=$cc" >> $config_host_mak
6892if $iasl -h > /dev/null 2>&1; then
6893  echo "IASL=$iasl" >> $config_host_mak
6894fi
6895echo "HOST_CC=$host_cc" >> $config_host_mak
6896echo "CXX=$cxx" >> $config_host_mak
6897echo "OBJCC=$objcc" >> $config_host_mak
6898echo "AR=$ar" >> $config_host_mak
6899echo "ARFLAGS=$ARFLAGS" >> $config_host_mak
6900echo "AS=$as" >> $config_host_mak
6901echo "CCAS=$ccas" >> $config_host_mak
6902echo "CPP=$cpp" >> $config_host_mak
6903echo "OBJCOPY=$objcopy" >> $config_host_mak
6904echo "LD=$ld" >> $config_host_mak
6905echo "RANLIB=$ranlib" >> $config_host_mak
6906echo "NM=$nm" >> $config_host_mak
6907echo "WINDRES=$windres" >> $config_host_mak
6908echo "CFLAGS=$CFLAGS" >> $config_host_mak
6909echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
6910echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
6911echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
6912echo "QEMU_INCLUDES=$QEMU_INCLUDES" >> $config_host_mak
6913if test "$sparse" = "yes" ; then
6914  echo "CC           := REAL_CC=\"\$(CC)\" cgcc"       >> $config_host_mak
6915  echo "CPP          := REAL_CC=\"\$(CPP)\" cgcc"      >> $config_host_mak
6916  echo "CXX          := REAL_CC=\"\$(CXX)\" cgcc"      >> $config_host_mak
6917  echo "HOST_CC      := REAL_CC=\"\$(HOST_CC)\" cgcc"  >> $config_host_mak
6918  echo "QEMU_CFLAGS  += -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-non-pointer-null" >> $config_host_mak
6919fi
6920if test "$cross_prefix" != ""; then
6921  echo "AUTOCONF_HOST := --host=${cross_prefix%-}"     >> $config_host_mak
6922else
6923  echo "AUTOCONF_HOST := "                             >> $config_host_mak
6924fi
6925echo "LDFLAGS=$LDFLAGS" >> $config_host_mak
6926echo "LDFLAGS_NOPIE=$LDFLAGS_NOPIE" >> $config_host_mak
6927echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
6928echo "LD_REL_FLAGS=$LD_REL_FLAGS" >> $config_host_mak
6929echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
6930echo "LIBS+=$LIBS" >> $config_host_mak
6931echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak
6932echo "PTHREAD_LIB=$PTHREAD_LIB" >> $config_host_mak
6933echo "EXESUF=$EXESUF" >> $config_host_mak
6934echo "DSOSUF=$DSOSUF" >> $config_host_mak
6935echo "LDFLAGS_SHARED=$LDFLAGS_SHARED" >> $config_host_mak
6936echo "LIBS_QGA+=$libs_qga" >> $config_host_mak
6937echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak
6938echo "TASN1_CFLAGS=$tasn1_cflags" >> $config_host_mak
6939echo "POD2MAN=$POD2MAN" >> $config_host_mak
6940echo "TRANSLATE_OPT_CFLAGS=$TRANSLATE_OPT_CFLAGS" >> $config_host_mak
6941if test "$gcov" = "yes" ; then
6942  echo "CONFIG_GCOV=y" >> $config_host_mak
6943  echo "GCOV=$gcov_tool" >> $config_host_mak
6944fi
6945
6946if test "$docker" != "no"; then
6947    echo "HAVE_USER_DOCKER=y" >> $config_host_mak
6948fi
6949
6950# use included Linux headers
6951if test "$linux" = "yes" ; then
6952  mkdir -p linux-headers
6953  case "$cpu" in
6954  i386|x86_64|x32)
6955    linux_arch=x86
6956    ;;
6957  ppcemb|ppc|ppc64)
6958    linux_arch=powerpc
6959    ;;
6960  s390x)
6961    linux_arch=s390
6962    ;;
6963  aarch64)
6964    linux_arch=arm64
6965    ;;
6966  mips64)
6967    linux_arch=mips
6968    ;;
6969  *)
6970    # For most CPUs the kernel architecture name and QEMU CPU name match.
6971    linux_arch="$cpu"
6972    ;;
6973  esac
6974    # For non-KVM architectures we will not have asm headers
6975    if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
6976      symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
6977    fi
6978fi
6979
6980for target in $target_list; do
6981target_dir="$target"
6982config_target_mak=$target_dir/config-target.mak
6983target_name=$(echo $target | cut -d '-' -f 1)
6984target_bigendian="no"
6985
6986case "$target_name" in
6987  armeb|aarch64_be|hppa|lm32|m68k|microblaze|mips|mipsn32|mips64|moxie|or1k|ppc|ppcemb|ppc64|ppc64abi32|s390x|sh4eb|sparc|sparc64|sparc32plus|xtensaeb)
6988  target_bigendian=yes
6989  ;;
6990esac
6991target_softmmu="no"
6992target_user_only="no"
6993target_linux_user="no"
6994target_bsd_user="no"
6995case "$target" in
6996  ${target_name}-softmmu)
6997    target_softmmu="yes"
6998    ;;
6999  ${target_name}-linux-user)
7000    target_user_only="yes"
7001    target_linux_user="yes"
7002    ;;
7003  ${target_name}-bsd-user)
7004    target_user_only="yes"
7005    target_bsd_user="yes"
7006    ;;
7007  *)
7008    error_exit "Target '$target' not recognised"
7009    exit 1
7010    ;;
7011esac
7012
7013target_compiler=""
7014target_compiler_static=""
7015target_compiler_cflags=""
7016
7017mkdir -p $target_dir
7018echo "# Automatically generated by configure - do not modify" > $config_target_mak
7019
7020bflt="no"
7021mttcg="no"
7022interp_prefix1=$(echo "$interp_prefix" | sed "s/%M/$target_name/g")
7023gdb_xml_files=""
7024
7025TARGET_ARCH="$target_name"
7026TARGET_BASE_ARCH=""
7027TARGET_ABI_DIR=""
7028
7029case "$target_name" in
7030  i386)
7031    gdb_xml_files="i386-32bit.xml i386-32bit-core.xml i386-32bit-sse.xml"
7032    target_compiler=$cross_cc_i386
7033    target_compiler_cflags=$cross_cc_ccflags_i386
7034  ;;
7035  x86_64)
7036    TARGET_BASE_ARCH=i386
7037    gdb_xml_files="i386-64bit.xml i386-64bit-core.xml i386-64bit-sse.xml"
7038    target_compiler=$cross_cc_x86_64
7039  ;;
7040  alpha)
7041    mttcg="yes"
7042    target_compiler=$cross_cc_alpha
7043  ;;
7044  arm|armeb)
7045    TARGET_ARCH=arm
7046    bflt="yes"
7047    mttcg="yes"
7048    gdb_xml_files="arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"
7049    target_compiler=$cross_cc_arm
7050    eval "target_compiler_cflags=\$cross_cc_cflags_${target_name}"
7051  ;;
7052  aarch64|aarch64_be)
7053    TARGET_ARCH=aarch64
7054    TARGET_BASE_ARCH=arm
7055    bflt="yes"
7056    mttcg="yes"
7057    gdb_xml_files="aarch64-core.xml aarch64-fpu.xml arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"
7058    target_compiler=$cross_cc_aarch64
7059    eval "target_compiler_cflags=\$cross_cc_cflags_${target_name}"
7060  ;;
7061  cris)
7062    target_compiler=$cross_cc_cris
7063  ;;
7064  hppa)
7065    mttcg="yes"
7066    target_compiler=$cross_cc_hppa
7067  ;;
7068  lm32)
7069    target_compiler=$cross_cc_lm32
7070  ;;
7071  m68k)
7072    bflt="yes"
7073    gdb_xml_files="cf-core.xml cf-fp.xml m68k-fp.xml"
7074    target_compiler=$cross_cc_m68k
7075  ;;
7076  microblaze|microblazeel)
7077    TARGET_ARCH=microblaze
7078    bflt="yes"
7079    echo "TARGET_ABI32=y" >> $config_target_mak
7080    target_compiler=$cross_cc_microblaze
7081  ;;
7082  mips|mipsel)
7083    TARGET_ARCH=mips
7084    target_compiler=$cross_cc_mips
7085    echo "TARGET_ABI_MIPSO32=y" >> $config_target_mak
7086  ;;
7087  mipsn32|mipsn32el)
7088    TARGET_ARCH=mips64
7089    TARGET_BASE_ARCH=mips
7090    target_compiler=$cross_cc_mipsn32
7091    echo "TARGET_ABI_MIPSN32=y" >> $config_target_mak
7092    echo "TARGET_ABI32=y" >> $config_target_mak
7093  ;;
7094  mips64|mips64el)
7095    TARGET_ARCH=mips64
7096    TARGET_BASE_ARCH=mips
7097    target_compiler=$cross_cc_mips64
7098    echo "TARGET_ABI_MIPSN64=y" >> $config_target_mak
7099  ;;
7100  moxie)
7101    target_compiler=$cross_cc_moxie
7102  ;;
7103  nios2)
7104    target_compiler=$cross_cc_nios2
7105  ;;
7106  or1k)
7107    target_compiler=$cross_cc_or1k
7108    TARGET_ARCH=openrisc
7109    TARGET_BASE_ARCH=openrisc
7110  ;;
7111  ppc)
7112    gdb_xml_files="power-core.xml power-fpu.xml power-altivec.xml power-spe.xml"
7113    target_compiler=$cross_cc_powerpc
7114  ;;
7115  ppcemb)
7116    TARGET_BASE_ARCH=ppc
7117    TARGET_ABI_DIR=ppc
7118    gdb_xml_files="power-core.xml power-fpu.xml power-altivec.xml power-spe.xml"
7119    target_compiler=$cross_cc_ppcemb
7120  ;;
7121  ppc64)
7122    TARGET_BASE_ARCH=ppc
7123    TARGET_ABI_DIR=ppc
7124    mttcg=yes
7125    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
7126    target_compiler=$cross_cc_ppc64
7127  ;;
7128  ppc64le)
7129    TARGET_ARCH=ppc64
7130    TARGET_BASE_ARCH=ppc
7131    TARGET_ABI_DIR=ppc
7132    mttcg=yes
7133    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
7134    target_compiler=$cross_cc_ppc64le
7135  ;;
7136  ppc64abi32)
7137    TARGET_ARCH=ppc64
7138    TARGET_BASE_ARCH=ppc
7139    TARGET_ABI_DIR=ppc
7140    echo "TARGET_ABI32=y" >> $config_target_mak
7141    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
7142    target_compiler=$cross_cc_ppc64abi32
7143  ;;
7144  riscv32)
7145    TARGET_BASE_ARCH=riscv
7146    TARGET_ABI_DIR=riscv
7147    mttcg=yes
7148    target_compiler=$cross_cc_riscv32
7149  ;;
7150  riscv64)
7151    TARGET_BASE_ARCH=riscv
7152    TARGET_ABI_DIR=riscv
7153    mttcg=yes
7154    target_compiler=$cross_cc_riscv64
7155  ;;
7156  sh4|sh4eb)
7157    TARGET_ARCH=sh4
7158    bflt="yes"
7159    target_compiler=$cross_cc_sh4
7160  ;;
7161  sparc)
7162    target_compiler=$cross_cc_sparc
7163  ;;
7164  sparc64)
7165    TARGET_BASE_ARCH=sparc
7166    target_compiler=$cross_cc_sparc64
7167  ;;
7168  sparc32plus)
7169    TARGET_ARCH=sparc64
7170    TARGET_BASE_ARCH=sparc
7171    TARGET_ABI_DIR=sparc
7172    target_compiler=$cross_cc_sparc32plus
7173    echo "TARGET_ABI32=y" >> $config_target_mak
7174  ;;
7175  s390x)
7176    mttcg=yes
7177    gdb_xml_files="s390x-core64.xml s390-acr.xml s390-fpr.xml s390-vx.xml s390-cr.xml s390-virt.xml s390-gs.xml"
7178    target_compiler=$cross_cc_s390x
7179  ;;
7180  tilegx)
7181    target_compiler=$cross_cc_tilegx
7182  ;;
7183  tricore)
7184    target_compiler=$cross_cc_tricore
7185  ;;
7186  unicore32)
7187    target_compiler=$cross_cc_unicore32
7188  ;;
7189  xtensa|xtensaeb)
7190    TARGET_ARCH=xtensa
7191    mttcg="yes"
7192    target_compiler=$cross_cc_xtensa
7193  ;;
7194  *)
7195    error_exit "Unsupported target CPU"
7196  ;;
7197esac
7198# TARGET_BASE_ARCH needs to be defined after TARGET_ARCH
7199if [ "$TARGET_BASE_ARCH" = "" ]; then
7200  TARGET_BASE_ARCH=$TARGET_ARCH
7201fi
7202
7203# Do we have a cross compiler for this target?
7204if has $target_compiler; then
7205
7206    write_c_skeleton
7207
7208    if ! do_compiler "$target_compiler" $target_compiler_cflags -o $TMPE $TMPC -static ; then
7209        # For host systems we might get away with building without -static
7210        if ! do_compiler "$target_compiler" $target_compiler_cflags -o $TMPE $TMPC ; then
7211            target_compiler=""
7212        else
7213            enabled_cross_compilers="${enabled_cross_compilers} '${target_compiler}'"
7214            target_compiler_static="n"
7215        fi
7216    else
7217        enabled_cross_compilers="${enabled_cross_compilers} '${target_compiler}'"
7218        target_compiler_static="y"
7219    fi
7220else
7221    target_compiler=""
7222fi
7223
7224symlink "$source_path/Makefile.target" "$target_dir/Makefile"
7225
7226upper() {
7227    echo "$@"| LC_ALL=C tr '[a-z]' '[A-Z]'
7228}
7229
7230target_arch_name="$(upper $TARGET_ARCH)"
7231echo "TARGET_$target_arch_name=y" >> $config_target_mak
7232echo "TARGET_NAME=$target_name" >> $config_target_mak
7233echo "TARGET_BASE_ARCH=$TARGET_BASE_ARCH" >> $config_target_mak
7234if [ "$TARGET_ABI_DIR" = "" ]; then
7235  TARGET_ABI_DIR=$TARGET_ARCH
7236fi
7237echo "TARGET_ABI_DIR=$TARGET_ABI_DIR" >> $config_target_mak
7238if [ "$HOST_VARIANT_DIR" != "" ]; then
7239    echo "HOST_VARIANT_DIR=$HOST_VARIANT_DIR" >> $config_target_mak
7240fi
7241
7242if supported_xen_target $target; then
7243    echo "CONFIG_XEN=y" >> $config_target_mak
7244    if test "$xen_pci_passthrough" = yes; then
7245        echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak"
7246    fi
7247fi
7248if supported_kvm_target $target; then
7249    echo "CONFIG_KVM=y" >> $config_target_mak
7250    if test "$vhost_net" = "yes" ; then
7251        echo "CONFIG_VHOST_NET=y" >> $config_target_mak
7252        if test "$vhost_user" = "yes" ; then
7253            echo "CONFIG_VHOST_USER_NET_TEST_$target_name=y" >> $config_host_mak
7254        fi
7255    fi
7256fi
7257if supported_hax_target $target; then
7258    echo "CONFIG_HAX=y" >> $config_target_mak
7259fi
7260if supported_hvf_target $target; then
7261    echo "CONFIG_HVF=y" >> $config_target_mak
7262fi
7263if supported_whpx_target $target; then
7264    echo "CONFIG_WHPX=y" >> $config_target_mak
7265fi
7266if test "$target_bigendian" = "yes" ; then
7267  echo "TARGET_WORDS_BIGENDIAN=y" >> $config_target_mak
7268fi
7269if test "$target_softmmu" = "yes" ; then
7270  echo "CONFIG_SOFTMMU=y" >> $config_target_mak
7271  if test "$mttcg" = "yes" ; then
7272    echo "TARGET_SUPPORTS_MTTCG=y" >> $config_target_mak
7273  fi
7274fi
7275if test "$target_user_only" = "yes" ; then
7276  echo "CONFIG_USER_ONLY=y" >> $config_target_mak
7277  echo "CONFIG_QEMU_INTERP_PREFIX=\"$interp_prefix1\"" >> $config_target_mak
7278fi
7279if test "$target_linux_user" = "yes" ; then
7280  echo "CONFIG_LINUX_USER=y" >> $config_target_mak
7281fi
7282list=""
7283if test ! -z "$gdb_xml_files" ; then
7284  for x in $gdb_xml_files; do
7285    list="$list $source_path/gdb-xml/$x"
7286  done
7287  echo "TARGET_XML_FILES=$list" >> $config_target_mak
7288fi
7289
7290if test "$target_user_only" = "yes" -a "$bflt" = "yes"; then
7291  echo "TARGET_HAS_BFLT=y" >> $config_target_mak
7292fi
7293if test "$target_bsd_user" = "yes" ; then
7294  echo "CONFIG_BSD_USER=y" >> $config_target_mak
7295fi
7296
7297if test -n "$target_compiler"; then
7298  echo "CROSS_CC_GUEST=\"$target_compiler\"" >> $config_target_mak
7299
7300  if test -n "$target_compiler_static"; then
7301      echo "CROSS_CC_GUEST_STATIC=$target_compiler_static" >> $config_target_mak
7302  fi
7303
7304  if test -n "$target_compiler_cflags"; then
7305      echo "CROSS_CC_GUEST_CFLAGS=$target_compiler_cflags" >> $config_target_mak
7306  fi
7307fi
7308
7309
7310# generate QEMU_CFLAGS/LDFLAGS for targets
7311
7312cflags=""
7313ldflags=""
7314
7315disas_config() {
7316  echo "CONFIG_${1}_DIS=y" >> $config_target_mak
7317  echo "CONFIG_${1}_DIS=y" >> config-all-disas.mak
7318}
7319
7320for i in $ARCH $TARGET_BASE_ARCH ; do
7321  case "$i" in
7322  alpha)
7323    disas_config "ALPHA"
7324  ;;
7325  aarch64)
7326    if test -n "${cxx}"; then
7327      disas_config "ARM_A64"
7328    fi
7329  ;;
7330  arm)
7331    disas_config "ARM"
7332    if test -n "${cxx}"; then
7333      disas_config "ARM_A64"
7334    fi
7335  ;;
7336  cris)
7337    disas_config "CRIS"
7338  ;;
7339  hppa)
7340    disas_config "HPPA"
7341  ;;
7342  i386|x86_64|x32)
7343    disas_config "I386"
7344  ;;
7345  lm32)
7346    disas_config "LM32"
7347  ;;
7348  m68k)
7349    disas_config "M68K"
7350  ;;
7351  microblaze*)
7352    disas_config "MICROBLAZE"
7353  ;;
7354  mips*)
7355    disas_config "MIPS"
7356  ;;
7357  moxie*)
7358    disas_config "MOXIE"
7359  ;;
7360  nios2)
7361    disas_config "NIOS2"
7362  ;;
7363  or1k)
7364    disas_config "OPENRISC"
7365  ;;
7366  ppc*)
7367    disas_config "PPC"
7368  ;;
7369  riscv)
7370    disas_config "RISCV"
7371  ;;
7372  s390*)
7373    disas_config "S390"
7374  ;;
7375  sh4)
7376    disas_config "SH4"
7377  ;;
7378  sparc*)
7379    disas_config "SPARC"
7380  ;;
7381  xtensa*)
7382    disas_config "XTENSA"
7383  ;;
7384  esac
7385done
7386if test "$tcg_interpreter" = "yes" ; then
7387  disas_config "TCI"
7388fi
7389
7390case "$ARCH" in
7391alpha)
7392  # Ensure there's only a single GP
7393  cflags="-msmall-data $cflags"
7394;;
7395esac
7396
7397if test "$gprof" = "yes" ; then
7398  echo "TARGET_GPROF=yes" >> $config_target_mak
7399  if test "$target_linux_user" = "yes" ; then
7400    cflags="-p $cflags"
7401    ldflags="-p $ldflags"
7402  fi
7403  if test "$target_softmmu" = "yes" ; then
7404    ldflags="-p $ldflags"
7405    echo "GPROF_CFLAGS=-p" >> $config_target_mak
7406  fi
7407fi
7408
7409if test "$target_linux_user" = "yes" -o "$target_bsd_user" = "yes" ; then
7410  ldflags="$ldflags $textseg_ldflags"
7411fi
7412
7413# Newer kernels on s390 check for an S390_PGSTE program header and
7414# enable the pgste page table extensions in that case. This makes
7415# the vm.allocate_pgste sysctl unnecessary. We enable this program
7416# header if
7417#  - we build on s390x
7418#  - we build the system emulation for s390x (qemu-system-s390x)
7419#  - KVM is enabled
7420#  - the linker supports --s390-pgste
7421if test "$TARGET_ARCH" = "s390x" -a "$target_softmmu" = "yes"  -a "$ARCH" = "s390x" -a "$kvm" = "yes"; then
7422    if ld_has --s390-pgste ; then
7423        ldflags="-Wl,--s390-pgste $ldflags"
7424    fi
7425fi
7426
7427echo "LDFLAGS+=$ldflags" >> $config_target_mak
7428echo "QEMU_CFLAGS+=$cflags" >> $config_target_mak
7429
7430done # for target in $targets
7431
7432if test -n "$enabled_cross_compilers"; then
7433    echo
7434    echo "NOTE: cross-compilers enabled: $enabled_cross_compilers"
7435fi
7436
7437if [ "$fdt" = "git" ]; then
7438  echo "config-host.h: subdir-dtc" >> $config_host_mak
7439fi
7440if [ "$capstone" = "git" -o "$capstone" = "internal" ]; then
7441  echo "config-host.h: subdir-capstone" >> $config_host_mak
7442fi
7443if test -n "$LIBCAPSTONE"; then
7444  echo "LIBCAPSTONE=$LIBCAPSTONE" >> $config_host_mak
7445fi
7446
7447if test "$numa" = "yes"; then
7448  echo "CONFIG_NUMA=y" >> $config_host_mak
7449fi
7450
7451if test "$ccache_cpp2" = "yes"; then
7452  echo "export CCACHE_CPP2=y" >> $config_host_mak
7453fi
7454
7455# build tree in object directory in case the source is not in the current directory
7456DIRS="tests tests/tcg tests/tcg/cris tests/tcg/lm32 tests/libqos tests/qapi-schema tests/tcg/xtensa tests/qemu-iotests tests/vm"
7457DIRS="$DIRS docs docs/interop fsdev scsi"
7458DIRS="$DIRS pc-bios/optionrom pc-bios/spapr-rtas pc-bios/s390-ccw"
7459DIRS="$DIRS roms/seabios roms/vgabios"
7460FILES="Makefile tests/tcg/Makefile qdict-test-data.txt"
7461FILES="$FILES tests/tcg/cris/Makefile tests/tcg/cris/.gdbinit"
7462FILES="$FILES tests/tcg/lm32/Makefile tests/tcg/xtensa/Makefile po/Makefile"
7463FILES="$FILES pc-bios/optionrom/Makefile pc-bios/keymaps"
7464FILES="$FILES pc-bios/spapr-rtas/Makefile"
7465FILES="$FILES pc-bios/s390-ccw/Makefile"
7466FILES="$FILES roms/seabios/Makefile roms/vgabios/Makefile"
7467FILES="$FILES pc-bios/qemu-icon.bmp"
7468FILES="$FILES .gdbinit scripts" # scripts needed by relative path in .gdbinit
7469for bios_file in \
7470    $source_path/pc-bios/*.bin \
7471    $source_path/pc-bios/*.lid \
7472    $source_path/pc-bios/*.aml \
7473    $source_path/pc-bios/*.rom \
7474    $source_path/pc-bios/*.dtb \
7475    $source_path/pc-bios/*.img \
7476    $source_path/pc-bios/openbios-* \
7477    $source_path/pc-bios/u-boot.* \
7478    $source_path/pc-bios/palcode-*
7479do
7480    FILES="$FILES pc-bios/$(basename $bios_file)"
7481done
7482for test_file in $(find $source_path/tests/acpi-test-data -type f)
7483do
7484    FILES="$FILES tests/acpi-test-data$(echo $test_file | sed -e 's/.*acpi-test-data//')"
7485done
7486for test_file in $(find $source_path/tests/hex-loader-check-data -type f)
7487do
7488    FILES="$FILES tests/hex-loader-check-data$(echo $test_file | sed -e 's/.*hex-loader-check-data//')"
7489done
7490mkdir -p $DIRS
7491for f in $FILES ; do
7492    if [ -e "$source_path/$f" ] && [ "$pwd_is_source_path" != "y" ]; then
7493        symlink "$source_path/$f" "$f"
7494    fi
7495done
7496
7497# temporary config to build submodules
7498for rom in seabios vgabios ; do
7499    config_mak=roms/$rom/config.mak
7500    echo "# Automatically generated by configure - do not modify" > $config_mak
7501    echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
7502    echo "AS=$as" >> $config_mak
7503    echo "CCAS=$ccas" >> $config_mak
7504    echo "CC=$cc" >> $config_mak
7505    echo "BCC=bcc" >> $config_mak
7506    echo "CPP=$cpp" >> $config_mak
7507    echo "OBJCOPY=objcopy" >> $config_mak
7508    echo "IASL=$iasl" >> $config_mak
7509    echo "LD=$ld" >> $config_mak
7510    echo "RANLIB=$ranlib" >> $config_mak
7511done
7512
7513# set up tests data directory
7514for tests_subdir in acceptance data; do
7515    if [ ! -e tests/$tests_subdir ]; then
7516        symlink "$source_path/tests/$tests_subdir" tests/$tests_subdir
7517    fi
7518done
7519
7520# set up qemu-iotests in this build directory
7521iotests_common_env="tests/qemu-iotests/common.env"
7522iotests_check="tests/qemu-iotests/check"
7523
7524echo "# Automatically generated by configure - do not modify" > "$iotests_common_env"
7525echo >> "$iotests_common_env"
7526echo "export PYTHON='$python'" >> "$iotests_common_env"
7527
7528if [ ! -e "$iotests_check" ]; then
7529    symlink "$source_path/$iotests_check" "$iotests_check"
7530fi
7531
7532# Save the configure command line for later reuse.
7533cat <<EOD >config.status
7534#!/bin/sh
7535# Generated by configure.
7536# Run this file to recreate the current configuration.
7537# Compiler output produced by configure, useful for debugging
7538# configure, is in config.log if it exists.
7539EOD
7540printf "exec" >>config.status
7541printf " '%s'" "$0" "$@" >>config.status
7542echo ' "$@"' >>config.status
7543chmod +x config.status
7544
7545rm -r "$TMPDIR1"
7546