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