xref: /openbmc/qemu/configure (revision 7f6c3d1a)
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, vhost-vdpa and vhost-user values for simplicity
2498if test "$vhost_net" = ""; then
2499  test "$vhost_net_user" = "yes" && vhost_net=yes
2500  test "$vhost_net_vdpa" = "yes" && vhost_net=yes
2501  test "$vhost_kernel" = "yes" && vhost_net=yes
2502fi
2503
2504##########################################
2505# MinGW / Mingw-w64 localtime_r/gmtime_r check
2506
2507if test "$mingw32" = "yes"; then
2508    # Some versions of MinGW / Mingw-w64 lack localtime_r
2509    # and gmtime_r entirely.
2510    #
2511    # Some versions of Mingw-w64 define a macro for
2512    # localtime_r/gmtime_r.
2513    #
2514    # Some versions of Mingw-w64 will define functions
2515    # for localtime_r/gmtime_r, but only if you have
2516    # _POSIX_THREAD_SAFE_FUNCTIONS defined. For fun
2517    # though, unistd.h and pthread.h both define
2518    # that for you.
2519    #
2520    # So this #undef localtime_r and #include <unistd.h>
2521    # are not in fact redundant.
2522cat > $TMPC << EOF
2523#include <unistd.h>
2524#include <time.h>
2525#undef localtime_r
2526int main(void) { localtime_r(NULL, NULL); return 0; }
2527EOF
2528    if compile_prog "" "" ; then
2529        localtime_r="yes"
2530    else
2531        localtime_r="no"
2532    fi
2533fi
2534
2535##########################################
2536# pkg-config probe
2537
2538if ! has "$pkg_config_exe"; then
2539  error_exit "pkg-config binary '$pkg_config_exe' not found"
2540fi
2541
2542##########################################
2543# NPTL probe
2544
2545if test "$linux_user" = "yes"; then
2546  cat > $TMPC <<EOF
2547#include <sched.h>
2548#include <linux/futex.h>
2549int main(void) {
2550#if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
2551#error bork
2552#endif
2553  return 0;
2554}
2555EOF
2556  if ! compile_object ; then
2557    feature_not_found "nptl" "Install glibc and linux kernel headers."
2558  fi
2559fi
2560
2561##########################################
2562# lzo check
2563
2564if test "$lzo" != "no" ; then
2565    cat > $TMPC << EOF
2566#include <lzo/lzo1x.h>
2567int main(void) { lzo_version(); return 0; }
2568EOF
2569    if compile_prog "" "-llzo2" ; then
2570        lzo_libs="-llzo2"
2571        lzo="yes"
2572    else
2573        if test "$lzo" = "yes"; then
2574            feature_not_found "liblzo2" "Install liblzo2 devel"
2575        fi
2576        lzo="no"
2577    fi
2578fi
2579
2580##########################################
2581# snappy check
2582
2583if test "$snappy" != "no" ; then
2584    cat > $TMPC << EOF
2585#include <snappy-c.h>
2586int main(void) { snappy_max_compressed_length(4096); return 0; }
2587EOF
2588    if compile_prog "" "-lsnappy" ; then
2589        snappy_libs='-lsnappy'
2590        snappy="yes"
2591    else
2592        if test "$snappy" = "yes"; then
2593            feature_not_found "libsnappy" "Install libsnappy devel"
2594        fi
2595        snappy="no"
2596    fi
2597fi
2598
2599##########################################
2600# bzip2 check
2601
2602if test "$bzip2" != "no" ; then
2603    cat > $TMPC << EOF
2604#include <bzlib.h>
2605int main(void) { BZ2_bzlibVersion(); return 0; }
2606EOF
2607    if compile_prog "" "-lbz2" ; then
2608        bzip2="yes"
2609    else
2610        if test "$bzip2" = "yes"; then
2611            feature_not_found "libbzip2" "Install libbzip2 devel"
2612        fi
2613        bzip2="no"
2614    fi
2615fi
2616
2617##########################################
2618# lzfse check
2619
2620if test "$lzfse" != "no" ; then
2621    cat > $TMPC << EOF
2622#include <lzfse.h>
2623int main(void) { lzfse_decode_scratch_size(); return 0; }
2624EOF
2625    if compile_prog "" "-llzfse" ; then
2626        lzfse="yes"
2627    else
2628        if test "$lzfse" = "yes"; then
2629            feature_not_found "lzfse" "Install lzfse devel"
2630        fi
2631        lzfse="no"
2632    fi
2633fi
2634
2635##########################################
2636# zstd check
2637
2638if test "$zstd" != "no" ; then
2639    libzstd_minver="1.4.0"
2640    if $pkg_config --atleast-version=$libzstd_minver libzstd ; then
2641        zstd_cflags="$($pkg_config --cflags libzstd)"
2642        zstd_libs="$($pkg_config --libs libzstd)"
2643        zstd="yes"
2644    else
2645        if test "$zstd" = "yes" ; then
2646            feature_not_found "libzstd" "Install libzstd devel"
2647        fi
2648        zstd="no"
2649    fi
2650fi
2651
2652##########################################
2653# libseccomp check
2654
2655if test "$seccomp" != "no" ; then
2656    libseccomp_minver="2.3.0"
2657    if $pkg_config --atleast-version=$libseccomp_minver libseccomp ; then
2658        seccomp_cflags="$($pkg_config --cflags libseccomp)"
2659        seccomp_libs="$($pkg_config --libs libseccomp)"
2660        seccomp="yes"
2661    else
2662        if test "$seccomp" = "yes" ; then
2663            feature_not_found "libseccomp" \
2664                 "Install libseccomp devel >= $libseccomp_minver"
2665        fi
2666        seccomp="no"
2667    fi
2668fi
2669##########################################
2670# xen probe
2671
2672if test "$xen" != "no" ; then
2673  # Check whether Xen library path is specified via --extra-ldflags to avoid
2674  # overriding this setting with pkg-config output. If not, try pkg-config
2675  # to obtain all needed flags.
2676
2677  if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
2678     $pkg_config --exists xencontrol ; then
2679    xen_ctrl_version="$(printf '%d%02d%02d' \
2680      $($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
2681    xen=yes
2682    xen_pc="xencontrol xenstore xenguest xenforeignmemory xengnttab"
2683    xen_pc="$xen_pc xenevtchn xendevicemodel"
2684    if $pkg_config --exists xentoolcore; then
2685      xen_pc="$xen_pc xentoolcore"
2686    fi
2687    xen_cflags="$($pkg_config --cflags $xen_pc)"
2688    xen_libs="$($pkg_config --libs $xen_pc)"
2689  else
2690
2691    xen_libs="-lxenstore -lxenctrl -lxenguest"
2692    xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
2693
2694    # First we test whether Xen headers and libraries are available.
2695    # If no, we are done and there is no Xen support.
2696    # If yes, more tests are run to detect the Xen version.
2697
2698    # Xen (any)
2699    cat > $TMPC <<EOF
2700#include <xenctrl.h>
2701int main(void) {
2702  return 0;
2703}
2704EOF
2705    if ! compile_prog "" "$xen_libs" ; then
2706      # Xen not found
2707      if test "$xen" = "yes" ; then
2708        feature_not_found "xen" "Install xen devel"
2709      fi
2710      xen=no
2711
2712    # Xen unstable
2713    elif
2714        cat > $TMPC <<EOF &&
2715#undef XC_WANT_COMPAT_DEVICEMODEL_API
2716#define __XEN_TOOLS__
2717#include <xendevicemodel.h>
2718#include <xenforeignmemory.h>
2719int main(void) {
2720  xendevicemodel_handle *xd;
2721  xenforeignmemory_handle *xfmem;
2722
2723  xd = xendevicemodel_open(0, 0);
2724  xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
2725
2726  xfmem = xenforeignmemory_open(0, 0);
2727  xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
2728
2729  return 0;
2730}
2731EOF
2732        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2733      then
2734      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2735      xen_ctrl_version=41100
2736      xen=yes
2737    elif
2738        cat > $TMPC <<EOF &&
2739#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2740#include <xenforeignmemory.h>
2741#include <xentoolcore.h>
2742int main(void) {
2743  xenforeignmemory_handle *xfmem;
2744
2745  xfmem = xenforeignmemory_open(0, 0);
2746  xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
2747  xentoolcore_restrict_all(0);
2748
2749  return 0;
2750}
2751EOF
2752        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2753      then
2754      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2755      xen_ctrl_version=41000
2756      xen=yes
2757    elif
2758        cat > $TMPC <<EOF &&
2759#undef XC_WANT_COMPAT_DEVICEMODEL_API
2760#define __XEN_TOOLS__
2761#include <xendevicemodel.h>
2762int main(void) {
2763  xendevicemodel_handle *xd;
2764
2765  xd = xendevicemodel_open(0, 0);
2766  xendevicemodel_close(xd);
2767
2768  return 0;
2769}
2770EOF
2771        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
2772      then
2773      xen_stable_libs="-lxendevicemodel $xen_stable_libs"
2774      xen_ctrl_version=40900
2775      xen=yes
2776    elif
2777        cat > $TMPC <<EOF &&
2778/*
2779 * If we have stable libs the we don't want the libxc compat
2780 * layers, regardless of what CFLAGS we may have been given.
2781 *
2782 * Also, check if xengnttab_grant_copy_segment_t is defined and
2783 * grant copy operation is implemented.
2784 */
2785#undef XC_WANT_COMPAT_EVTCHN_API
2786#undef XC_WANT_COMPAT_GNTTAB_API
2787#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2788#include <xenctrl.h>
2789#include <xenstore.h>
2790#include <xenevtchn.h>
2791#include <xengnttab.h>
2792#include <xenforeignmemory.h>
2793#include <stdint.h>
2794#include <xen/hvm/hvm_info_table.h>
2795#if !defined(HVM_MAX_VCPUS)
2796# error HVM_MAX_VCPUS not defined
2797#endif
2798int main(void) {
2799  xc_interface *xc = NULL;
2800  xenforeignmemory_handle *xfmem;
2801  xenevtchn_handle *xe;
2802  xengnttab_handle *xg;
2803  xengnttab_grant_copy_segment_t* seg = NULL;
2804
2805  xs_daemon_open();
2806
2807  xc = xc_interface_open(0, 0, 0);
2808  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2809  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2810  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2811  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2812
2813  xfmem = xenforeignmemory_open(0, 0);
2814  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2815
2816  xe = xenevtchn_open(0, 0);
2817  xenevtchn_fd(xe);
2818
2819  xg = xengnttab_open(0, 0);
2820  xengnttab_grant_copy(xg, 0, seg);
2821
2822  return 0;
2823}
2824EOF
2825        compile_prog "" "$xen_libs $xen_stable_libs"
2826      then
2827      xen_ctrl_version=40800
2828      xen=yes
2829    elif
2830        cat > $TMPC <<EOF &&
2831/*
2832 * If we have stable libs the we don't want the libxc compat
2833 * layers, regardless of what CFLAGS we may have been given.
2834 */
2835#undef XC_WANT_COMPAT_EVTCHN_API
2836#undef XC_WANT_COMPAT_GNTTAB_API
2837#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2838#include <xenctrl.h>
2839#include <xenstore.h>
2840#include <xenevtchn.h>
2841#include <xengnttab.h>
2842#include <xenforeignmemory.h>
2843#include <stdint.h>
2844#include <xen/hvm/hvm_info_table.h>
2845#if !defined(HVM_MAX_VCPUS)
2846# error HVM_MAX_VCPUS not defined
2847#endif
2848int main(void) {
2849  xc_interface *xc = NULL;
2850  xenforeignmemory_handle *xfmem;
2851  xenevtchn_handle *xe;
2852  xengnttab_handle *xg;
2853
2854  xs_daemon_open();
2855
2856  xc = xc_interface_open(0, 0, 0);
2857  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2858  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2859  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2860  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2861
2862  xfmem = xenforeignmemory_open(0, 0);
2863  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2864
2865  xe = xenevtchn_open(0, 0);
2866  xenevtchn_fd(xe);
2867
2868  xg = xengnttab_open(0, 0);
2869  xengnttab_map_grant_ref(xg, 0, 0, 0);
2870
2871  return 0;
2872}
2873EOF
2874        compile_prog "" "$xen_libs $xen_stable_libs"
2875      then
2876      xen_ctrl_version=40701
2877      xen=yes
2878
2879    # Xen 4.6
2880    elif
2881        cat > $TMPC <<EOF &&
2882#include <xenctrl.h>
2883#include <xenstore.h>
2884#include <stdint.h>
2885#include <xen/hvm/hvm_info_table.h>
2886#if !defined(HVM_MAX_VCPUS)
2887# error HVM_MAX_VCPUS not defined
2888#endif
2889int main(void) {
2890  xc_interface *xc;
2891  xs_daemon_open();
2892  xc = xc_interface_open(0, 0, 0);
2893  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2894  xc_gnttab_open(NULL, 0);
2895  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2896  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2897  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2898  xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
2899  return 0;
2900}
2901EOF
2902        compile_prog "" "$xen_libs"
2903      then
2904      xen_ctrl_version=40600
2905      xen=yes
2906
2907    # Xen 4.5
2908    elif
2909        cat > $TMPC <<EOF &&
2910#include <xenctrl.h>
2911#include <xenstore.h>
2912#include <stdint.h>
2913#include <xen/hvm/hvm_info_table.h>
2914#if !defined(HVM_MAX_VCPUS)
2915# error HVM_MAX_VCPUS not defined
2916#endif
2917int main(void) {
2918  xc_interface *xc;
2919  xs_daemon_open();
2920  xc = xc_interface_open(0, 0, 0);
2921  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2922  xc_gnttab_open(NULL, 0);
2923  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2924  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2925  xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
2926  return 0;
2927}
2928EOF
2929        compile_prog "" "$xen_libs"
2930      then
2931      xen_ctrl_version=40500
2932      xen=yes
2933
2934    elif
2935        cat > $TMPC <<EOF &&
2936#include <xenctrl.h>
2937#include <xenstore.h>
2938#include <stdint.h>
2939#include <xen/hvm/hvm_info_table.h>
2940#if !defined(HVM_MAX_VCPUS)
2941# error HVM_MAX_VCPUS not defined
2942#endif
2943int main(void) {
2944  xc_interface *xc;
2945  xs_daemon_open();
2946  xc = xc_interface_open(0, 0, 0);
2947  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2948  xc_gnttab_open(NULL, 0);
2949  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2950  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2951  return 0;
2952}
2953EOF
2954        compile_prog "" "$xen_libs"
2955      then
2956      xen_ctrl_version=40200
2957      xen=yes
2958
2959    else
2960      if test "$xen" = "yes" ; then
2961        feature_not_found "xen (unsupported version)" \
2962                          "Install a supported xen (xen 4.2 or newer)"
2963      fi
2964      xen=no
2965    fi
2966
2967    if test "$xen" = yes; then
2968      if test $xen_ctrl_version -ge 40701  ; then
2969        xen_libs="$xen_libs $xen_stable_libs "
2970      fi
2971    fi
2972  fi
2973fi
2974
2975if test "$xen_pci_passthrough" != "no"; then
2976  if test "$xen" = "yes" && test "$linux" = "yes"; then
2977    xen_pci_passthrough=yes
2978  else
2979    if test "$xen_pci_passthrough" = "yes"; then
2980      error_exit "User requested feature Xen PCI Passthrough" \
2981          " but this feature requires /sys from Linux"
2982    fi
2983    xen_pci_passthrough=no
2984  fi
2985fi
2986
2987##########################################
2988# Windows Hypervisor Platform accelerator (WHPX) check
2989if test "$whpx" != "no" ; then
2990    if check_include "WinHvPlatform.h" && check_include "WinHvEmulation.h"; then
2991        whpx="yes"
2992    else
2993        if test "$whpx" = "yes"; then
2994            feature_not_found "WinHvPlatform" "WinHvEmulation is not installed"
2995        fi
2996        whpx="no"
2997    fi
2998fi
2999
3000##########################################
3001# gettext probe
3002if test "$gettext" != "false" ; then
3003  if has xgettext; then
3004    gettext=true
3005  else
3006    if test "$gettext" = "true" ; then
3007      feature_not_found "gettext" "Install xgettext binary"
3008    fi
3009    gettext=false
3010  fi
3011fi
3012
3013##########################################
3014# Sparse probe
3015if test "$sparse" != "no" ; then
3016  if has sparse; then
3017    sparse=yes
3018  else
3019    if test "$sparse" = "yes" ; then
3020      feature_not_found "sparse" "Install sparse binary"
3021    fi
3022    sparse=no
3023  fi
3024fi
3025
3026##########################################
3027# X11 probe
3028if $pkg_config --exists "x11"; then
3029    have_x11=yes
3030    x11_cflags=$($pkg_config --cflags x11)
3031    x11_libs=$($pkg_config --libs x11)
3032fi
3033
3034##########################################
3035# GTK probe
3036
3037if test "$gtk" != "no"; then
3038    gtkpackage="gtk+-3.0"
3039    gtkx11package="gtk+-x11-3.0"
3040    gtkversion="3.22.0"
3041    if $pkg_config --exists "$gtkpackage >= $gtkversion"; then
3042        gtk_cflags=$($pkg_config --cflags $gtkpackage)
3043        gtk_libs=$($pkg_config --libs $gtkpackage)
3044        gtk_version=$($pkg_config --modversion $gtkpackage)
3045        if $pkg_config --exists "$gtkx11package >= $gtkversion"; then
3046            need_x11=yes
3047            gtk_cflags="$gtk_cflags $x11_cflags"
3048            gtk_libs="$gtk_libs $x11_libs"
3049        fi
3050        gtk="yes"
3051    elif test "$gtk" = "yes"; then
3052        feature_not_found "gtk" "Install gtk3-devel"
3053    else
3054        gtk="no"
3055    fi
3056fi
3057
3058
3059##########################################
3060# GNUTLS probe
3061
3062if test "$gnutls" != "no"; then
3063    pass="no"
3064    if $pkg_config --exists "gnutls >= 3.1.18"; then
3065        gnutls_cflags=$($pkg_config --cflags gnutls)
3066        gnutls_libs=$($pkg_config --libs gnutls)
3067        # Packaging for the static libraries is not always correct.
3068        # At least ubuntu 18.04 ships only shared libraries.
3069        write_c_skeleton
3070        if compile_prog "" "$gnutls_libs" ; then
3071            pass="yes"
3072        fi
3073    fi
3074    if test "$pass" = "no" && test "$gnutls" = "yes"; then
3075	feature_not_found "gnutls" "Install gnutls devel >= 3.1.18"
3076    else
3077        gnutls="$pass"
3078    fi
3079fi
3080
3081
3082# If user didn't give a --disable/enable-gcrypt flag,
3083# then mark as disabled if user requested nettle
3084# explicitly
3085if test -z "$gcrypt"
3086then
3087    if test "$nettle" = "yes"
3088    then
3089        gcrypt="no"
3090    fi
3091fi
3092
3093# If user didn't give a --disable/enable-nettle flag,
3094# then mark as disabled if user requested gcrypt
3095# explicitly
3096if test -z "$nettle"
3097then
3098    if test "$gcrypt" = "yes"
3099    then
3100        nettle="no"
3101    fi
3102fi
3103
3104has_libgcrypt() {
3105    if ! has "libgcrypt-config"
3106    then
3107	return 1
3108    fi
3109
3110    if test -n "$cross_prefix"
3111    then
3112	host=$(libgcrypt-config --host)
3113	if test "$host-" != $cross_prefix
3114	then
3115	    return 1
3116	fi
3117    fi
3118
3119    maj=`libgcrypt-config --version | awk -F . '{print $1}'`
3120    min=`libgcrypt-config --version | awk -F . '{print $2}'`
3121
3122    if test $maj != 1 || test $min -lt 5
3123    then
3124       return 1
3125    fi
3126
3127    return 0
3128}
3129
3130
3131if test "$nettle" != "no"; then
3132    pass="no"
3133    if $pkg_config --exists "nettle >= 2.7.1"; then
3134        nettle_cflags=$($pkg_config --cflags nettle)
3135        nettle_libs=$($pkg_config --libs nettle)
3136        nettle_version=$($pkg_config --modversion nettle)
3137        # Link test to make sure the given libraries work (e.g for static).
3138        write_c_skeleton
3139        if compile_prog "" "$nettle_libs" ; then
3140            if test -z "$gcrypt"; then
3141               gcrypt="no"
3142            fi
3143            pass="yes"
3144        fi
3145    fi
3146    if test "$pass" = "yes"
3147    then
3148        cat > $TMPC << EOF
3149#include <nettle/xts.h>
3150int main(void) {
3151  return 0;
3152}
3153EOF
3154        if compile_prog "$nettle_cflags" "$nettle_libs" ; then
3155            nettle_xts=yes
3156            qemu_private_xts=no
3157        fi
3158    fi
3159    if test "$pass" = "no" && test "$nettle" = "yes"; then
3160        feature_not_found "nettle" "Install nettle devel >= 2.7.1"
3161    else
3162        nettle="$pass"
3163    fi
3164fi
3165
3166if test "$gcrypt" != "no"; then
3167    pass="no"
3168    if has_libgcrypt; then
3169        gcrypt_cflags=$(libgcrypt-config --cflags)
3170        gcrypt_libs=$(libgcrypt-config --libs)
3171        # Debian has removed -lgpg-error from libgcrypt-config
3172        # as it "spreads unnecessary dependencies" which in
3173        # turn breaks static builds...
3174        if test "$static" = "yes"
3175        then
3176            gcrypt_libs="$gcrypt_libs -lgpg-error"
3177        fi
3178
3179        # Link test to make sure the given libraries work (e.g for static).
3180        write_c_skeleton
3181        if compile_prog "" "$gcrypt_libs" ; then
3182            pass="yes"
3183        fi
3184    fi
3185    if test "$pass" = "yes"; then
3186        gcrypt="yes"
3187        cat > $TMPC << EOF
3188#include <gcrypt.h>
3189int main(void) {
3190  gcry_mac_hd_t handle;
3191  gcry_mac_open(&handle, GCRY_MAC_HMAC_MD5,
3192                GCRY_MAC_FLAG_SECURE, NULL);
3193  return 0;
3194}
3195EOF
3196        if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
3197            gcrypt_hmac=yes
3198        fi
3199        cat > $TMPC << EOF
3200#include <gcrypt.h>
3201int main(void) {
3202  gcry_cipher_hd_t handle;
3203  gcry_cipher_open(&handle, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_XTS, 0);
3204  return 0;
3205}
3206EOF
3207        if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
3208            gcrypt_xts=yes
3209            qemu_private_xts=no
3210        fi
3211    elif test "$gcrypt" = "yes"; then
3212        feature_not_found "gcrypt" "Install gcrypt devel >= 1.5.0"
3213    else
3214        gcrypt="no"
3215    fi
3216fi
3217
3218
3219if test "$gcrypt" = "yes" && test "$nettle" = "yes"
3220then
3221    error_exit "Only one of gcrypt & nettle can be enabled"
3222fi
3223
3224##########################################
3225# libtasn1 - only for the TLS creds/session test suite
3226
3227tasn1=yes
3228tasn1_cflags=""
3229tasn1_libs=""
3230if $pkg_config --exists "libtasn1"; then
3231    tasn1_cflags=$($pkg_config --cflags libtasn1)
3232    tasn1_libs=$($pkg_config --libs libtasn1)
3233else
3234    tasn1=no
3235fi
3236
3237
3238##########################################
3239# PAM probe
3240
3241if test "$auth_pam" != "no"; then
3242    cat > $TMPC <<EOF
3243#include <security/pam_appl.h>
3244#include <stdio.h>
3245int main(void) {
3246   const char *service_name = "qemu";
3247   const char *user = "frank";
3248   const struct pam_conv pam_conv = { 0 };
3249   pam_handle_t *pamh = NULL;
3250   pam_start(service_name, user, &pam_conv, &pamh);
3251   return 0;
3252}
3253EOF
3254    if compile_prog "" "-lpam" ; then
3255        auth_pam=yes
3256    else
3257        if test "$auth_pam" = "yes"; then
3258            feature_not_found "PAM" "Install PAM development package"
3259        else
3260            auth_pam=no
3261        fi
3262    fi
3263fi
3264
3265##########################################
3266# getifaddrs (for tests/test-io-channel-socket )
3267
3268have_ifaddrs_h=yes
3269if ! check_include "ifaddrs.h" ; then
3270  have_ifaddrs_h=no
3271fi
3272
3273#########################################
3274# libdrm check
3275have_drm_h=no
3276if check_include "libdrm/drm.h" ; then
3277    have_drm_h=yes
3278fi
3279
3280#########################################
3281# sys/signal.h check
3282have_sys_signal_h=no
3283if check_include "sys/signal.h" ; then
3284  have_sys_signal_h=yes
3285fi
3286
3287##########################################
3288# VTE probe
3289
3290if test "$vte" != "no"; then
3291    vteminversion="0.32.0"
3292    if $pkg_config --exists "vte-2.91"; then
3293      vtepackage="vte-2.91"
3294    else
3295      vtepackage="vte-2.90"
3296    fi
3297    if $pkg_config --exists "$vtepackage >= $vteminversion"; then
3298        vte_cflags=$($pkg_config --cflags $vtepackage)
3299        vte_libs=$($pkg_config --libs $vtepackage)
3300        vteversion=$($pkg_config --modversion $vtepackage)
3301        vte="yes"
3302    elif test "$vte" = "yes"; then
3303        feature_not_found "vte" "Install libvte-2.90/2.91 devel"
3304    else
3305        vte="no"
3306    fi
3307fi
3308
3309##########################################
3310# RDMA needs OpenFabrics libraries
3311if test "$rdma" != "no" ; then
3312  cat > $TMPC <<EOF
3313#include <rdma/rdma_cma.h>
3314int main(void) { return 0; }
3315EOF
3316  rdma_libs="-lrdmacm -libverbs -libumad"
3317  if compile_prog "" "$rdma_libs" ; then
3318    rdma="yes"
3319  else
3320    if test "$rdma" = "yes" ; then
3321        error_exit \
3322            " OpenFabrics librdmacm/libibverbs/libibumad not present." \
3323            " Your options:" \
3324            "  (1) Fast: Install infiniband packages (devel) from your distro." \
3325            "  (2) Cleanest: Install libraries from www.openfabrics.org" \
3326            "  (3) Also: Install softiwarp if you don't have RDMA hardware"
3327    fi
3328    rdma="no"
3329  fi
3330fi
3331
3332##########################################
3333# PVRDMA detection
3334
3335cat > $TMPC <<EOF &&
3336#include <sys/mman.h>
3337
3338int
3339main(void)
3340{
3341    char buf = 0;
3342    void *addr = &buf;
3343    addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
3344
3345    return 0;
3346}
3347EOF
3348
3349if test "$rdma" = "yes" ; then
3350    case "$pvrdma" in
3351    "")
3352        if compile_prog "" ""; then
3353            pvrdma="yes"
3354        else
3355            pvrdma="no"
3356        fi
3357        ;;
3358    "yes")
3359        if ! compile_prog "" ""; then
3360            error_exit "PVRDMA is not supported since mremap is not implemented"
3361        fi
3362        pvrdma="yes"
3363        ;;
3364    "no")
3365        pvrdma="no"
3366        ;;
3367    esac
3368else
3369    if test "$pvrdma" = "yes" ; then
3370        error_exit "PVRDMA requires rdma suppport"
3371    fi
3372    pvrdma="no"
3373fi
3374
3375# Let's see if enhanced reg_mr is supported
3376if test "$pvrdma" = "yes" ; then
3377
3378cat > $TMPC <<EOF &&
3379#include <infiniband/verbs.h>
3380
3381int
3382main(void)
3383{
3384    struct ibv_mr *mr;
3385    struct ibv_pd *pd = NULL;
3386    size_t length = 10;
3387    uint64_t iova = 0;
3388    int access = 0;
3389    void *addr = NULL;
3390
3391    mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
3392
3393    ibv_dereg_mr(mr);
3394
3395    return 0;
3396}
3397EOF
3398    if ! compile_prog "" "-libverbs"; then
3399        QEMU_CFLAGS="$QEMU_CFLAGS -DLEGACY_RDMA_REG_MR"
3400    fi
3401fi
3402
3403##########################################
3404# xfsctl() probe, used for file-posix.c
3405if test "$xfs" != "no" ; then
3406  cat > $TMPC << EOF
3407#include <stddef.h>  /* NULL */
3408#include <xfs/xfs.h>
3409int main(void)
3410{
3411    xfsctl(NULL, 0, 0, NULL);
3412    return 0;
3413}
3414EOF
3415  if compile_prog "" "" ; then
3416    xfs="yes"
3417  else
3418    if test "$xfs" = "yes" ; then
3419      feature_not_found "xfs" "Install xfsprogs/xfslibs devel"
3420    fi
3421    xfs=no
3422  fi
3423fi
3424
3425##########################################
3426# vde libraries probe
3427if test "$vde" != "no" ; then
3428  vde_libs="-lvdeplug"
3429  cat > $TMPC << EOF
3430#include <libvdeplug.h>
3431int main(void)
3432{
3433    struct vde_open_args a = {0, 0, 0};
3434    char s[] = "";
3435    vde_open(s, s, &a);
3436    return 0;
3437}
3438EOF
3439  if compile_prog "" "$vde_libs" ; then
3440    vde=yes
3441  else
3442    if test "$vde" = "yes" ; then
3443      feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
3444    fi
3445    vde=no
3446  fi
3447fi
3448
3449##########################################
3450# netmap support probe
3451# Apart from looking for netmap headers, we make sure that the host API version
3452# supports the netmap backend (>=11). The upper bound (15) is meant to simulate
3453# a minor/major version number. Minor new features will be marked with values up
3454# to 15, and if something happens that requires a change to the backend we will
3455# move above 15, submit the backend fixes and modify this two bounds.
3456if test "$netmap" != "no" ; then
3457  cat > $TMPC << EOF
3458#include <inttypes.h>
3459#include <net/if.h>
3460#include <net/netmap.h>
3461#include <net/netmap_user.h>
3462#if (NETMAP_API < 11) || (NETMAP_API > 15)
3463#error
3464#endif
3465int main(void) { return 0; }
3466EOF
3467  if compile_prog "" "" ; then
3468    netmap=yes
3469  else
3470    if test "$netmap" = "yes" ; then
3471      feature_not_found "netmap"
3472    fi
3473    netmap=no
3474  fi
3475fi
3476
3477##########################################
3478# libcap-ng library probe
3479if test "$cap_ng" != "no" ; then
3480  cap_libs="-lcap-ng"
3481  cat > $TMPC << EOF
3482#include <cap-ng.h>
3483int main(void)
3484{
3485    capng_capability_to_name(CAPNG_EFFECTIVE);
3486    return 0;
3487}
3488EOF
3489  if compile_prog "" "$cap_libs" ; then
3490    cap_ng=yes
3491  else
3492    if test "$cap_ng" = "yes" ; then
3493      feature_not_found "cap_ng" "Install libcap-ng devel"
3494    fi
3495    cap_ng=no
3496  fi
3497fi
3498
3499##########################################
3500# Sound support libraries probe
3501
3502audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
3503for drv in $audio_drv_list; do
3504    case $drv in
3505    alsa | try-alsa)
3506    if $pkg_config alsa --exists; then
3507        alsa_libs=$($pkg_config alsa --libs)
3508        alsa_cflags=$($pkg_config alsa --cflags)
3509        alsa=yes
3510        if test "$drv" = "try-alsa"; then
3511            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa/alsa/')
3512        fi
3513    else
3514        if test "$drv" = "try-alsa"; then
3515            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa//')
3516        else
3517            error_exit "$drv check failed" \
3518                "Make sure to have the $drv libs and headers installed."
3519        fi
3520    fi
3521    ;;
3522
3523    pa | try-pa)
3524    if $pkg_config libpulse --exists; then
3525        libpulse=yes
3526        pulse_libs=$($pkg_config libpulse --libs)
3527        pulse_cflags=$($pkg_config libpulse --cflags)
3528        if test "$drv" = "try-pa"; then
3529            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa/pa/')
3530        fi
3531    else
3532        if test "$drv" = "try-pa"; then
3533            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa//')
3534        else
3535            error_exit "$drv check failed" \
3536                "Make sure to have the $drv libs and headers installed."
3537        fi
3538    fi
3539    ;;
3540
3541    sdl)
3542    if test "$sdl" = "no"; then
3543        error_exit "sdl not found or disabled, can not use sdl audio driver"
3544    fi
3545    ;;
3546
3547    try-sdl)
3548    if test "$sdl" = "no"; then
3549        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl//')
3550    else
3551        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl/sdl/')
3552    fi
3553    ;;
3554
3555    coreaudio)
3556      coreaudio_libs="-framework CoreAudio"
3557    ;;
3558
3559    dsound)
3560      dsound_libs="-lole32 -ldxguid"
3561      audio_win_int="yes"
3562    ;;
3563
3564    oss)
3565      oss_libs="$oss_lib"
3566    ;;
3567
3568    jack | try-jack)
3569    if $pkg_config jack --exists; then
3570        libjack=yes
3571        jack_libs=$($pkg_config jack --libs)
3572        if test "$drv" = "try-jack"; then
3573            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack/jack/')
3574        fi
3575    else
3576        if test "$drv" = "try-jack"; then
3577            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack//')
3578        else
3579            error_exit "$drv check failed" \
3580                "Make sure to have the $drv libs and headers installed."
3581        fi
3582    fi
3583    ;;
3584
3585    *)
3586    echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
3587        error_exit "Unknown driver '$drv' selected" \
3588            "Possible drivers are: $audio_possible_drivers"
3589    }
3590    ;;
3591    esac
3592done
3593
3594##########################################
3595# BrlAPI probe
3596
3597if test "$brlapi" != "no" ; then
3598  brlapi_libs="-lbrlapi"
3599  cat > $TMPC << EOF
3600#include <brlapi.h>
3601#include <stddef.h>
3602int main( void ) { return brlapi__openConnection (NULL, NULL, NULL); }
3603EOF
3604  if compile_prog "" "$brlapi_libs" ; then
3605    brlapi=yes
3606  else
3607    if test "$brlapi" = "yes" ; then
3608      feature_not_found "brlapi" "Install brlapi devel"
3609    fi
3610    brlapi=no
3611  fi
3612fi
3613
3614##########################################
3615# iconv probe
3616if test "$iconv" != "no" ; then
3617  cat > $TMPC << EOF
3618#include <iconv.h>
3619int main(void) {
3620  iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
3621  return conv != (iconv_t) -1;
3622}
3623EOF
3624  iconv_prefix_list="/usr/local:/usr"
3625  iconv_lib_list=":-liconv"
3626  IFS=:
3627  for iconv_prefix in $iconv_prefix_list; do
3628    IFS=:
3629    iconv_cflags="-I$iconv_prefix/include"
3630    iconv_ldflags="-L$iconv_prefix/lib"
3631    for iconv_link in $iconv_lib_list; do
3632      unset IFS
3633      iconv_lib="$iconv_ldflags $iconv_link"
3634      echo "looking at iconv in '$iconv_cflags' '$iconv_lib'" >> config.log
3635      if compile_prog "$iconv_cflags" "$iconv_lib" ; then
3636        iconv_found=yes
3637        break
3638      fi
3639    done
3640    if test "$iconv_found" = yes ; then
3641      break
3642    fi
3643  done
3644  if test "$iconv_found" = "yes" ; then
3645    iconv=yes
3646  else
3647    if test "$iconv" = "yes" ; then
3648      feature_not_found "iconv" "Install iconv devel"
3649    fi
3650    iconv=no
3651  fi
3652fi
3653
3654##########################################
3655# curses probe
3656if test "$iconv" = "no" ; then
3657  # curses will need iconv
3658  curses=no
3659fi
3660if test "$curses" != "no" ; then
3661  if test "$mingw32" = "yes" ; then
3662    curses_inc_list="$($pkg_config --cflags ncurses 2>/dev/null):"
3663    curses_lib_list="$($pkg_config --libs ncurses 2>/dev/null):-lpdcurses"
3664  else
3665    curses_inc_list="$($pkg_config --cflags ncursesw 2>/dev/null):-I/usr/include/ncursesw:"
3666    curses_lib_list="$($pkg_config --libs ncursesw 2>/dev/null):-lncursesw:-lcursesw"
3667  fi
3668  curses_found=no
3669  cat > $TMPC << EOF
3670#include <locale.h>
3671#include <curses.h>
3672#include <wchar.h>
3673#include <langinfo.h>
3674int main(void) {
3675  const char *codeset;
3676  wchar_t wch = L'w';
3677  setlocale(LC_ALL, "");
3678  resize_term(0, 0);
3679  addwstr(L"wide chars\n");
3680  addnwstr(&wch, 1);
3681  add_wch(WACS_DEGREE);
3682  codeset = nl_langinfo(CODESET);
3683  return codeset != 0;
3684}
3685EOF
3686  IFS=:
3687  for curses_inc in $curses_inc_list; do
3688    # Make sure we get the wide character prototypes
3689    curses_inc="-DNCURSES_WIDECHAR $curses_inc"
3690    IFS=:
3691    for curses_lib in $curses_lib_list; do
3692      unset IFS
3693      if compile_prog "$curses_inc" "$curses_lib" ; then
3694        curses_found=yes
3695        break
3696      fi
3697    done
3698    if test "$curses_found" = yes ; then
3699      break
3700    fi
3701  done
3702  unset IFS
3703  if test "$curses_found" = "yes" ; then
3704    curses=yes
3705  else
3706    if test "$curses" = "yes" ; then
3707      feature_not_found "curses" "Install ncurses devel"
3708    fi
3709    curses=no
3710  fi
3711fi
3712
3713##########################################
3714# curl probe
3715if test "$curl" != "no" ; then
3716  if $pkg_config libcurl --exists; then
3717    curlconfig="$pkg_config libcurl"
3718  else
3719    curlconfig=curl-config
3720  fi
3721  cat > $TMPC << EOF
3722#include <curl/curl.h>
3723int main(void) { curl_easy_init(); curl_multi_setopt(0, 0, 0); return 0; }
3724EOF
3725  curl_cflags=$($curlconfig --cflags 2>/dev/null)
3726  curl_libs=$($curlconfig --libs 2>/dev/null)
3727  if compile_prog "$curl_cflags" "$curl_libs" ; then
3728    curl=yes
3729  else
3730    if test "$curl" = "yes" ; then
3731      feature_not_found "curl" "Install libcurl devel"
3732    fi
3733    curl=no
3734  fi
3735fi # test "$curl"
3736
3737##########################################
3738# glib support probe
3739
3740glib_req_ver=2.48
3741glib_modules=gthread-2.0
3742if test "$modules" = yes; then
3743    glib_modules="$glib_modules gmodule-export-2.0"
3744fi
3745if test "$plugins" = yes; then
3746    glib_modules="$glib_modules gmodule-2.0"
3747fi
3748
3749for i in $glib_modules; do
3750    if $pkg_config --atleast-version=$glib_req_ver $i; then
3751        glib_cflags=$($pkg_config --cflags $i)
3752        glib_libs=$($pkg_config --libs $i)
3753    else
3754        error_exit "glib-$glib_req_ver $i is required to compile QEMU"
3755    fi
3756done
3757
3758# This workaround is required due to a bug in pkg-config file for glib as it
3759# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
3760
3761if test "$static" = yes && test "$mingw32" = yes; then
3762    glib_cflags="-DGLIB_STATIC_COMPILATION $glib_cflags"
3763fi
3764
3765if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
3766    gio=yes
3767    gio_cflags=$($pkg_config --cflags gio-2.0)
3768    gio_libs=$($pkg_config --libs gio-2.0)
3769    gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
3770    if [ ! -x "$gdbus_codegen" ]; then
3771        gdbus_codegen=
3772    fi
3773else
3774    gio=no
3775fi
3776
3777if $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
3778    gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
3779    gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
3780fi
3781
3782# Sanity check that the current size_t matches the
3783# size that glib thinks it should be. This catches
3784# problems on multi-arch where people try to build
3785# 32-bit QEMU while pointing at 64-bit glib headers
3786cat > $TMPC <<EOF
3787#include <glib.h>
3788#include <unistd.h>
3789
3790#define QEMU_BUILD_BUG_ON(x) \
3791  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
3792
3793int main(void) {
3794   QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
3795   return 0;
3796}
3797EOF
3798
3799if ! compile_prog "$glib_cflags" "$glib_libs" ; then
3800    error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
3801               "You probably need to set PKG_CONFIG_LIBDIR"\
3802	       "to point to the right pkg-config files for your"\
3803	       "build target"
3804fi
3805
3806# Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
3807cat > $TMPC << EOF
3808#include <glib.h>
3809int main(void) { return 0; }
3810EOF
3811if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3812    if cc_has_warning_flag "-Wno-unknown-attributes"; then
3813        glib_cflags="-Wno-unknown-attributes $glib_cflags"
3814        CFLAGS="-Wno-unknown-attributes $CFLAGS"
3815    fi
3816fi
3817
3818# Silence clang warnings triggered by glib < 2.57.2
3819cat > $TMPC << EOF
3820#include <glib.h>
3821typedef struct Foo {
3822    int i;
3823} Foo;
3824static void foo_free(Foo *f)
3825{
3826    g_free(f);
3827}
3828G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free);
3829int main(void) { return 0; }
3830EOF
3831if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3832    if cc_has_warning_flag "-Wno-unused-function"; then
3833        glib_cflags="$glib_cflags -Wno-unused-function"
3834        CFLAGS="$CFLAGS -Wno-unused-function"
3835    fi
3836fi
3837
3838##########################################
3839# SHA command probe for modules
3840if test "$modules" = yes; then
3841    shacmd_probe="sha1sum sha1 shasum"
3842    for c in $shacmd_probe; do
3843        if has $c; then
3844            shacmd="$c"
3845            break
3846        fi
3847    done
3848    if test "$shacmd" = ""; then
3849        error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
3850    fi
3851fi
3852
3853##########################################
3854# libmpathpersist probe
3855
3856if test "$mpath" != "no" ; then
3857  # probe for the new API
3858  cat > $TMPC <<EOF
3859#include <libudev.h>
3860#include <mpath_persist.h>
3861unsigned mpath_mx_alloc_len = 1024;
3862int logsink;
3863static struct config *multipath_conf;
3864extern struct udev *udev;
3865extern struct config *get_multipath_config(void);
3866extern void put_multipath_config(struct config *conf);
3867struct udev *udev;
3868struct config *get_multipath_config(void) { return multipath_conf; }
3869void put_multipath_config(struct config *conf) { }
3870
3871int main(void) {
3872    udev = udev_new();
3873    multipath_conf = mpath_lib_init();
3874    return 0;
3875}
3876EOF
3877  if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
3878    mpathpersist=yes
3879    mpathpersist_new_api=yes
3880  else
3881    # probe for the old API
3882    cat > $TMPC <<EOF
3883#include <libudev.h>
3884#include <mpath_persist.h>
3885unsigned mpath_mx_alloc_len = 1024;
3886int logsink;
3887int main(void) {
3888    struct udev *udev = udev_new();
3889    mpath_lib_init(udev);
3890    return 0;
3891}
3892EOF
3893    if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
3894      mpathpersist=yes
3895      mpathpersist_new_api=no
3896    else
3897      mpathpersist=no
3898    fi
3899  fi
3900else
3901  mpathpersist=no
3902fi
3903
3904##########################################
3905# pthread probe
3906PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
3907
3908pthread=no
3909cat > $TMPC << EOF
3910#include <pthread.h>
3911static void *f(void *p) { return NULL; }
3912int main(void) {
3913  pthread_t thread;
3914  pthread_create(&thread, 0, f, 0);
3915  return 0;
3916}
3917EOF
3918if compile_prog "" "" ; then
3919  pthread=yes
3920else
3921  for pthread_lib in $PTHREADLIBS_LIST; do
3922    if compile_prog "" "$pthread_lib" ; then
3923      pthread=yes
3924      found=no
3925      for lib_entry in $LIBS; do
3926        if test "$lib_entry" = "$pthread_lib"; then
3927          found=yes
3928          break
3929        fi
3930      done
3931      if test "$found" = "no"; then
3932        LIBS="$pthread_lib $LIBS"
3933      fi
3934      PTHREAD_LIB="$pthread_lib"
3935      break
3936    fi
3937  done
3938fi
3939
3940if test "$mingw32" != yes && test "$pthread" = no; then
3941  error_exit "pthread check failed" \
3942      "Make sure to have the pthread libs and headers installed."
3943fi
3944
3945# check for pthread_setname_np with thread id
3946pthread_setname_np_w_tid=no
3947cat > $TMPC << EOF
3948#include <pthread.h>
3949
3950static void *f(void *p) { return NULL; }
3951int main(void)
3952{
3953    pthread_t thread;
3954    pthread_create(&thread, 0, f, 0);
3955    pthread_setname_np(thread, "QEMU");
3956    return 0;
3957}
3958EOF
3959if compile_prog "" "$pthread_lib" ; then
3960  pthread_setname_np_w_tid=yes
3961fi
3962
3963# check for pthread_setname_np without thread id
3964pthread_setname_np_wo_tid=no
3965cat > $TMPC << EOF
3966#include <pthread.h>
3967
3968static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
3969int main(void)
3970{
3971    pthread_t thread;
3972    pthread_create(&thread, 0, f, 0);
3973    return 0;
3974}
3975EOF
3976if compile_prog "" "$pthread_lib" ; then
3977  pthread_setname_np_wo_tid=yes
3978fi
3979
3980##########################################
3981# rbd probe
3982if test "$rbd" != "no" ; then
3983  cat > $TMPC <<EOF
3984#include <stdio.h>
3985#include <rbd/librbd.h>
3986int main(void) {
3987    rados_t cluster;
3988    rados_create(&cluster, NULL);
3989    return 0;
3990}
3991EOF
3992  rbd_libs="-lrbd -lrados"
3993  if compile_prog "" "$rbd_libs" ; then
3994    rbd=yes
3995  else
3996    if test "$rbd" = "yes" ; then
3997      feature_not_found "rados block device" "Install librbd/ceph devel"
3998    fi
3999    rbd=no
4000  fi
4001fi
4002
4003##########################################
4004# libssh probe
4005if test "$libssh" != "no" ; then
4006  if $pkg_config --exists libssh; then
4007    libssh_cflags=$($pkg_config libssh --cflags)
4008    libssh_libs=$($pkg_config libssh --libs)
4009    libssh=yes
4010  else
4011    if test "$libssh" = "yes" ; then
4012      error_exit "libssh required for --enable-libssh"
4013    fi
4014    libssh=no
4015  fi
4016fi
4017
4018##########################################
4019# Check for libssh 0.8
4020# This is done like this instead of using the LIBSSH_VERSION_* and
4021# SSH_VERSION_* macros because some distributions in the past shipped
4022# snapshots of the future 0.8 from Git, and those snapshots did not
4023# have updated version numbers (still referring to 0.7.0).
4024
4025if test "$libssh" = "yes"; then
4026  cat > $TMPC <<EOF
4027#include <libssh/libssh.h>
4028int main(void) { return ssh_get_server_publickey(NULL, NULL); }
4029EOF
4030  if compile_prog "$libssh_cflags" "$libssh_libs"; then
4031    libssh_cflags="-DHAVE_LIBSSH_0_8 $libssh_cflags"
4032  fi
4033fi
4034
4035##########################################
4036# linux-aio probe
4037
4038if test "$linux_aio" != "no" ; then
4039  cat > $TMPC <<EOF
4040#include <libaio.h>
4041#include <sys/eventfd.h>
4042#include <stddef.h>
4043int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
4044EOF
4045  if compile_prog "" "-laio" ; then
4046    linux_aio=yes
4047  else
4048    if test "$linux_aio" = "yes" ; then
4049      feature_not_found "linux AIO" "Install libaio devel"
4050    fi
4051    linux_aio=no
4052  fi
4053fi
4054##########################################
4055# linux-io-uring probe
4056
4057if test "$linux_io_uring" != "no" ; then
4058  if $pkg_config liburing; then
4059    linux_io_uring_cflags=$($pkg_config --cflags liburing)
4060    linux_io_uring_libs=$($pkg_config --libs liburing)
4061    linux_io_uring=yes
4062  else
4063    if test "$linux_io_uring" = "yes" ; then
4064      feature_not_found "linux io_uring" "Install liburing devel"
4065    fi
4066    linux_io_uring=no
4067  fi
4068fi
4069
4070##########################################
4071# TPM emulation is only on POSIX
4072
4073if test "$tpm" = ""; then
4074  if test "$mingw32" = "yes"; then
4075    tpm=no
4076  else
4077    tpm=yes
4078  fi
4079elif test "$tpm" = "yes"; then
4080  if test "$mingw32" = "yes" ; then
4081    error_exit "TPM emulation only available on POSIX systems"
4082  fi
4083fi
4084
4085##########################################
4086# attr probe
4087
4088libattr_libs=
4089if test "$attr" != "no" ; then
4090  cat > $TMPC <<EOF
4091#include <stdio.h>
4092#include <sys/types.h>
4093#ifdef CONFIG_LIBATTR
4094#include <attr/xattr.h>
4095#else
4096#include <sys/xattr.h>
4097#endif
4098int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }
4099EOF
4100  if compile_prog "" "" ; then
4101    attr=yes
4102  # Older distros have <attr/xattr.h>, and need -lattr:
4103  elif compile_prog "-DCONFIG_LIBATTR" "-lattr" ; then
4104    attr=yes
4105    libattr_libs="-lattr"
4106    libattr=yes
4107  else
4108    if test "$attr" = "yes" ; then
4109      feature_not_found "ATTR" "Install libc6 or libattr devel"
4110    fi
4111    attr=no
4112  fi
4113fi
4114
4115##########################################
4116# iovec probe
4117cat > $TMPC <<EOF
4118#include <sys/types.h>
4119#include <sys/uio.h>
4120#include <unistd.h>
4121int main(void) { return sizeof(struct iovec); }
4122EOF
4123iovec=no
4124if compile_prog "" "" ; then
4125  iovec=yes
4126fi
4127
4128##########################################
4129# preadv probe
4130cat > $TMPC <<EOF
4131#include <sys/types.h>
4132#include <sys/uio.h>
4133#include <unistd.h>
4134int main(void) { return preadv(0, 0, 0, 0); }
4135EOF
4136preadv=no
4137if compile_prog "" "" ; then
4138  preadv=yes
4139fi
4140
4141##########################################
4142# fdt probe
4143# fdt support is mandatory for at least some target architectures,
4144# so insist on it if we're building those system emulators.
4145fdt_required=no
4146for target in $target_list; do
4147  case $target in
4148    aarch64*-softmmu|arm*-softmmu|ppc*-softmmu|microblaze*-softmmu|mips64el-softmmu|riscv*-softmmu|rx-softmmu)
4149      fdt_required=yes
4150    ;;
4151  esac
4152done
4153
4154if test "$fdt_required" = "yes"; then
4155  if test "$fdt" = "no"; then
4156    error_exit "fdt disabled but some requested targets require it." \
4157      "You can turn off fdt only if you also disable all the system emulation" \
4158      "targets which need it (by specifying a cut down --target-list)."
4159  fi
4160  fdt=yes
4161elif test "$fdt" != "yes" ; then
4162  fdt=no
4163fi
4164
4165# fdt is only required when building softmmu targets
4166if test -z "$fdt" -a "$softmmu" != "yes" ; then
4167    fdt="no"
4168fi
4169
4170if test "$fdt" != "no" ; then
4171  fdt_libs="-lfdt"
4172  # explicitly check for libfdt_env.h as it is missing in some stable installs
4173  # and test for required functions to make sure we are on a version >= 1.4.2
4174  cat > $TMPC << EOF
4175#include <libfdt.h>
4176#include <libfdt_env.h>
4177int main(void) { fdt_check_full(NULL, 0); return 0; }
4178EOF
4179  if compile_prog "" "$fdt_libs" ; then
4180    # system DTC is good - use it
4181    fdt=system
4182  else
4183      # have GIT checkout, so activate dtc submodule
4184      if test -e "${source_path}/.git" ; then
4185          git_submodules="${git_submodules} dtc"
4186      fi
4187      if test -d "${source_path}/dtc/libfdt" || test -e "${source_path}/.git" ; then
4188          fdt=git
4189          mkdir -p dtc
4190          fdt_cflags="-I${source_path}/dtc/libfdt"
4191          fdt_ldflags="-Ldtc/libfdt"
4192          fdt_libs="$fdt_libs"
4193      elif test "$fdt" = "yes" ; then
4194          # Not a git build & no libfdt found, prompt for system install
4195          error_exit "DTC (libfdt) version >= 1.4.2 not present." \
4196                     "Please install the DTC (libfdt) devel package"
4197      else
4198          # don't have and don't want
4199          fdt_libs=
4200          fdt=no
4201      fi
4202  fi
4203fi
4204
4205##########################################
4206# opengl probe (for sdl2, gtk, milkymist-tmu2)
4207
4208gbm="no"
4209if $pkg_config gbm; then
4210    gbm_cflags="$($pkg_config --cflags gbm)"
4211    gbm_libs="$($pkg_config --libs gbm)"
4212    gbm="yes"
4213fi
4214
4215if test "$opengl" != "no" ; then
4216  opengl_pkgs="epoxy gbm"
4217  if $pkg_config $opengl_pkgs; then
4218    opengl_cflags="$($pkg_config --cflags $opengl_pkgs)"
4219    opengl_libs="$($pkg_config --libs $opengl_pkgs)"
4220    opengl=yes
4221    if test "$gtk" = "yes" && $pkg_config --exists "$gtkpackage >= 3.16"; then
4222        gtk_gl="yes"
4223    fi
4224  else
4225    if test "$opengl" = "yes" ; then
4226      feature_not_found "opengl" "Please install opengl (mesa) devel pkgs: $opengl_pkgs"
4227    fi
4228    opengl_cflags=""
4229    opengl_libs=""
4230    opengl=no
4231  fi
4232fi
4233
4234if test "$opengl" = "yes"; then
4235  cat > $TMPC << EOF
4236#include <epoxy/egl.h>
4237#ifndef EGL_MESA_image_dma_buf_export
4238# error mesa/epoxy lacks support for dmabufs (mesa 10.6+)
4239#endif
4240int main(void) { return 0; }
4241EOF
4242  if compile_prog "" "" ; then
4243    opengl_dmabuf=yes
4244  fi
4245fi
4246
4247if test "$opengl" = "yes" && test "$have_x11" = "yes"; then
4248  for target in $target_list; do
4249    case $target in
4250      lm32-softmmu) # milkymist-tmu2 requires X11 and OpenGL
4251        need_x11=yes
4252      ;;
4253    esac
4254  done
4255fi
4256
4257##########################################
4258# libxml2 probe
4259if test "$libxml2" != "no" ; then
4260    if $pkg_config --exists libxml-2.0; then
4261        libxml2="yes"
4262        libxml2_cflags=$($pkg_config --cflags libxml-2.0)
4263        libxml2_libs=$($pkg_config --libs libxml-2.0)
4264    else
4265        if test "$libxml2" = "yes"; then
4266            feature_not_found "libxml2" "Install libxml2 devel"
4267        fi
4268        libxml2="no"
4269    fi
4270fi
4271
4272##########################################
4273# glusterfs probe
4274if test "$glusterfs" != "no" ; then
4275  if $pkg_config --atleast-version=3 glusterfs-api; then
4276    glusterfs="yes"
4277    glusterfs_cflags=$($pkg_config --cflags glusterfs-api)
4278    glusterfs_libs=$($pkg_config --libs glusterfs-api)
4279    if $pkg_config --atleast-version=4 glusterfs-api; then
4280      glusterfs_xlator_opt="yes"
4281    fi
4282    if $pkg_config --atleast-version=5 glusterfs-api; then
4283      glusterfs_discard="yes"
4284    fi
4285    if $pkg_config --atleast-version=6 glusterfs-api; then
4286      glusterfs_fallocate="yes"
4287      glusterfs_zerofill="yes"
4288    fi
4289    cat > $TMPC << EOF
4290#include <glusterfs/api/glfs.h>
4291
4292int
4293main(void)
4294{
4295	/* new glfs_ftruncate() passes two additional args */
4296	return glfs_ftruncate(NULL, 0, NULL, NULL);
4297}
4298EOF
4299    if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
4300      glusterfs_ftruncate_has_stat="yes"
4301    fi
4302    cat > $TMPC << EOF
4303#include <glusterfs/api/glfs.h>
4304
4305/* new glfs_io_cbk() passes two additional glfs_stat structs */
4306static void
4307glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
4308{}
4309
4310int
4311main(void)
4312{
4313	glfs_io_cbk iocb = &glusterfs_iocb;
4314	iocb(NULL, 0 , NULL, NULL, NULL);
4315	return 0;
4316}
4317EOF
4318    if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
4319      glusterfs_iocb_has_stat="yes"
4320    fi
4321  else
4322    if test "$glusterfs" = "yes" ; then
4323      feature_not_found "GlusterFS backend support" \
4324          "Install glusterfs-api devel >= 3"
4325    fi
4326    glusterfs="no"
4327  fi
4328fi
4329
4330# Check for inotify functions when we are building linux-user
4331# emulator.  This is done because older glibc versions don't
4332# have syscall stubs for these implemented.  In that case we
4333# don't provide them even if kernel supports them.
4334#
4335inotify=no
4336cat > $TMPC << EOF
4337#include <sys/inotify.h>
4338
4339int
4340main(void)
4341{
4342	/* try to start inotify */
4343	return inotify_init();
4344}
4345EOF
4346if compile_prog "" "" ; then
4347  inotify=yes
4348fi
4349
4350inotify1=no
4351cat > $TMPC << EOF
4352#include <sys/inotify.h>
4353
4354int
4355main(void)
4356{
4357    /* try to start inotify */
4358    return inotify_init1(0);
4359}
4360EOF
4361if compile_prog "" "" ; then
4362  inotify1=yes
4363fi
4364
4365# check if pipe2 is there
4366pipe2=no
4367cat > $TMPC << EOF
4368#include <unistd.h>
4369#include <fcntl.h>
4370
4371int main(void)
4372{
4373    int pipefd[2];
4374    return pipe2(pipefd, O_CLOEXEC);
4375}
4376EOF
4377if compile_prog "" "" ; then
4378  pipe2=yes
4379fi
4380
4381# check if accept4 is there
4382accept4=no
4383cat > $TMPC << EOF
4384#include <sys/socket.h>
4385#include <stddef.h>
4386
4387int main(void)
4388{
4389    accept4(0, NULL, NULL, SOCK_CLOEXEC);
4390    return 0;
4391}
4392EOF
4393if compile_prog "" "" ; then
4394  accept4=yes
4395fi
4396
4397# check if tee/splice is there. vmsplice was added same time.
4398splice=no
4399cat > $TMPC << EOF
4400#include <unistd.h>
4401#include <fcntl.h>
4402#include <limits.h>
4403
4404int main(void)
4405{
4406    int len, fd = 0;
4407    len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
4408    splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
4409    return 0;
4410}
4411EOF
4412if compile_prog "" "" ; then
4413  splice=yes
4414fi
4415
4416##########################################
4417# libnuma probe
4418
4419if test "$numa" != "no" ; then
4420  cat > $TMPC << EOF
4421#include <numa.h>
4422int main(void) { return numa_available(); }
4423EOF
4424
4425  if compile_prog "" "-lnuma" ; then
4426    numa=yes
4427    numa_libs="-lnuma"
4428  else
4429    if test "$numa" = "yes" ; then
4430      feature_not_found "numa" "install numactl devel"
4431    fi
4432    numa=no
4433  fi
4434fi
4435
4436if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
4437    echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
4438    exit 1
4439fi
4440
4441# Even if malloc_trim() is available, these non-libc memory allocators
4442# do not support it.
4443if test "$tcmalloc" = "yes" || test "$jemalloc" = "yes" ; then
4444    if test "$malloc_trim" = "yes" ; then
4445        echo "Disabling malloc_trim with non-libc memory allocator"
4446    fi
4447    malloc_trim="no"
4448fi
4449
4450#######################################
4451# malloc_trim
4452
4453if test "$malloc_trim" != "no" ; then
4454    cat > $TMPC << EOF
4455#include <malloc.h>
4456int main(void) { malloc_trim(0); return 0; }
4457EOF
4458    if compile_prog "" "" ; then
4459        malloc_trim="yes"
4460    else
4461        malloc_trim="no"
4462    fi
4463fi
4464
4465##########################################
4466# tcmalloc probe
4467
4468if test "$tcmalloc" = "yes" ; then
4469  cat > $TMPC << EOF
4470#include <stdlib.h>
4471int main(void) {
4472    void *tmp = malloc(1);
4473    if (tmp != NULL) {
4474        return 0;
4475    }
4476    return 1;
4477}
4478EOF
4479
4480  if compile_prog "" "-ltcmalloc" ; then
4481    LIBS="-ltcmalloc $LIBS"
4482  else
4483    feature_not_found "tcmalloc" "install gperftools devel"
4484  fi
4485fi
4486
4487##########################################
4488# jemalloc probe
4489
4490if test "$jemalloc" = "yes" ; then
4491  cat > $TMPC << EOF
4492#include <stdlib.h>
4493int main(void) {
4494    void *tmp = malloc(1);
4495    if (tmp != NULL) {
4496        return 0;
4497    }
4498    return 1;
4499}
4500EOF
4501
4502  if compile_prog "" "-ljemalloc" ; then
4503    LIBS="-ljemalloc $LIBS"
4504  else
4505    feature_not_found "jemalloc" "install jemalloc devel"
4506  fi
4507fi
4508
4509##########################################
4510# signalfd probe
4511signalfd="no"
4512cat > $TMPC << EOF
4513#include <unistd.h>
4514#include <sys/syscall.h>
4515#include <signal.h>
4516int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }
4517EOF
4518
4519if compile_prog "" "" ; then
4520  signalfd=yes
4521fi
4522
4523# check if optreset global is declared by <getopt.h>
4524optreset="no"
4525cat > $TMPC << EOF
4526#include <getopt.h>
4527int main(void) { return optreset; }
4528EOF
4529
4530if compile_prog "" "" ; then
4531  optreset=yes
4532fi
4533
4534# check if eventfd is supported
4535eventfd=no
4536cat > $TMPC << EOF
4537#include <sys/eventfd.h>
4538
4539int main(void)
4540{
4541    return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
4542}
4543EOF
4544if compile_prog "" "" ; then
4545  eventfd=yes
4546fi
4547
4548# check if memfd is supported
4549memfd=no
4550cat > $TMPC << EOF
4551#include <sys/mman.h>
4552
4553int main(void)
4554{
4555    return memfd_create("foo", MFD_ALLOW_SEALING);
4556}
4557EOF
4558if compile_prog "" "" ; then
4559  memfd=yes
4560fi
4561
4562# check for usbfs
4563have_usbfs=no
4564if test "$linux_user" = "yes"; then
4565  cat > $TMPC << EOF
4566#include <linux/usbdevice_fs.h>
4567
4568#ifndef USBDEVFS_GET_CAPABILITIES
4569#error "USBDEVFS_GET_CAPABILITIES undefined"
4570#endif
4571
4572#ifndef USBDEVFS_DISCONNECT_CLAIM
4573#error "USBDEVFS_DISCONNECT_CLAIM undefined"
4574#endif
4575
4576int main(void)
4577{
4578    return 0;
4579}
4580EOF
4581  if compile_prog "" ""; then
4582    have_usbfs=yes
4583  fi
4584fi
4585
4586# check for fallocate
4587fallocate=no
4588cat > $TMPC << EOF
4589#include <fcntl.h>
4590
4591int main(void)
4592{
4593    fallocate(0, 0, 0, 0);
4594    return 0;
4595}
4596EOF
4597if compile_prog "" "" ; then
4598  fallocate=yes
4599fi
4600
4601# check for fallocate hole punching
4602fallocate_punch_hole=no
4603cat > $TMPC << EOF
4604#include <fcntl.h>
4605#include <linux/falloc.h>
4606
4607int main(void)
4608{
4609    fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
4610    return 0;
4611}
4612EOF
4613if compile_prog "" "" ; then
4614  fallocate_punch_hole=yes
4615fi
4616
4617# check that fallocate supports range zeroing inside the file
4618fallocate_zero_range=no
4619cat > $TMPC << EOF
4620#include <fcntl.h>
4621#include <linux/falloc.h>
4622
4623int main(void)
4624{
4625    fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0);
4626    return 0;
4627}
4628EOF
4629if compile_prog "" "" ; then
4630  fallocate_zero_range=yes
4631fi
4632
4633# check for posix_fallocate
4634posix_fallocate=no
4635cat > $TMPC << EOF
4636#include <fcntl.h>
4637
4638int main(void)
4639{
4640    posix_fallocate(0, 0, 0);
4641    return 0;
4642}
4643EOF
4644if compile_prog "" "" ; then
4645    posix_fallocate=yes
4646fi
4647
4648# check for sync_file_range
4649sync_file_range=no
4650cat > $TMPC << EOF
4651#include <fcntl.h>
4652
4653int main(void)
4654{
4655    sync_file_range(0, 0, 0, 0);
4656    return 0;
4657}
4658EOF
4659if compile_prog "" "" ; then
4660  sync_file_range=yes
4661fi
4662
4663# check for linux/fiemap.h and FS_IOC_FIEMAP
4664fiemap=no
4665cat > $TMPC << EOF
4666#include <sys/ioctl.h>
4667#include <linux/fs.h>
4668#include <linux/fiemap.h>
4669
4670int main(void)
4671{
4672    ioctl(0, FS_IOC_FIEMAP, 0);
4673    return 0;
4674}
4675EOF
4676if compile_prog "" "" ; then
4677  fiemap=yes
4678fi
4679
4680# check for dup3
4681dup3=no
4682cat > $TMPC << EOF
4683#include <unistd.h>
4684
4685int main(void)
4686{
4687    dup3(0, 0, 0);
4688    return 0;
4689}
4690EOF
4691if compile_prog "" "" ; then
4692  dup3=yes
4693fi
4694
4695# check for ppoll support
4696ppoll=no
4697cat > $TMPC << EOF
4698#include <poll.h>
4699
4700int main(void)
4701{
4702    struct pollfd pfd = { .fd = 0, .events = 0, .revents = 0 };
4703    ppoll(&pfd, 1, 0, 0);
4704    return 0;
4705}
4706EOF
4707if compile_prog "" "" ; then
4708  ppoll=yes
4709fi
4710
4711# check for prctl(PR_SET_TIMERSLACK , ... ) support
4712prctl_pr_set_timerslack=no
4713cat > $TMPC << EOF
4714#include <sys/prctl.h>
4715
4716int main(void)
4717{
4718    prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0);
4719    return 0;
4720}
4721EOF
4722if compile_prog "" "" ; then
4723  prctl_pr_set_timerslack=yes
4724fi
4725
4726# check for epoll support
4727epoll=no
4728cat > $TMPC << EOF
4729#include <sys/epoll.h>
4730
4731int main(void)
4732{
4733    epoll_create(0);
4734    return 0;
4735}
4736EOF
4737if compile_prog "" "" ; then
4738  epoll=yes
4739fi
4740
4741# epoll_create1 is a later addition
4742# so we must check separately for its presence
4743epoll_create1=no
4744cat > $TMPC << EOF
4745#include <sys/epoll.h>
4746
4747int main(void)
4748{
4749    /* Note that we use epoll_create1 as a value, not as
4750     * a function being called. This is necessary so that on
4751     * old SPARC glibc versions where the function was present in
4752     * the library but not declared in the header file we will
4753     * fail the configure check. (Otherwise we will get a compiler
4754     * warning but not an error, and will proceed to fail the
4755     * qemu compile where we compile with -Werror.)
4756     */
4757    return (int)(uintptr_t)&epoll_create1;
4758}
4759EOF
4760if compile_prog "" "" ; then
4761  epoll_create1=yes
4762fi
4763
4764# check for sendfile support
4765sendfile=no
4766cat > $TMPC << EOF
4767#include <sys/sendfile.h>
4768
4769int main(void)
4770{
4771    return sendfile(0, 0, 0, 0);
4772}
4773EOF
4774if compile_prog "" "" ; then
4775  sendfile=yes
4776fi
4777
4778# check for timerfd support (glibc 2.8 and newer)
4779timerfd=no
4780cat > $TMPC << EOF
4781#include <sys/timerfd.h>
4782
4783int main(void)
4784{
4785    return(timerfd_create(CLOCK_REALTIME, 0));
4786}
4787EOF
4788if compile_prog "" "" ; then
4789  timerfd=yes
4790fi
4791
4792# check for setns and unshare support
4793setns=no
4794cat > $TMPC << EOF
4795#include <sched.h>
4796
4797int main(void)
4798{
4799    int ret;
4800    ret = setns(0, 0);
4801    ret = unshare(0);
4802    return ret;
4803}
4804EOF
4805if compile_prog "" "" ; then
4806  setns=yes
4807fi
4808
4809# clock_adjtime probe
4810clock_adjtime=no
4811cat > $TMPC <<EOF
4812#include <time.h>
4813
4814int main(void)
4815{
4816    return clock_adjtime(0, 0);
4817}
4818EOF
4819clock_adjtime=no
4820if compile_prog "" "" ; then
4821  clock_adjtime=yes
4822fi
4823
4824# syncfs probe
4825syncfs=no
4826cat > $TMPC <<EOF
4827#include <unistd.h>
4828
4829int main(void)
4830{
4831    return syncfs(0);
4832}
4833EOF
4834syncfs=no
4835if compile_prog "" "" ; then
4836  syncfs=yes
4837fi
4838
4839# check for kcov support (kernel must be 4.4+, compiled with certain options)
4840kcov=no
4841if check_include sys/kcov.h ; then
4842    kcov=yes
4843fi
4844
4845# check for btrfs filesystem support (kernel must be 3.9+)
4846btrfs=no
4847if check_include linux/btrfs.h ; then
4848    btrfs=yes
4849fi
4850
4851# If we're making warnings fatal, apply this to Sphinx runs as well
4852sphinx_werror=""
4853if test "$werror" = "yes"; then
4854    sphinx_werror="-W"
4855fi
4856
4857# Check we have a new enough version of sphinx-build
4858has_sphinx_build() {
4859    # This is a bit awkward but works: create a trivial document and
4860    # try to run it with our configuration file (which enforces a
4861    # version requirement). This will fail if either
4862    # sphinx-build doesn't exist at all or if it is too old.
4863    mkdir -p "$TMPDIR1/sphinx"
4864    touch "$TMPDIR1/sphinx/index.rst"
4865    "$sphinx_build" $sphinx_werror -c "$source_path/docs" \
4866                    -b html "$TMPDIR1/sphinx" \
4867                    "$TMPDIR1/sphinx/out"  >> config.log 2>&1
4868}
4869
4870# Check if tools are available to build documentation.
4871if test "$docs" != "no" ; then
4872  if has_sphinx_build; then
4873    sphinx_ok=yes
4874  else
4875    sphinx_ok=no
4876  fi
4877  if has makeinfo && has pod2man && test "$sphinx_ok" = "yes"; then
4878    docs=yes
4879  else
4880    if test "$docs" = "yes" ; then
4881      if has $sphinx_build && test "$sphinx_ok" != "yes"; then
4882        echo "Warning: $sphinx_build exists but it is either too old or uses too old a Python version" >&2
4883      fi
4884      feature_not_found "docs" "Install texinfo, Perl/perl-podlators and a Python 3 version of python-sphinx"
4885    fi
4886    docs=no
4887  fi
4888fi
4889
4890# Search for bswap_32 function
4891byteswap_h=no
4892cat > $TMPC << EOF
4893#include <byteswap.h>
4894int main(void) { return bswap_32(0); }
4895EOF
4896if compile_prog "" "" ; then
4897  byteswap_h=yes
4898fi
4899
4900# Search for bswap32 function
4901bswap_h=no
4902cat > $TMPC << EOF
4903#include <sys/endian.h>
4904#include <sys/types.h>
4905#include <machine/bswap.h>
4906int main(void) { return bswap32(0); }
4907EOF
4908if compile_prog "" "" ; then
4909  bswap_h=yes
4910fi
4911
4912##########################################
4913# Do we have libiscsi >= 1.9.0
4914if test "$libiscsi" != "no" ; then
4915  if $pkg_config --atleast-version=1.9.0 libiscsi; then
4916    libiscsi="yes"
4917    libiscsi_cflags=$($pkg_config --cflags libiscsi)
4918    libiscsi_libs=$($pkg_config --libs libiscsi)
4919  else
4920    if test "$libiscsi" = "yes" ; then
4921      feature_not_found "libiscsi" "Install libiscsi >= 1.9.0"
4922    fi
4923    libiscsi="no"
4924  fi
4925fi
4926
4927##########################################
4928# Do we need librt
4929# uClibc provides 2 versions of clock_gettime(), one with realtime
4930# support and one without. This means that the clock_gettime() don't
4931# need -lrt. We still need it for timer_create() so we check for this
4932# function in addition.
4933cat > $TMPC <<EOF
4934#include <signal.h>
4935#include <time.h>
4936int main(void) {
4937  timer_create(CLOCK_REALTIME, NULL, NULL);
4938  return clock_gettime(CLOCK_REALTIME, NULL);
4939}
4940EOF
4941
4942if compile_prog "" "" ; then
4943  :
4944# we need pthread for static linking. use previous pthread test result
4945elif compile_prog "" "$pthread_lib -lrt" ; then
4946  LIBS="$LIBS -lrt"
4947fi
4948
4949# Check whether we have openpty() in either libc or libutil
4950cat > $TMPC << EOF
4951extern int openpty(int *am, int *as, char *name, void *termp, void *winp);
4952int main(void) { return openpty(0, 0, 0, 0, 0); }
4953EOF
4954
4955have_openpty="no"
4956if compile_prog "" "" ; then
4957  have_openpty="yes"
4958else
4959  if compile_prog "" "-lutil" ; then
4960    have_openpty="yes"
4961  fi
4962fi
4963
4964##########################################
4965# spice probe
4966if test "$spice" != "no" ; then
4967  cat > $TMPC << EOF
4968#include <spice.h>
4969int main(void) { spice_server_new(); return 0; }
4970EOF
4971  spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
4972  spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
4973  if $pkg_config --atleast-version=0.12.5 spice-server && \
4974     $pkg_config --atleast-version=0.12.3 spice-protocol && \
4975     compile_prog "$spice_cflags" "$spice_libs" ; then
4976    spice="yes"
4977  else
4978    if test "$spice" = "yes" ; then
4979      feature_not_found "spice" \
4980          "Install spice-server(>=0.12.5) and spice-protocol(>=0.12.3) devel"
4981    fi
4982    spice="no"
4983  fi
4984fi
4985
4986# check for smartcard support
4987if test "$smartcard" != "no"; then
4988    if $pkg_config --atleast-version=2.5.1 libcacard; then
4989        libcacard_cflags=$($pkg_config --cflags libcacard)
4990        libcacard_libs=$($pkg_config --libs libcacard)
4991        smartcard="yes"
4992    else
4993        if test "$smartcard" = "yes"; then
4994            feature_not_found "smartcard" "Install libcacard devel"
4995        fi
4996        smartcard="no"
4997    fi
4998fi
4999
5000# check for libusb
5001if test "$libusb" != "no" ; then
5002    if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
5003        libusb="yes"
5004        libusb_cflags=$($pkg_config --cflags libusb-1.0)
5005        libusb_libs=$($pkg_config --libs libusb-1.0)
5006    else
5007        if test "$libusb" = "yes"; then
5008            feature_not_found "libusb" "Install libusb devel >= 1.0.13"
5009        fi
5010        libusb="no"
5011    fi
5012fi
5013
5014# check for usbredirparser for usb network redirection support
5015if test "$usb_redir" != "no" ; then
5016    if $pkg_config --atleast-version=0.6 libusbredirparser-0.5; then
5017        usb_redir="yes"
5018        usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5)
5019        usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5)
5020    else
5021        if test "$usb_redir" = "yes"; then
5022            feature_not_found "usb-redir" "Install usbredir devel"
5023        fi
5024        usb_redir="no"
5025    fi
5026fi
5027
5028##########################################
5029# check if we have VSS SDK headers for win
5030
5031if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
5032        test "$vss_win32_sdk" != "no" ; then
5033  case "$vss_win32_sdk" in
5034    "")   vss_win32_include="-isystem $source_path" ;;
5035    *\ *) # The SDK is installed in "Program Files" by default, but we cannot
5036          # handle path with spaces. So we symlink the headers into ".sdk/vss".
5037          vss_win32_include="-isystem $source_path/.sdk/vss"
5038	  symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
5039	  ;;
5040    *)    vss_win32_include="-isystem $vss_win32_sdk"
5041  esac
5042  cat > $TMPC << EOF
5043#define __MIDL_user_allocate_free_DEFINED__
5044#include <inc/win2003/vss.h>
5045int main(void) { return VSS_CTX_BACKUP; }
5046EOF
5047  if compile_prog "$vss_win32_include" "" ; then
5048    guest_agent_with_vss="yes"
5049    QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
5050    libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
5051    qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
5052  else
5053    if test "$vss_win32_sdk" != "" ; then
5054      echo "ERROR: Please download and install Microsoft VSS SDK:"
5055      echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
5056      echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
5057      echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
5058      echo "ERROR: The headers are extracted in the directory \`inc'."
5059      feature_not_found "VSS support"
5060    fi
5061    guest_agent_with_vss="no"
5062  fi
5063fi
5064
5065##########################################
5066# lookup Windows platform SDK (if not specified)
5067# The SDK is needed only to build .tlb (type library) file of guest agent
5068# VSS provider from the source. It is usually unnecessary because the
5069# pre-compiled .tlb file is included.
5070
5071if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
5072        test "$guest_agent_with_vss" = "yes" ; then
5073  if test -z "$win_sdk"; then
5074    programfiles="$PROGRAMFILES"
5075    test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
5076    if test -n "$programfiles"; then
5077      win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
5078    else
5079      feature_not_found "Windows SDK"
5080    fi
5081  elif test "$win_sdk" = "no"; then
5082    win_sdk=""
5083  fi
5084fi
5085
5086##########################################
5087# check if mingw environment provides a recent ntddscsi.h
5088if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
5089  cat > $TMPC << EOF
5090#include <windows.h>
5091#include <ntddscsi.h>
5092int main(void) {
5093#if !defined(IOCTL_SCSI_GET_ADDRESS)
5094#error Missing required ioctl definitions
5095#endif
5096  SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
5097  return addr.Lun;
5098}
5099EOF
5100  if compile_prog "" "" ; then
5101    guest_agent_ntddscsi=yes
5102    libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
5103  fi
5104fi
5105
5106##########################################
5107# virgl renderer probe
5108
5109if test "$virglrenderer" != "no" ; then
5110  cat > $TMPC << EOF
5111#include <virglrenderer.h>
5112int main(void) { virgl_renderer_poll(); return 0; }
5113EOF
5114  virgl_cflags=$($pkg_config --cflags virglrenderer 2>/dev/null)
5115  virgl_libs=$($pkg_config --libs virglrenderer 2>/dev/null)
5116  virgl_version=$($pkg_config --modversion virglrenderer 2>/dev/null)
5117  if $pkg_config virglrenderer >/dev/null 2>&1 && \
5118     compile_prog "$virgl_cflags" "$virgl_libs" ; then
5119    virglrenderer="yes"
5120  else
5121    if test "$virglrenderer" = "yes" ; then
5122      feature_not_found "virglrenderer"
5123    fi
5124    virglrenderer="no"
5125  fi
5126fi
5127
5128##########################################
5129# capstone
5130
5131case "$capstone" in
5132  "" | yes)
5133    if $pkg_config capstone; then
5134      capstone=system
5135    elif test -e "${source_path}/.git" && test $git_update = 'yes' ; then
5136      capstone=git
5137    elif test -e "${source_path}/capstone/Makefile" ; then
5138      capstone=internal
5139    elif test -z "$capstone" ; then
5140      capstone=no
5141    else
5142      feature_not_found "capstone" "Install capstone devel or git submodule"
5143    fi
5144    ;;
5145
5146  system)
5147    if ! $pkg_config capstone; then
5148      feature_not_found "capstone" "Install capstone devel"
5149    fi
5150    ;;
5151esac
5152
5153case "$capstone" in
5154  git | internal)
5155    if test "$capstone" = git; then
5156      git_submodules="${git_submodules} capstone"
5157    fi
5158    mkdir -p capstone
5159    if test "$mingw32" = "yes"; then
5160      LIBCAPSTONE=capstone.lib
5161    else
5162      LIBCAPSTONE=libcapstone.a
5163    fi
5164    capstone_libs="-Lcapstone -lcapstone"
5165    capstone_cflags="-I${source_path}/capstone/include"
5166    ;;
5167
5168  system)
5169    capstone_libs="$($pkg_config --libs capstone)"
5170    capstone_cflags="$($pkg_config --cflags capstone)"
5171    ;;
5172
5173  no)
5174    ;;
5175  *)
5176    error_exit "Unknown state for capstone: $capstone"
5177    ;;
5178esac
5179
5180##########################################
5181# check if we have fdatasync
5182
5183fdatasync=no
5184cat > $TMPC << EOF
5185#include <unistd.h>
5186int main(void) {
5187#if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
5188return fdatasync(0);
5189#else
5190#error Not supported
5191#endif
5192}
5193EOF
5194if compile_prog "" "" ; then
5195    fdatasync=yes
5196fi
5197
5198##########################################
5199# check if we have madvise
5200
5201madvise=no
5202cat > $TMPC << EOF
5203#include <sys/types.h>
5204#include <sys/mman.h>
5205#include <stddef.h>
5206int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }
5207EOF
5208if compile_prog "" "" ; then
5209    madvise=yes
5210fi
5211
5212##########################################
5213# check if we have posix_madvise
5214
5215posix_madvise=no
5216cat > $TMPC << EOF
5217#include <sys/mman.h>
5218#include <stddef.h>
5219int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }
5220EOF
5221if compile_prog "" "" ; then
5222    posix_madvise=yes
5223fi
5224
5225##########################################
5226# check if we have posix_memalign()
5227
5228posix_memalign=no
5229cat > $TMPC << EOF
5230#include <stdlib.h>
5231int main(void) {
5232    void *p;
5233    return posix_memalign(&p, 8, 8);
5234}
5235EOF
5236if compile_prog "" "" ; then
5237    posix_memalign=yes
5238fi
5239
5240##########################################
5241# check if we have posix_syslog
5242
5243posix_syslog=no
5244cat > $TMPC << EOF
5245#include <syslog.h>
5246int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; }
5247EOF
5248if compile_prog "" "" ; then
5249    posix_syslog=yes
5250fi
5251
5252##########################################
5253# check if we have sem_timedwait
5254
5255sem_timedwait=no
5256cat > $TMPC << EOF
5257#include <semaphore.h>
5258int main(void) { sem_t s; struct timespec t = {0}; return sem_timedwait(&s, &t); }
5259EOF
5260if compile_prog "" "" ; then
5261    sem_timedwait=yes
5262fi
5263
5264##########################################
5265# check if we have strchrnul
5266
5267strchrnul=no
5268cat > $TMPC << EOF
5269#include <string.h>
5270int main(void);
5271// Use a haystack that the compiler shouldn't be able to constant fold
5272char *haystack = (char*)&main;
5273int main(void) { return strchrnul(haystack, 'x') != &haystack[6]; }
5274EOF
5275if compile_prog "" "" ; then
5276    strchrnul=yes
5277fi
5278
5279#########################################
5280# check if we have st_atim
5281
5282st_atim=no
5283cat > $TMPC << EOF
5284#include <sys/stat.h>
5285#include <stddef.h>
5286int main(void) { return offsetof(struct stat, st_atim); }
5287EOF
5288if compile_prog "" "" ; then
5289    st_atim=yes
5290fi
5291
5292##########################################
5293# check if trace backend exists
5294
5295$python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
5296if test "$?" -ne 0 ; then
5297  error_exit "invalid trace backends" \
5298      "Please choose supported trace backends."
5299fi
5300
5301##########################################
5302# For 'ust' backend, test if ust headers are present
5303if have_backend "ust"; then
5304  cat > $TMPC << EOF
5305#include <lttng/tracepoint.h>
5306int main(void) { return 0; }
5307EOF
5308  if compile_prog "" "-Wl,--no-as-needed -ldl" ; then
5309    if $pkg_config lttng-ust --exists; then
5310      lttng_ust_libs=$($pkg_config --libs lttng-ust)
5311    else
5312      lttng_ust_libs="-llttng-ust -ldl"
5313    fi
5314    if $pkg_config liburcu-bp --exists; then
5315      urcu_bp_libs=$($pkg_config --libs liburcu-bp)
5316    else
5317      urcu_bp_libs="-lurcu-bp"
5318    fi
5319  else
5320    error_exit "Trace backend 'ust' missing lttng-ust header files"
5321  fi
5322fi
5323
5324##########################################
5325# For 'dtrace' backend, test if 'dtrace' command is present
5326if have_backend "dtrace"; then
5327  if ! has 'dtrace' ; then
5328    error_exit "dtrace command is not found in PATH $PATH"
5329  fi
5330  trace_backend_stap="no"
5331  if has 'stap' ; then
5332    trace_backend_stap="yes"
5333  fi
5334fi
5335
5336##########################################
5337# check and set a backend for coroutine
5338
5339# We prefer ucontext, but it's not always possible. The fallback
5340# is sigcontext. On Windows the only valid backend is the Windows
5341# specific one.
5342
5343ucontext_works=no
5344if test "$darwin" != "yes"; then
5345  cat > $TMPC << EOF
5346#include <ucontext.h>
5347#ifdef __stub_makecontext
5348#error Ignoring glibc stub makecontext which will always fail
5349#endif
5350int main(void) { makecontext(0, 0, 0); return 0; }
5351EOF
5352  if compile_prog "" "" ; then
5353    ucontext_works=yes
5354  fi
5355fi
5356
5357if test "$coroutine" = ""; then
5358  if test "$mingw32" = "yes"; then
5359    coroutine=win32
5360  elif test "$ucontext_works" = "yes"; then
5361    coroutine=ucontext
5362  else
5363    coroutine=sigaltstack
5364  fi
5365else
5366  case $coroutine in
5367  windows)
5368    if test "$mingw32" != "yes"; then
5369      error_exit "'windows' coroutine backend only valid for Windows"
5370    fi
5371    # Unfortunately the user visible backend name doesn't match the
5372    # coroutine-*.c filename for this case, so we have to adjust it here.
5373    coroutine=win32
5374    ;;
5375  ucontext)
5376    if test "$ucontext_works" != "yes"; then
5377      feature_not_found "ucontext"
5378    fi
5379    ;;
5380  sigaltstack)
5381    if test "$mingw32" = "yes"; then
5382      error_exit "only the 'windows' coroutine backend is valid for Windows"
5383    fi
5384    ;;
5385  *)
5386    error_exit "unknown coroutine backend $coroutine"
5387    ;;
5388  esac
5389fi
5390
5391if test "$coroutine_pool" = ""; then
5392  coroutine_pool=yes
5393fi
5394
5395if test "$debug_stack_usage" = "yes"; then
5396  if test "$coroutine_pool" = "yes"; then
5397    echo "WARN: disabling coroutine pool for stack usage debugging"
5398    coroutine_pool=no
5399  fi
5400fi
5401
5402##################################################
5403# SafeStack
5404
5405
5406if test "$safe_stack" = "yes"; then
5407cat > $TMPC << EOF
5408int main(int argc, char *argv[])
5409{
5410#if ! __has_feature(safe_stack)
5411#error SafeStack Disabled
5412#endif
5413    return 0;
5414}
5415EOF
5416  flag="-fsanitize=safe-stack"
5417  # Check that safe-stack is supported and enabled.
5418  if compile_prog "-Werror $flag" "$flag"; then
5419    # Flag needed both at compilation and at linking
5420    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
5421    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
5422  else
5423    error_exit "SafeStack not supported by your compiler"
5424  fi
5425  if test "$coroutine" != "ucontext"; then
5426    error_exit "SafeStack is only supported by the coroutine backend ucontext"
5427  fi
5428else
5429cat > $TMPC << EOF
5430int main(int argc, char *argv[])
5431{
5432#if defined(__has_feature)
5433#if __has_feature(safe_stack)
5434#error SafeStack Enabled
5435#endif
5436#endif
5437    return 0;
5438}
5439EOF
5440if test "$safe_stack" = "no"; then
5441  # Make sure that safe-stack is disabled
5442  if ! compile_prog "-Werror" ""; then
5443    # SafeStack was already enabled, try to explicitly remove the feature
5444    flag="-fno-sanitize=safe-stack"
5445    if ! compile_prog "-Werror $flag" "$flag"; then
5446      error_exit "Configure cannot disable SafeStack"
5447    fi
5448    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
5449    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
5450  fi
5451else # "$safe_stack" = ""
5452  # Set safe_stack to yes or no based on pre-existing flags
5453  if compile_prog "-Werror" ""; then
5454    safe_stack="no"
5455  else
5456    safe_stack="yes"
5457    if test "$coroutine" != "ucontext"; then
5458      error_exit "SafeStack is only supported by the coroutine backend ucontext"
5459    fi
5460  fi
5461fi
5462fi
5463
5464##########################################
5465# check if we have open_by_handle_at
5466
5467open_by_handle_at=no
5468cat > $TMPC << EOF
5469#include <fcntl.h>
5470#if !defined(AT_EMPTY_PATH)
5471# error missing definition
5472#else
5473int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
5474#endif
5475EOF
5476if compile_prog "" "" ; then
5477    open_by_handle_at=yes
5478fi
5479
5480########################################
5481# check if we have linux/magic.h
5482
5483linux_magic_h=no
5484cat > $TMPC << EOF
5485#include <linux/magic.h>
5486int main(void) {
5487  return 0;
5488}
5489EOF
5490if compile_prog "" "" ; then
5491    linux_magic_h=yes
5492fi
5493
5494########################################
5495# check if we have valgrind/valgrind.h
5496
5497valgrind_h=no
5498cat > $TMPC << EOF
5499#include <valgrind/valgrind.h>
5500int main(void) {
5501  return 0;
5502}
5503EOF
5504if compile_prog "" "" ; then
5505    valgrind_h=yes
5506fi
5507
5508########################################
5509# check if environ is declared
5510
5511has_environ=no
5512cat > $TMPC << EOF
5513#include <unistd.h>
5514int main(void) {
5515    environ = 0;
5516    return 0;
5517}
5518EOF
5519if compile_prog "" "" ; then
5520    has_environ=yes
5521fi
5522
5523########################################
5524# check if cpuid.h is usable.
5525
5526cat > $TMPC << EOF
5527#include <cpuid.h>
5528int main(void) {
5529    unsigned a, b, c, d;
5530    int max = __get_cpuid_max(0, 0);
5531
5532    if (max >= 1) {
5533        __cpuid(1, a, b, c, d);
5534    }
5535
5536    if (max >= 7) {
5537        __cpuid_count(7, 0, a, b, c, d);
5538    }
5539
5540    return 0;
5541}
5542EOF
5543if compile_prog "" "" ; then
5544    cpuid_h=yes
5545fi
5546
5547##########################################
5548# avx2 optimization requirement check
5549#
5550# There is no point enabling this if cpuid.h is not usable,
5551# since we won't be able to select the new routines.
5552
5553if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
5554  cat > $TMPC << EOF
5555#pragma GCC push_options
5556#pragma GCC target("avx2")
5557#include <cpuid.h>
5558#include <immintrin.h>
5559static int bar(void *a) {
5560    __m256i x = *(__m256i *)a;
5561    return _mm256_testz_si256(x, x);
5562}
5563int main(int argc, char *argv[]) { return bar(argv[0]); }
5564EOF
5565  if compile_object "" ; then
5566    avx2_opt="yes"
5567  else
5568    avx2_opt="no"
5569  fi
5570fi
5571
5572##########################################
5573# avx512f optimization requirement check
5574#
5575# There is no point enabling this if cpuid.h is not usable,
5576# since we won't be able to select the new routines.
5577# by default, it is turned off.
5578# if user explicitly want to enable it, check environment
5579
5580if test "$cpuid_h" = "yes" && test "$avx512f_opt" = "yes"; then
5581  cat > $TMPC << EOF
5582#pragma GCC push_options
5583#pragma GCC target("avx512f")
5584#include <cpuid.h>
5585#include <immintrin.h>
5586static int bar(void *a) {
5587    __m512i x = *(__m512i *)a;
5588    return _mm512_test_epi64_mask(x, x);
5589}
5590int main(int argc, char *argv[])
5591{
5592	return bar(argv[0]);
5593}
5594EOF
5595  if ! compile_object "" ; then
5596    avx512f_opt="no"
5597  fi
5598else
5599  avx512f_opt="no"
5600fi
5601
5602########################################
5603# check if __[u]int128_t is usable.
5604
5605int128=no
5606cat > $TMPC << EOF
5607__int128_t a;
5608__uint128_t b;
5609int main (void) {
5610  a = a + b;
5611  b = a * b;
5612  a = a * a;
5613  return 0;
5614}
5615EOF
5616if compile_prog "" "" ; then
5617    int128=yes
5618fi
5619
5620#########################################
5621# See if 128-bit atomic operations are supported.
5622
5623atomic128=no
5624if test "$int128" = "yes"; then
5625  cat > $TMPC << EOF
5626int main(void)
5627{
5628  unsigned __int128 x = 0, y = 0;
5629  y = __atomic_load_16(&x, 0);
5630  __atomic_store_16(&x, y, 0);
5631  __atomic_compare_exchange_16(&x, &y, x, 0, 0, 0);
5632  return 0;
5633}
5634EOF
5635  if compile_prog "" "" ; then
5636    atomic128=yes
5637  fi
5638fi
5639
5640cmpxchg128=no
5641if test "$int128" = yes && test "$atomic128" = no; then
5642  cat > $TMPC << EOF
5643int main(void)
5644{
5645  unsigned __int128 x = 0, y = 0;
5646  __sync_val_compare_and_swap_16(&x, y, x);
5647  return 0;
5648}
5649EOF
5650  if compile_prog "" "" ; then
5651    cmpxchg128=yes
5652  fi
5653fi
5654
5655#########################################
5656# See if 64-bit atomic operations are supported.
5657# Note that without __atomic builtins, we can only
5658# assume atomic loads/stores max at pointer size.
5659
5660cat > $TMPC << EOF
5661#include <stdint.h>
5662int main(void)
5663{
5664  uint64_t x = 0, y = 0;
5665#ifdef __ATOMIC_RELAXED
5666  y = __atomic_load_n(&x, __ATOMIC_RELAXED);
5667  __atomic_store_n(&x, y, __ATOMIC_RELAXED);
5668  __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
5669  __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
5670  __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
5671#else
5672  typedef char is_host64[sizeof(void *) >= sizeof(uint64_t) ? 1 : -1];
5673  __sync_lock_test_and_set(&x, y);
5674  __sync_val_compare_and_swap(&x, y, 0);
5675  __sync_fetch_and_add(&x, y);
5676#endif
5677  return 0;
5678}
5679EOF
5680if compile_prog "" "" ; then
5681  atomic64=yes
5682fi
5683
5684#########################################
5685# See if --dynamic-list is supported by the linker
5686ld_dynamic_list="no"
5687if test "$static" = "no" ; then
5688    cat > $TMPTXT <<EOF
5689{
5690  foo;
5691};
5692EOF
5693
5694    cat > $TMPC <<EOF
5695#include <stdio.h>
5696void foo(void);
5697
5698void foo(void)
5699{
5700  printf("foo\n");
5701}
5702
5703int main(void)
5704{
5705  foo();
5706  return 0;
5707}
5708EOF
5709
5710    if compile_prog "" "-Wl,--dynamic-list=$TMPTXT" ; then
5711        ld_dynamic_list="yes"
5712    fi
5713fi
5714
5715#########################################
5716# See if -exported_symbols_list is supported by the linker
5717
5718ld_exported_symbols_list="no"
5719if test "$static" = "no" ; then
5720    cat > $TMPTXT <<EOF
5721  _foo
5722EOF
5723
5724    if compile_prog "" "-Wl,-exported_symbols_list,$TMPTXT" ; then
5725        ld_exported_symbols_list="yes"
5726    fi
5727fi
5728
5729if  test "$plugins" = "yes" &&
5730    test "$ld_dynamic_list" = "no" &&
5731    test "$ld_exported_symbols_list" = "no" ; then
5732  error_exit \
5733      "Plugin support requires dynamic linking and specifying a set of symbols " \
5734      "that are exported to plugins. Unfortunately your linker doesn't " \
5735      "support the flag (--dynamic-list or -exported_symbols_list) used " \
5736      "for this purpose. You can't build with --static."
5737fi
5738
5739########################################
5740# See if __attribute__((alias)) is supported.
5741# This false for Xcode 9, but has been remedied for Xcode 10.
5742# Unfortunately, travis uses Xcode 9 by default.
5743
5744attralias=no
5745cat > $TMPC << EOF
5746int x = 1;
5747extern const int y __attribute__((alias("x")));
5748int main(void) { return 0; }
5749EOF
5750if compile_prog "" "" ; then
5751    attralias=yes
5752fi
5753
5754########################################
5755# check if getauxval is available.
5756
5757getauxval=no
5758cat > $TMPC << EOF
5759#include <sys/auxv.h>
5760int main(void) {
5761  return getauxval(AT_HWCAP) == 0;
5762}
5763EOF
5764if compile_prog "" "" ; then
5765    getauxval=yes
5766fi
5767
5768########################################
5769# check if ccache is interfering with
5770# semantic analysis of macros
5771
5772unset CCACHE_CPP2
5773ccache_cpp2=no
5774cat > $TMPC << EOF
5775static const int Z = 1;
5776#define fn() ({ Z; })
5777#define TAUT(X) ((X) == Z)
5778#define PAREN(X, Y) (X == Y)
5779#define ID(X) (X)
5780int main(int argc, char *argv[])
5781{
5782    int x = 0, y = 0;
5783    x = ID(x);
5784    x = fn();
5785    fn();
5786    if (PAREN(x, y)) return 0;
5787    if (TAUT(Z)) return 0;
5788    return 0;
5789}
5790EOF
5791
5792if ! compile_object "-Werror"; then
5793    ccache_cpp2=yes
5794fi
5795
5796#################################################
5797# clang does not support glibc + FORTIFY_SOURCE.
5798
5799if test "$fortify_source" != "no"; then
5800  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
5801    fortify_source="no";
5802  elif test -n "$cxx" && has $cxx &&
5803       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
5804    fortify_source="no";
5805  else
5806    fortify_source="yes"
5807  fi
5808fi
5809
5810###############################################
5811# Check if copy_file_range is provided by glibc
5812have_copy_file_range=no
5813cat > $TMPC << EOF
5814#include <unistd.h>
5815int main(void) {
5816  copy_file_range(0, NULL, 0, NULL, 0, 0);
5817  return 0;
5818}
5819EOF
5820if compile_prog "" "" ; then
5821    have_copy_file_range=yes
5822fi
5823
5824##########################################
5825# check if struct fsxattr is available via linux/fs.h
5826
5827have_fsxattr=no
5828cat > $TMPC << EOF
5829#include <linux/fs.h>
5830struct fsxattr foo;
5831int main(void) {
5832  return 0;
5833}
5834EOF
5835if compile_prog "" "" ; then
5836    have_fsxattr=yes
5837fi
5838
5839##########################################
5840# check for usable membarrier system call
5841if test "$membarrier" = "yes"; then
5842    have_membarrier=no
5843    if test "$mingw32" = "yes" ; then
5844        have_membarrier=yes
5845    elif test "$linux" = "yes" ; then
5846        cat > $TMPC << EOF
5847    #include <linux/membarrier.h>
5848    #include <sys/syscall.h>
5849    #include <unistd.h>
5850    #include <stdlib.h>
5851    int main(void) {
5852        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
5853        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
5854	exit(0);
5855    }
5856EOF
5857        if compile_prog "" "" ; then
5858            have_membarrier=yes
5859        fi
5860    fi
5861    if test "$have_membarrier" = "no"; then
5862      feature_not_found "membarrier" "membarrier system call not available"
5863    fi
5864else
5865    # Do not enable it by default even for Mingw32, because it doesn't
5866    # work on Wine.
5867    membarrier=no
5868fi
5869
5870##########################################
5871# check if rtnetlink.h exists and is useful
5872have_rtnetlink=no
5873cat > $TMPC << EOF
5874#include <linux/rtnetlink.h>
5875int main(void) {
5876  return IFLA_PROTO_DOWN;
5877}
5878EOF
5879if compile_prog "" "" ; then
5880    have_rtnetlink=yes
5881fi
5882
5883##########################################
5884# check for usable AF_VSOCK environment
5885have_af_vsock=no
5886cat > $TMPC << EOF
5887#include <errno.h>
5888#include <sys/types.h>
5889#include <sys/socket.h>
5890#if !defined(AF_VSOCK)
5891# error missing AF_VSOCK flag
5892#endif
5893#include <linux/vm_sockets.h>
5894int main(void) {
5895    int sock, ret;
5896    struct sockaddr_vm svm;
5897    socklen_t len = sizeof(svm);
5898    sock = socket(AF_VSOCK, SOCK_STREAM, 0);
5899    ret = getpeername(sock, (struct sockaddr *)&svm, &len);
5900    if ((ret == -1) && (errno == ENOTCONN)) {
5901        return 0;
5902    }
5903    return -1;
5904}
5905EOF
5906if compile_prog "" "" ; then
5907    have_af_vsock=yes
5908fi
5909
5910##########################################
5911# check for usable AF_ALG environment
5912have_afalg=no
5913cat > $TMPC << EOF
5914#include <errno.h>
5915#include <sys/types.h>
5916#include <sys/socket.h>
5917#include <linux/if_alg.h>
5918int main(void) {
5919    int sock;
5920    sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
5921    return sock;
5922}
5923EOF
5924if compile_prog "" "" ; then
5925    have_afalg=yes
5926fi
5927if test "$crypto_afalg" = "yes"
5928then
5929    if test "$have_afalg" != "yes"
5930    then
5931	error_exit "AF_ALG requested but could not be detected"
5932    fi
5933fi
5934
5935
5936#################################################
5937# Check to see if we have the Hypervisor framework
5938if [ "$darwin" = "yes" ] ; then
5939  cat > $TMPC << EOF
5940#include <Hypervisor/hv.h>
5941int main() { return 0;}
5942EOF
5943  if ! compile_object ""; then
5944    hvf='no'
5945  else
5946    hvf='yes'
5947    QEMU_LDFLAGS="-framework Hypervisor $QEMU_LDFLAGS"
5948  fi
5949fi
5950
5951##########################################
5952# check for sysmacros.h
5953
5954have_sysmacros=no
5955cat > $TMPC << EOF
5956#include <sys/sysmacros.h>
5957int main(void) {
5958    return makedev(0, 0);
5959}
5960EOF
5961if compile_prog "" "" ; then
5962    have_sysmacros=yes
5963fi
5964
5965##########################################
5966# check for _Static_assert()
5967
5968have_static_assert=no
5969cat > $TMPC << EOF
5970_Static_assert(1, "success");
5971int main(void) {
5972    return 0;
5973}
5974EOF
5975if compile_prog "" "" ; then
5976    have_static_assert=yes
5977fi
5978
5979##########################################
5980# check for utmpx.h, it is missing e.g. on OpenBSD
5981
5982have_utmpx=no
5983cat > $TMPC << EOF
5984#include <utmpx.h>
5985struct utmpx user_info;
5986int main(void) {
5987    return 0;
5988}
5989EOF
5990if compile_prog "" "" ; then
5991    have_utmpx=yes
5992fi
5993
5994##########################################
5995# check for getrandom()
5996
5997have_getrandom=no
5998cat > $TMPC << EOF
5999#include <sys/random.h>
6000int main(void) {
6001    return getrandom(0, 0, GRND_NONBLOCK);
6002}
6003EOF
6004if compile_prog "" "" ; then
6005    have_getrandom=yes
6006fi
6007
6008##########################################
6009# checks for sanitizers
6010
6011have_asan=no
6012have_ubsan=no
6013have_asan_iface_h=no
6014have_asan_iface_fiber=no
6015
6016if test "$sanitizers" = "yes" ; then
6017  write_c_skeleton
6018  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
6019      have_asan=yes
6020  fi
6021
6022  # we could use a simple skeleton for flags checks, but this also
6023  # detect the static linking issue of ubsan, see also:
6024  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
6025  cat > $TMPC << EOF
6026#include <stdlib.h>
6027int main(void) {
6028    void *tmp = malloc(10);
6029    if (tmp != NULL) {
6030        return *(int *)(tmp + 2);
6031    }
6032    return 1;
6033}
6034EOF
6035  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
6036      have_ubsan=yes
6037  fi
6038
6039  if check_include "sanitizer/asan_interface.h" ; then
6040      have_asan_iface_h=yes
6041  fi
6042
6043  cat > $TMPC << EOF
6044#include <sanitizer/asan_interface.h>
6045int main(void) {
6046  __sanitizer_start_switch_fiber(0, 0, 0);
6047  return 0;
6048}
6049EOF
6050  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
6051      have_asan_iface_fiber=yes
6052  fi
6053fi
6054
6055##########################################
6056# checks for fuzzer
6057if test "$fuzzing" = "yes" && test -z "${LIB_FUZZING_ENGINE+xxx}"; then
6058  write_c_fuzzer_skeleton
6059  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=fuzzer" ""; then
6060    have_fuzzer=yes
6061  else
6062    error_exit "Your compiler doesn't support -fsanitize=fuzzer"
6063    exit 1
6064  fi
6065fi
6066
6067# Thread sanitizer is, for now, much noisier than the other sanitizers;
6068# keep it separate until that is not the case.
6069if test "$tsan" = "yes" && test "$sanitizers" = "yes"; then
6070  error_exit "TSAN is not supported with other sanitiziers."
6071fi
6072have_tsan=no
6073have_tsan_iface_fiber=no
6074if test "$tsan" = "yes" ; then
6075  write_c_skeleton
6076  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
6077      have_tsan=yes
6078  fi
6079  cat > $TMPC << EOF
6080#include <sanitizer/tsan_interface.h>
6081int main(void) {
6082  __tsan_create_fiber(0);
6083  return 0;
6084}
6085EOF
6086  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
6087      have_tsan_iface_fiber=yes
6088  fi
6089fi
6090
6091##########################################
6092# check for libpmem
6093
6094if test "$libpmem" != "no"; then
6095	if $pkg_config --exists "libpmem"; then
6096		libpmem="yes"
6097		libpmem_libs=$($pkg_config --libs libpmem)
6098		libpmem_cflags=$($pkg_config --cflags libpmem)
6099	else
6100		if test "$libpmem" = "yes" ; then
6101			feature_not_found "libpmem" "Install nvml or pmdk"
6102		fi
6103		libpmem="no"
6104	fi
6105fi
6106
6107##########################################
6108# check for libdaxctl
6109
6110if test "$libdaxctl" != "no"; then
6111	if $pkg_config --atleast-version=57 "libdaxctl"; then
6112		libdaxctl="yes"
6113		libdaxctl_libs=$($pkg_config --libs libdaxctl)
6114		libdaxctl_cflags=$($pkg_config --cflags libdaxctl)
6115	else
6116		if test "$libdaxctl" = "yes" ; then
6117			feature_not_found "libdaxctl" "Install libdaxctl"
6118		fi
6119		libdaxctl="no"
6120	fi
6121fi
6122
6123##########################################
6124# check for slirp
6125
6126# slirp is only required when building softmmu targets
6127if test -z "$slirp" -a "$softmmu" != "yes" ; then
6128    slirp="no"
6129fi
6130
6131case "$slirp" in
6132  "" | yes)
6133    if $pkg_config slirp; then
6134      slirp=system
6135    elif test -e "${source_path}/.git" && test $git_update = 'yes' ; then
6136      slirp=git
6137    elif test -e "${source_path}/slirp/Makefile" ; then
6138      slirp=internal
6139    elif test -z "$slirp" ; then
6140      slirp=no
6141    else
6142      feature_not_found "slirp" "Install slirp devel or git submodule"
6143    fi
6144    ;;
6145
6146  system)
6147    if ! $pkg_config slirp; then
6148      feature_not_found "slirp" "Install slirp devel"
6149    fi
6150    ;;
6151esac
6152
6153case "$slirp" in
6154  git | internal)
6155    if test "$slirp" = git; then
6156      git_submodules="${git_submodules} slirp"
6157    fi
6158    mkdir -p slirp
6159    slirp_cflags="-I${source_path}/slirp/src -Islirp/src"
6160    slirp_libs="-Lslirp -lslirp"
6161    if test "$mingw32" = "yes" ; then
6162      slirp_libs="$slirp_libs -lws2_32 -liphlpapi"
6163    fi
6164    ;;
6165
6166  system)
6167    slirp_version=$($pkg_config --modversion slirp 2>/dev/null)
6168    slirp_cflags=$($pkg_config --cflags slirp 2>/dev/null)
6169    slirp_libs=$($pkg_config --libs slirp 2>/dev/null)
6170    ;;
6171
6172  no)
6173    ;;
6174  *)
6175    error_exit "Unknown state for slirp: $slirp"
6176    ;;
6177esac
6178
6179##########################################
6180# check for usable __NR_keyctl syscall
6181
6182if test "$linux" = "yes" ; then
6183
6184    have_keyring=no
6185    cat > $TMPC << EOF
6186#include <errno.h>
6187#include <asm/unistd.h>
6188#include <linux/keyctl.h>
6189#include <unistd.h>
6190int main(void) {
6191    return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
6192}
6193EOF
6194    if compile_prog "" "" ; then
6195        have_keyring=yes
6196    fi
6197fi
6198if test "$secret_keyring" != "no"
6199then
6200    if test "$have_keyring" = "yes"
6201    then
6202	secret_keyring=yes
6203    else
6204	if test "$secret_keyring" = "yes"
6205	then
6206	    error_exit "syscall __NR_keyctl requested, \
6207but not implemented on your system"
6208	else
6209	    secret_keyring=no
6210	fi
6211    fi
6212fi
6213
6214##########################################
6215# End of CC checks
6216# After here, no more $cc or $ld runs
6217
6218write_c_skeleton
6219
6220if test "$gcov" = "yes" ; then
6221  :
6222elif test "$fortify_source" = "yes" ; then
6223  QEMU_CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $QEMU_CFLAGS"
6224  debug=no
6225fi
6226if test "$debug_info" = "yes"; then
6227  CFLAGS="-g $CFLAGS"
6228  LDFLAGS="-g $LDFLAGS"
6229fi
6230if test "$debug" = "no"; then
6231  CFLAGS="-O2 $CFLAGS"
6232fi
6233
6234case "$ARCH" in
6235alpha)
6236  # Ensure there's only a single GP
6237  QEMU_CFLAGS="-msmall-data $QEMU_CFLAGS"
6238;;
6239esac
6240
6241if test "$gprof" = "yes" ; then
6242  QEMU_CFLAGS="-p $QEMU_CFLAGS"
6243  QEMU_LDFLAGS="-p $QEMU_LDFLAGS"
6244fi
6245
6246if test "$have_asan" = "yes"; then
6247  QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
6248  QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
6249  if test "$have_asan_iface_h" = "no" ; then
6250      echo "ASAN build enabled, but ASAN header missing." \
6251           "Without code annotation, the report may be inferior."
6252  elif test "$have_asan_iface_fiber" = "no" ; then
6253      echo "ASAN build enabled, but ASAN header is too old." \
6254           "Without code annotation, the report may be inferior."
6255  fi
6256fi
6257if test "$have_tsan" = "yes" ; then
6258  if test "$have_tsan_iface_fiber" = "yes" ; then
6259    QEMU_CFLAGS="-fsanitize=thread $QEMU_CFLAGS"
6260    QEMU_LDFLAGS="-fsanitize=thread $QEMU_LDFLAGS"
6261  else
6262    error_exit "Cannot enable TSAN due to missing fiber annotation interface."
6263  fi
6264elif test "$tsan" = "yes" ; then
6265  error_exit "Cannot enable TSAN due to missing sanitize thread interface."
6266fi
6267if test "$have_ubsan" = "yes"; then
6268  QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS"
6269  QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
6270fi
6271
6272##########################################
6273# Do we have libnfs
6274if test "$libnfs" != "no" ; then
6275  if $pkg_config --atleast-version=1.9.3 libnfs; then
6276    libnfs="yes"
6277    libnfs_libs=$($pkg_config --libs libnfs)
6278  else
6279    if test "$libnfs" = "yes" ; then
6280      feature_not_found "libnfs" "Install libnfs devel >= 1.9.3"
6281    fi
6282    libnfs="no"
6283  fi
6284fi
6285
6286##########################################
6287# Do we have libudev
6288if test "$libudev" != "no" ; then
6289  if $pkg_config libudev && test "$static" != "yes"; then
6290    libudev="yes"
6291    libudev_libs=$($pkg_config --libs libudev)
6292  else
6293    libudev="no"
6294  fi
6295fi
6296
6297# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
6298if test "$solaris" = "no" && test "$tsan" = "no"; then
6299    if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
6300        QEMU_LDFLAGS="-Wl,--warn-common $QEMU_LDFLAGS"
6301    fi
6302fi
6303
6304# test if pod2man has --utf8 option
6305if pod2man --help | grep -q utf8; then
6306    POD2MAN="pod2man --utf8"
6307else
6308    POD2MAN="pod2man"
6309fi
6310
6311# Use ASLR, no-SEH and DEP if available
6312if test "$mingw32" = "yes" ; then
6313    for flag in --dynamicbase --no-seh --nxcompat; do
6314        if ld_has $flag ; then
6315            QEMU_LDFLAGS="-Wl,$flag $QEMU_LDFLAGS"
6316        fi
6317    done
6318fi
6319
6320# Disable OpenBSD W^X if available
6321if test "$tcg" = "yes" && test "$targetos" = "OpenBSD"; then
6322    cat > $TMPC <<EOF
6323    int main(void) { return 0; }
6324EOF
6325    wx_ldflags="-Wl,-z,wxneeded"
6326    if compile_prog "" "$wx_ldflags"; then
6327        QEMU_LDFLAGS="$QEMU_LDFLAGS $wx_ldflags"
6328    fi
6329fi
6330
6331qemu_confdir="$sysconfdir/$qemu_suffix"
6332qemu_moddir="$libdir/$qemu_suffix"
6333qemu_datadir="$datadir/$qemu_suffix"
6334qemu_docdir="$docdir/$qemu_suffix"
6335qemu_localedir="$datadir/locale"
6336qemu_icondir="$datadir/icons"
6337qemu_desktopdir="$datadir/applications"
6338
6339# We can only support ivshmem if we have eventfd
6340if [ "$eventfd" = "yes" ]; then
6341  ivshmem=yes
6342fi
6343
6344if test "$softmmu" = yes ; then
6345  if test "$linux" = yes; then
6346    if test "$virtfs" != no && test "$cap_ng" = yes && test "$attr" = yes ; then
6347      virtfs=yes
6348    else
6349      if test "$virtfs" = yes; then
6350        error_exit "VirtFS requires libcap-ng devel and libattr devel"
6351      fi
6352      virtfs=no
6353    fi
6354    if test "$mpath" != no && test "$mpathpersist" = yes ; then
6355      mpath=yes
6356    else
6357      if test "$mpath" = yes; then
6358        error_exit "Multipath requires libmpathpersist devel"
6359      fi
6360      mpath=no
6361    fi
6362  else
6363    if test "$virtfs" = yes; then
6364      error_exit "VirtFS is supported only on Linux"
6365    fi
6366    virtfs=no
6367    if test "$mpath" = yes; then
6368      error_exit "Multipath is supported only on Linux"
6369    fi
6370    mpath=no
6371  fi
6372fi
6373
6374# Probe for guest agent support/options
6375
6376if [ "$guest_agent" != "no" ]; then
6377  if [ "$softmmu" = no -a "$want_tools" = no ] ; then
6378      guest_agent=no
6379  elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
6380      guest_agent=yes
6381  elif [ "$guest_agent" != yes ]; then
6382      guest_agent=no
6383  else
6384      error_exit "Guest agent is not supported on this platform"
6385  fi
6386fi
6387
6388# Guest agent Window MSI  package
6389
6390if test "$guest_agent" != yes; then
6391  if test "$guest_agent_msi" = yes; then
6392    error_exit "MSI guest agent package requires guest agent enabled"
6393  fi
6394  guest_agent_msi=no
6395elif test "$mingw32" != "yes"; then
6396  if test "$guest_agent_msi" = "yes"; then
6397    error_exit "MSI guest agent package is available only for MinGW Windows cross-compilation"
6398  fi
6399  guest_agent_msi=no
6400elif ! has wixl; then
6401  if test "$guest_agent_msi" = "yes"; then
6402    error_exit "MSI guest agent package requires wixl tool installed ( usually from msitools package )"
6403  fi
6404  guest_agent_msi=no
6405else
6406  # we support qemu-ga, mingw32, and wixl: default to MSI enabled if it wasn't
6407  # disabled explicitly
6408  if test "$guest_agent_msi" != "no"; then
6409    guest_agent_msi=yes
6410  fi
6411fi
6412
6413if test "$guest_agent_msi" = "yes"; then
6414  if test "$guest_agent_with_vss" = "yes"; then
6415    QEMU_GA_MSI_WITH_VSS="-D InstallVss"
6416  fi
6417
6418  if test "$QEMU_GA_MANUFACTURER" = ""; then
6419    QEMU_GA_MANUFACTURER=QEMU
6420  fi
6421
6422  if test "$QEMU_GA_DISTRO" = ""; then
6423    QEMU_GA_DISTRO=Linux
6424  fi
6425
6426  if test "$QEMU_GA_VERSION" = ""; then
6427      QEMU_GA_VERSION=$(cat $source_path/VERSION)
6428  fi
6429
6430  QEMU_GA_MSI_MINGW_DLL_PATH="-D Mingw_dlls=$($pkg_config --variable=prefix glib-2.0)/bin"
6431
6432  case "$cpu" in
6433  x86_64)
6434    QEMU_GA_MSI_ARCH="-a x64 -D Arch=64"
6435    ;;
6436  i386)
6437    QEMU_GA_MSI_ARCH="-D Arch=32"
6438    ;;
6439  *)
6440    error_exit "CPU $cpu not supported for building installation package"
6441    ;;
6442  esac
6443fi
6444
6445# Mac OS X ships with a broken assembler
6446roms=
6447if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
6448        test "$targetos" != "Darwin" && test "$targetos" != "SunOS" && \
6449        test "$softmmu" = yes ; then
6450    # Different host OS linkers have different ideas about the name of the ELF
6451    # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
6452    # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
6453    for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
6454        if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
6455            ld_i386_emulation="$emu"
6456            roms="optionrom"
6457            break
6458        fi
6459    done
6460fi
6461
6462# Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
6463if test "$cpu" = "s390x" ; then
6464  write_c_skeleton
6465  if compile_prog "-march=z900" ""; then
6466    roms="$roms s390-ccw"
6467    # SLOF is required for building the s390-ccw firmware on s390x,
6468    # since it is using the libnet code from SLOF for network booting.
6469    if test -e "${source_path}/.git" ; then
6470      git_submodules="${git_submodules} roms/SLOF"
6471    fi
6472  fi
6473fi
6474
6475# Check that the C++ compiler exists and works with the C compiler.
6476# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
6477if has $cxx; then
6478    cat > $TMPC <<EOF
6479int c_function(void);
6480int main(void) { return c_function(); }
6481EOF
6482
6483    compile_object
6484
6485    cat > $TMPCXX <<EOF
6486extern "C" {
6487   int c_function(void);
6488}
6489int c_function(void) { return 42; }
6490EOF
6491
6492    update_cxxflags
6493
6494    if do_cxx $CXXFLAGS $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
6495        # C++ compiler $cxx works ok with C compiler $cc
6496        :
6497    else
6498        echo "C++ compiler $cxx does not work with C compiler $cc"
6499        echo "Disabling C++ specific optional code"
6500        cxx=
6501    fi
6502else
6503    echo "No C++ compiler available; disabling C++ specific optional code"
6504    cxx=
6505fi
6506
6507if test $git_update = 'yes' ; then
6508    (cd "${source_path}" && GIT="$git" "./scripts/git-submodule.sh" update "$git_submodules")
6509fi
6510if test "$fdt" = "git" ; then
6511    symlink "$source_path/dtc/Makefile" "dtc/Makefile"
6512fi
6513
6514config_host_mak="config-host.mak"
6515
6516echo "# Automatically generated by configure - do not modify" > $config_host_mak
6517echo >> $config_host_mak
6518
6519echo all: >> $config_host_mak
6520echo "prefix=$prefix" >> $config_host_mak
6521echo "bindir=$bindir" >> $config_host_mak
6522echo "libdir=$libdir" >> $config_host_mak
6523echo "libexecdir=$libexecdir" >> $config_host_mak
6524echo "includedir=$includedir" >> $config_host_mak
6525echo "sysconfdir=$sysconfdir" >> $config_host_mak
6526echo "qemu_confdir=$qemu_confdir" >> $config_host_mak
6527echo "qemu_datadir=$qemu_datadir" >> $config_host_mak
6528echo "qemu_firmwarepath=$firmwarepath" >> $config_host_mak
6529echo "qemu_moddir=$qemu_moddir" >> $config_host_mak
6530if test "$mingw32" = "no" ; then
6531  echo "qemu_localstatedir=$local_statedir" >> $config_host_mak
6532fi
6533echo "qemu_helperdir=$libexecdir" >> $config_host_mak
6534echo "qemu_localedir=$qemu_localedir" >> $config_host_mak
6535echo "qemu_icondir=$qemu_icondir" >> $config_host_mak
6536echo "qemu_desktopdir=$qemu_desktopdir" >> $config_host_mak
6537echo "GIT=$git" >> $config_host_mak
6538echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
6539echo "GIT_UPDATE=$git_update" >> $config_host_mak
6540
6541echo "ARCH=$ARCH" >> $config_host_mak
6542
6543if test "$default_devices" = "yes" ; then
6544  echo "CONFIG_MINIKCONF_MODE=--defconfig" >> $config_host_mak
6545else
6546  echo "CONFIG_MINIKCONF_MODE=--allnoconfig" >> $config_host_mak
6547fi
6548if test "$debug_tcg" = "yes" ; then
6549  echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
6550fi
6551if test "$strip_opt" = "yes" ; then
6552  echo "STRIP=${strip}" >> $config_host_mak
6553fi
6554if test "$bigendian" = "yes" ; then
6555  echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
6556fi
6557if test "$mingw32" = "yes" ; then
6558  echo "CONFIG_WIN32=y" >> $config_host_mak
6559  rc_version=$(cat $source_path/VERSION)
6560  version_major=${rc_version%%.*}
6561  rc_version=${rc_version#*.}
6562  version_minor=${rc_version%%.*}
6563  rc_version=${rc_version#*.}
6564  version_subminor=${rc_version%%.*}
6565  version_micro=0
6566  echo "CONFIG_FILEVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
6567  echo "CONFIG_PRODUCTVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
6568  if test "$guest_agent_with_vss" = "yes" ; then
6569    echo "CONFIG_QGA_VSS=y" >> $config_host_mak
6570    echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
6571    echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
6572  fi
6573  if test "$guest_agent_ntddscsi" = "yes" ; then
6574    echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
6575  fi
6576  if test "$guest_agent_msi" = "yes"; then
6577    echo "QEMU_GA_MSI_ENABLED=yes" >> $config_host_mak
6578    echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
6579    echo "QEMU_GA_MSI_WITH_VSS=${QEMU_GA_MSI_WITH_VSS}" >> $config_host_mak
6580    echo "QEMU_GA_MSI_ARCH=${QEMU_GA_MSI_ARCH}" >> $config_host_mak
6581    echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
6582    echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
6583    echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
6584  fi
6585else
6586  echo "CONFIG_POSIX=y" >> $config_host_mak
6587fi
6588
6589if test "$linux" = "yes" ; then
6590  echo "CONFIG_LINUX=y" >> $config_host_mak
6591fi
6592
6593if test "$darwin" = "yes" ; then
6594  echo "CONFIG_DARWIN=y" >> $config_host_mak
6595fi
6596
6597if test "$solaris" = "yes" ; then
6598  echo "CONFIG_SOLARIS=y" >> $config_host_mak
6599fi
6600if test "$haiku" = "yes" ; then
6601  echo "CONFIG_HAIKU=y" >> $config_host_mak
6602fi
6603if test "$static" = "yes" ; then
6604  echo "CONFIG_STATIC=y" >> $config_host_mak
6605fi
6606if test "$profiler" = "yes" ; then
6607  echo "CONFIG_PROFILER=y" >> $config_host_mak
6608fi
6609if test "$want_tools" = "yes" ; then
6610  echo "CONFIG_TOOLS=y" >> $config_host_mak
6611fi
6612if test "$guest_agent" = "yes" ; then
6613  echo "CONFIG_GUEST_AGENT=y" >> $config_host_mak
6614fi
6615if test "$slirp" != "no"; then
6616  echo "CONFIG_SLIRP=y" >> $config_host_mak
6617  echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
6618  echo "SLIRP_CFLAGS=$slirp_cflags" >> $config_host_mak
6619  echo "SLIRP_LIBS=$slirp_libs" >> $config_host_mak
6620fi
6621subdirs=
6622if [ "$slirp" = "git" -o "$slirp" = "internal" ]; then
6623  subdirs="$subdirs slirp"
6624fi
6625if test "$vde" = "yes" ; then
6626  echo "CONFIG_VDE=y" >> $config_host_mak
6627  echo "VDE_LIBS=$vde_libs" >> $config_host_mak
6628fi
6629if test "$netmap" = "yes" ; then
6630  echo "CONFIG_NETMAP=y" >> $config_host_mak
6631fi
6632if test "$l2tpv3" = "yes" ; then
6633  echo "CONFIG_L2TPV3=y" >> $config_host_mak
6634fi
6635if test "$gprof" = "yes" ; then
6636  echo "CONFIG_GPROF=y" >> $config_host_mak
6637fi
6638if test "$cap_ng" = "yes" ; then
6639  echo "CONFIG_LIBCAP_NG=y" >> $config_host_mak
6640  echo "LIBCAP_NG_LIBS=$cap_libs" >> $config_host_mak
6641fi
6642echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
6643for drv in $audio_drv_list; do
6644    def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
6645    echo "$def=y" >> $config_host_mak
6646done
6647if test "$alsa" = "yes" ; then
6648    echo "CONFIG_ALSA=y" >> $config_host_mak
6649fi
6650echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak
6651echo "ALSA_CFLAGS=$alsa_cflags" >> $config_host_mak
6652if test "$libpulse" = "yes" ; then
6653    echo "CONFIG_LIBPULSE=y" >> $config_host_mak
6654fi
6655echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
6656echo "PULSE_CFLAGS=$pulse_cflags" >> $config_host_mak
6657echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak
6658echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak
6659echo "OSS_LIBS=$oss_libs" >> $config_host_mak
6660if test "$libjack" = "yes" ; then
6661    echo "CONFIG_LIBJACK=y" >> $config_host_mak
6662fi
6663echo "JACK_LIBS=$jack_libs" >> $config_host_mak
6664if test "$audio_win_int" = "yes" ; then
6665  echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
6666fi
6667echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
6668echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
6669if test "$xfs" = "yes" ; then
6670  echo "CONFIG_XFS=y" >> $config_host_mak
6671fi
6672qemu_version=$(head $source_path/VERSION)
6673echo "PKGVERSION=$pkgversion" >>$config_host_mak
6674echo "SRC_PATH=$source_path" >> $config_host_mak
6675echo "TARGET_DIRS=$target_list" >> $config_host_mak
6676if [ "$docs" = "yes" ] ; then
6677  echo "BUILD_DOCS=yes" >> $config_host_mak
6678fi
6679if test "$modules" = "yes"; then
6680  # $shacmd can generate a hash started with digit, which the compiler doesn't
6681  # like as an symbol. So prefix it with an underscore
6682  echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
6683  echo "CONFIG_MODULES=y" >> $config_host_mak
6684fi
6685if test "$module_upgrades" = "yes"; then
6686  echo "CONFIG_MODULE_UPGRADES=y" >> $config_host_mak
6687fi
6688if test "$have_x11" = "yes" && test "$need_x11" = "yes"; then
6689  echo "CONFIG_X11=y" >> $config_host_mak
6690  echo "X11_CFLAGS=$x11_cflags" >> $config_host_mak
6691  echo "X11_LIBS=$x11_libs" >> $config_host_mak
6692fi
6693if test "$cocoa" = "yes" ; then
6694  echo "CONFIG_COCOA=y" >> $config_host_mak
6695fi
6696if test "$iconv" = "yes" ; then
6697  echo "CONFIG_ICONV=y" >> $config_host_mak
6698  echo "ICONV_CFLAGS=$iconv_cflags" >> $config_host_mak
6699  echo "ICONV_LIBS=$iconv_lib" >> $config_host_mak
6700fi
6701if test "$curses" = "yes" ; then
6702  echo "CONFIG_CURSES=y" >> $config_host_mak
6703  echo "CURSES_CFLAGS=$curses_inc" >> $config_host_mak
6704  echo "CURSES_LIBS=$curses_lib" >> $config_host_mak
6705fi
6706if test "$pipe2" = "yes" ; then
6707  echo "CONFIG_PIPE2=y" >> $config_host_mak
6708fi
6709if test "$accept4" = "yes" ; then
6710  echo "CONFIG_ACCEPT4=y" >> $config_host_mak
6711fi
6712if test "$splice" = "yes" ; then
6713  echo "CONFIG_SPLICE=y" >> $config_host_mak
6714fi
6715if test "$eventfd" = "yes" ; then
6716  echo "CONFIG_EVENTFD=y" >> $config_host_mak
6717fi
6718if test "$memfd" = "yes" ; then
6719  echo "CONFIG_MEMFD=y" >> $config_host_mak
6720fi
6721if test "$have_usbfs" = "yes" ; then
6722  echo "CONFIG_USBFS=y" >> $config_host_mak
6723fi
6724if test "$fallocate" = "yes" ; then
6725  echo "CONFIG_FALLOCATE=y" >> $config_host_mak
6726fi
6727if test "$fallocate_punch_hole" = "yes" ; then
6728  echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
6729fi
6730if test "$fallocate_zero_range" = "yes" ; then
6731  echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak
6732fi
6733if test "$posix_fallocate" = "yes" ; then
6734  echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
6735fi
6736if test "$sync_file_range" = "yes" ; then
6737  echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
6738fi
6739if test "$fiemap" = "yes" ; then
6740  echo "CONFIG_FIEMAP=y" >> $config_host_mak
6741fi
6742if test "$dup3" = "yes" ; then
6743  echo "CONFIG_DUP3=y" >> $config_host_mak
6744fi
6745if test "$ppoll" = "yes" ; then
6746  echo "CONFIG_PPOLL=y" >> $config_host_mak
6747fi
6748if test "$prctl_pr_set_timerslack" = "yes" ; then
6749  echo "CONFIG_PRCTL_PR_SET_TIMERSLACK=y" >> $config_host_mak
6750fi
6751if test "$epoll" = "yes" ; then
6752  echo "CONFIG_EPOLL=y" >> $config_host_mak
6753fi
6754if test "$epoll_create1" = "yes" ; then
6755  echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
6756fi
6757if test "$sendfile" = "yes" ; then
6758  echo "CONFIG_SENDFILE=y" >> $config_host_mak
6759fi
6760if test "$timerfd" = "yes" ; then
6761  echo "CONFIG_TIMERFD=y" >> $config_host_mak
6762fi
6763if test "$setns" = "yes" ; then
6764  echo "CONFIG_SETNS=y" >> $config_host_mak
6765fi
6766if test "$clock_adjtime" = "yes" ; then
6767  echo "CONFIG_CLOCK_ADJTIME=y" >> $config_host_mak
6768fi
6769if test "$syncfs" = "yes" ; then
6770  echo "CONFIG_SYNCFS=y" >> $config_host_mak
6771fi
6772if test "$kcov" = "yes" ; then
6773  echo "CONFIG_KCOV=y" >> $config_host_mak
6774fi
6775if test "$btrfs" = "yes" ; then
6776  echo "CONFIG_BTRFS=y" >> $config_host_mak
6777fi
6778if test "$inotify" = "yes" ; then
6779  echo "CONFIG_INOTIFY=y" >> $config_host_mak
6780fi
6781if test "$inotify1" = "yes" ; then
6782  echo "CONFIG_INOTIFY1=y" >> $config_host_mak
6783fi
6784if test "$sem_timedwait" = "yes" ; then
6785  echo "CONFIG_SEM_TIMEDWAIT=y" >> $config_host_mak
6786fi
6787if test "$strchrnul" = "yes" ; then
6788  echo "HAVE_STRCHRNUL=y" >> $config_host_mak
6789fi
6790if test "$st_atim" = "yes" ; then
6791  echo "HAVE_STRUCT_STAT_ST_ATIM=y" >> $config_host_mak
6792fi
6793if test "$byteswap_h" = "yes" ; then
6794  echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
6795fi
6796if test "$bswap_h" = "yes" ; then
6797  echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
6798fi
6799if test "$curl" = "yes" ; then
6800  echo "CONFIG_CURL=y" >> $config_host_mak
6801  echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak
6802  echo "CURL_LIBS=$curl_libs" >> $config_host_mak
6803fi
6804if test "$brlapi" = "yes" ; then
6805  echo "CONFIG_BRLAPI=y" >> $config_host_mak
6806  echo "BRLAPI_LIBS=$brlapi_libs" >> $config_host_mak
6807fi
6808if test "$gtk" = "yes" ; then
6809  echo "CONFIG_GTK=y" >> $config_host_mak
6810  echo "GTK_CFLAGS=$gtk_cflags" >> $config_host_mak
6811  echo "GTK_LIBS=$gtk_libs" >> $config_host_mak
6812  if test "$gtk_gl" = "yes" ; then
6813    echo "CONFIG_GTK_GL=y" >> $config_host_mak
6814  fi
6815fi
6816if test "$gio" = "yes" ; then
6817    echo "CONFIG_GIO=y" >> $config_host_mak
6818    echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
6819    echo "GIO_LIBS=$gio_libs" >> $config_host_mak
6820    echo "GDBUS_CODEGEN=$gdbus_codegen" >> $config_host_mak
6821fi
6822echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
6823if test "$gnutls" = "yes" ; then
6824  echo "CONFIG_GNUTLS=y" >> $config_host_mak
6825  echo "GNUTLS_CFLAGS=$gnutls_cflags" >> $config_host_mak
6826  echo "GNUTLS_LIBS=$gnutls_libs" >> $config_host_mak
6827fi
6828if test "$gcrypt" = "yes" ; then
6829  echo "CONFIG_GCRYPT=y" >> $config_host_mak
6830  if test "$gcrypt_hmac" = "yes" ; then
6831    echo "CONFIG_GCRYPT_HMAC=y" >> $config_host_mak
6832  fi
6833  echo "GCRYPT_CFLAGS=$gcrypt_cflags" >> $config_host_mak
6834  echo "GCRYPT_LIBS=$gcrypt_libs" >> $config_host_mak
6835fi
6836if test "$nettle" = "yes" ; then
6837  echo "CONFIG_NETTLE=y" >> $config_host_mak
6838  echo "CONFIG_NETTLE_VERSION_MAJOR=${nettle_version%%.*}" >> $config_host_mak
6839  echo "NETTLE_CFLAGS=$nettle_cflags" >> $config_host_mak
6840  echo "NETTLE_LIBS=$nettle_libs" >> $config_host_mak
6841fi
6842if test "$qemu_private_xts" = "yes" ; then
6843  echo "CONFIG_QEMU_PRIVATE_XTS=y" >> $config_host_mak
6844fi
6845if test "$tasn1" = "yes" ; then
6846  echo "CONFIG_TASN1=y" >> $config_host_mak
6847fi
6848if test "$auth_pam" = "yes" ; then
6849    echo "CONFIG_AUTH_PAM=y" >> $config_host_mak
6850fi
6851if test "$have_ifaddrs_h" = "yes" ; then
6852    echo "HAVE_IFADDRS_H=y" >> $config_host_mak
6853fi
6854if test "$have_drm_h" = "yes" ; then
6855  echo "HAVE_DRM_H=y" >> $config_host_mak
6856fi
6857if test "$have_broken_size_max" = "yes" ; then
6858    echo "HAVE_BROKEN_SIZE_MAX=y" >> $config_host_mak
6859fi
6860if test "$have_openpty" = "yes" ; then
6861    echo "HAVE_OPENPTY=y" >> $config_host_mak
6862fi
6863if test "$have_sys_signal_h" = "yes" ; then
6864    echo "HAVE_SYS_SIGNAL_H=y" >> $config_host_mak
6865fi
6866
6867# Work around a system header bug with some kernel/XFS header
6868# versions where they both try to define 'struct fsxattr':
6869# xfs headers will not try to redefine structs from linux headers
6870# if this macro is set.
6871if test "$have_fsxattr" = "yes" ; then
6872    echo "HAVE_FSXATTR=y" >> $config_host_mak
6873fi
6874if test "$have_copy_file_range" = "yes" ; then
6875    echo "HAVE_COPY_FILE_RANGE=y" >> $config_host_mak
6876fi
6877if test "$vte" = "yes" ; then
6878  echo "CONFIG_VTE=y" >> $config_host_mak
6879  echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak
6880  echo "VTE_LIBS=$vte_libs" >> $config_host_mak
6881fi
6882if test "$virglrenderer" = "yes" ; then
6883  echo "CONFIG_VIRGL=y" >> $config_host_mak
6884  echo "VIRGL_CFLAGS=$virgl_cflags" >> $config_host_mak
6885  echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak
6886fi
6887if test "$xen" = "yes" ; then
6888  echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
6889  echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
6890  echo "XEN_CFLAGS=$xen_cflags" >> $config_host_mak
6891  echo "XEN_LIBS=$xen_libs" >> $config_host_mak
6892fi
6893if test "$linux_aio" = "yes" ; then
6894  echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
6895fi
6896if test "$linux_io_uring" = "yes" ; then
6897  echo "CONFIG_LINUX_IO_URING=y" >> $config_host_mak
6898  echo "LINUX_IO_URING_CFLAGS=$linux_io_uring_cflags" >> $config_host_mak
6899  echo "LINUX_IO_URING_LIBS=$linux_io_uring_libs" >> $config_host_mak
6900fi
6901if test "$attr" = "yes" ; then
6902  echo "CONFIG_ATTR=y" >> $config_host_mak
6903  echo "LIBATTR_LIBS=$libattr_libs" >> $config_host_mak
6904fi
6905if test "$libattr" = "yes" ; then
6906  echo "CONFIG_LIBATTR=y" >> $config_host_mak
6907fi
6908if test "$virtfs" = "yes" ; then
6909  echo "CONFIG_VIRTFS=y" >> $config_host_mak
6910fi
6911if test "$mpath" = "yes" ; then
6912  echo "CONFIG_MPATH=y" >> $config_host_mak
6913  if test "$mpathpersist_new_api" = "yes"; then
6914    echo "CONFIG_MPATH_NEW_API=y" >> $config_host_mak
6915  fi
6916fi
6917if test "$vhost_scsi" = "yes" ; then
6918  echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
6919fi
6920if test "$vhost_net" = "yes" ; then
6921  echo "CONFIG_VHOST_NET=y" >> $config_host_mak
6922fi
6923if test "$vhost_net_user" = "yes" ; then
6924  echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
6925fi
6926if test "$vhost_net_vdpa" = "yes" ; then
6927  echo "CONFIG_VHOST_NET_VDPA=y" >> $config_host_mak
6928fi
6929if test "$vhost_crypto" = "yes" ; then
6930  echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
6931fi
6932if test "$vhost_vsock" = "yes" ; then
6933  echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
6934  if test "$vhost_user" = "yes" ; then
6935    echo "CONFIG_VHOST_USER_VSOCK=y" >> $config_host_mak
6936  fi
6937fi
6938if test "$vhost_kernel" = "yes" ; then
6939  echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
6940fi
6941if test "$vhost_user" = "yes" ; then
6942  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
6943fi
6944if test "$vhost_vdpa" = "yes" ; then
6945  echo "CONFIG_VHOST_VDPA=y" >> $config_host_mak
6946fi
6947if test "$vhost_user_fs" = "yes" ; then
6948  echo "CONFIG_VHOST_USER_FS=y" >> $config_host_mak
6949fi
6950if test "$blobs" = "yes" ; then
6951  echo "INSTALL_BLOBS=yes" >> $config_host_mak
6952fi
6953if test "$iovec" = "yes" ; then
6954  echo "CONFIG_IOVEC=y" >> $config_host_mak
6955fi
6956if test "$preadv" = "yes" ; then
6957  echo "CONFIG_PREADV=y" >> $config_host_mak
6958fi
6959if test "$fdt" != "no" ; then
6960  echo "CONFIG_FDT=y" >> $config_host_mak
6961  echo "FDT_CFLAGS=$fdt_cflags" >> $config_host_mak
6962  echo "FDT_LIBS=$fdt_ldflags $fdt_libs" >> $config_host_mak
6963fi
6964if test "$membarrier" = "yes" ; then
6965  echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
6966fi
6967if test "$signalfd" = "yes" ; then
6968  echo "CONFIG_SIGNALFD=y" >> $config_host_mak
6969fi
6970if test "$optreset" = "yes" ; then
6971  echo "HAVE_OPTRESET=y" >> $config_host_mak
6972fi
6973if test "$tcg" = "yes"; then
6974  echo "CONFIG_TCG=y" >> $config_host_mak
6975  if test "$tcg_interpreter" = "yes" ; then
6976    echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
6977  fi
6978fi
6979if test "$fdatasync" = "yes" ; then
6980  echo "CONFIG_FDATASYNC=y" >> $config_host_mak
6981fi
6982if test "$madvise" = "yes" ; then
6983  echo "CONFIG_MADVISE=y" >> $config_host_mak
6984fi
6985if test "$posix_madvise" = "yes" ; then
6986  echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak
6987fi
6988if test "$posix_memalign" = "yes" ; then
6989  echo "CONFIG_POSIX_MEMALIGN=y" >> $config_host_mak
6990fi
6991if test "$spice" = "yes" ; then
6992  echo "CONFIG_SPICE=y" >> $config_host_mak
6993  echo "SPICE_CFLAGS=$spice_cflags" >> $config_host_mak
6994  echo "SPICE_LIBS=$spice_libs" >> $config_host_mak
6995fi
6996
6997if test "$smartcard" = "yes" ; then
6998  echo "CONFIG_SMARTCARD=y" >> $config_host_mak
6999  echo "SMARTCARD_CFLAGS=$libcacard_cflags" >> $config_host_mak
7000  echo "SMARTCARD_LIBS=$libcacard_libs" >> $config_host_mak
7001fi
7002
7003if test "$libusb" = "yes" ; then
7004  echo "CONFIG_USB_LIBUSB=y" >> $config_host_mak
7005  echo "LIBUSB_CFLAGS=$libusb_cflags" >> $config_host_mak
7006  echo "LIBUSB_LIBS=$libusb_libs" >> $config_host_mak
7007fi
7008
7009if test "$usb_redir" = "yes" ; then
7010  echo "CONFIG_USB_REDIR=y" >> $config_host_mak
7011  echo "USB_REDIR_CFLAGS=$usb_redir_cflags" >> $config_host_mak
7012  echo "USB_REDIR_LIBS=$usb_redir_libs" >> $config_host_mak
7013fi
7014
7015if test "$opengl" = "yes" ; then
7016  echo "CONFIG_OPENGL=y" >> $config_host_mak
7017  echo "OPENGL_CFLAGS=$opengl_cflags" >> $config_host_mak
7018  echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
7019  if test "$opengl_dmabuf" = "yes" ; then
7020    echo "CONFIG_OPENGL_DMABUF=y" >> $config_host_mak
7021  fi
7022fi
7023
7024if test "$gbm" = "yes" ; then
7025    echo "CONFIG_GBM=y" >> $config_host_mak
7026    echo "GBM_LIBS=$gbm_libs" >> $config_host_mak
7027    echo "GBM_CFLAGS=$gbm_cflags" >> $config_host_mak
7028fi
7029
7030
7031if test "$malloc_trim" = "yes" ; then
7032  echo "CONFIG_MALLOC_TRIM=y" >> $config_host_mak
7033fi
7034
7035if test "$avx2_opt" = "yes" ; then
7036  echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
7037fi
7038
7039if test "$avx512f_opt" = "yes" ; then
7040  echo "CONFIG_AVX512F_OPT=y" >> $config_host_mak
7041fi
7042
7043if test "$lzo" = "yes" ; then
7044  echo "CONFIG_LZO=y" >> $config_host_mak
7045  echo "LZO_LIBS=$lzo_libs" >> $config_host_mak
7046fi
7047
7048if test "$snappy" = "yes" ; then
7049  echo "CONFIG_SNAPPY=y" >> $config_host_mak
7050  echo "SNAPPY_LIBS=$snappy_libs" >> $config_host_mak
7051fi
7052
7053if test "$bzip2" = "yes" ; then
7054  echo "CONFIG_BZIP2=y" >> $config_host_mak
7055  echo "BZIP2_LIBS=-lbz2" >> $config_host_mak
7056fi
7057
7058if test "$lzfse" = "yes" ; then
7059  echo "CONFIG_LZFSE=y" >> $config_host_mak
7060  echo "LZFSE_LIBS=-llzfse" >> $config_host_mak
7061fi
7062
7063if test "$zstd" = "yes" ; then
7064  echo "CONFIG_ZSTD=y" >> $config_host_mak
7065  echo "ZSTD_CFLAGS=$zstd_cflags" >> $config_host_mak
7066  echo "ZSTD_LIBS=$zstd_libs" >> $config_host_mak
7067fi
7068
7069if test "$libiscsi" = "yes" ; then
7070  echo "CONFIG_LIBISCSI=y" >> $config_host_mak
7071  echo "LIBISCSI_CFLAGS=$libiscsi_cflags" >> $config_host_mak
7072  echo "LIBISCSI_LIBS=$libiscsi_libs" >> $config_host_mak
7073fi
7074
7075if test "$libnfs" = "yes" ; then
7076  echo "CONFIG_LIBNFS=y" >> $config_host_mak
7077  echo "LIBNFS_LIBS=$libnfs_libs" >> $config_host_mak
7078fi
7079
7080if test "$seccomp" = "yes"; then
7081  echo "CONFIG_SECCOMP=y" >> $config_host_mak
7082  echo "SECCOMP_CFLAGS=$seccomp_cflags" >> $config_host_mak
7083  echo "SECCOMP_LIBS=$seccomp_libs" >> $config_host_mak
7084fi
7085
7086# XXX: suppress that
7087if [ "$bsd" = "yes" ] ; then
7088  echo "CONFIG_BSD=y" >> $config_host_mak
7089fi
7090
7091if test "$localtime_r" = "yes" ; then
7092  echo "CONFIG_LOCALTIME_R=y" >> $config_host_mak
7093fi
7094if test "$qom_cast_debug" = "yes" ; then
7095  echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
7096fi
7097if test "$rbd" = "yes" ; then
7098  echo "CONFIG_RBD=y" >> $config_host_mak
7099  echo "RBD_LIBS=$rbd_libs" >> $config_host_mak
7100fi
7101
7102echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
7103if test "$coroutine_pool" = "yes" ; then
7104  echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
7105else
7106  echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
7107fi
7108
7109if test "$debug_stack_usage" = "yes" ; then
7110  echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
7111fi
7112
7113if test "$crypto_afalg" = "yes" ; then
7114  echo "CONFIG_AF_ALG=y" >> $config_host_mak
7115fi
7116
7117if test "$open_by_handle_at" = "yes" ; then
7118  echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
7119fi
7120
7121if test "$linux_magic_h" = "yes" ; then
7122  echo "CONFIG_LINUX_MAGIC_H=y" >> $config_host_mak
7123fi
7124
7125if test "$valgrind_h" = "yes" ; then
7126  echo "CONFIG_VALGRIND_H=y" >> $config_host_mak
7127fi
7128
7129if test "$have_asan_iface_fiber" = "yes" ; then
7130    echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
7131fi
7132
7133if test "$have_tsan" = "yes" && test "$have_tsan_iface_fiber" = "yes" ; then
7134    echo "CONFIG_TSAN=y" >> $config_host_mak
7135fi
7136
7137if test "$has_environ" = "yes" ; then
7138  echo "CONFIG_HAS_ENVIRON=y" >> $config_host_mak
7139fi
7140
7141if test "$cpuid_h" = "yes" ; then
7142  echo "CONFIG_CPUID_H=y" >> $config_host_mak
7143fi
7144
7145if test "$int128" = "yes" ; then
7146  echo "CONFIG_INT128=y" >> $config_host_mak
7147fi
7148
7149if test "$atomic128" = "yes" ; then
7150  echo "CONFIG_ATOMIC128=y" >> $config_host_mak
7151fi
7152
7153if test "$cmpxchg128" = "yes" ; then
7154  echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
7155fi
7156
7157if test "$atomic64" = "yes" ; then
7158  echo "CONFIG_ATOMIC64=y" >> $config_host_mak
7159fi
7160
7161if test "$attralias" = "yes" ; then
7162  echo "CONFIG_ATTRIBUTE_ALIAS=y" >> $config_host_mak
7163fi
7164
7165if test "$getauxval" = "yes" ; then
7166  echo "CONFIG_GETAUXVAL=y" >> $config_host_mak
7167fi
7168
7169if test "$glusterfs" = "yes" ; then
7170  echo "CONFIG_GLUSTERFS=y" >> $config_host_mak
7171  echo "GLUSTERFS_CFLAGS=$glusterfs_cflags" >> $config_host_mak
7172  echo "GLUSTERFS_LIBS=$glusterfs_libs" >> $config_host_mak
7173fi
7174
7175if test "$glusterfs_xlator_opt" = "yes" ; then
7176  echo "CONFIG_GLUSTERFS_XLATOR_OPT=y" >> $config_host_mak
7177fi
7178
7179if test "$glusterfs_discard" = "yes" ; then
7180  echo "CONFIG_GLUSTERFS_DISCARD=y" >> $config_host_mak
7181fi
7182
7183if test "$glusterfs_fallocate" = "yes" ; then
7184  echo "CONFIG_GLUSTERFS_FALLOCATE=y" >> $config_host_mak
7185fi
7186
7187if test "$glusterfs_zerofill" = "yes" ; then
7188  echo "CONFIG_GLUSTERFS_ZEROFILL=y" >> $config_host_mak
7189fi
7190
7191if test "$glusterfs_ftruncate_has_stat" = "yes" ; then
7192  echo "CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT=y" >> $config_host_mak
7193fi
7194
7195if test "$glusterfs_iocb_has_stat" = "yes" ; then
7196  echo "CONFIG_GLUSTERFS_IOCB_HAS_STAT=y" >> $config_host_mak
7197fi
7198
7199if test "$libssh" = "yes" ; then
7200  echo "CONFIG_LIBSSH=y" >> $config_host_mak
7201  echo "LIBSSH_CFLAGS=$libssh_cflags" >> $config_host_mak
7202  echo "LIBSSH_LIBS=$libssh_libs" >> $config_host_mak
7203fi
7204
7205if test "$live_block_migration" = "yes" ; then
7206  echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
7207fi
7208
7209if test "$tpm" = "yes"; then
7210  echo 'CONFIG_TPM=y' >> $config_host_mak
7211fi
7212
7213echo "TRACE_BACKENDS=$trace_backends" >> $config_host_mak
7214if have_backend "nop"; then
7215  echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
7216fi
7217if have_backend "simple"; then
7218  echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
7219  # Set the appropriate trace file.
7220  trace_file="\"$trace_file-\" FMT_pid"
7221fi
7222if have_backend "log"; then
7223  echo "CONFIG_TRACE_LOG=y" >> $config_host_mak
7224fi
7225if have_backend "ust"; then
7226  echo "CONFIG_TRACE_UST=y" >> $config_host_mak
7227  echo "LTTNG_UST_LIBS=$lttng_ust_libs" >> $config_host_mak
7228  echo "URCU_BP_LIBS=$urcu_bp_libs" >> $config_host_mak
7229fi
7230if have_backend "dtrace"; then
7231  echo "CONFIG_TRACE_DTRACE=y" >> $config_host_mak
7232  if test "$trace_backend_stap" = "yes" ; then
7233    echo "CONFIG_TRACE_SYSTEMTAP=y" >> $config_host_mak
7234  fi
7235fi
7236if have_backend "ftrace"; then
7237  if test "$linux" = "yes" ; then
7238    echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak
7239  else
7240    feature_not_found "ftrace(trace backend)" "ftrace requires Linux"
7241  fi
7242fi
7243if have_backend "syslog"; then
7244  if test "$posix_syslog" = "yes" ; then
7245    echo "CONFIG_TRACE_SYSLOG=y" >> $config_host_mak
7246  else
7247    feature_not_found "syslog(trace backend)" "syslog not available"
7248  fi
7249fi
7250echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
7251
7252if test "$rdma" = "yes" ; then
7253  echo "CONFIG_RDMA=y" >> $config_host_mak
7254  echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
7255fi
7256
7257if test "$pvrdma" = "yes" ; then
7258  echo "CONFIG_PVRDMA=y" >> $config_host_mak
7259fi
7260
7261if test "$have_rtnetlink" = "yes" ; then
7262  echo "CONFIG_RTNETLINK=y" >> $config_host_mak
7263fi
7264
7265if test "$libxml2" = "yes" ; then
7266  echo "CONFIG_LIBXML2=y" >> $config_host_mak
7267  echo "LIBXML2_CFLAGS=$libxml2_cflags" >> $config_host_mak
7268  echo "LIBXML2_LIBS=$libxml2_libs" >> $config_host_mak
7269fi
7270
7271if test "$replication" = "yes" ; then
7272  echo "CONFIG_REPLICATION=y" >> $config_host_mak
7273fi
7274
7275if test "$have_af_vsock" = "yes" ; then
7276  echo "CONFIG_AF_VSOCK=y" >> $config_host_mak
7277fi
7278
7279if test "$have_sysmacros" = "yes" ; then
7280  echo "CONFIG_SYSMACROS=y" >> $config_host_mak
7281fi
7282
7283if test "$have_static_assert" = "yes" ; then
7284  echo "CONFIG_STATIC_ASSERT=y" >> $config_host_mak
7285fi
7286
7287if test "$have_utmpx" = "yes" ; then
7288  echo "HAVE_UTMPX=y" >> $config_host_mak
7289fi
7290if test "$have_getrandom" = "yes" ; then
7291  echo "CONFIG_GETRANDOM=y" >> $config_host_mak
7292fi
7293if test "$ivshmem" = "yes" ; then
7294  echo "CONFIG_IVSHMEM=y" >> $config_host_mak
7295fi
7296if test "$capstone" != "no" ; then
7297  echo "CONFIG_CAPSTONE=y" >> $config_host_mak
7298  echo "CAPSTONE_CFLAGS=$capstone_cflags" >> $config_host_mak
7299  echo "CAPSTONE_LIBS=$capstone_libs" >> $config_host_mak
7300fi
7301if test "$debug_mutex" = "yes" ; then
7302  echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
7303fi
7304
7305# Hold two types of flag:
7306#   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
7307#                                     a thread we have a handle to
7308#   CONFIG_PTHREAD_SETNAME_NP_W_TID - A way of doing it on a particular
7309#                                     platform
7310if test "$pthread_setname_np_w_tid" = "yes" ; then
7311  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
7312  echo "CONFIG_PTHREAD_SETNAME_NP_W_TID=y" >> $config_host_mak
7313elif test "$pthread_setname_np_wo_tid" = "yes" ; then
7314  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
7315  echo "CONFIG_PTHREAD_SETNAME_NP_WO_TID=y" >> $config_host_mak
7316fi
7317
7318if test "$libpmem" = "yes" ; then
7319  echo "CONFIG_LIBPMEM=y" >> $config_host_mak
7320  echo "LIBPMEM_LIBS=$libpmem_libs" >> $config_host_mak
7321  echo "LIBPMEM_CFLAGS=$libpmem_cflags" >> $config_host_mak
7322fi
7323
7324if test "$libdaxctl" = "yes" ; then
7325  echo "CONFIG_LIBDAXCTL=y" >> $config_host_mak
7326  echo "LIBDAXCTL_LIBS=$libdaxctl_libs" >> $config_host_mak
7327fi
7328
7329if test "$bochs" = "yes" ; then
7330  echo "CONFIG_BOCHS=y" >> $config_host_mak
7331fi
7332if test "$cloop" = "yes" ; then
7333  echo "CONFIG_CLOOP=y" >> $config_host_mak
7334fi
7335if test "$dmg" = "yes" ; then
7336  echo "CONFIG_DMG=y" >> $config_host_mak
7337fi
7338if test "$qcow1" = "yes" ; then
7339  echo "CONFIG_QCOW1=y" >> $config_host_mak
7340fi
7341if test "$vdi" = "yes" ; then
7342  echo "CONFIG_VDI=y" >> $config_host_mak
7343fi
7344if test "$vvfat" = "yes" ; then
7345  echo "CONFIG_VVFAT=y" >> $config_host_mak
7346fi
7347if test "$qed" = "yes" ; then
7348  echo "CONFIG_QED=y" >> $config_host_mak
7349fi
7350if test "$parallels" = "yes" ; then
7351  echo "CONFIG_PARALLELS=y" >> $config_host_mak
7352fi
7353if test "$sheepdog" = "yes" ; then
7354  echo "CONFIG_SHEEPDOG=y" >> $config_host_mak
7355fi
7356if test "$pty_h" = "yes" ; then
7357  echo "HAVE_PTY_H=y" >> $config_host_mak
7358fi
7359if test "$have_mlockall" = "yes" ; then
7360  echo "HAVE_MLOCKALL=y" >> $config_host_mak
7361fi
7362if test "$fuzzing" = "yes" ; then
7363  # If LIB_FUZZING_ENGINE is set, assume we are running on OSS-Fuzz, and the
7364  # needed CFLAGS have already been provided
7365  if test -z "${LIB_FUZZING_ENGINE+xxx}" ; then
7366    QEMU_CFLAGS="$QEMU_CFLAGS -fsanitize=fuzzer-no-link"
7367    FUZZ_EXE_LDFLAGS="-fsanitize=fuzzer"
7368  else
7369    FUZZ_EXE_LDFLAGS="$LIB_FUZZING_ENGINE"
7370  fi
7371fi
7372
7373if test "$plugins" = "yes" ; then
7374    echo "CONFIG_PLUGIN=y" >> $config_host_mak
7375    # Copy the export object list to the build dir
7376    if test "$ld_dynamic_list" = "yes" ; then
7377	echo "CONFIG_HAS_LD_DYNAMIC_LIST=yes" >> $config_host_mak
7378	ld_symbols=qemu-plugins-ld.symbols
7379	cp "$source_path/plugins/qemu-plugins.symbols" $ld_symbols
7380    elif test "$ld_exported_symbols_list" = "yes" ; then
7381	echo "CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST=yes" >> $config_host_mak
7382	ld64_symbols=qemu-plugins-ld64.symbols
7383	echo "# Automatically generated by configure - do not modify" > $ld64_symbols
7384	grep 'qemu_' "$source_path/plugins/qemu-plugins.symbols" | sed 's/;//g' | \
7385	    sed -E 's/^[[:space:]]*(.*)/_\1/' >> $ld64_symbols
7386    else
7387	error_exit \
7388	    "If \$plugins=yes, either \$ld_dynamic_list or " \
7389	    "\$ld_exported_symbols_list should have been set to 'yes'."
7390    fi
7391fi
7392
7393if test -n "$gdb_bin" ; then
7394    echo "HAVE_GDB_BIN=$gdb_bin" >> $config_host_mak
7395fi
7396
7397if test "$secret_keyring" = "yes" ; then
7398  echo "CONFIG_SECRET_KEYRING=y" >> $config_host_mak
7399fi
7400
7401if test "$tcg_interpreter" = "yes"; then
7402  QEMU_INCLUDES="-iquote ${source_path}/tcg/tci $QEMU_INCLUDES"
7403elif test "$ARCH" = "sparc64" ; then
7404  QEMU_INCLUDES="-iquote ${source_path}/tcg/sparc $QEMU_INCLUDES"
7405elif test "$ARCH" = "s390x" ; then
7406  QEMU_INCLUDES="-iquote ${source_path}/tcg/s390 $QEMU_INCLUDES"
7407elif test "$ARCH" = "x86_64" || test "$ARCH" = "x32" ; then
7408  QEMU_INCLUDES="-iquote ${source_path}/tcg/i386 $QEMU_INCLUDES"
7409elif test "$ARCH" = "ppc64" ; then
7410  QEMU_INCLUDES="-iquote ${source_path}/tcg/ppc $QEMU_INCLUDES"
7411elif test "$ARCH" = "riscv32" || test "$ARCH" = "riscv64" ; then
7412  QEMU_INCLUDES="-I${source_path}/tcg/riscv $QEMU_INCLUDES"
7413else
7414  QEMU_INCLUDES="-iquote ${source_path}/tcg/${ARCH} $QEMU_INCLUDES"
7415fi
7416
7417echo "ROMS=$roms" >> $config_host_mak
7418echo "MAKE=$make" >> $config_host_mak
7419echo "PYTHON=$python" >> $config_host_mak
7420echo "SPHINX_BUILD=$sphinx_build" >> $config_host_mak
7421echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
7422echo "MESON=$meson" >> $config_host_mak
7423echo "CC=$cc" >> $config_host_mak
7424if $iasl -h > /dev/null 2>&1; then
7425  echo "CONFIG_IASL=$iasl" >> $config_host_mak
7426fi
7427echo "CXX=$cxx" >> $config_host_mak
7428echo "OBJCC=$objcc" >> $config_host_mak
7429echo "AR=$ar" >> $config_host_mak
7430echo "ARFLAGS=$ARFLAGS" >> $config_host_mak
7431echo "AS=$as" >> $config_host_mak
7432echo "CCAS=$ccas" >> $config_host_mak
7433echo "CPP=$cpp" >> $config_host_mak
7434echo "OBJCOPY=$objcopy" >> $config_host_mak
7435echo "LD=$ld" >> $config_host_mak
7436echo "RANLIB=$ranlib" >> $config_host_mak
7437echo "NM=$nm" >> $config_host_mak
7438echo "PKG_CONFIG=$pkg_config_exe" >> $config_host_mak
7439echo "WINDRES=$windres" >> $config_host_mak
7440echo "CFLAGS=$CFLAGS" >> $config_host_mak
7441echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
7442echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
7443echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
7444echo "QEMU_INCLUDES=$QEMU_INCLUDES" >> $config_host_mak
7445echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
7446echo "GLIB_LIBS=$glib_libs" >> $config_host_mak
7447if test "$sparse" = "yes" ; then
7448  echo "SPARSE_CFLAGS = -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-non-pointer-null" >> $config_host_mak
7449fi
7450echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
7451echo "LDFLAGS_NOPIE=$LDFLAGS_NOPIE" >> $config_host_mak
7452echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
7453echo "PTHREAD_LIB=$PTHREAD_LIB" >> $config_host_mak
7454echo "EXESUF=$EXESUF" >> $config_host_mak
7455echo "HOST_DSOSUF=$HOST_DSOSUF" >> $config_host_mak
7456echo "LIBS_QGA=$libs_qga" >> $config_host_mak
7457echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak
7458echo "TASN1_CFLAGS=$tasn1_cflags" >> $config_host_mak
7459echo "POD2MAN=$POD2MAN" >> $config_host_mak
7460if test "$gcov" = "yes" ; then
7461  echo "CONFIG_GCOV=y" >> $config_host_mak
7462fi
7463
7464if test "$libudev" != "no"; then
7465    echo "CONFIG_LIBUDEV=y" >> $config_host_mak
7466    echo "LIBUDEV_LIBS=$libudev_libs" >> $config_host_mak
7467fi
7468if test "$fuzzing" != "no"; then
7469    echo "CONFIG_FUZZ=y" >> $config_host_mak
7470fi
7471echo "FUZZ_EXE_LDFLAGS=$FUZZ_EXE_LDFLAGS" >> $config_host_mak
7472
7473if test "$edk2_blobs" = "yes" ; then
7474  echo "DECOMPRESS_EDK2_BLOBS=y" >> $config_host_mak
7475fi
7476
7477if test "$rng_none" = "yes"; then
7478  echo "CONFIG_RNG_NONE=y" >> $config_host_mak
7479fi
7480
7481# use included Linux headers
7482if test "$linux" = "yes" ; then
7483  mkdir -p linux-headers
7484  case "$cpu" in
7485  i386|x86_64|x32)
7486    linux_arch=x86
7487    ;;
7488  ppc|ppc64|ppc64le)
7489    linux_arch=powerpc
7490    ;;
7491  s390x)
7492    linux_arch=s390
7493    ;;
7494  aarch64)
7495    linux_arch=arm64
7496    ;;
7497  mips64)
7498    linux_arch=mips
7499    ;;
7500  *)
7501    # For most CPUs the kernel architecture name and QEMU CPU name match.
7502    linux_arch="$cpu"
7503    ;;
7504  esac
7505    # For non-KVM architectures we will not have asm headers
7506    if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
7507      symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
7508    fi
7509fi
7510
7511for target in $target_list; do
7512target_dir="$target"
7513config_target_mak=$target_dir/config-target.mak
7514target_name=$(echo $target | cut -d '-' -f 1)
7515target_aligned_only="no"
7516case "$target_name" in
7517  alpha|hppa|mips64el|mips64|mipsel|mips|mipsn32|mipsn32el|sh4|sh4eb|sparc|sparc64|sparc32plus|xtensa|xtensaeb)
7518  target_aligned_only="yes"
7519  ;;
7520esac
7521target_bigendian="no"
7522case "$target_name" in
7523  armeb|aarch64_be|hppa|lm32|m68k|microblaze|mips|mipsn32|mips64|moxie|or1k|ppc|ppc64|ppc64abi32|s390x|sh4eb|sparc|sparc64|sparc32plus|xtensaeb)
7524  target_bigendian="yes"
7525  ;;
7526esac
7527target_softmmu="no"
7528target_user_only="no"
7529target_linux_user="no"
7530target_bsd_user="no"
7531case "$target" in
7532  ${target_name}-softmmu)
7533    target_softmmu="yes"
7534    ;;
7535  ${target_name}-linux-user)
7536    target_user_only="yes"
7537    target_linux_user="yes"
7538    ;;
7539  ${target_name}-bsd-user)
7540    target_user_only="yes"
7541    target_bsd_user="yes"
7542    ;;
7543  *)
7544    error_exit "Target '$target' not recognised"
7545    exit 1
7546    ;;
7547esac
7548
7549mkdir -p $target_dir
7550echo "# Automatically generated by configure - do not modify" > $config_target_mak
7551
7552bflt="no"
7553mttcg="no"
7554interp_prefix1=$(echo "$interp_prefix" | sed "s/%M/$target_name/g")
7555gdb_xml_files=""
7556
7557TARGET_ARCH="$target_name"
7558TARGET_BASE_ARCH=""
7559TARGET_ABI_DIR=""
7560TARGET_SYSTBL_ABI=""
7561TARGET_SYSTBL=""
7562
7563case "$target_name" in
7564  i386)
7565    mttcg="yes"
7566    gdb_xml_files="i386-32bit.xml"
7567    TARGET_SYSTBL_ABI=i386
7568    TARGET_SYSTBL=syscall_32.tbl
7569  ;;
7570  x86_64)
7571    TARGET_BASE_ARCH=i386
7572    TARGET_SYSTBL_ABI=common,64
7573    TARGET_SYSTBL=syscall_64.tbl
7574    mttcg="yes"
7575    gdb_xml_files="i386-64bit.xml"
7576  ;;
7577  alpha)
7578    mttcg="yes"
7579    TARGET_SYSTBL_ABI=common
7580  ;;
7581  arm|armeb)
7582    TARGET_ARCH=arm
7583    TARGET_SYSTBL_ABI=common,oabi
7584    bflt="yes"
7585    mttcg="yes"
7586    gdb_xml_files="arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml arm-m-profile.xml"
7587  ;;
7588  aarch64|aarch64_be)
7589    TARGET_ARCH=aarch64
7590    TARGET_BASE_ARCH=arm
7591    bflt="yes"
7592    mttcg="yes"
7593    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"
7594  ;;
7595  avr)
7596    gdb_xml_files="avr-cpu.xml"
7597    target_compiler=$cross_cc_avr
7598  ;;
7599  cris)
7600  ;;
7601  hppa)
7602    mttcg="yes"
7603    TARGET_SYSTBL_ABI=common,32
7604  ;;
7605  lm32)
7606  ;;
7607  m68k)
7608    bflt="yes"
7609    gdb_xml_files="cf-core.xml cf-fp.xml m68k-core.xml m68k-fp.xml"
7610    TARGET_SYSTBL_ABI=common
7611  ;;
7612  microblaze|microblazeel)
7613    TARGET_ARCH=microblaze
7614    TARGET_SYSTBL_ABI=common
7615    mttcg="yes"
7616    bflt="yes"
7617  ;;
7618  mips|mipsel)
7619    mttcg="yes"
7620    TARGET_ARCH=mips
7621    echo "TARGET_ABI_MIPSO32=y" >> $config_target_mak
7622    TARGET_SYSTBL_ABI=o32
7623    TARGET_SYSTBL=syscall_o32.tbl
7624  ;;
7625  mipsn32|mipsn32el)
7626    mttcg="yes"
7627    TARGET_ARCH=mips64
7628    TARGET_BASE_ARCH=mips
7629    echo "TARGET_ABI_MIPSN32=y" >> $config_target_mak
7630    echo "TARGET_ABI32=y" >> $config_target_mak
7631    TARGET_SYSTBL_ABI=n32
7632    TARGET_SYSTBL=syscall_n32.tbl
7633  ;;
7634  mips64|mips64el)
7635    mttcg="no"
7636    TARGET_ARCH=mips64
7637    TARGET_BASE_ARCH=mips
7638    echo "TARGET_ABI_MIPSN64=y" >> $config_target_mak
7639    TARGET_SYSTBL_ABI=n64
7640    TARGET_SYSTBL=syscall_n64.tbl
7641  ;;
7642  moxie)
7643  ;;
7644  nios2)
7645  ;;
7646  or1k)
7647    TARGET_ARCH=openrisc
7648    TARGET_BASE_ARCH=openrisc
7649  ;;
7650  ppc)
7651    gdb_xml_files="power-core.xml power-fpu.xml power-altivec.xml power-spe.xml"
7652    TARGET_SYSTBL_ABI=common,nospu,32
7653  ;;
7654  ppc64)
7655    TARGET_BASE_ARCH=ppc
7656    TARGET_ABI_DIR=ppc
7657    TARGET_SYSTBL_ABI=common,nospu,64
7658    mttcg=yes
7659    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
7660  ;;
7661  ppc64le)
7662    TARGET_ARCH=ppc64
7663    TARGET_BASE_ARCH=ppc
7664    TARGET_ABI_DIR=ppc
7665    TARGET_SYSTBL_ABI=common,nospu,64
7666    mttcg=yes
7667    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
7668  ;;
7669  ppc64abi32)
7670    TARGET_ARCH=ppc64
7671    TARGET_BASE_ARCH=ppc
7672    TARGET_ABI_DIR=ppc
7673    TARGET_SYSTBL_ABI=common,nospu,32
7674    echo "TARGET_ABI32=y" >> $config_target_mak
7675    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
7676  ;;
7677  riscv32)
7678    TARGET_BASE_ARCH=riscv
7679    TARGET_ABI_DIR=riscv
7680    mttcg=yes
7681    gdb_xml_files="riscv-32bit-cpu.xml riscv-32bit-fpu.xml riscv-64bit-fpu.xml riscv-32bit-csr.xml riscv-32bit-virtual.xml"
7682  ;;
7683  riscv64)
7684    TARGET_BASE_ARCH=riscv
7685    TARGET_ABI_DIR=riscv
7686    mttcg=yes
7687    gdb_xml_files="riscv-64bit-cpu.xml riscv-32bit-fpu.xml riscv-64bit-fpu.xml riscv-64bit-csr.xml riscv-64bit-virtual.xml"
7688  ;;
7689  rx)
7690    TARGET_ARCH=rx
7691    bflt="yes"
7692    target_compiler=$cross_cc_rx
7693    gdb_xml_files="rx-core.xml"
7694  ;;
7695  sh4|sh4eb)
7696    TARGET_ARCH=sh4
7697    TARGET_SYSTBL_ABI=common
7698    bflt="yes"
7699  ;;
7700  sparc)
7701    TARGET_SYSTBL_ABI=common,32
7702  ;;
7703  sparc64)
7704    TARGET_BASE_ARCH=sparc
7705    TARGET_SYSTBL_ABI=common,64
7706  ;;
7707  sparc32plus)
7708    TARGET_ARCH=sparc64
7709    TARGET_BASE_ARCH=sparc
7710    TARGET_ABI_DIR=sparc
7711    TARGET_SYSTBL_ABI=common,32
7712    echo "TARGET_ABI32=y" >> $config_target_mak
7713  ;;
7714  s390x)
7715    TARGET_SYSTBL_ABI=common,64
7716    mttcg=yes
7717    gdb_xml_files="s390x-core64.xml s390-acr.xml s390-fpr.xml s390-vx.xml s390-cr.xml s390-virt.xml s390-gs.xml"
7718  ;;
7719  tilegx)
7720  ;;
7721  tricore)
7722  ;;
7723  unicore32)
7724  ;;
7725  xtensa|xtensaeb)
7726    TARGET_ARCH=xtensa
7727    TARGET_SYSTBL_ABI=common
7728    bflt="yes"
7729    mttcg="yes"
7730  ;;
7731  *)
7732    error_exit "Unsupported target CPU"
7733  ;;
7734esac
7735# TARGET_BASE_ARCH needs to be defined after TARGET_ARCH
7736if [ "$TARGET_BASE_ARCH" = "" ]; then
7737  TARGET_BASE_ARCH=$TARGET_ARCH
7738fi
7739if [ "$TARGET_SYSTBL_ABI" != "" ] && [ "$TARGET_SYSTBL" = "" ]; then
7740  TARGET_SYSTBL=syscall.tbl
7741fi
7742
7743upper() {
7744    echo "$@"| LC_ALL=C tr '[a-z]' '[A-Z]'
7745}
7746
7747target_arch_name="$(upper $TARGET_ARCH)"
7748echo "TARGET_$target_arch_name=y" >> $config_target_mak
7749echo "TARGET_NAME=$target_name" >> $config_target_mak
7750echo "TARGET_BASE_ARCH=$TARGET_BASE_ARCH" >> $config_target_mak
7751if [ "$TARGET_ABI_DIR" = "" ]; then
7752  TARGET_ABI_DIR=$TARGET_ARCH
7753fi
7754echo "TARGET_ABI_DIR=$TARGET_ABI_DIR" >> $config_target_mak
7755if [ "$HOST_VARIANT_DIR" != "" ]; then
7756    echo "HOST_VARIANT_DIR=$HOST_VARIANT_DIR" >> $config_target_mak
7757fi
7758if [ "$TARGET_SYSTBL_ABI" != "" ]; then
7759    echo "TARGET_SYSTBL_ABI=$TARGET_SYSTBL_ABI" >> $config_target_mak
7760    echo "TARGET_SYSTBL=$TARGET_SYSTBL" >> $config_target_mak
7761fi
7762
7763if supported_xen_target $target; then
7764    echo "CONFIG_XEN=y" >> $config_target_mak
7765    if test "$xen_pci_passthrough" = yes; then
7766        echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak"
7767    fi
7768fi
7769if supported_kvm_target $target; then
7770    echo "CONFIG_KVM=y" >> $config_target_mak
7771fi
7772if supported_hax_target $target; then
7773    echo "CONFIG_HAX=y" >> $config_target_mak
7774fi
7775if supported_hvf_target $target; then
7776    echo "CONFIG_HVF=y" >> $config_target_mak
7777fi
7778if supported_whpx_target $target; then
7779    echo "CONFIG_WHPX=y" >> $config_target_mak
7780fi
7781if test "$target_aligned_only" = "yes" ; then
7782  echo "TARGET_ALIGNED_ONLY=y" >> $config_target_mak
7783fi
7784if test "$target_bigendian" = "yes" ; then
7785  echo "TARGET_WORDS_BIGENDIAN=y" >> $config_target_mak
7786fi
7787if test "$target_softmmu" = "yes" ; then
7788  echo "CONFIG_SOFTMMU=y" >> $config_target_mak
7789  if test "$mttcg" = "yes" ; then
7790    echo "TARGET_SUPPORTS_MTTCG=y" >> $config_target_mak
7791  fi
7792fi
7793if test "$target_user_only" = "yes" ; then
7794  echo "CONFIG_USER_ONLY=y" >> $config_target_mak
7795  echo "CONFIG_QEMU_INTERP_PREFIX=\"$interp_prefix1\"" >> $config_target_mak
7796  symlink "../qemu-$target_name" "$target_dir/qemu-$target_name"
7797else
7798  symlink "../qemu-system-$target_name" "$target_dir/qemu-system-$target_name"
7799fi
7800if test "$target_linux_user" = "yes" ; then
7801  echo "CONFIG_LINUX_USER=y" >> $config_target_mak
7802fi
7803list=""
7804if test ! -z "$gdb_xml_files" ; then
7805  for x in $gdb_xml_files; do
7806    list="$list gdb-xml/$x"
7807  done
7808  echo "TARGET_XML_FILES=$list" >> $config_target_mak
7809fi
7810
7811if test "$target_user_only" = "yes" && test "$bflt" = "yes"; then
7812  echo "TARGET_HAS_BFLT=y" >> $config_target_mak
7813fi
7814if test "$target_bsd_user" = "yes" ; then
7815  echo "CONFIG_BSD_USER=y" >> $config_target_mak
7816fi
7817
7818done # for target in $targets
7819
7820if [ "$fdt" = "git" ]; then
7821  subdirs="$subdirs dtc"
7822fi
7823if [ "$capstone" = "git" -o "$capstone" = "internal" ]; then
7824  subdirs="$subdirs capstone"
7825fi
7826echo "SUBDIRS=$subdirs" >> $config_host_mak
7827if test -n "$LIBCAPSTONE"; then
7828  echo "LIBCAPSTONE=$LIBCAPSTONE" >> $config_host_mak
7829fi
7830
7831if test "$numa" = "yes"; then
7832  echo "CONFIG_NUMA=y" >> $config_host_mak
7833  echo "NUMA_LIBS=$numa_libs" >> $config_host_mak
7834fi
7835
7836if test "$ccache_cpp2" = "yes"; then
7837  echo "export CCACHE_CPP2=y" >> $config_host_mak
7838fi
7839
7840if test "$safe_stack" = "yes"; then
7841  echo "CONFIG_SAFESTACK=y" >> $config_host_mak
7842fi
7843
7844# If we're using a separate build tree, set it up now.
7845# DIRS are directories which we simply mkdir in the build tree;
7846# LINKS are things to symlink back into the source tree
7847# (these can be both files and directories).
7848# Caution: do not add files or directories here using wildcards. This
7849# will result in problems later if a new file matching the wildcard is
7850# added to the source tree -- nothing will cause configure to be rerun
7851# so the build tree will be missing the link back to the new file, and
7852# tests might fail. Prefer to keep the relevant files in their own
7853# directory and symlink the directory instead.
7854# UNLINK is used to remove symlinks from older development versions
7855# that might get into the way when doing "git update" without doing
7856# a "make distclean" in between.
7857DIRS="tests tests/tcg tests/tcg/lm32 tests/qapi-schema tests/qtest/libqos"
7858DIRS="$DIRS tests/qtest tests/qemu-iotests tests/vm tests/fp tests/qgraph"
7859DIRS="$DIRS docs docs/interop fsdev scsi"
7860DIRS="$DIRS pc-bios/optionrom pc-bios/s390-ccw"
7861DIRS="$DIRS roms/seabios"
7862DIRS="$DIRS contrib/plugins/"
7863LINKS="Makefile"
7864LINKS="$LINKS tests/tcg/lm32/Makefile"
7865LINKS="$LINKS tests/tcg/Makefile.target"
7866LINKS="$LINKS pc-bios/optionrom/Makefile"
7867LINKS="$LINKS pc-bios/s390-ccw/Makefile"
7868LINKS="$LINKS roms/seabios/Makefile"
7869LINKS="$LINKS pc-bios/qemu-icon.bmp"
7870LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
7871LINKS="$LINKS tests/acceptance tests/data"
7872LINKS="$LINKS tests/qemu-iotests/check"
7873LINKS="$LINKS python"
7874LINKS="$LINKS contrib/plugins/Makefile "
7875UNLINK="pc-bios/keymaps"
7876for bios_file in \
7877    $source_path/pc-bios/*.bin \
7878    $source_path/pc-bios/*.elf \
7879    $source_path/pc-bios/*.lid \
7880    $source_path/pc-bios/*.rom \
7881    $source_path/pc-bios/*.dtb \
7882    $source_path/pc-bios/*.img \
7883    $source_path/pc-bios/openbios-* \
7884    $source_path/pc-bios/u-boot.* \
7885    $source_path/pc-bios/edk2-*.fd.bz2 \
7886    $source_path/pc-bios/palcode-*
7887do
7888    LINKS="$LINKS pc-bios/$(basename $bios_file)"
7889done
7890mkdir -p $DIRS
7891for f in $LINKS ; do
7892    if [ -e "$source_path/$f" ]; then
7893        symlink "$source_path/$f" "$f"
7894    fi
7895done
7896for f in $UNLINK ; do
7897    if [ -L "$f" ]; then
7898        rm -f "$f"
7899    fi
7900done
7901
7902(for i in $cross_cc_vars; do
7903  export $i
7904done
7905export target_list source_path use_containers
7906$source_path/tests/tcg/configure.sh)
7907
7908# temporary config to build submodules
7909for rom in seabios; do
7910    config_mak=roms/$rom/config.mak
7911    echo "# Automatically generated by configure - do not modify" > $config_mak
7912    echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
7913    echo "AS=$as" >> $config_mak
7914    echo "CCAS=$ccas" >> $config_mak
7915    echo "CC=$cc" >> $config_mak
7916    echo "BCC=bcc" >> $config_mak
7917    echo "CPP=$cpp" >> $config_mak
7918    echo "OBJCOPY=objcopy" >> $config_mak
7919    echo "IASL=$iasl" >> $config_mak
7920    echo "LD=$ld" >> $config_mak
7921    echo "RANLIB=$ranlib" >> $config_mak
7922done
7923
7924# set up qemu-iotests in this build directory
7925iotests_common_env="tests/qemu-iotests/common.env"
7926
7927echo "# Automatically generated by configure - do not modify" > "$iotests_common_env"
7928echo >> "$iotests_common_env"
7929echo "export PYTHON='$python'" >> "$iotests_common_env"
7930
7931if test "$skip_meson" = no; then
7932cross="config-meson.cross.new"
7933meson_quote() {
7934    echo "['$(echo $* | sed "s/ /','/g")']"
7935}
7936
7937echo "# Automatically generated by configure - do not modify" > $cross
7938echo "[properties]" >> $cross
7939test -z "$cxx" && echo "link_language = 'c'" >> $cross
7940echo "[binaries]" >> $cross
7941echo "c = $(meson_quote $cc)" >> $cross
7942test -n "$cxx" && echo "cpp = $(meson_quote $cxx)" >> $cross
7943echo "ar = $(meson_quote $ar)" >> $cross
7944echo "nm = $(meson_quote $nm)" >> $cross
7945echo "pkgconfig = $(meson_quote $pkg_config_exe)" >> $cross
7946echo "ranlib = $(meson_quote $ranlib)" >> $cross
7947if has $sdl2_config; then
7948  echo "sdl2-config = $(meson_quote $sdl2_config)" >> $cross
7949fi
7950echo "strip = $(meson_quote $strip)" >> $cross
7951echo "windres = $(meson_quote $windres)" >> $cross
7952if test -n "$cross_prefix"; then
7953    cross_arg="--cross-file config-meson.cross"
7954    # Hack: Meson expects an absolute path for the *build* machine
7955    # for the prefix, so add a slash in front of a Windows path that
7956    # includes a drive letter.
7957    #
7958    # See https://github.com/mesonbuild/meson/issues/7577.
7959    echo "[host_machine]" >> $cross
7960    if test "$mingw32" = "yes" ; then
7961        echo "system = 'windows'" >> $cross
7962        case $prefix in
7963            ?:*) pre_prefix=/ ;;
7964        esac
7965    fi
7966    if test "$linux" = "yes" ; then
7967        echo "system = 'linux'" >> $cross
7968    fi
7969    case "$ARCH" in
7970        i386|x86_64)
7971            echo "cpu_family = 'x86'" >> $cross
7972            ;;
7973        ppc64le)
7974            echo "cpu_family = 'ppc64'" >> $cross
7975            ;;
7976        *)
7977            echo "cpu_family = '$ARCH'" >> $cross
7978            ;;
7979    esac
7980    echo "cpu = '$cpu'" >> $cross
7981    if test "$bigendian" = "yes" ; then
7982        echo "endian = 'big'" >> $cross
7983    else
7984        echo "endian = 'little'" >> $cross
7985    fi
7986else
7987    cross_arg="--native-file config-meson.cross"
7988fi
7989mv $cross config-meson.cross
7990
7991rm -rf meson-private meson-info meson-logs
7992NINJA=${ninja:-$PWD/ninjatool} $meson setup \
7993        --prefix "${pre_prefix}$prefix" \
7994        --libdir "${pre_prefix}$libdir" \
7995        --libexecdir "${pre_prefix}$libexecdir" \
7996        --bindir "${pre_prefix}$bindir" \
7997        --includedir "${pre_prefix}$includedir" \
7998        --datadir "${pre_prefix}$datadir" \
7999        --mandir "${pre_prefix}$mandir" \
8000        --sysconfdir "${pre_prefix}$sysconfdir" \
8001        --localstatedir "${pre_prefix}$local_statedir" \
8002        -Ddocdir="${pre_prefix}$docdir" \
8003        -Dqemu_suffix="$qemu_suffix" \
8004        -Doptimization=$(if test "$debug" = yes; then echo 0; else echo 2; fi) \
8005        -Ddebug=$(if test "$debug_info" = yes; then echo true; else echo false; fi) \
8006        -Dwerror=$(if test "$werror" = yes; then echo true; else echo false; fi) \
8007        -Dstrip=$(if test "$strip_opt" = yes; then echo true; else echo false; fi) \
8008        -Db_pie=$(if test "$pie" = yes; then echo true; else echo false; fi) \
8009        -Db_coverage=$(if test "$gcov" = yes; then echo true; else echo false; fi) \
8010	-Dsdl=$sdl -Dsdl_image=$sdl_image \
8011	-Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg -Dvnc_png=$vnc_png \
8012	-Dgettext=$gettext -Dxkbcommon=$xkbcommon -Du2f=$u2f\
8013        $cross_arg \
8014        "$PWD" "$source_path"
8015
8016if test "$?" -ne 0 ; then
8017    error_exit "meson setup failed"
8018fi
8019touch ninjatool.stamp
8020fi
8021
8022if test -n "${deprecated_features}"; then
8023    echo "Warning, deprecated features enabled."
8024    echo "Please see docs/system/deprecated.rst"
8025    echo "  features: ${deprecated_features}"
8026fi
8027
8028# Save the configure command line for later reuse.
8029cat <<EOD >config.status
8030#!/bin/sh
8031# Generated by configure.
8032# Run this file to recreate the current configuration.
8033# Compiler output produced by configure, useful for debugging
8034# configure, is in config.log if it exists.
8035EOD
8036
8037preserve_env() {
8038    envname=$1
8039
8040    eval envval=\$$envname
8041
8042    if test -n "$envval"
8043    then
8044	echo "$envname='$envval'" >> config.status
8045	echo "export $envname" >> config.status
8046    else
8047	echo "unset $envname" >> config.status
8048    fi
8049}
8050
8051# Preserve various env variables that influence what
8052# features/build target configure will detect
8053preserve_env AR
8054preserve_env AS
8055preserve_env CC
8056preserve_env CPP
8057preserve_env CXX
8058preserve_env INSTALL
8059preserve_env LD
8060preserve_env LD_LIBRARY_PATH
8061preserve_env LIBTOOL
8062preserve_env MAKE
8063preserve_env NM
8064preserve_env OBJCOPY
8065preserve_env PATH
8066preserve_env PKG_CONFIG
8067preserve_env PKG_CONFIG_LIBDIR
8068preserve_env PKG_CONFIG_PATH
8069preserve_env PYTHON
8070preserve_env SDL2_CONFIG
8071preserve_env SMBD
8072preserve_env STRIP
8073preserve_env WINDRES
8074
8075printf "exec" >>config.status
8076for i in "$0" "$@"; do
8077  test "$i" = --skip-meson || printf " '%s'" "$i" >>config.status
8078done
8079echo ' "$@"' >>config.status
8080chmod +x config.status
8081
8082rm -r "$TMPDIR1"
8083