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