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