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