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