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