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