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