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