xref: /qemu/configure (revision f556b4a1)
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
1995if test -z "$python"
1996then
1997    error_exit "Python not found. Use --python=/path/to/python"
1998fi
1999
2000# Note that if the Python conditional here evaluates True we will exit
2001# with status 1 which is a shell 'false' value.
2002if ! $python -c 'import sys; sys.exit(sys.version_info < (3,5))'; then
2003  error_exit "Cannot use '$python', Python >= 3.5 is required." \
2004      "Use --python=/path/to/python to specify a supported Python."
2005fi
2006
2007# Preserve python version since some functionality is dependent on it
2008python_version=$($python -c 'import sys; print("%d.%d.%d" % (sys.version_info[0], sys.version_info[1], sys.version_info[2]))' 2>/dev/null)
2009
2010# Suppress writing compiled files
2011python="$python -B"
2012
2013if test -z "$meson"; then
2014    if test "$explicit_python" = no && has meson && version_ge "$(meson --version)" 0.55.0; then
2015        meson=meson
2016    elif test -e "${source_path}/.git" && test $git_update = 'yes' ; then
2017        meson=git
2018    elif test -e "${source_path}/meson/meson.py" ; then
2019        meson=internal
2020    else
2021        if test "$explicit_python" = yes; then
2022            error_exit "--python requires using QEMU's embedded Meson distribution, but it was not found."
2023        else
2024            error_exit "Meson not found.  Use --meson=/path/to/meson"
2025        fi
2026    fi
2027else
2028    # Meson uses its own Python interpreter to invoke other Python scripts,
2029    # but the user wants to use the one they specified with --python.
2030    #
2031    # We do not want to override the distro Python interpreter (and sometimes
2032    # cannot: for example in Homebrew /usr/bin/meson is a bash script), so
2033    # just require --meson=git|internal together with --python.
2034    if test "$explicit_python" = yes; then
2035        case "$meson" in
2036            git | internal) ;;
2037            *) error_exit "--python requires using QEMU's embedded Meson distribution." ;;
2038        esac
2039    fi
2040fi
2041
2042if test "$meson" = git; then
2043    git_submodules="${git_submodules} meson"
2044fi
2045if test "$git_update" = yes; then
2046    (cd "${source_path}" && GIT="$git" "./scripts/git-submodule.sh" update "$git_submodules")
2047fi
2048
2049case "$meson" in
2050    git | internal)
2051        if ! $python -c 'import pkg_resources' > /dev/null 2>&1; then
2052            error_exit "Python setuptools not found"
2053        fi
2054        meson="$python ${source_path}/meson/meson.py"
2055        ;;
2056    *) meson=$(command -v meson) ;;
2057esac
2058
2059
2060# Check that the C compiler works. Doing this here before testing
2061# the host CPU ensures that we had a valid CC to autodetect the
2062# $cpu var (and we should bail right here if that's not the case).
2063# It also allows the help message to be printed without a CC.
2064write_c_skeleton;
2065if compile_object ; then
2066  : C compiler works ok
2067else
2068    error_exit "\"$cc\" either does not exist or does not work"
2069fi
2070if ! compile_prog ; then
2071    error_exit "\"$cc\" cannot build an executable (is your linker broken?)"
2072fi
2073
2074# Now we have handled --enable-tcg-interpreter and know we're not just
2075# printing the help message, bail out if the host CPU isn't supported.
2076if test "$ARCH" = "unknown"; then
2077    if test "$tcg_interpreter" = "yes" ; then
2078        echo "Unsupported CPU = $cpu, will use TCG with TCI (experimental)"
2079    else
2080        error_exit "Unsupported CPU = $cpu, try --enable-tcg-interpreter"
2081    fi
2082fi
2083
2084# Consult white-list to determine whether to enable werror
2085# by default.  Only enable by default for git builds
2086if test -z "$werror" ; then
2087    if test -e "$source_path/.git" && \
2088        { test "$linux" = "yes" || test "$mingw32" = "yes"; }; then
2089        werror="yes"
2090    else
2091        werror="no"
2092    fi
2093fi
2094
2095if test "$bogus_os" = "yes"; then
2096    # Now that we know that we're not printing the help and that
2097    # the compiler works (so the results of the check_defines we used
2098    # to identify the OS are reliable), if we didn't recognize the
2099    # host OS we should stop now.
2100    error_exit "Unrecognized host OS (uname -s reports '$(uname -s)')"
2101fi
2102
2103# Check whether the compiler matches our minimum requirements:
2104cat > $TMPC << EOF
2105#if defined(__clang_major__) && defined(__clang_minor__)
2106# ifdef __apple_build_version__
2107#  if __clang_major__ < 5 || (__clang_major__ == 5 && __clang_minor__ < 1)
2108#   error You need at least XCode Clang v5.1 to compile QEMU
2109#  endif
2110# else
2111#  if __clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ < 4)
2112#   error You need at least Clang v3.4 to compile QEMU
2113#  endif
2114# endif
2115#elif defined(__GNUC__) && defined(__GNUC_MINOR__)
2116# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8)
2117#  error You need at least GCC v4.8 to compile QEMU
2118# endif
2119#else
2120# error You either need GCC or Clang to compiler QEMU
2121#endif
2122int main (void) { return 0; }
2123EOF
2124if ! compile_prog "" "" ; then
2125    error_exit "You need at least GCC v4.8 or Clang v3.4 (or XCode Clang v5.1)"
2126fi
2127
2128# Accumulate -Wfoo and -Wno-bar separately.
2129# We will list all of the enable flags first, and the disable flags second.
2130# Note that we do not add -Werror, because that would enable it for all
2131# configure tests. If a configure test failed due to -Werror this would
2132# just silently disable some features, so it's too error prone.
2133
2134warn_flags=
2135add_to warn_flags -Wold-style-declaration
2136add_to warn_flags -Wold-style-definition
2137add_to warn_flags -Wtype-limits
2138add_to warn_flags -Wformat-security
2139add_to warn_flags -Wformat-y2k
2140add_to warn_flags -Winit-self
2141add_to warn_flags -Wignored-qualifiers
2142add_to warn_flags -Wempty-body
2143add_to warn_flags -Wnested-externs
2144add_to warn_flags -Wendif-labels
2145add_to warn_flags -Wexpansion-to-defined
2146
2147nowarn_flags=
2148add_to nowarn_flags -Wno-initializer-overrides
2149add_to nowarn_flags -Wno-missing-include-dirs
2150add_to nowarn_flags -Wno-shift-negative-value
2151add_to nowarn_flags -Wno-string-plus-int
2152add_to nowarn_flags -Wno-typedef-redefinition
2153add_to nowarn_flags -Wno-tautological-type-limit-compare
2154add_to nowarn_flags -Wno-psabi
2155
2156gcc_flags="$warn_flags $nowarn_flags"
2157
2158cc_has_warning_flag() {
2159    write_c_skeleton;
2160
2161    # Use the positive sense of the flag when testing for -Wno-wombat
2162    # support (gcc will happily accept the -Wno- form of unknown
2163    # warning options).
2164    optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
2165    compile_prog "-Werror $optflag" ""
2166}
2167
2168for flag in $gcc_flags; do
2169    if cc_has_warning_flag $flag ; then
2170        QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2171    fi
2172done
2173
2174if test "$stack_protector" != "no"; then
2175  cat > $TMPC << EOF
2176int main(int argc, char *argv[])
2177{
2178    char arr[64], *p = arr, *c = argv[0];
2179    while (*c) {
2180        *p++ = *c++;
2181    }
2182    return 0;
2183}
2184EOF
2185  gcc_flags="-fstack-protector-strong -fstack-protector-all"
2186  sp_on=0
2187  for flag in $gcc_flags; do
2188    # We need to check both a compile and a link, since some compiler
2189    # setups fail only on a .c->.o compile and some only at link time
2190    if compile_object "-Werror $flag" &&
2191       compile_prog "-Werror $flag" ""; then
2192      QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2193      QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
2194      sp_on=1
2195      break
2196    fi
2197  done
2198  if test "$stack_protector" = yes; then
2199    if test $sp_on = 0; then
2200      error_exit "Stack protector not supported"
2201    fi
2202  fi
2203fi
2204
2205# Disable -Wmissing-braces on older compilers that warn even for
2206# the "universal" C zero initializer {0}.
2207cat > $TMPC << EOF
2208struct {
2209  int a[2];
2210} x = {0};
2211EOF
2212if compile_object "-Werror" "" ; then
2213  :
2214else
2215  QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces"
2216fi
2217
2218# Our module code doesn't support Windows
2219if test "$modules" = "yes" && test "$mingw32" = "yes" ; then
2220  error_exit "Modules are not available for Windows"
2221fi
2222
2223# module_upgrades is only reasonable if modules are enabled
2224if test "$modules" = "no" && test "$module_upgrades" = "yes" ; then
2225  error_exit "Can't enable module-upgrades as Modules are not enabled"
2226fi
2227
2228# Static linking is not possible with modules or PIE
2229if test "$static" = "yes" ; then
2230  if test "$modules" = "yes" ; then
2231    error_exit "static and modules are mutually incompatible"
2232  fi
2233fi
2234
2235# Unconditional check for compiler __thread support
2236  cat > $TMPC << EOF
2237static __thread int tls_var;
2238int main(void) { return tls_var; }
2239EOF
2240
2241if ! compile_prog "-Werror" "" ; then
2242    error_exit "Your compiler does not support the __thread specifier for " \
2243	"Thread-Local Storage (TLS). Please upgrade to a version that does."
2244fi
2245
2246cat > $TMPC << EOF
2247
2248#ifdef __linux__
2249#  define THREAD __thread
2250#else
2251#  define THREAD
2252#endif
2253static THREAD int tls_var;
2254int main(void) { return tls_var; }
2255EOF
2256
2257# Check we support --no-pie first; we will need this for building ROMs.
2258if compile_prog "-Werror -fno-pie" "-no-pie"; then
2259  CFLAGS_NOPIE="-fno-pie"
2260  LDFLAGS_NOPIE="-no-pie"
2261fi
2262
2263if test "$static" = "yes"; then
2264  if test "$pie" != "no" && compile_prog "-Werror -fPIE -DPIE" "-static-pie"; then
2265    CFLAGS="-fPIE -DPIE $CFLAGS"
2266    QEMU_LDFLAGS="-static-pie $QEMU_LDFLAGS"
2267    pie="yes"
2268  elif test "$pie" = "yes"; then
2269    error_exit "-static-pie not available due to missing toolchain support"
2270  else
2271    QEMU_LDFLAGS="-static $QEMU_LDFLAGS"
2272    pie="no"
2273  fi
2274elif test "$pie" = "no"; then
2275  CFLAGS="$CFLAGS_NOPIE $CFLAGS"
2276  LDFLAGS="$LDFLAGS_NOPIE $LDFLAGS"
2277elif compile_prog "-Werror -fPIE -DPIE" "-pie"; then
2278  CFLAGS="-fPIE -DPIE $CFLAGS"
2279  LDFLAGS="-pie $LDFLAGS"
2280  pie="yes"
2281elif test "$pie" = "yes"; then
2282  error_exit "PIE not available due to missing toolchain support"
2283else
2284  echo "Disabling PIE due to missing toolchain support"
2285  pie="no"
2286fi
2287
2288# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
2289# The combination is known as "full relro", because .got.plt is read-only too.
2290if compile_prog "" "-Wl,-z,relro -Wl,-z,now" ; then
2291  QEMU_LDFLAGS="-Wl,-z,relro -Wl,-z,now $QEMU_LDFLAGS"
2292fi
2293
2294##########################################
2295# __sync_fetch_and_and requires at least -march=i486. Many toolchains
2296# use i686 as default anyway, but for those that don't, an explicit
2297# specification is necessary
2298
2299if test "$cpu" = "i386"; then
2300  cat > $TMPC << EOF
2301static int sfaa(int *ptr)
2302{
2303  return __sync_fetch_and_and(ptr, 0);
2304}
2305
2306int main(void)
2307{
2308  int val = 42;
2309  val = __sync_val_compare_and_swap(&val, 0, 1);
2310  sfaa(&val);
2311  return val;
2312}
2313EOF
2314  if ! compile_prog "" "" ; then
2315    QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS"
2316  fi
2317fi
2318
2319#########################################
2320# Solaris specific configure tool chain decisions
2321
2322if test "$solaris" = "yes" ; then
2323  if has $install; then
2324    :
2325  else
2326    error_exit "Solaris install program not found. Use --install=/usr/ucb/install or" \
2327        "install fileutils from www.blastwave.org using pkg-get -i fileutils" \
2328        "to get ginstall which is used by default (which lives in /opt/csw/bin)"
2329  fi
2330  if test "$(path_of $install)" = "/usr/sbin/install" ; then
2331    error_exit "Solaris /usr/sbin/install is not an appropriate install program." \
2332        "try ginstall from the GNU fileutils available from www.blastwave.org" \
2333        "using pkg-get -i fileutils, or use --install=/usr/ucb/install"
2334  fi
2335  if has ar; then
2336    :
2337  else
2338    if test -f /usr/ccs/bin/ar ; then
2339      error_exit "No path includes ar" \
2340          "Add /usr/ccs/bin to your path and rerun configure"
2341    fi
2342    error_exit "No path includes ar"
2343  fi
2344fi
2345
2346if test -z "${target_list+xxx}" ; then
2347    for target in $default_target_list; do
2348        supported_target $target 2>/dev/null && \
2349            target_list="$target_list $target"
2350    done
2351    target_list="${target_list# }"
2352else
2353    target_list=$(echo "$target_list" | sed -e 's/,/ /g')
2354    for target in $target_list; do
2355        # Check that we recognised the target name; this allows a more
2356        # friendly error message than if we let it fall through.
2357        case " $default_target_list " in
2358            *" $target "*)
2359                ;;
2360            *)
2361                error_exit "Unknown target name '$target'"
2362                ;;
2363        esac
2364        supported_target $target || exit 1
2365    done
2366fi
2367
2368# see if system emulation was really requested
2369case " $target_list " in
2370  *"-softmmu "*) softmmu=yes
2371  ;;
2372  *) softmmu=no
2373  ;;
2374esac
2375
2376for target in $target_list; do
2377  case "$target" in
2378    arm-softmmu | aarch64-softmmu | i386-softmmu | x86_64-softmmu)
2379      edk2_blobs="yes"
2380      ;;
2381  esac
2382done
2383# The EDK2 binaries are compressed with bzip2
2384if test "$edk2_blobs" = "yes" && ! has bzip2; then
2385  error_exit "The bzip2 program is required for building QEMU"
2386fi
2387
2388feature_not_found() {
2389  feature=$1
2390  remedy=$2
2391
2392  error_exit "User requested feature $feature" \
2393      "configure was not able to find it." \
2394      "$remedy"
2395}
2396
2397# ---
2398# big/little endian test
2399cat > $TMPC << EOF
2400short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, };
2401short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, };
2402extern int foo(short *, short *);
2403int main(int argc, char *argv[]) {
2404    return foo(big_endian, little_endian);
2405}
2406EOF
2407
2408if compile_object ; then
2409    if strings -a $TMPO | grep -q BiGeNdIaN ; then
2410        bigendian="yes"
2411    elif strings -a $TMPO | grep -q LiTtLeEnDiAn ; then
2412        bigendian="no"
2413    else
2414        echo big/little test failed
2415    fi
2416else
2417    echo big/little test failed
2418fi
2419
2420##########################################
2421# system tools
2422if test -z "$want_tools"; then
2423    if test "$softmmu" = "no"; then
2424        want_tools=no
2425    else
2426        want_tools=yes
2427    fi
2428fi
2429
2430##########################################
2431# cocoa implies not SDL or GTK
2432# (the cocoa UI code currently assumes it is always the active UI
2433# and doesn't interact well with other UI frontend code)
2434if test "$cocoa" = "yes"; then
2435    if test "$sdl" = "yes"; then
2436        error_exit "Cocoa and SDL UIs cannot both be enabled at once"
2437    fi
2438    if test "$gtk" = "yes"; then
2439        error_exit "Cocoa and GTK UIs cannot both be enabled at once"
2440    fi
2441    gtk=no
2442    sdl=no
2443fi
2444
2445# Some versions of Mac OS X incorrectly define SIZE_MAX
2446cat > $TMPC << EOF
2447#include <stdint.h>
2448#include <stdio.h>
2449int main(int argc, char *argv[]) {
2450    return printf("%zu", SIZE_MAX);
2451}
2452EOF
2453have_broken_size_max=no
2454if ! compile_object -Werror ; then
2455    have_broken_size_max=yes
2456fi
2457
2458##########################################
2459# L2TPV3 probe
2460
2461cat > $TMPC <<EOF
2462#include <sys/socket.h>
2463#include <linux/ip.h>
2464int main(void) { return sizeof(struct mmsghdr); }
2465EOF
2466if compile_prog "" "" ; then
2467  l2tpv3=yes
2468else
2469  l2tpv3=no
2470fi
2471
2472if check_include "pty.h" ; then
2473  pty_h=yes
2474else
2475  pty_h=no
2476fi
2477
2478cat > $TMPC <<EOF
2479#include <sys/mman.h>
2480int main(int argc, char *argv[]) {
2481    return mlockall(MCL_FUTURE);
2482}
2483EOF
2484if compile_prog "" "" ; then
2485  have_mlockall=yes
2486else
2487  have_mlockall=no
2488fi
2489
2490#########################################
2491# vhost interdependencies and host support
2492
2493# vhost backends
2494test "$vhost_user" = "" && vhost_user=yes
2495if test "$vhost_user" = "yes" && test "$mingw32" = "yes"; then
2496  error_exit "vhost-user isn't available on win32"
2497fi
2498test "$vhost_vdpa" = "" && vhost_vdpa=$linux
2499if test "$vhost_vdpa" = "yes" && test "$linux" != "yes"; then
2500  error_exit "vhost-vdpa is only available on Linux"
2501fi
2502test "$vhost_kernel" = "" && vhost_kernel=$linux
2503if test "$vhost_kernel" = "yes" && test "$linux" != "yes"; then
2504  error_exit "vhost-kernel is only available on Linux"
2505fi
2506
2507# vhost-kernel devices
2508test "$vhost_scsi" = "" && vhost_scsi=$vhost_kernel
2509if test "$vhost_scsi" = "yes" && test "$vhost_kernel" != "yes"; then
2510  error_exit "--enable-vhost-scsi requires --enable-vhost-kernel"
2511fi
2512test "$vhost_vsock" = "" && vhost_vsock=$vhost_kernel
2513if test "$vhost_vsock" = "yes" && test "$vhost_kernel" != "yes"; then
2514  error_exit "--enable-vhost-vsock requires --enable-vhost-kernel"
2515fi
2516
2517# vhost-user backends
2518test "$vhost_net_user" = "" && vhost_net_user=$vhost_user
2519if test "$vhost_net_user" = "yes" && test "$vhost_user" = "no"; then
2520  error_exit "--enable-vhost-net-user requires --enable-vhost-user"
2521fi
2522test "$vhost_crypto" = "" && vhost_crypto=$vhost_user
2523if test "$vhost_crypto" = "yes" && test "$vhost_user" = "no"; then
2524  error_exit "--enable-vhost-crypto requires --enable-vhost-user"
2525fi
2526test "$vhost_user_fs" = "" && vhost_user_fs=$vhost_user
2527if test "$vhost_user_fs" = "yes" && test "$vhost_user" = "no"; then
2528  error_exit "--enable-vhost-user-fs requires --enable-vhost-user"
2529fi
2530#vhost-vdpa backends
2531test "$vhost_net_vdpa" = "" && vhost_net_vdpa=$vhost_vdpa
2532if test "$vhost_net_vdpa" = "yes" && test "$vhost_vdpa" = "no"; then
2533  error_exit "--enable-vhost-net-vdpa requires --enable-vhost-vdpa"
2534fi
2535
2536# OR the vhost-kernel and vhost-user values for simplicity
2537if test "$vhost_net" = ""; then
2538  test "$vhost_net_user" = "yes" && vhost_net=yes
2539  test "$vhost_kernel" = "yes" && vhost_net=yes
2540fi
2541
2542##########################################
2543# MinGW / Mingw-w64 localtime_r/gmtime_r check
2544
2545if test "$mingw32" = "yes"; then
2546    # Some versions of MinGW / Mingw-w64 lack localtime_r
2547    # and gmtime_r entirely.
2548    #
2549    # Some versions of Mingw-w64 define a macro for
2550    # localtime_r/gmtime_r.
2551    #
2552    # Some versions of Mingw-w64 will define functions
2553    # for localtime_r/gmtime_r, but only if you have
2554    # _POSIX_THREAD_SAFE_FUNCTIONS defined. For fun
2555    # though, unistd.h and pthread.h both define
2556    # that for you.
2557    #
2558    # So this #undef localtime_r and #include <unistd.h>
2559    # are not in fact redundant.
2560cat > $TMPC << EOF
2561#include <unistd.h>
2562#include <time.h>
2563#undef localtime_r
2564int main(void) { localtime_r(NULL, NULL); return 0; }
2565EOF
2566    if compile_prog "" "" ; then
2567        localtime_r="yes"
2568    else
2569        localtime_r="no"
2570    fi
2571fi
2572
2573##########################################
2574# pkg-config probe
2575
2576if ! has "$pkg_config_exe"; then
2577  error_exit "pkg-config binary '$pkg_config_exe' not found"
2578fi
2579
2580##########################################
2581# NPTL probe
2582
2583if test "$linux_user" = "yes"; then
2584  cat > $TMPC <<EOF
2585#include <sched.h>
2586#include <linux/futex.h>
2587int main(void) {
2588#if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
2589#error bork
2590#endif
2591  return 0;
2592}
2593EOF
2594  if ! compile_object ; then
2595    feature_not_found "nptl" "Install glibc and linux kernel headers."
2596  fi
2597fi
2598
2599##########################################
2600# lzo check
2601
2602if test "$lzo" != "no" ; then
2603    cat > $TMPC << EOF
2604#include <lzo/lzo1x.h>
2605int main(void) { lzo_version(); return 0; }
2606EOF
2607    if compile_prog "" "-llzo2" ; then
2608        libs_softmmu="$libs_softmmu -llzo2"
2609        lzo_libs="-llzo2"
2610        lzo="yes"
2611    else
2612        if test "$lzo" = "yes"; then
2613            feature_not_found "liblzo2" "Install liblzo2 devel"
2614        fi
2615        lzo="no"
2616    fi
2617fi
2618
2619##########################################
2620# snappy check
2621
2622if test "$snappy" != "no" ; then
2623    cat > $TMPC << EOF
2624#include <snappy-c.h>
2625int main(void) { snappy_max_compressed_length(4096); return 0; }
2626EOF
2627    if compile_prog "" "-lsnappy" ; then
2628        libs_softmmu="$libs_softmmu -lsnappy"
2629        snappy_libs='-lsnappy'
2630        snappy="yes"
2631    else
2632        if test "$snappy" = "yes"; then
2633            feature_not_found "libsnappy" "Install libsnappy devel"
2634        fi
2635        snappy="no"
2636    fi
2637fi
2638
2639##########################################
2640# bzip2 check
2641
2642if test "$bzip2" != "no" ; then
2643    cat > $TMPC << EOF
2644#include <bzlib.h>
2645int main(void) { BZ2_bzlibVersion(); return 0; }
2646EOF
2647    if compile_prog "" "-lbz2" ; then
2648        bzip2="yes"
2649    else
2650        if test "$bzip2" = "yes"; then
2651            feature_not_found "libbzip2" "Install libbzip2 devel"
2652        fi
2653        bzip2="no"
2654    fi
2655fi
2656
2657##########################################
2658# lzfse check
2659
2660if test "$lzfse" != "no" ; then
2661    cat > $TMPC << EOF
2662#include <lzfse.h>
2663int main(void) { lzfse_decode_scratch_size(); return 0; }
2664EOF
2665    if compile_prog "" "-llzfse" ; then
2666        lzfse="yes"
2667    else
2668        if test "$lzfse" = "yes"; then
2669            feature_not_found "lzfse" "Install lzfse devel"
2670        fi
2671        lzfse="no"
2672    fi
2673fi
2674
2675##########################################
2676# zstd check
2677
2678if test "$zstd" != "no" ; then
2679    libzstd_minver="1.4.0"
2680    if $pkg_config --atleast-version=$libzstd_minver libzstd ; then
2681        zstd_cflags="$($pkg_config --cflags libzstd)"
2682        zstd_libs="$($pkg_config --libs libzstd)"
2683        zstd="yes"
2684    else
2685        if test "$zstd" = "yes" ; then
2686            feature_not_found "libzstd" "Install libzstd devel"
2687        fi
2688        zstd="no"
2689    fi
2690fi
2691
2692##########################################
2693# libseccomp check
2694
2695if test "$seccomp" != "no" ; then
2696    libseccomp_minver="2.3.0"
2697    if $pkg_config --atleast-version=$libseccomp_minver libseccomp ; then
2698        seccomp_cflags="$($pkg_config --cflags libseccomp)"
2699        seccomp_libs="$($pkg_config --libs libseccomp)"
2700        seccomp="yes"
2701    else
2702        if test "$seccomp" = "yes" ; then
2703            feature_not_found "libseccomp" \
2704                 "Install libseccomp devel >= $libseccomp_minver"
2705        fi
2706        seccomp="no"
2707    fi
2708fi
2709##########################################
2710# xen probe
2711
2712if test "$xen" != "no" ; then
2713  # Check whether Xen library path is specified via --extra-ldflags to avoid
2714  # overriding this setting with pkg-config output. If not, try pkg-config
2715  # to obtain all needed flags.
2716
2717  if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
2718     $pkg_config --exists xencontrol ; then
2719    xen_ctrl_version="$(printf '%d%02d%02d' \
2720      $($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
2721    xen=yes
2722    xen_pc="xencontrol xenstore xenguest xenforeignmemory xengnttab"
2723    xen_pc="$xen_pc xenevtchn xendevicemodel"
2724    if $pkg_config --exists xentoolcore; then
2725      xen_pc="$xen_pc xentoolcore"
2726    fi
2727    QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags $xen_pc)"
2728    libs_softmmu="$($pkg_config --libs $xen_pc) $libs_softmmu"
2729    xen_cflags="$($pkg_config --cflags $xen_pc)"
2730    xen_libs="$($pkg_config --libs $xen_pc)"
2731  else
2732
2733    xen_libs="-lxenstore -lxenctrl -lxenguest"
2734    xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
2735
2736    # First we test whether Xen headers and libraries are available.
2737    # If no, we are done and there is no Xen support.
2738    # If yes, more tests are run to detect the Xen version.
2739
2740    # Xen (any)
2741    cat > $TMPC <<EOF
2742#include <xenctrl.h>
2743int main(void) {
2744  return 0;
2745}
2746EOF
2747    if ! compile_prog "" "$xen_libs" ; then
2748      # Xen not found
2749      if test "$xen" = "yes" ; then
2750        feature_not_found "xen" "Install xen devel"
2751      fi
2752      xen=no
2753
2754    # Xen unstable
2755    elif
2756        cat > $TMPC <<EOF &&
2757#undef XC_WANT_COMPAT_DEVICEMODEL_API
2758#define __XEN_TOOLS__
2759#include <xendevicemodel.h>
2760#include <xenforeignmemory.h>
2761int main(void) {
2762  xendevicemodel_handle *xd;
2763  xenforeignmemory_handle *xfmem;
2764
2765  xd = xendevicemodel_open(0, 0);
2766  xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
2767
2768  xfmem = xenforeignmemory_open(0, 0);
2769  xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
2770
2771  return 0;
2772}
2773EOF
2774        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2775      then
2776      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2777      xen_ctrl_version=41100
2778      xen=yes
2779    elif
2780        cat > $TMPC <<EOF &&
2781#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2782#include <xenforeignmemory.h>
2783#include <xentoolcore.h>
2784int main(void) {
2785  xenforeignmemory_handle *xfmem;
2786
2787  xfmem = xenforeignmemory_open(0, 0);
2788  xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
2789  xentoolcore_restrict_all(0);
2790
2791  return 0;
2792}
2793EOF
2794        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2795      then
2796      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2797      xen_ctrl_version=41000
2798      xen=yes
2799    elif
2800        cat > $TMPC <<EOF &&
2801#undef XC_WANT_COMPAT_DEVICEMODEL_API
2802#define __XEN_TOOLS__
2803#include <xendevicemodel.h>
2804int main(void) {
2805  xendevicemodel_handle *xd;
2806
2807  xd = xendevicemodel_open(0, 0);
2808  xendevicemodel_close(xd);
2809
2810  return 0;
2811}
2812EOF
2813        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
2814      then
2815      xen_stable_libs="-lxendevicemodel $xen_stable_libs"
2816      xen_ctrl_version=40900
2817      xen=yes
2818    elif
2819        cat > $TMPC <<EOF &&
2820/*
2821 * If we have stable libs the we don't want the libxc compat
2822 * layers, regardless of what CFLAGS we may have been given.
2823 *
2824 * Also, check if xengnttab_grant_copy_segment_t is defined and
2825 * grant copy operation is implemented.
2826 */
2827#undef XC_WANT_COMPAT_EVTCHN_API
2828#undef XC_WANT_COMPAT_GNTTAB_API
2829#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2830#include <xenctrl.h>
2831#include <xenstore.h>
2832#include <xenevtchn.h>
2833#include <xengnttab.h>
2834#include <xenforeignmemory.h>
2835#include <stdint.h>
2836#include <xen/hvm/hvm_info_table.h>
2837#if !defined(HVM_MAX_VCPUS)
2838# error HVM_MAX_VCPUS not defined
2839#endif
2840int main(void) {
2841  xc_interface *xc = NULL;
2842  xenforeignmemory_handle *xfmem;
2843  xenevtchn_handle *xe;
2844  xengnttab_handle *xg;
2845  xengnttab_grant_copy_segment_t* seg = NULL;
2846
2847  xs_daemon_open();
2848
2849  xc = xc_interface_open(0, 0, 0);
2850  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2851  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2852  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2853  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2854
2855  xfmem = xenforeignmemory_open(0, 0);
2856  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2857
2858  xe = xenevtchn_open(0, 0);
2859  xenevtchn_fd(xe);
2860
2861  xg = xengnttab_open(0, 0);
2862  xengnttab_grant_copy(xg, 0, seg);
2863
2864  return 0;
2865}
2866EOF
2867        compile_prog "" "$xen_libs $xen_stable_libs"
2868      then
2869      xen_ctrl_version=40800
2870      xen=yes
2871    elif
2872        cat > $TMPC <<EOF &&
2873/*
2874 * If we have stable libs the we don't want the libxc compat
2875 * layers, regardless of what CFLAGS we may have been given.
2876 */
2877#undef XC_WANT_COMPAT_EVTCHN_API
2878#undef XC_WANT_COMPAT_GNTTAB_API
2879#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2880#include <xenctrl.h>
2881#include <xenstore.h>
2882#include <xenevtchn.h>
2883#include <xengnttab.h>
2884#include <xenforeignmemory.h>
2885#include <stdint.h>
2886#include <xen/hvm/hvm_info_table.h>
2887#if !defined(HVM_MAX_VCPUS)
2888# error HVM_MAX_VCPUS not defined
2889#endif
2890int main(void) {
2891  xc_interface *xc = NULL;
2892  xenforeignmemory_handle *xfmem;
2893  xenevtchn_handle *xe;
2894  xengnttab_handle *xg;
2895
2896  xs_daemon_open();
2897
2898  xc = xc_interface_open(0, 0, 0);
2899  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2900  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2901  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2902  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2903
2904  xfmem = xenforeignmemory_open(0, 0);
2905  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2906
2907  xe = xenevtchn_open(0, 0);
2908  xenevtchn_fd(xe);
2909
2910  xg = xengnttab_open(0, 0);
2911  xengnttab_map_grant_ref(xg, 0, 0, 0);
2912
2913  return 0;
2914}
2915EOF
2916        compile_prog "" "$xen_libs $xen_stable_libs"
2917      then
2918      xen_ctrl_version=40701
2919      xen=yes
2920
2921    # Xen 4.6
2922    elif
2923        cat > $TMPC <<EOF &&
2924#include <xenctrl.h>
2925#include <xenstore.h>
2926#include <stdint.h>
2927#include <xen/hvm/hvm_info_table.h>
2928#if !defined(HVM_MAX_VCPUS)
2929# error HVM_MAX_VCPUS not defined
2930#endif
2931int main(void) {
2932  xc_interface *xc;
2933  xs_daemon_open();
2934  xc = xc_interface_open(0, 0, 0);
2935  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2936  xc_gnttab_open(NULL, 0);
2937  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2938  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2939  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2940  xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
2941  return 0;
2942}
2943EOF
2944        compile_prog "" "$xen_libs"
2945      then
2946      xen_ctrl_version=40600
2947      xen=yes
2948
2949    # Xen 4.5
2950    elif
2951        cat > $TMPC <<EOF &&
2952#include <xenctrl.h>
2953#include <xenstore.h>
2954#include <stdint.h>
2955#include <xen/hvm/hvm_info_table.h>
2956#if !defined(HVM_MAX_VCPUS)
2957# error HVM_MAX_VCPUS not defined
2958#endif
2959int main(void) {
2960  xc_interface *xc;
2961  xs_daemon_open();
2962  xc = xc_interface_open(0, 0, 0);
2963  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2964  xc_gnttab_open(NULL, 0);
2965  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2966  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2967  xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
2968  return 0;
2969}
2970EOF
2971        compile_prog "" "$xen_libs"
2972      then
2973      xen_ctrl_version=40500
2974      xen=yes
2975
2976    elif
2977        cat > $TMPC <<EOF &&
2978#include <xenctrl.h>
2979#include <xenstore.h>
2980#include <stdint.h>
2981#include <xen/hvm/hvm_info_table.h>
2982#if !defined(HVM_MAX_VCPUS)
2983# error HVM_MAX_VCPUS not defined
2984#endif
2985int main(void) {
2986  xc_interface *xc;
2987  xs_daemon_open();
2988  xc = xc_interface_open(0, 0, 0);
2989  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2990  xc_gnttab_open(NULL, 0);
2991  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2992  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2993  return 0;
2994}
2995EOF
2996        compile_prog "" "$xen_libs"
2997      then
2998      xen_ctrl_version=40200
2999      xen=yes
3000
3001    else
3002      if test "$xen" = "yes" ; then
3003        feature_not_found "xen (unsupported version)" \
3004                          "Install a supported xen (xen 4.2 or newer)"
3005      fi
3006      xen=no
3007    fi
3008
3009    if test "$xen" = yes; then
3010      if test $xen_ctrl_version -ge 40701  ; then
3011        xen_libs="$xen_libs $xen_stable_libs "
3012      fi
3013    fi
3014  fi
3015fi
3016
3017if test "$xen_pci_passthrough" != "no"; then
3018  if test "$xen" = "yes" && test "$linux" = "yes"; then
3019    xen_pci_passthrough=yes
3020  else
3021    if test "$xen_pci_passthrough" = "yes"; then
3022      error_exit "User requested feature Xen PCI Passthrough" \
3023          " but this feature requires /sys from Linux"
3024    fi
3025    xen_pci_passthrough=no
3026  fi
3027fi
3028
3029##########################################
3030# Windows Hypervisor Platform accelerator (WHPX) check
3031if test "$whpx" != "no" ; then
3032    if check_include "WinHvPlatform.h" && check_include "WinHvEmulation.h"; then
3033        whpx="yes"
3034    else
3035        if test "$whpx" = "yes"; then
3036            feature_not_found "WinHvPlatform" "WinHvEmulation is not installed"
3037        fi
3038        whpx="no"
3039    fi
3040fi
3041
3042##########################################
3043# Sparse probe
3044if test "$sparse" != "no" ; then
3045  if has sparse; then
3046    sparse=yes
3047  else
3048    if test "$sparse" = "yes" ; then
3049      feature_not_found "sparse" "Install sparse binary"
3050    fi
3051    sparse=no
3052  fi
3053fi
3054
3055##########################################
3056# X11 probe
3057if $pkg_config --exists "x11"; then
3058    have_x11=yes
3059    x11_cflags=$($pkg_config --cflags x11)
3060    x11_libs=$($pkg_config --libs x11)
3061fi
3062
3063##########################################
3064# GTK probe
3065
3066if test "$gtk" != "no"; then
3067    gtkpackage="gtk+-3.0"
3068    gtkx11package="gtk+-x11-3.0"
3069    gtkversion="3.22.0"
3070    if $pkg_config --exists "$gtkpackage >= $gtkversion"; then
3071        gtk_cflags=$($pkg_config --cflags $gtkpackage)
3072        gtk_libs=$($pkg_config --libs $gtkpackage)
3073        gtk_version=$($pkg_config --modversion $gtkpackage)
3074        if $pkg_config --exists "$gtkx11package >= $gtkversion"; then
3075            need_x11=yes
3076            gtk_cflags="$gtk_cflags $x11_cflags"
3077            gtk_libs="$gtk_libs $x11_libs"
3078        fi
3079        gtk="yes"
3080    elif test "$gtk" = "yes"; then
3081        feature_not_found "gtk" "Install gtk3-devel"
3082    else
3083        gtk="no"
3084    fi
3085fi
3086
3087
3088##########################################
3089# GNUTLS probe
3090
3091if test "$gnutls" != "no"; then
3092    pass="no"
3093    if $pkg_config --exists "gnutls >= 3.1.18"; then
3094        gnutls_cflags=$($pkg_config --cflags gnutls)
3095        gnutls_libs=$($pkg_config --libs gnutls)
3096        # Packaging for the static libraries is not always correct.
3097        # At least ubuntu 18.04 ships only shared libraries.
3098        write_c_skeleton
3099        if compile_prog "" "$gnutls_libs" ; then
3100            LIBS="$gnutls_libs $LIBS"
3101            QEMU_CFLAGS="$QEMU_CFLAGS $gnutls_cflags"
3102            pass="yes"
3103        fi
3104    fi
3105    if test "$pass" = "no" && test "$gnutls" = "yes"; then
3106	feature_not_found "gnutls" "Install gnutls devel >= 3.1.18"
3107    else
3108        gnutls="$pass"
3109    fi
3110fi
3111
3112
3113# If user didn't give a --disable/enable-gcrypt flag,
3114# then mark as disabled if user requested nettle
3115# explicitly
3116if test -z "$gcrypt"
3117then
3118    if test "$nettle" = "yes"
3119    then
3120        gcrypt="no"
3121    fi
3122fi
3123
3124# If user didn't give a --disable/enable-nettle flag,
3125# then mark as disabled if user requested gcrypt
3126# explicitly
3127if test -z "$nettle"
3128then
3129    if test "$gcrypt" = "yes"
3130    then
3131        nettle="no"
3132    fi
3133fi
3134
3135has_libgcrypt() {
3136    if ! has "libgcrypt-config"
3137    then
3138	return 1
3139    fi
3140
3141    if test -n "$cross_prefix"
3142    then
3143	host=$(libgcrypt-config --host)
3144	if test "$host-" != $cross_prefix
3145	then
3146	    return 1
3147	fi
3148    fi
3149
3150    maj=`libgcrypt-config --version | awk -F . '{print $1}'`
3151    min=`libgcrypt-config --version | awk -F . '{print $2}'`
3152
3153    if test $maj != 1 || test $min -lt 5
3154    then
3155       return 1
3156    fi
3157
3158    return 0
3159}
3160
3161
3162if test "$nettle" != "no"; then
3163    pass="no"
3164    if $pkg_config --exists "nettle >= 2.7.1"; then
3165        nettle_cflags=$($pkg_config --cflags nettle)
3166        nettle_libs=$($pkg_config --libs nettle)
3167        nettle_version=$($pkg_config --modversion nettle)
3168        # Link test to make sure the given libraries work (e.g for static).
3169        write_c_skeleton
3170        if compile_prog "" "$nettle_libs" ; then
3171            LIBS="$nettle_libs $LIBS"
3172            QEMU_CFLAGS="$QEMU_CFLAGS $nettle_cflags"
3173            if test -z "$gcrypt"; then
3174               gcrypt="no"
3175            fi
3176            pass="yes"
3177        fi
3178    fi
3179    if test "$pass" = "yes"
3180    then
3181        cat > $TMPC << EOF
3182#include <nettle/xts.h>
3183int main(void) {
3184  return 0;
3185}
3186EOF
3187        if compile_prog "$nettle_cflags" "$nettle_libs" ; then
3188            nettle_xts=yes
3189            qemu_private_xts=no
3190        fi
3191    fi
3192    if test "$pass" = "no" && test "$nettle" = "yes"; then
3193        feature_not_found "nettle" "Install nettle devel >= 2.7.1"
3194    else
3195        nettle="$pass"
3196    fi
3197fi
3198
3199if test "$gcrypt" != "no"; then
3200    pass="no"
3201    if has_libgcrypt; then
3202        gcrypt_cflags=$(libgcrypt-config --cflags)
3203        gcrypt_libs=$(libgcrypt-config --libs)
3204        # Debian has removed -lgpg-error from libgcrypt-config
3205        # as it "spreads unnecessary dependencies" which in
3206        # turn breaks static builds...
3207        if test "$static" = "yes"
3208        then
3209            gcrypt_libs="$gcrypt_libs -lgpg-error"
3210        fi
3211
3212        # Link test to make sure the given libraries work (e.g for static).
3213        write_c_skeleton
3214        if compile_prog "" "$gcrypt_libs" ; then
3215            LIBS="$gcrypt_libs $LIBS"
3216            QEMU_CFLAGS="$QEMU_CFLAGS $gcrypt_cflags"
3217            pass="yes"
3218        fi
3219    fi
3220    if test "$pass" = "yes"; then
3221        gcrypt="yes"
3222        cat > $TMPC << EOF
3223#include <gcrypt.h>
3224int main(void) {
3225  gcry_mac_hd_t handle;
3226  gcry_mac_open(&handle, GCRY_MAC_HMAC_MD5,
3227                GCRY_MAC_FLAG_SECURE, NULL);
3228  return 0;
3229}
3230EOF
3231        if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
3232            gcrypt_hmac=yes
3233        fi
3234        cat > $TMPC << EOF
3235#include <gcrypt.h>
3236int main(void) {
3237  gcry_cipher_hd_t handle;
3238  gcry_cipher_open(&handle, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_XTS, 0);
3239  return 0;
3240}
3241EOF
3242        if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
3243            gcrypt_xts=yes
3244            qemu_private_xts=no
3245        fi
3246    elif test "$gcrypt" = "yes"; then
3247        feature_not_found "gcrypt" "Install gcrypt devel >= 1.5.0"
3248    else
3249        gcrypt="no"
3250    fi
3251fi
3252
3253
3254if test "$gcrypt" = "yes" && test "$nettle" = "yes"
3255then
3256    error_exit "Only one of gcrypt & nettle can be enabled"
3257fi
3258
3259##########################################
3260# libtasn1 - only for the TLS creds/session test suite
3261
3262tasn1=yes
3263tasn1_cflags=""
3264tasn1_libs=""
3265if $pkg_config --exists "libtasn1"; then
3266    tasn1_cflags=$($pkg_config --cflags libtasn1)
3267    tasn1_libs=$($pkg_config --libs libtasn1)
3268else
3269    tasn1=no
3270fi
3271
3272
3273##########################################
3274# PAM probe
3275
3276if test "$auth_pam" != "no"; then
3277    cat > $TMPC <<EOF
3278#include <security/pam_appl.h>
3279#include <stdio.h>
3280int main(void) {
3281   const char *service_name = "qemu";
3282   const char *user = "frank";
3283   const struct pam_conv pam_conv = { 0 };
3284   pam_handle_t *pamh = NULL;
3285   pam_start(service_name, user, &pam_conv, &pamh);
3286   return 0;
3287}
3288EOF
3289    if compile_prog "" "-lpam" ; then
3290        auth_pam=yes
3291    else
3292        if test "$auth_pam" = "yes"; then
3293            feature_not_found "PAM" "Install PAM development package"
3294        else
3295            auth_pam=no
3296        fi
3297    fi
3298fi
3299
3300##########################################
3301# getifaddrs (for tests/test-io-channel-socket )
3302
3303have_ifaddrs_h=yes
3304if ! check_include "ifaddrs.h" ; then
3305  have_ifaddrs_h=no
3306fi
3307
3308#########################################
3309# libdrm check
3310have_drm_h=no
3311if check_include "libdrm/drm.h" ; then
3312    have_drm_h=yes
3313fi
3314
3315#########################################
3316# sys/signal.h check
3317have_sys_signal_h=no
3318if check_include "sys/signal.h" ; then
3319  have_sys_signal_h=yes
3320fi
3321
3322##########################################
3323# VTE probe
3324
3325if test "$vte" != "no"; then
3326    vteminversion="0.32.0"
3327    if $pkg_config --exists "vte-2.91"; then
3328      vtepackage="vte-2.91"
3329    else
3330      vtepackage="vte-2.90"
3331    fi
3332    if $pkg_config --exists "$vtepackage >= $vteminversion"; then
3333        vte_cflags=$($pkg_config --cflags $vtepackage)
3334        vte_libs=$($pkg_config --libs $vtepackage)
3335        vteversion=$($pkg_config --modversion $vtepackage)
3336        vte="yes"
3337    elif test "$vte" = "yes"; then
3338        feature_not_found "vte" "Install libvte-2.90/2.91 devel"
3339    else
3340        vte="no"
3341    fi
3342fi
3343
3344##########################################
3345# SDL probe
3346
3347# Look for sdl configuration program (pkg-config or sdl2-config).  Try
3348# sdl2-config even without cross prefix, and favour pkg-config over sdl2-config.
3349
3350sdl_probe ()
3351{
3352  if $pkg_config sdl2 --exists; then
3353    sdlconfig="$pkg_config sdl2"
3354    sdlversion=$($sdlconfig --modversion 2>/dev/null)
3355  elif has "$sdl2_config"; then
3356    sdlconfig="$sdl2_config"
3357    sdlversion=$($sdlconfig --version)
3358  else
3359    if test "$sdl" = "yes" ; then
3360      feature_not_found "sdl" "Install SDL2-devel"
3361    fi
3362    sdl=no
3363    # no need to do the rest
3364    return
3365  fi
3366  if test -n "$cross_prefix" && test "$(basename "$sdlconfig")" = sdl2-config; then
3367    echo warning: using "\"$sdlconfig\"" to detect cross-compiled sdl >&2
3368  fi
3369
3370  cat > $TMPC << EOF
3371#include <SDL.h>
3372#undef main /* We don't want SDL to override our main() */
3373int main( void ) { return SDL_Init (SDL_INIT_VIDEO); }
3374EOF
3375  sdl_cflags=$($sdlconfig --cflags 2>/dev/null)
3376  sdl_cflags="$sdl_cflags -Wno-undef"  # workaround 2.0.8 bug
3377  if test "$static" = "yes" ; then
3378    if $pkg_config sdl2 --exists; then
3379      sdl_libs=$($pkg_config sdl2 --static --libs 2>/dev/null)
3380    else
3381      sdl_libs=$($sdlconfig --static-libs 2>/dev/null)
3382    fi
3383  else
3384    sdl_libs=$($sdlconfig --libs 2>/dev/null)
3385  fi
3386  if compile_prog "$sdl_cflags" "$sdl_libs" ; then
3387    sdl=yes
3388
3389    # static link with sdl ? (note: sdl.pc's --static --libs is broken)
3390    if test "$sdl" = "yes" && test "$static" = "yes" ; then
3391      if test $? = 0 && echo $sdl_libs | grep -- -laa > /dev/null; then
3392         sdl_libs="$sdl_libs $(aalib-config --static-libs 2>/dev/null)"
3393         sdl_cflags="$sdl_cflags $(aalib-config --cflags 2>/dev/null)"
3394      fi
3395      if compile_prog "$sdl_cflags" "$sdl_libs" ; then
3396	:
3397      else
3398        sdl=no
3399      fi
3400    fi # static link
3401  else # sdl not found
3402    if test "$sdl" = "yes" ; then
3403      feature_not_found "sdl" "Install SDL2 devel"
3404    fi
3405    sdl=no
3406  fi # sdl compile test
3407}
3408
3409sdl_image_probe ()
3410{
3411    if test "$sdl_image" != "no" ; then
3412        if $pkg_config SDL2_image --exists; then
3413            if test "$static" = "yes"; then
3414                sdl_image_libs=$($pkg_config SDL2_image --libs --static 2>/dev/null)
3415            else
3416                sdl_image_libs=$($pkg_config SDL2_image --libs 2>/dev/null)
3417            fi
3418            sdl_image_cflags=$($pkg_config SDL2_image --cflags 2>/dev/null)
3419            sdl_image=yes
3420
3421            sdl_cflags="$sdl_cflags $sdl_image_cflags"
3422            sdl_libs="$sdl_libs $sdl_image_libs"
3423        else
3424            if test "$sdl_image" = "yes" ; then
3425                feature_not_found "sdl_image" "Install SDL Image devel"
3426            else
3427                sdl_image=no
3428            fi
3429        fi
3430    fi
3431}
3432
3433if test "$sdl" != "no" ; then
3434  sdl_probe
3435fi
3436
3437if test "$sdl" = "yes" ; then
3438  sdl_image_probe
3439else
3440  if test "$sdl_image" = "yes"; then
3441    echo "warning: SDL Image requested, but SDL is not available, disabling"
3442  fi
3443  sdl_image=no
3444fi
3445
3446if test "$sdl" = "yes" ; then
3447  cat > $TMPC <<EOF
3448#include <SDL.h>
3449#if defined(SDL_VIDEO_DRIVER_X11)
3450#include <X11/XKBlib.h>
3451#else
3452#error No x11 support
3453#endif
3454int main(void) { return 0; }
3455EOF
3456  if compile_prog "$sdl_cflags $x11_cflags" "$sdl_libs $x11_libs" ; then
3457    need_x11=yes
3458    sdl_cflags="$sdl_cflags $x11_cflags"
3459    sdl_libs="$sdl_libs $x11_libs"
3460  fi
3461fi
3462
3463##########################################
3464# RDMA needs OpenFabrics libraries
3465if test "$rdma" != "no" ; then
3466  cat > $TMPC <<EOF
3467#include <rdma/rdma_cma.h>
3468int main(void) { return 0; }
3469EOF
3470  rdma_libs="-lrdmacm -libverbs -libumad"
3471  if compile_prog "" "$rdma_libs" ; then
3472    rdma="yes"
3473    libs_softmmu="$libs_softmmu $rdma_libs"
3474  else
3475    if test "$rdma" = "yes" ; then
3476        error_exit \
3477            " OpenFabrics librdmacm/libibverbs/libibumad not present." \
3478            " Your options:" \
3479            "  (1) Fast: Install infiniband packages (devel) from your distro." \
3480            "  (2) Cleanest: Install libraries from www.openfabrics.org" \
3481            "  (3) Also: Install softiwarp if you don't have RDMA hardware"
3482    fi
3483    rdma="no"
3484  fi
3485fi
3486
3487##########################################
3488# PVRDMA detection
3489
3490cat > $TMPC <<EOF &&
3491#include <sys/mman.h>
3492
3493int
3494main(void)
3495{
3496    char buf = 0;
3497    void *addr = &buf;
3498    addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
3499
3500    return 0;
3501}
3502EOF
3503
3504if test "$rdma" = "yes" ; then
3505    case "$pvrdma" in
3506    "")
3507        if compile_prog "" ""; then
3508            pvrdma="yes"
3509        else
3510            pvrdma="no"
3511        fi
3512        ;;
3513    "yes")
3514        if ! compile_prog "" ""; then
3515            error_exit "PVRDMA is not supported since mremap is not implemented"
3516        fi
3517        pvrdma="yes"
3518        ;;
3519    "no")
3520        pvrdma="no"
3521        ;;
3522    esac
3523else
3524    if test "$pvrdma" = "yes" ; then
3525        error_exit "PVRDMA requires rdma suppport"
3526    fi
3527    pvrdma="no"
3528fi
3529
3530# Let's see if enhanced reg_mr is supported
3531if test "$pvrdma" = "yes" ; then
3532
3533cat > $TMPC <<EOF &&
3534#include <infiniband/verbs.h>
3535
3536int
3537main(void)
3538{
3539    struct ibv_mr *mr;
3540    struct ibv_pd *pd = NULL;
3541    size_t length = 10;
3542    uint64_t iova = 0;
3543    int access = 0;
3544    void *addr = NULL;
3545
3546    mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
3547
3548    ibv_dereg_mr(mr);
3549
3550    return 0;
3551}
3552EOF
3553    if ! compile_prog "" "-libverbs"; then
3554        QEMU_CFLAGS="$QEMU_CFLAGS -DLEGACY_RDMA_REG_MR"
3555    fi
3556fi
3557
3558##########################################
3559# VNC SASL detection
3560if test "$vnc" = "yes" && test "$vnc_sasl" != "no" ; then
3561  cat > $TMPC <<EOF
3562#include <sasl/sasl.h>
3563#include <stdio.h>
3564int main(void) { sasl_server_init(NULL, "qemu"); return 0; }
3565EOF
3566  # Assuming Cyrus-SASL installed in /usr prefix
3567  # QEMU defines struct iovec in "qemu/osdep.h",
3568  # we don't want libsasl to redefine it in <sasl/sasl.h>.
3569  vnc_sasl_cflags="-DSTRUCT_IOVEC_DEFINED"
3570  vnc_sasl_libs="-lsasl2"
3571  if compile_prog "$vnc_sasl_cflags" "$vnc_sasl_libs" ; then
3572    vnc_sasl=yes
3573    libs_softmmu="$vnc_sasl_libs $libs_softmmu"
3574    QEMU_CFLAGS="$QEMU_CFLAGS $vnc_sasl_cflags"
3575  else
3576    if test "$vnc_sasl" = "yes" ; then
3577      feature_not_found "vnc-sasl" "Install Cyrus SASL devel"
3578    fi
3579    vnc_sasl=no
3580  fi
3581fi
3582
3583##########################################
3584# VNC JPEG detection
3585if test "$vnc" = "yes" && test "$vnc_jpeg" != "no" ; then
3586cat > $TMPC <<EOF
3587#include <stdio.h>
3588#include <jpeglib.h>
3589int main(void) { struct jpeg_compress_struct s; jpeg_create_compress(&s); return 0; }
3590EOF
3591    vnc_jpeg_cflags=""
3592    vnc_jpeg_libs="-ljpeg"
3593  if compile_prog "$vnc_jpeg_cflags" "$vnc_jpeg_libs" ; then
3594    vnc_jpeg=yes
3595    libs_softmmu="$vnc_jpeg_libs $libs_softmmu"
3596    QEMU_CFLAGS="$QEMU_CFLAGS $vnc_jpeg_cflags"
3597  else
3598    if test "$vnc_jpeg" = "yes" ; then
3599      feature_not_found "vnc-jpeg" "Install libjpeg-turbo devel"
3600    fi
3601    vnc_jpeg=no
3602  fi
3603fi
3604
3605##########################################
3606# VNC PNG detection
3607if test "$vnc" = "yes" && test "$vnc_png" != "no" ; then
3608cat > $TMPC <<EOF
3609//#include <stdio.h>
3610#include <png.h>
3611#include <stddef.h>
3612int main(void) {
3613    png_structp png_ptr;
3614    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
3615    return png_ptr != 0;
3616}
3617EOF
3618  if $pkg_config libpng --exists; then
3619    vnc_png_cflags=$($pkg_config libpng --cflags)
3620    vnc_png_libs=$($pkg_config libpng --libs)
3621  else
3622    vnc_png_cflags=""
3623    vnc_png_libs="-lpng"
3624  fi
3625  if compile_prog "$vnc_png_cflags" "$vnc_png_libs" ; then
3626    vnc_png=yes
3627    libs_softmmu="$vnc_png_libs $libs_softmmu"
3628    QEMU_CFLAGS="$QEMU_CFLAGS $vnc_png_cflags"
3629  else
3630    if test "$vnc_png" = "yes" ; then
3631      feature_not_found "vnc-png" "Install libpng devel"
3632    fi
3633    vnc_png=no
3634  fi
3635fi
3636
3637##########################################
3638# xkbcommon probe
3639if test "$xkbcommon" != "no" ; then
3640  if $pkg_config xkbcommon --exists; then
3641    xkbcommon_cflags=$($pkg_config xkbcommon --cflags)
3642    xkbcommon_libs=$($pkg_config xkbcommon --libs)
3643    xkbcommon=yes
3644  else
3645    if test "$xkbcommon" = "yes" ; then
3646      feature_not_found "xkbcommon" "Install libxkbcommon-devel"
3647    fi
3648    xkbcommon=no
3649  fi
3650fi
3651
3652
3653##########################################
3654# xfsctl() probe, used for file-posix.c
3655if test "$xfs" != "no" ; then
3656  cat > $TMPC << EOF
3657#include <stddef.h>  /* NULL */
3658#include <xfs/xfs.h>
3659int main(void)
3660{
3661    xfsctl(NULL, 0, 0, NULL);
3662    return 0;
3663}
3664EOF
3665  if compile_prog "" "" ; then
3666    xfs="yes"
3667  else
3668    if test "$xfs" = "yes" ; then
3669      feature_not_found "xfs" "Instal xfsprogs/xfslibs devel"
3670    fi
3671    xfs=no
3672  fi
3673fi
3674
3675##########################################
3676# vde libraries probe
3677if test "$vde" != "no" ; then
3678  vde_libs="-lvdeplug"
3679  cat > $TMPC << EOF
3680#include <libvdeplug.h>
3681int main(void)
3682{
3683    struct vde_open_args a = {0, 0, 0};
3684    char s[] = "";
3685    vde_open(s, s, &a);
3686    return 0;
3687}
3688EOF
3689  if compile_prog "" "$vde_libs" ; then
3690    vde=yes
3691  else
3692    if test "$vde" = "yes" ; then
3693      feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
3694    fi
3695    vde=no
3696  fi
3697fi
3698
3699##########################################
3700# netmap support probe
3701# Apart from looking for netmap headers, we make sure that the host API version
3702# supports the netmap backend (>=11). The upper bound (15) is meant to simulate
3703# a minor/major version number. Minor new features will be marked with values up
3704# to 15, and if something happens that requires a change to the backend we will
3705# move above 15, submit the backend fixes and modify this two bounds.
3706if test "$netmap" != "no" ; then
3707  cat > $TMPC << EOF
3708#include <inttypes.h>
3709#include <net/if.h>
3710#include <net/netmap.h>
3711#include <net/netmap_user.h>
3712#if (NETMAP_API < 11) || (NETMAP_API > 15)
3713#error
3714#endif
3715int main(void) { return 0; }
3716EOF
3717  if compile_prog "" "" ; then
3718    netmap=yes
3719  else
3720    if test "$netmap" = "yes" ; then
3721      feature_not_found "netmap"
3722    fi
3723    netmap=no
3724  fi
3725fi
3726
3727##########################################
3728# libcap-ng library probe
3729if test "$cap_ng" != "no" ; then
3730  cap_libs="-lcap-ng"
3731  cat > $TMPC << EOF
3732#include <cap-ng.h>
3733int main(void)
3734{
3735    capng_capability_to_name(CAPNG_EFFECTIVE);
3736    return 0;
3737}
3738EOF
3739  if compile_prog "" "$cap_libs" ; then
3740    cap_ng=yes
3741  else
3742    if test "$cap_ng" = "yes" ; then
3743      feature_not_found "cap_ng" "Install libcap-ng devel"
3744    fi
3745    cap_ng=no
3746  fi
3747fi
3748
3749##########################################
3750# Sound support libraries probe
3751
3752audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
3753for drv in $audio_drv_list; do
3754    case $drv in
3755    alsa | try-alsa)
3756    if $pkg_config alsa --exists; then
3757        alsa_libs=$($pkg_config alsa --libs)
3758        alsa_cflags=$($pkg_config alsa --cflags)
3759        alsa=yes
3760        if test "$drv" = "try-alsa"; then
3761            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa/alsa/')
3762        fi
3763    else
3764        if test "$drv" = "try-alsa"; then
3765            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa//')
3766        else
3767            error_exit "$drv check failed" \
3768                "Make sure to have the $drv libs and headers installed."
3769        fi
3770    fi
3771    ;;
3772
3773    pa | try-pa)
3774    if $pkg_config libpulse --exists; then
3775        libpulse=yes
3776        pulse_libs=$($pkg_config libpulse --libs)
3777        pulse_cflags=$($pkg_config libpulse --cflags)
3778        if test "$drv" = "try-pa"; then
3779            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa/pa/')
3780        fi
3781    else
3782        if test "$drv" = "try-pa"; then
3783            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa//')
3784        else
3785            error_exit "$drv check failed" \
3786                "Make sure to have the $drv libs and headers installed."
3787        fi
3788    fi
3789    ;;
3790
3791    sdl)
3792    if test "$sdl" = "no"; then
3793        error_exit "sdl not found or disabled, can not use sdl audio driver"
3794    fi
3795    ;;
3796
3797    try-sdl)
3798    if test "$sdl" = "no"; then
3799        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl//')
3800    else
3801        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl/sdl/')
3802    fi
3803    ;;
3804
3805    coreaudio)
3806      coreaudio_libs="-framework CoreAudio"
3807    ;;
3808
3809    dsound)
3810      dsound_libs="-lole32 -ldxguid"
3811      audio_win_int="yes"
3812    ;;
3813
3814    oss)
3815      oss_libs="$oss_lib"
3816    ;;
3817
3818    jack | try-jack)
3819    if $pkg_config jack --exists; then
3820        libjack=yes
3821        jack_libs=$($pkg_config jack --libs)
3822        if test "$drv" = "try-jack"; then
3823            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack/jack/')
3824        fi
3825    else
3826        if test "$drv" = "try-jack"; then
3827            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack//')
3828        else
3829            error_exit "$drv check failed" \
3830                "Make sure to have the $drv libs and headers installed."
3831        fi
3832    fi
3833    ;;
3834
3835    *)
3836    echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
3837        error_exit "Unknown driver '$drv' selected" \
3838            "Possible drivers are: $audio_possible_drivers"
3839    }
3840    ;;
3841    esac
3842done
3843
3844##########################################
3845# BrlAPI probe
3846
3847if test "$brlapi" != "no" ; then
3848  brlapi_libs="-lbrlapi"
3849  cat > $TMPC << EOF
3850#include <brlapi.h>
3851#include <stddef.h>
3852int main( void ) { return brlapi__openConnection (NULL, NULL, NULL); }
3853EOF
3854  if compile_prog "" "$brlapi_libs" ; then
3855    brlapi=yes
3856  else
3857    if test "$brlapi" = "yes" ; then
3858      feature_not_found "brlapi" "Install brlapi devel"
3859    fi
3860    brlapi=no
3861  fi
3862fi
3863
3864##########################################
3865# iconv probe
3866if test "$iconv" != "no" ; then
3867  cat > $TMPC << EOF
3868#include <iconv.h>
3869int main(void) {
3870  iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
3871  return conv != (iconv_t) -1;
3872}
3873EOF
3874  iconv_prefix_list="/usr/local:/usr"
3875  iconv_lib_list=":-liconv"
3876  IFS=:
3877  for iconv_prefix in $iconv_prefix_list; do
3878    IFS=:
3879    iconv_cflags="-I$iconv_prefix/include"
3880    iconv_ldflags="-L$iconv_prefix/lib"
3881    for iconv_link in $iconv_lib_list; do
3882      unset IFS
3883      iconv_lib="$iconv_ldflags $iconv_link"
3884      echo "looking at iconv in '$iconv_cflags' '$iconv_lib'" >> config.log
3885      if compile_prog "$iconv_cflags" "$iconv_lib" ; then
3886        iconv_found=yes
3887        break
3888      fi
3889    done
3890    if test "$iconv_found" = yes ; then
3891      break
3892    fi
3893  done
3894  if test "$iconv_found" = "yes" ; then
3895    iconv=yes
3896  else
3897    if test "$iconv" = "yes" ; then
3898      feature_not_found "iconv" "Install iconv devel"
3899    fi
3900    iconv=no
3901  fi
3902fi
3903
3904##########################################
3905# curses probe
3906if test "$iconv" = "no" ; then
3907  # curses will need iconv
3908  curses=no
3909fi
3910if test "$curses" != "no" ; then
3911  if test "$mingw32" = "yes" ; then
3912    curses_inc_list="$($pkg_config --cflags ncurses 2>/dev/null):"
3913    curses_lib_list="$($pkg_config --libs ncurses 2>/dev/null):-lpdcurses"
3914  else
3915    curses_inc_list="$($pkg_config --cflags ncursesw 2>/dev/null):-I/usr/include/ncursesw:"
3916    curses_lib_list="$($pkg_config --libs ncursesw 2>/dev/null):-lncursesw:-lcursesw"
3917  fi
3918  curses_found=no
3919  cat > $TMPC << EOF
3920#include <locale.h>
3921#include <curses.h>
3922#include <wchar.h>
3923#include <langinfo.h>
3924int main(void) {
3925  const char *codeset;
3926  wchar_t wch = L'w';
3927  setlocale(LC_ALL, "");
3928  resize_term(0, 0);
3929  addwstr(L"wide chars\n");
3930  addnwstr(&wch, 1);
3931  add_wch(WACS_DEGREE);
3932  codeset = nl_langinfo(CODESET);
3933  return codeset != 0;
3934}
3935EOF
3936  IFS=:
3937  for curses_inc in $curses_inc_list; do
3938    # Make sure we get the wide character prototypes
3939    curses_inc="-DNCURSES_WIDECHAR $curses_inc"
3940    IFS=:
3941    for curses_lib in $curses_lib_list; do
3942      unset IFS
3943      if compile_prog "$curses_inc" "$curses_lib" ; then
3944        curses_found=yes
3945        break
3946      fi
3947    done
3948    if test "$curses_found" = yes ; then
3949      break
3950    fi
3951  done
3952  unset IFS
3953  if test "$curses_found" = "yes" ; then
3954    curses=yes
3955  else
3956    if test "$curses" = "yes" ; then
3957      feature_not_found "curses" "Install ncurses devel"
3958    fi
3959    curses=no
3960  fi
3961fi
3962
3963##########################################
3964# curl probe
3965if test "$curl" != "no" ; then
3966  if $pkg_config libcurl --exists; then
3967    curlconfig="$pkg_config libcurl"
3968  else
3969    curlconfig=curl-config
3970  fi
3971  cat > $TMPC << EOF
3972#include <curl/curl.h>
3973int main(void) { curl_easy_init(); curl_multi_setopt(0, 0, 0); return 0; }
3974EOF
3975  curl_cflags=$($curlconfig --cflags 2>/dev/null)
3976  curl_libs=$($curlconfig --libs 2>/dev/null)
3977  if compile_prog "$curl_cflags" "$curl_libs" ; then
3978    curl=yes
3979  else
3980    if test "$curl" = "yes" ; then
3981      feature_not_found "curl" "Install libcurl devel"
3982    fi
3983    curl=no
3984  fi
3985fi # test "$curl"
3986
3987##########################################
3988# glib support probe
3989
3990glib_req_ver=2.48
3991glib_modules=gthread-2.0
3992if test "$modules" = yes; then
3993    glib_modules="$glib_modules gmodule-export-2.0"
3994fi
3995if test "$plugins" = yes; then
3996    glib_modules="$glib_modules gmodule-2.0"
3997fi
3998
3999# This workaround is required due to a bug in pkg-config file for glib as it
4000# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
4001
4002if test "$static" = yes && test "$mingw32" = yes; then
4003    QEMU_CFLAGS="-DGLIB_STATIC_COMPILATION $QEMU_CFLAGS"
4004fi
4005
4006for i in $glib_modules; do
4007    if $pkg_config --atleast-version=$glib_req_ver $i; then
4008        glib_cflags=$($pkg_config --cflags $i)
4009        glib_libs=$($pkg_config --libs $i)
4010        QEMU_CFLAGS="$glib_cflags $QEMU_CFLAGS"
4011        LIBS="$glib_libs $LIBS"
4012    else
4013        error_exit "glib-$glib_req_ver $i is required to compile QEMU"
4014    fi
4015done
4016
4017if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
4018    gio=yes
4019    gio_cflags=$($pkg_config --cflags gio-2.0)
4020    gio_libs=$($pkg_config --libs gio-2.0)
4021    gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
4022    if [ ! -x "$gdbus_codegen" ]; then
4023        gdbus_codegen=
4024    fi
4025else
4026    gio=no
4027fi
4028
4029if $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
4030    gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
4031    gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
4032fi
4033
4034# Sanity check that the current size_t matches the
4035# size that glib thinks it should be. This catches
4036# problems on multi-arch where people try to build
4037# 32-bit QEMU while pointing at 64-bit glib headers
4038cat > $TMPC <<EOF
4039#include <glib.h>
4040#include <unistd.h>
4041
4042#define QEMU_BUILD_BUG_ON(x) \
4043  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
4044
4045int main(void) {
4046   QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
4047   return 0;
4048}
4049EOF
4050
4051if ! compile_prog "$CFLAGS" "$LIBS" ; then
4052    error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
4053               "You probably need to set PKG_CONFIG_LIBDIR"\
4054	       "to point to the right pkg-config files for your"\
4055	       "build target"
4056fi
4057
4058# Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
4059cat > $TMPC << EOF
4060#include <glib.h>
4061int main(void) { return 0; }
4062EOF
4063if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
4064    if cc_has_warning_flag "-Wno-unknown-attributes"; then
4065        glib_cflags="-Wno-unknown-attributes $glib_cflags"
4066        QEMU_CFLAGS="-Wno-unknown-attributes $CFLAGS"
4067    fi
4068fi
4069
4070# Silence clang warnings triggered by glib < 2.57.2
4071cat > $TMPC << EOF
4072#include <glib.h>
4073typedef struct Foo {
4074    int i;
4075} Foo;
4076static void foo_free(Foo *f)
4077{
4078    g_free(f);
4079}
4080G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free);
4081int main(void) { return 0; }
4082EOF
4083if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
4084    if cc_has_warning_flag "-Wno-unused-function"; then
4085        glib_cflags="$glib_cflags -Wno-unused-function"
4086        CFLAGS="$CFLAGS -Wno-unused-function"
4087    fi
4088fi
4089
4090#########################################
4091# zlib check
4092
4093if test "$zlib" != "no" ; then
4094    if $pkg_config --exists zlib; then
4095        zlib_cflags=$($pkg_config --cflags zlib)
4096        zlib_libs=$($pkg_config --libs zlib)
4097        QEMU_CFLAGS="$zlib_cflags $QEMU_CFLAGS"
4098        LIBS="$zlib_libs $LIBS"
4099    else
4100        cat > $TMPC << EOF
4101#include <zlib.h>
4102int main(void) { zlibVersion(); return 0; }
4103EOF
4104        if compile_prog "" "-lz" ; then
4105            zlib_libs=-lz
4106            LIBS="$LIBS $zlib_libs"
4107        else
4108            error_exit "zlib check failed" \
4109                "Make sure to have the zlib libs and headers installed."
4110        fi
4111    fi
4112fi
4113
4114##########################################
4115# SHA command probe for modules
4116if test "$modules" = yes; then
4117    shacmd_probe="sha1sum sha1 shasum"
4118    for c in $shacmd_probe; do
4119        if has $c; then
4120            shacmd="$c"
4121            break
4122        fi
4123    done
4124    if test "$shacmd" = ""; then
4125        error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
4126    fi
4127fi
4128
4129##########################################
4130# pixman support probe
4131
4132if test "$softmmu" = "no"; then
4133  pixman_cflags=
4134  pixman_libs=
4135elif $pkg_config --atleast-version=0.21.8 pixman-1 > /dev/null 2>&1; then
4136  pixman_cflags=$($pkg_config --cflags pixman-1)
4137  pixman_libs=$($pkg_config --libs pixman-1)
4138else
4139  error_exit "pixman >= 0.21.8 not present." \
4140      "Please install the pixman devel package."
4141fi
4142
4143##########################################
4144# libmpathpersist probe
4145
4146if test "$mpath" != "no" ; then
4147  # probe for the new API
4148  cat > $TMPC <<EOF
4149#include <libudev.h>
4150#include <mpath_persist.h>
4151unsigned mpath_mx_alloc_len = 1024;
4152int logsink;
4153static struct config *multipath_conf;
4154extern struct udev *udev;
4155extern struct config *get_multipath_config(void);
4156extern void put_multipath_config(struct config *conf);
4157struct udev *udev;
4158struct config *get_multipath_config(void) { return multipath_conf; }
4159void put_multipath_config(struct config *conf) { }
4160
4161int main(void) {
4162    udev = udev_new();
4163    multipath_conf = mpath_lib_init();
4164    return 0;
4165}
4166EOF
4167  if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
4168    mpathpersist=yes
4169    mpathpersist_new_api=yes
4170  else
4171    # probe for the old API
4172    cat > $TMPC <<EOF
4173#include <libudev.h>
4174#include <mpath_persist.h>
4175unsigned mpath_mx_alloc_len = 1024;
4176int logsink;
4177int main(void) {
4178    struct udev *udev = udev_new();
4179    mpath_lib_init(udev);
4180    return 0;
4181}
4182EOF
4183    if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
4184      mpathpersist=yes
4185      mpathpersist_new_api=no
4186    else
4187      mpathpersist=no
4188    fi
4189  fi
4190else
4191  mpathpersist=no
4192fi
4193
4194##########################################
4195# pthread probe
4196PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
4197
4198pthread=no
4199cat > $TMPC << EOF
4200#include <pthread.h>
4201static void *f(void *p) { return NULL; }
4202int main(void) {
4203  pthread_t thread;
4204  pthread_create(&thread, 0, f, 0);
4205  return 0;
4206}
4207EOF
4208if compile_prog "" "" ; then
4209  pthread=yes
4210else
4211  for pthread_lib in $PTHREADLIBS_LIST; do
4212    if compile_prog "" "$pthread_lib" ; then
4213      pthread=yes
4214      found=no
4215      for lib_entry in $LIBS; do
4216        if test "$lib_entry" = "$pthread_lib"; then
4217          found=yes
4218          break
4219        fi
4220      done
4221      if test "$found" = "no"; then
4222        LIBS="$pthread_lib $LIBS"
4223      fi
4224      PTHREAD_LIB="$pthread_lib"
4225      break
4226    fi
4227  done
4228fi
4229
4230if test "$mingw32" != yes && test "$pthread" = no; then
4231  error_exit "pthread check failed" \
4232      "Make sure to have the pthread libs and headers installed."
4233fi
4234
4235# check for pthread_setname_np with thread id
4236pthread_setname_np_w_tid=no
4237cat > $TMPC << EOF
4238#include <pthread.h>
4239
4240static void *f(void *p) { return NULL; }
4241int main(void)
4242{
4243    pthread_t thread;
4244    pthread_create(&thread, 0, f, 0);
4245    pthread_setname_np(thread, "QEMU");
4246    return 0;
4247}
4248EOF
4249if compile_prog "" "$pthread_lib" ; then
4250  pthread_setname_np_w_tid=yes
4251fi
4252
4253# check for pthread_setname_np without thread id
4254pthread_setname_np_wo_tid=no
4255cat > $TMPC << EOF
4256#include <pthread.h>
4257
4258static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
4259int main(void)
4260{
4261    pthread_t thread;
4262    pthread_create(&thread, 0, f, 0);
4263    return 0;
4264}
4265EOF
4266if compile_prog "" "$pthread_lib" ; then
4267  pthread_setname_np_wo_tid=yes
4268fi
4269
4270##########################################
4271# rbd probe
4272if test "$rbd" != "no" ; then
4273  cat > $TMPC <<EOF
4274#include <stdio.h>
4275#include <rbd/librbd.h>
4276int main(void) {
4277    rados_t cluster;
4278    rados_create(&cluster, NULL);
4279    return 0;
4280}
4281EOF
4282  rbd_libs="-lrbd -lrados"
4283  if compile_prog "" "$rbd_libs" ; then
4284    rbd=yes
4285  else
4286    if test "$rbd" = "yes" ; then
4287      feature_not_found "rados block device" "Install librbd/ceph devel"
4288    fi
4289    rbd=no
4290  fi
4291fi
4292
4293##########################################
4294# libssh probe
4295if test "$libssh" != "no" ; then
4296  if $pkg_config --exists libssh; then
4297    libssh_cflags=$($pkg_config libssh --cflags)
4298    libssh_libs=$($pkg_config libssh --libs)
4299    libssh=yes
4300  else
4301    if test "$libssh" = "yes" ; then
4302      error_exit "libssh required for --enable-libssh"
4303    fi
4304    libssh=no
4305  fi
4306fi
4307
4308##########################################
4309# Check for libssh 0.8
4310# This is done like this instead of using the LIBSSH_VERSION_* and
4311# SSH_VERSION_* macros because some distributions in the past shipped
4312# snapshots of the future 0.8 from Git, and those snapshots did not
4313# have updated version numbers (still referring to 0.7.0).
4314
4315if test "$libssh" = "yes"; then
4316  cat > $TMPC <<EOF
4317#include <libssh/libssh.h>
4318int main(void) { return ssh_get_server_publickey(NULL, NULL); }
4319EOF
4320  if compile_prog "$libssh_cflags" "$libssh_libs"; then
4321    libssh_cflags="-DHAVE_LIBSSH_0_8 $libssh_cflags"
4322  fi
4323fi
4324
4325##########################################
4326# linux-aio probe
4327
4328if test "$linux_aio" != "no" ; then
4329  cat > $TMPC <<EOF
4330#include <libaio.h>
4331#include <sys/eventfd.h>
4332#include <stddef.h>
4333int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
4334EOF
4335  if compile_prog "" "-laio" ; then
4336    linux_aio=yes
4337  else
4338    if test "$linux_aio" = "yes" ; then
4339      feature_not_found "linux AIO" "Install libaio devel"
4340    fi
4341    linux_aio=no
4342  fi
4343fi
4344##########################################
4345# linux-io-uring probe
4346
4347if test "$linux_io_uring" != "no" ; then
4348  if $pkg_config liburing; then
4349    linux_io_uring_cflags=$($pkg_config --cflags liburing)
4350    linux_io_uring_libs=$($pkg_config --libs liburing)
4351    linux_io_uring=yes
4352
4353    # io_uring is used in libqemuutil.a where per-file -libs variables are not
4354    # seen by programs linking the archive.  It's not ideal, but just add the
4355    # library dependency globally.
4356    LIBS="$linux_io_uring_libs $LIBS"
4357  else
4358    if test "$linux_io_uring" = "yes" ; then
4359      feature_not_found "linux io_uring" "Install liburing devel"
4360    fi
4361    linux_io_uring=no
4362  fi
4363fi
4364
4365##########################################
4366# TPM emulation is only on POSIX
4367
4368if test "$tpm" = ""; then
4369  if test "$mingw32" = "yes"; then
4370    tpm=no
4371  else
4372    tpm=yes
4373  fi
4374elif test "$tpm" = "yes"; then
4375  if test "$mingw32" = "yes" ; then
4376    error_exit "TPM emulation only available on POSIX systems"
4377  fi
4378fi
4379
4380##########################################
4381# attr probe
4382
4383libattr_libs=
4384if test "$attr" != "no" ; then
4385  cat > $TMPC <<EOF
4386#include <stdio.h>
4387#include <sys/types.h>
4388#ifdef CONFIG_LIBATTR
4389#include <attr/xattr.h>
4390#else
4391#include <sys/xattr.h>
4392#endif
4393int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }
4394EOF
4395  if compile_prog "" "" ; then
4396    attr=yes
4397  # Older distros have <attr/xattr.h>, and need -lattr:
4398  elif compile_prog "-DCONFIG_LIBATTR" "-lattr" ; then
4399    attr=yes
4400    libattr_libs="-lattr"
4401    LIBS="$libattr_libs $LIBS"
4402    libattr=yes
4403  else
4404    if test "$attr" = "yes" ; then
4405      feature_not_found "ATTR" "Install libc6 or libattr devel"
4406    fi
4407    attr=no
4408  fi
4409fi
4410
4411##########################################
4412# iovec probe
4413cat > $TMPC <<EOF
4414#include <sys/types.h>
4415#include <sys/uio.h>
4416#include <unistd.h>
4417int main(void) { return sizeof(struct iovec); }
4418EOF
4419iovec=no
4420if compile_prog "" "" ; then
4421  iovec=yes
4422fi
4423
4424##########################################
4425# preadv probe
4426cat > $TMPC <<EOF
4427#include <sys/types.h>
4428#include <sys/uio.h>
4429#include <unistd.h>
4430int main(void) { return preadv(0, 0, 0, 0); }
4431EOF
4432preadv=no
4433if compile_prog "" "" ; then
4434  preadv=yes
4435fi
4436
4437##########################################
4438# fdt probe
4439# fdt support is mandatory for at least some target architectures,
4440# so insist on it if we're building those system emulators.
4441fdt_required=no
4442for target in $target_list; do
4443  case $target in
4444    aarch64*-softmmu|arm*-softmmu|ppc*-softmmu|microblaze*-softmmu|mips64el-softmmu|riscv*-softmmu|rx-softmmu)
4445      fdt_required=yes
4446    ;;
4447  esac
4448done
4449
4450if test "$fdt_required" = "yes"; then
4451  if test "$fdt" = "no"; then
4452    error_exit "fdt disabled but some requested targets require it." \
4453      "You can turn off fdt only if you also disable all the system emulation" \
4454      "targets which need it (by specifying a cut down --target-list)."
4455  fi
4456  fdt=yes
4457elif test "$fdt" != "yes" ; then
4458  fdt=no
4459fi
4460
4461# fdt is only required when building softmmu targets
4462if test -z "$fdt" -a "$softmmu" != "yes" ; then
4463    fdt="no"
4464fi
4465
4466if test "$fdt" != "no" ; then
4467  fdt_libs="-lfdt"
4468  # explicitly check for libfdt_env.h as it is missing in some stable installs
4469  # and test for required functions to make sure we are on a version >= 1.4.2
4470  cat > $TMPC << EOF
4471#include <libfdt.h>
4472#include <libfdt_env.h>
4473int main(void) { fdt_check_full(NULL, 0); return 0; }
4474EOF
4475  if compile_prog "" "$fdt_libs" ; then
4476    # system DTC is good - use it
4477    fdt=system
4478  else
4479      # have GIT checkout, so activate dtc submodule
4480      if test -e "${source_path}/.git" ; then
4481          git_submodules="${git_submodules} dtc"
4482      fi
4483      if test -d "${source_path}/dtc/libfdt" || test -e "${source_path}/.git" ; then
4484          fdt=git
4485          mkdir -p dtc
4486          if [ "$pwd_is_source_path" != "y" ] ; then
4487              symlink "$source_path/dtc/Makefile" "dtc/Makefile"
4488          fi
4489          fdt_cflags="-I${source_path}/dtc/libfdt"
4490          fdt_ldflags="-L$PWD/dtc/libfdt"
4491          fdt_libs="$fdt_libs"
4492      elif test "$fdt" = "yes" ; then
4493          # Not a git build & no libfdt found, prompt for system install
4494          error_exit "DTC (libfdt) version >= 1.4.2 not present." \
4495                     "Please install the DTC (libfdt) devel package"
4496      else
4497          # don't have and don't want
4498          fdt_libs=
4499          fdt=no
4500      fi
4501  fi
4502fi
4503
4504libs_softmmu="$libs_softmmu $fdt_libs"
4505
4506##########################################
4507# opengl probe (for sdl2, gtk, milkymist-tmu2)
4508
4509gbm="no"
4510if $pkg_config gbm; then
4511    gbm_cflags="$($pkg_config --cflags gbm)"
4512    gbm_libs="$($pkg_config --libs gbm)"
4513    gbm="yes"
4514fi
4515
4516if test "$opengl" != "no" ; then
4517  opengl_pkgs="epoxy gbm"
4518  if $pkg_config $opengl_pkgs; then
4519    opengl_cflags="$($pkg_config --cflags $opengl_pkgs)"
4520    opengl_libs="$($pkg_config --libs $opengl_pkgs)"
4521    opengl=yes
4522    if test "$gtk" = "yes" && $pkg_config --exists "$gtkpackage >= 3.16"; then
4523        gtk_gl="yes"
4524    fi
4525    QEMU_CFLAGS="$QEMU_CFLAGS $opengl_cflags"
4526  else
4527    if test "$opengl" = "yes" ; then
4528      feature_not_found "opengl" "Please install opengl (mesa) devel pkgs: $opengl_pkgs"
4529    fi
4530    opengl_cflags=""
4531    opengl_libs=""
4532    opengl=no
4533  fi
4534fi
4535
4536if test "$opengl" = "yes"; then
4537  cat > $TMPC << EOF
4538#include <epoxy/egl.h>
4539#ifndef EGL_MESA_image_dma_buf_export
4540# error mesa/epoxy lacks support for dmabufs (mesa 10.6+)
4541#endif
4542int main(void) { return 0; }
4543EOF
4544  if compile_prog "" "" ; then
4545    opengl_dmabuf=yes
4546  fi
4547fi
4548
4549if test "$opengl" = "yes" && test "$have_x11" = "yes"; then
4550  for target in $target_list; do
4551    case $target in
4552      lm32-softmmu) # milkymist-tmu2 requires X11 and OpenGL
4553        need_x11=yes
4554      ;;
4555    esac
4556  done
4557fi
4558
4559##########################################
4560# libxml2 probe
4561if test "$libxml2" != "no" ; then
4562    if $pkg_config --exists libxml-2.0; then
4563        libxml2="yes"
4564        libxml2_cflags=$($pkg_config --cflags libxml-2.0)
4565        libxml2_libs=$($pkg_config --libs libxml-2.0)
4566    else
4567        if test "$libxml2" = "yes"; then
4568            feature_not_found "libxml2" "Install libxml2 devel"
4569        fi
4570        libxml2="no"
4571    fi
4572fi
4573
4574##########################################
4575# glusterfs probe
4576if test "$glusterfs" != "no" ; then
4577  if $pkg_config --atleast-version=3 glusterfs-api; then
4578    glusterfs="yes"
4579    glusterfs_cflags=$($pkg_config --cflags glusterfs-api)
4580    glusterfs_libs=$($pkg_config --libs glusterfs-api)
4581    if $pkg_config --atleast-version=4 glusterfs-api; then
4582      glusterfs_xlator_opt="yes"
4583    fi
4584    if $pkg_config --atleast-version=5 glusterfs-api; then
4585      glusterfs_discard="yes"
4586    fi
4587    if $pkg_config --atleast-version=6 glusterfs-api; then
4588      glusterfs_fallocate="yes"
4589      glusterfs_zerofill="yes"
4590    fi
4591    cat > $TMPC << EOF
4592#include <glusterfs/api/glfs.h>
4593
4594int
4595main(void)
4596{
4597	/* new glfs_ftruncate() passes two additional args */
4598	return glfs_ftruncate(NULL, 0, NULL, NULL);
4599}
4600EOF
4601    if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
4602      glusterfs_ftruncate_has_stat="yes"
4603    fi
4604    cat > $TMPC << EOF
4605#include <glusterfs/api/glfs.h>
4606
4607/* new glfs_io_cbk() passes two additional glfs_stat structs */
4608static void
4609glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
4610{}
4611
4612int
4613main(void)
4614{
4615	glfs_io_cbk iocb = &glusterfs_iocb;
4616	iocb(NULL, 0 , NULL, NULL, NULL);
4617	return 0;
4618}
4619EOF
4620    if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
4621      glusterfs_iocb_has_stat="yes"
4622    fi
4623  else
4624    if test "$glusterfs" = "yes" ; then
4625      feature_not_found "GlusterFS backend support" \
4626          "Install glusterfs-api devel >= 3"
4627    fi
4628    glusterfs="no"
4629  fi
4630fi
4631
4632# Check for inotify functions when we are building linux-user
4633# emulator.  This is done because older glibc versions don't
4634# have syscall stubs for these implemented.  In that case we
4635# don't provide them even if kernel supports them.
4636#
4637inotify=no
4638cat > $TMPC << EOF
4639#include <sys/inotify.h>
4640
4641int
4642main(void)
4643{
4644	/* try to start inotify */
4645	return inotify_init();
4646}
4647EOF
4648if compile_prog "" "" ; then
4649  inotify=yes
4650fi
4651
4652inotify1=no
4653cat > $TMPC << EOF
4654#include <sys/inotify.h>
4655
4656int
4657main(void)
4658{
4659    /* try to start inotify */
4660    return inotify_init1(0);
4661}
4662EOF
4663if compile_prog "" "" ; then
4664  inotify1=yes
4665fi
4666
4667# check if pipe2 is there
4668pipe2=no
4669cat > $TMPC << EOF
4670#include <unistd.h>
4671#include <fcntl.h>
4672
4673int main(void)
4674{
4675    int pipefd[2];
4676    return pipe2(pipefd, O_CLOEXEC);
4677}
4678EOF
4679if compile_prog "" "" ; then
4680  pipe2=yes
4681fi
4682
4683# check if accept4 is there
4684accept4=no
4685cat > $TMPC << EOF
4686#include <sys/socket.h>
4687#include <stddef.h>
4688
4689int main(void)
4690{
4691    accept4(0, NULL, NULL, SOCK_CLOEXEC);
4692    return 0;
4693}
4694EOF
4695if compile_prog "" "" ; then
4696  accept4=yes
4697fi
4698
4699# check if tee/splice is there. vmsplice was added same time.
4700splice=no
4701cat > $TMPC << EOF
4702#include <unistd.h>
4703#include <fcntl.h>
4704#include <limits.h>
4705
4706int main(void)
4707{
4708    int len, fd = 0;
4709    len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
4710    splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
4711    return 0;
4712}
4713EOF
4714if compile_prog "" "" ; then
4715  splice=yes
4716fi
4717
4718##########################################
4719# libnuma probe
4720
4721if test "$numa" != "no" ; then
4722  cat > $TMPC << EOF
4723#include <numa.h>
4724int main(void) { return numa_available(); }
4725EOF
4726
4727  if compile_prog "" "-lnuma" ; then
4728    numa=yes
4729    libs_softmmu="-lnuma $libs_softmmu"
4730    numa_libs="-lnuma"
4731  else
4732    if test "$numa" = "yes" ; then
4733      feature_not_found "numa" "install numactl devel"
4734    fi
4735    numa=no
4736  fi
4737fi
4738
4739if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
4740    echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
4741    exit 1
4742fi
4743
4744# Even if malloc_trim() is available, these non-libc memory allocators
4745# do not support it.
4746if test "$tcmalloc" = "yes" || test "$jemalloc" = "yes" ; then
4747    if test "$malloc_trim" = "yes" ; then
4748        echo "Disabling malloc_trim with non-libc memory allocator"
4749    fi
4750    malloc_trim="no"
4751fi
4752
4753#######################################
4754# malloc_trim
4755
4756if test "$malloc_trim" != "no" ; then
4757    cat > $TMPC << EOF
4758#include <malloc.h>
4759int main(void) { malloc_trim(0); return 0; }
4760EOF
4761    if compile_prog "" "" ; then
4762        malloc_trim="yes"
4763    else
4764        malloc_trim="no"
4765    fi
4766fi
4767
4768##########################################
4769# tcmalloc probe
4770
4771if test "$tcmalloc" = "yes" ; then
4772  cat > $TMPC << EOF
4773#include <stdlib.h>
4774int main(void) {
4775    void *tmp = malloc(1);
4776    if (tmp != NULL) {
4777        return 0;
4778    }
4779    return 1;
4780}
4781EOF
4782
4783  if compile_prog "" "-ltcmalloc" ; then
4784    LIBS="-ltcmalloc $LIBS"
4785  else
4786    feature_not_found "tcmalloc" "install gperftools devel"
4787  fi
4788fi
4789
4790##########################################
4791# jemalloc probe
4792
4793if test "$jemalloc" = "yes" ; then
4794  cat > $TMPC << EOF
4795#include <stdlib.h>
4796int main(void) {
4797    void *tmp = malloc(1);
4798    if (tmp != NULL) {
4799        return 0;
4800    }
4801    return 1;
4802}
4803EOF
4804
4805  if compile_prog "" "-ljemalloc" ; then
4806    LIBS="-ljemalloc $LIBS"
4807  else
4808    feature_not_found "jemalloc" "install jemalloc devel"
4809  fi
4810fi
4811
4812##########################################
4813# signalfd probe
4814signalfd="no"
4815cat > $TMPC << EOF
4816#include <unistd.h>
4817#include <sys/syscall.h>
4818#include <signal.h>
4819int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }
4820EOF
4821
4822if compile_prog "" "" ; then
4823  signalfd=yes
4824fi
4825
4826# check if optreset global is declared by <getopt.h>
4827optreset="no"
4828cat > $TMPC << EOF
4829#include <getopt.h>
4830int main(void) { return optreset; }
4831EOF
4832
4833if compile_prog "" "" ; then
4834  optreset=yes
4835fi
4836
4837# check if eventfd is supported
4838eventfd=no
4839cat > $TMPC << EOF
4840#include <sys/eventfd.h>
4841
4842int main(void)
4843{
4844    return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
4845}
4846EOF
4847if compile_prog "" "" ; then
4848  eventfd=yes
4849fi
4850
4851# check if memfd is supported
4852memfd=no
4853cat > $TMPC << EOF
4854#include <sys/mman.h>
4855
4856int main(void)
4857{
4858    return memfd_create("foo", MFD_ALLOW_SEALING);
4859}
4860EOF
4861if compile_prog "" "" ; then
4862  memfd=yes
4863fi
4864
4865# check for usbfs
4866have_usbfs=no
4867if test "$linux_user" = "yes"; then
4868  cat > $TMPC << EOF
4869#include <linux/usbdevice_fs.h>
4870
4871#ifndef USBDEVFS_GET_CAPABILITIES
4872#error "USBDEVFS_GET_CAPABILITIES undefined"
4873#endif
4874
4875#ifndef USBDEVFS_DISCONNECT_CLAIM
4876#error "USBDEVFS_DISCONNECT_CLAIM undefined"
4877#endif
4878
4879int main(void)
4880{
4881    return 0;
4882}
4883EOF
4884  if compile_prog "" ""; then
4885    have_usbfs=yes
4886  fi
4887fi
4888
4889# check for fallocate
4890fallocate=no
4891cat > $TMPC << EOF
4892#include <fcntl.h>
4893
4894int main(void)
4895{
4896    fallocate(0, 0, 0, 0);
4897    return 0;
4898}
4899EOF
4900if compile_prog "" "" ; then
4901  fallocate=yes
4902fi
4903
4904# check for fallocate hole punching
4905fallocate_punch_hole=no
4906cat > $TMPC << EOF
4907#include <fcntl.h>
4908#include <linux/falloc.h>
4909
4910int main(void)
4911{
4912    fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
4913    return 0;
4914}
4915EOF
4916if compile_prog "" "" ; then
4917  fallocate_punch_hole=yes
4918fi
4919
4920# check that fallocate supports range zeroing inside the file
4921fallocate_zero_range=no
4922cat > $TMPC << EOF
4923#include <fcntl.h>
4924#include <linux/falloc.h>
4925
4926int main(void)
4927{
4928    fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0);
4929    return 0;
4930}
4931EOF
4932if compile_prog "" "" ; then
4933  fallocate_zero_range=yes
4934fi
4935
4936# check for posix_fallocate
4937posix_fallocate=no
4938cat > $TMPC << EOF
4939#include <fcntl.h>
4940
4941int main(void)
4942{
4943    posix_fallocate(0, 0, 0);
4944    return 0;
4945}
4946EOF
4947if compile_prog "" "" ; then
4948    posix_fallocate=yes
4949fi
4950
4951# check for sync_file_range
4952sync_file_range=no
4953cat > $TMPC << EOF
4954#include <fcntl.h>
4955
4956int main(void)
4957{
4958    sync_file_range(0, 0, 0, 0);
4959    return 0;
4960}
4961EOF
4962if compile_prog "" "" ; then
4963  sync_file_range=yes
4964fi
4965
4966# check for linux/fiemap.h and FS_IOC_FIEMAP
4967fiemap=no
4968cat > $TMPC << EOF
4969#include <sys/ioctl.h>
4970#include <linux/fs.h>
4971#include <linux/fiemap.h>
4972
4973int main(void)
4974{
4975    ioctl(0, FS_IOC_FIEMAP, 0);
4976    return 0;
4977}
4978EOF
4979if compile_prog "" "" ; then
4980  fiemap=yes
4981fi
4982
4983# check for dup3
4984dup3=no
4985cat > $TMPC << EOF
4986#include <unistd.h>
4987
4988int main(void)
4989{
4990    dup3(0, 0, 0);
4991    return 0;
4992}
4993EOF
4994if compile_prog "" "" ; then
4995  dup3=yes
4996fi
4997
4998# check for ppoll support
4999ppoll=no
5000cat > $TMPC << EOF
5001#include <poll.h>
5002
5003int main(void)
5004{
5005    struct pollfd pfd = { .fd = 0, .events = 0, .revents = 0 };
5006    ppoll(&pfd, 1, 0, 0);
5007    return 0;
5008}
5009EOF
5010if compile_prog "" "" ; then
5011  ppoll=yes
5012fi
5013
5014# check for prctl(PR_SET_TIMERSLACK , ... ) support
5015prctl_pr_set_timerslack=no
5016cat > $TMPC << EOF
5017#include <sys/prctl.h>
5018
5019int main(void)
5020{
5021    prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0);
5022    return 0;
5023}
5024EOF
5025if compile_prog "" "" ; then
5026  prctl_pr_set_timerslack=yes
5027fi
5028
5029# check for epoll support
5030epoll=no
5031cat > $TMPC << EOF
5032#include <sys/epoll.h>
5033
5034int main(void)
5035{
5036    epoll_create(0);
5037    return 0;
5038}
5039EOF
5040if compile_prog "" "" ; then
5041  epoll=yes
5042fi
5043
5044# epoll_create1 is a later addition
5045# so we must check separately for its presence
5046epoll_create1=no
5047cat > $TMPC << EOF
5048#include <sys/epoll.h>
5049
5050int main(void)
5051{
5052    /* Note that we use epoll_create1 as a value, not as
5053     * a function being called. This is necessary so that on
5054     * old SPARC glibc versions where the function was present in
5055     * the library but not declared in the header file we will
5056     * fail the configure check. (Otherwise we will get a compiler
5057     * warning but not an error, and will proceed to fail the
5058     * qemu compile where we compile with -Werror.)
5059     */
5060    return (int)(uintptr_t)&epoll_create1;
5061}
5062EOF
5063if compile_prog "" "" ; then
5064  epoll_create1=yes
5065fi
5066
5067# check for sendfile support
5068sendfile=no
5069cat > $TMPC << EOF
5070#include <sys/sendfile.h>
5071
5072int main(void)
5073{
5074    return sendfile(0, 0, 0, 0);
5075}
5076EOF
5077if compile_prog "" "" ; then
5078  sendfile=yes
5079fi
5080
5081# check for timerfd support (glibc 2.8 and newer)
5082timerfd=no
5083cat > $TMPC << EOF
5084#include <sys/timerfd.h>
5085
5086int main(void)
5087{
5088    return(timerfd_create(CLOCK_REALTIME, 0));
5089}
5090EOF
5091if compile_prog "" "" ; then
5092  timerfd=yes
5093fi
5094
5095# check for setns and unshare support
5096setns=no
5097cat > $TMPC << EOF
5098#include <sched.h>
5099
5100int main(void)
5101{
5102    int ret;
5103    ret = setns(0, 0);
5104    ret = unshare(0);
5105    return ret;
5106}
5107EOF
5108if compile_prog "" "" ; then
5109  setns=yes
5110fi
5111
5112# clock_adjtime probe
5113clock_adjtime=no
5114cat > $TMPC <<EOF
5115#include <time.h>
5116
5117int main(void)
5118{
5119    return clock_adjtime(0, 0);
5120}
5121EOF
5122clock_adjtime=no
5123if compile_prog "" "" ; then
5124  clock_adjtime=yes
5125fi
5126
5127# syncfs probe
5128syncfs=no
5129cat > $TMPC <<EOF
5130#include <unistd.h>
5131
5132int main(void)
5133{
5134    return syncfs(0);
5135}
5136EOF
5137syncfs=no
5138if compile_prog "" "" ; then
5139  syncfs=yes
5140fi
5141
5142# check for kcov support (kernel must be 4.4+, compiled with certain options)
5143kcov=no
5144if check_include sys/kcov.h ; then
5145    kcov=yes
5146fi
5147
5148# If we're making warnings fatal, apply this to Sphinx runs as well
5149sphinx_werror=""
5150if test "$werror" = "yes"; then
5151    sphinx_werror="-W"
5152fi
5153
5154# Check we have a new enough version of sphinx-build
5155has_sphinx_build() {
5156    # This is a bit awkward but works: create a trivial document and
5157    # try to run it with our configuration file (which enforces a
5158    # version requirement). This will fail if either
5159    # sphinx-build doesn't exist at all or if it is too old.
5160    mkdir -p "$TMPDIR1/sphinx"
5161    touch "$TMPDIR1/sphinx/index.rst"
5162    "$sphinx_build" $sphinx_werror -c "$source_path/docs" \
5163                    -b html "$TMPDIR1/sphinx" \
5164                    "$TMPDIR1/sphinx/out"  >> config.log 2>&1
5165}
5166
5167# Check if tools are available to build documentation.
5168if test "$docs" != "no" ; then
5169  if has_sphinx_build; then
5170    sphinx_ok=yes
5171  else
5172    sphinx_ok=no
5173  fi
5174  if has makeinfo && has pod2man && test "$sphinx_ok" = "yes"; then
5175    docs=yes
5176  else
5177    if test "$docs" = "yes" ; then
5178      if has $sphinx_build && test "$sphinx_ok" != "yes"; then
5179        echo "Warning: $sphinx_build exists but it is either too old or uses too old a Python version" >&2
5180      fi
5181      feature_not_found "docs" "Install texinfo, Perl/perl-podlators and a Python 3 version of python-sphinx"
5182    fi
5183    docs=no
5184  fi
5185fi
5186
5187# Search for bswap_32 function
5188byteswap_h=no
5189cat > $TMPC << EOF
5190#include <byteswap.h>
5191int main(void) { return bswap_32(0); }
5192EOF
5193if compile_prog "" "" ; then
5194  byteswap_h=yes
5195fi
5196
5197# Search for bswap32 function
5198bswap_h=no
5199cat > $TMPC << EOF
5200#include <sys/endian.h>
5201#include <sys/types.h>
5202#include <machine/bswap.h>
5203int main(void) { return bswap32(0); }
5204EOF
5205if compile_prog "" "" ; then
5206  bswap_h=yes
5207fi
5208
5209##########################################
5210# Do we have libiscsi >= 1.9.0
5211if test "$libiscsi" != "no" ; then
5212  if $pkg_config --atleast-version=1.9.0 libiscsi; then
5213    libiscsi="yes"
5214    libiscsi_cflags=$($pkg_config --cflags libiscsi)
5215    libiscsi_libs=$($pkg_config --libs libiscsi)
5216  else
5217    if test "$libiscsi" = "yes" ; then
5218      feature_not_found "libiscsi" "Install libiscsi >= 1.9.0"
5219    fi
5220    libiscsi="no"
5221  fi
5222fi
5223
5224##########################################
5225# Do we need libm
5226cat > $TMPC << EOF
5227#include <math.h>
5228int main(int argc, char **argv) { return isnan(sin((double)argc)); }
5229EOF
5230if compile_prog "" "" ; then
5231  :
5232elif compile_prog "" "-lm" ; then
5233  LIBS="-lm $LIBS"
5234else
5235  error_exit "libm check failed"
5236fi
5237
5238##########################################
5239# Do we need librt
5240# uClibc provides 2 versions of clock_gettime(), one with realtime
5241# support and one without. This means that the clock_gettime() don't
5242# need -lrt. We still need it for timer_create() so we check for this
5243# function in addition.
5244cat > $TMPC <<EOF
5245#include <signal.h>
5246#include <time.h>
5247int main(void) {
5248  timer_create(CLOCK_REALTIME, NULL, NULL);
5249  return clock_gettime(CLOCK_REALTIME, NULL);
5250}
5251EOF
5252
5253if compile_prog "" "" ; then
5254  :
5255# we need pthread for static linking. use previous pthread test result
5256elif compile_prog "" "$pthread_lib -lrt" ; then
5257  LIBS="$LIBS -lrt"
5258fi
5259
5260# Check whether we need to link libutil for openpty()
5261cat > $TMPC << EOF
5262extern int openpty(int *am, int *as, char *name, void *termp, void *winp);
5263int main(void) { return openpty(0, 0, 0, 0, 0); }
5264EOF
5265
5266have_openpty="no"
5267if compile_prog "" "" ; then
5268  have_openpty="yes"
5269else
5270  if compile_prog "" "-lutil" ; then
5271    libs_softmmu="-lutil $libs_softmmu"
5272    libs_tools="-lutil $libs_tools"
5273    have_openpty="yes"
5274  fi
5275fi
5276
5277##########################################
5278# spice probe
5279if test "$spice" != "no" ; then
5280  cat > $TMPC << EOF
5281#include <spice.h>
5282int main(void) { spice_server_new(); return 0; }
5283EOF
5284  spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
5285  spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
5286  if $pkg_config --atleast-version=0.12.5 spice-server && \
5287     $pkg_config --atleast-version=0.12.3 spice-protocol && \
5288     compile_prog "$spice_cflags" "$spice_libs" ; then
5289    spice="yes"
5290    libs_softmmu="$libs_softmmu $spice_libs"
5291    QEMU_CFLAGS="$QEMU_CFLAGS $spice_cflags"
5292  else
5293    if test "$spice" = "yes" ; then
5294      feature_not_found "spice" \
5295          "Install spice-server(>=0.12.5) and spice-protocol(>=0.12.3) devel"
5296    fi
5297    spice="no"
5298  fi
5299fi
5300
5301# check for smartcard support
5302if test "$smartcard" != "no"; then
5303    if $pkg_config --atleast-version=2.5.1 libcacard; then
5304        libcacard_cflags=$($pkg_config --cflags libcacard)
5305        libcacard_libs=$($pkg_config --libs libcacard)
5306        smartcard="yes"
5307    else
5308        if test "$smartcard" = "yes"; then
5309            feature_not_found "smartcard" "Install libcacard devel"
5310        fi
5311        smartcard="no"
5312    fi
5313fi
5314
5315# check for libusb
5316if test "$libusb" != "no" ; then
5317    if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
5318        libusb="yes"
5319        libusb_cflags=$($pkg_config --cflags libusb-1.0)
5320        libusb_libs=$($pkg_config --libs libusb-1.0)
5321    else
5322        if test "$libusb" = "yes"; then
5323            feature_not_found "libusb" "Install libusb devel >= 1.0.13"
5324        fi
5325        libusb="no"
5326    fi
5327fi
5328
5329# check for usbredirparser for usb network redirection support
5330if test "$usb_redir" != "no" ; then
5331    if $pkg_config --atleast-version=0.6 libusbredirparser-0.5; then
5332        usb_redir="yes"
5333        usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5)
5334        usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5)
5335    else
5336        if test "$usb_redir" = "yes"; then
5337            feature_not_found "usb-redir" "Install usbredir devel"
5338        fi
5339        usb_redir="no"
5340    fi
5341fi
5342
5343##########################################
5344# check if we have VSS SDK headers for win
5345
5346if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
5347        test "$vss_win32_sdk" != "no" ; then
5348  case "$vss_win32_sdk" in
5349    "")   vss_win32_include="-isystem $source_path" ;;
5350    *\ *) # The SDK is installed in "Program Files" by default, but we cannot
5351          # handle path with spaces. So we symlink the headers into ".sdk/vss".
5352          vss_win32_include="-isystem $source_path/.sdk/vss"
5353	  symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
5354	  ;;
5355    *)    vss_win32_include="-isystem $vss_win32_sdk"
5356  esac
5357  cat > $TMPC << EOF
5358#define __MIDL_user_allocate_free_DEFINED__
5359#include <inc/win2003/vss.h>
5360int main(void) { return VSS_CTX_BACKUP; }
5361EOF
5362  if compile_prog "$vss_win32_include" "" ; then
5363    guest_agent_with_vss="yes"
5364    QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
5365    libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
5366    qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
5367  else
5368    if test "$vss_win32_sdk" != "" ; then
5369      echo "ERROR: Please download and install Microsoft VSS SDK:"
5370      echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
5371      echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
5372      echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
5373      echo "ERROR: The headers are extracted in the directory \`inc'."
5374      feature_not_found "VSS support"
5375    fi
5376    guest_agent_with_vss="no"
5377  fi
5378fi
5379
5380##########################################
5381# lookup Windows platform SDK (if not specified)
5382# The SDK is needed only to build .tlb (type library) file of guest agent
5383# VSS provider from the source. It is usually unnecessary because the
5384# pre-compiled .tlb file is included.
5385
5386if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
5387        test "$guest_agent_with_vss" = "yes" ; then
5388  if test -z "$win_sdk"; then
5389    programfiles="$PROGRAMFILES"
5390    test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
5391    if test -n "$programfiles"; then
5392      win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
5393    else
5394      feature_not_found "Windows SDK"
5395    fi
5396  elif test "$win_sdk" = "no"; then
5397    win_sdk=""
5398  fi
5399fi
5400
5401##########################################
5402# check if mingw environment provides a recent ntddscsi.h
5403if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
5404  cat > $TMPC << EOF
5405#include <windows.h>
5406#include <ntddscsi.h>
5407int main(void) {
5408#if !defined(IOCTL_SCSI_GET_ADDRESS)
5409#error Missing required ioctl definitions
5410#endif
5411  SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
5412  return addr.Lun;
5413}
5414EOF
5415  if compile_prog "" "" ; then
5416    guest_agent_ntddscsi=yes
5417    libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
5418  fi
5419fi
5420
5421##########################################
5422# virgl renderer probe
5423
5424if test "$virglrenderer" != "no" ; then
5425  cat > $TMPC << EOF
5426#include <virglrenderer.h>
5427int main(void) { virgl_renderer_poll(); return 0; }
5428EOF
5429  virgl_cflags=$($pkg_config --cflags virglrenderer 2>/dev/null)
5430  virgl_libs=$($pkg_config --libs virglrenderer 2>/dev/null)
5431  virgl_version=$($pkg_config --modversion virglrenderer 2>/dev/null)
5432  if $pkg_config virglrenderer >/dev/null 2>&1 && \
5433     compile_prog "$virgl_cflags" "$virgl_libs" ; then
5434    virglrenderer="yes"
5435  else
5436    if test "$virglrenderer" = "yes" ; then
5437      feature_not_found "virglrenderer"
5438    fi
5439    virglrenderer="no"
5440  fi
5441fi
5442
5443##########################################
5444# capstone
5445
5446case "$capstone" in
5447  "" | yes)
5448    if $pkg_config capstone; then
5449      capstone=system
5450    elif test -e "${source_path}/.git" && test $git_update = 'yes' ; then
5451      capstone=git
5452    elif test -e "${source_path}/capstone/Makefile" ; then
5453      capstone=internal
5454    elif test -z "$capstone" ; then
5455      capstone=no
5456    else
5457      feature_not_found "capstone" "Install capstone devel or git submodule"
5458    fi
5459    ;;
5460
5461  system)
5462    if ! $pkg_config capstone; then
5463      feature_not_found "capstone" "Install capstone devel"
5464    fi
5465    ;;
5466esac
5467
5468case "$capstone" in
5469  git | internal)
5470    if test "$capstone" = git; then
5471      git_submodules="${git_submodules} capstone"
5472    fi
5473    mkdir -p capstone
5474    QEMU_CFLAGS="$QEMU_CFLAGS -I${source_path}/capstone/include"
5475    if test "$mingw32" = "yes"; then
5476      LIBCAPSTONE=capstone.lib
5477    else
5478      LIBCAPSTONE=libcapstone.a
5479    fi
5480    libs_cpu="-L$PWD/capstone -lcapstone $libs_cpu"
5481    capstone_libs="-L$PWD/capstone -lcapstone"
5482    capstone_cflags="-I${source_path}/capstone/include"
5483    ;;
5484
5485  system)
5486    capstone_libs="$($pkg_config --libs capstone)"
5487    capstone_cflags="$($pkg_config --cflags capstone)"
5488    QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags capstone)"
5489    libs_cpu="$($pkg_config --libs capstone) $libs_cpu"
5490    ;;
5491
5492  no)
5493    ;;
5494  *)
5495    error_exit "Unknown state for capstone: $capstone"
5496    ;;
5497esac
5498
5499##########################################
5500# check if we have fdatasync
5501
5502fdatasync=no
5503cat > $TMPC << EOF
5504#include <unistd.h>
5505int main(void) {
5506#if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
5507return fdatasync(0);
5508#else
5509#error Not supported
5510#endif
5511}
5512EOF
5513if compile_prog "" "" ; then
5514    fdatasync=yes
5515fi
5516
5517##########################################
5518# check if we have madvise
5519
5520madvise=no
5521cat > $TMPC << EOF
5522#include <sys/types.h>
5523#include <sys/mman.h>
5524#include <stddef.h>
5525int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }
5526EOF
5527if compile_prog "" "" ; then
5528    madvise=yes
5529fi
5530
5531##########################################
5532# check if we have posix_madvise
5533
5534posix_madvise=no
5535cat > $TMPC << EOF
5536#include <sys/mman.h>
5537#include <stddef.h>
5538int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }
5539EOF
5540if compile_prog "" "" ; then
5541    posix_madvise=yes
5542fi
5543
5544##########################################
5545# check if we have posix_memalign()
5546
5547posix_memalign=no
5548cat > $TMPC << EOF
5549#include <stdlib.h>
5550int main(void) {
5551    void *p;
5552    return posix_memalign(&p, 8, 8);
5553}
5554EOF
5555if compile_prog "" "" ; then
5556    posix_memalign=yes
5557fi
5558
5559##########################################
5560# check if we have posix_syslog
5561
5562posix_syslog=no
5563cat > $TMPC << EOF
5564#include <syslog.h>
5565int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; }
5566EOF
5567if compile_prog "" "" ; then
5568    posix_syslog=yes
5569fi
5570
5571##########################################
5572# check if we have sem_timedwait
5573
5574sem_timedwait=no
5575cat > $TMPC << EOF
5576#include <semaphore.h>
5577int main(void) { sem_t s; struct timespec t = {0}; return sem_timedwait(&s, &t); }
5578EOF
5579if compile_prog "" "" ; then
5580    sem_timedwait=yes
5581fi
5582
5583##########################################
5584# check if we have strchrnul
5585
5586strchrnul=no
5587cat > $TMPC << EOF
5588#include <string.h>
5589int main(void);
5590// Use a haystack that the compiler shouldn't be able to constant fold
5591char *haystack = (char*)&main;
5592int main(void) { return strchrnul(haystack, 'x') != &haystack[6]; }
5593EOF
5594if compile_prog "" "" ; then
5595    strchrnul=yes
5596fi
5597
5598#########################################
5599# check if we have st_atim
5600
5601st_atim=no
5602cat > $TMPC << EOF
5603#include <sys/stat.h>
5604#include <stddef.h>
5605int main(void) { return offsetof(struct stat, st_atim); }
5606EOF
5607if compile_prog "" "" ; then
5608    st_atim=yes
5609fi
5610
5611##########################################
5612# check if trace backend exists
5613
5614$python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
5615if test "$?" -ne 0 ; then
5616  error_exit "invalid trace backends" \
5617      "Please choose supported trace backends."
5618fi
5619
5620##########################################
5621# For 'ust' backend, test if ust headers are present
5622if have_backend "ust"; then
5623  cat > $TMPC << EOF
5624#include <lttng/tracepoint.h>
5625int main(void) { return 0; }
5626EOF
5627  if compile_prog "" "-Wl,--no-as-needed -ldl" ; then
5628    if $pkg_config lttng-ust --exists; then
5629      lttng_ust_libs=$($pkg_config --libs lttng-ust)
5630    else
5631      lttng_ust_libs="-llttng-ust -ldl"
5632    fi
5633    if $pkg_config liburcu-bp --exists; then
5634      urcu_bp_libs=$($pkg_config --libs liburcu-bp)
5635    else
5636      urcu_bp_libs="-lurcu-bp"
5637    fi
5638
5639    LIBS="$lttng_ust_libs $urcu_bp_libs $LIBS"
5640  else
5641    error_exit "Trace backend 'ust' missing lttng-ust header files"
5642  fi
5643fi
5644
5645##########################################
5646# For 'dtrace' backend, test if 'dtrace' command is present
5647if have_backend "dtrace"; then
5648  if ! has 'dtrace' ; then
5649    error_exit "dtrace command is not found in PATH $PATH"
5650  fi
5651  trace_backend_stap="no"
5652  if has 'stap' ; then
5653    trace_backend_stap="yes"
5654  fi
5655fi
5656
5657##########################################
5658# check and set a backend for coroutine
5659
5660# We prefer ucontext, but it's not always possible. The fallback
5661# is sigcontext. On Windows the only valid backend is the Windows
5662# specific one.
5663
5664ucontext_works=no
5665if test "$darwin" != "yes"; then
5666  cat > $TMPC << EOF
5667#include <ucontext.h>
5668#ifdef __stub_makecontext
5669#error Ignoring glibc stub makecontext which will always fail
5670#endif
5671int main(void) { makecontext(0, 0, 0); return 0; }
5672EOF
5673  if compile_prog "" "" ; then
5674    ucontext_works=yes
5675  fi
5676fi
5677
5678if test "$coroutine" = ""; then
5679  if test "$mingw32" = "yes"; then
5680    coroutine=win32
5681  elif test "$ucontext_works" = "yes"; then
5682    coroutine=ucontext
5683  else
5684    coroutine=sigaltstack
5685  fi
5686else
5687  case $coroutine in
5688  windows)
5689    if test "$mingw32" != "yes"; then
5690      error_exit "'windows' coroutine backend only valid for Windows"
5691    fi
5692    # Unfortunately the user visible backend name doesn't match the
5693    # coroutine-*.c filename for this case, so we have to adjust it here.
5694    coroutine=win32
5695    ;;
5696  ucontext)
5697    if test "$ucontext_works" != "yes"; then
5698      feature_not_found "ucontext"
5699    fi
5700    ;;
5701  sigaltstack)
5702    if test "$mingw32" = "yes"; then
5703      error_exit "only the 'windows' coroutine backend is valid for Windows"
5704    fi
5705    ;;
5706  *)
5707    error_exit "unknown coroutine backend $coroutine"
5708    ;;
5709  esac
5710fi
5711
5712if test "$coroutine_pool" = ""; then
5713  coroutine_pool=yes
5714fi
5715
5716if test "$debug_stack_usage" = "yes"; then
5717  if test "$coroutine_pool" = "yes"; then
5718    echo "WARN: disabling coroutine pool for stack usage debugging"
5719    coroutine_pool=no
5720  fi
5721fi
5722
5723##################################################
5724# SafeStack
5725
5726
5727if test "$safe_stack" = "yes"; then
5728cat > $TMPC << EOF
5729int main(int argc, char *argv[])
5730{
5731#if ! __has_feature(safe_stack)
5732#error SafeStack Disabled
5733#endif
5734    return 0;
5735}
5736EOF
5737  flag="-fsanitize=safe-stack"
5738  # Check that safe-stack is supported and enabled.
5739  if compile_prog "-Werror $flag" "$flag"; then
5740    # Flag needed both at compilation and at linking
5741    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
5742    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
5743  else
5744    error_exit "SafeStack not supported by your compiler"
5745  fi
5746  if test "$coroutine" != "ucontext"; then
5747    error_exit "SafeStack is only supported by the coroutine backend ucontext"
5748  fi
5749else
5750cat > $TMPC << EOF
5751int main(int argc, char *argv[])
5752{
5753#if defined(__has_feature)
5754#if __has_feature(safe_stack)
5755#error SafeStack Enabled
5756#endif
5757#endif
5758    return 0;
5759}
5760EOF
5761if test "$safe_stack" = "no"; then
5762  # Make sure that safe-stack is disabled
5763  if ! compile_prog "-Werror" ""; then
5764    # SafeStack was already enabled, try to explicitly remove the feature
5765    flag="-fno-sanitize=safe-stack"
5766    if ! compile_prog "-Werror $flag" "$flag"; then
5767      error_exit "Configure cannot disable SafeStack"
5768    fi
5769    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
5770    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
5771  fi
5772else # "$safe_stack" = ""
5773  # Set safe_stack to yes or no based on pre-existing flags
5774  if compile_prog "-Werror" ""; then
5775    safe_stack="no"
5776  else
5777    safe_stack="yes"
5778    if test "$coroutine" != "ucontext"; then
5779      error_exit "SafeStack is only supported by the coroutine backend ucontext"
5780    fi
5781  fi
5782fi
5783fi
5784
5785##########################################
5786# check if we have open_by_handle_at
5787
5788open_by_handle_at=no
5789cat > $TMPC << EOF
5790#include <fcntl.h>
5791#if !defined(AT_EMPTY_PATH)
5792# error missing definition
5793#else
5794int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
5795#endif
5796EOF
5797if compile_prog "" "" ; then
5798    open_by_handle_at=yes
5799fi
5800
5801########################################
5802# check if we have linux/magic.h
5803
5804linux_magic_h=no
5805cat > $TMPC << EOF
5806#include <linux/magic.h>
5807int main(void) {
5808  return 0;
5809}
5810EOF
5811if compile_prog "" "" ; then
5812    linux_magic_h=yes
5813fi
5814
5815########################################
5816# check if we have valgrind/valgrind.h
5817
5818valgrind_h=no
5819cat > $TMPC << EOF
5820#include <valgrind/valgrind.h>
5821int main(void) {
5822  return 0;
5823}
5824EOF
5825if compile_prog "" "" ; then
5826    valgrind_h=yes
5827fi
5828
5829########################################
5830# check if environ is declared
5831
5832has_environ=no
5833cat > $TMPC << EOF
5834#include <unistd.h>
5835int main(void) {
5836    environ = 0;
5837    return 0;
5838}
5839EOF
5840if compile_prog "" "" ; then
5841    has_environ=yes
5842fi
5843
5844########################################
5845# check if cpuid.h is usable.
5846
5847cat > $TMPC << EOF
5848#include <cpuid.h>
5849int main(void) {
5850    unsigned a, b, c, d;
5851    int max = __get_cpuid_max(0, 0);
5852
5853    if (max >= 1) {
5854        __cpuid(1, a, b, c, d);
5855    }
5856
5857    if (max >= 7) {
5858        __cpuid_count(7, 0, a, b, c, d);
5859    }
5860
5861    return 0;
5862}
5863EOF
5864if compile_prog "" "" ; then
5865    cpuid_h=yes
5866fi
5867
5868##########################################
5869# avx2 optimization requirement check
5870#
5871# There is no point enabling this if cpuid.h is not usable,
5872# since we won't be able to select the new routines.
5873
5874if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
5875  cat > $TMPC << EOF
5876#pragma GCC push_options
5877#pragma GCC target("avx2")
5878#include <cpuid.h>
5879#include <immintrin.h>
5880static int bar(void *a) {
5881    __m256i x = *(__m256i *)a;
5882    return _mm256_testz_si256(x, x);
5883}
5884int main(int argc, char *argv[]) { return bar(argv[0]); }
5885EOF
5886  if compile_object "" ; then
5887    avx2_opt="yes"
5888  else
5889    avx2_opt="no"
5890  fi
5891fi
5892
5893##########################################
5894# avx512f optimization requirement check
5895#
5896# There is no point enabling this if cpuid.h is not usable,
5897# since we won't be able to select the new routines.
5898# by default, it is turned off.
5899# if user explicitly want to enable it, check environment
5900
5901if test "$cpuid_h" = "yes" && test "$avx512f_opt" = "yes"; then
5902  cat > $TMPC << EOF
5903#pragma GCC push_options
5904#pragma GCC target("avx512f")
5905#include <cpuid.h>
5906#include <immintrin.h>
5907static int bar(void *a) {
5908    __m512i x = *(__m512i *)a;
5909    return _mm512_test_epi64_mask(x, x);
5910}
5911int main(int argc, char *argv[])
5912{
5913	return bar(argv[0]);
5914}
5915EOF
5916  if ! compile_object "" ; then
5917    avx512f_opt="no"
5918  fi
5919else
5920  avx512f_opt="no"
5921fi
5922
5923########################################
5924# check if __[u]int128_t is usable.
5925
5926int128=no
5927cat > $TMPC << EOF
5928__int128_t a;
5929__uint128_t b;
5930int main (void) {
5931  a = a + b;
5932  b = a * b;
5933  a = a * a;
5934  return 0;
5935}
5936EOF
5937if compile_prog "" "" ; then
5938    int128=yes
5939fi
5940
5941#########################################
5942# See if 128-bit atomic operations are supported.
5943
5944atomic128=no
5945if test "$int128" = "yes"; then
5946  cat > $TMPC << EOF
5947int main(void)
5948{
5949  unsigned __int128 x = 0, y = 0;
5950  y = __atomic_load_16(&x, 0);
5951  __atomic_store_16(&x, y, 0);
5952  __atomic_compare_exchange_16(&x, &y, x, 0, 0, 0);
5953  return 0;
5954}
5955EOF
5956  if compile_prog "" "" ; then
5957    atomic128=yes
5958  fi
5959fi
5960
5961cmpxchg128=no
5962if test "$int128" = yes && test "$atomic128" = no; then
5963  cat > $TMPC << EOF
5964int main(void)
5965{
5966  unsigned __int128 x = 0, y = 0;
5967  __sync_val_compare_and_swap_16(&x, y, x);
5968  return 0;
5969}
5970EOF
5971  if compile_prog "" "" ; then
5972    cmpxchg128=yes
5973  fi
5974fi
5975
5976#########################################
5977# See if 64-bit atomic operations are supported.
5978# Note that without __atomic builtins, we can only
5979# assume atomic loads/stores max at pointer size.
5980
5981cat > $TMPC << EOF
5982#include <stdint.h>
5983int main(void)
5984{
5985  uint64_t x = 0, y = 0;
5986#ifdef __ATOMIC_RELAXED
5987  y = __atomic_load_8(&x, 0);
5988  __atomic_store_8(&x, y, 0);
5989  __atomic_compare_exchange_8(&x, &y, x, 0, 0, 0);
5990  __atomic_exchange_8(&x, y, 0);
5991  __atomic_fetch_add_8(&x, y, 0);
5992#else
5993  typedef char is_host64[sizeof(void *) >= sizeof(uint64_t) ? 1 : -1];
5994  __sync_lock_test_and_set(&x, y);
5995  __sync_val_compare_and_swap(&x, y, 0);
5996  __sync_fetch_and_add(&x, y);
5997#endif
5998  return 0;
5999}
6000EOF
6001if compile_prog "" "" ; then
6002  atomic64=yes
6003fi
6004
6005#########################################
6006# See if --dynamic-list is supported by the linker
6007ld_dynamic_list="no"
6008if test "$static" = "no" ; then
6009    cat > $TMPTXT <<EOF
6010{
6011  foo;
6012};
6013EOF
6014
6015    cat > $TMPC <<EOF
6016#include <stdio.h>
6017void foo(void);
6018
6019void foo(void)
6020{
6021  printf("foo\n");
6022}
6023
6024int main(void)
6025{
6026  foo();
6027  return 0;
6028}
6029EOF
6030
6031    if compile_prog "" "-Wl,--dynamic-list=$TMPTXT" ; then
6032        ld_dynamic_list="yes"
6033    fi
6034fi
6035
6036#########################################
6037# See if -exported_symbols_list is supported by the linker
6038
6039ld_exported_symbols_list="no"
6040if test "$static" = "no" ; then
6041    cat > $TMPTXT <<EOF
6042  _foo
6043EOF
6044
6045    if compile_prog "" "-Wl,-exported_symbols_list,$TMPTXT" ; then
6046        ld_exported_symbols_list="yes"
6047    fi
6048fi
6049
6050if  test "$plugins" = "yes" &&
6051    test "$ld_dynamic_list" = "no" &&
6052    test "$ld_exported_symbols_list" = "no" ; then
6053  error_exit \
6054      "Plugin support requires dynamic linking and specifying a set of symbols " \
6055      "that are exported to plugins. Unfortunately your linker doesn't " \
6056      "support the flag (--dynamic-list or -exported_symbols_list) used " \
6057      "for this purpose. You can't build with --static."
6058fi
6059
6060########################################
6061# See if __attribute__((alias)) is supported.
6062# This false for Xcode 9, but has been remedied for Xcode 10.
6063# Unfortunately, travis uses Xcode 9 by default.
6064
6065attralias=no
6066cat > $TMPC << EOF
6067int x = 1;
6068extern const int y __attribute__((alias("x")));
6069int main(void) { return 0; }
6070EOF
6071if compile_prog "" "" ; then
6072    attralias=yes
6073fi
6074
6075########################################
6076# check if getauxval is available.
6077
6078getauxval=no
6079cat > $TMPC << EOF
6080#include <sys/auxv.h>
6081int main(void) {
6082  return getauxval(AT_HWCAP) == 0;
6083}
6084EOF
6085if compile_prog "" "" ; then
6086    getauxval=yes
6087fi
6088
6089########################################
6090# check if ccache is interfering with
6091# semantic analysis of macros
6092
6093unset CCACHE_CPP2
6094ccache_cpp2=no
6095cat > $TMPC << EOF
6096static const int Z = 1;
6097#define fn() ({ Z; })
6098#define TAUT(X) ((X) == Z)
6099#define PAREN(X, Y) (X == Y)
6100#define ID(X) (X)
6101int main(int argc, char *argv[])
6102{
6103    int x = 0, y = 0;
6104    x = ID(x);
6105    x = fn();
6106    fn();
6107    if (PAREN(x, y)) return 0;
6108    if (TAUT(Z)) return 0;
6109    return 0;
6110}
6111EOF
6112
6113if ! compile_object "-Werror"; then
6114    ccache_cpp2=yes
6115fi
6116
6117#################################################
6118# clang does not support glibc + FORTIFY_SOURCE.
6119
6120if test "$fortify_source" != "no"; then
6121  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
6122    fortify_source="no";
6123  elif test -n "$cxx" && has $cxx &&
6124       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
6125    fortify_source="no";
6126  else
6127    fortify_source="yes"
6128  fi
6129fi
6130
6131###############################################
6132# Check if copy_file_range is provided by glibc
6133have_copy_file_range=no
6134cat > $TMPC << EOF
6135#include <unistd.h>
6136int main(void) {
6137  copy_file_range(0, NULL, 0, NULL, 0, 0);
6138  return 0;
6139}
6140EOF
6141if compile_prog "" "" ; then
6142    have_copy_file_range=yes
6143fi
6144
6145##########################################
6146# check if struct fsxattr is available via linux/fs.h
6147
6148have_fsxattr=no
6149cat > $TMPC << EOF
6150#include <linux/fs.h>
6151struct fsxattr foo;
6152int main(void) {
6153  return 0;
6154}
6155EOF
6156if compile_prog "" "" ; then
6157    have_fsxattr=yes
6158fi
6159
6160##########################################
6161# check for usable membarrier system call
6162if test "$membarrier" = "yes"; then
6163    have_membarrier=no
6164    if test "$mingw32" = "yes" ; then
6165        have_membarrier=yes
6166    elif test "$linux" = "yes" ; then
6167        cat > $TMPC << EOF
6168    #include <linux/membarrier.h>
6169    #include <sys/syscall.h>
6170    #include <unistd.h>
6171    #include <stdlib.h>
6172    int main(void) {
6173        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
6174        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
6175	exit(0);
6176    }
6177EOF
6178        if compile_prog "" "" ; then
6179            have_membarrier=yes
6180        fi
6181    fi
6182    if test "$have_membarrier" = "no"; then
6183      feature_not_found "membarrier" "membarrier system call not available"
6184    fi
6185else
6186    # Do not enable it by default even for Mingw32, because it doesn't
6187    # work on Wine.
6188    membarrier=no
6189fi
6190
6191##########################################
6192# check if rtnetlink.h exists and is useful
6193have_rtnetlink=no
6194cat > $TMPC << EOF
6195#include <linux/rtnetlink.h>
6196int main(void) {
6197  return IFLA_PROTO_DOWN;
6198}
6199EOF
6200if compile_prog "" "" ; then
6201    have_rtnetlink=yes
6202fi
6203
6204##########################################
6205# check for usable AF_VSOCK environment
6206have_af_vsock=no
6207cat > $TMPC << EOF
6208#include <errno.h>
6209#include <sys/types.h>
6210#include <sys/socket.h>
6211#if !defined(AF_VSOCK)
6212# error missing AF_VSOCK flag
6213#endif
6214#include <linux/vm_sockets.h>
6215int main(void) {
6216    int sock, ret;
6217    struct sockaddr_vm svm;
6218    socklen_t len = sizeof(svm);
6219    sock = socket(AF_VSOCK, SOCK_STREAM, 0);
6220    ret = getpeername(sock, (struct sockaddr *)&svm, &len);
6221    if ((ret == -1) && (errno == ENOTCONN)) {
6222        return 0;
6223    }
6224    return -1;
6225}
6226EOF
6227if compile_prog "" "" ; then
6228    have_af_vsock=yes
6229fi
6230
6231##########################################
6232# check for usable AF_ALG environment
6233have_afalg=no
6234cat > $TMPC << EOF
6235#include <errno.h>
6236#include <sys/types.h>
6237#include <sys/socket.h>
6238#include <linux/if_alg.h>
6239int main(void) {
6240    int sock;
6241    sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
6242    return sock;
6243}
6244EOF
6245if compile_prog "" "" ; then
6246    have_afalg=yes
6247fi
6248if test "$crypto_afalg" = "yes"
6249then
6250    if test "$have_afalg" != "yes"
6251    then
6252	error_exit "AF_ALG requested but could not be detected"
6253    fi
6254fi
6255
6256
6257#################################################
6258# Check to see if we have the Hypervisor framework
6259if [ "$darwin" = "yes" ] ; then
6260  cat > $TMPC << EOF
6261#include <Hypervisor/hv.h>
6262int main() { return 0;}
6263EOF
6264  if ! compile_object ""; then
6265    hvf='no'
6266  else
6267    hvf='yes'
6268    QEMU_LDFLAGS="-framework Hypervisor $QEMU_LDFLAGS"
6269  fi
6270fi
6271
6272#################################################
6273# Sparc implicitly links with --relax, which is
6274# incompatible with -r, so --no-relax should be
6275# given. It does no harm to give it on other
6276# platforms too.
6277
6278# Note: the prototype is needed since QEMU_CFLAGS
6279#       contains -Wmissing-prototypes
6280cat > $TMPC << EOF
6281extern int foo(void);
6282int foo(void) { return 0; }
6283EOF
6284if ! compile_object ""; then
6285  error_exit "Failed to compile object file for LD_REL_FLAGS test"
6286fi
6287for i in '-Wl,-r -Wl,--no-relax' -Wl,-r -r; do
6288  if do_cc -nostdlib $i -o $TMPMO $TMPO; then
6289    LD_REL_FLAGS=$i
6290    break
6291  fi
6292done
6293if test "$modules" = "yes" && test "$LD_REL_FLAGS" = ""; then
6294  feature_not_found "modules" "Cannot find how to build relocatable objects"
6295fi
6296
6297##########################################
6298# check for sysmacros.h
6299
6300have_sysmacros=no
6301cat > $TMPC << EOF
6302#include <sys/sysmacros.h>
6303int main(void) {
6304    return makedev(0, 0);
6305}
6306EOF
6307if compile_prog "" "" ; then
6308    have_sysmacros=yes
6309fi
6310
6311##########################################
6312# check for _Static_assert()
6313
6314have_static_assert=no
6315cat > $TMPC << EOF
6316_Static_assert(1, "success");
6317int main(void) {
6318    return 0;
6319}
6320EOF
6321if compile_prog "" "" ; then
6322    have_static_assert=yes
6323fi
6324
6325##########################################
6326# check for utmpx.h, it is missing e.g. on OpenBSD
6327
6328have_utmpx=no
6329cat > $TMPC << EOF
6330#include <utmpx.h>
6331struct utmpx user_info;
6332int main(void) {
6333    return 0;
6334}
6335EOF
6336if compile_prog "" "" ; then
6337    have_utmpx=yes
6338fi
6339
6340##########################################
6341# check for getrandom()
6342
6343have_getrandom=no
6344cat > $TMPC << EOF
6345#include <sys/random.h>
6346int main(void) {
6347    return getrandom(0, 0, GRND_NONBLOCK);
6348}
6349EOF
6350if compile_prog "" "" ; then
6351    have_getrandom=yes
6352fi
6353
6354##########################################
6355# checks for sanitizers
6356
6357have_asan=no
6358have_ubsan=no
6359have_asan_iface_h=no
6360have_asan_iface_fiber=no
6361
6362if test "$sanitizers" = "yes" ; then
6363  write_c_skeleton
6364  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
6365      have_asan=yes
6366  fi
6367
6368  # we could use a simple skeleton for flags checks, but this also
6369  # detect the static linking issue of ubsan, see also:
6370  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
6371  cat > $TMPC << EOF
6372#include <stdlib.h>
6373int main(void) {
6374    void *tmp = malloc(10);
6375    if (tmp != NULL) {
6376        return *(int *)(tmp + 2);
6377    }
6378    return 1;
6379}
6380EOF
6381  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
6382      have_ubsan=yes
6383  fi
6384
6385  if check_include "sanitizer/asan_interface.h" ; then
6386      have_asan_iface_h=yes
6387  fi
6388
6389  cat > $TMPC << EOF
6390#include <sanitizer/asan_interface.h>
6391int main(void) {
6392  __sanitizer_start_switch_fiber(0, 0, 0);
6393  return 0;
6394}
6395EOF
6396  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
6397      have_asan_iface_fiber=yes
6398  fi
6399fi
6400
6401##########################################
6402# checks for fuzzer
6403if test "$fuzzing" = "yes" ; then
6404  write_c_fuzzer_skeleton
6405  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=fuzzer" ""; then
6406      have_fuzzer=yes
6407  fi
6408fi
6409
6410# Thread sanitizer is, for now, much noisier than the other sanitizers;
6411# keep it separate until that is not the case.
6412if test "$tsan" = "yes" && test "$sanitizers" = "yes"; then
6413  error_exit "TSAN is not supported with other sanitiziers."
6414fi
6415have_tsan=no
6416have_tsan_iface_fiber=no
6417if test "$tsan" = "yes" ; then
6418  write_c_skeleton
6419  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
6420      have_tsan=yes
6421  fi
6422  cat > $TMPC << EOF
6423#include <sanitizer/tsan_interface.h>
6424int main(void) {
6425  __tsan_create_fiber(0);
6426  return 0;
6427}
6428EOF
6429  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
6430      have_tsan_iface_fiber=yes
6431  fi
6432fi
6433
6434##########################################
6435# check for libpmem
6436
6437if test "$libpmem" != "no"; then
6438	if $pkg_config --exists "libpmem"; then
6439		libpmem="yes"
6440		libpmem_libs=$($pkg_config --libs libpmem)
6441		libpmem_cflags=$($pkg_config --cflags libpmem)
6442		libs_softmmu="$libs_softmmu $libpmem_libs"
6443		QEMU_CFLAGS="$QEMU_CFLAGS $libpmem_cflags"
6444	else
6445		if test "$libpmem" = "yes" ; then
6446			feature_not_found "libpmem" "Install nvml or pmdk"
6447		fi
6448		libpmem="no"
6449	fi
6450fi
6451
6452##########################################
6453# check for libdaxctl
6454
6455if test "$libdaxctl" != "no"; then
6456	if $pkg_config --atleast-version=57 "libdaxctl"; then
6457		libdaxctl="yes"
6458		libdaxctl_libs=$($pkg_config --libs libdaxctl)
6459		libdaxctl_cflags=$($pkg_config --cflags libdaxctl)
6460		libs_softmmu="$libs_softmmu $libdaxctl_libs"
6461		QEMU_CFLAGS="$QEMU_CFLAGS $libdaxctl_cflags"
6462	else
6463		if test "$libdaxctl" = "yes" ; then
6464			feature_not_found "libdaxctl" "Install libdaxctl"
6465		fi
6466		libdaxctl="no"
6467	fi
6468fi
6469
6470##########################################
6471# check for slirp
6472
6473# slirp is only required when building softmmu targets
6474if test -z "$slirp" -a "$softmmu" != "yes" ; then
6475    slirp="no"
6476fi
6477
6478case "$slirp" in
6479  "" | yes)
6480    if $pkg_config slirp; then
6481      slirp=system
6482    elif test -e "${source_path}/.git" && test $git_update = 'yes' ; then
6483      slirp=git
6484    elif test -e "${source_path}/slirp/Makefile" ; then
6485      slirp=internal
6486    elif test -z "$slirp" ; then
6487      slirp=no
6488    else
6489      feature_not_found "slirp" "Install slirp devel or git submodule"
6490    fi
6491    ;;
6492
6493  system)
6494    if ! $pkg_config slirp; then
6495      feature_not_found "slirp" "Install slirp devel"
6496    fi
6497    ;;
6498esac
6499
6500case "$slirp" in
6501  git | internal)
6502    if test "$slirp" = git; then
6503      git_submodules="${git_submodules} slirp"
6504    fi
6505    mkdir -p slirp
6506    slirp_cflags="-I${source_path}/slirp/src -I$PWD/slirp/src"
6507    slirp_libs="-L$PWD/slirp -lslirp"
6508    if test "$mingw32" = "yes" ; then
6509      slirp_libs="$slirp_libs -lws2_32 -liphlpapi"
6510    fi
6511    ;;
6512
6513  system)
6514    slirp_version=$($pkg_config --modversion slirp 2>/dev/null)
6515    slirp_cflags=$($pkg_config --cflags slirp 2>/dev/null)
6516    slirp_libs=$($pkg_config --libs slirp 2>/dev/null)
6517    ;;
6518
6519  no)
6520    ;;
6521  *)
6522    error_exit "Unknown state for slirp: $slirp"
6523    ;;
6524esac
6525
6526##########################################
6527# check for usable __NR_keyctl syscall
6528
6529if test "$linux" = "yes" ; then
6530
6531    have_keyring=no
6532    cat > $TMPC << EOF
6533#include <errno.h>
6534#include <asm/unistd.h>
6535#include <linux/keyctl.h>
6536#include <unistd.h>
6537int main(void) {
6538    return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
6539}
6540EOF
6541    if compile_prog "" "" ; then
6542        have_keyring=yes
6543    fi
6544fi
6545if test "$secret_keyring" != "no"
6546then
6547    if test "$have_keyring" = "yes"
6548    then
6549	secret_keyring=yes
6550    else
6551	if test "$secret_keyring" = "yes"
6552	then
6553	    error_exit "syscall __NR_keyctl requested, \
6554but not implemented on your system"
6555	else
6556	    secret_keyring=no
6557	fi
6558    fi
6559fi
6560
6561##########################################
6562# check for usable keyutils.h
6563
6564if test "$linux" = "yes" ; then
6565
6566    have_keyutils=no
6567    cat > $TMPC << EOF
6568#include <errno.h>
6569#include <asm/unistd.h>
6570#include <unistd.h>
6571#include <sys/types.h>
6572#include <keyutils.h>
6573int main(void) {
6574    return request_key("user", NULL, NULL, 0);
6575}
6576EOF
6577    if compile_prog "" "-lkeyutils"; then
6578        have_keyutils=yes
6579    fi
6580fi
6581
6582
6583##########################################
6584# End of CC checks
6585# After here, no more $cc or $ld runs
6586
6587write_c_skeleton
6588
6589if test "$gcov" = "yes" ; then
6590  :
6591elif test "$fortify_source" = "yes" ; then
6592  QEMU_CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $QEMU_CFLAGS"
6593  debug=no
6594fi
6595if test "$debug_info" = "yes"; then
6596  CFLAGS="-g $CFLAGS"
6597  LDFLAGS="-g $LDFLAGS"
6598fi
6599if test "$debug" = "no"; then
6600  CFLAGS="-O2 $CFLAGS"
6601fi
6602
6603case "$ARCH" in
6604alpha)
6605  # Ensure there's only a single GP
6606  QEMU_CFLAGS="-msmall-data $QEMU_CFLAGS"
6607;;
6608esac
6609
6610if test "$gprof" = "yes" ; then
6611  QEMU_CFLAGS="-p $QEMU_CFLAGS"
6612  QEMU_LDFLAGS="-p $QEMU_LDFLAGS"
6613fi
6614
6615if test "$have_asan" = "yes"; then
6616  QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
6617  QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
6618  if test "$have_asan_iface_h" = "no" ; then
6619      echo "ASAN build enabled, but ASAN header missing." \
6620           "Without code annotation, the report may be inferior."
6621  elif test "$have_asan_iface_fiber" = "no" ; then
6622      echo "ASAN build enabled, but ASAN header is too old." \
6623           "Without code annotation, the report may be inferior."
6624  fi
6625fi
6626if test "$have_tsan" = "yes" ; then
6627  if test "$have_tsan_iface_fiber" = "yes" ; then
6628    QEMU_CFLAGS="-fsanitize=thread $QEMU_CFLAGS"
6629    QEMU_LDFLAGS="-fsanitize=thread $QEMU_LDFLAGS"
6630  else
6631    error_exit "Cannot enable TSAN due to missing fiber annotation interface."
6632  fi
6633elif test "$tsan" = "yes" ; then
6634  error_exit "Cannot enable TSAN due to missing sanitize thread interface."
6635fi
6636if test "$have_ubsan" = "yes"; then
6637  QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS"
6638  QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
6639fi
6640
6641##########################################
6642# Do we have libnfs
6643if test "$libnfs" != "no" ; then
6644  if $pkg_config --atleast-version=1.9.3 libnfs; then
6645    libnfs="yes"
6646    libnfs_libs=$($pkg_config --libs libnfs)
6647  else
6648    if test "$libnfs" = "yes" ; then
6649      feature_not_found "libnfs" "Install libnfs devel >= 1.9.3"
6650    fi
6651    libnfs="no"
6652  fi
6653fi
6654
6655##########################################
6656# Do we have libudev
6657if test "$libudev" != "no" ; then
6658  if $pkg_config libudev && test "$static" != "yes"; then
6659    libudev="yes"
6660    libudev_libs=$($pkg_config --libs libudev)
6661  else
6662    libudev="no"
6663  fi
6664fi
6665
6666# Now we've finished running tests it's OK to add -Werror to the compiler flags
6667if test "$werror" = "yes"; then
6668    QEMU_CFLAGS="-Werror $QEMU_CFLAGS"
6669fi
6670
6671# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
6672if test "$solaris" = "no" && test "$tsan" = "no"; then
6673    if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
6674        QEMU_LDFLAGS="-Wl,--warn-common $QEMU_LDFLAGS"
6675    fi
6676fi
6677
6678# test if pod2man has --utf8 option
6679if pod2man --help | grep -q utf8; then
6680    POD2MAN="pod2man --utf8"
6681else
6682    POD2MAN="pod2man"
6683fi
6684
6685# Use ASLR, no-SEH and DEP if available
6686if test "$mingw32" = "yes" ; then
6687    for flag in --dynamicbase --no-seh --nxcompat; do
6688        if ld_has $flag ; then
6689            QEMU_LDFLAGS="-Wl,$flag $QEMU_LDFLAGS"
6690        fi
6691    done
6692fi
6693
6694# Disable OpenBSD W^X if available
6695if test "$tcg" = "yes" && test "$targetos" = "OpenBSD"; then
6696    cat > $TMPC <<EOF
6697    int main(void) { return 0; }
6698EOF
6699    wx_ldflags="-Wl,-z,wxneeded"
6700    if compile_prog "" "$wx_ldflags"; then
6701        QEMU_LDFLAGS="$QEMU_LDFLAGS $wx_ldflags"
6702    fi
6703fi
6704
6705qemu_confdir=$sysconfdir$confsuffix
6706qemu_moddir=$libdir$confsuffix
6707qemu_datadir=$datadir$confsuffix
6708qemu_localedir="$datadir/locale"
6709qemu_icondir="$datadir/icons"
6710qemu_desktopdir="$datadir/applications"
6711
6712# We can only support ivshmem if we have eventfd
6713if [ "$eventfd" = "yes" ]; then
6714  ivshmem=yes
6715fi
6716
6717if test "$softmmu" = yes ; then
6718  if test "$linux" = yes; then
6719    if test "$virtfs" != no && test "$cap_ng" = yes && test "$attr" = yes ; then
6720      virtfs=yes
6721    else
6722      if test "$virtfs" = yes; then
6723        error_exit "VirtFS requires libcap-ng devel and libattr devel"
6724      fi
6725      virtfs=no
6726    fi
6727    if test "$mpath" != no && test "$mpathpersist" = yes ; then
6728      mpath=yes
6729    else
6730      if test "$mpath" = yes; then
6731        error_exit "Multipath requires libmpathpersist devel"
6732      fi
6733      mpath=no
6734    fi
6735  else
6736    if test "$virtfs" = yes; then
6737      error_exit "VirtFS is supported only on Linux"
6738    fi
6739    virtfs=no
6740    if test "$mpath" = yes; then
6741      error_exit "Multipath is supported only on Linux"
6742    fi
6743    mpath=no
6744  fi
6745fi
6746
6747# Probe for guest agent support/options
6748
6749if [ "$guest_agent" != "no" ]; then
6750  if [ "$softmmu" = no -a "$want_tools" = no ] ; then
6751      guest_agent=no
6752  elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
6753      guest_agent=yes
6754  elif [ "$guest_agent" != yes ]; then
6755      guest_agent=no
6756  else
6757      error_exit "Guest agent is not supported on this platform"
6758  fi
6759fi
6760
6761# Guest agent Window MSI  package
6762
6763if test "$guest_agent" != yes; then
6764  if test "$guest_agent_msi" = yes; then
6765    error_exit "MSI guest agent package requires guest agent enabled"
6766  fi
6767  guest_agent_msi=no
6768elif test "$mingw32" != "yes"; then
6769  if test "$guest_agent_msi" = "yes"; then
6770    error_exit "MSI guest agent package is available only for MinGW Windows cross-compilation"
6771  fi
6772  guest_agent_msi=no
6773elif ! has wixl; then
6774  if test "$guest_agent_msi" = "yes"; then
6775    error_exit "MSI guest agent package requires wixl tool installed ( usually from msitools package )"
6776  fi
6777  guest_agent_msi=no
6778else
6779  # we support qemu-ga, mingw32, and wixl: default to MSI enabled if it wasn't
6780  # disabled explicitly
6781  if test "$guest_agent_msi" != "no"; then
6782    guest_agent_msi=yes
6783  fi
6784fi
6785
6786if test "$guest_agent_msi" = "yes"; then
6787  if test "$guest_agent_with_vss" = "yes"; then
6788    QEMU_GA_MSI_WITH_VSS="-D InstallVss"
6789  fi
6790
6791  if test "$QEMU_GA_MANUFACTURER" = ""; then
6792    QEMU_GA_MANUFACTURER=QEMU
6793  fi
6794
6795  if test "$QEMU_GA_DISTRO" = ""; then
6796    QEMU_GA_DISTRO=Linux
6797  fi
6798
6799  if test "$QEMU_GA_VERSION" = ""; then
6800      QEMU_GA_VERSION=$(cat $source_path/VERSION)
6801  fi
6802
6803  QEMU_GA_MSI_MINGW_DLL_PATH="-D Mingw_dlls=$($pkg_config --variable=prefix glib-2.0)/bin"
6804
6805  case "$cpu" in
6806  x86_64)
6807    QEMU_GA_MSI_ARCH="-a x64 -D Arch=64"
6808    ;;
6809  i386)
6810    QEMU_GA_MSI_ARCH="-D Arch=32"
6811    ;;
6812  *)
6813    error_exit "CPU $cpu not supported for building installation package"
6814    ;;
6815  esac
6816fi
6817
6818# Mac OS X ships with a broken assembler
6819roms=
6820if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
6821        test "$targetos" != "Darwin" && test "$targetos" != "SunOS" && \
6822        test "$softmmu" = yes ; then
6823    # Different host OS linkers have different ideas about the name of the ELF
6824    # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
6825    # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
6826    for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
6827        if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
6828            ld_i386_emulation="$emu"
6829            roms="optionrom"
6830            break
6831        fi
6832    done
6833fi
6834
6835# Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
6836if test "$cpu" = "s390x" ; then
6837  write_c_skeleton
6838  if compile_prog "-march=z900" ""; then
6839    roms="$roms s390-ccw"
6840    # SLOF is required for building the s390-ccw firmware on s390x,
6841    # since it is using the libnet code from SLOF for network booting.
6842    if test -e "${source_path}/.git" ; then
6843      git_submodules="${git_submodules} roms/SLOF"
6844    fi
6845  fi
6846fi
6847
6848# Check that the C++ compiler exists and works with the C compiler.
6849# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
6850if has $cxx; then
6851    cat > $TMPC <<EOF
6852int c_function(void);
6853int main(void) { return c_function(); }
6854EOF
6855
6856    compile_object
6857
6858    cat > $TMPCXX <<EOF
6859extern "C" {
6860   int c_function(void);
6861}
6862int c_function(void) { return 42; }
6863EOF
6864
6865    update_cxxflags
6866
6867    if do_cxx $CXXFLAGS $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
6868        # C++ compiler $cxx works ok with C compiler $cc
6869        :
6870    else
6871        echo "C++ compiler $cxx does not work with C compiler $cc"
6872        echo "Disabling C++ specific optional code"
6873        cxx=
6874    fi
6875else
6876    echo "No C++ compiler available; disabling C++ specific optional code"
6877    cxx=
6878fi
6879
6880echo_version() {
6881    if test "$1" = "yes" ; then
6882        echo "($2)"
6883    fi
6884}
6885
6886# prepend pixman and ftd flags after all config tests are done
6887QEMU_CFLAGS="$pixman_cflags $fdt_cflags $QEMU_CFLAGS"
6888QEMU_LDFLAGS="$fdt_ldflags $QEMU_LDFLAGS"
6889libs_softmmu="$pixman_libs $libs_softmmu"
6890
6891config_host_mak="config-host.mak"
6892
6893echo "# Automatically generated by configure - do not modify" >config-all-disas.mak
6894
6895echo "# Automatically generated by configure - do not modify" > $config_host_mak
6896echo >> $config_host_mak
6897
6898echo all: >> $config_host_mak
6899echo "prefix=$prefix" >> $config_host_mak
6900echo "bindir=$bindir" >> $config_host_mak
6901echo "libdir=$libdir" >> $config_host_mak
6902echo "libexecdir=$libexecdir" >> $config_host_mak
6903echo "includedir=$includedir" >> $config_host_mak
6904echo "mandir=$mandir" >> $config_host_mak
6905echo "sysconfdir=$sysconfdir" >> $config_host_mak
6906echo "qemu_confdir=$qemu_confdir" >> $config_host_mak
6907echo "qemu_datadir=$qemu_datadir" >> $config_host_mak
6908echo "qemu_firmwarepath=$firmwarepath" >> $config_host_mak
6909echo "qemu_docdir=$qemu_docdir" >> $config_host_mak
6910echo "qemu_moddir=$qemu_moddir" >> $config_host_mak
6911if test "$mingw32" = "no" ; then
6912  echo "qemu_localstatedir=$local_statedir" >> $config_host_mak
6913fi
6914echo "qemu_helperdir=$libexecdir" >> $config_host_mak
6915echo "qemu_localedir=$qemu_localedir" >> $config_host_mak
6916echo "qemu_icondir=$qemu_icondir" >> $config_host_mak
6917echo "qemu_desktopdir=$qemu_desktopdir" >> $config_host_mak
6918echo "libs_cpu=$libs_cpu" >> $config_host_mak
6919echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
6920echo "GIT=$git" >> $config_host_mak
6921echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
6922echo "GIT_UPDATE=$git_update" >> $config_host_mak
6923
6924echo "ARCH=$ARCH" >> $config_host_mak
6925
6926echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
6927echo "GLIB_LDFLAGS=$glib_ldflags" >> $config_host_mak
6928
6929if test "$default_devices" = "yes" ; then
6930  echo "CONFIG_MINIKCONF_MODE=--defconfig" >> $config_host_mak
6931else
6932  echo "CONFIG_MINIKCONF_MODE=--allnoconfig" >> $config_host_mak
6933fi
6934if test "$debug_tcg" = "yes" ; then
6935  echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
6936fi
6937if test "$strip_opt" = "yes" ; then
6938  echo "STRIP=${strip}" >> $config_host_mak
6939fi
6940if test "$bigendian" = "yes" ; then
6941  echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
6942fi
6943if test "$mingw32" = "yes" ; then
6944  echo "CONFIG_WIN32=y" >> $config_host_mak
6945  rc_version=$(cat $source_path/VERSION)
6946  version_major=${rc_version%%.*}
6947  rc_version=${rc_version#*.}
6948  version_minor=${rc_version%%.*}
6949  rc_version=${rc_version#*.}
6950  version_subminor=${rc_version%%.*}
6951  version_micro=0
6952  echo "CONFIG_FILEVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
6953  echo "CONFIG_PRODUCTVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
6954  if test "$guest_agent_with_vss" = "yes" ; then
6955    echo "CONFIG_QGA_VSS=y" >> $config_host_mak
6956    echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
6957    echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
6958  fi
6959  if test "$guest_agent_ntddscsi" = "yes" ; then
6960    echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
6961  fi
6962  if test "$guest_agent_msi" = "yes"; then
6963    echo "QEMU_GA_MSI_ENABLED=yes" >> $config_host_mak
6964    echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
6965    echo "QEMU_GA_MSI_WITH_VSS=${QEMU_GA_MSI_WITH_VSS}" >> $config_host_mak
6966    echo "QEMU_GA_MSI_ARCH=${QEMU_GA_MSI_ARCH}" >> $config_host_mak
6967    echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
6968    echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
6969    echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
6970  fi
6971else
6972  echo "CONFIG_POSIX=y" >> $config_host_mak
6973fi
6974
6975if test "$linux" = "yes" ; then
6976  echo "CONFIG_LINUX=y" >> $config_host_mak
6977fi
6978
6979if test "$darwin" = "yes" ; then
6980  echo "CONFIG_DARWIN=y" >> $config_host_mak
6981fi
6982
6983if test "$solaris" = "yes" ; then
6984  echo "CONFIG_SOLARIS=y" >> $config_host_mak
6985fi
6986if test "$haiku" = "yes" ; then
6987  echo "CONFIG_HAIKU=y" >> $config_host_mak
6988fi
6989if test "$static" = "yes" ; then
6990  echo "CONFIG_STATIC=y" >> $config_host_mak
6991fi
6992if test "$profiler" = "yes" ; then
6993  echo "CONFIG_PROFILER=y" >> $config_host_mak
6994fi
6995if test "$want_tools" = "yes" ; then
6996  echo "CONFIG_TOOLS=y" >> $config_host_mak
6997fi
6998if test "$guest_agent" = "yes" ; then
6999  echo "CONFIG_GUEST_AGENT=y" >> $config_host_mak
7000fi
7001if test "$slirp" != "no"; then
7002  echo "CONFIG_SLIRP=y" >> $config_host_mak
7003  echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
7004  echo "SLIRP_CFLAGS=$slirp_cflags" >> $config_host_mak
7005  echo "SLIRP_LIBS=$slirp_libs" >> $config_host_mak
7006fi
7007if [ "$slirp" = "git" -o "$slirp" = "internal" ]; then
7008    echo "config-host.h: slirp/all" >> $config_host_mak
7009fi
7010if test "$vde" = "yes" ; then
7011  echo "CONFIG_VDE=y" >> $config_host_mak
7012  echo "VDE_LIBS=$vde_libs" >> $config_host_mak
7013fi
7014if test "$netmap" = "yes" ; then
7015  echo "CONFIG_NETMAP=y" >> $config_host_mak
7016fi
7017if test "$l2tpv3" = "yes" ; then
7018  echo "CONFIG_L2TPV3=y" >> $config_host_mak
7019fi
7020if test "$gprof" = "yes" ; then
7021  echo "CONFIG_GPROF=y" >> $config_host_mak
7022fi
7023if test "$cap_ng" = "yes" ; then
7024  echo "CONFIG_LIBCAP_NG=y" >> $config_host_mak
7025  echo "LIBCAP_NG_LIBS=$cap_libs" >> $config_host_mak
7026fi
7027echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
7028for drv in $audio_drv_list; do
7029    def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
7030    case "$drv" in
7031	alsa | oss | pa | sdl)
7032	    echo "$def=m" >> $config_host_mak ;;
7033	*)
7034	    echo "$def=y" >> $config_host_mak ;;
7035    esac
7036done
7037if test "$alsa" = "yes" ; then
7038    echo "CONFIG_ALSA=y" >> $config_host_mak
7039fi
7040echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak
7041echo "ALSA_CFLAGS=$alsa_cflags" >> $config_host_mak
7042if test "$libpulse" = "yes" ; then
7043    echo "CONFIG_LIBPULSE=y" >> $config_host_mak
7044fi
7045echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
7046echo "PULSE_CFLAGS=$pulse_cflags" >> $config_host_mak
7047echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak
7048echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak
7049echo "OSS_LIBS=$oss_libs" >> $config_host_mak
7050if test "$libjack" = "yes" ; then
7051    echo "CONFIG_LIBJACK=y" >> $config_host_mak
7052fi
7053echo "JACK_LIBS=$jack_libs" >> $config_host_mak
7054if test "$audio_win_int" = "yes" ; then
7055  echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
7056fi
7057echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
7058echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
7059if test "$vnc" = "yes" ; then
7060  echo "CONFIG_VNC=y" >> $config_host_mak
7061fi
7062if test "$vnc_sasl" = "yes" ; then
7063  echo "CONFIG_VNC_SASL=y" >> $config_host_mak
7064fi
7065echo "SASL_CFLAGS=$vnc_sasl_cflags" >> $config_host_mak
7066echo "SASL_LIBS=$vnc_sasl_libs" >> $config_host_mak
7067if test "$vnc_jpeg" = "yes" ; then
7068  echo "CONFIG_VNC_JPEG=y" >> $config_host_mak
7069fi
7070echo "JPEG_CFLAGS=$vnc_jpeg_cflags" >> $config_host_mak
7071echo "JPEG_LIBS=$vnc_jpeg_libs" >> $config_host_mak
7072if test "$vnc_png" = "yes" ; then
7073  echo "CONFIG_VNC_PNG=y" >> $config_host_mak
7074fi
7075echo "PNG_CFLAGS=$vnc_png_cflags" >> $config_host_mak
7076echo "PNG_LIBS=$vnc_png_libs" >> $config_host_mak
7077if test "$xkbcommon" = "yes" ; then
7078  echo "CONFIG_XKBCOMMON=y" >> $config_host_mak
7079  echo "XKBCOMMON_CFLAGS=$xkbcommon_cflags" >> $config_host_mak
7080  echo "XKBCOMMON_LIBS=$xkbcommon_libs" >> $config_host_mak
7081fi
7082if test "$xfs" = "yes" ; then
7083  echo "CONFIG_XFS=y" >> $config_host_mak
7084fi
7085qemu_version=$(head $source_path/VERSION)
7086echo "VERSION=$qemu_version" >>$config_host_mak
7087echo "PKGVERSION=$pkgversion" >>$config_host_mak
7088echo "SRC_PATH=$source_path" >> $config_host_mak
7089echo "TARGET_DIRS=$target_list" >> $config_host_mak
7090if [ "$docs" = "yes" ] ; then
7091  echo "BUILD_DOCS=yes" >> $config_host_mak
7092fi
7093if test "$modules" = "yes"; then
7094  # $shacmd can generate a hash started with digit, which the compiler doesn't
7095  # like as an symbol. So prefix it with an underscore
7096  echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
7097  echo "CONFIG_MODULES=y" >> $config_host_mak
7098fi
7099if test "$module_upgrades" = "yes"; then
7100  echo "CONFIG_MODULE_UPGRADES=y" >> $config_host_mak
7101fi
7102if test "$have_x11" = "yes" && test "$need_x11" = "yes"; then
7103  echo "CONFIG_X11=y" >> $config_host_mak
7104  echo "X11_CFLAGS=$x11_cflags" >> $config_host_mak
7105  echo "X11_LIBS=$x11_libs" >> $config_host_mak
7106fi
7107if test "$sdl" = "yes" ; then
7108  echo "CONFIG_SDL=m" >> $config_host_mak
7109  echo "SDL_CFLAGS=$sdl_cflags" >> $config_host_mak
7110  echo "SDL_LIBS=$sdl_libs" >> $config_host_mak
7111  if test "$sdl_image" = "yes" ; then
7112      echo "CONFIG_SDL_IMAGE=y" >> $config_host_mak
7113  fi
7114fi
7115if test "$cocoa" = "yes" ; then
7116  echo "CONFIG_COCOA=y" >> $config_host_mak
7117fi
7118if test "$iconv" = "yes" ; then
7119  echo "CONFIG_ICONV=y" >> $config_host_mak
7120  echo "ICONV_CFLAGS=$iconv_cflags" >> $config_host_mak
7121  echo "ICONV_LIBS=$iconv_lib" >> $config_host_mak
7122fi
7123if test "$curses" = "yes" ; then
7124  echo "CONFIG_CURSES=m" >> $config_host_mak
7125  echo "CURSES_CFLAGS=$curses_inc" >> $config_host_mak
7126  echo "CURSES_LIBS=$curses_lib" >> $config_host_mak
7127fi
7128if test "$pipe2" = "yes" ; then
7129  echo "CONFIG_PIPE2=y" >> $config_host_mak
7130fi
7131if test "$accept4" = "yes" ; then
7132  echo "CONFIG_ACCEPT4=y" >> $config_host_mak
7133fi
7134if test "$splice" = "yes" ; then
7135  echo "CONFIG_SPLICE=y" >> $config_host_mak
7136fi
7137if test "$eventfd" = "yes" ; then
7138  echo "CONFIG_EVENTFD=y" >> $config_host_mak
7139fi
7140if test "$memfd" = "yes" ; then
7141  echo "CONFIG_MEMFD=y" >> $config_host_mak
7142fi
7143if test "$have_usbfs" = "yes" ; then
7144  echo "CONFIG_USBFS=y" >> $config_host_mak
7145fi
7146if test "$fallocate" = "yes" ; then
7147  echo "CONFIG_FALLOCATE=y" >> $config_host_mak
7148fi
7149if test "$fallocate_punch_hole" = "yes" ; then
7150  echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
7151fi
7152if test "$fallocate_zero_range" = "yes" ; then
7153  echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak
7154fi
7155if test "$posix_fallocate" = "yes" ; then
7156  echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
7157fi
7158if test "$sync_file_range" = "yes" ; then
7159  echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
7160fi
7161if test "$fiemap" = "yes" ; then
7162  echo "CONFIG_FIEMAP=y" >> $config_host_mak
7163fi
7164if test "$dup3" = "yes" ; then
7165  echo "CONFIG_DUP3=y" >> $config_host_mak
7166fi
7167if test "$ppoll" = "yes" ; then
7168  echo "CONFIG_PPOLL=y" >> $config_host_mak
7169fi
7170if test "$prctl_pr_set_timerslack" = "yes" ; then
7171  echo "CONFIG_PRCTL_PR_SET_TIMERSLACK=y" >> $config_host_mak
7172fi
7173if test "$epoll" = "yes" ; then
7174  echo "CONFIG_EPOLL=y" >> $config_host_mak
7175fi
7176if test "$epoll_create1" = "yes" ; then
7177  echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
7178fi
7179if test "$sendfile" = "yes" ; then
7180  echo "CONFIG_SENDFILE=y" >> $config_host_mak
7181fi
7182if test "$timerfd" = "yes" ; then
7183  echo "CONFIG_TIMERFD=y" >> $config_host_mak
7184fi
7185if test "$setns" = "yes" ; then
7186  echo "CONFIG_SETNS=y" >> $config_host_mak
7187fi
7188if test "$clock_adjtime" = "yes" ; then
7189  echo "CONFIG_CLOCK_ADJTIME=y" >> $config_host_mak
7190fi
7191if test "$syncfs" = "yes" ; then
7192  echo "CONFIG_SYNCFS=y" >> $config_host_mak
7193fi
7194if test "$kcov" = "yes" ; then
7195  echo "CONFIG_KCOV=y" >> $config_host_mak
7196fi
7197if test "$inotify" = "yes" ; then
7198  echo "CONFIG_INOTIFY=y" >> $config_host_mak
7199fi
7200if test "$inotify1" = "yes" ; then
7201  echo "CONFIG_INOTIFY1=y" >> $config_host_mak
7202fi
7203if test "$sem_timedwait" = "yes" ; then
7204  echo "CONFIG_SEM_TIMEDWAIT=y" >> $config_host_mak
7205fi
7206if test "$strchrnul" = "yes" ; then
7207  echo "HAVE_STRCHRNUL=y" >> $config_host_mak
7208fi
7209if test "$st_atim" = "yes" ; then
7210  echo "HAVE_STRUCT_STAT_ST_ATIM=y" >> $config_host_mak
7211fi
7212if test "$byteswap_h" = "yes" ; then
7213  echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
7214fi
7215if test "$bswap_h" = "yes" ; then
7216  echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
7217fi
7218if test "$curl" = "yes" ; then
7219  echo "CONFIG_CURL=m" >> $config_host_mak
7220  echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak
7221  echo "CURL_LIBS=$curl_libs" >> $config_host_mak
7222fi
7223if test "$brlapi" = "yes" ; then
7224  echo "CONFIG_BRLAPI=y" >> $config_host_mak
7225  echo "BRLAPI_LIBS=$brlapi_libs" >> $config_host_mak
7226fi
7227if test "$gtk" = "yes" ; then
7228  echo "CONFIG_GTK=m" >> $config_host_mak
7229  echo "GTK_CFLAGS=$gtk_cflags" >> $config_host_mak
7230  echo "GTK_LIBS=$gtk_libs" >> $config_host_mak
7231  if test "$gtk_gl" = "yes" ; then
7232    echo "CONFIG_GTK_GL=y" >> $config_host_mak
7233  fi
7234fi
7235if test "$gio" = "yes" ; then
7236    echo "CONFIG_GIO=y" >> $config_host_mak
7237    echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
7238    echo "GIO_LIBS=$gio_libs" >> $config_host_mak
7239    echo "GDBUS_CODEGEN=$gdbus_codegen" >> $config_host_mak
7240fi
7241echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
7242if test "$gnutls" = "yes" ; then
7243  echo "CONFIG_GNUTLS=y" >> $config_host_mak
7244  echo "GNUTLS_CFLAGS=$gnutls_cflags" >> $config_host_mak
7245  echo "GNUTLS_LIBS=$gnutls_libs" >> $config_host_mak
7246fi
7247if test "$gcrypt" = "yes" ; then
7248  echo "CONFIG_GCRYPT=y" >> $config_host_mak
7249  if test "$gcrypt_hmac" = "yes" ; then
7250    echo "CONFIG_GCRYPT_HMAC=y" >> $config_host_mak
7251  fi
7252fi
7253if test "$nettle" = "yes" ; then
7254  echo "CONFIG_NETTLE=y" >> $config_host_mak
7255  echo "CONFIG_NETTLE_VERSION_MAJOR=${nettle_version%%.*}" >> $config_host_mak
7256  echo "NETTLE_CFLAGS=$nettle_cflags" >> $config_host_mak
7257  echo "NETTLE_LIBS=$nettle_libs" >> $config_host_mak
7258fi
7259if test "$qemu_private_xts" = "yes" ; then
7260  echo "CONFIG_QEMU_PRIVATE_XTS=y" >> $config_host_mak
7261fi
7262if test "$tasn1" = "yes" ; then
7263  echo "CONFIG_TASN1=y" >> $config_host_mak
7264fi
7265if test "$auth_pam" = "yes" ; then
7266    echo "CONFIG_AUTH_PAM=y" >> $config_host_mak
7267fi
7268if test "$have_ifaddrs_h" = "yes" ; then
7269    echo "HAVE_IFADDRS_H=y" >> $config_host_mak
7270fi
7271if test "$have_drm_h" = "yes" ; then
7272  echo "HAVE_DRM_H=y" >> $config_host_mak
7273fi
7274if test "$have_broken_size_max" = "yes" ; then
7275    echo "HAVE_BROKEN_SIZE_MAX=y" >> $config_host_mak
7276fi
7277if test "$have_openpty" = "yes" ; then
7278    echo "HAVE_OPENPTY=y" >> $config_host_mak
7279fi
7280if test "$have_sys_signal_h" = "yes" ; then
7281    echo "HAVE_SYS_SIGNAL_H=y" >> $config_host_mak
7282fi
7283
7284# Work around a system header bug with some kernel/XFS header
7285# versions where they both try to define 'struct fsxattr':
7286# xfs headers will not try to redefine structs from linux headers
7287# if this macro is set.
7288if test "$have_fsxattr" = "yes" ; then
7289    echo "HAVE_FSXATTR=y" >> $config_host_mak
7290fi
7291if test "$have_copy_file_range" = "yes" ; then
7292    echo "HAVE_COPY_FILE_RANGE=y" >> $config_host_mak
7293fi
7294if test "$vte" = "yes" ; then
7295  echo "CONFIG_VTE=y" >> $config_host_mak
7296  echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak
7297  echo "VTE_LIBS=$vte_libs" >> $config_host_mak
7298fi
7299if test "$virglrenderer" = "yes" ; then
7300  echo "CONFIG_VIRGL=y" >> $config_host_mak
7301  echo "VIRGL_CFLAGS=$virgl_cflags" >> $config_host_mak
7302  echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak
7303fi
7304if test "$xen" = "yes" ; then
7305  echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
7306  echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
7307  echo "XEN_CFLAGS=$xen_cflags" >> $config_host_mak
7308  echo "XEN_LIBS=$xen_libs" >> $config_host_mak
7309fi
7310if test "$linux_aio" = "yes" ; then
7311  echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
7312fi
7313if test "$linux_io_uring" = "yes" ; then
7314  echo "CONFIG_LINUX_IO_URING=y" >> $config_host_mak
7315  echo "LINUX_IO_URING_CFLAGS=$linux_io_uring_cflags" >> $config_host_mak
7316  echo "LINUX_IO_URING_LIBS=$linux_io_uring_libs" >> $config_host_mak
7317fi
7318if test "$attr" = "yes" ; then
7319  echo "CONFIG_ATTR=y" >> $config_host_mak
7320  echo "LIBATTR_LIBS=$libattr_libs" >> $config_host_mak
7321fi
7322if test "$libattr" = "yes" ; then
7323  echo "CONFIG_LIBATTR=y" >> $config_host_mak
7324fi
7325if test "$virtfs" = "yes" ; then
7326  echo "CONFIG_VIRTFS=y" >> $config_host_mak
7327fi
7328if test "$mpath" = "yes" ; then
7329  echo "CONFIG_MPATH=y" >> $config_host_mak
7330  if test "$mpathpersist_new_api" = "yes"; then
7331    echo "CONFIG_MPATH_NEW_API=y" >> $config_host_mak
7332  fi
7333fi
7334if test "$vhost_scsi" = "yes" ; then
7335  echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
7336fi
7337if test "$vhost_net" = "yes" ; then
7338  echo "CONFIG_VHOST_NET=y" >> $config_host_mak
7339fi
7340if test "$vhost_net_user" = "yes" ; then
7341  echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
7342fi
7343if test "$vhost_net_vdpa" = "yes" ; then
7344  echo "CONFIG_VHOST_NET_VDPA=y" >> $config_host_mak
7345fi
7346if test "$vhost_crypto" = "yes" ; then
7347  echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
7348fi
7349if test "$vhost_vsock" = "yes" ; then
7350  echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
7351  if test "$vhost_user" = "yes" ; then
7352    echo "CONFIG_VHOST_USER_VSOCK=y" >> $config_host_mak
7353  fi
7354fi
7355if test "$vhost_kernel" = "yes" ; then
7356  echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
7357fi
7358if test "$vhost_user" = "yes" ; then
7359  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
7360fi
7361if test "$vhost_vdpa" = "yes" ; then
7362  echo "CONFIG_VHOST_VDPA=y" >> $config_host_mak
7363fi
7364if test "$vhost_user_fs" = "yes" ; then
7365  echo "CONFIG_VHOST_USER_FS=y" >> $config_host_mak
7366fi
7367if test "$blobs" = "yes" ; then
7368  echo "INSTALL_BLOBS=yes" >> $config_host_mak
7369fi
7370if test "$iovec" = "yes" ; then
7371  echo "CONFIG_IOVEC=y" >> $config_host_mak
7372fi
7373if test "$preadv" = "yes" ; then
7374  echo "CONFIG_PREADV=y" >> $config_host_mak
7375fi
7376if test "$fdt" != "no" ; then
7377  echo "CONFIG_FDT=y" >> $config_host_mak
7378  echo "FDT_CFLAGS=$fdt_cflags" >> $config_host_mak
7379  echo "FDT_LIBS=$fdt_ldflags $fdt_libs" >> $config_host_mak
7380fi
7381if test "$membarrier" = "yes" ; then
7382  echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
7383fi
7384if test "$signalfd" = "yes" ; then
7385  echo "CONFIG_SIGNALFD=y" >> $config_host_mak
7386fi
7387if test "$optreset" = "yes" ; then
7388  echo "HAVE_OPTRESET=y" >> $config_host_mak
7389fi
7390if test "$tcg" = "yes"; then
7391  echo "CONFIG_TCG=y" >> $config_host_mak
7392  if test "$tcg_interpreter" = "yes" ; then
7393    echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
7394  fi
7395fi
7396if test "$fdatasync" = "yes" ; then
7397  echo "CONFIG_FDATASYNC=y" >> $config_host_mak
7398fi
7399if test "$madvise" = "yes" ; then
7400  echo "CONFIG_MADVISE=y" >> $config_host_mak
7401fi
7402if test "$posix_madvise" = "yes" ; then
7403  echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak
7404fi
7405if test "$posix_memalign" = "yes" ; then
7406  echo "CONFIG_POSIX_MEMALIGN=y" >> $config_host_mak
7407fi
7408if test "$zlib" != "no" ; then
7409    echo "CONFIG_ZLIB=y" >> $config_host_mak
7410    echo "ZLIB_CFLAGS=$zlib_cflags" >> $config_host_mak
7411    echo "ZLIB_LIBS=$zlib_libs" >> $config_host_mak
7412fi
7413if test "$spice" = "yes" ; then
7414  echo "CONFIG_SPICE=y" >> $config_host_mak
7415  echo "SPICE_CFLAGS=$spice_cflags" >> $config_host_mak
7416  echo "SPICE_LIBS=$spice_libs" >> $config_host_mak
7417fi
7418
7419if test "$smartcard" = "yes" ; then
7420  echo "CONFIG_SMARTCARD=y" >> $config_host_mak
7421  echo "SMARTCARD_CFLAGS=$libcacard_cflags" >> $config_host_mak
7422  echo "SMARTCARD_LIBS=$libcacard_libs" >> $config_host_mak
7423fi
7424
7425if test "$libusb" = "yes" ; then
7426  echo "CONFIG_USB_LIBUSB=y" >> $config_host_mak
7427  echo "LIBUSB_CFLAGS=$libusb_cflags" >> $config_host_mak
7428  echo "LIBUSB_LIBS=$libusb_libs" >> $config_host_mak
7429fi
7430
7431if test "$usb_redir" = "yes" ; then
7432  echo "CONFIG_USB_REDIR=y" >> $config_host_mak
7433  echo "USB_REDIR_CFLAGS=$usb_redir_cflags" >> $config_host_mak
7434  echo "USB_REDIR_LIBS=$usb_redir_libs" >> $config_host_mak
7435fi
7436
7437if test "$opengl" = "yes" ; then
7438  echo "CONFIG_OPENGL=y" >> $config_host_mak
7439  echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
7440  if test "$opengl_dmabuf" = "yes" ; then
7441    echo "CONFIG_OPENGL_DMABUF=y" >> $config_host_mak
7442  fi
7443fi
7444
7445if test "$gbm" = "yes" ; then
7446    echo "CONFIG_GBM=y" >> $config_host_mak
7447    echo "GBM_LIBS=$gbm_libs" >> $config_host_mak
7448    echo "GBM_CFLAGS=$gbm_cflags" >> $config_host_mak
7449fi
7450
7451
7452if test "$malloc_trim" = "yes" ; then
7453  echo "CONFIG_MALLOC_TRIM=y" >> $config_host_mak
7454fi
7455
7456if test "$avx2_opt" = "yes" ; then
7457  echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
7458fi
7459
7460if test "$avx512f_opt" = "yes" ; then
7461  echo "CONFIG_AVX512F_OPT=y" >> $config_host_mak
7462fi
7463
7464if test "$lzo" = "yes" ; then
7465  echo "CONFIG_LZO=y" >> $config_host_mak
7466  echo "LZO_LIBS=$lzo_libs" >> $config_host_mak
7467fi
7468
7469if test "$snappy" = "yes" ; then
7470  echo "CONFIG_SNAPPY=y" >> $config_host_mak
7471  echo "SNAPPY_LIBS=$snappy_libs" >> $config_host_mak
7472fi
7473
7474if test "$bzip2" = "yes" ; then
7475  echo "CONFIG_BZIP2=y" >> $config_host_mak
7476  echo "BZIP2_LIBS=-lbz2" >> $config_host_mak
7477fi
7478
7479if test "$lzfse" = "yes" ; then
7480  echo "CONFIG_LZFSE=y" >> $config_host_mak
7481  echo "LZFSE_LIBS=-llzfse" >> $config_host_mak
7482fi
7483
7484if test "$zstd" = "yes" ; then
7485  echo "CONFIG_ZSTD=y" >> $config_host_mak
7486  echo "ZSTD_CFLAGS=$zstd_cflags" >> $config_host_mak
7487  echo "ZSTD_LIBS=$zstd_libs" >> $config_host_mak
7488fi
7489
7490if test "$libiscsi" = "yes" ; then
7491  echo "CONFIG_LIBISCSI=m" >> $config_host_mak
7492  echo "LIBISCSI_CFLAGS=$libiscsi_cflags" >> $config_host_mak
7493  echo "LIBISCSI_LIBS=$libiscsi_libs" >> $config_host_mak
7494fi
7495
7496if test "$libnfs" = "yes" ; then
7497  echo "CONFIG_LIBNFS=m" >> $config_host_mak
7498  echo "LIBNFS_LIBS=$libnfs_libs" >> $config_host_mak
7499fi
7500
7501if test "$seccomp" = "yes"; then
7502  echo "CONFIG_SECCOMP=y" >> $config_host_mak
7503  echo "SECCOMP_CFLAGS=$seccomp_cflags" >> $config_host_mak
7504  echo "SECCOMP_LIBS=$seccomp_libs" >> $config_host_mak
7505fi
7506
7507# XXX: suppress that
7508if [ "$bsd" = "yes" ] ; then
7509  echo "CONFIG_BSD=y" >> $config_host_mak
7510fi
7511
7512if test "$localtime_r" = "yes" ; then
7513  echo "CONFIG_LOCALTIME_R=y" >> $config_host_mak
7514fi
7515if test "$qom_cast_debug" = "yes" ; then
7516  echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
7517fi
7518if test "$rbd" = "yes" ; then
7519  echo "CONFIG_RBD=m" >> $config_host_mak
7520  echo "RBD_LIBS=$rbd_libs" >> $config_host_mak
7521fi
7522
7523echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
7524if test "$coroutine_pool" = "yes" ; then
7525  echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
7526else
7527  echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
7528fi
7529
7530if test "$debug_stack_usage" = "yes" ; then
7531  echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
7532fi
7533
7534if test "$crypto_afalg" = "yes" ; then
7535  echo "CONFIG_AF_ALG=y" >> $config_host_mak
7536fi
7537
7538if test "$open_by_handle_at" = "yes" ; then
7539  echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
7540fi
7541
7542if test "$linux_magic_h" = "yes" ; then
7543  echo "CONFIG_LINUX_MAGIC_H=y" >> $config_host_mak
7544fi
7545
7546if test "$valgrind_h" = "yes" ; then
7547  echo "CONFIG_VALGRIND_H=y" >> $config_host_mak
7548fi
7549
7550if test "$have_asan_iface_fiber" = "yes" ; then
7551    echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
7552fi
7553
7554if test "$have_tsan" = "yes" && test "$have_tsan_iface_fiber" = "yes" ; then
7555    echo "CONFIG_TSAN=y" >> $config_host_mak
7556fi
7557
7558if test "$has_environ" = "yes" ; then
7559  echo "CONFIG_HAS_ENVIRON=y" >> $config_host_mak
7560fi
7561
7562if test "$cpuid_h" = "yes" ; then
7563  echo "CONFIG_CPUID_H=y" >> $config_host_mak
7564fi
7565
7566if test "$int128" = "yes" ; then
7567  echo "CONFIG_INT128=y" >> $config_host_mak
7568fi
7569
7570if test "$atomic128" = "yes" ; then
7571  echo "CONFIG_ATOMIC128=y" >> $config_host_mak
7572fi
7573
7574if test "$cmpxchg128" = "yes" ; then
7575  echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
7576fi
7577
7578if test "$atomic64" = "yes" ; then
7579  echo "CONFIG_ATOMIC64=y" >> $config_host_mak
7580fi
7581
7582if test "$attralias" = "yes" ; then
7583  echo "CONFIG_ATTRIBUTE_ALIAS=y" >> $config_host_mak
7584fi
7585
7586if test "$getauxval" = "yes" ; then
7587  echo "CONFIG_GETAUXVAL=y" >> $config_host_mak
7588fi
7589
7590if test "$glusterfs" = "yes" ; then
7591  echo "CONFIG_GLUSTERFS=m" >> $config_host_mak
7592  echo "GLUSTERFS_CFLAGS=$glusterfs_cflags" >> $config_host_mak
7593  echo "GLUSTERFS_LIBS=$glusterfs_libs" >> $config_host_mak
7594fi
7595
7596if test "$glusterfs_xlator_opt" = "yes" ; then
7597  echo "CONFIG_GLUSTERFS_XLATOR_OPT=y" >> $config_host_mak
7598fi
7599
7600if test "$glusterfs_discard" = "yes" ; then
7601  echo "CONFIG_GLUSTERFS_DISCARD=y" >> $config_host_mak
7602fi
7603
7604if test "$glusterfs_fallocate" = "yes" ; then
7605  echo "CONFIG_GLUSTERFS_FALLOCATE=y" >> $config_host_mak
7606fi
7607
7608if test "$glusterfs_zerofill" = "yes" ; then
7609  echo "CONFIG_GLUSTERFS_ZEROFILL=y" >> $config_host_mak
7610fi
7611
7612if test "$glusterfs_ftruncate_has_stat" = "yes" ; then
7613  echo "CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT=y" >> $config_host_mak
7614fi
7615
7616if test "$glusterfs_iocb_has_stat" = "yes" ; then
7617  echo "CONFIG_GLUSTERFS_IOCB_HAS_STAT=y" >> $config_host_mak
7618fi
7619
7620if test "$libssh" = "yes" ; then
7621  echo "CONFIG_LIBSSH=m" >> $config_host_mak
7622  echo "LIBSSH_CFLAGS=$libssh_cflags" >> $config_host_mak
7623  echo "LIBSSH_LIBS=$libssh_libs" >> $config_host_mak
7624fi
7625
7626if test "$live_block_migration" = "yes" ; then
7627  echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
7628fi
7629
7630if test "$tpm" = "yes"; then
7631  echo 'CONFIG_TPM=y' >> $config_host_mak
7632fi
7633
7634echo "TRACE_BACKENDS=$trace_backends" >> $config_host_mak
7635if have_backend "nop"; then
7636  echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
7637fi
7638if have_backend "simple"; then
7639  echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
7640  # Set the appropriate trace file.
7641  trace_file="\"$trace_file-\" FMT_pid"
7642fi
7643if have_backend "log"; then
7644  echo "CONFIG_TRACE_LOG=y" >> $config_host_mak
7645fi
7646if have_backend "ust"; then
7647  echo "CONFIG_TRACE_UST=y" >> $config_host_mak
7648  echo "LTTNG_UST_LIBS=$lttng_ust_libs" >> $config_host_mak
7649  echo "URCU_BP_LIBS=$urcu_bp_libs" >> $config_host_mak
7650fi
7651if have_backend "dtrace"; then
7652  echo "CONFIG_TRACE_DTRACE=y" >> $config_host_mak
7653  if test "$trace_backend_stap" = "yes" ; then
7654    echo "CONFIG_TRACE_SYSTEMTAP=y" >> $config_host_mak
7655  fi
7656fi
7657if have_backend "ftrace"; then
7658  if test "$linux" = "yes" ; then
7659    echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak
7660  else
7661    feature_not_found "ftrace(trace backend)" "ftrace requires Linux"
7662  fi
7663fi
7664if have_backend "syslog"; then
7665  if test "$posix_syslog" = "yes" ; then
7666    echo "CONFIG_TRACE_SYSLOG=y" >> $config_host_mak
7667  else
7668    feature_not_found "syslog(trace backend)" "syslog not available"
7669  fi
7670fi
7671echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
7672
7673if test "$rdma" = "yes" ; then
7674  echo "CONFIG_RDMA=y" >> $config_host_mak
7675  echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
7676fi
7677
7678if test "$pvrdma" = "yes" ; then
7679  echo "CONFIG_PVRDMA=y" >> $config_host_mak
7680fi
7681
7682if test "$have_rtnetlink" = "yes" ; then
7683  echo "CONFIG_RTNETLINK=y" >> $config_host_mak
7684fi
7685
7686if test "$libxml2" = "yes" ; then
7687  echo "CONFIG_LIBXML2=y" >> $config_host_mak
7688  echo "LIBXML2_CFLAGS=$libxml2_cflags" >> $config_host_mak
7689  echo "LIBXML2_LIBS=$libxml2_libs" >> $config_host_mak
7690fi
7691
7692if test "$replication" = "yes" ; then
7693  echo "CONFIG_REPLICATION=y" >> $config_host_mak
7694fi
7695
7696if test "$have_af_vsock" = "yes" ; then
7697  echo "CONFIG_AF_VSOCK=y" >> $config_host_mak
7698fi
7699
7700if test "$have_sysmacros" = "yes" ; then
7701  echo "CONFIG_SYSMACROS=y" >> $config_host_mak
7702fi
7703
7704if test "$have_static_assert" = "yes" ; then
7705  echo "CONFIG_STATIC_ASSERT=y" >> $config_host_mak
7706fi
7707
7708if test "$have_utmpx" = "yes" ; then
7709  echo "HAVE_UTMPX=y" >> $config_host_mak
7710fi
7711if test "$have_getrandom" = "yes" ; then
7712  echo "CONFIG_GETRANDOM=y" >> $config_host_mak
7713fi
7714if test "$ivshmem" = "yes" ; then
7715  echo "CONFIG_IVSHMEM=y" >> $config_host_mak
7716fi
7717if test "$capstone" != "no" ; then
7718  echo "CONFIG_CAPSTONE=y" >> $config_host_mak
7719  echo "CAPSTONE_CFLAGS=$capstone_cflags" >> $config_host_mak
7720  echo "CAPSTONE_LIBS=$capstone_libs" >> $config_host_mak
7721fi
7722if test "$debug_mutex" = "yes" ; then
7723  echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
7724fi
7725
7726# Hold two types of flag:
7727#   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
7728#                                     a thread we have a handle to
7729#   CONFIG_PTHREAD_SETNAME_NP_W_TID - A way of doing it on a particular
7730#                                     platform
7731if test "$pthread_setname_np_w_tid" = "yes" ; then
7732  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
7733  echo "CONFIG_PTHREAD_SETNAME_NP_W_TID=y" >> $config_host_mak
7734elif test "$pthread_setname_np_wo_tid" = "yes" ; then
7735  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
7736  echo "CONFIG_PTHREAD_SETNAME_NP_WO_TID=y" >> $config_host_mak
7737fi
7738
7739if test "$libpmem" = "yes" ; then
7740  echo "CONFIG_LIBPMEM=y" >> $config_host_mak
7741  echo "LIBPMEM_LIBS=$libpmem_libs" >> $config_host_mak
7742  echo "LIBPMEM_CFLAGS=$libpmem_cflags" >> $config_host_mak
7743fi
7744
7745if test "$libdaxctl" = "yes" ; then
7746  echo "CONFIG_LIBDAXCTL=y" >> $config_host_mak
7747fi
7748
7749if test "$bochs" = "yes" ; then
7750  echo "CONFIG_BOCHS=y" >> $config_host_mak
7751fi
7752if test "$cloop" = "yes" ; then
7753  echo "CONFIG_CLOOP=y" >> $config_host_mak
7754fi
7755if test "$dmg" = "yes" ; then
7756  echo "CONFIG_DMG=y" >> $config_host_mak
7757fi
7758if test "$qcow1" = "yes" ; then
7759  echo "CONFIG_QCOW1=y" >> $config_host_mak
7760fi
7761if test "$vdi" = "yes" ; then
7762  echo "CONFIG_VDI=y" >> $config_host_mak
7763fi
7764if test "$vvfat" = "yes" ; then
7765  echo "CONFIG_VVFAT=y" >> $config_host_mak
7766fi
7767if test "$qed" = "yes" ; then
7768  echo "CONFIG_QED=y" >> $config_host_mak
7769fi
7770if test "$parallels" = "yes" ; then
7771  echo "CONFIG_PARALLELS=y" >> $config_host_mak
7772fi
7773if test "$sheepdog" = "yes" ; then
7774  echo "CONFIG_SHEEPDOG=y" >> $config_host_mak
7775fi
7776if test "$pty_h" = "yes" ; then
7777  echo "HAVE_PTY_H=y" >> $config_host_mak
7778fi
7779if test "$have_mlockall" = "yes" ; then
7780  echo "HAVE_MLOCKALL=y" >> $config_host_mak
7781fi
7782if test "$fuzzing" = "yes" ; then
7783  if test "$have_fuzzer" = "yes"; then
7784    FUZZ_LDFLAGS=" -fsanitize=fuzzer"
7785    FUZZ_CFLAGS=" -fsanitize=fuzzer"
7786    QEMU_CFLAGS="$QEMU_CFLAGS -fsanitize=fuzzer-no-link"
7787  else
7788    error_exit "Your compiler doesn't support -fsanitize=fuzzer"
7789    exit 1
7790  fi
7791fi
7792
7793if test "$plugins" = "yes" ; then
7794    echo "CONFIG_PLUGIN=y" >> $config_host_mak
7795    LIBS="-ldl $LIBS"
7796    # Copy the export object list to the build dir
7797    if test "$ld_dynamic_list" = "yes" ; then
7798	echo "CONFIG_HAS_LD_DYNAMIC_LIST=yes" >> $config_host_mak
7799	ld_symbols=qemu-plugins-ld.symbols
7800	cp "$source_path/plugins/qemu-plugins.symbols" $ld_symbols
7801    elif test "$ld_exported_symbols_list" = "yes" ; then
7802	echo "CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST=yes" >> $config_host_mak
7803	ld64_symbols=qemu-plugins-ld64.symbols
7804	echo "# Automatically generated by configure - do not modify" > $ld64_symbols
7805	grep 'qemu_' "$source_path/plugins/qemu-plugins.symbols" | sed 's/;//g' | \
7806	    sed -E 's/^[[:space:]]*(.*)/_\1/' >> $ld64_symbols
7807    else
7808	error_exit \
7809	    "If \$plugins=yes, either \$ld_dynamic_list or " \
7810	    "\$ld_exported_symbols_list should have been set to 'yes'."
7811    fi
7812fi
7813
7814if test -n "$gdb_bin" ; then
7815    echo "HAVE_GDB_BIN=$gdb_bin" >> $config_host_mak
7816fi
7817
7818if test "$secret_keyring" = "yes" ; then
7819  echo "CONFIG_SECRET_KEYRING=y" >> $config_host_mak
7820  if test "$have_keyutils" = "yes" ; then
7821    echo "CONFIG_TEST_SECRET_KEYRING=y" >> $config_host_mak
7822  fi
7823fi
7824
7825if test "$tcg_interpreter" = "yes"; then
7826  QEMU_INCLUDES="-iquote ${source_path}/tcg/tci $QEMU_INCLUDES"
7827elif test "$ARCH" = "sparc64" ; then
7828  QEMU_INCLUDES="-iquote ${source_path}/tcg/sparc $QEMU_INCLUDES"
7829elif test "$ARCH" = "s390x" ; then
7830  QEMU_INCLUDES="-iquote ${source_path}/tcg/s390 $QEMU_INCLUDES"
7831elif test "$ARCH" = "x86_64" || test "$ARCH" = "x32" ; then
7832  QEMU_INCLUDES="-iquote ${source_path}/tcg/i386 $QEMU_INCLUDES"
7833elif test "$ARCH" = "ppc64" ; then
7834  QEMU_INCLUDES="-iquote ${source_path}/tcg/ppc $QEMU_INCLUDES"
7835elif test "$ARCH" = "riscv32" || test "$ARCH" = "riscv64" ; then
7836  QEMU_INCLUDES="-I${source_path}/tcg/riscv $QEMU_INCLUDES"
7837else
7838  QEMU_INCLUDES="-iquote ${source_path}/tcg/${ARCH} $QEMU_INCLUDES"
7839fi
7840
7841echo "ROMS=$roms" >> $config_host_mak
7842echo "MAKE=$make" >> $config_host_mak
7843echo "INSTALL=$install" >> $config_host_mak
7844echo "INSTALL_DIR=$install -d -m 0755" >> $config_host_mak
7845echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
7846echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
7847echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
7848echo "PYTHON=$python" >> $config_host_mak
7849echo "SPHINX_BUILD=$sphinx_build" >> $config_host_mak
7850echo "SPHINX_WERROR=$sphinx_werror" >> $config_host_mak
7851echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
7852echo "MESON=$meson" >> $config_host_mak
7853echo "CC=$cc" >> $config_host_mak
7854if $iasl -h > /dev/null 2>&1; then
7855  echo "IASL=$iasl" >> $config_host_mak
7856fi
7857echo "CXX=$cxx" >> $config_host_mak
7858echo "OBJCC=$objcc" >> $config_host_mak
7859echo "AR=$ar" >> $config_host_mak
7860echo "ARFLAGS=$ARFLAGS" >> $config_host_mak
7861echo "AS=$as" >> $config_host_mak
7862echo "CCAS=$ccas" >> $config_host_mak
7863echo "CPP=$cpp" >> $config_host_mak
7864echo "OBJCOPY=$objcopy" >> $config_host_mak
7865echo "LD=$ld" >> $config_host_mak
7866echo "RANLIB=$ranlib" >> $config_host_mak
7867echo "NM=$nm" >> $config_host_mak
7868echo "PKG_CONFIG=$pkg_config_exe" >> $config_host_mak
7869echo "WINDRES=$windres" >> $config_host_mak
7870echo "CFLAGS=$CFLAGS" >> $config_host_mak
7871echo "CXXFLAGS=$CXXFLAGS" >> $config_host_mak
7872echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
7873echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
7874echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
7875echo "QEMU_INCLUDES=$QEMU_INCLUDES" >> $config_host_mak
7876echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
7877echo "GLIB_LIBS=$glib_libs" >> $config_host_mak
7878if test "$sparse" = "yes" ; then
7879  echo "SPARSE_CFLAGS = -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-non-pointer-null" >> $config_host_mak
7880fi
7881echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
7882echo "LDFLAGS_NOPIE=$LDFLAGS_NOPIE" >> $config_host_mak
7883echo "LD_REL_FLAGS=$LD_REL_FLAGS" >> $config_host_mak
7884echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
7885echo "LIBS+=$LIBS" >> $config_host_mak
7886echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak
7887echo "PTHREAD_LIB=$PTHREAD_LIB" >> $config_host_mak
7888echo "EXESUF=$EXESUF" >> $config_host_mak
7889echo "DSOSUF=$DSOSUF" >> $config_host_mak
7890echo "LDFLAGS_SHARED=$LDFLAGS_SHARED" >> $config_host_mak
7891echo "LIBS_QGA=$libs_qga" >> $config_host_mak
7892echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak
7893echo "TASN1_CFLAGS=$tasn1_cflags" >> $config_host_mak
7894echo "POD2MAN=$POD2MAN" >> $config_host_mak
7895if test "$gcov" = "yes" ; then
7896  echo "CONFIG_GCOV=y" >> $config_host_mak
7897fi
7898
7899if test "$libudev" != "no"; then
7900    echo "CONFIG_LIBUDEV=y" >> $config_host_mak
7901    echo "LIBUDEV_LIBS=$libudev_libs" >> $config_host_mak
7902fi
7903if test "$fuzzing" != "no"; then
7904    echo "CONFIG_FUZZ=y" >> $config_host_mak
7905    echo "FUZZ_CFLAGS=$FUZZ_CFLAGS" >> $config_host_mak
7906    echo "FUZZ_LDFLAGS=$FUZZ_LDFLAGS" >> $config_host_mak
7907fi
7908
7909if test "$edk2_blobs" = "yes" ; then
7910  echo "DECOMPRESS_EDK2_BLOBS=y" >> $config_host_mak
7911fi
7912
7913if test "$rng_none" = "yes"; then
7914  echo "CONFIG_RNG_NONE=y" >> $config_host_mak
7915fi
7916
7917# use included Linux headers
7918if test "$linux" = "yes" ; then
7919  mkdir -p linux-headers
7920  case "$cpu" in
7921  i386|x86_64|x32)
7922    linux_arch=x86
7923    ;;
7924  ppc|ppc64|ppc64le)
7925    linux_arch=powerpc
7926    ;;
7927  s390x)
7928    linux_arch=s390
7929    ;;
7930  aarch64)
7931    linux_arch=arm64
7932    ;;
7933  mips64)
7934    linux_arch=mips
7935    ;;
7936  *)
7937    # For most CPUs the kernel architecture name and QEMU CPU name match.
7938    linux_arch="$cpu"
7939    ;;
7940  esac
7941    # For non-KVM architectures we will not have asm headers
7942    if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
7943      symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
7944    fi
7945fi
7946
7947for target in $target_list; do
7948target_dir="$target"
7949config_target_mak=$target_dir/config-target.mak
7950target_name=$(echo $target | cut -d '-' -f 1)
7951target_aligned_only="no"
7952case "$target_name" in
7953  alpha|hppa|mips64el|mips64|mipsel|mips|mipsn32|mipsn32el|sh4|sh4eb|sparc|sparc64|sparc32plus|xtensa|xtensaeb)
7954  target_aligned_only="yes"
7955  ;;
7956esac
7957target_bigendian="no"
7958case "$target_name" in
7959  armeb|aarch64_be|hppa|lm32|m68k|microblaze|mips|mipsn32|mips64|moxie|or1k|ppc|ppc64|ppc64abi32|s390x|sh4eb|sparc|sparc64|sparc32plus|xtensaeb)
7960  target_bigendian="yes"
7961  ;;
7962esac
7963target_softmmu="no"
7964target_user_only="no"
7965target_linux_user="no"
7966target_bsd_user="no"
7967case "$target" in
7968  ${target_name}-softmmu)
7969    target_softmmu="yes"
7970    ;;
7971  ${target_name}-linux-user)
7972    target_user_only="yes"
7973    target_linux_user="yes"
7974    ;;
7975  ${target_name}-bsd-user)
7976    target_user_only="yes"
7977    target_bsd_user="yes"
7978    ;;
7979  *)
7980    error_exit "Target '$target' not recognised"
7981    exit 1
7982    ;;
7983esac
7984
7985mkdir -p $target_dir
7986echo "# Automatically generated by configure - do not modify" > $config_target_mak
7987
7988bflt="no"
7989mttcg="no"
7990interp_prefix1=$(echo "$interp_prefix" | sed "s/%M/$target_name/g")
7991gdb_xml_files=""
7992
7993TARGET_ARCH="$target_name"
7994TARGET_BASE_ARCH=""
7995TARGET_ABI_DIR=""
7996TARGET_SYSTBL_ABI=""
7997TARGET_SYSTBL=""
7998
7999case "$target_name" in
8000  i386)
8001    mttcg="yes"
8002	gdb_xml_files="i386-32bit.xml"
8003    TARGET_SYSTBL_ABI=i386
8004    TARGET_SYSTBL=syscall_32.tbl
8005  ;;
8006  x86_64)
8007    TARGET_BASE_ARCH=i386
8008    TARGET_SYSTBL_ABI=common,64
8009    TARGET_SYSTBL=syscall_64.tbl
8010    mttcg="yes"
8011    gdb_xml_files="i386-64bit.xml"
8012  ;;
8013  alpha)
8014    mttcg="yes"
8015    TARGET_SYSTBL_ABI=common
8016  ;;
8017  arm|armeb)
8018    TARGET_ARCH=arm
8019    TARGET_SYSTBL_ABI=common,oabi
8020    bflt="yes"
8021    mttcg="yes"
8022    gdb_xml_files="arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml arm-m-profile.xml"
8023  ;;
8024  aarch64|aarch64_be)
8025    TARGET_ARCH=aarch64
8026    TARGET_BASE_ARCH=arm
8027    bflt="yes"
8028    mttcg="yes"
8029    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"
8030  ;;
8031  avr)
8032    gdb_xml_files="avr-cpu.xml"
8033    target_compiler=$cross_cc_avr
8034  ;;
8035  cris)
8036  ;;
8037  hppa)
8038    mttcg="yes"
8039    TARGET_SYSTBL_ABI=common,32
8040  ;;
8041  lm32)
8042  ;;
8043  m68k)
8044    bflt="yes"
8045    gdb_xml_files="cf-core.xml cf-fp.xml m68k-core.xml m68k-fp.xml"
8046    TARGET_SYSTBL_ABI=common
8047  ;;
8048  microblaze|microblazeel)
8049    TARGET_ARCH=microblaze
8050    TARGET_SYSTBL_ABI=common
8051    bflt="yes"
8052    echo "TARGET_ABI32=y" >> $config_target_mak
8053  ;;
8054  mips|mipsel)
8055    mttcg="yes"
8056    TARGET_ARCH=mips
8057    echo "TARGET_ABI_MIPSO32=y" >> $config_target_mak
8058    TARGET_SYSTBL_ABI=o32
8059    TARGET_SYSTBL=syscall_o32.tbl
8060  ;;
8061  mipsn32|mipsn32el)
8062    mttcg="yes"
8063    TARGET_ARCH=mips64
8064    TARGET_BASE_ARCH=mips
8065    echo "TARGET_ABI_MIPSN32=y" >> $config_target_mak
8066    echo "TARGET_ABI32=y" >> $config_target_mak
8067    TARGET_SYSTBL_ABI=n32
8068    TARGET_SYSTBL=syscall_n32.tbl
8069  ;;
8070  mips64|mips64el)
8071    mttcg="no"
8072    TARGET_ARCH=mips64
8073    TARGET_BASE_ARCH=mips
8074    echo "TARGET_ABI_MIPSN64=y" >> $config_target_mak
8075    TARGET_SYSTBL_ABI=n64
8076    TARGET_SYSTBL=syscall_n64.tbl
8077  ;;
8078  moxie)
8079  ;;
8080  nios2)
8081  ;;
8082  or1k)
8083    TARGET_ARCH=openrisc
8084    TARGET_BASE_ARCH=openrisc
8085  ;;
8086  ppc)
8087    gdb_xml_files="power-core.xml power-fpu.xml power-altivec.xml power-spe.xml"
8088    TARGET_SYSTBL_ABI=common,nospu,32
8089  ;;
8090  ppc64)
8091    TARGET_BASE_ARCH=ppc
8092    TARGET_ABI_DIR=ppc
8093    TARGET_SYSTBL_ABI=common,nospu,64
8094    mttcg=yes
8095    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
8096  ;;
8097  ppc64le)
8098    TARGET_ARCH=ppc64
8099    TARGET_BASE_ARCH=ppc
8100    TARGET_ABI_DIR=ppc
8101    TARGET_SYSTBL_ABI=common,nospu,64
8102    mttcg=yes
8103    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
8104  ;;
8105  ppc64abi32)
8106    TARGET_ARCH=ppc64
8107    TARGET_BASE_ARCH=ppc
8108    TARGET_ABI_DIR=ppc
8109    TARGET_SYSTBL_ABI=common,nospu,32
8110    echo "TARGET_ABI32=y" >> $config_target_mak
8111    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
8112  ;;
8113  riscv32)
8114    TARGET_BASE_ARCH=riscv
8115    TARGET_ABI_DIR=riscv
8116    mttcg=yes
8117    gdb_xml_files="riscv-32bit-cpu.xml riscv-32bit-fpu.xml riscv-64bit-fpu.xml riscv-32bit-csr.xml riscv-32bit-virtual.xml"
8118  ;;
8119  riscv64)
8120    TARGET_BASE_ARCH=riscv
8121    TARGET_ABI_DIR=riscv
8122    mttcg=yes
8123    gdb_xml_files="riscv-64bit-cpu.xml riscv-32bit-fpu.xml riscv-64bit-fpu.xml riscv-64bit-csr.xml riscv-64bit-virtual.xml"
8124  ;;
8125  rx)
8126    TARGET_ARCH=rx
8127    bflt="yes"
8128    target_compiler=$cross_cc_rx
8129    gdb_xml_files="rx-core.xml"
8130  ;;
8131  sh4|sh4eb)
8132    TARGET_ARCH=sh4
8133    TARGET_SYSTBL_ABI=common
8134    bflt="yes"
8135  ;;
8136  sparc)
8137    TARGET_SYSTBL_ABI=common,32
8138  ;;
8139  sparc64)
8140    TARGET_BASE_ARCH=sparc
8141    TARGET_SYSTBL_ABI=common,64
8142  ;;
8143  sparc32plus)
8144    TARGET_ARCH=sparc64
8145    TARGET_BASE_ARCH=sparc
8146    TARGET_ABI_DIR=sparc
8147    TARGET_SYSTBL_ABI=common,32
8148    echo "TARGET_ABI32=y" >> $config_target_mak
8149  ;;
8150  s390x)
8151    TARGET_SYSTBL_ABI=common,64
8152    mttcg=yes
8153    gdb_xml_files="s390x-core64.xml s390-acr.xml s390-fpr.xml s390-vx.xml s390-cr.xml s390-virt.xml s390-gs.xml"
8154  ;;
8155  tilegx)
8156  ;;
8157  tricore)
8158  ;;
8159  unicore32)
8160  ;;
8161  xtensa|xtensaeb)
8162    TARGET_ARCH=xtensa
8163    TARGET_SYSTBL_ABI=common
8164    bflt="yes"
8165    mttcg="yes"
8166  ;;
8167  *)
8168    error_exit "Unsupported target CPU"
8169  ;;
8170esac
8171# TARGET_BASE_ARCH needs to be defined after TARGET_ARCH
8172if [ "$TARGET_BASE_ARCH" = "" ]; then
8173  TARGET_BASE_ARCH=$TARGET_ARCH
8174fi
8175if [ "$TARGET_SYSTBL_ABI" != "" ] && [ "$TARGET_SYSTBL" = "" ]; then
8176  TARGET_SYSTBL=syscall.tbl
8177fi
8178
8179symlink "$source_path/Makefile.target" "$target_dir/Makefile"
8180
8181upper() {
8182    echo "$@"| LC_ALL=C tr '[a-z]' '[A-Z]'
8183}
8184
8185target_arch_name="$(upper $TARGET_ARCH)"
8186echo "TARGET_$target_arch_name=y" >> $config_target_mak
8187echo "TARGET_NAME=$target_name" >> $config_target_mak
8188echo "TARGET_BASE_ARCH=$TARGET_BASE_ARCH" >> $config_target_mak
8189if [ "$TARGET_ABI_DIR" = "" ]; then
8190  TARGET_ABI_DIR=$TARGET_ARCH
8191fi
8192echo "TARGET_ABI_DIR=$TARGET_ABI_DIR" >> $config_target_mak
8193if [ "$HOST_VARIANT_DIR" != "" ]; then
8194    echo "HOST_VARIANT_DIR=$HOST_VARIANT_DIR" >> $config_target_mak
8195fi
8196if [ "$TARGET_SYSTBL_ABI" != "" ]; then
8197    echo "TARGET_SYSTBL_ABI=$TARGET_SYSTBL_ABI" >> $config_target_mak
8198    echo "TARGET_SYSTBL=$TARGET_SYSTBL" >> $config_target_mak
8199fi
8200
8201if supported_xen_target $target; then
8202    echo "CONFIG_XEN=y" >> $config_target_mak
8203    if test "$xen_pci_passthrough" = yes; then
8204        echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak"
8205    fi
8206fi
8207if supported_kvm_target $target; then
8208    echo "CONFIG_KVM=y" >> $config_target_mak
8209fi
8210if supported_hax_target $target; then
8211    echo "CONFIG_HAX=y" >> $config_target_mak
8212fi
8213if supported_hvf_target $target; then
8214    echo "CONFIG_HVF=y" >> $config_target_mak
8215fi
8216if supported_whpx_target $target; then
8217    echo "CONFIG_WHPX=y" >> $config_target_mak
8218fi
8219if test "$target_aligned_only" = "yes" ; then
8220  echo "TARGET_ALIGNED_ONLY=y" >> $config_target_mak
8221fi
8222if test "$target_bigendian" = "yes" ; then
8223  echo "TARGET_WORDS_BIGENDIAN=y" >> $config_target_mak
8224fi
8225if test "$target_softmmu" = "yes" ; then
8226  echo "CONFIG_SOFTMMU=y" >> $config_target_mak
8227  if test "$mttcg" = "yes" ; then
8228    echo "TARGET_SUPPORTS_MTTCG=y" >> $config_target_mak
8229  fi
8230fi
8231if test "$target_user_only" = "yes" ; then
8232  echo "CONFIG_USER_ONLY=y" >> $config_target_mak
8233  echo "CONFIG_QEMU_INTERP_PREFIX=\"$interp_prefix1\"" >> $config_target_mak
8234fi
8235if test "$target_linux_user" = "yes" ; then
8236  echo "CONFIG_LINUX_USER=y" >> $config_target_mak
8237fi
8238list=""
8239if test ! -z "$gdb_xml_files" ; then
8240  for x in $gdb_xml_files; do
8241    list="$list gdb-xml/$x"
8242  done
8243  echo "TARGET_XML_FILES=$list" >> $config_target_mak
8244fi
8245
8246if test "$target_user_only" = "yes" && test "$bflt" = "yes"; then
8247  echo "TARGET_HAS_BFLT=y" >> $config_target_mak
8248fi
8249if test "$target_bsd_user" = "yes" ; then
8250  echo "CONFIG_BSD_USER=y" >> $config_target_mak
8251fi
8252
8253
8254# generate QEMU_CFLAGS/QEMU_LDFLAGS for targets
8255
8256cflags=""
8257ldflags=""
8258
8259disas_config() {
8260  echo "CONFIG_${1}_DIS=y" >> $config_target_mak
8261  echo "CONFIG_${1}_DIS=y" >> config-all-disas.mak
8262}
8263
8264for i in $ARCH $TARGET_BASE_ARCH ; do
8265  case "$i" in
8266  alpha)
8267    disas_config "ALPHA"
8268  ;;
8269  aarch64)
8270    if test -n "${cxx}"; then
8271      disas_config "ARM_A64"
8272    fi
8273  ;;
8274  arm)
8275    disas_config "ARM"
8276    if test -n "${cxx}"; then
8277      disas_config "ARM_A64"
8278    fi
8279  ;;
8280  avr)
8281    disas_config "AVR"
8282  ;;
8283  cris)
8284    disas_config "CRIS"
8285  ;;
8286  hppa)
8287    disas_config "HPPA"
8288  ;;
8289  i386|x86_64|x32)
8290    disas_config "I386"
8291  ;;
8292  lm32)
8293    disas_config "LM32"
8294  ;;
8295  m68k)
8296    disas_config "M68K"
8297  ;;
8298  microblaze*)
8299    disas_config "MICROBLAZE"
8300  ;;
8301  mips*)
8302    disas_config "MIPS"
8303    if test -n "${cxx}"; then
8304      disas_config "NANOMIPS"
8305    fi
8306  ;;
8307  moxie*)
8308    disas_config "MOXIE"
8309  ;;
8310  nios2)
8311    disas_config "NIOS2"
8312  ;;
8313  or1k)
8314    disas_config "OPENRISC"
8315  ;;
8316  ppc*)
8317    disas_config "PPC"
8318  ;;
8319  riscv*)
8320    disas_config "RISCV"
8321  ;;
8322  rx)
8323    disas_config "RX"
8324  ;;
8325  s390*)
8326    disas_config "S390"
8327  ;;
8328  sh4)
8329    disas_config "SH4"
8330  ;;
8331  sparc*)
8332    disas_config "SPARC"
8333  ;;
8334  xtensa*)
8335    disas_config "XTENSA"
8336  ;;
8337  esac
8338done
8339if test "$tcg_interpreter" = "yes" ; then
8340  disas_config "TCI"
8341fi
8342
8343# Newer kernels on s390 check for an S390_PGSTE program header and
8344# enable the pgste page table extensions in that case. This makes
8345# the vm.allocate_pgste sysctl unnecessary. We enable this program
8346# header if
8347#  - we build on s390x
8348#  - we build the system emulation for s390x (qemu-system-s390x)
8349#  - KVM is enabled
8350#  - the linker supports --s390-pgste
8351if test "$TARGET_ARCH" = "s390x" && test "$target_softmmu" = "yes" && \
8352        test "$ARCH" = "s390x" && test "$kvm" = "yes"; then
8353    if ld_has --s390-pgste ; then
8354        ldflags="-Wl,--s390-pgste $ldflags"
8355    fi
8356fi
8357
8358echo "QEMU_LDFLAGS+=$ldflags" >> $config_target_mak
8359echo "QEMU_CFLAGS+=$cflags" >> $config_target_mak
8360
8361done # for target in $targets
8362
8363echo "PIXMAN_CFLAGS=$pixman_cflags" >> $config_host_mak
8364echo "PIXMAN_LIBS=$pixman_libs" >> $config_host_mak
8365
8366if [ "$fdt" = "git" ]; then
8367  echo "config-host.h: dtc/all" >> $config_host_mak
8368fi
8369if [ "$capstone" = "git" -o "$capstone" = "internal" ]; then
8370  echo "config-host.h: capstone/all" >> $config_host_mak
8371fi
8372if test -n "$LIBCAPSTONE"; then
8373  echo "LIBCAPSTONE=$LIBCAPSTONE" >> $config_host_mak
8374fi
8375
8376if test "$numa" = "yes"; then
8377  echo "CONFIG_NUMA=y" >> $config_host_mak
8378  echo "NUMA_LIBS=$numa_libs" >> $config_host_mak
8379fi
8380
8381if test "$ccache_cpp2" = "yes"; then
8382  echo "export CCACHE_CPP2=y" >> $config_host_mak
8383fi
8384
8385if test "$safe_stack" = "yes"; then
8386  echo "CONFIG_SAFESTACK=y" >> $config_host_mak
8387fi
8388
8389# If we're using a separate build tree, set it up now.
8390# DIRS are directories which we simply mkdir in the build tree;
8391# LINKS are things to symlink back into the source tree
8392# (these can be both files and directories).
8393# Caution: do not add files or directories here using wildcards. This
8394# will result in problems later if a new file matching the wildcard is
8395# added to the source tree -- nothing will cause configure to be rerun
8396# so the build tree will be missing the link back to the new file, and
8397# tests might fail. Prefer to keep the relevant files in their own
8398# directory and symlink the directory instead.
8399DIRS="tests tests/tcg tests/tcg/lm32 tests/qapi-schema tests/qtest/libqos"
8400DIRS="$DIRS tests/qtest tests/qemu-iotests tests/vm tests/fp tests/qgraph"
8401DIRS="$DIRS docs docs/interop fsdev scsi"
8402DIRS="$DIRS pc-bios/optionrom pc-bios/s390-ccw"
8403DIRS="$DIRS roms/seabios"
8404LINKS="Makefile"
8405LINKS="$LINKS tests/tcg/lm32/Makefile po/Makefile"
8406LINKS="$LINKS tests/tcg/Makefile.target"
8407LINKS="$LINKS tests/plugin/Makefile"
8408LINKS="$LINKS pc-bios/optionrom/Makefile pc-bios/keymaps"
8409LINKS="$LINKS pc-bios/s390-ccw/Makefile"
8410LINKS="$LINKS roms/seabios/Makefile"
8411LINKS="$LINKS pc-bios/qemu-icon.bmp"
8412LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
8413LINKS="$LINKS tests/acceptance tests/data"
8414LINKS="$LINKS tests/qemu-iotests/check"
8415LINKS="$LINKS python"
8416for bios_file in \
8417    $source_path/pc-bios/*.bin \
8418    $source_path/pc-bios/*.lid \
8419    $source_path/pc-bios/*.rom \
8420    $source_path/pc-bios/*.dtb \
8421    $source_path/pc-bios/*.img \
8422    $source_path/pc-bios/openbios-* \
8423    $source_path/pc-bios/u-boot.* \
8424    $source_path/pc-bios/edk2-*.fd.bz2 \
8425    $source_path/pc-bios/palcode-*
8426do
8427    LINKS="$LINKS pc-bios/$(basename $bios_file)"
8428done
8429mkdir -p $DIRS
8430for f in $LINKS ; do
8431    if [ -e "$source_path/$f" ] && [ "$pwd_is_source_path" != "y" ]; then
8432        symlink "$source_path/$f" "$f"
8433    fi
8434done
8435
8436(for i in $cross_cc_vars; do
8437  export $i
8438done
8439export target_list source_path use_containers
8440$source_path/tests/tcg/configure.sh)
8441
8442# temporary config to build submodules
8443for rom in seabios; do
8444    config_mak=roms/$rom/config.mak
8445    echo "# Automatically generated by configure - do not modify" > $config_mak
8446    echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
8447    echo "AS=$as" >> $config_mak
8448    echo "CCAS=$ccas" >> $config_mak
8449    echo "CC=$cc" >> $config_mak
8450    echo "BCC=bcc" >> $config_mak
8451    echo "CPP=$cpp" >> $config_mak
8452    echo "OBJCOPY=objcopy" >> $config_mak
8453    echo "IASL=$iasl" >> $config_mak
8454    echo "LD=$ld" >> $config_mak
8455    echo "RANLIB=$ranlib" >> $config_mak
8456done
8457
8458# set up qemu-iotests in this build directory
8459iotests_common_env="tests/qemu-iotests/common.env"
8460
8461echo "# Automatically generated by configure - do not modify" > "$iotests_common_env"
8462echo >> "$iotests_common_env"
8463echo "export PYTHON='$python'" >> "$iotests_common_env"
8464
8465if test "$skip_meson" = no; then
8466cross="config-meson.cross.new"
8467meson_quote() {
8468    echo "['$(echo $* | sed "s/ /','/g")']"
8469}
8470
8471echo "# Automatically generated by configure - do not modify" > $cross
8472echo "[properties]" >> $cross
8473test -z "$cxx" && echo "link_language = 'c'" >> $cross
8474echo "[binaries]" >> $cross
8475echo "c = $(meson_quote $cc)" >> $cross
8476test -n "$cxx" && echo "cpp = $(meson_quote $cxx)" >> $cross
8477echo "ar = $(meson_quote $ar)" >> $cross
8478echo "nm = $(meson_quote $nm)" >> $cross
8479echo "pkgconfig = $(meson_quote $pkg_config_exe)" >> $cross
8480echo "ranlib = $(meson_quote $ranlib)" >> $cross
8481echo "strip = $(meson_quote $strip)" >> $cross
8482echo "windres = $(meson_quote $windres)" >> $cross
8483if test -n "$cross_prefix"; then
8484    cross_arg="--cross-file config-meson.cross"
8485    # Hack: Meson expects an absolute path for the *build* machine
8486    # for the prefix, so add a slash in front of a Windows path that
8487    # includes a drive letter.
8488    #
8489    # See https://github.com/mesonbuild/meson/issues/7577.
8490    echo "[host_machine]" >> $cross
8491    if test "$mingw32" = "yes" ; then
8492        echo "system = 'windows'" >> $cross
8493        case $prefix in
8494            ?:*) pre_prefix=/ ;;
8495        esac
8496    fi
8497    case "$ARCH" in
8498        i386|x86_64)
8499            echo "cpu_family = 'x86'" >> $cross
8500            ;;
8501        ppc64le)
8502            echo "cpu_family = 'ppc64'" >> $cross
8503            ;;
8504        *)
8505            echo "cpu_family = '$ARCH'" >> $cross
8506            ;;
8507    esac
8508    echo "cpu = '$cpu'" >> $cross
8509    if test "$bigendian" = "yes" ; then
8510        echo "endian = 'big'" >> $cross
8511    else
8512        echo "endian = 'little'" >> $cross
8513    fi
8514else
8515    cross_arg="--native-file config-meson.cross"
8516fi
8517mv $cross config-meson.cross
8518
8519rm -rf meson-private meson-info meson-logs
8520NINJA=$PWD/ninjatool $meson setup \
8521        --prefix "${pre_prefix}$prefix" \
8522        --libdir "${pre_prefix}$libdir" \
8523        --libexecdir "${pre_prefix}$libexecdir" \
8524        --bindir "${pre_prefix}$bindir" \
8525        --includedir "${pre_prefix}$includedir" \
8526        --datadir "${pre_prefix}$datadir" \
8527        --mandir "${pre_prefix}$mandir" \
8528        --sysconfdir "${pre_prefix}$sysconfdir" \
8529        --localstatedir "${pre_prefix}$local_statedir" \
8530        -Doptimization=$(if test "$debug" = yes; then echo 0; else echo 2; fi) \
8531        -Ddebug=$(if test "$debug_info" = yes; then echo true; else echo false; fi) \
8532        -Dwerror=$(if test "$werror" = yes; then echo true; else echo false; fi) \
8533        -Dstrip=$(if test "$strip_opt" = yes; then echo true; else echo false; fi) \
8534        -Db_pie=$(if test "$pie" = yes; then echo true; else echo false; fi) \
8535        -Db_coverage=$(if test "$gcov" = yes; then echo true; else echo false; fi) \
8536        $cross_arg \
8537        "$PWD" "$source_path"
8538
8539if test "$?" -ne 0 ; then
8540    error_exit "meson setup failed"
8541fi
8542touch ninjatool.stamp
8543fi
8544
8545# Save the configure command line for later reuse.
8546cat <<EOD >config.status
8547#!/bin/sh
8548# Generated by configure.
8549# Run this file to recreate the current configuration.
8550# Compiler output produced by configure, useful for debugging
8551# configure, is in config.log if it exists.
8552EOD
8553
8554preserve_env() {
8555    envname=$1
8556
8557    eval envval=\$$envname
8558
8559    if test -n "$envval"
8560    then
8561	echo "$envname='$envval'" >> config.status
8562	echo "export $envname" >> config.status
8563    else
8564	echo "unset $envname" >> config.status
8565    fi
8566}
8567
8568# Preserve various env variables that influence what
8569# features/build target configure will detect
8570preserve_env AR
8571preserve_env AS
8572preserve_env CC
8573preserve_env CPP
8574preserve_env CXX
8575preserve_env INSTALL
8576preserve_env LD
8577preserve_env LD_LIBRARY_PATH
8578preserve_env LIBTOOL
8579preserve_env MAKE
8580preserve_env NM
8581preserve_env OBJCOPY
8582preserve_env PATH
8583preserve_env PKG_CONFIG
8584preserve_env PKG_CONFIG_LIBDIR
8585preserve_env PKG_CONFIG_PATH
8586preserve_env PYTHON
8587preserve_env SDL2_CONFIG
8588preserve_env SMBD
8589preserve_env STRIP
8590preserve_env WINDRES
8591
8592printf "exec" >>config.status
8593for i in "$0" "$@"; do
8594  test "$i" = --skip-meson || printf " '%s'" "$i" >>config.status
8595done
8596echo ' "$@"' >>config.status
8597chmod +x config.status
8598
8599rm -r "$TMPDIR1"
8600