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