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