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