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