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