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