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