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