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