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