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