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