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