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