xref: /openbmc/qemu/configure (revision 7acafcfa)
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 -DBSD_SOURCE $QEMU_CFLAGS"
908  LIBS="-lposix_error_mapper -lnetwork -lbsd $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
2405if check_include "pty.h" ; then
2406  pty_h=yes
2407else
2408  pty_h=no
2409fi
2410
2411cat > $TMPC <<EOF
2412#include <sys/mman.h>
2413int main(int argc, char *argv[]) {
2414    return mlockall(MCL_FUTURE);
2415}
2416EOF
2417if compile_prog "" "" ; then
2418  have_mlockall=yes
2419else
2420  have_mlockall=no
2421fi
2422
2423#########################################
2424# vhost interdependencies and host support
2425
2426# vhost backends
2427test "$vhost_user" = "" && vhost_user=yes
2428if test "$vhost_user" = "yes" && test "$mingw32" = "yes"; then
2429  error_exit "vhost-user isn't available on win32"
2430fi
2431test "$vhost_vdpa" = "" && vhost_vdpa=$linux
2432if test "$vhost_vdpa" = "yes" && test "$linux" != "yes"; then
2433  error_exit "vhost-vdpa is only available on Linux"
2434fi
2435test "$vhost_kernel" = "" && vhost_kernel=$linux
2436if test "$vhost_kernel" = "yes" && test "$linux" != "yes"; then
2437  error_exit "vhost-kernel is only available on Linux"
2438fi
2439
2440# vhost-kernel devices
2441test "$vhost_scsi" = "" && vhost_scsi=$vhost_kernel
2442if test "$vhost_scsi" = "yes" && test "$vhost_kernel" != "yes"; then
2443  error_exit "--enable-vhost-scsi requires --enable-vhost-kernel"
2444fi
2445test "$vhost_vsock" = "" && vhost_vsock=$vhost_kernel
2446if test "$vhost_vsock" = "yes" && test "$vhost_kernel" != "yes"; then
2447  error_exit "--enable-vhost-vsock requires --enable-vhost-kernel"
2448fi
2449
2450# vhost-user backends
2451test "$vhost_net_user" = "" && vhost_net_user=$vhost_user
2452if test "$vhost_net_user" = "yes" && test "$vhost_user" = "no"; then
2453  error_exit "--enable-vhost-net-user requires --enable-vhost-user"
2454fi
2455test "$vhost_crypto" = "" && vhost_crypto=$vhost_user
2456if test "$vhost_crypto" = "yes" && test "$vhost_user" = "no"; then
2457  error_exit "--enable-vhost-crypto requires --enable-vhost-user"
2458fi
2459test "$vhost_user_fs" = "" && vhost_user_fs=$vhost_user
2460if test "$vhost_user_fs" = "yes" && test "$vhost_user" = "no"; then
2461  error_exit "--enable-vhost-user-fs requires --enable-vhost-user"
2462fi
2463#vhost-vdpa backends
2464test "$vhost_net_vdpa" = "" && vhost_net_vdpa=$vhost_vdpa
2465if test "$vhost_net_vdpa" = "yes" && test "$vhost_vdpa" = "no"; then
2466  error_exit "--enable-vhost-net-vdpa requires --enable-vhost-vdpa"
2467fi
2468
2469# OR the vhost-kernel and vhost-user values for simplicity
2470if test "$vhost_net" = ""; then
2471  test "$vhost_net_user" = "yes" && vhost_net=yes
2472  test "$vhost_kernel" = "yes" && vhost_net=yes
2473fi
2474
2475##########################################
2476# MinGW / Mingw-w64 localtime_r/gmtime_r check
2477
2478if test "$mingw32" = "yes"; then
2479    # Some versions of MinGW / Mingw-w64 lack localtime_r
2480    # and gmtime_r entirely.
2481    #
2482    # Some versions of Mingw-w64 define a macro for
2483    # localtime_r/gmtime_r.
2484    #
2485    # Some versions of Mingw-w64 will define functions
2486    # for localtime_r/gmtime_r, but only if you have
2487    # _POSIX_THREAD_SAFE_FUNCTIONS defined. For fun
2488    # though, unistd.h and pthread.h both define
2489    # that for you.
2490    #
2491    # So this #undef localtime_r and #include <unistd.h>
2492    # are not in fact redundant.
2493cat > $TMPC << EOF
2494#include <unistd.h>
2495#include <time.h>
2496#undef localtime_r
2497int main(void) { localtime_r(NULL, NULL); return 0; }
2498EOF
2499    if compile_prog "" "" ; then
2500        localtime_r="yes"
2501    else
2502        localtime_r="no"
2503    fi
2504fi
2505
2506##########################################
2507# pkg-config probe
2508
2509if ! has "$pkg_config_exe"; then
2510  error_exit "pkg-config binary '$pkg_config_exe' not found"
2511fi
2512
2513##########################################
2514# NPTL probe
2515
2516if test "$linux_user" = "yes"; then
2517  cat > $TMPC <<EOF
2518#include <sched.h>
2519#include <linux/futex.h>
2520int main(void) {
2521#if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
2522#error bork
2523#endif
2524  return 0;
2525}
2526EOF
2527  if ! compile_object ; then
2528    feature_not_found "nptl" "Install glibc and linux kernel headers."
2529  fi
2530fi
2531
2532##########################################
2533# lzo check
2534
2535if test "$lzo" != "no" ; then
2536    cat > $TMPC << EOF
2537#include <lzo/lzo1x.h>
2538int main(void) { lzo_version(); return 0; }
2539EOF
2540    if compile_prog "" "-llzo2" ; then
2541        libs_softmmu="$libs_softmmu -llzo2"
2542        lzo="yes"
2543    else
2544        if test "$lzo" = "yes"; then
2545            feature_not_found "liblzo2" "Install liblzo2 devel"
2546        fi
2547        lzo="no"
2548    fi
2549fi
2550
2551##########################################
2552# snappy check
2553
2554if test "$snappy" != "no" ; then
2555    cat > $TMPC << EOF
2556#include <snappy-c.h>
2557int main(void) { snappy_max_compressed_length(4096); return 0; }
2558EOF
2559    if compile_prog "" "-lsnappy" ; then
2560        libs_softmmu="$libs_softmmu -lsnappy"
2561        snappy="yes"
2562    else
2563        if test "$snappy" = "yes"; then
2564            feature_not_found "libsnappy" "Install libsnappy devel"
2565        fi
2566        snappy="no"
2567    fi
2568fi
2569
2570##########################################
2571# bzip2 check
2572
2573if test "$bzip2" != "no" ; then
2574    cat > $TMPC << EOF
2575#include <bzlib.h>
2576int main(void) { BZ2_bzlibVersion(); return 0; }
2577EOF
2578    if compile_prog "" "-lbz2" ; then
2579        bzip2="yes"
2580    else
2581        if test "$bzip2" = "yes"; then
2582            feature_not_found "libbzip2" "Install libbzip2 devel"
2583        fi
2584        bzip2="no"
2585    fi
2586fi
2587
2588##########################################
2589# lzfse check
2590
2591if test "$lzfse" != "no" ; then
2592    cat > $TMPC << EOF
2593#include <lzfse.h>
2594int main(void) { lzfse_decode_scratch_size(); return 0; }
2595EOF
2596    if compile_prog "" "-llzfse" ; then
2597        lzfse="yes"
2598    else
2599        if test "$lzfse" = "yes"; then
2600            feature_not_found "lzfse" "Install lzfse devel"
2601        fi
2602        lzfse="no"
2603    fi
2604fi
2605
2606##########################################
2607# zstd check
2608
2609if test "$zstd" != "no" ; then
2610    libzstd_minver="1.4.0"
2611    if $pkg_config --atleast-version=$libzstd_minver libzstd ; then
2612        zstd_cflags="$($pkg_config --cflags libzstd)"
2613        zstd_libs="$($pkg_config --libs libzstd)"
2614        LIBS="$zstd_libs $LIBS"
2615        QEMU_CFLAGS="$QEMU_CFLAGS $zstd_cflags"
2616        zstd="yes"
2617    else
2618        if test "$zstd" = "yes" ; then
2619            feature_not_found "libzstd" "Install libzstd devel"
2620        fi
2621        zstd="no"
2622    fi
2623fi
2624
2625##########################################
2626# libseccomp check
2627
2628if test "$seccomp" != "no" ; then
2629    libseccomp_minver="2.3.0"
2630    if $pkg_config --atleast-version=$libseccomp_minver libseccomp ; then
2631        seccomp_cflags="$($pkg_config --cflags libseccomp)"
2632        seccomp_libs="$($pkg_config --libs libseccomp)"
2633        seccomp="yes"
2634    else
2635        if test "$seccomp" = "yes" ; then
2636            feature_not_found "libseccomp" \
2637                 "Install libseccomp devel >= $libseccomp_minver"
2638        fi
2639        seccomp="no"
2640    fi
2641fi
2642##########################################
2643# xen probe
2644
2645if test "$xen" != "no" ; then
2646  # Check whether Xen library path is specified via --extra-ldflags to avoid
2647  # overriding this setting with pkg-config output. If not, try pkg-config
2648  # to obtain all needed flags.
2649
2650  if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
2651     $pkg_config --exists xencontrol ; then
2652    xen_ctrl_version="$(printf '%d%02d%02d' \
2653      $($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
2654    xen=yes
2655    xen_pc="xencontrol xenstore xenguest xenforeignmemory xengnttab"
2656    xen_pc="$xen_pc xenevtchn xendevicemodel"
2657    if $pkg_config --exists xentoolcore; then
2658      xen_pc="$xen_pc xentoolcore"
2659    fi
2660    QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags $xen_pc)"
2661    libs_softmmu="$($pkg_config --libs $xen_pc) $libs_softmmu"
2662  else
2663
2664    xen_libs="-lxenstore -lxenctrl -lxenguest"
2665    xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
2666
2667    # First we test whether Xen headers and libraries are available.
2668    # If no, we are done and there is no Xen support.
2669    # If yes, more tests are run to detect the Xen version.
2670
2671    # Xen (any)
2672    cat > $TMPC <<EOF
2673#include <xenctrl.h>
2674int main(void) {
2675  return 0;
2676}
2677EOF
2678    if ! compile_prog "" "$xen_libs" ; then
2679      # Xen not found
2680      if test "$xen" = "yes" ; then
2681        feature_not_found "xen" "Install xen devel"
2682      fi
2683      xen=no
2684
2685    # Xen unstable
2686    elif
2687        cat > $TMPC <<EOF &&
2688#undef XC_WANT_COMPAT_DEVICEMODEL_API
2689#define __XEN_TOOLS__
2690#include <xendevicemodel.h>
2691#include <xenforeignmemory.h>
2692int main(void) {
2693  xendevicemodel_handle *xd;
2694  xenforeignmemory_handle *xfmem;
2695
2696  xd = xendevicemodel_open(0, 0);
2697  xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
2698
2699  xfmem = xenforeignmemory_open(0, 0);
2700  xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
2701
2702  return 0;
2703}
2704EOF
2705        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2706      then
2707      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2708      xen_ctrl_version=41100
2709      xen=yes
2710    elif
2711        cat > $TMPC <<EOF &&
2712#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2713#include <xenforeignmemory.h>
2714#include <xentoolcore.h>
2715int main(void) {
2716  xenforeignmemory_handle *xfmem;
2717
2718  xfmem = xenforeignmemory_open(0, 0);
2719  xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
2720  xentoolcore_restrict_all(0);
2721
2722  return 0;
2723}
2724EOF
2725        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2726      then
2727      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2728      xen_ctrl_version=41000
2729      xen=yes
2730    elif
2731        cat > $TMPC <<EOF &&
2732#undef XC_WANT_COMPAT_DEVICEMODEL_API
2733#define __XEN_TOOLS__
2734#include <xendevicemodel.h>
2735int main(void) {
2736  xendevicemodel_handle *xd;
2737
2738  xd = xendevicemodel_open(0, 0);
2739  xendevicemodel_close(xd);
2740
2741  return 0;
2742}
2743EOF
2744        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
2745      then
2746      xen_stable_libs="-lxendevicemodel $xen_stable_libs"
2747      xen_ctrl_version=40900
2748      xen=yes
2749    elif
2750        cat > $TMPC <<EOF &&
2751/*
2752 * If we have stable libs the we don't want the libxc compat
2753 * layers, regardless of what CFLAGS we may have been given.
2754 *
2755 * Also, check if xengnttab_grant_copy_segment_t is defined and
2756 * grant copy operation is implemented.
2757 */
2758#undef XC_WANT_COMPAT_EVTCHN_API
2759#undef XC_WANT_COMPAT_GNTTAB_API
2760#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2761#include <xenctrl.h>
2762#include <xenstore.h>
2763#include <xenevtchn.h>
2764#include <xengnttab.h>
2765#include <xenforeignmemory.h>
2766#include <stdint.h>
2767#include <xen/hvm/hvm_info_table.h>
2768#if !defined(HVM_MAX_VCPUS)
2769# error HVM_MAX_VCPUS not defined
2770#endif
2771int main(void) {
2772  xc_interface *xc = NULL;
2773  xenforeignmemory_handle *xfmem;
2774  xenevtchn_handle *xe;
2775  xengnttab_handle *xg;
2776  xengnttab_grant_copy_segment_t* seg = NULL;
2777
2778  xs_daemon_open();
2779
2780  xc = xc_interface_open(0, 0, 0);
2781  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2782  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2783  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2784  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2785
2786  xfmem = xenforeignmemory_open(0, 0);
2787  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2788
2789  xe = xenevtchn_open(0, 0);
2790  xenevtchn_fd(xe);
2791
2792  xg = xengnttab_open(0, 0);
2793  xengnttab_grant_copy(xg, 0, seg);
2794
2795  return 0;
2796}
2797EOF
2798        compile_prog "" "$xen_libs $xen_stable_libs"
2799      then
2800      xen_ctrl_version=40800
2801      xen=yes
2802    elif
2803        cat > $TMPC <<EOF &&
2804/*
2805 * If we have stable libs the we don't want the libxc compat
2806 * layers, regardless of what CFLAGS we may have been given.
2807 */
2808#undef XC_WANT_COMPAT_EVTCHN_API
2809#undef XC_WANT_COMPAT_GNTTAB_API
2810#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2811#include <xenctrl.h>
2812#include <xenstore.h>
2813#include <xenevtchn.h>
2814#include <xengnttab.h>
2815#include <xenforeignmemory.h>
2816#include <stdint.h>
2817#include <xen/hvm/hvm_info_table.h>
2818#if !defined(HVM_MAX_VCPUS)
2819# error HVM_MAX_VCPUS not defined
2820#endif
2821int main(void) {
2822  xc_interface *xc = NULL;
2823  xenforeignmemory_handle *xfmem;
2824  xenevtchn_handle *xe;
2825  xengnttab_handle *xg;
2826
2827  xs_daemon_open();
2828
2829  xc = xc_interface_open(0, 0, 0);
2830  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2831  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2832  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2833  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2834
2835  xfmem = xenforeignmemory_open(0, 0);
2836  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2837
2838  xe = xenevtchn_open(0, 0);
2839  xenevtchn_fd(xe);
2840
2841  xg = xengnttab_open(0, 0);
2842  xengnttab_map_grant_ref(xg, 0, 0, 0);
2843
2844  return 0;
2845}
2846EOF
2847        compile_prog "" "$xen_libs $xen_stable_libs"
2848      then
2849      xen_ctrl_version=40701
2850      xen=yes
2851
2852    # Xen 4.6
2853    elif
2854        cat > $TMPC <<EOF &&
2855#include <xenctrl.h>
2856#include <xenstore.h>
2857#include <stdint.h>
2858#include <xen/hvm/hvm_info_table.h>
2859#if !defined(HVM_MAX_VCPUS)
2860# error HVM_MAX_VCPUS not defined
2861#endif
2862int main(void) {
2863  xc_interface *xc;
2864  xs_daemon_open();
2865  xc = xc_interface_open(0, 0, 0);
2866  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2867  xc_gnttab_open(NULL, 0);
2868  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2869  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2870  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2871  xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
2872  return 0;
2873}
2874EOF
2875        compile_prog "" "$xen_libs"
2876      then
2877      xen_ctrl_version=40600
2878      xen=yes
2879
2880    # Xen 4.5
2881    elif
2882        cat > $TMPC <<EOF &&
2883#include <xenctrl.h>
2884#include <xenstore.h>
2885#include <stdint.h>
2886#include <xen/hvm/hvm_info_table.h>
2887#if !defined(HVM_MAX_VCPUS)
2888# error HVM_MAX_VCPUS not defined
2889#endif
2890int main(void) {
2891  xc_interface *xc;
2892  xs_daemon_open();
2893  xc = xc_interface_open(0, 0, 0);
2894  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2895  xc_gnttab_open(NULL, 0);
2896  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2897  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2898  xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
2899  return 0;
2900}
2901EOF
2902        compile_prog "" "$xen_libs"
2903      then
2904      xen_ctrl_version=40500
2905      xen=yes
2906
2907    elif
2908        cat > $TMPC <<EOF &&
2909#include <xenctrl.h>
2910#include <xenstore.h>
2911#include <stdint.h>
2912#include <xen/hvm/hvm_info_table.h>
2913#if !defined(HVM_MAX_VCPUS)
2914# error HVM_MAX_VCPUS not defined
2915#endif
2916int main(void) {
2917  xc_interface *xc;
2918  xs_daemon_open();
2919  xc = xc_interface_open(0, 0, 0);
2920  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2921  xc_gnttab_open(NULL, 0);
2922  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2923  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2924  return 0;
2925}
2926EOF
2927        compile_prog "" "$xen_libs"
2928      then
2929      xen_ctrl_version=40200
2930      xen=yes
2931
2932    else
2933      if test "$xen" = "yes" ; then
2934        feature_not_found "xen (unsupported version)" \
2935                          "Install a supported xen (xen 4.2 or newer)"
2936      fi
2937      xen=no
2938    fi
2939
2940    if test "$xen" = yes; then
2941      if test $xen_ctrl_version -ge 40701  ; then
2942        libs_softmmu="$xen_stable_libs $libs_softmmu"
2943      fi
2944      libs_softmmu="$xen_libs $libs_softmmu"
2945    fi
2946  fi
2947fi
2948
2949if test "$xen_pci_passthrough" != "no"; then
2950  if test "$xen" = "yes" && test "$linux" = "yes"; then
2951    xen_pci_passthrough=yes
2952  else
2953    if test "$xen_pci_passthrough" = "yes"; then
2954      error_exit "User requested feature Xen PCI Passthrough" \
2955          " but this feature requires /sys from Linux"
2956    fi
2957    xen_pci_passthrough=no
2958  fi
2959fi
2960
2961##########################################
2962# Windows Hypervisor Platform accelerator (WHPX) check
2963if test "$whpx" != "no" ; then
2964    if check_include "WinHvPlatform.h" && check_include "WinHvEmulation.h"; then
2965        whpx="yes"
2966    else
2967        if test "$whpx" = "yes"; then
2968            feature_not_found "WinHvPlatform" "WinHvEmulation is not installed"
2969        fi
2970        whpx="no"
2971    fi
2972fi
2973
2974##########################################
2975# Sparse probe
2976if test "$sparse" != "no" ; then
2977  if has cgcc; then
2978    sparse=yes
2979  else
2980    if test "$sparse" = "yes" ; then
2981      feature_not_found "sparse" "Install sparse binary"
2982    fi
2983    sparse=no
2984  fi
2985fi
2986
2987##########################################
2988# X11 probe
2989if $pkg_config --exists "x11"; then
2990    have_x11=yes
2991    x11_cflags=$($pkg_config --cflags x11)
2992    x11_libs=$($pkg_config --libs x11)
2993fi
2994
2995##########################################
2996# GTK probe
2997
2998if test "$gtk" != "no"; then
2999    gtkpackage="gtk+-3.0"
3000    gtkx11package="gtk+-x11-3.0"
3001    gtkversion="3.22.0"
3002    if $pkg_config --exists "$gtkpackage >= $gtkversion"; then
3003        gtk_cflags=$($pkg_config --cflags $gtkpackage)
3004        gtk_libs=$($pkg_config --libs $gtkpackage)
3005        gtk_version=$($pkg_config --modversion $gtkpackage)
3006        if $pkg_config --exists "$gtkx11package >= $gtkversion"; then
3007            need_x11=yes
3008            gtk_cflags="$gtk_cflags $x11_cflags"
3009            gtk_libs="$gtk_libs $x11_libs"
3010        fi
3011        gtk="yes"
3012    elif test "$gtk" = "yes"; then
3013        feature_not_found "gtk" "Install gtk3-devel"
3014    else
3015        gtk="no"
3016    fi
3017fi
3018
3019
3020##########################################
3021# GNUTLS probe
3022
3023if test "$gnutls" != "no"; then
3024    pass="no"
3025    if $pkg_config --exists "gnutls >= 3.1.18"; then
3026        gnutls_cflags=$($pkg_config --cflags gnutls)
3027        gnutls_libs=$($pkg_config --libs gnutls)
3028        # Packaging for the static libraries is not always correct.
3029        # At least ubuntu 18.04 ships only shared libraries.
3030        write_c_skeleton
3031        if compile_prog "" "$gnutls_libs" ; then
3032            LIBS="$gnutls_libs $LIBS"
3033            QEMU_CFLAGS="$QEMU_CFLAGS $gnutls_cflags"
3034            pass="yes"
3035        fi
3036    fi
3037    if test "$pass" = "no" && test "$gnutls" = "yes"; then
3038	feature_not_found "gnutls" "Install gnutls devel >= 3.1.18"
3039    else
3040        gnutls="$pass"
3041    fi
3042fi
3043
3044
3045# If user didn't give a --disable/enable-gcrypt flag,
3046# then mark as disabled if user requested nettle
3047# explicitly
3048if test -z "$gcrypt"
3049then
3050    if test "$nettle" = "yes"
3051    then
3052        gcrypt="no"
3053    fi
3054fi
3055
3056# If user didn't give a --disable/enable-nettle flag,
3057# then mark as disabled if user requested gcrypt
3058# explicitly
3059if test -z "$nettle"
3060then
3061    if test "$gcrypt" = "yes"
3062    then
3063        nettle="no"
3064    fi
3065fi
3066
3067has_libgcrypt() {
3068    if ! has "libgcrypt-config"
3069    then
3070	return 1
3071    fi
3072
3073    if test -n "$cross_prefix"
3074    then
3075	host=$(libgcrypt-config --host)
3076	if test "$host-" != $cross_prefix
3077	then
3078	    return 1
3079	fi
3080    fi
3081
3082    maj=`libgcrypt-config --version | awk -F . '{print $1}'`
3083    min=`libgcrypt-config --version | awk -F . '{print $2}'`
3084
3085    if test $maj != 1 || test $min -lt 5
3086    then
3087       return 1
3088    fi
3089
3090    return 0
3091}
3092
3093
3094if test "$nettle" != "no"; then
3095    pass="no"
3096    if $pkg_config --exists "nettle >= 2.7.1"; then
3097        nettle_cflags=$($pkg_config --cflags nettle)
3098        nettle_libs=$($pkg_config --libs nettle)
3099        nettle_version=$($pkg_config --modversion nettle)
3100        # Link test to make sure the given libraries work (e.g for static).
3101        write_c_skeleton
3102        if compile_prog "" "$nettle_libs" ; then
3103            LIBS="$nettle_libs $LIBS"
3104            QEMU_CFLAGS="$QEMU_CFLAGS $nettle_cflags"
3105            if test -z "$gcrypt"; then
3106               gcrypt="no"
3107            fi
3108            pass="yes"
3109        fi
3110    fi
3111    if test "$pass" = "yes"
3112    then
3113        cat > $TMPC << EOF
3114#include <nettle/xts.h>
3115int main(void) {
3116  return 0;
3117}
3118EOF
3119        if compile_prog "$nettle_cflags" "$nettle_libs" ; then
3120            nettle_xts=yes
3121            qemu_private_xts=no
3122        fi
3123    fi
3124    if test "$pass" = "no" && test "$nettle" = "yes"; then
3125        feature_not_found "nettle" "Install nettle devel >= 2.7.1"
3126    else
3127        nettle="$pass"
3128    fi
3129fi
3130
3131if test "$gcrypt" != "no"; then
3132    pass="no"
3133    if has_libgcrypt; then
3134        gcrypt_cflags=$(libgcrypt-config --cflags)
3135        gcrypt_libs=$(libgcrypt-config --libs)
3136        # Debian has removed -lgpg-error from libgcrypt-config
3137        # as it "spreads unnecessary dependencies" which in
3138        # turn breaks static builds...
3139        if test "$static" = "yes"
3140        then
3141            gcrypt_libs="$gcrypt_libs -lgpg-error"
3142        fi
3143
3144        # Link test to make sure the given libraries work (e.g for static).
3145        write_c_skeleton
3146        if compile_prog "" "$gcrypt_libs" ; then
3147            LIBS="$gcrypt_libs $LIBS"
3148            QEMU_CFLAGS="$QEMU_CFLAGS $gcrypt_cflags"
3149            pass="yes"
3150        fi
3151    fi
3152    if test "$pass" = "yes"; then
3153        gcrypt="yes"
3154        cat > $TMPC << EOF
3155#include <gcrypt.h>
3156int main(void) {
3157  gcry_mac_hd_t handle;
3158  gcry_mac_open(&handle, GCRY_MAC_HMAC_MD5,
3159                GCRY_MAC_FLAG_SECURE, NULL);
3160  return 0;
3161}
3162EOF
3163        if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
3164            gcrypt_hmac=yes
3165        fi
3166        cat > $TMPC << EOF
3167#include <gcrypt.h>
3168int main(void) {
3169  gcry_cipher_hd_t handle;
3170  gcry_cipher_open(&handle, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_XTS, 0);
3171  return 0;
3172}
3173EOF
3174        if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
3175            gcrypt_xts=yes
3176            qemu_private_xts=no
3177        fi
3178    elif test "$gcrypt" = "yes"; then
3179        feature_not_found "gcrypt" "Install gcrypt devel >= 1.5.0"
3180    else
3181        gcrypt="no"
3182    fi
3183fi
3184
3185
3186if test "$gcrypt" = "yes" && test "$nettle" = "yes"
3187then
3188    error_exit "Only one of gcrypt & nettle can be enabled"
3189fi
3190
3191##########################################
3192# libtasn1 - only for the TLS creds/session test suite
3193
3194tasn1=yes
3195tasn1_cflags=""
3196tasn1_libs=""
3197if $pkg_config --exists "libtasn1"; then
3198    tasn1_cflags=$($pkg_config --cflags libtasn1)
3199    tasn1_libs=$($pkg_config --libs libtasn1)
3200else
3201    tasn1=no
3202fi
3203
3204
3205##########################################
3206# PAM probe
3207
3208if test "$auth_pam" != "no"; then
3209    cat > $TMPC <<EOF
3210#include <security/pam_appl.h>
3211#include <stdio.h>
3212int main(void) {
3213   const char *service_name = "qemu";
3214   const char *user = "frank";
3215   const struct pam_conv pam_conv = { 0 };
3216   pam_handle_t *pamh = NULL;
3217   pam_start(service_name, user, &pam_conv, &pamh);
3218   return 0;
3219}
3220EOF
3221    if compile_prog "" "-lpam" ; then
3222        auth_pam=yes
3223    else
3224        if test "$auth_pam" = "yes"; then
3225            feature_not_found "PAM" "Install PAM development package"
3226        else
3227            auth_pam=no
3228        fi
3229    fi
3230fi
3231
3232##########################################
3233# getifaddrs (for tests/test-io-channel-socket )
3234
3235have_ifaddrs_h=yes
3236if ! check_include "ifaddrs.h" ; then
3237  have_ifaddrs_h=no
3238fi
3239
3240#########################################
3241# libdrm check
3242have_drm_h=no
3243if check_include "libdrm/drm.h" ; then
3244    have_drm_h=yes
3245fi
3246
3247#########################################
3248# sys/signal.h check
3249have_sys_signal_h=no
3250if check_include "sys/signal.h" ; then
3251  have_sys_signal_h=yes
3252fi
3253
3254##########################################
3255# VTE probe
3256
3257if test "$vte" != "no"; then
3258    vteminversion="0.32.0"
3259    if $pkg_config --exists "vte-2.91"; then
3260      vtepackage="vte-2.91"
3261    else
3262      vtepackage="vte-2.90"
3263    fi
3264    if $pkg_config --exists "$vtepackage >= $vteminversion"; then
3265        vte_cflags=$($pkg_config --cflags $vtepackage)
3266        vte_libs=$($pkg_config --libs $vtepackage)
3267        vteversion=$($pkg_config --modversion $vtepackage)
3268        vte="yes"
3269    elif test "$vte" = "yes"; then
3270        feature_not_found "vte" "Install libvte-2.90/2.91 devel"
3271    else
3272        vte="no"
3273    fi
3274fi
3275
3276##########################################
3277# SDL probe
3278
3279# Look for sdl configuration program (pkg-config or sdl2-config).  Try
3280# sdl2-config even without cross prefix, and favour pkg-config over sdl2-config.
3281
3282sdl_probe ()
3283{
3284  if $pkg_config sdl2 --exists; then
3285    sdlconfig="$pkg_config sdl2"
3286    sdlversion=$($sdlconfig --modversion 2>/dev/null)
3287  elif has "$sdl2_config"; then
3288    sdlconfig="$sdl2_config"
3289    sdlversion=$($sdlconfig --version)
3290  else
3291    if test "$sdl" = "yes" ; then
3292      feature_not_found "sdl" "Install SDL2-devel"
3293    fi
3294    sdl=no
3295    # no need to do the rest
3296    return
3297  fi
3298  if test -n "$cross_prefix" && test "$(basename "$sdlconfig")" = sdl2-config; then
3299    echo warning: using "\"$sdlconfig\"" to detect cross-compiled sdl >&2
3300  fi
3301
3302  cat > $TMPC << EOF
3303#include <SDL.h>
3304#undef main /* We don't want SDL to override our main() */
3305int main( void ) { return SDL_Init (SDL_INIT_VIDEO); }
3306EOF
3307  sdl_cflags=$($sdlconfig --cflags 2>/dev/null)
3308  sdl_cflags="$sdl_cflags -Wno-undef"  # workaround 2.0.8 bug
3309  if test "$static" = "yes" ; then
3310    if $pkg_config sdl2 --exists; then
3311      sdl_libs=$($pkg_config sdl2 --static --libs 2>/dev/null)
3312    else
3313      sdl_libs=$($sdlconfig --static-libs 2>/dev/null)
3314    fi
3315  else
3316    sdl_libs=$($sdlconfig --libs 2>/dev/null)
3317  fi
3318  if compile_prog "$sdl_cflags" "$sdl_libs" ; then
3319    sdl=yes
3320
3321    # static link with sdl ? (note: sdl.pc's --static --libs is broken)
3322    if test "$sdl" = "yes" && test "$static" = "yes" ; then
3323      if test $? = 0 && echo $sdl_libs | grep -- -laa > /dev/null; then
3324         sdl_libs="$sdl_libs $(aalib-config --static-libs 2>/dev/null)"
3325         sdl_cflags="$sdl_cflags $(aalib-config --cflags 2>/dev/null)"
3326      fi
3327      if compile_prog "$sdl_cflags" "$sdl_libs" ; then
3328	:
3329      else
3330        sdl=no
3331      fi
3332    fi # static link
3333  else # sdl not found
3334    if test "$sdl" = "yes" ; then
3335      feature_not_found "sdl" "Install SDL2 devel"
3336    fi
3337    sdl=no
3338  fi # sdl compile test
3339}
3340
3341sdl_image_probe ()
3342{
3343    if test "$sdl_image" != "no" ; then
3344        if $pkg_config SDL2_image --exists; then
3345            if test "$static" = "yes"; then
3346                sdl_image_libs=$($pkg_config SDL2_image --libs --static 2>/dev/null)
3347            else
3348                sdl_image_libs=$($pkg_config SDL2_image --libs 2>/dev/null)
3349            fi
3350            sdl_image_cflags=$($pkg_config SDL2_image --cflags 2>/dev/null)
3351            sdl_image=yes
3352
3353            sdl_cflags="$sdl_cflags $sdl_image_cflags"
3354            sdl_libs="$sdl_libs $sdl_image_libs"
3355        else
3356            if test "$sdl_image" = "yes" ; then
3357                feature_not_found "sdl_image" "Install SDL Image devel"
3358            else
3359                sdl_image=no
3360            fi
3361        fi
3362    fi
3363}
3364
3365if test "$sdl" != "no" ; then
3366  sdl_probe
3367fi
3368
3369if test "$sdl" = "yes" ; then
3370  sdl_image_probe
3371else
3372  if test "$sdl_image" = "yes"; then
3373    echo "warning: SDL Image requested, but SDL is not available, disabling"
3374  fi
3375  sdl_image=no
3376fi
3377
3378if test "$sdl" = "yes" ; then
3379  cat > $TMPC <<EOF
3380#include <SDL.h>
3381#if defined(SDL_VIDEO_DRIVER_X11)
3382#include <X11/XKBlib.h>
3383#else
3384#error No x11 support
3385#endif
3386int main(void) { return 0; }
3387EOF
3388  if compile_prog "$sdl_cflags $x11_cflags" "$sdl_libs $x11_libs" ; then
3389    need_x11=yes
3390    sdl_cflags="$sdl_cflags $x11_cflags"
3391    sdl_libs="$sdl_libs $x11_libs"
3392  fi
3393fi
3394
3395##########################################
3396# RDMA needs OpenFabrics libraries
3397if test "$rdma" != "no" ; then
3398  cat > $TMPC <<EOF
3399#include <rdma/rdma_cma.h>
3400int main(void) { return 0; }
3401EOF
3402  rdma_libs="-lrdmacm -libverbs -libumad"
3403  if compile_prog "" "$rdma_libs" ; then
3404    rdma="yes"
3405    libs_softmmu="$libs_softmmu $rdma_libs"
3406  else
3407    if test "$rdma" = "yes" ; then
3408        error_exit \
3409            " OpenFabrics librdmacm/libibverbs/libibumad not present." \
3410            " Your options:" \
3411            "  (1) Fast: Install infiniband packages (devel) from your distro." \
3412            "  (2) Cleanest: Install libraries from www.openfabrics.org" \
3413            "  (3) Also: Install softiwarp if you don't have RDMA hardware"
3414    fi
3415    rdma="no"
3416  fi
3417fi
3418
3419##########################################
3420# PVRDMA detection
3421
3422cat > $TMPC <<EOF &&
3423#include <sys/mman.h>
3424
3425int
3426main(void)
3427{
3428    char buf = 0;
3429    void *addr = &buf;
3430    addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
3431
3432    return 0;
3433}
3434EOF
3435
3436if test "$rdma" = "yes" ; then
3437    case "$pvrdma" in
3438    "")
3439        if compile_prog "" ""; then
3440            pvrdma="yes"
3441        else
3442            pvrdma="no"
3443        fi
3444        ;;
3445    "yes")
3446        if ! compile_prog "" ""; then
3447            error_exit "PVRDMA is not supported since mremap is not implemented"
3448        fi
3449        pvrdma="yes"
3450        ;;
3451    "no")
3452        pvrdma="no"
3453        ;;
3454    esac
3455else
3456    if test "$pvrdma" = "yes" ; then
3457        error_exit "PVRDMA requires rdma suppport"
3458    fi
3459    pvrdma="no"
3460fi
3461
3462# Let's see if enhanced reg_mr is supported
3463if test "$pvrdma" = "yes" ; then
3464
3465cat > $TMPC <<EOF &&
3466#include <infiniband/verbs.h>
3467
3468int
3469main(void)
3470{
3471    struct ibv_mr *mr;
3472    struct ibv_pd *pd = NULL;
3473    size_t length = 10;
3474    uint64_t iova = 0;
3475    int access = 0;
3476    void *addr = NULL;
3477
3478    mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
3479
3480    ibv_dereg_mr(mr);
3481
3482    return 0;
3483}
3484EOF
3485    if ! compile_prog "" "-libverbs"; then
3486        QEMU_CFLAGS="$QEMU_CFLAGS -DLEGACY_RDMA_REG_MR"
3487    fi
3488fi
3489
3490##########################################
3491# VNC SASL detection
3492if test "$vnc" = "yes" && test "$vnc_sasl" != "no" ; then
3493  cat > $TMPC <<EOF
3494#include <sasl/sasl.h>
3495#include <stdio.h>
3496int main(void) { sasl_server_init(NULL, "qemu"); return 0; }
3497EOF
3498  # Assuming Cyrus-SASL installed in /usr prefix
3499  # QEMU defines struct iovec in "qemu/osdep.h",
3500  # we don't want libsasl to redefine it in <sasl/sasl.h>.
3501  vnc_sasl_cflags="-DSTRUCT_IOVEC_DEFINED"
3502  vnc_sasl_libs="-lsasl2"
3503  if compile_prog "$vnc_sasl_cflags" "$vnc_sasl_libs" ; then
3504    vnc_sasl=yes
3505    libs_softmmu="$vnc_sasl_libs $libs_softmmu"
3506    QEMU_CFLAGS="$QEMU_CFLAGS $vnc_sasl_cflags"
3507  else
3508    if test "$vnc_sasl" = "yes" ; then
3509      feature_not_found "vnc-sasl" "Install Cyrus SASL devel"
3510    fi
3511    vnc_sasl=no
3512  fi
3513fi
3514
3515##########################################
3516# VNC JPEG detection
3517if test "$vnc" = "yes" && test "$vnc_jpeg" != "no" ; then
3518cat > $TMPC <<EOF
3519#include <stdio.h>
3520#include <jpeglib.h>
3521int main(void) { struct jpeg_compress_struct s; jpeg_create_compress(&s); return 0; }
3522EOF
3523    vnc_jpeg_cflags=""
3524    vnc_jpeg_libs="-ljpeg"
3525  if compile_prog "$vnc_jpeg_cflags" "$vnc_jpeg_libs" ; then
3526    vnc_jpeg=yes
3527    libs_softmmu="$vnc_jpeg_libs $libs_softmmu"
3528    QEMU_CFLAGS="$QEMU_CFLAGS $vnc_jpeg_cflags"
3529  else
3530    if test "$vnc_jpeg" = "yes" ; then
3531      feature_not_found "vnc-jpeg" "Install libjpeg-turbo devel"
3532    fi
3533    vnc_jpeg=no
3534  fi
3535fi
3536
3537##########################################
3538# VNC PNG detection
3539if test "$vnc" = "yes" && test "$vnc_png" != "no" ; then
3540cat > $TMPC <<EOF
3541//#include <stdio.h>
3542#include <png.h>
3543#include <stddef.h>
3544int main(void) {
3545    png_structp png_ptr;
3546    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
3547    return png_ptr != 0;
3548}
3549EOF
3550  if $pkg_config libpng --exists; then
3551    vnc_png_cflags=$($pkg_config libpng --cflags)
3552    vnc_png_libs=$($pkg_config libpng --libs)
3553  else
3554    vnc_png_cflags=""
3555    vnc_png_libs="-lpng"
3556  fi
3557  if compile_prog "$vnc_png_cflags" "$vnc_png_libs" ; then
3558    vnc_png=yes
3559    libs_softmmu="$vnc_png_libs $libs_softmmu"
3560    QEMU_CFLAGS="$QEMU_CFLAGS $vnc_png_cflags"
3561  else
3562    if test "$vnc_png" = "yes" ; then
3563      feature_not_found "vnc-png" "Install libpng devel"
3564    fi
3565    vnc_png=no
3566  fi
3567fi
3568
3569##########################################
3570# xkbcommon probe
3571if test "$xkbcommon" != "no" ; then
3572  if $pkg_config xkbcommon --exists; then
3573    xkbcommon_cflags=$($pkg_config xkbcommon --cflags)
3574    xkbcommon_libs=$($pkg_config xkbcommon --libs)
3575    xkbcommon=yes
3576  else
3577    if test "$xkbcommon" = "yes" ; then
3578      feature_not_found "xkbcommon" "Install libxkbcommon-devel"
3579    fi
3580    xkbcommon=no
3581  fi
3582fi
3583
3584
3585##########################################
3586# xfsctl() probe, used for file-posix.c
3587if test "$xfs" != "no" ; then
3588  cat > $TMPC << EOF
3589#include <stddef.h>  /* NULL */
3590#include <xfs/xfs.h>
3591int main(void)
3592{
3593    xfsctl(NULL, 0, 0, NULL);
3594    return 0;
3595}
3596EOF
3597  if compile_prog "" "" ; then
3598    xfs="yes"
3599  else
3600    if test "$xfs" = "yes" ; then
3601      feature_not_found "xfs" "Instal xfsprogs/xfslibs devel"
3602    fi
3603    xfs=no
3604  fi
3605fi
3606
3607##########################################
3608# vde libraries probe
3609if test "$vde" != "no" ; then
3610  vde_libs="-lvdeplug"
3611  cat > $TMPC << EOF
3612#include <libvdeplug.h>
3613int main(void)
3614{
3615    struct vde_open_args a = {0, 0, 0};
3616    char s[] = "";
3617    vde_open(s, s, &a);
3618    return 0;
3619}
3620EOF
3621  if compile_prog "" "$vde_libs" ; then
3622    vde=yes
3623  else
3624    if test "$vde" = "yes" ; then
3625      feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
3626    fi
3627    vde=no
3628  fi
3629fi
3630
3631##########################################
3632# netmap support probe
3633# Apart from looking for netmap headers, we make sure that the host API version
3634# supports the netmap backend (>=11). The upper bound (15) is meant to simulate
3635# a minor/major version number. Minor new features will be marked with values up
3636# to 15, and if something happens that requires a change to the backend we will
3637# move above 15, submit the backend fixes and modify this two bounds.
3638if test "$netmap" != "no" ; then
3639  cat > $TMPC << EOF
3640#include <inttypes.h>
3641#include <net/if.h>
3642#include <net/netmap.h>
3643#include <net/netmap_user.h>
3644#if (NETMAP_API < 11) || (NETMAP_API > 15)
3645#error
3646#endif
3647int main(void) { return 0; }
3648EOF
3649  if compile_prog "" "" ; then
3650    netmap=yes
3651  else
3652    if test "$netmap" = "yes" ; then
3653      feature_not_found "netmap"
3654    fi
3655    netmap=no
3656  fi
3657fi
3658
3659############################################
3660# efi-aarch64 probe
3661# Check for efi files needed by aarch64 VMs.
3662# By default we will use the efi included with QEMU.
3663# Allow user to override the path for efi also.
3664if ! test -f "$efi_aarch64"; then
3665  if test -f $source_path/pc-bios/edk2-aarch64-code.fd.bz2; then
3666    # valid after build
3667    efi_aarch64=$PWD/pc-bios/edk2-aarch64-code.fd
3668  else
3669    efi_aarch64=""
3670  fi
3671fi
3672
3673##########################################
3674# libcap-ng library probe
3675if test "$cap_ng" != "no" ; then
3676  cap_libs="-lcap-ng"
3677  cat > $TMPC << EOF
3678#include <cap-ng.h>
3679int main(void)
3680{
3681    capng_capability_to_name(CAPNG_EFFECTIVE);
3682    return 0;
3683}
3684EOF
3685  if compile_prog "" "$cap_libs" ; then
3686    cap_ng=yes
3687    libs_tools="$cap_libs $libs_tools"
3688  else
3689    if test "$cap_ng" = "yes" ; then
3690      feature_not_found "cap_ng" "Install libcap-ng devel"
3691    fi
3692    cap_ng=no
3693  fi
3694fi
3695
3696##########################################
3697# Sound support libraries probe
3698
3699audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
3700for drv in $audio_drv_list; do
3701    case $drv in
3702    alsa | try-alsa)
3703    if $pkg_config alsa --exists; then
3704        alsa_libs=$($pkg_config alsa --libs)
3705        if test "$drv" = "try-alsa"; then
3706            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa/alsa/')
3707        fi
3708    else
3709        if test "$drv" = "try-alsa"; then
3710            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa//')
3711        else
3712            error_exit "$drv check failed" \
3713                "Make sure to have the $drv libs and headers installed."
3714        fi
3715    fi
3716    ;;
3717
3718    pa | try-pa)
3719    if $pkg_config libpulse --exists; then
3720        pulse_libs=$($pkg_config libpulse --libs)
3721        if test "$drv" = "try-pa"; then
3722            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa/pa/')
3723        fi
3724    else
3725        if test "$drv" = "try-pa"; then
3726            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa//')
3727        else
3728            error_exit "$drv check failed" \
3729                "Make sure to have the $drv libs and headers installed."
3730        fi
3731    fi
3732    ;;
3733
3734    sdl)
3735    if test "$sdl" = "no"; then
3736        error_exit "sdl not found or disabled, can not use sdl audio driver"
3737    fi
3738    ;;
3739
3740    try-sdl)
3741    if test "$sdl" = "no"; then
3742        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl//')
3743    else
3744        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl/sdl/')
3745    fi
3746    ;;
3747
3748    coreaudio)
3749      coreaudio_libs="-framework CoreAudio"
3750    ;;
3751
3752    dsound)
3753      dsound_libs="-lole32 -ldxguid"
3754      audio_win_int="yes"
3755    ;;
3756
3757    oss)
3758      oss_libs="$oss_lib"
3759    ;;
3760
3761    jack | try-jack)
3762    if $pkg_config jack --exists; then
3763        jack_libs=$($pkg_config jack --libs)
3764        if test "$drv" = "try-jack"; then
3765            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack/jack/')
3766        fi
3767    else
3768        if test "$drv" = "try-jack"; then
3769            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack//')
3770        else
3771            error_exit "$drv check failed" \
3772                "Make sure to have the $drv libs and headers installed."
3773        fi
3774    fi
3775    ;;
3776
3777    *)
3778    echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
3779        error_exit "Unknown driver '$drv' selected" \
3780            "Possible drivers are: $audio_possible_drivers"
3781    }
3782    ;;
3783    esac
3784done
3785
3786##########################################
3787# BrlAPI probe
3788
3789if test "$brlapi" != "no" ; then
3790  brlapi_libs="-lbrlapi"
3791  cat > $TMPC << EOF
3792#include <brlapi.h>
3793#include <stddef.h>
3794int main( void ) { return brlapi__openConnection (NULL, NULL, NULL); }
3795EOF
3796  if compile_prog "" "$brlapi_libs" ; then
3797    brlapi=yes
3798  else
3799    if test "$brlapi" = "yes" ; then
3800      feature_not_found "brlapi" "Install brlapi devel"
3801    fi
3802    brlapi=no
3803  fi
3804fi
3805
3806##########################################
3807# iconv probe
3808if test "$iconv" != "no" ; then
3809  cat > $TMPC << EOF
3810#include <iconv.h>
3811int main(void) {
3812  iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
3813  return conv != (iconv_t) -1;
3814}
3815EOF
3816  iconv_prefix_list="/usr/local:/usr"
3817  iconv_lib_list=":-liconv"
3818  IFS=:
3819  for iconv_prefix in $iconv_prefix_list; do
3820    IFS=:
3821    iconv_cflags="-I$iconv_prefix/include"
3822    iconv_ldflags="-L$iconv_prefix/lib"
3823    for iconv_link in $iconv_lib_list; do
3824      unset IFS
3825      iconv_lib="$iconv_ldflags $iconv_link"
3826      echo "looking at iconv in '$iconv_cflags' '$iconv_lib'" >> config.log
3827      if compile_prog "$iconv_cflags" "$iconv_lib" ; then
3828        iconv_found=yes
3829        break
3830      fi
3831    done
3832    if test "$iconv_found" = yes ; then
3833      break
3834    fi
3835  done
3836  if test "$iconv_found" = "yes" ; then
3837    iconv=yes
3838  else
3839    if test "$iconv" = "yes" ; then
3840      feature_not_found "iconv" "Install iconv devel"
3841    fi
3842    iconv=no
3843  fi
3844fi
3845
3846##########################################
3847# curses probe
3848if test "$iconv" = "no" ; then
3849  # curses will need iconv
3850  curses=no
3851fi
3852if test "$curses" != "no" ; then
3853  if test "$mingw32" = "yes" ; then
3854    curses_inc_list="$($pkg_config --cflags ncurses 2>/dev/null):"
3855    curses_lib_list="$($pkg_config --libs ncurses 2>/dev/null):-lpdcurses"
3856  else
3857    curses_inc_list="$($pkg_config --cflags ncursesw 2>/dev/null):-I/usr/include/ncursesw:"
3858    curses_lib_list="$($pkg_config --libs ncursesw 2>/dev/null):-lncursesw:-lcursesw"
3859  fi
3860  curses_found=no
3861  cat > $TMPC << EOF
3862#include <locale.h>
3863#include <curses.h>
3864#include <wchar.h>
3865#include <langinfo.h>
3866int main(void) {
3867  const char *codeset;
3868  wchar_t wch = L'w';
3869  setlocale(LC_ALL, "");
3870  resize_term(0, 0);
3871  addwstr(L"wide chars\n");
3872  addnwstr(&wch, 1);
3873  add_wch(WACS_DEGREE);
3874  codeset = nl_langinfo(CODESET);
3875  return codeset != 0;
3876}
3877EOF
3878  IFS=:
3879  for curses_inc in $curses_inc_list; do
3880    # Make sure we get the wide character prototypes
3881    curses_inc="-DNCURSES_WIDECHAR $curses_inc"
3882    IFS=:
3883    for curses_lib in $curses_lib_list; do
3884      unset IFS
3885      if compile_prog "$curses_inc" "$curses_lib" ; then
3886        curses_found=yes
3887        break
3888      fi
3889    done
3890    if test "$curses_found" = yes ; then
3891      break
3892    fi
3893  done
3894  unset IFS
3895  if test "$curses_found" = "yes" ; then
3896    curses=yes
3897  else
3898    if test "$curses" = "yes" ; then
3899      feature_not_found "curses" "Install ncurses devel"
3900    fi
3901    curses=no
3902  fi
3903fi
3904
3905##########################################
3906# curl probe
3907if test "$curl" != "no" ; then
3908  if $pkg_config libcurl --exists; then
3909    curlconfig="$pkg_config libcurl"
3910  else
3911    curlconfig=curl-config
3912  fi
3913  cat > $TMPC << EOF
3914#include <curl/curl.h>
3915int main(void) { curl_easy_init(); curl_multi_setopt(0, 0, 0); return 0; }
3916EOF
3917  curl_cflags=$($curlconfig --cflags 2>/dev/null)
3918  curl_libs=$($curlconfig --libs 2>/dev/null)
3919  if compile_prog "$curl_cflags" "$curl_libs" ; then
3920    curl=yes
3921  else
3922    if test "$curl" = "yes" ; then
3923      feature_not_found "curl" "Install libcurl devel"
3924    fi
3925    curl=no
3926  fi
3927fi # test "$curl"
3928
3929##########################################
3930# glib support probe
3931
3932glib_req_ver=2.48
3933glib_modules=gthread-2.0
3934if test "$modules" = yes; then
3935    glib_modules="$glib_modules gmodule-export-2.0"
3936fi
3937if test "$plugins" = yes; then
3938    glib_modules="$glib_modules gmodule-2.0"
3939fi
3940
3941# This workaround is required due to a bug in pkg-config file for glib as it
3942# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
3943
3944if test "$static" = yes && test "$mingw32" = yes; then
3945    QEMU_CFLAGS="-DGLIB_STATIC_COMPILATION $QEMU_CFLAGS"
3946fi
3947
3948for i in $glib_modules; do
3949    if $pkg_config --atleast-version=$glib_req_ver $i; then
3950        glib_cflags=$($pkg_config --cflags $i)
3951        glib_libs=$($pkg_config --libs $i)
3952        QEMU_CFLAGS="$glib_cflags $QEMU_CFLAGS"
3953        LIBS="$glib_libs $LIBS"
3954        libs_qga="$glib_libs $libs_qga"
3955    else
3956        error_exit "glib-$glib_req_ver $i is required to compile QEMU"
3957    fi
3958done
3959
3960if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
3961    gio=yes
3962    gio_cflags=$($pkg_config --cflags gio-2.0)
3963    gio_libs=$($pkg_config --libs gio-2.0)
3964    gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
3965    if [ ! -x "$gdbus_codegen" ]; then
3966        gdbus_codegen=
3967    fi
3968else
3969    gio=no
3970fi
3971
3972if $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
3973    gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
3974    gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
3975fi
3976
3977# Sanity check that the current size_t matches the
3978# size that glib thinks it should be. This catches
3979# problems on multi-arch where people try to build
3980# 32-bit QEMU while pointing at 64-bit glib headers
3981cat > $TMPC <<EOF
3982#include <glib.h>
3983#include <unistd.h>
3984
3985#define QEMU_BUILD_BUG_ON(x) \
3986  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
3987
3988int main(void) {
3989   QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
3990   return 0;
3991}
3992EOF
3993
3994if ! compile_prog "$CFLAGS" "$LIBS" ; then
3995    error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
3996               "You probably need to set PKG_CONFIG_LIBDIR"\
3997	       "to point to the right pkg-config files for your"\
3998	       "build target"
3999fi
4000
4001# Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
4002cat > $TMPC << EOF
4003#include <glib.h>
4004int main(void) { return 0; }
4005EOF
4006if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
4007    if cc_has_warning_flag "-Wno-unknown-attributes"; then
4008        glib_cflags="-Wno-unknown-attributes $glib_cflags"
4009        CFLAGS="-Wno-unknown-attributes $CFLAGS"
4010    fi
4011fi
4012
4013# Silence clang warnings triggered by glib < 2.57.2
4014cat > $TMPC << EOF
4015#include <glib.h>
4016typedef struct Foo {
4017    int i;
4018} Foo;
4019static void foo_free(Foo *f)
4020{
4021    g_free(f);
4022}
4023G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free);
4024int main(void) { return 0; }
4025EOF
4026if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
4027    if cc_has_warning_flag "-Wno-unused-function"; then
4028        glib_cflags="$glib_cflags -Wno-unused-function"
4029        CFLAGS="$CFLAGS -Wno-unused-function"
4030    fi
4031fi
4032
4033#########################################
4034# zlib check
4035
4036if test "$zlib" != "no" ; then
4037    if $pkg_config --exists zlib; then
4038        zlib_cflags=$($pkg_config --cflags zlib)
4039        zlib_libs=$($pkg_config --libs zlib)
4040        QEMU_CFLAGS="$zlib_cflags $QEMU_CFLAGS"
4041        LIBS="$zlib_libs $LIBS"
4042    else
4043        cat > $TMPC << EOF
4044#include <zlib.h>
4045int main(void) { zlibVersion(); return 0; }
4046EOF
4047        if compile_prog "" "-lz" ; then
4048            LIBS="$LIBS -lz"
4049        else
4050            error_exit "zlib check failed" \
4051                "Make sure to have the zlib libs and headers installed."
4052        fi
4053    fi
4054fi
4055
4056##########################################
4057# SHA command probe for modules
4058if test "$modules" = yes; then
4059    shacmd_probe="sha1sum sha1 shasum"
4060    for c in $shacmd_probe; do
4061        if has $c; then
4062            shacmd="$c"
4063            break
4064        fi
4065    done
4066    if test "$shacmd" = ""; then
4067        error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
4068    fi
4069fi
4070
4071##########################################
4072# pixman support probe
4073
4074if test "$want_tools" = "no" && test "$softmmu" = "no"; then
4075  pixman_cflags=
4076  pixman_libs=
4077elif $pkg_config --atleast-version=0.21.8 pixman-1 > /dev/null 2>&1; then
4078  pixman_cflags=$($pkg_config --cflags pixman-1)
4079  pixman_libs=$($pkg_config --libs pixman-1)
4080else
4081  error_exit "pixman >= 0.21.8 not present." \
4082      "Please install the pixman devel package."
4083fi
4084
4085##########################################
4086# libmpathpersist probe
4087
4088if test "$mpath" != "no" ; then
4089  # probe for the new API
4090  cat > $TMPC <<EOF
4091#include <libudev.h>
4092#include <mpath_persist.h>
4093unsigned mpath_mx_alloc_len = 1024;
4094int logsink;
4095static struct config *multipath_conf;
4096extern struct udev *udev;
4097extern struct config *get_multipath_config(void);
4098extern void put_multipath_config(struct config *conf);
4099struct udev *udev;
4100struct config *get_multipath_config(void) { return multipath_conf; }
4101void put_multipath_config(struct config *conf) { }
4102
4103int main(void) {
4104    udev = udev_new();
4105    multipath_conf = mpath_lib_init();
4106    return 0;
4107}
4108EOF
4109  if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
4110    mpathpersist=yes
4111    mpathpersist_new_api=yes
4112  else
4113    # probe for the old API
4114    cat > $TMPC <<EOF
4115#include <libudev.h>
4116#include <mpath_persist.h>
4117unsigned mpath_mx_alloc_len = 1024;
4118int logsink;
4119int main(void) {
4120    struct udev *udev = udev_new();
4121    mpath_lib_init(udev);
4122    return 0;
4123}
4124EOF
4125    if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
4126      mpathpersist=yes
4127      mpathpersist_new_api=no
4128    else
4129      mpathpersist=no
4130    fi
4131  fi
4132else
4133  mpathpersist=no
4134fi
4135
4136##########################################
4137# pthread probe
4138PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
4139
4140pthread=no
4141cat > $TMPC << EOF
4142#include <pthread.h>
4143static void *f(void *p) { return NULL; }
4144int main(void) {
4145  pthread_t thread;
4146  pthread_create(&thread, 0, f, 0);
4147  return 0;
4148}
4149EOF
4150if compile_prog "" "" ; then
4151  pthread=yes
4152else
4153  for pthread_lib in $PTHREADLIBS_LIST; do
4154    if compile_prog "" "$pthread_lib" ; then
4155      pthread=yes
4156      found=no
4157      for lib_entry in $LIBS; do
4158        if test "$lib_entry" = "$pthread_lib"; then
4159          found=yes
4160          break
4161        fi
4162      done
4163      if test "$found" = "no"; then
4164        LIBS="$pthread_lib $LIBS"
4165        libs_qga="$pthread_lib $libs_qga"
4166      fi
4167      PTHREAD_LIB="$pthread_lib"
4168      break
4169    fi
4170  done
4171fi
4172
4173if test "$mingw32" != yes && test "$pthread" = no; then
4174  error_exit "pthread check failed" \
4175      "Make sure to have the pthread libs and headers installed."
4176fi
4177
4178# check for pthread_setname_np with thread id
4179pthread_setname_np_w_tid=no
4180cat > $TMPC << EOF
4181#include <pthread.h>
4182
4183static void *f(void *p) { return NULL; }
4184int main(void)
4185{
4186    pthread_t thread;
4187    pthread_create(&thread, 0, f, 0);
4188    pthread_setname_np(thread, "QEMU");
4189    return 0;
4190}
4191EOF
4192if compile_prog "" "$pthread_lib" ; then
4193  pthread_setname_np_w_tid=yes
4194fi
4195
4196# check for pthread_setname_np without thread id
4197pthread_setname_np_wo_tid=no
4198cat > $TMPC << EOF
4199#include <pthread.h>
4200
4201static void *f(void *p) { pthread_setname_np("QEMU"); }
4202int main(void)
4203{
4204    pthread_t thread;
4205    pthread_create(&thread, 0, f, 0);
4206    return 0;
4207}
4208EOF
4209if compile_prog "" "$pthread_lib" ; then
4210  pthread_setname_np_wo_tid=yes
4211fi
4212
4213##########################################
4214# rbd probe
4215if test "$rbd" != "no" ; then
4216  cat > $TMPC <<EOF
4217#include <stdio.h>
4218#include <rbd/librbd.h>
4219int main(void) {
4220    rados_t cluster;
4221    rados_create(&cluster, NULL);
4222    return 0;
4223}
4224EOF
4225  rbd_libs="-lrbd -lrados"
4226  if compile_prog "" "$rbd_libs" ; then
4227    rbd=yes
4228  else
4229    if test "$rbd" = "yes" ; then
4230      feature_not_found "rados block device" "Install librbd/ceph devel"
4231    fi
4232    rbd=no
4233  fi
4234fi
4235
4236##########################################
4237# libssh probe
4238if test "$libssh" != "no" ; then
4239  if $pkg_config --exists libssh; then
4240    libssh_cflags=$($pkg_config libssh --cflags)
4241    libssh_libs=$($pkg_config libssh --libs)
4242    libssh=yes
4243  else
4244    if test "$libssh" = "yes" ; then
4245      error_exit "libssh required for --enable-libssh"
4246    fi
4247    libssh=no
4248  fi
4249fi
4250
4251##########################################
4252# Check for libssh 0.8
4253# This is done like this instead of using the LIBSSH_VERSION_* and
4254# SSH_VERSION_* macros because some distributions in the past shipped
4255# snapshots of the future 0.8 from Git, and those snapshots did not
4256# have updated version numbers (still referring to 0.7.0).
4257
4258if test "$libssh" = "yes"; then
4259  cat > $TMPC <<EOF
4260#include <libssh/libssh.h>
4261int main(void) { return ssh_get_server_publickey(NULL, NULL); }
4262EOF
4263  if compile_prog "$libssh_cflags" "$libssh_libs"; then
4264    libssh_cflags="-DHAVE_LIBSSH_0_8 $libssh_cflags"
4265  fi
4266fi
4267
4268##########################################
4269# linux-aio probe
4270
4271if test "$linux_aio" != "no" ; then
4272  cat > $TMPC <<EOF
4273#include <libaio.h>
4274#include <sys/eventfd.h>
4275#include <stddef.h>
4276int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
4277EOF
4278  if compile_prog "" "-laio" ; then
4279    linux_aio=yes
4280  else
4281    if test "$linux_aio" = "yes" ; then
4282      feature_not_found "linux AIO" "Install libaio devel"
4283    fi
4284    linux_aio=no
4285  fi
4286fi
4287##########################################
4288# linux-io-uring probe
4289
4290if test "$linux_io_uring" != "no" ; then
4291  if $pkg_config liburing; then
4292    linux_io_uring_cflags=$($pkg_config --cflags liburing)
4293    linux_io_uring_libs=$($pkg_config --libs liburing)
4294    linux_io_uring=yes
4295
4296    # io_uring is used in libqemuutil.a where per-file -libs variables are not
4297    # seen by programs linking the archive.  It's not ideal, but just add the
4298    # library dependency globally.
4299    LIBS="$linux_io_uring_libs $LIBS"
4300  else
4301    if test "$linux_io_uring" = "yes" ; then
4302      feature_not_found "linux io_uring" "Install liburing devel"
4303    fi
4304    linux_io_uring=no
4305  fi
4306fi
4307
4308##########################################
4309# TPM emulation is only on POSIX
4310
4311if test "$tpm" = ""; then
4312  if test "$mingw32" = "yes"; then
4313    tpm=no
4314  else
4315    tpm=yes
4316  fi
4317elif test "$tpm" = "yes"; then
4318  if test "$mingw32" = "yes" ; then
4319    error_exit "TPM emulation only available on POSIX systems"
4320  fi
4321fi
4322
4323##########################################
4324# attr probe
4325
4326if test "$attr" != "no" ; then
4327  cat > $TMPC <<EOF
4328#include <stdio.h>
4329#include <sys/types.h>
4330#ifdef CONFIG_LIBATTR
4331#include <attr/xattr.h>
4332#else
4333#include <sys/xattr.h>
4334#endif
4335int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }
4336EOF
4337  if compile_prog "" "" ; then
4338    attr=yes
4339  # Older distros have <attr/xattr.h>, and need -lattr:
4340  elif compile_prog "-DCONFIG_LIBATTR" "-lattr" ; then
4341    attr=yes
4342    LIBS="-lattr $LIBS"
4343    libattr=yes
4344  else
4345    if test "$attr" = "yes" ; then
4346      feature_not_found "ATTR" "Install libc6 or libattr devel"
4347    fi
4348    attr=no
4349  fi
4350fi
4351
4352##########################################
4353# iovec probe
4354cat > $TMPC <<EOF
4355#include <sys/types.h>
4356#include <sys/uio.h>
4357#include <unistd.h>
4358int main(void) { return sizeof(struct iovec); }
4359EOF
4360iovec=no
4361if compile_prog "" "" ; then
4362  iovec=yes
4363fi
4364
4365##########################################
4366# preadv probe
4367cat > $TMPC <<EOF
4368#include <sys/types.h>
4369#include <sys/uio.h>
4370#include <unistd.h>
4371int main(void) { return preadv(0, 0, 0, 0); }
4372EOF
4373preadv=no
4374if compile_prog "" "" ; then
4375  preadv=yes
4376fi
4377
4378##########################################
4379# fdt probe
4380# fdt support is mandatory for at least some target architectures,
4381# so insist on it if we're building those system emulators.
4382fdt_required=no
4383for target in $target_list; do
4384  case $target in
4385    aarch64*-softmmu|arm*-softmmu|ppc*-softmmu|microblaze*-softmmu|mips64el-softmmu|riscv*-softmmu|rx-softmmu)
4386      fdt_required=yes
4387    ;;
4388  esac
4389done
4390
4391if test "$fdt_required" = "yes"; then
4392  if test "$fdt" = "no"; then
4393    error_exit "fdt disabled but some requested targets require it." \
4394      "You can turn off fdt only if you also disable all the system emulation" \
4395      "targets which need it (by specifying a cut down --target-list)."
4396  fi
4397  fdt=yes
4398elif test "$fdt" != "yes" ; then
4399  fdt=no
4400fi
4401
4402# fdt is only required when building softmmu targets
4403if test -z "$fdt" -a "$softmmu" != "yes" ; then
4404    fdt="no"
4405fi
4406
4407if test "$fdt" != "no" ; then
4408  fdt_libs="-lfdt"
4409  # explicitly check for libfdt_env.h as it is missing in some stable installs
4410  # and test for required functions to make sure we are on a version >= 1.4.2
4411  cat > $TMPC << EOF
4412#include <libfdt.h>
4413#include <libfdt_env.h>
4414int main(void) { fdt_check_full(NULL, 0); return 0; }
4415EOF
4416  if compile_prog "" "$fdt_libs" ; then
4417    # system DTC is good - use it
4418    fdt=system
4419  else
4420      # have GIT checkout, so activate dtc submodule
4421      if test -e "${source_path}/.git" ; then
4422          git_submodules="${git_submodules} dtc"
4423      fi
4424      if test -d "${source_path}/dtc/libfdt" || test -e "${source_path}/.git" ; then
4425          fdt=git
4426          mkdir -p dtc
4427          if [ "$pwd_is_source_path" != "y" ] ; then
4428              symlink "$source_path/dtc/Makefile" "dtc/Makefile"
4429          fi
4430          fdt_cflags="-I\$(SRC_PATH)/dtc/libfdt"
4431          fdt_ldflags="-L\$(BUILD_DIR)/dtc/libfdt"
4432          fdt_libs="$fdt_libs"
4433      elif test "$fdt" = "yes" ; then
4434          # Not a git build & no libfdt found, prompt for system install
4435          error_exit "DTC (libfdt) version >= 1.4.2 not present." \
4436                     "Please install the DTC (libfdt) devel package"
4437      else
4438          # don't have and don't want
4439          fdt_libs=
4440          fdt=no
4441      fi
4442  fi
4443fi
4444
4445libs_softmmu="$libs_softmmu $fdt_libs"
4446
4447##########################################
4448# opengl probe (for sdl2, gtk, milkymist-tmu2)
4449
4450gbm="no"
4451if $pkg_config gbm; then
4452    gbm_cflags="$($pkg_config --cflags gbm)"
4453    gbm_libs="$($pkg_config --libs gbm)"
4454    gbm="yes"
4455fi
4456
4457if test "$opengl" != "no" ; then
4458  opengl_pkgs="epoxy gbm"
4459  if $pkg_config $opengl_pkgs; then
4460    opengl_cflags="$($pkg_config --cflags $opengl_pkgs)"
4461    opengl_libs="$($pkg_config --libs $opengl_pkgs)"
4462    opengl=yes
4463    if test "$gtk" = "yes" && $pkg_config --exists "$gtkpackage >= 3.16"; then
4464        gtk_gl="yes"
4465    fi
4466    QEMU_CFLAGS="$QEMU_CFLAGS $opengl_cflags"
4467  else
4468    if test "$opengl" = "yes" ; then
4469      feature_not_found "opengl" "Please install opengl (mesa) devel pkgs: $opengl_pkgs"
4470    fi
4471    opengl_cflags=""
4472    opengl_libs=""
4473    opengl=no
4474  fi
4475fi
4476
4477if test "$opengl" = "yes"; then
4478  cat > $TMPC << EOF
4479#include <epoxy/egl.h>
4480#ifndef EGL_MESA_image_dma_buf_export
4481# error mesa/epoxy lacks support for dmabufs (mesa 10.6+)
4482#endif
4483int main(void) { return 0; }
4484EOF
4485  if compile_prog "" "" ; then
4486    opengl_dmabuf=yes
4487  fi
4488fi
4489
4490if test "$opengl" = "yes" && test "$have_x11" = "yes"; then
4491  for target in $target_list; do
4492    case $target in
4493      lm32-softmmu) # milkymist-tmu2 requires X11 and OpenGL
4494        need_x11=yes
4495      ;;
4496    esac
4497  done
4498fi
4499
4500##########################################
4501# libxml2 probe
4502if test "$libxml2" != "no" ; then
4503    if $pkg_config --exists libxml-2.0; then
4504        libxml2="yes"
4505        libxml2_cflags=$($pkg_config --cflags libxml-2.0)
4506        libxml2_libs=$($pkg_config --libs libxml-2.0)
4507    else
4508        if test "$libxml2" = "yes"; then
4509            feature_not_found "libxml2" "Install libxml2 devel"
4510        fi
4511        libxml2="no"
4512    fi
4513fi
4514
4515##########################################
4516# glusterfs probe
4517if test "$glusterfs" != "no" ; then
4518  if $pkg_config --atleast-version=3 glusterfs-api; then
4519    glusterfs="yes"
4520    glusterfs_cflags=$($pkg_config --cflags glusterfs-api)
4521    glusterfs_libs=$($pkg_config --libs glusterfs-api)
4522    if $pkg_config --atleast-version=4 glusterfs-api; then
4523      glusterfs_xlator_opt="yes"
4524    fi
4525    if $pkg_config --atleast-version=5 glusterfs-api; then
4526      glusterfs_discard="yes"
4527    fi
4528    if $pkg_config --atleast-version=6 glusterfs-api; then
4529      glusterfs_fallocate="yes"
4530      glusterfs_zerofill="yes"
4531    fi
4532    cat > $TMPC << EOF
4533#include <glusterfs/api/glfs.h>
4534
4535int
4536main(void)
4537{
4538	/* new glfs_ftruncate() passes two additional args */
4539	return glfs_ftruncate(NULL, 0, NULL, NULL);
4540}
4541EOF
4542    if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
4543      glusterfs_ftruncate_has_stat="yes"
4544    fi
4545    cat > $TMPC << EOF
4546#include <glusterfs/api/glfs.h>
4547
4548/* new glfs_io_cbk() passes two additional glfs_stat structs */
4549static void
4550glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
4551{}
4552
4553int
4554main(void)
4555{
4556	glfs_io_cbk iocb = &glusterfs_iocb;
4557	iocb(NULL, 0 , NULL, NULL, NULL);
4558	return 0;
4559}
4560EOF
4561    if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
4562      glusterfs_iocb_has_stat="yes"
4563    fi
4564  else
4565    if test "$glusterfs" = "yes" ; then
4566      feature_not_found "GlusterFS backend support" \
4567          "Install glusterfs-api devel >= 3"
4568    fi
4569    glusterfs="no"
4570  fi
4571fi
4572
4573# Check for inotify functions when we are building linux-user
4574# emulator.  This is done because older glibc versions don't
4575# have syscall stubs for these implemented.  In that case we
4576# don't provide them even if kernel supports them.
4577#
4578inotify=no
4579cat > $TMPC << EOF
4580#include <sys/inotify.h>
4581
4582int
4583main(void)
4584{
4585	/* try to start inotify */
4586	return inotify_init();
4587}
4588EOF
4589if compile_prog "" "" ; then
4590  inotify=yes
4591fi
4592
4593inotify1=no
4594cat > $TMPC << EOF
4595#include <sys/inotify.h>
4596
4597int
4598main(void)
4599{
4600    /* try to start inotify */
4601    return inotify_init1(0);
4602}
4603EOF
4604if compile_prog "" "" ; then
4605  inotify1=yes
4606fi
4607
4608# check if pipe2 is there
4609pipe2=no
4610cat > $TMPC << EOF
4611#include <unistd.h>
4612#include <fcntl.h>
4613
4614int main(void)
4615{
4616    int pipefd[2];
4617    return pipe2(pipefd, O_CLOEXEC);
4618}
4619EOF
4620if compile_prog "" "" ; then
4621  pipe2=yes
4622fi
4623
4624# check if accept4 is there
4625accept4=no
4626cat > $TMPC << EOF
4627#include <sys/socket.h>
4628#include <stddef.h>
4629
4630int main(void)
4631{
4632    accept4(0, NULL, NULL, SOCK_CLOEXEC);
4633    return 0;
4634}
4635EOF
4636if compile_prog "" "" ; then
4637  accept4=yes
4638fi
4639
4640# check if tee/splice is there. vmsplice was added same time.
4641splice=no
4642cat > $TMPC << EOF
4643#include <unistd.h>
4644#include <fcntl.h>
4645#include <limits.h>
4646
4647int main(void)
4648{
4649    int len, fd = 0;
4650    len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
4651    splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
4652    return 0;
4653}
4654EOF
4655if compile_prog "" "" ; then
4656  splice=yes
4657fi
4658
4659##########################################
4660# libnuma probe
4661
4662if test "$numa" != "no" ; then
4663  cat > $TMPC << EOF
4664#include <numa.h>
4665int main(void) { return numa_available(); }
4666EOF
4667
4668  if compile_prog "" "-lnuma" ; then
4669    numa=yes
4670    libs_softmmu="-lnuma $libs_softmmu"
4671  else
4672    if test "$numa" = "yes" ; then
4673      feature_not_found "numa" "install numactl devel"
4674    fi
4675    numa=no
4676  fi
4677fi
4678
4679if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
4680    echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
4681    exit 1
4682fi
4683
4684# Even if malloc_trim() is available, these non-libc memory allocators
4685# do not support it.
4686if test "$tcmalloc" = "yes" || test "$jemalloc" = "yes" ; then
4687    if test "$malloc_trim" = "yes" ; then
4688        echo "Disabling malloc_trim with non-libc memory allocator"
4689    fi
4690    malloc_trim="no"
4691fi
4692
4693#######################################
4694# malloc_trim
4695
4696if test "$malloc_trim" != "no" ; then
4697    cat > $TMPC << EOF
4698#include <malloc.h>
4699int main(void) { malloc_trim(0); return 0; }
4700EOF
4701    if compile_prog "" "" ; then
4702        malloc_trim="yes"
4703    else
4704        malloc_trim="no"
4705    fi
4706fi
4707
4708##########################################
4709# tcmalloc probe
4710
4711if test "$tcmalloc" = "yes" ; then
4712  cat > $TMPC << EOF
4713#include <stdlib.h>
4714int main(void) {
4715    void *tmp = malloc(1);
4716    if (tmp != NULL) {
4717        return 0;
4718    }
4719    return 1;
4720}
4721EOF
4722
4723  if compile_prog "" "-ltcmalloc" ; then
4724    LIBS="-ltcmalloc $LIBS"
4725  else
4726    feature_not_found "tcmalloc" "install gperftools devel"
4727  fi
4728fi
4729
4730##########################################
4731# jemalloc probe
4732
4733if test "$jemalloc" = "yes" ; then
4734  cat > $TMPC << EOF
4735#include <stdlib.h>
4736int main(void) {
4737    void *tmp = malloc(1);
4738    if (tmp != NULL) {
4739        return 0;
4740    }
4741    return 1;
4742}
4743EOF
4744
4745  if compile_prog "" "-ljemalloc" ; then
4746    LIBS="-ljemalloc $LIBS"
4747  else
4748    feature_not_found "jemalloc" "install jemalloc devel"
4749  fi
4750fi
4751
4752##########################################
4753# signalfd probe
4754signalfd="no"
4755cat > $TMPC << EOF
4756#include <unistd.h>
4757#include <sys/syscall.h>
4758#include <signal.h>
4759int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }
4760EOF
4761
4762if compile_prog "" "" ; then
4763  signalfd=yes
4764fi
4765
4766# check if optreset global is declared by <getopt.h>
4767optreset="no"
4768cat > $TMPC << EOF
4769#include <getopt.h>
4770int main(void) { return optreset; }
4771EOF
4772
4773if compile_prog "" "" ; then
4774  optreset=yes
4775fi
4776
4777# check if eventfd is supported
4778eventfd=no
4779cat > $TMPC << EOF
4780#include <sys/eventfd.h>
4781
4782int main(void)
4783{
4784    return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
4785}
4786EOF
4787if compile_prog "" "" ; then
4788  eventfd=yes
4789fi
4790
4791# check if memfd is supported
4792memfd=no
4793cat > $TMPC << EOF
4794#include <sys/mman.h>
4795
4796int main(void)
4797{
4798    return memfd_create("foo", MFD_ALLOW_SEALING);
4799}
4800EOF
4801if compile_prog "" "" ; then
4802  memfd=yes
4803fi
4804
4805# check for usbfs
4806have_usbfs=no
4807if test "$linux_user" = "yes"; then
4808  cat > $TMPC << EOF
4809#include <linux/usbdevice_fs.h>
4810
4811#ifndef USBDEVFS_GET_CAPABILITIES
4812#error "USBDEVFS_GET_CAPABILITIES undefined"
4813#endif
4814
4815#ifndef USBDEVFS_DISCONNECT_CLAIM
4816#error "USBDEVFS_DISCONNECT_CLAIM undefined"
4817#endif
4818
4819int main(void)
4820{
4821    return 0;
4822}
4823EOF
4824  if compile_prog "" ""; then
4825    have_usbfs=yes
4826  fi
4827fi
4828
4829# check for fallocate
4830fallocate=no
4831cat > $TMPC << EOF
4832#include <fcntl.h>
4833
4834int main(void)
4835{
4836    fallocate(0, 0, 0, 0);
4837    return 0;
4838}
4839EOF
4840if compile_prog "" "" ; then
4841  fallocate=yes
4842fi
4843
4844# check for fallocate hole punching
4845fallocate_punch_hole=no
4846cat > $TMPC << EOF
4847#include <fcntl.h>
4848#include <linux/falloc.h>
4849
4850int main(void)
4851{
4852    fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
4853    return 0;
4854}
4855EOF
4856if compile_prog "" "" ; then
4857  fallocate_punch_hole=yes
4858fi
4859
4860# check that fallocate supports range zeroing inside the file
4861fallocate_zero_range=no
4862cat > $TMPC << EOF
4863#include <fcntl.h>
4864#include <linux/falloc.h>
4865
4866int main(void)
4867{
4868    fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0);
4869    return 0;
4870}
4871EOF
4872if compile_prog "" "" ; then
4873  fallocate_zero_range=yes
4874fi
4875
4876# check for posix_fallocate
4877posix_fallocate=no
4878cat > $TMPC << EOF
4879#include <fcntl.h>
4880
4881int main(void)
4882{
4883    posix_fallocate(0, 0, 0);
4884    return 0;
4885}
4886EOF
4887if compile_prog "" "" ; then
4888    posix_fallocate=yes
4889fi
4890
4891# check for sync_file_range
4892sync_file_range=no
4893cat > $TMPC << EOF
4894#include <fcntl.h>
4895
4896int main(void)
4897{
4898    sync_file_range(0, 0, 0, 0);
4899    return 0;
4900}
4901EOF
4902if compile_prog "" "" ; then
4903  sync_file_range=yes
4904fi
4905
4906# check for linux/fiemap.h and FS_IOC_FIEMAP
4907fiemap=no
4908cat > $TMPC << EOF
4909#include <sys/ioctl.h>
4910#include <linux/fs.h>
4911#include <linux/fiemap.h>
4912
4913int main(void)
4914{
4915    ioctl(0, FS_IOC_FIEMAP, 0);
4916    return 0;
4917}
4918EOF
4919if compile_prog "" "" ; then
4920  fiemap=yes
4921fi
4922
4923# check for dup3
4924dup3=no
4925cat > $TMPC << EOF
4926#include <unistd.h>
4927
4928int main(void)
4929{
4930    dup3(0, 0, 0);
4931    return 0;
4932}
4933EOF
4934if compile_prog "" "" ; then
4935  dup3=yes
4936fi
4937
4938# check for ppoll support
4939ppoll=no
4940cat > $TMPC << EOF
4941#include <poll.h>
4942
4943int main(void)
4944{
4945    struct pollfd pfd = { .fd = 0, .events = 0, .revents = 0 };
4946    ppoll(&pfd, 1, 0, 0);
4947    return 0;
4948}
4949EOF
4950if compile_prog "" "" ; then
4951  ppoll=yes
4952fi
4953
4954# check for prctl(PR_SET_TIMERSLACK , ... ) support
4955prctl_pr_set_timerslack=no
4956cat > $TMPC << EOF
4957#include <sys/prctl.h>
4958
4959int main(void)
4960{
4961    prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0);
4962    return 0;
4963}
4964EOF
4965if compile_prog "" "" ; then
4966  prctl_pr_set_timerslack=yes
4967fi
4968
4969# check for epoll support
4970epoll=no
4971cat > $TMPC << EOF
4972#include <sys/epoll.h>
4973
4974int main(void)
4975{
4976    epoll_create(0);
4977    return 0;
4978}
4979EOF
4980if compile_prog "" "" ; then
4981  epoll=yes
4982fi
4983
4984# epoll_create1 is a later addition
4985# so we must check separately for its presence
4986epoll_create1=no
4987cat > $TMPC << EOF
4988#include <sys/epoll.h>
4989
4990int main(void)
4991{
4992    /* Note that we use epoll_create1 as a value, not as
4993     * a function being called. This is necessary so that on
4994     * old SPARC glibc versions where the function was present in
4995     * the library but not declared in the header file we will
4996     * fail the configure check. (Otherwise we will get a compiler
4997     * warning but not an error, and will proceed to fail the
4998     * qemu compile where we compile with -Werror.)
4999     */
5000    return (int)(uintptr_t)&epoll_create1;
5001}
5002EOF
5003if compile_prog "" "" ; then
5004  epoll_create1=yes
5005fi
5006
5007# check for sendfile support
5008sendfile=no
5009cat > $TMPC << EOF
5010#include <sys/sendfile.h>
5011
5012int main(void)
5013{
5014    return sendfile(0, 0, 0, 0);
5015}
5016EOF
5017if compile_prog "" "" ; then
5018  sendfile=yes
5019fi
5020
5021# check for timerfd support (glibc 2.8 and newer)
5022timerfd=no
5023cat > $TMPC << EOF
5024#include <sys/timerfd.h>
5025
5026int main(void)
5027{
5028    return(timerfd_create(CLOCK_REALTIME, 0));
5029}
5030EOF
5031if compile_prog "" "" ; then
5032  timerfd=yes
5033fi
5034
5035# check for setns and unshare support
5036setns=no
5037cat > $TMPC << EOF
5038#include <sched.h>
5039
5040int main(void)
5041{
5042    int ret;
5043    ret = setns(0, 0);
5044    ret = unshare(0);
5045    return ret;
5046}
5047EOF
5048if compile_prog "" "" ; then
5049  setns=yes
5050fi
5051
5052# clock_adjtime probe
5053clock_adjtime=no
5054cat > $TMPC <<EOF
5055#include <time.h>
5056
5057int main(void)
5058{
5059    return clock_adjtime(0, 0);
5060}
5061EOF
5062clock_adjtime=no
5063if compile_prog "" "" ; then
5064  clock_adjtime=yes
5065fi
5066
5067# syncfs probe
5068syncfs=no
5069cat > $TMPC <<EOF
5070#include <unistd.h>
5071
5072int main(void)
5073{
5074    return syncfs(0);
5075}
5076EOF
5077syncfs=no
5078if compile_prog "" "" ; then
5079  syncfs=yes
5080fi
5081
5082# check for kcov support (kernel must be 4.4+, compiled with certain options)
5083kcov=no
5084if check_include sys/kcov.h ; then
5085    kcov=yes
5086fi
5087
5088# If we're making warnings fatal, apply this to Sphinx runs as well
5089sphinx_werror=""
5090if test "$werror" = "yes"; then
5091    sphinx_werror="-W"
5092fi
5093
5094# Check we have a new enough version of sphinx-build
5095has_sphinx_build() {
5096    # This is a bit awkward but works: create a trivial document and
5097    # try to run it with our configuration file (which enforces a
5098    # version requirement). This will fail if either
5099    # sphinx-build doesn't exist at all or if it is too old.
5100    mkdir -p "$TMPDIR1/sphinx"
5101    touch "$TMPDIR1/sphinx/index.rst"
5102    "$sphinx_build" $sphinx_werror -c "$source_path/docs" \
5103                    -b html "$TMPDIR1/sphinx" \
5104                    "$TMPDIR1/sphinx/out"  >> config.log 2>&1
5105}
5106
5107# Check if tools are available to build documentation.
5108if test "$docs" != "no" ; then
5109  if has_sphinx_build; then
5110    sphinx_ok=yes
5111  else
5112    sphinx_ok=no
5113  fi
5114  if has makeinfo && has pod2man && test "$sphinx_ok" = "yes"; then
5115    docs=yes
5116  else
5117    if test "$docs" = "yes" ; then
5118      if has $sphinx_build && test "$sphinx_ok" != "yes"; then
5119        echo "Warning: $sphinx_build exists but it is either too old or uses too old a Python version" >&2
5120      fi
5121      feature_not_found "docs" "Install texinfo, Perl/perl-podlators and a Python 3 version of python-sphinx"
5122    fi
5123    docs=no
5124  fi
5125fi
5126
5127# Search for bswap_32 function
5128byteswap_h=no
5129cat > $TMPC << EOF
5130#include <byteswap.h>
5131int main(void) { return bswap_32(0); }
5132EOF
5133if compile_prog "" "" ; then
5134  byteswap_h=yes
5135fi
5136
5137# Search for bswap32 function
5138bswap_h=no
5139cat > $TMPC << EOF
5140#include <sys/endian.h>
5141#include <sys/types.h>
5142#include <machine/bswap.h>
5143int main(void) { return bswap32(0); }
5144EOF
5145if compile_prog "" "" ; then
5146  bswap_h=yes
5147fi
5148
5149##########################################
5150# Do we have libiscsi >= 1.9.0
5151if test "$libiscsi" != "no" ; then
5152  if $pkg_config --atleast-version=1.9.0 libiscsi; then
5153    libiscsi="yes"
5154    libiscsi_cflags=$($pkg_config --cflags libiscsi)
5155    libiscsi_libs=$($pkg_config --libs libiscsi)
5156  else
5157    if test "$libiscsi" = "yes" ; then
5158      feature_not_found "libiscsi" "Install libiscsi >= 1.9.0"
5159    fi
5160    libiscsi="no"
5161  fi
5162fi
5163
5164##########################################
5165# Do we need libm
5166cat > $TMPC << EOF
5167#include <math.h>
5168int main(int argc, char **argv) { return isnan(sin((double)argc)); }
5169EOF
5170if compile_prog "" "" ; then
5171  :
5172elif compile_prog "" "-lm" ; then
5173  LIBS="-lm $LIBS"
5174  libs_qga="-lm $libs_qga"
5175else
5176  error_exit "libm check failed"
5177fi
5178
5179##########################################
5180# Do we need librt
5181# uClibc provides 2 versions of clock_gettime(), one with realtime
5182# support and one without. This means that the clock_gettime() don't
5183# need -lrt. We still need it for timer_create() so we check for this
5184# function in addition.
5185cat > $TMPC <<EOF
5186#include <signal.h>
5187#include <time.h>
5188int main(void) {
5189  timer_create(CLOCK_REALTIME, NULL, NULL);
5190  return clock_gettime(CLOCK_REALTIME, NULL);
5191}
5192EOF
5193
5194if compile_prog "" "" ; then
5195  :
5196# we need pthread for static linking. use previous pthread test result
5197elif compile_prog "" "$pthread_lib -lrt" ; then
5198  LIBS="$LIBS -lrt"
5199  libs_qga="$libs_qga -lrt"
5200fi
5201
5202# Check whether we need to link libutil for openpty()
5203cat > $TMPC << EOF
5204extern int openpty(int *am, int *as, char *name, void *termp, void *winp);
5205int main(void) { return openpty(0, 0, 0, 0, 0); }
5206EOF
5207
5208have_openpty="no"
5209if compile_prog "" "" ; then
5210  have_openpty="yes"
5211else
5212  if compile_prog "" "-lutil" ; then
5213    libs_softmmu="-lutil $libs_softmmu"
5214    libs_tools="-lutil $libs_tools"
5215    have_openpty="yes"
5216  fi
5217fi
5218
5219##########################################
5220# spice probe
5221if test "$spice" != "no" ; then
5222  cat > $TMPC << EOF
5223#include <spice.h>
5224int main(void) { spice_server_new(); return 0; }
5225EOF
5226  spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
5227  spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
5228  if $pkg_config --atleast-version=0.12.5 spice-server && \
5229     $pkg_config --atleast-version=0.12.3 spice-protocol && \
5230     compile_prog "$spice_cflags" "$spice_libs" ; then
5231    spice="yes"
5232    libs_softmmu="$libs_softmmu $spice_libs"
5233    QEMU_CFLAGS="$QEMU_CFLAGS $spice_cflags"
5234    spice_protocol_version=$($pkg_config --modversion spice-protocol)
5235    spice_server_version=$($pkg_config --modversion spice-server)
5236  else
5237    if test "$spice" = "yes" ; then
5238      feature_not_found "spice" \
5239          "Install spice-server(>=0.12.5) and spice-protocol(>=0.12.3) devel"
5240    fi
5241    spice="no"
5242  fi
5243fi
5244
5245# check for smartcard support
5246if test "$smartcard" != "no"; then
5247    if $pkg_config --atleast-version=2.5.1 libcacard; then
5248        libcacard_cflags=$($pkg_config --cflags libcacard)
5249        libcacard_libs=$($pkg_config --libs libcacard)
5250        smartcard="yes"
5251    else
5252        if test "$smartcard" = "yes"; then
5253            feature_not_found "smartcard" "Install libcacard devel"
5254        fi
5255        smartcard="no"
5256    fi
5257fi
5258
5259# check for libusb
5260if test "$libusb" != "no" ; then
5261    if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
5262        libusb="yes"
5263        libusb_cflags=$($pkg_config --cflags libusb-1.0)
5264        libusb_libs=$($pkg_config --libs libusb-1.0)
5265    else
5266        if test "$libusb" = "yes"; then
5267            feature_not_found "libusb" "Install libusb devel >= 1.0.13"
5268        fi
5269        libusb="no"
5270    fi
5271fi
5272
5273# check for usbredirparser for usb network redirection support
5274if test "$usb_redir" != "no" ; then
5275    if $pkg_config --atleast-version=0.6 libusbredirparser-0.5; then
5276        usb_redir="yes"
5277        usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5)
5278        usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5)
5279    else
5280        if test "$usb_redir" = "yes"; then
5281            feature_not_found "usb-redir" "Install usbredir devel"
5282        fi
5283        usb_redir="no"
5284    fi
5285fi
5286
5287##########################################
5288# check if we have VSS SDK headers for win
5289
5290if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
5291        test "$vss_win32_sdk" != "no" ; then
5292  case "$vss_win32_sdk" in
5293    "")   vss_win32_include="-isystem $source_path" ;;
5294    *\ *) # The SDK is installed in "Program Files" by default, but we cannot
5295          # handle path with spaces. So we symlink the headers into ".sdk/vss".
5296          vss_win32_include="-isystem $source_path/.sdk/vss"
5297	  symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
5298	  ;;
5299    *)    vss_win32_include="-isystem $vss_win32_sdk"
5300  esac
5301  cat > $TMPC << EOF
5302#define __MIDL_user_allocate_free_DEFINED__
5303#include <inc/win2003/vss.h>
5304int main(void) { return VSS_CTX_BACKUP; }
5305EOF
5306  if compile_prog "$vss_win32_include" "" ; then
5307    guest_agent_with_vss="yes"
5308    QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
5309    libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
5310    qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
5311  else
5312    if test "$vss_win32_sdk" != "" ; then
5313      echo "ERROR: Please download and install Microsoft VSS SDK:"
5314      echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
5315      echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
5316      echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
5317      echo "ERROR: The headers are extracted in the directory \`inc'."
5318      feature_not_found "VSS support"
5319    fi
5320    guest_agent_with_vss="no"
5321  fi
5322fi
5323
5324##########################################
5325# lookup Windows platform SDK (if not specified)
5326# The SDK is needed only to build .tlb (type library) file of guest agent
5327# VSS provider from the source. It is usually unnecessary because the
5328# pre-compiled .tlb file is included.
5329
5330if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
5331        test "$guest_agent_with_vss" = "yes" ; then
5332  if test -z "$win_sdk"; then
5333    programfiles="$PROGRAMFILES"
5334    test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
5335    if test -n "$programfiles"; then
5336      win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
5337    else
5338      feature_not_found "Windows SDK"
5339    fi
5340  elif test "$win_sdk" = "no"; then
5341    win_sdk=""
5342  fi
5343fi
5344
5345##########################################
5346# check if mingw environment provides a recent ntddscsi.h
5347if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
5348  cat > $TMPC << EOF
5349#include <windows.h>
5350#include <ntddscsi.h>
5351int main(void) {
5352#if !defined(IOCTL_SCSI_GET_ADDRESS)
5353#error Missing required ioctl definitions
5354#endif
5355  SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
5356  return addr.Lun;
5357}
5358EOF
5359  if compile_prog "" "" ; then
5360    guest_agent_ntddscsi=yes
5361    libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
5362  fi
5363fi
5364
5365##########################################
5366# virgl renderer probe
5367
5368if test "$virglrenderer" != "no" ; then
5369  cat > $TMPC << EOF
5370#include <virglrenderer.h>
5371int main(void) { virgl_renderer_poll(); return 0; }
5372EOF
5373  virgl_cflags=$($pkg_config --cflags virglrenderer 2>/dev/null)
5374  virgl_libs=$($pkg_config --libs virglrenderer 2>/dev/null)
5375  virgl_version=$($pkg_config --modversion virglrenderer 2>/dev/null)
5376  if $pkg_config virglrenderer >/dev/null 2>&1 && \
5377     compile_prog "$virgl_cflags" "$virgl_libs" ; then
5378    virglrenderer="yes"
5379  else
5380    if test "$virglrenderer" = "yes" ; then
5381      feature_not_found "virglrenderer"
5382    fi
5383    virglrenderer="no"
5384  fi
5385fi
5386
5387##########################################
5388# capstone
5389
5390case "$capstone" in
5391  "" | yes)
5392    if $pkg_config capstone; then
5393      capstone=system
5394    elif test -e "${source_path}/.git" && test $git_update = 'yes' ; then
5395      capstone=git
5396    elif test -e "${source_path}/capstone/Makefile" ; then
5397      capstone=internal
5398    elif test -z "$capstone" ; then
5399      capstone=no
5400    else
5401      feature_not_found "capstone" "Install capstone devel or git submodule"
5402    fi
5403    ;;
5404
5405  system)
5406    if ! $pkg_config capstone; then
5407      feature_not_found "capstone" "Install capstone devel"
5408    fi
5409    ;;
5410esac
5411
5412case "$capstone" in
5413  git | internal)
5414    if test "$capstone" = git; then
5415      git_submodules="${git_submodules} capstone"
5416    fi
5417    mkdir -p capstone
5418    QEMU_CFLAGS="$QEMU_CFLAGS -I\$(SRC_PATH)/capstone/include"
5419    if test "$mingw32" = "yes"; then
5420      LIBCAPSTONE=capstone.lib
5421    else
5422      LIBCAPSTONE=libcapstone.a
5423    fi
5424    libs_cpu="-L\$(BUILD_DIR)/capstone -lcapstone $libs_cpu"
5425    ;;
5426
5427  system)
5428    QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags capstone)"
5429    libs_cpu="$($pkg_config --libs capstone) $libs_cpu"
5430    ;;
5431
5432  no)
5433    ;;
5434  *)
5435    error_exit "Unknown state for capstone: $capstone"
5436    ;;
5437esac
5438
5439##########################################
5440# check if we have fdatasync
5441
5442fdatasync=no
5443cat > $TMPC << EOF
5444#include <unistd.h>
5445int main(void) {
5446#if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
5447return fdatasync(0);
5448#else
5449#error Not supported
5450#endif
5451}
5452EOF
5453if compile_prog "" "" ; then
5454    fdatasync=yes
5455fi
5456
5457##########################################
5458# check if we have madvise
5459
5460madvise=no
5461cat > $TMPC << EOF
5462#include <sys/types.h>
5463#include <sys/mman.h>
5464#include <stddef.h>
5465int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }
5466EOF
5467if compile_prog "" "" ; then
5468    madvise=yes
5469fi
5470
5471##########################################
5472# check if we have posix_madvise
5473
5474posix_madvise=no
5475cat > $TMPC << EOF
5476#include <sys/mman.h>
5477#include <stddef.h>
5478int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }
5479EOF
5480if compile_prog "" "" ; then
5481    posix_madvise=yes
5482fi
5483
5484##########################################
5485# check if we have posix_memalign()
5486
5487posix_memalign=no
5488cat > $TMPC << EOF
5489#include <stdlib.h>
5490int main(void) {
5491    void *p;
5492    return posix_memalign(&p, 8, 8);
5493}
5494EOF
5495if compile_prog "" "" ; then
5496    posix_memalign=yes
5497fi
5498
5499##########################################
5500# check if we have posix_syslog
5501
5502posix_syslog=no
5503cat > $TMPC << EOF
5504#include <syslog.h>
5505int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; }
5506EOF
5507if compile_prog "" "" ; then
5508    posix_syslog=yes
5509fi
5510
5511##########################################
5512# check if we have sem_timedwait
5513
5514sem_timedwait=no
5515cat > $TMPC << EOF
5516#include <semaphore.h>
5517int main(void) { sem_t s; struct timespec t = {0}; return sem_timedwait(&s, &t); }
5518EOF
5519if compile_prog "" "" ; then
5520    sem_timedwait=yes
5521fi
5522
5523##########################################
5524# check if we have strchrnul
5525
5526strchrnul=no
5527cat > $TMPC << EOF
5528#include <string.h>
5529int main(void);
5530// Use a haystack that the compiler shouldn't be able to constant fold
5531char *haystack = (char*)&main;
5532int main(void) { return strchrnul(haystack, 'x') != &haystack[6]; }
5533EOF
5534if compile_prog "" "" ; then
5535    strchrnul=yes
5536fi
5537
5538#########################################
5539# check if we have st_atim
5540
5541st_atim=no
5542cat > $TMPC << EOF
5543#include <sys/stat.h>
5544#include <stddef.h>
5545int main(void) { return offsetof(struct stat, st_atim); }
5546EOF
5547if compile_prog "" "" ; then
5548    st_atim=yes
5549fi
5550
5551##########################################
5552# check if trace backend exists
5553
5554$python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
5555if test "$?" -ne 0 ; then
5556  error_exit "invalid trace backends" \
5557      "Please choose supported trace backends."
5558fi
5559
5560##########################################
5561# For 'ust' backend, test if ust headers are present
5562if have_backend "ust"; then
5563  cat > $TMPC << EOF
5564#include <lttng/tracepoint.h>
5565int main(void) { return 0; }
5566EOF
5567  if compile_prog "" "-Wl,--no-as-needed -ldl" ; then
5568    if $pkg_config lttng-ust --exists; then
5569      lttng_ust_libs=$($pkg_config --libs lttng-ust)
5570    else
5571      lttng_ust_libs="-llttng-ust -ldl"
5572    fi
5573    if $pkg_config liburcu-bp --exists; then
5574      urcu_bp_libs=$($pkg_config --libs liburcu-bp)
5575    else
5576      urcu_bp_libs="-lurcu-bp"
5577    fi
5578
5579    LIBS="$lttng_ust_libs $urcu_bp_libs $LIBS"
5580    libs_qga="$lttng_ust_libs $urcu_bp_libs $libs_qga"
5581  else
5582    error_exit "Trace backend 'ust' missing lttng-ust header files"
5583  fi
5584fi
5585
5586##########################################
5587# For 'dtrace' backend, test if 'dtrace' command is present
5588if have_backend "dtrace"; then
5589  if ! has 'dtrace' ; then
5590    error_exit "dtrace command is not found in PATH $PATH"
5591  fi
5592  trace_backend_stap="no"
5593  if has 'stap' ; then
5594    trace_backend_stap="yes"
5595  fi
5596fi
5597
5598##########################################
5599# check and set a backend for coroutine
5600
5601# We prefer ucontext, but it's not always possible. The fallback
5602# is sigcontext. On Windows the only valid backend is the Windows
5603# specific one.
5604
5605ucontext_works=no
5606if test "$darwin" != "yes"; then
5607  cat > $TMPC << EOF
5608#include <ucontext.h>
5609#ifdef __stub_makecontext
5610#error Ignoring glibc stub makecontext which will always fail
5611#endif
5612int main(void) { makecontext(0, 0, 0); return 0; }
5613EOF
5614  if compile_prog "" "" ; then
5615    ucontext_works=yes
5616  fi
5617fi
5618
5619if test "$coroutine" = ""; then
5620  if test "$mingw32" = "yes"; then
5621    coroutine=win32
5622  elif test "$ucontext_works" = "yes"; then
5623    coroutine=ucontext
5624  else
5625    coroutine=sigaltstack
5626  fi
5627else
5628  case $coroutine in
5629  windows)
5630    if test "$mingw32" != "yes"; then
5631      error_exit "'windows' coroutine backend only valid for Windows"
5632    fi
5633    # Unfortunately the user visible backend name doesn't match the
5634    # coroutine-*.c filename for this case, so we have to adjust it here.
5635    coroutine=win32
5636    ;;
5637  ucontext)
5638    if test "$ucontext_works" != "yes"; then
5639      feature_not_found "ucontext"
5640    fi
5641    ;;
5642  sigaltstack)
5643    if test "$mingw32" = "yes"; then
5644      error_exit "only the 'windows' coroutine backend is valid for Windows"
5645    fi
5646    ;;
5647  *)
5648    error_exit "unknown coroutine backend $coroutine"
5649    ;;
5650  esac
5651fi
5652
5653if test "$coroutine_pool" = ""; then
5654  coroutine_pool=yes
5655fi
5656
5657if test "$debug_stack_usage" = "yes"; then
5658  if test "$coroutine_pool" = "yes"; then
5659    echo "WARN: disabling coroutine pool for stack usage debugging"
5660    coroutine_pool=no
5661  fi
5662fi
5663
5664##################################################
5665# SafeStack
5666
5667
5668if test "$safe_stack" = "yes"; then
5669cat > $TMPC << EOF
5670int main(int argc, char *argv[])
5671{
5672#if ! __has_feature(safe_stack)
5673#error SafeStack Disabled
5674#endif
5675    return 0;
5676}
5677EOF
5678  flag="-fsanitize=safe-stack"
5679  # Check that safe-stack is supported and enabled.
5680  if compile_prog "-Werror $flag" "$flag"; then
5681    # Flag needed both at compilation and at linking
5682    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
5683    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
5684  else
5685    error_exit "SafeStack not supported by your compiler"
5686  fi
5687  if test "$coroutine" != "ucontext"; then
5688    error_exit "SafeStack is only supported by the coroutine backend ucontext"
5689  fi
5690else
5691cat > $TMPC << EOF
5692int main(int argc, char *argv[])
5693{
5694#if defined(__has_feature)
5695#if __has_feature(safe_stack)
5696#error SafeStack Enabled
5697#endif
5698#endif
5699    return 0;
5700}
5701EOF
5702if test "$safe_stack" = "no"; then
5703  # Make sure that safe-stack is disabled
5704  if ! compile_prog "-Werror" ""; then
5705    # SafeStack was already enabled, try to explicitly remove the feature
5706    flag="-fno-sanitize=safe-stack"
5707    if ! compile_prog "-Werror $flag" "$flag"; then
5708      error_exit "Configure cannot disable SafeStack"
5709    fi
5710    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
5711    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
5712  fi
5713else # "$safe_stack" = ""
5714  # Set safe_stack to yes or no based on pre-existing flags
5715  if compile_prog "-Werror" ""; then
5716    safe_stack="no"
5717  else
5718    safe_stack="yes"
5719    if test "$coroutine" != "ucontext"; then
5720      error_exit "SafeStack is only supported by the coroutine backend ucontext"
5721    fi
5722  fi
5723fi
5724fi
5725
5726##########################################
5727# check if we have open_by_handle_at
5728
5729open_by_handle_at=no
5730cat > $TMPC << EOF
5731#include <fcntl.h>
5732#if !defined(AT_EMPTY_PATH)
5733# error missing definition
5734#else
5735int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
5736#endif
5737EOF
5738if compile_prog "" "" ; then
5739    open_by_handle_at=yes
5740fi
5741
5742########################################
5743# check if we have linux/magic.h
5744
5745linux_magic_h=no
5746cat > $TMPC << EOF
5747#include <linux/magic.h>
5748int main(void) {
5749  return 0;
5750}
5751EOF
5752if compile_prog "" "" ; then
5753    linux_magic_h=yes
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    return 1;
6347}
6348EOF
6349  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
6350      have_ubsan=yes
6351  fi
6352
6353  if check_include "sanitizer/asan_interface.h" ; then
6354      have_asan_iface_h=yes
6355  fi
6356
6357  cat > $TMPC << EOF
6358#include <sanitizer/asan_interface.h>
6359int main(void) {
6360  __sanitizer_start_switch_fiber(0, 0, 0);
6361  return 0;
6362}
6363EOF
6364  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
6365      have_asan_iface_fiber=yes
6366  fi
6367fi
6368
6369##########################################
6370# checks for fuzzer
6371if test "$fuzzing" = "yes" ; then
6372  write_c_fuzzer_skeleton
6373  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address,fuzzer" ""; then
6374      have_fuzzer=yes
6375  fi
6376fi
6377
6378# Thread sanitizer is, for now, much noisier than the other sanitizers;
6379# keep it separate until that is not the case.
6380if test "$tsan" = "yes" && test "$sanitizers" = "yes"; then
6381  error_exit "TSAN is not supported with other sanitiziers."
6382fi
6383have_tsan=no
6384have_tsan_iface_fiber=no
6385if test "$tsan" = "yes" ; then
6386  write_c_skeleton
6387  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
6388      have_tsan=yes
6389  fi
6390  cat > $TMPC << EOF
6391#include <sanitizer/tsan_interface.h>
6392int main(void) {
6393  __tsan_create_fiber(0);
6394  return 0;
6395}
6396EOF
6397  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
6398      have_tsan_iface_fiber=yes
6399  fi
6400fi
6401
6402##########################################
6403# check for libpmem
6404
6405if test "$libpmem" != "no"; then
6406	if $pkg_config --exists "libpmem"; then
6407		libpmem="yes"
6408		libpmem_libs=$($pkg_config --libs libpmem)
6409		libpmem_cflags=$($pkg_config --cflags libpmem)
6410		libs_softmmu="$libs_softmmu $libpmem_libs"
6411		QEMU_CFLAGS="$QEMU_CFLAGS $libpmem_cflags"
6412	else
6413		if test "$libpmem" = "yes" ; then
6414			feature_not_found "libpmem" "Install nvml or pmdk"
6415		fi
6416		libpmem="no"
6417	fi
6418fi
6419
6420##########################################
6421# check for libdaxctl
6422
6423if test "$libdaxctl" != "no"; then
6424	if $pkg_config --atleast-version=57 "libdaxctl"; then
6425		libdaxctl="yes"
6426		libdaxctl_libs=$($pkg_config --libs libdaxctl)
6427		libdaxctl_cflags=$($pkg_config --cflags libdaxctl)
6428		libs_softmmu="$libs_softmmu $libdaxctl_libs"
6429		QEMU_CFLAGS="$QEMU_CFLAGS $libdaxctl_cflags"
6430	else
6431		if test "$libdaxctl" = "yes" ; then
6432			feature_not_found "libdaxctl" "Install libdaxctl"
6433		fi
6434		libdaxctl="no"
6435	fi
6436fi
6437
6438##########################################
6439# check for slirp
6440
6441# slirp is only required when building softmmu targets
6442if test -z "$slirp" -a "$softmmu" != "yes" ; then
6443    slirp="no"
6444fi
6445
6446case "$slirp" in
6447  "" | yes)
6448    if $pkg_config slirp; then
6449      slirp=system
6450    elif test -e "${source_path}/.git" && test $git_update = 'yes' ; then
6451      slirp=git
6452    elif test -e "${source_path}/slirp/Makefile" ; then
6453      slirp=internal
6454    elif test -z "$slirp" ; then
6455      slirp=no
6456    else
6457      feature_not_found "slirp" "Install slirp devel or git submodule"
6458    fi
6459    ;;
6460
6461  system)
6462    if ! $pkg_config slirp; then
6463      feature_not_found "slirp" "Install slirp devel"
6464    fi
6465    ;;
6466esac
6467
6468case "$slirp" in
6469  git | internal)
6470    if test "$slirp" = git; then
6471      git_submodules="${git_submodules} slirp"
6472    fi
6473    mkdir -p slirp
6474    slirp_cflags="-I\$(SRC_PATH)/slirp/src -I\$(BUILD_DIR)/slirp/src"
6475    slirp_libs="-L\$(BUILD_DIR)/slirp -lslirp"
6476    if test "$mingw32" = "yes" ; then
6477      slirp_libs="$slirp_libs -lws2_32 -liphlpapi"
6478    fi
6479    ;;
6480
6481  system)
6482    slirp_version=$($pkg_config --modversion slirp 2>/dev/null)
6483    slirp_cflags=$($pkg_config --cflags slirp 2>/dev/null)
6484    slirp_libs=$($pkg_config --libs slirp 2>/dev/null)
6485    ;;
6486
6487  no)
6488    ;;
6489  *)
6490    error_exit "Unknown state for slirp: $slirp"
6491    ;;
6492esac
6493
6494##########################################
6495# check for usable __NR_keyctl syscall
6496
6497if test "$linux" = "yes" ; then
6498
6499    have_keyring=no
6500    cat > $TMPC << EOF
6501#include <errno.h>
6502#include <asm/unistd.h>
6503#include <linux/keyctl.h>
6504#include <unistd.h>
6505int main(void) {
6506    return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
6507}
6508EOF
6509    if compile_prog "" "" ; then
6510        have_keyring=yes
6511    fi
6512fi
6513if test "$secret_keyring" != "no"
6514then
6515    if test "$have_keyring" = "yes"
6516    then
6517	secret_keyring=yes
6518    else
6519	if test "$secret_keyring" = "yes"
6520	then
6521	    error_exit "syscall __NR_keyctl requested, \
6522but not implemented on your system"
6523	else
6524	    secret_keyring=no
6525	fi
6526    fi
6527fi
6528
6529##########################################
6530# check for usable keyutils.h
6531
6532if test "$linux" = "yes" ; then
6533
6534    have_keyutils=no
6535    cat > $TMPC << EOF
6536#include <errno.h>
6537#include <asm/unistd.h>
6538#include <unistd.h>
6539#include <sys/types.h>
6540#include <keyutils.h>
6541int main(void) {
6542    return request_key("user", NULL, NULL, 0);
6543}
6544EOF
6545    if compile_prog "" "-lkeyutils"; then
6546        have_keyutils=yes
6547    fi
6548fi
6549
6550
6551##########################################
6552# End of CC checks
6553# After here, no more $cc or $ld runs
6554
6555write_c_skeleton
6556
6557if test "$gcov" = "yes" ; then
6558  QEMU_CFLAGS="-fprofile-arcs -ftest-coverage -g $QEMU_CFLAGS"
6559  QEMU_LDFLAGS="-fprofile-arcs -ftest-coverage $QEMU_LDFLAGS"
6560elif test "$fortify_source" = "yes" ; then
6561  CFLAGS="-O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $CFLAGS"
6562elif test "$debug" = "no"; then
6563  CFLAGS="-O2 $CFLAGS"
6564fi
6565
6566if test "$have_asan" = "yes"; then
6567  QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
6568  QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
6569  if test "$have_asan_iface_h" = "no" ; then
6570      echo "ASAN build enabled, but ASAN header missing." \
6571           "Without code annotation, the report may be inferior."
6572  elif test "$have_asan_iface_fiber" = "no" ; then
6573      echo "ASAN build enabled, but ASAN header is too old." \
6574           "Without code annotation, the report may be inferior."
6575  fi
6576fi
6577if test "$have_tsan" = "yes" ; then
6578  if test "$have_tsan_iface_fiber" = "yes" ; then
6579    QEMU_CFLAGS="-fsanitize=thread $QEMU_CFLAGS"
6580    QEMU_LDFLAGS="-fsanitize=thread $QEMU_LDFLAGS"
6581  else
6582    error_exit "Cannot enable TSAN due to missing fiber annotation interface."
6583  fi
6584elif test "$tsan" = "yes" ; then
6585  error_exit "Cannot enable TSAN due to missing sanitize thread interface."
6586fi
6587if test "$have_ubsan" = "yes"; then
6588  QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS"
6589  QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
6590fi
6591
6592##########################################
6593# Do we have libnfs
6594if test "$libnfs" != "no" ; then
6595  if $pkg_config --atleast-version=1.9.3 libnfs; then
6596    libnfs="yes"
6597    libnfs_libs=$($pkg_config --libs libnfs)
6598  else
6599    if test "$libnfs" = "yes" ; then
6600      feature_not_found "libnfs" "Install libnfs devel >= 1.9.3"
6601    fi
6602    libnfs="no"
6603  fi
6604fi
6605
6606##########################################
6607# Do we have libudev
6608if test "$libudev" != "no" ; then
6609  if $pkg_config libudev && test "$static" != "yes"; then
6610    libudev="yes"
6611    libudev_libs=$($pkg_config --libs libudev)
6612  else
6613    libudev="no"
6614  fi
6615fi
6616
6617# Now we've finished running tests it's OK to add -Werror to the compiler flags
6618if test "$werror" = "yes"; then
6619    QEMU_CFLAGS="-Werror $QEMU_CFLAGS"
6620fi
6621
6622# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
6623if test "$solaris" = "no" && test "$tsan" = "no"; then
6624    if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
6625        QEMU_LDFLAGS="-Wl,--warn-common $QEMU_LDFLAGS"
6626    fi
6627fi
6628
6629# test if pod2man has --utf8 option
6630if pod2man --help | grep -q utf8; then
6631    POD2MAN="pod2man --utf8"
6632else
6633    POD2MAN="pod2man"
6634fi
6635
6636# Use ASLR, no-SEH and DEP if available
6637if test "$mingw32" = "yes" ; then
6638    for flag in --dynamicbase --no-seh --nxcompat; do
6639        if ld_has $flag ; then
6640            QEMU_LDFLAGS="-Wl,$flag $QEMU_LDFLAGS"
6641        fi
6642    done
6643fi
6644
6645# Disable OpenBSD W^X if available
6646if test "$tcg" = "yes" && test "$targetos" = "OpenBSD"; then
6647    cat > $TMPC <<EOF
6648    int main(void) { return 0; }
6649EOF
6650    wx_ldflags="-Wl,-z,wxneeded"
6651    if compile_prog "" "$wx_ldflags"; then
6652        QEMU_LDFLAGS="$QEMU_LDFLAGS $wx_ldflags"
6653    fi
6654fi
6655
6656qemu_confdir=$sysconfdir$confsuffix
6657qemu_moddir=$libdir$confsuffix
6658qemu_datadir=$datadir$confsuffix
6659qemu_localedir="$datadir/locale"
6660qemu_icondir="$datadir/icons"
6661qemu_desktopdir="$datadir/applications"
6662
6663# We can only support ivshmem if we have eventfd
6664if [ "$eventfd" = "yes" ]; then
6665  ivshmem=yes
6666fi
6667
6668tools=""
6669if test "$want_tools" = "yes" ; then
6670  tools="qemu-img\$(EXESUF) qemu-io\$(EXESUF) qemu-edid\$(EXESUF) $tools"
6671  if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" ] ; then
6672    tools="qemu-nbd\$(EXESUF) qemu-storage-daemon\$(EXESUF) $tools"
6673  fi
6674  if [ "$ivshmem" = "yes" ]; then
6675    tools="ivshmem-client\$(EXESUF) ivshmem-server\$(EXESUF) $tools"
6676  fi
6677  if [ "$curl" = "yes" ]; then
6678      tools="elf2dmp\$(EXESUF) $tools"
6679  fi
6680fi
6681if test "$softmmu" = yes ; then
6682  if test "$linux" = yes; then
6683    if test "$virtfs" != no && test "$cap_ng" = yes && test "$attr" = yes ; then
6684      virtfs=yes
6685      helpers="$helpers fsdev/virtfs-proxy-helper\$(EXESUF)"
6686    else
6687      if test "$virtfs" = yes; then
6688        error_exit "VirtFS requires libcap-ng devel and libattr devel"
6689      fi
6690      virtfs=no
6691    fi
6692    if test "$mpath" != no && test "$mpathpersist" = yes ; then
6693      mpath=yes
6694    else
6695      if test "$mpath" = yes; then
6696        error_exit "Multipath requires libmpathpersist devel"
6697      fi
6698      mpath=no
6699    fi
6700    helpers="$helpers scsi/qemu-pr-helper\$(EXESUF)"
6701  else
6702    if test "$virtfs" = yes; then
6703      error_exit "VirtFS is supported only on Linux"
6704    fi
6705    virtfs=no
6706    if test "$mpath" = yes; then
6707      error_exit "Multipath is supported only on Linux"
6708    fi
6709    mpath=no
6710  fi
6711  if test "$xkbcommon" = "yes"; then
6712    tools="qemu-keymap\$(EXESUF) $tools"
6713  fi
6714fi
6715
6716# Probe for guest agent support/options
6717
6718if [ "$guest_agent" != "no" ]; then
6719  if [ "$softmmu" = no -a "$want_tools" = no ] ; then
6720      guest_agent=no
6721  elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
6722      tools="qemu-ga\$(EXESUF) $tools"
6723      guest_agent=yes
6724  elif [ "$guest_agent" != yes ]; then
6725      guest_agent=no
6726  else
6727      error_exit "Guest agent is not supported on this platform"
6728  fi
6729fi
6730
6731# Guest agent Window MSI  package
6732
6733if test "$guest_agent" != yes; then
6734  if test "$guest_agent_msi" = yes; then
6735    error_exit "MSI guest agent package requires guest agent enabled"
6736  fi
6737  guest_agent_msi=no
6738elif test "$mingw32" != "yes"; then
6739  if test "$guest_agent_msi" = "yes"; then
6740    error_exit "MSI guest agent package is available only for MinGW Windows cross-compilation"
6741  fi
6742  guest_agent_msi=no
6743elif ! has wixl; then
6744  if test "$guest_agent_msi" = "yes"; then
6745    error_exit "MSI guest agent package requires wixl tool installed ( usually from msitools package )"
6746  fi
6747  guest_agent_msi=no
6748else
6749  # we support qemu-ga, mingw32, and wixl: default to MSI enabled if it wasn't
6750  # disabled explicitly
6751  if test "$guest_agent_msi" != "no"; then
6752    guest_agent_msi=yes
6753  fi
6754fi
6755
6756if test "$guest_agent_msi" = "yes"; then
6757  if test "$guest_agent_with_vss" = "yes"; then
6758    QEMU_GA_MSI_WITH_VSS="-D InstallVss"
6759  fi
6760
6761  if test "$QEMU_GA_MANUFACTURER" = ""; then
6762    QEMU_GA_MANUFACTURER=QEMU
6763  fi
6764
6765  if test "$QEMU_GA_DISTRO" = ""; then
6766    QEMU_GA_DISTRO=Linux
6767  fi
6768
6769  if test "$QEMU_GA_VERSION" = ""; then
6770      QEMU_GA_VERSION=$(cat $source_path/VERSION)
6771  fi
6772
6773  QEMU_GA_MSI_MINGW_DLL_PATH="-D Mingw_dlls=$($pkg_config --variable=prefix glib-2.0)/bin"
6774
6775  case "$cpu" in
6776  x86_64)
6777    QEMU_GA_MSI_ARCH="-a x64 -D Arch=64"
6778    ;;
6779  i386)
6780    QEMU_GA_MSI_ARCH="-D Arch=32"
6781    ;;
6782  *)
6783    error_exit "CPU $cpu not supported for building installation package"
6784    ;;
6785  esac
6786fi
6787
6788# Mac OS X ships with a broken assembler
6789roms=
6790if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
6791        test "$targetos" != "Darwin" && test "$targetos" != "SunOS" && \
6792        test "$softmmu" = yes ; then
6793    # Different host OS linkers have different ideas about the name of the ELF
6794    # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
6795    # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
6796    for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
6797        if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
6798            ld_i386_emulation="$emu"
6799            roms="optionrom"
6800            break
6801        fi
6802    done
6803fi
6804
6805# Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
6806if test "$cpu" = "s390x" ; then
6807  write_c_skeleton
6808  if compile_prog "-march=z900" ""; then
6809    roms="$roms s390-ccw"
6810    # SLOF is required for building the s390-ccw firmware on s390x,
6811    # since it is using the libnet code from SLOF for network booting.
6812    if test -e "${source_path}/.git" ; then
6813      git_submodules="${git_submodules} roms/SLOF"
6814    fi
6815  fi
6816fi
6817
6818# Check that the C++ compiler exists and works with the C compiler.
6819# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
6820if has $cxx; then
6821    cat > $TMPC <<EOF
6822int c_function(void);
6823int main(void) { return c_function(); }
6824EOF
6825
6826    compile_object
6827
6828    cat > $TMPCXX <<EOF
6829extern "C" {
6830   int c_function(void);
6831}
6832int c_function(void) { return 42; }
6833EOF
6834
6835    update_cxxflags
6836
6837    if do_cxx $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
6838        # C++ compiler $cxx works ok with C compiler $cc
6839        :
6840    else
6841        echo "C++ compiler $cxx does not work with C compiler $cc"
6842        echo "Disabling C++ specific optional code"
6843        cxx=
6844    fi
6845else
6846    echo "No C++ compiler available; disabling C++ specific optional code"
6847    cxx=
6848fi
6849
6850echo_version() {
6851    if test "$1" = "yes" ; then
6852        echo "($2)"
6853    fi
6854}
6855
6856# prepend pixman and ftd flags after all config tests are done
6857QEMU_CFLAGS="$pixman_cflags $fdt_cflags $QEMU_CFLAGS"
6858QEMU_LDFLAGS="$fdt_ldflags $QEMU_LDFLAGS"
6859libs_softmmu="$pixman_libs $libs_softmmu"
6860
6861echo "Install prefix    $prefix"
6862echo "BIOS directory    $(eval echo $qemu_datadir)"
6863echo "firmware path     $(eval echo $firmwarepath)"
6864echo "binary directory  $(eval echo $bindir)"
6865echo "library directory $(eval echo $libdir)"
6866echo "module directory  $(eval echo $qemu_moddir)"
6867echo "libexec directory $(eval echo $libexecdir)"
6868echo "include directory $(eval echo $includedir)"
6869echo "config directory  $(eval echo $sysconfdir)"
6870if test "$mingw32" = "no" ; then
6871echo "local state directory   $(eval echo $local_statedir)"
6872echo "Manual directory  $(eval echo $mandir)"
6873echo "ELF interp prefix $interp_prefix"
6874else
6875echo "local state directory   queried at runtime"
6876echo "Windows SDK       $win_sdk"
6877fi
6878echo "Build directory   $(pwd)"
6879echo "Source path       $source_path"
6880echo "GIT binary        $git"
6881echo "GIT submodules    $git_submodules"
6882echo "C compiler        $cc"
6883echo "Host C compiler   $host_cc"
6884echo "C++ compiler      $cxx"
6885echo "Objective-C compiler $objcc"
6886echo "ARFLAGS           $ARFLAGS"
6887echo "CFLAGS            $CFLAGS"
6888echo "QEMU_CFLAGS       $QEMU_CFLAGS"
6889echo "QEMU_LDFLAGS      $QEMU_LDFLAGS"
6890echo "make              $make"
6891echo "install           $install"
6892echo "python            $python ($python_version)"
6893if test "$docs" != "no"; then
6894    echo "sphinx-build      $sphinx_build"
6895fi
6896echo "genisoimage       $genisoimage"
6897echo "efi_aarch64       $efi_aarch64"
6898echo "python_yaml       $python_yaml"
6899echo "slirp support     $slirp $(echo_version $slirp $slirp_version)"
6900if test "$slirp" != "no" ; then
6901    echo "smbd              $smbd"
6902fi
6903echo "module support    $modules"
6904echo "alt path mod load $module_upgrades"
6905echo "host CPU          $cpu"
6906echo "host big endian   $bigendian"
6907echo "target list       $target_list"
6908echo "gprof enabled     $gprof"
6909echo "sparse enabled    $sparse"
6910echo "strip binaries    $strip_opt"
6911echo "profiler          $profiler"
6912echo "static build      $static"
6913echo "safe stack        $safe_stack"
6914if test "$darwin" = "yes" ; then
6915    echo "Cocoa support     $cocoa"
6916fi
6917echo "SDL support       $sdl $(echo_version $sdl $sdlversion)"
6918echo "SDL image support $sdl_image"
6919echo "GTK support       $gtk $(echo_version $gtk $gtk_version)"
6920echo "GTK GL support    $gtk_gl"
6921echo "VTE support       $vte $(echo_version $vte $vteversion)"
6922echo "TLS priority      $tls_priority"
6923echo "GNUTLS support    $gnutls"
6924echo "libgcrypt         $gcrypt"
6925if test "$gcrypt" = "yes"
6926then
6927   echo "  hmac            $gcrypt_hmac"
6928   echo "  XTS             $gcrypt_xts"
6929fi
6930echo "nettle            $nettle $(echo_version $nettle $nettle_version)"
6931if test "$nettle" = "yes"
6932then
6933   echo "  XTS             $nettle_xts"
6934fi
6935echo "libtasn1          $tasn1"
6936echo "PAM               $auth_pam"
6937echo "iconv support     $iconv"
6938echo "curses support    $curses"
6939echo "virgl support     $virglrenderer $(echo_version $virglrenderer $virgl_version)"
6940echo "curl support      $curl"
6941echo "mingw32 support   $mingw32"
6942echo "Audio drivers     $audio_drv_list"
6943echo "Block whitelist (rw) $block_drv_rw_whitelist"
6944echo "Block whitelist (ro) $block_drv_ro_whitelist"
6945echo "VirtFS support    $virtfs"
6946echo "Multipath support $mpath"
6947echo "VNC support       $vnc"
6948if test "$vnc" = "yes" ; then
6949    echo "VNC SASL support  $vnc_sasl"
6950    echo "VNC JPEG support  $vnc_jpeg"
6951    echo "VNC PNG support   $vnc_png"
6952fi
6953echo "xen support       $xen"
6954if test "$xen" = "yes" ; then
6955  echo "xen ctrl version  $xen_ctrl_version"
6956fi
6957echo "brlapi support    $brlapi"
6958echo "Documentation     $docs"
6959echo "PIE               $pie"
6960echo "vde support       $vde"
6961echo "netmap support    $netmap"
6962echo "Linux AIO support $linux_aio"
6963echo "Linux io_uring support $linux_io_uring"
6964echo "ATTR/XATTR support $attr"
6965echo "Install blobs     $blobs"
6966echo "KVM support       $kvm"
6967echo "HAX support       $hax"
6968echo "HVF support       $hvf"
6969echo "WHPX support      $whpx"
6970echo "TCG support       $tcg"
6971if test "$tcg" = "yes" ; then
6972    echo "TCG debug enabled $debug_tcg"
6973    echo "TCG interpreter   $tcg_interpreter"
6974fi
6975echo "malloc trim support $malloc_trim"
6976echo "RDMA support      $rdma"
6977echo "PVRDMA support    $pvrdma"
6978echo "fdt support       $fdt"
6979echo "membarrier        $membarrier"
6980echo "preadv support    $preadv"
6981echo "fdatasync         $fdatasync"
6982echo "madvise           $madvise"
6983echo "posix_madvise     $posix_madvise"
6984echo "posix_memalign    $posix_memalign"
6985echo "libcap-ng support $cap_ng"
6986echo "vhost-net support $vhost_net"
6987echo "vhost-crypto support $vhost_crypto"
6988echo "vhost-scsi support $vhost_scsi"
6989echo "vhost-vsock support $vhost_vsock"
6990echo "vhost-user support $vhost_user"
6991echo "vhost-user-fs support $vhost_user_fs"
6992echo "vhost-vdpa support $vhost_vdpa"
6993echo "Trace backends    $trace_backends"
6994if have_backend "simple"; then
6995echo "Trace output file $trace_file-<pid>"
6996fi
6997echo "spice support     $spice $(echo_version $spice $spice_protocol_version/$spice_server_version)"
6998echo "rbd support       $rbd"
6999echo "xfsctl support    $xfs"
7000echo "smartcard support $smartcard"
7001echo "libusb            $libusb"
7002echo "usb net redir     $usb_redir"
7003echo "OpenGL support    $opengl"
7004echo "OpenGL dmabufs    $opengl_dmabuf"
7005echo "libiscsi support  $libiscsi"
7006echo "libnfs support    $libnfs"
7007echo "build guest agent $guest_agent"
7008echo "QGA VSS support   $guest_agent_with_vss"
7009echo "QGA w32 disk info $guest_agent_ntddscsi"
7010echo "QGA MSI support   $guest_agent_msi"
7011echo "seccomp support   $seccomp"
7012echo "coroutine backend $coroutine"
7013echo "coroutine pool    $coroutine_pool"
7014echo "debug stack usage $debug_stack_usage"
7015echo "mutex debugging   $debug_mutex"
7016echo "crypto afalg      $crypto_afalg"
7017echo "GlusterFS support $glusterfs"
7018echo "gcov              $gcov_tool"
7019echo "gcov enabled      $gcov"
7020echo "TPM support       $tpm"
7021echo "libssh support    $libssh"
7022echo "QOM debugging     $qom_cast_debug"
7023echo "Live block migration $live_block_migration"
7024echo "lzo support       $lzo"
7025echo "snappy support    $snappy"
7026echo "bzip2 support     $bzip2"
7027echo "lzfse support     $lzfse"
7028echo "zstd support      $zstd"
7029echo "NUMA host support $numa"
7030echo "libxml2           $libxml2"
7031echo "tcmalloc support  $tcmalloc"
7032echo "jemalloc support  $jemalloc"
7033echo "avx2 optimization $avx2_opt"
7034echo "avx512f optimization $avx512f_opt"
7035echo "replication support $replication"
7036echo "VxHS block device $vxhs"
7037echo "bochs support     $bochs"
7038echo "cloop support     $cloop"
7039echo "dmg support       $dmg"
7040echo "qcow v1 support   $qcow1"
7041echo "vdi support       $vdi"
7042echo "vvfat support     $vvfat"
7043echo "qed support       $qed"
7044echo "parallels support $parallels"
7045echo "sheepdog support  $sheepdog"
7046echo "capstone          $capstone"
7047echo "libpmem support   $libpmem"
7048echo "libdaxctl support $libdaxctl"
7049echo "libudev           $libudev"
7050echo "default devices   $default_devices"
7051echo "plugin support    $plugins"
7052echo "fuzzing support   $fuzzing"
7053echo "gdb               $gdb_bin"
7054echo "rng-none          $rng_none"
7055echo "Linux keyring     $secret_keyring"
7056
7057if test "$supported_cpu" = "no"; then
7058    echo
7059    echo "WARNING: SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!"
7060    echo
7061    echo "CPU host architecture $cpu support is not currently maintained."
7062    echo "The QEMU project intends to remove support for this host CPU in"
7063    echo "a future release if nobody volunteers to maintain it and to"
7064    echo "provide a build host for our continuous integration setup."
7065    echo "configure has succeeded and you can continue to build, but"
7066    echo "if you care about QEMU on this platform you should contact"
7067    echo "us upstream at qemu-devel@nongnu.org."
7068fi
7069
7070if test "$supported_os" = "no"; then
7071    echo
7072    echo "WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!"
7073    echo
7074    echo "Host OS $targetos support is not currently maintained."
7075    echo "The QEMU project intends to remove support for this host OS in"
7076    echo "a future release if nobody volunteers to maintain it and to"
7077    echo "provide a build host for our continuous integration setup."
7078    echo "configure has succeeded and you can continue to build, but"
7079    echo "if you care about QEMU on this platform you should contact"
7080    echo "us upstream at qemu-devel@nongnu.org."
7081fi
7082
7083config_host_mak="config-host.mak"
7084
7085echo "# Automatically generated by configure - do not modify" >config-all-disas.mak
7086
7087echo "# Automatically generated by configure - do not modify" > $config_host_mak
7088echo >> $config_host_mak
7089
7090echo all: >> $config_host_mak
7091echo "prefix=$prefix" >> $config_host_mak
7092echo "bindir=$bindir" >> $config_host_mak
7093echo "libdir=$libdir" >> $config_host_mak
7094echo "libexecdir=$libexecdir" >> $config_host_mak
7095echo "includedir=$includedir" >> $config_host_mak
7096echo "mandir=$mandir" >> $config_host_mak
7097echo "sysconfdir=$sysconfdir" >> $config_host_mak
7098echo "qemu_confdir=$qemu_confdir" >> $config_host_mak
7099echo "qemu_datadir=$qemu_datadir" >> $config_host_mak
7100echo "qemu_firmwarepath=$firmwarepath" >> $config_host_mak
7101echo "qemu_docdir=$qemu_docdir" >> $config_host_mak
7102echo "qemu_moddir=$qemu_moddir" >> $config_host_mak
7103if test "$mingw32" = "no" ; then
7104  echo "qemu_localstatedir=$local_statedir" >> $config_host_mak
7105fi
7106echo "qemu_helperdir=$libexecdir" >> $config_host_mak
7107echo "qemu_localedir=$qemu_localedir" >> $config_host_mak
7108echo "qemu_icondir=$qemu_icondir" >> $config_host_mak
7109echo "qemu_desktopdir=$qemu_desktopdir" >> $config_host_mak
7110echo "libs_cpu=$libs_cpu" >> $config_host_mak
7111echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
7112echo "GIT=$git" >> $config_host_mak
7113echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
7114echo "GIT_UPDATE=$git_update" >> $config_host_mak
7115
7116echo "ARCH=$ARCH" >> $config_host_mak
7117
7118if test "$default_devices" = "yes" ; then
7119  echo "CONFIG_MINIKCONF_MODE=--defconfig" >> $config_host_mak
7120else
7121  echo "CONFIG_MINIKCONF_MODE=--allnoconfig" >> $config_host_mak
7122fi
7123if test "$debug_tcg" = "yes" ; then
7124  echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
7125fi
7126if test "$strip_opt" = "yes" ; then
7127  echo "STRIP=${strip}" >> $config_host_mak
7128fi
7129if test "$bigendian" = "yes" ; then
7130  echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
7131fi
7132if test "$mingw32" = "yes" ; then
7133  echo "CONFIG_WIN32=y" >> $config_host_mak
7134  rc_version=$(cat $source_path/VERSION)
7135  version_major=${rc_version%%.*}
7136  rc_version=${rc_version#*.}
7137  version_minor=${rc_version%%.*}
7138  rc_version=${rc_version#*.}
7139  version_subminor=${rc_version%%.*}
7140  version_micro=0
7141  echo "CONFIG_FILEVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
7142  echo "CONFIG_PRODUCTVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
7143  if test "$guest_agent_with_vss" = "yes" ; then
7144    echo "CONFIG_QGA_VSS=y" >> $config_host_mak
7145    echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
7146    echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
7147  fi
7148  if test "$guest_agent_ntddscsi" = "yes" ; then
7149    echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
7150  fi
7151  if test "$guest_agent_msi" = "yes"; then
7152    echo "QEMU_GA_MSI_ENABLED=yes" >> $config_host_mak
7153    echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
7154    echo "QEMU_GA_MSI_WITH_VSS=${QEMU_GA_MSI_WITH_VSS}" >> $config_host_mak
7155    echo "QEMU_GA_MSI_ARCH=${QEMU_GA_MSI_ARCH}" >> $config_host_mak
7156    echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
7157    echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
7158    echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
7159  fi
7160else
7161  echo "CONFIG_POSIX=y" >> $config_host_mak
7162fi
7163
7164if test "$linux" = "yes" ; then
7165  echo "CONFIG_LINUX=y" >> $config_host_mak
7166fi
7167
7168if test "$darwin" = "yes" ; then
7169  echo "CONFIG_DARWIN=y" >> $config_host_mak
7170fi
7171
7172if test "$solaris" = "yes" ; then
7173  echo "CONFIG_SOLARIS=y" >> $config_host_mak
7174fi
7175if test "$haiku" = "yes" ; then
7176  echo "CONFIG_HAIKU=y" >> $config_host_mak
7177fi
7178if test "$static" = "yes" ; then
7179  echo "CONFIG_STATIC=y" >> $config_host_mak
7180fi
7181if test "$profiler" = "yes" ; then
7182  echo "CONFIG_PROFILER=y" >> $config_host_mak
7183fi
7184if test "$want_tools" = "yes" ; then
7185  echo "CONFIG_TOOLS=y" >> $config_host_mak
7186fi
7187if test "$slirp" != "no"; then
7188  echo "CONFIG_SLIRP=y" >> $config_host_mak
7189  echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
7190  echo "SLIRP_CFLAGS=$slirp_cflags" >> $config_host_mak
7191  echo "SLIRP_LIBS=$slirp_libs" >> $config_host_mak
7192fi
7193if [ "$slirp" = "git" -o "$slirp" = "internal" ]; then
7194    echo "config-host.h: slirp/all" >> $config_host_mak
7195fi
7196if test "$vde" = "yes" ; then
7197  echo "CONFIG_VDE=y" >> $config_host_mak
7198  echo "VDE_LIBS=$vde_libs" >> $config_host_mak
7199fi
7200if test "$netmap" = "yes" ; then
7201  echo "CONFIG_NETMAP=y" >> $config_host_mak
7202fi
7203if test "$l2tpv3" = "yes" ; then
7204  echo "CONFIG_L2TPV3=y" >> $config_host_mak
7205fi
7206if test "$gprof" = "yes" ; then
7207  echo "CONFIG_GPROF=y" >> $config_host_mak
7208fi
7209if test "$cap_ng" = "yes" ; then
7210  echo "CONFIG_LIBCAP_NG=y" >> $config_host_mak
7211fi
7212echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
7213for drv in $audio_drv_list; do
7214    def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
7215    case "$drv" in
7216	alsa | oss | pa | sdl)
7217	    echo "$def=m" >> $config_host_mak ;;
7218	*)
7219	    echo "$def=y" >> $config_host_mak ;;
7220    esac
7221done
7222echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak
7223echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
7224echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak
7225echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak
7226echo "OSS_LIBS=$oss_libs" >> $config_host_mak
7227echo "JACK_LIBS=$jack_libs" >> $config_host_mak
7228if test "$audio_win_int" = "yes" ; then
7229  echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
7230fi
7231echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
7232echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
7233if test "$vnc" = "yes" ; then
7234  echo "CONFIG_VNC=y" >> $config_host_mak
7235fi
7236if test "$vnc_sasl" = "yes" ; then
7237  echo "CONFIG_VNC_SASL=y" >> $config_host_mak
7238fi
7239if test "$vnc_jpeg" = "yes" ; then
7240  echo "CONFIG_VNC_JPEG=y" >> $config_host_mak
7241fi
7242if test "$vnc_png" = "yes" ; then
7243  echo "CONFIG_VNC_PNG=y" >> $config_host_mak
7244fi
7245if test "$xkbcommon" = "yes" ; then
7246  echo "XKBCOMMON_CFLAGS=$xkbcommon_cflags" >> $config_host_mak
7247  echo "XKBCOMMON_LIBS=$xkbcommon_libs" >> $config_host_mak
7248fi
7249if test "$xfs" = "yes" ; then
7250  echo "CONFIG_XFS=y" >> $config_host_mak
7251fi
7252qemu_version=$(head $source_path/VERSION)
7253echo "VERSION=$qemu_version" >>$config_host_mak
7254echo "PKGVERSION=$pkgversion" >>$config_host_mak
7255echo "SRC_PATH=$source_path" >> $config_host_mak
7256echo "TARGET_DIRS=$target_list" >> $config_host_mak
7257if [ "$docs" = "yes" ] ; then
7258  echo "BUILD_DOCS=yes" >> $config_host_mak
7259fi
7260if test "$modules" = "yes"; then
7261  # $shacmd can generate a hash started with digit, which the compiler doesn't
7262  # like as an symbol. So prefix it with an underscore
7263  echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
7264  echo "CONFIG_MODULES=y" >> $config_host_mak
7265fi
7266if test "$module_upgrades" = "yes"; then
7267  echo "CONFIG_MODULE_UPGRADES=y" >> $config_host_mak
7268fi
7269if test "$have_x11" = "yes" && test "$need_x11" = "yes"; then
7270  echo "CONFIG_X11=y" >> $config_host_mak
7271  echo "X11_CFLAGS=$x11_cflags" >> $config_host_mak
7272  echo "X11_LIBS=$x11_libs" >> $config_host_mak
7273fi
7274if test "$sdl" = "yes" ; then
7275  echo "CONFIG_SDL=m" >> $config_host_mak
7276  echo "SDL_CFLAGS=$sdl_cflags" >> $config_host_mak
7277  echo "SDL_LIBS=$sdl_libs" >> $config_host_mak
7278  if test "$sdl_image" = "yes" ; then
7279      echo "CONFIG_SDL_IMAGE=y" >> $config_host_mak
7280  fi
7281fi
7282if test "$cocoa" = "yes" ; then
7283  echo "CONFIG_COCOA=y" >> $config_host_mak
7284fi
7285if test "$iconv" = "yes" ; then
7286  echo "CONFIG_ICONV=y" >> $config_host_mak
7287  echo "ICONV_CFLAGS=$iconv_cflags" >> $config_host_mak
7288  echo "ICONV_LIBS=$iconv_lib" >> $config_host_mak
7289fi
7290if test "$curses" = "yes" ; then
7291  echo "CONFIG_CURSES=m" >> $config_host_mak
7292  echo "CURSES_CFLAGS=$curses_inc" >> $config_host_mak
7293  echo "CURSES_LIBS=$curses_lib" >> $config_host_mak
7294fi
7295if test "$pipe2" = "yes" ; then
7296  echo "CONFIG_PIPE2=y" >> $config_host_mak
7297fi
7298if test "$accept4" = "yes" ; then
7299  echo "CONFIG_ACCEPT4=y" >> $config_host_mak
7300fi
7301if test "$splice" = "yes" ; then
7302  echo "CONFIG_SPLICE=y" >> $config_host_mak
7303fi
7304if test "$eventfd" = "yes" ; then
7305  echo "CONFIG_EVENTFD=y" >> $config_host_mak
7306fi
7307if test "$memfd" = "yes" ; then
7308  echo "CONFIG_MEMFD=y" >> $config_host_mak
7309fi
7310if test "$have_usbfs" = "yes" ; then
7311  echo "CONFIG_USBFS=y" >> $config_host_mak
7312fi
7313if test "$fallocate" = "yes" ; then
7314  echo "CONFIG_FALLOCATE=y" >> $config_host_mak
7315fi
7316if test "$fallocate_punch_hole" = "yes" ; then
7317  echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
7318fi
7319if test "$fallocate_zero_range" = "yes" ; then
7320  echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak
7321fi
7322if test "$posix_fallocate" = "yes" ; then
7323  echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
7324fi
7325if test "$sync_file_range" = "yes" ; then
7326  echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
7327fi
7328if test "$fiemap" = "yes" ; then
7329  echo "CONFIG_FIEMAP=y" >> $config_host_mak
7330fi
7331if test "$dup3" = "yes" ; then
7332  echo "CONFIG_DUP3=y" >> $config_host_mak
7333fi
7334if test "$ppoll" = "yes" ; then
7335  echo "CONFIG_PPOLL=y" >> $config_host_mak
7336fi
7337if test "$prctl_pr_set_timerslack" = "yes" ; then
7338  echo "CONFIG_PRCTL_PR_SET_TIMERSLACK=y" >> $config_host_mak
7339fi
7340if test "$epoll" = "yes" ; then
7341  echo "CONFIG_EPOLL=y" >> $config_host_mak
7342fi
7343if test "$epoll_create1" = "yes" ; then
7344  echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
7345fi
7346if test "$sendfile" = "yes" ; then
7347  echo "CONFIG_SENDFILE=y" >> $config_host_mak
7348fi
7349if test "$timerfd" = "yes" ; then
7350  echo "CONFIG_TIMERFD=y" >> $config_host_mak
7351fi
7352if test "$setns" = "yes" ; then
7353  echo "CONFIG_SETNS=y" >> $config_host_mak
7354fi
7355if test "$clock_adjtime" = "yes" ; then
7356  echo "CONFIG_CLOCK_ADJTIME=y" >> $config_host_mak
7357fi
7358if test "$syncfs" = "yes" ; then
7359  echo "CONFIG_SYNCFS=y" >> $config_host_mak
7360fi
7361if test "$kcov" = "yes" ; then
7362  echo "CONFIG_KCOV=y" >> $config_host_mak
7363fi
7364if test "$inotify" = "yes" ; then
7365  echo "CONFIG_INOTIFY=y" >> $config_host_mak
7366fi
7367if test "$inotify1" = "yes" ; then
7368  echo "CONFIG_INOTIFY1=y" >> $config_host_mak
7369fi
7370if test "$sem_timedwait" = "yes" ; then
7371  echo "CONFIG_SEM_TIMEDWAIT=y" >> $config_host_mak
7372fi
7373if test "$strchrnul" = "yes" ; then
7374  echo "HAVE_STRCHRNUL=y" >> $config_host_mak
7375fi
7376if test "$st_atim" = "yes" ; then
7377  echo "HAVE_STRUCT_STAT_ST_ATIM=y" >> $config_host_mak
7378fi
7379if test "$byteswap_h" = "yes" ; then
7380  echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
7381fi
7382if test "$bswap_h" = "yes" ; then
7383  echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
7384fi
7385if test "$curl" = "yes" ; then
7386  echo "CONFIG_CURL=m" >> $config_host_mak
7387  echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak
7388  echo "CURL_LIBS=$curl_libs" >> $config_host_mak
7389fi
7390if test "$brlapi" = "yes" ; then
7391  echo "CONFIG_BRLAPI=y" >> $config_host_mak
7392  echo "BRLAPI_LIBS=$brlapi_libs" >> $config_host_mak
7393fi
7394if test "$gtk" = "yes" ; then
7395  echo "CONFIG_GTK=m" >> $config_host_mak
7396  echo "GTK_CFLAGS=$gtk_cflags" >> $config_host_mak
7397  echo "GTK_LIBS=$gtk_libs" >> $config_host_mak
7398  if test "$gtk_gl" = "yes" ; then
7399    echo "CONFIG_GTK_GL=y" >> $config_host_mak
7400  fi
7401fi
7402if test "$gio" = "yes" ; then
7403    echo "CONFIG_GIO=y" >> $config_host_mak
7404    echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
7405    echo "GIO_LIBS=$gio_libs" >> $config_host_mak
7406    echo "GDBUS_CODEGEN=$gdbus_codegen" >> $config_host_mak
7407fi
7408echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
7409if test "$gnutls" = "yes" ; then
7410  echo "CONFIG_GNUTLS=y" >> $config_host_mak
7411fi
7412if test "$gcrypt" = "yes" ; then
7413  echo "CONFIG_GCRYPT=y" >> $config_host_mak
7414  if test "$gcrypt_hmac" = "yes" ; then
7415    echo "CONFIG_GCRYPT_HMAC=y" >> $config_host_mak
7416  fi
7417fi
7418if test "$nettle" = "yes" ; then
7419  echo "CONFIG_NETTLE=y" >> $config_host_mak
7420  echo "CONFIG_NETTLE_VERSION_MAJOR=${nettle_version%%.*}" >> $config_host_mak
7421fi
7422if test "$qemu_private_xts" = "yes" ; then
7423  echo "CONFIG_QEMU_PRIVATE_XTS=y" >> $config_host_mak
7424fi
7425if test "$tasn1" = "yes" ; then
7426  echo "CONFIG_TASN1=y" >> $config_host_mak
7427fi
7428if test "$auth_pam" = "yes" ; then
7429    echo "CONFIG_AUTH_PAM=y" >> $config_host_mak
7430fi
7431if test "$have_ifaddrs_h" = "yes" ; then
7432    echo "HAVE_IFADDRS_H=y" >> $config_host_mak
7433fi
7434if test "$have_drm_h" = "yes" ; then
7435  echo "HAVE_DRM_H=y" >> $config_host_mak
7436fi
7437if test "$have_broken_size_max" = "yes" ; then
7438    echo "HAVE_BROKEN_SIZE_MAX=y" >> $config_host_mak
7439fi
7440if test "$have_openpty" = "yes" ; then
7441    echo "HAVE_OPENPTY=y" >> $config_host_mak
7442fi
7443if test "$have_sys_signal_h" = "yes" ; then
7444    echo "HAVE_SYS_SIGNAL_H=y" >> $config_host_mak
7445fi
7446
7447# Work around a system header bug with some kernel/XFS header
7448# versions where they both try to define 'struct fsxattr':
7449# xfs headers will not try to redefine structs from linux headers
7450# if this macro is set.
7451if test "$have_fsxattr" = "yes" ; then
7452    echo "HAVE_FSXATTR=y" >> $config_host_mak
7453fi
7454if test "$have_copy_file_range" = "yes" ; then
7455    echo "HAVE_COPY_FILE_RANGE=y" >> $config_host_mak
7456fi
7457if test "$vte" = "yes" ; then
7458  echo "CONFIG_VTE=y" >> $config_host_mak
7459  echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak
7460  echo "VTE_LIBS=$vte_libs" >> $config_host_mak
7461fi
7462if test "$virglrenderer" = "yes" ; then
7463  echo "CONFIG_VIRGL=y" >> $config_host_mak
7464  echo "VIRGL_CFLAGS=$virgl_cflags" >> $config_host_mak
7465  echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak
7466fi
7467if test "$xen" = "yes" ; then
7468  echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
7469  echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
7470fi
7471if test "$linux_aio" = "yes" ; then
7472  echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
7473fi
7474if test "$linux_io_uring" = "yes" ; then
7475  echo "CONFIG_LINUX_IO_URING=y" >> $config_host_mak
7476  echo "LINUX_IO_URING_CFLAGS=$linux_io_uring_cflags" >> $config_host_mak
7477  echo "LINUX_IO_URING_LIBS=$linux_io_uring_libs" >> $config_host_mak
7478fi
7479if test "$attr" = "yes" ; then
7480  echo "CONFIG_ATTR=y" >> $config_host_mak
7481fi
7482if test "$libattr" = "yes" ; then
7483  echo "CONFIG_LIBATTR=y" >> $config_host_mak
7484fi
7485if test "$virtfs" = "yes" ; then
7486  echo "CONFIG_VIRTFS=y" >> $config_host_mak
7487fi
7488if test "$mpath" = "yes" ; then
7489  echo "CONFIG_MPATH=y" >> $config_host_mak
7490  if test "$mpathpersist_new_api" = "yes"; then
7491    echo "CONFIG_MPATH_NEW_API=y" >> $config_host_mak
7492  fi
7493fi
7494if test "$vhost_scsi" = "yes" ; then
7495  echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
7496fi
7497if test "$vhost_net" = "yes" ; then
7498  echo "CONFIG_VHOST_NET=y" >> $config_host_mak
7499fi
7500if test "$vhost_net_user" = "yes" ; then
7501  echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
7502fi
7503if test "$vhost_net_vdpa" = "yes" ; then
7504  echo "CONFIG_VHOST_NET_VDPA=y" >> $config_host_mak
7505fi
7506if test "$vhost_crypto" = "yes" ; then
7507  echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
7508fi
7509if test "$vhost_vsock" = "yes" ; then
7510  echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
7511  if test "$vhost_user" = "yes" ; then
7512    echo "CONFIG_VHOST_USER_VSOCK=y" >> $config_host_mak
7513  fi
7514fi
7515if test "$vhost_kernel" = "yes" ; then
7516  echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
7517fi
7518if test "$vhost_user" = "yes" ; then
7519  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
7520fi
7521if test "$vhost_vdpa" = "yes" ; then
7522  echo "CONFIG_VHOST_VDPA=y" >> $config_host_mak
7523fi
7524if test "$vhost_user_fs" = "yes" ; then
7525  echo "CONFIG_VHOST_USER_FS=y" >> $config_host_mak
7526fi
7527if test "$blobs" = "yes" ; then
7528  echo "INSTALL_BLOBS=yes" >> $config_host_mak
7529fi
7530if test "$iovec" = "yes" ; then
7531  echo "CONFIG_IOVEC=y" >> $config_host_mak
7532fi
7533if test "$preadv" = "yes" ; then
7534  echo "CONFIG_PREADV=y" >> $config_host_mak
7535fi
7536if test "$fdt" != "no" ; then
7537  echo "CONFIG_FDT=y" >> $config_host_mak
7538fi
7539if test "$membarrier" = "yes" ; then
7540  echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
7541fi
7542if test "$signalfd" = "yes" ; then
7543  echo "CONFIG_SIGNALFD=y" >> $config_host_mak
7544fi
7545if test "$optreset" = "yes" ; then
7546  echo "HAVE_OPTRESET=y" >> $config_host_mak
7547fi
7548if test "$tcg" = "yes"; then
7549  echo "CONFIG_TCG=y" >> $config_host_mak
7550  if test "$tcg_interpreter" = "yes" ; then
7551    echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
7552  fi
7553fi
7554if test "$fdatasync" = "yes" ; then
7555  echo "CONFIG_FDATASYNC=y" >> $config_host_mak
7556fi
7557if test "$madvise" = "yes" ; then
7558  echo "CONFIG_MADVISE=y" >> $config_host_mak
7559fi
7560if test "$posix_madvise" = "yes" ; then
7561  echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak
7562fi
7563if test "$posix_memalign" = "yes" ; then
7564  echo "CONFIG_POSIX_MEMALIGN=y" >> $config_host_mak
7565fi
7566
7567if test "$spice" = "yes" ; then
7568  echo "CONFIG_SPICE=y" >> $config_host_mak
7569fi
7570
7571if test "$smartcard" = "yes" ; then
7572  echo "CONFIG_SMARTCARD=y" >> $config_host_mak
7573  echo "SMARTCARD_CFLAGS=$libcacard_cflags" >> $config_host_mak
7574  echo "SMARTCARD_LIBS=$libcacard_libs" >> $config_host_mak
7575fi
7576
7577if test "$libusb" = "yes" ; then
7578  echo "CONFIG_USB_LIBUSB=y" >> $config_host_mak
7579  echo "LIBUSB_CFLAGS=$libusb_cflags" >> $config_host_mak
7580  echo "LIBUSB_LIBS=$libusb_libs" >> $config_host_mak
7581fi
7582
7583if test "$usb_redir" = "yes" ; then
7584  echo "CONFIG_USB_REDIR=y" >> $config_host_mak
7585  echo "USB_REDIR_CFLAGS=$usb_redir_cflags" >> $config_host_mak
7586  echo "USB_REDIR_LIBS=$usb_redir_libs" >> $config_host_mak
7587fi
7588
7589if test "$opengl" = "yes" ; then
7590  echo "CONFIG_OPENGL=y" >> $config_host_mak
7591  echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
7592  if test "$opengl_dmabuf" = "yes" ; then
7593    echo "CONFIG_OPENGL_DMABUF=y" >> $config_host_mak
7594  fi
7595fi
7596
7597if test "$gbm" = "yes" ; then
7598    echo "CONFIG_GBM=y" >> $config_host_mak
7599    echo "GBM_LIBS=$gbm_libs" >> $config_host_mak
7600    echo "GBM_CFLAGS=$gbm_cflags" >> $config_host_mak
7601fi
7602
7603
7604if test "$malloc_trim" = "yes" ; then
7605  echo "CONFIG_MALLOC_TRIM=y" >> $config_host_mak
7606fi
7607
7608if test "$avx2_opt" = "yes" ; then
7609  echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
7610fi
7611
7612if test "$avx512f_opt" = "yes" ; then
7613  echo "CONFIG_AVX512F_OPT=y" >> $config_host_mak
7614fi
7615
7616if test "$lzo" = "yes" ; then
7617  echo "CONFIG_LZO=y" >> $config_host_mak
7618fi
7619
7620if test "$snappy" = "yes" ; then
7621  echo "CONFIG_SNAPPY=y" >> $config_host_mak
7622fi
7623
7624if test "$bzip2" = "yes" ; then
7625  echo "CONFIG_BZIP2=y" >> $config_host_mak
7626  echo "BZIP2_LIBS=-lbz2" >> $config_host_mak
7627fi
7628
7629if test "$lzfse" = "yes" ; then
7630  echo "CONFIG_LZFSE=y" >> $config_host_mak
7631  echo "LZFSE_LIBS=-llzfse" >> $config_host_mak
7632fi
7633
7634if test "$zstd" = "yes" ; then
7635  echo "CONFIG_ZSTD=y" >> $config_host_mak
7636fi
7637
7638if test "$libiscsi" = "yes" ; then
7639  echo "CONFIG_LIBISCSI=m" >> $config_host_mak
7640  echo "LIBISCSI_CFLAGS=$libiscsi_cflags" >> $config_host_mak
7641  echo "LIBISCSI_LIBS=$libiscsi_libs" >> $config_host_mak
7642fi
7643
7644if test "$libnfs" = "yes" ; then
7645  echo "CONFIG_LIBNFS=m" >> $config_host_mak
7646  echo "LIBNFS_LIBS=$libnfs_libs" >> $config_host_mak
7647fi
7648
7649if test "$seccomp" = "yes"; then
7650  echo "CONFIG_SECCOMP=y" >> $config_host_mak
7651  echo "SECCOMP_CFLAGS=$seccomp_cflags" >> $config_host_mak
7652  echo "SECCOMP_LIBS=$seccomp_libs" >> $config_host_mak
7653fi
7654
7655# XXX: suppress that
7656if [ "$bsd" = "yes" ] ; then
7657  echo "CONFIG_BSD=y" >> $config_host_mak
7658fi
7659
7660if test "$localtime_r" = "yes" ; then
7661  echo "CONFIG_LOCALTIME_R=y" >> $config_host_mak
7662fi
7663if test "$qom_cast_debug" = "yes" ; then
7664  echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
7665fi
7666if test "$rbd" = "yes" ; then
7667  echo "CONFIG_RBD=m" >> $config_host_mak
7668  echo "RBD_CFLAGS=$rbd_cflags" >> $config_host_mak
7669  echo "RBD_LIBS=$rbd_libs" >> $config_host_mak
7670fi
7671
7672echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
7673if test "$coroutine_pool" = "yes" ; then
7674  echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
7675else
7676  echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
7677fi
7678
7679if test "$debug_stack_usage" = "yes" ; then
7680  echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
7681fi
7682
7683if test "$crypto_afalg" = "yes" ; then
7684  echo "CONFIG_AF_ALG=y" >> $config_host_mak
7685fi
7686
7687if test "$open_by_handle_at" = "yes" ; then
7688  echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
7689fi
7690
7691if test "$linux_magic_h" = "yes" ; then
7692  echo "CONFIG_LINUX_MAGIC_H=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 "$pty_h" = "yes" ; then
7925  echo "HAVE_PTY_H=y" >> $config_host_mak
7926fi
7927if test "$have_mlockall" = "yes" ; then
7928  echo "HAVE_MLOCKALL=y" >> $config_host_mak
7929fi
7930if test "$fuzzing" = "yes" ; then
7931  if test "$have_fuzzer" = "yes"; then
7932    FUZZ_LDFLAGS=" -fsanitize=address,fuzzer"
7933    FUZZ_CFLAGS=" -fsanitize=address,fuzzer"
7934    CFLAGS="$CFLAGS -fsanitize=address,fuzzer-no-link"
7935  else
7936    error_exit "Your compiler doesn't support -fsanitize=address,fuzzer"
7937    exit 1
7938  fi
7939fi
7940
7941if test "$plugins" = "yes" ; then
7942    echo "CONFIG_PLUGIN=y" >> $config_host_mak
7943    LIBS="-ldl $LIBS"
7944    # Copy the export object list to the build dir
7945    if test "$ld_dynamic_list" = "yes" ; then
7946	echo "CONFIG_HAS_LD_DYNAMIC_LIST=yes" >> $config_host_mak
7947	ld_symbols=qemu-plugins-ld.symbols
7948	cp "$source_path/plugins/qemu-plugins.symbols" $ld_symbols
7949    elif test "$ld_exported_symbols_list" = "yes" ; then
7950	echo "CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST=yes" >> $config_host_mak
7951	ld64_symbols=qemu-plugins-ld64.symbols
7952	echo "# Automatically generated by configure - do not modify" > $ld64_symbols
7953	grep 'qemu_' "$source_path/plugins/qemu-plugins.symbols" | sed 's/;//g' | \
7954	    sed -E 's/^[[:space:]]*(.*)/_\1/' >> $ld64_symbols
7955    else
7956	error_exit \
7957	    "If \$plugins=yes, either \$ld_dynamic_list or " \
7958	    "\$ld_exported_symbols_list should have been set to 'yes'."
7959    fi
7960fi
7961
7962if test -n "$gdb_bin" ; then
7963    echo "HAVE_GDB_BIN=$gdb_bin" >> $config_host_mak
7964fi
7965
7966if test "$secret_keyring" = "yes" ; then
7967  echo "CONFIG_SECRET_KEYRING=y" >> $config_host_mak
7968  if test "$have_keyutils" = "yes" ; then
7969    echo "CONFIG_TEST_SECRET_KEYRING=y" >> $config_host_mak
7970  fi
7971fi
7972
7973if test "$tcg_interpreter" = "yes"; then
7974  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/tci $QEMU_INCLUDES"
7975elif test "$ARCH" = "sparc64" ; then
7976  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/sparc $QEMU_INCLUDES"
7977elif test "$ARCH" = "s390x" ; then
7978  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/s390 $QEMU_INCLUDES"
7979elif test "$ARCH" = "x86_64" || test "$ARCH" = "x32" ; then
7980  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/i386 $QEMU_INCLUDES"
7981elif test "$ARCH" = "ppc64" ; then
7982  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/ppc $QEMU_INCLUDES"
7983elif test "$ARCH" = "riscv32" || test "$ARCH" = "riscv64" ; then
7984  QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/riscv $QEMU_INCLUDES"
7985else
7986  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/\$(ARCH) $QEMU_INCLUDES"
7987fi
7988
7989echo "HELPERS=$helpers" >> $config_host_mak
7990echo "TOOLS=$tools" >> $config_host_mak
7991echo "ROMS=$roms" >> $config_host_mak
7992echo "MAKE=$make" >> $config_host_mak
7993echo "INSTALL=$install" >> $config_host_mak
7994echo "INSTALL_DIR=$install -d -m 0755" >> $config_host_mak
7995echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
7996echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
7997echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
7998echo "PYTHON=$python" >> $config_host_mak
7999echo "SPHINX_BUILD=$sphinx_build" >> $config_host_mak
8000echo "SPHINX_WERROR=$sphinx_werror" >> $config_host_mak
8001echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
8002echo "EFI_AARCH64=$efi_aarch64" >> $config_host_mak
8003echo "PYTHON_YAML=$python_yaml" >> $config_host_mak
8004echo "CC=$cc" >> $config_host_mak
8005if $iasl -h > /dev/null 2>&1; then
8006  echo "IASL=$iasl" >> $config_host_mak
8007fi
8008echo "HOST_CC=$host_cc" >> $config_host_mak
8009echo "CXX=$cxx" >> $config_host_mak
8010echo "OBJCC=$objcc" >> $config_host_mak
8011echo "AR=$ar" >> $config_host_mak
8012echo "ARFLAGS=$ARFLAGS" >> $config_host_mak
8013echo "AS=$as" >> $config_host_mak
8014echo "CCAS=$ccas" >> $config_host_mak
8015echo "CPP=$cpp" >> $config_host_mak
8016echo "OBJCOPY=$objcopy" >> $config_host_mak
8017echo "LD=$ld" >> $config_host_mak
8018echo "RANLIB=$ranlib" >> $config_host_mak
8019echo "NM=$nm" >> $config_host_mak
8020echo "PKG_CONFIG=$pkg_config_exe" >> $config_host_mak
8021echo "WINDRES=$windres" >> $config_host_mak
8022echo "CFLAGS=$CFLAGS" >> $config_host_mak
8023echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
8024echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
8025echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
8026echo "QEMU_INCLUDES=$QEMU_INCLUDES" >> $config_host_mak
8027if test "$sparse" = "yes" ; then
8028  echo "CC           := REAL_CC=\"\$(CC)\" cgcc"       >> $config_host_mak
8029  echo "CPP          := REAL_CC=\"\$(CPP)\" cgcc"      >> $config_host_mak
8030  echo "CXX          := REAL_CC=\"\$(CXX)\" cgcc"      >> $config_host_mak
8031  echo "HOST_CC      := REAL_CC=\"\$(HOST_CC)\" cgcc"  >> $config_host_mak
8032  echo "QEMU_CFLAGS  += -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-non-pointer-null" >> $config_host_mak
8033fi
8034echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
8035echo "LDFLAGS_NOPIE=$LDFLAGS_NOPIE" >> $config_host_mak
8036echo "LD_REL_FLAGS=$LD_REL_FLAGS" >> $config_host_mak
8037echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
8038echo "LIBS+=$LIBS" >> $config_host_mak
8039echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak
8040echo "PTHREAD_LIB=$PTHREAD_LIB" >> $config_host_mak
8041echo "EXESUF=$EXESUF" >> $config_host_mak
8042echo "DSOSUF=$DSOSUF" >> $config_host_mak
8043echo "LDFLAGS_SHARED=$LDFLAGS_SHARED" >> $config_host_mak
8044echo "LIBS_QGA+=$libs_qga" >> $config_host_mak
8045echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak
8046echo "TASN1_CFLAGS=$tasn1_cflags" >> $config_host_mak
8047echo "POD2MAN=$POD2MAN" >> $config_host_mak
8048if test "$gcov" = "yes" ; then
8049  echo "CONFIG_GCOV=y" >> $config_host_mak
8050  echo "GCOV=$gcov_tool" >> $config_host_mak
8051fi
8052
8053if test "$libudev" != "no"; then
8054    echo "CONFIG_LIBUDEV=y" >> $config_host_mak
8055    echo "LIBUDEV_LIBS=$libudev_libs" >> $config_host_mak
8056fi
8057if test "$fuzzing" != "no"; then
8058    echo "CONFIG_FUZZ=y" >> $config_host_mak
8059    echo "FUZZ_CFLAGS=$FUZZ_CFLAGS" >> $config_host_mak
8060    echo "FUZZ_LDFLAGS=$FUZZ_LDFLAGS" >> $config_host_mak
8061fi
8062
8063if test "$edk2_blobs" = "yes" ; then
8064  echo "DECOMPRESS_EDK2_BLOBS=y" >> $config_host_mak
8065fi
8066
8067if test "$rng_none" = "yes"; then
8068  echo "CONFIG_RNG_NONE=y" >> $config_host_mak
8069fi
8070
8071# use included Linux headers
8072if test "$linux" = "yes" ; then
8073  mkdir -p linux-headers
8074  case "$cpu" in
8075  i386|x86_64|x32)
8076    linux_arch=x86
8077    ;;
8078  ppc|ppc64|ppc64le)
8079    linux_arch=powerpc
8080    ;;
8081  s390x)
8082    linux_arch=s390
8083    ;;
8084  aarch64)
8085    linux_arch=arm64
8086    ;;
8087  mips64)
8088    linux_arch=mips
8089    ;;
8090  *)
8091    # For most CPUs the kernel architecture name and QEMU CPU name match.
8092    linux_arch="$cpu"
8093    ;;
8094  esac
8095    # For non-KVM architectures we will not have asm headers
8096    if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
8097      symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
8098    fi
8099fi
8100
8101for target in $target_list; do
8102target_dir="$target"
8103config_target_mak=$target_dir/config-target.mak
8104target_name=$(echo $target | cut -d '-' -f 1)
8105target_aligned_only="no"
8106case "$target_name" in
8107  alpha|hppa|mips64el|mips64|mipsel|mips|mipsn32|mipsn32el|sh4|sh4eb|sparc|sparc64|sparc32plus|xtensa|xtensaeb)
8108  target_aligned_only="yes"
8109  ;;
8110esac
8111target_bigendian="no"
8112case "$target_name" in
8113  armeb|aarch64_be|hppa|lm32|m68k|microblaze|mips|mipsn32|mips64|moxie|or1k|ppc|ppc64|ppc64abi32|s390x|sh4eb|sparc|sparc64|sparc32plus|xtensaeb)
8114  target_bigendian="yes"
8115  ;;
8116esac
8117target_softmmu="no"
8118target_user_only="no"
8119target_linux_user="no"
8120target_bsd_user="no"
8121case "$target" in
8122  ${target_name}-softmmu)
8123    target_softmmu="yes"
8124    ;;
8125  ${target_name}-linux-user)
8126    target_user_only="yes"
8127    target_linux_user="yes"
8128    ;;
8129  ${target_name}-bsd-user)
8130    target_user_only="yes"
8131    target_bsd_user="yes"
8132    ;;
8133  *)
8134    error_exit "Target '$target' not recognised"
8135    exit 1
8136    ;;
8137esac
8138
8139mkdir -p $target_dir
8140echo "# Automatically generated by configure - do not modify" > $config_target_mak
8141
8142bflt="no"
8143mttcg="no"
8144interp_prefix1=$(echo "$interp_prefix" | sed "s/%M/$target_name/g")
8145gdb_xml_files=""
8146
8147TARGET_ARCH="$target_name"
8148TARGET_BASE_ARCH=""
8149TARGET_ABI_DIR=""
8150
8151case "$target_name" in
8152  i386)
8153    mttcg="yes"
8154	gdb_xml_files="i386-32bit.xml"
8155    TARGET_SYSTBL_ABI=i386
8156  ;;
8157  x86_64)
8158    TARGET_BASE_ARCH=i386
8159    TARGET_SYSTBL_ABI=common,64
8160    mttcg="yes"
8161	gdb_xml_files="i386-64bit.xml"
8162  ;;
8163  alpha)
8164    mttcg="yes"
8165    TARGET_SYSTBL_ABI=common
8166  ;;
8167  arm|armeb)
8168    TARGET_ARCH=arm
8169    TARGET_SYSTBL_ABI=common,oabi
8170    bflt="yes"
8171    mttcg="yes"
8172    gdb_xml_files="arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml arm-m-profile.xml"
8173  ;;
8174  aarch64|aarch64_be)
8175    TARGET_ARCH=aarch64
8176    TARGET_BASE_ARCH=arm
8177    bflt="yes"
8178    mttcg="yes"
8179    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"
8180  ;;
8181  avr)
8182    gdb_xml_files="avr-cpu.xml"
8183    target_compiler=$cross_cc_avr
8184  ;;
8185  cris)
8186  ;;
8187  hppa)
8188    mttcg="yes"
8189    TARGET_SYSTBL_ABI=common,32
8190  ;;
8191  lm32)
8192  ;;
8193  m68k)
8194    bflt="yes"
8195    gdb_xml_files="cf-core.xml cf-fp.xml m68k-core.xml m68k-fp.xml"
8196    TARGET_SYSTBL_ABI=common
8197  ;;
8198  microblaze|microblazeel)
8199    TARGET_ARCH=microblaze
8200    TARGET_SYSTBL_ABI=common
8201    bflt="yes"
8202    echo "TARGET_ABI32=y" >> $config_target_mak
8203  ;;
8204  mips|mipsel)
8205    mttcg="yes"
8206    TARGET_ARCH=mips
8207    echo "TARGET_ABI_MIPSO32=y" >> $config_target_mak
8208    TARGET_SYSTBL_ABI=o32
8209  ;;
8210  mipsn32|mipsn32el)
8211    mttcg="yes"
8212    TARGET_ARCH=mips64
8213    TARGET_BASE_ARCH=mips
8214    echo "TARGET_ABI_MIPSN32=y" >> $config_target_mak
8215    echo "TARGET_ABI32=y" >> $config_target_mak
8216    TARGET_SYSTBL_ABI=n32
8217  ;;
8218  mips64|mips64el)
8219    mttcg="no"
8220    TARGET_ARCH=mips64
8221    TARGET_BASE_ARCH=mips
8222    echo "TARGET_ABI_MIPSN64=y" >> $config_target_mak
8223    TARGET_SYSTBL_ABI=n64
8224  ;;
8225  moxie)
8226  ;;
8227  nios2)
8228  ;;
8229  or1k)
8230    TARGET_ARCH=openrisc
8231    TARGET_BASE_ARCH=openrisc
8232  ;;
8233  ppc)
8234    gdb_xml_files="power-core.xml power-fpu.xml power-altivec.xml power-spe.xml"
8235    TARGET_SYSTBL_ABI=common,nospu,32
8236  ;;
8237  ppc64)
8238    TARGET_BASE_ARCH=ppc
8239    TARGET_ABI_DIR=ppc
8240    TARGET_SYSTBL_ABI=common,nospu,64
8241    mttcg=yes
8242    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
8243  ;;
8244  ppc64le)
8245    TARGET_ARCH=ppc64
8246    TARGET_BASE_ARCH=ppc
8247    TARGET_ABI_DIR=ppc
8248    TARGET_SYSTBL_ABI=common,nospu,64
8249    mttcg=yes
8250    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
8251  ;;
8252  ppc64abi32)
8253    TARGET_ARCH=ppc64
8254    TARGET_BASE_ARCH=ppc
8255    TARGET_ABI_DIR=ppc
8256    TARGET_SYSTBL_ABI=common,nospu,32
8257    echo "TARGET_ABI32=y" >> $config_target_mak
8258    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
8259  ;;
8260  riscv32)
8261    TARGET_BASE_ARCH=riscv
8262    TARGET_ABI_DIR=riscv
8263    mttcg=yes
8264    gdb_xml_files="riscv-32bit-cpu.xml riscv-32bit-fpu.xml riscv-64bit-fpu.xml riscv-32bit-csr.xml riscv-32bit-virtual.xml"
8265  ;;
8266  riscv64)
8267    TARGET_BASE_ARCH=riscv
8268    TARGET_ABI_DIR=riscv
8269    mttcg=yes
8270    gdb_xml_files="riscv-64bit-cpu.xml riscv-32bit-fpu.xml riscv-64bit-fpu.xml riscv-64bit-csr.xml riscv-64bit-virtual.xml"
8271  ;;
8272  rx)
8273    TARGET_ARCH=rx
8274    bflt="yes"
8275    target_compiler=$cross_cc_rx
8276    gdb_xml_files="rx-core.xml"
8277  ;;
8278  sh4|sh4eb)
8279    TARGET_ARCH=sh4
8280    TARGET_SYSTBL_ABI=common
8281    bflt="yes"
8282  ;;
8283  sparc)
8284    TARGET_SYSTBL_ABI=common,32
8285  ;;
8286  sparc64)
8287    TARGET_BASE_ARCH=sparc
8288    TARGET_SYSTBL_ABI=common,64
8289  ;;
8290  sparc32plus)
8291    TARGET_ARCH=sparc64
8292    TARGET_BASE_ARCH=sparc
8293    TARGET_ABI_DIR=sparc
8294    TARGET_SYSTBL_ABI=common,32
8295    echo "TARGET_ABI32=y" >> $config_target_mak
8296  ;;
8297  s390x)
8298    TARGET_SYSTBL_ABI=common,64
8299    mttcg=yes
8300    gdb_xml_files="s390x-core64.xml s390-acr.xml s390-fpr.xml s390-vx.xml s390-cr.xml s390-virt.xml s390-gs.xml"
8301  ;;
8302  tilegx)
8303  ;;
8304  tricore)
8305  ;;
8306  unicore32)
8307  ;;
8308  xtensa|xtensaeb)
8309    TARGET_ARCH=xtensa
8310    TARGET_SYSTBL_ABI=common
8311    bflt="yes"
8312    mttcg="yes"
8313  ;;
8314  *)
8315    error_exit "Unsupported target CPU"
8316  ;;
8317esac
8318# TARGET_BASE_ARCH needs to be defined after TARGET_ARCH
8319if [ "$TARGET_BASE_ARCH" = "" ]; then
8320  TARGET_BASE_ARCH=$TARGET_ARCH
8321fi
8322
8323symlink "$source_path/Makefile.target" "$target_dir/Makefile"
8324
8325upper() {
8326    echo "$@"| LC_ALL=C tr '[a-z]' '[A-Z]'
8327}
8328
8329target_arch_name="$(upper $TARGET_ARCH)"
8330echo "TARGET_$target_arch_name=y" >> $config_target_mak
8331echo "TARGET_NAME=$target_name" >> $config_target_mak
8332echo "TARGET_BASE_ARCH=$TARGET_BASE_ARCH" >> $config_target_mak
8333if [ "$TARGET_ABI_DIR" = "" ]; then
8334  TARGET_ABI_DIR=$TARGET_ARCH
8335fi
8336echo "TARGET_ABI_DIR=$TARGET_ABI_DIR" >> $config_target_mak
8337if [ "$HOST_VARIANT_DIR" != "" ]; then
8338    echo "HOST_VARIANT_DIR=$HOST_VARIANT_DIR" >> $config_target_mak
8339fi
8340if [ "$TARGET_SYSTBL_ABI" != "" ]; then
8341    echo "TARGET_SYSTBL_ABI=$TARGET_SYSTBL_ABI" >> $config_target_mak
8342fi
8343
8344if supported_xen_target $target; then
8345    echo "CONFIG_XEN=y" >> $config_target_mak
8346    echo "$target/config-devices.mak: CONFIG_XEN=y" >> $config_host_mak
8347    if test "$xen_pci_passthrough" = yes; then
8348        echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak"
8349    fi
8350else
8351    echo "$target/config-devices.mak: CONFIG_XEN=n" >> $config_host_mak
8352fi
8353if supported_kvm_target $target; then
8354    echo "CONFIG_KVM=y" >> $config_target_mak
8355    echo "$target/config-devices.mak: CONFIG_KVM=y" >> $config_host_mak
8356else
8357    echo "$target/config-devices.mak: CONFIG_KVM=n" >> $config_host_mak
8358fi
8359if supported_hax_target $target; then
8360    echo "CONFIG_HAX=y" >> $config_target_mak
8361fi
8362if supported_hvf_target $target; then
8363    echo "CONFIG_HVF=y" >> $config_target_mak
8364fi
8365if supported_whpx_target $target; then
8366    echo "CONFIG_WHPX=y" >> $config_target_mak
8367fi
8368if test "$target_aligned_only" = "yes" ; then
8369  echo "TARGET_ALIGNED_ONLY=y" >> $config_target_mak
8370fi
8371if test "$target_bigendian" = "yes" ; then
8372  echo "TARGET_WORDS_BIGENDIAN=y" >> $config_target_mak
8373fi
8374if test "$target_softmmu" = "yes" ; then
8375  echo "CONFIG_SOFTMMU=y" >> $config_target_mak
8376  if test "$mttcg" = "yes" ; then
8377    echo "TARGET_SUPPORTS_MTTCG=y" >> $config_target_mak
8378  fi
8379fi
8380if test "$target_user_only" = "yes" ; then
8381  echo "CONFIG_USER_ONLY=y" >> $config_target_mak
8382  echo "CONFIG_QEMU_INTERP_PREFIX=\"$interp_prefix1\"" >> $config_target_mak
8383fi
8384if test "$target_linux_user" = "yes" ; then
8385  echo "CONFIG_LINUX_USER=y" >> $config_target_mak
8386fi
8387list=""
8388if test ! -z "$gdb_xml_files" ; then
8389  for x in $gdb_xml_files; do
8390    list="$list $source_path/gdb-xml/$x"
8391  done
8392  echo "TARGET_XML_FILES=$list" >> $config_target_mak
8393fi
8394
8395if test "$target_user_only" = "yes" && test "$bflt" = "yes"; then
8396  echo "TARGET_HAS_BFLT=y" >> $config_target_mak
8397fi
8398if test "$target_bsd_user" = "yes" ; then
8399  echo "CONFIG_BSD_USER=y" >> $config_target_mak
8400fi
8401
8402
8403# generate QEMU_CFLAGS/QEMU_LDFLAGS for targets
8404
8405cflags=""
8406ldflags=""
8407
8408disas_config() {
8409  echo "CONFIG_${1}_DIS=y" >> $config_target_mak
8410  echo "CONFIG_${1}_DIS=y" >> config-all-disas.mak
8411}
8412
8413for i in $ARCH $TARGET_BASE_ARCH ; do
8414  case "$i" in
8415  alpha)
8416    disas_config "ALPHA"
8417  ;;
8418  aarch64)
8419    if test -n "${cxx}"; then
8420      disas_config "ARM_A64"
8421    fi
8422  ;;
8423  arm)
8424    disas_config "ARM"
8425    if test -n "${cxx}"; then
8426      disas_config "ARM_A64"
8427    fi
8428  ;;
8429  avr)
8430    disas_config "AVR"
8431  ;;
8432  cris)
8433    disas_config "CRIS"
8434  ;;
8435  hppa)
8436    disas_config "HPPA"
8437  ;;
8438  i386|x86_64|x32)
8439    disas_config "I386"
8440  ;;
8441  lm32)
8442    disas_config "LM32"
8443  ;;
8444  m68k)
8445    disas_config "M68K"
8446  ;;
8447  microblaze*)
8448    disas_config "MICROBLAZE"
8449  ;;
8450  mips*)
8451    disas_config "MIPS"
8452    if test -n "${cxx}"; then
8453      disas_config "NANOMIPS"
8454    fi
8455  ;;
8456  moxie*)
8457    disas_config "MOXIE"
8458  ;;
8459  nios2)
8460    disas_config "NIOS2"
8461  ;;
8462  or1k)
8463    disas_config "OPENRISC"
8464  ;;
8465  ppc*)
8466    disas_config "PPC"
8467  ;;
8468  riscv*)
8469    disas_config "RISCV"
8470  ;;
8471  rx)
8472    disas_config "RX"
8473  ;;
8474  s390*)
8475    disas_config "S390"
8476  ;;
8477  sh4)
8478    disas_config "SH4"
8479  ;;
8480  sparc*)
8481    disas_config "SPARC"
8482  ;;
8483  xtensa*)
8484    disas_config "XTENSA"
8485  ;;
8486  esac
8487done
8488if test "$tcg_interpreter" = "yes" ; then
8489  disas_config "TCI"
8490fi
8491
8492case "$ARCH" in
8493alpha)
8494  # Ensure there's only a single GP
8495  cflags="-msmall-data $cflags"
8496;;
8497esac
8498
8499if test "$gprof" = "yes" ; then
8500  if test "$target_linux_user" = "yes" ; then
8501    cflags="-p $cflags"
8502    ldflags="-p $ldflags"
8503  fi
8504  if test "$target_softmmu" = "yes" ; then
8505    ldflags="-p $ldflags"
8506    echo "GPROF_CFLAGS=-p" >> $config_target_mak
8507  fi
8508fi
8509
8510# Newer kernels on s390 check for an S390_PGSTE program header and
8511# enable the pgste page table extensions in that case. This makes
8512# the vm.allocate_pgste sysctl unnecessary. We enable this program
8513# header if
8514#  - we build on s390x
8515#  - we build the system emulation for s390x (qemu-system-s390x)
8516#  - KVM is enabled
8517#  - the linker supports --s390-pgste
8518if test "$TARGET_ARCH" = "s390x" && test "$target_softmmu" = "yes" && \
8519        test "$ARCH" = "s390x" && test "$kvm" = "yes"; then
8520    if ld_has --s390-pgste ; then
8521        ldflags="-Wl,--s390-pgste $ldflags"
8522    fi
8523fi
8524
8525echo "QEMU_LDFLAGS+=$ldflags" >> $config_target_mak
8526echo "QEMU_CFLAGS+=$cflags" >> $config_target_mak
8527
8528done # for target in $targets
8529
8530echo "PIXMAN_CFLAGS=$pixman_cflags" >> $config_host_mak
8531echo "PIXMAN_LIBS=$pixman_libs" >> $config_host_mak
8532
8533if [ "$fdt" = "git" ]; then
8534  echo "config-host.h: dtc/all" >> $config_host_mak
8535fi
8536if [ "$capstone" = "git" -o "$capstone" = "internal" ]; then
8537  echo "config-host.h: capstone/all" >> $config_host_mak
8538fi
8539if test -n "$LIBCAPSTONE"; then
8540  echo "LIBCAPSTONE=$LIBCAPSTONE" >> $config_host_mak
8541fi
8542
8543if test "$numa" = "yes"; then
8544  echo "CONFIG_NUMA=y" >> $config_host_mak
8545fi
8546
8547if test "$ccache_cpp2" = "yes"; then
8548  echo "export CCACHE_CPP2=y" >> $config_host_mak
8549fi
8550
8551if test "$safe_stack" = "yes"; then
8552  echo "CONFIG_SAFESTACK=y" >> $config_host_mak
8553fi
8554
8555# If we're using a separate build tree, set it up now.
8556# DIRS are directories which we simply mkdir in the build tree;
8557# LINKS are things to symlink back into the source tree
8558# (these can be both files and directories).
8559# Caution: do not add files or directories here using wildcards. This
8560# will result in problems later if a new file matching the wildcard is
8561# added to the source tree -- nothing will cause configure to be rerun
8562# so the build tree will be missing the link back to the new file, and
8563# tests might fail. Prefer to keep the relevant files in their own
8564# directory and symlink the directory instead.
8565DIRS="tests tests/tcg tests/tcg/lm32 tests/qapi-schema tests/qtest/libqos"
8566DIRS="$DIRS tests/qtest tests/qemu-iotests tests/vm tests/fp tests/qgraph"
8567DIRS="$DIRS docs docs/interop fsdev scsi"
8568DIRS="$DIRS pc-bios/optionrom pc-bios/s390-ccw"
8569DIRS="$DIRS roms/seabios"
8570LINKS="Makefile"
8571LINKS="$LINKS tests/tcg/lm32/Makefile po/Makefile"
8572LINKS="$LINKS tests/tcg/Makefile.target tests/fp/Makefile"
8573LINKS="$LINKS tests/plugin/Makefile"
8574LINKS="$LINKS pc-bios/optionrom/Makefile pc-bios/keymaps"
8575LINKS="$LINKS pc-bios/s390-ccw/Makefile"
8576LINKS="$LINKS roms/seabios/Makefile"
8577LINKS="$LINKS pc-bios/qemu-icon.bmp"
8578LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
8579LINKS="$LINKS tests/acceptance tests/data"
8580LINKS="$LINKS tests/qemu-iotests/check"
8581LINKS="$LINKS python"
8582for bios_file in \
8583    $source_path/pc-bios/*.bin \
8584    $source_path/pc-bios/*.lid \
8585    $source_path/pc-bios/*.rom \
8586    $source_path/pc-bios/*.dtb \
8587    $source_path/pc-bios/*.img \
8588    $source_path/pc-bios/openbios-* \
8589    $source_path/pc-bios/u-boot.* \
8590    $source_path/pc-bios/edk2-*.fd.bz2 \
8591    $source_path/pc-bios/palcode-*
8592do
8593    LINKS="$LINKS pc-bios/$(basename $bios_file)"
8594done
8595mkdir -p $DIRS
8596for f in $LINKS ; do
8597    if [ -e "$source_path/$f" ] && [ "$pwd_is_source_path" != "y" ]; then
8598        symlink "$source_path/$f" "$f"
8599    fi
8600done
8601
8602(for i in $cross_cc_vars; do
8603  export $i
8604done
8605export target_list source_path use_containers
8606$source_path/tests/tcg/configure.sh)
8607
8608# temporary config to build submodules
8609for rom in seabios; do
8610    config_mak=roms/$rom/config.mak
8611    echo "# Automatically generated by configure - do not modify" > $config_mak
8612    echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
8613    echo "AS=$as" >> $config_mak
8614    echo "CCAS=$ccas" >> $config_mak
8615    echo "CC=$cc" >> $config_mak
8616    echo "BCC=bcc" >> $config_mak
8617    echo "CPP=$cpp" >> $config_mak
8618    echo "OBJCOPY=objcopy" >> $config_mak
8619    echo "IASL=$iasl" >> $config_mak
8620    echo "LD=$ld" >> $config_mak
8621    echo "RANLIB=$ranlib" >> $config_mak
8622done
8623
8624# set up qemu-iotests in this build directory
8625iotests_common_env="tests/qemu-iotests/common.env"
8626
8627echo "# Automatically generated by configure - do not modify" > "$iotests_common_env"
8628echo >> "$iotests_common_env"
8629echo "export PYTHON='$python'" >> "$iotests_common_env"
8630
8631# Save the configure command line for later reuse.
8632cat <<EOD >config.status
8633#!/bin/sh
8634# Generated by configure.
8635# Run this file to recreate the current configuration.
8636# Compiler output produced by configure, useful for debugging
8637# configure, is in config.log if it exists.
8638EOD
8639
8640preserve_env() {
8641    envname=$1
8642
8643    eval envval=\$$envname
8644
8645    if test -n "$envval"
8646    then
8647	echo "$envname='$envval'" >> config.status
8648	echo "export $envname" >> config.status
8649    else
8650	echo "unset $envname" >> config.status
8651    fi
8652}
8653
8654# Preserve various env variables that influence what
8655# features/build target configure will detect
8656preserve_env AR
8657preserve_env AS
8658preserve_env CC
8659preserve_env CPP
8660preserve_env CXX
8661preserve_env INSTALL
8662preserve_env LD
8663preserve_env LD_LIBRARY_PATH
8664preserve_env LIBTOOL
8665preserve_env MAKE
8666preserve_env NM
8667preserve_env OBJCOPY
8668preserve_env PATH
8669preserve_env PKG_CONFIG
8670preserve_env PKG_CONFIG_LIBDIR
8671preserve_env PKG_CONFIG_PATH
8672preserve_env PYTHON
8673preserve_env SDL2_CONFIG
8674preserve_env SMBD
8675preserve_env STRIP
8676preserve_env WINDRES
8677
8678printf "exec" >>config.status
8679printf " '%s'" "$0" "$@" >>config.status
8680echo ' "$@"' >>config.status
8681chmod +x config.status
8682
8683rm -r "$TMPDIR1"
8684