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