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