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