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