MAINTAINERS: add simplebench
[qemu.git] / configure
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.
8 CLICOLOR_FORCE= GREP_OPTIONS=
9 unset CLICOLOR_FORCE GREP_OPTIONS
10
11 # Don't allow CCACHE, if present, to use cached results of compile tests!
12 export CCACHE_RECACHE=yes
13
14 # Temporary directory used for files created while
15 # configure runs. Since it is in the build directory
16 # we can safely blow away any previous version of it
17 # (and we need not jump through hoops to try to delete
18 # it when configure exits.)
19 TMPDIR1="config-temp"
20 rm -rf "${TMPDIR1}"
21 mkdir -p "${TMPDIR1}"
22 if [ $? -ne 0 ]; then
23     echo "ERROR: failed to create temporary directory"
24     exit 1
25 fi
26
27 TMPB="qemu-conf"
28 TMPC="${TMPDIR1}/${TMPB}.c"
29 TMPO="${TMPDIR1}/${TMPB}.o"
30 TMPCXX="${TMPDIR1}/${TMPB}.cxx"
31 TMPE="${TMPDIR1}/${TMPB}.exe"
32 TMPMO="${TMPDIR1}/${TMPB}.mo"
33 TMPTXT="${TMPDIR1}/${TMPB}.txt"
34
35 rm -f config.log
36
37 # Print a helpful header at the top of config.log
38 echo "# QEMU configure log $(date)" >> config.log
39 printf "# Configured with:" >> config.log
40 printf " '%s'" "$0" "$@" >> config.log
41 echo >> config.log
42 echo "#" >> config.log
43
44 print_error() {
45     (echo
46     echo "ERROR: $1"
47     while test -n "$2"; do
48         echo "       $2"
49         shift
50     done
51     echo) >&2
52 }
53
54 error_exit() {
55     print_error "$@"
56     exit 1
57 }
58
59 do_compiler() {
60     # Run the compiler, capturing its output to the log. First argument
61     # is compiler binary to execute.
62     local compiler="$1"
63     shift
64     if test -n "$BASH_VERSION"; then eval '
65         echo >>config.log "
66 funcs: ${FUNCNAME[*]}
67 lines: ${BASH_LINENO[*]}"
68     '; fi
69     echo $compiler "$@" >> config.log
70     $compiler "$@" >> config.log 2>&1 || return $?
71     # Test passed. If this is an --enable-werror build, rerun
72     # the test with -Werror and bail out if it fails. This
73     # makes warning-generating-errors in configure test code
74     # obvious to developers.
75     if test "$werror" != "yes"; then
76         return 0
77     fi
78     # Don't bother rerunning the compile if we were already using -Werror
79     case "$*" in
80         *-Werror*)
81            return 0
82         ;;
83     esac
84     echo $compiler -Werror "$@" >> config.log
85     $compiler -Werror "$@" >> config.log 2>&1 && return $?
86     error_exit "configure test passed without -Werror but failed with -Werror." \
87         "This is probably a bug in the configure script. The failing command" \
88         "will be at the bottom of config.log." \
89         "You can run configure with --disable-werror to bypass this check."
90 }
91
92 do_cc() {
93     do_compiler "$cc" "$@"
94 }
95
96 do_cxx() {
97     do_compiler "$cxx" "$@"
98 }
99
100 update_cxxflags() {
101     # Set QEMU_CXXFLAGS from QEMU_CFLAGS by filtering out those
102     # options which some versions of GCC's C++ compiler complain about
103     # because they only make sense for C programs.
104     QEMU_CXXFLAGS="$QEMU_CXXFLAGS -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"
105
106     for arg in $QEMU_CFLAGS; do
107         case $arg in
108             -Wstrict-prototypes|-Wmissing-prototypes|-Wnested-externs|\
109             -Wold-style-declaration|-Wold-style-definition|-Wredundant-decls)
110                 ;;
111             -std=gnu99)
112                 QEMU_CXXFLAGS=${QEMU_CXXFLAGS:+$QEMU_CXXFLAGS }"-std=gnu++98"
113                 ;;
114             *)
115                 QEMU_CXXFLAGS=${QEMU_CXXFLAGS:+$QEMU_CXXFLAGS }$arg
116                 ;;
117         esac
118     done
119 }
120
121 compile_object() {
122   local_cflags="$1"
123   do_cc $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
124 }
125
126 compile_prog() {
127   local_cflags="$1"
128   local_ldflags="$2"
129   do_cc $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC $QEMU_LDFLAGS $local_ldflags
130 }
131
132 # symbolically link $1 to $2.  Portable version of "ln -sf".
133 symlink() {
134   rm -rf "$2"
135   mkdir -p "$(dirname "$2")"
136   ln -s "$1" "$2"
137 }
138
139 # check whether a command is available to this shell (may be either an
140 # executable or a builtin)
141 has() {
142     type "$1" >/dev/null 2>&1
143 }
144
145 # search for an executable in PATH
146 path_of() {
147     local_command="$1"
148     local_ifs="$IFS"
149     local_dir=""
150
151     # pathname has a dir component?
152     if [ "${local_command#*/}" != "$local_command" ]; then
153         if [ -x "$local_command" ] && [ ! -d "$local_command" ]; then
154             echo "$local_command"
155             return 0
156         fi
157     fi
158     if [ -z "$local_command" ]; then
159         return 1
160     fi
161
162     IFS=:
163     for local_dir in $PATH; do
164         if [ -x "$local_dir/$local_command" ] && [ ! -d "$local_dir/$local_command" ]; then
165             echo "$local_dir/$local_command"
166             IFS="${local_ifs:-$(printf ' \t\n')}"
167             return 0
168         fi
169     done
170     # not found
171     IFS="${local_ifs:-$(printf ' \t\n')}"
172     return 1
173 }
174
175 have_backend () {
176     echo "$trace_backends" | grep "$1" >/dev/null
177 }
178
179 glob() {
180     eval test -z '"${1#'"$2"'}"'
181 }
182
183 supported_hax_target() {
184     test "$hax" = "yes" || return 1
185     glob "$1" "*-softmmu" || return 1
186     case "${1%-softmmu}" in
187         i386|x86_64)
188             return 0
189         ;;
190     esac
191     return 1
192 }
193
194 supported_kvm_target() {
195     test "$kvm" = "yes" || return 1
196     glob "$1" "*-softmmu" || return 1
197     case "${1%-softmmu}:$cpu" in
198         arm:arm | aarch64:aarch64 | \
199         i386:i386 | i386:x86_64 | i386:x32 | \
200         x86_64:i386 | x86_64:x86_64 | x86_64:x32 | \
201         mips:mips | mipsel:mips | \
202         ppc:ppc | ppc64:ppc | ppc:ppc64 | ppc64:ppc64 | ppc64:ppc64le | \
203         s390x:s390x)
204             return 0
205         ;;
206     esac
207     return 1
208 }
209
210 supported_xen_target() {
211     test "$xen" = "yes" || return 1
212     glob "$1" "*-softmmu" || return 1
213     # Only i386 and x86_64 provide the xenpv machine.
214     case "${1%-softmmu}" in
215         i386|x86_64)
216             return 0
217         ;;
218     esac
219     return 1
220 }
221
222 supported_hvf_target() {
223     test "$hvf" = "yes" || return 1
224     glob "$1" "*-softmmu" || return 1
225     case "${1%-softmmu}" in
226         x86_64)
227             return 0
228         ;;
229     esac
230     return 1
231 }
232
233 supported_whpx_target() {
234     test "$whpx" = "yes" || return 1
235     glob "$1" "*-softmmu" || return 1
236     case "${1%-softmmu}" in
237         i386|x86_64)
238             return 0
239         ;;
240     esac
241     return 1
242 }
243
244 supported_target() {
245     case "$1" in
246         *-softmmu)
247             ;;
248         *-linux-user)
249             if test "$linux" != "yes"; then
250                 print_error "Target '$target' is only available on a Linux host"
251                 return 1
252             fi
253             ;;
254         *-bsd-user)
255             if test "$bsd" != "yes"; then
256                 print_error "Target '$target' is only available on a BSD host"
257                 return 1
258             fi
259             ;;
260         *)
261             print_error "Invalid target name '$target'"
262             return 1
263             ;;
264     esac
265     test "$tcg" = "yes" && return 0
266     supported_kvm_target "$1" && return 0
267     supported_xen_target "$1" && return 0
268     supported_hax_target "$1" && return 0
269     supported_hvf_target "$1" && return 0
270     supported_whpx_target "$1" && return 0
271     print_error "TCG disabled, but hardware accelerator not available for '$target'"
272     return 1
273 }
274
275
276 ld_has() {
277     $ld --help 2>/dev/null | grep ".$1" >/dev/null 2>&1
278 }
279
280 # make source path absolute
281 source_path=$(cd "$(dirname -- "$0")"; pwd)
282
283 if printf %s\\n "$source_path" "$PWD" | grep -q "[[:space:]:]";
284 then
285   error_exit "main directory cannot contain spaces nor colons"
286 fi
287
288 # default parameters
289 cpu=""
290 iasl="iasl"
291 interp_prefix="/usr/gnemul/qemu-%M"
292 static="no"
293 cross_prefix=""
294 audio_drv_list=""
295 block_drv_rw_whitelist=""
296 block_drv_ro_whitelist=""
297 host_cc="cc"
298 libs_cpu=""
299 libs_softmmu=""
300 libs_tools=""
301 audio_win_int=""
302 libs_qga=""
303 debug_info="yes"
304 stack_protector=""
305 use_containers="yes"
306
307 if test -e "$source_path/.git"
308 then
309     git_update=yes
310     git_submodules="ui/keycodemapdb"
311     git_submodules="$git_submodules tests/fp/berkeley-testfloat-3"
312     git_submodules="$git_submodules tests/fp/berkeley-softfloat-3"
313 else
314     git_update=no
315     git_submodules=""
316
317     if ! test -f "$source_path/ui/keycodemapdb/README"
318     then
319         echo
320         echo "ERROR: missing file $source_path/ui/keycodemapdb/README"
321         echo
322         echo "This is not a GIT checkout but module content appears to"
323         echo "be missing. Do not use 'git archive' or GitHub download links"
324         echo "to acquire QEMU source archives. Non-GIT builds are only"
325         echo "supported with source archives linked from:"
326         echo
327         echo "  https://www.qemu.org/download/#source"
328         echo
329         echo "Developers working with GIT can use scripts/archive-source.sh"
330         echo "if they need to create valid source archives."
331         echo
332         exit 1
333     fi
334 fi
335 git="git"
336
337 # Don't accept a target_list environment variable.
338 unset target_list
339 unset target_list_exclude
340
341 # Default value for a variable defining feature "foo".
342 #  * foo="no"  feature will only be used if --enable-foo arg is given
343 #  * foo=""    feature will be searched for, and if found, will be used
344 #              unless --disable-foo is given
345 #  * foo="yes" this value will only be set by --enable-foo flag.
346 #              feature will searched for,
347 #              if not found, configure exits with error
348 #
349 # Always add --enable-foo and --disable-foo command line args.
350 # Distributions want to ensure that several features are compiled in, and it
351 # is impossible without a --enable-foo that exits if a feature is not found.
352
353 brlapi=""
354 curl=""
355 curses=""
356 docs=""
357 fdt=""
358 netmap="no"
359 sdl=""
360 sdl_image=""
361 virtfs=""
362 mpath=""
363 vnc="yes"
364 sparse="no"
365 vde=""
366 vnc_sasl=""
367 vnc_jpeg=""
368 vnc_png=""
369 xkbcommon=""
370 xen=""
371 xen_ctrl_version=""
372 xen_pci_passthrough=""
373 linux_aio=""
374 linux_io_uring=""
375 cap_ng=""
376 attr=""
377 libattr=""
378 xfs=""
379 tcg="yes"
380 membarrier=""
381 vhost_net=""
382 vhost_crypto=""
383 vhost_scsi=""
384 vhost_vsock=""
385 vhost_user=""
386 vhost_user_fs=""
387 kvm="no"
388 hax="no"
389 hvf="no"
390 whpx="no"
391 rdma=""
392 pvrdma=""
393 gprof="no"
394 debug_tcg="no"
395 debug="no"
396 sanitizers="no"
397 fortify_source=""
398 strip_opt="yes"
399 tcg_interpreter="no"
400 bigendian="no"
401 mingw32="no"
402 gcov="no"
403 gcov_tool="gcov"
404 EXESUF=""
405 DSOSUF=".so"
406 LDFLAGS_SHARED="-shared"
407 modules="no"
408 module_upgrades="no"
409 prefix="/usr/local"
410 mandir="\${prefix}/share/man"
411 datadir="\${prefix}/share"
412 firmwarepath="\${prefix}/share/qemu-firmware"
413 qemu_docdir="\${prefix}/share/doc/qemu"
414 bindir="\${prefix}/bin"
415 libdir="\${prefix}/lib"
416 libexecdir="\${prefix}/libexec"
417 includedir="\${prefix}/include"
418 sysconfdir="\${prefix}/etc"
419 local_statedir="\${prefix}/var"
420 confsuffix="/qemu"
421 slirp=""
422 oss_lib=""
423 bsd="no"
424 linux="no"
425 solaris="no"
426 profiler="no"
427 cocoa="no"
428 softmmu="yes"
429 linux_user="no"
430 bsd_user="no"
431 blobs="yes"
432 edk2_blobs="no"
433 pkgversion=""
434 pie=""
435 qom_cast_debug="yes"
436 trace_backends="log"
437 trace_file="trace"
438 spice=""
439 rbd=""
440 smartcard=""
441 libusb=""
442 usb_redir=""
443 opengl=""
444 opengl_dmabuf="no"
445 cpuid_h="no"
446 avx2_opt=""
447 zlib="yes"
448 capstone=""
449 lzo=""
450 snappy=""
451 bzip2=""
452 lzfse=""
453 zstd=""
454 guest_agent=""
455 guest_agent_with_vss="no"
456 guest_agent_ntddscsi="no"
457 guest_agent_msi=""
458 vss_win32_sdk=""
459 win_sdk="no"
460 want_tools=""
461 libiscsi=""
462 libnfs=""
463 coroutine=""
464 coroutine_pool=""
465 debug_stack_usage="no"
466 crypto_afalg="no"
467 seccomp=""
468 glusterfs=""
469 glusterfs_xlator_opt="no"
470 glusterfs_discard="no"
471 glusterfs_fallocate="no"
472 glusterfs_zerofill="no"
473 glusterfs_ftruncate_has_stat="no"
474 glusterfs_iocb_has_stat="no"
475 gtk=""
476 gtk_gl="no"
477 tls_priority="NORMAL"
478 gnutls=""
479 nettle=""
480 nettle_xts="no"
481 gcrypt=""
482 gcrypt_hmac="no"
483 gcrypt_xts="no"
484 qemu_private_xts="yes"
485 auth_pam=""
486 vte=""
487 virglrenderer=""
488 tpm=""
489 libssh=""
490 live_block_migration="yes"
491 numa=""
492 tcmalloc="no"
493 jemalloc="no"
494 replication="yes"
495 vxhs=""
496 bochs="yes"
497 cloop="yes"
498 dmg="yes"
499 qcow1="yes"
500 vdi="yes"
501 vvfat="yes"
502 qed="yes"
503 parallels="yes"
504 sheepdog="yes"
505 libxml2=""
506 debug_mutex="no"
507 libpmem=""
508 default_devices="yes"
509 plugins="no"
510 fuzzing="no"
511
512 supported_cpu="no"
513 supported_os="no"
514 bogus_os="no"
515 malloc_trim=""
516
517 # parse CC options first
518 for opt do
519   optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
520   case "$opt" in
521   --cross-prefix=*) cross_prefix="$optarg"
522   ;;
523   --cc=*) CC="$optarg"
524   ;;
525   --cxx=*) CXX="$optarg"
526   ;;
527   --cpu=*) cpu="$optarg"
528   ;;
529   --extra-cflags=*) QEMU_CFLAGS="$QEMU_CFLAGS $optarg"
530                     QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg"
531   ;;
532   --extra-cxxflags=*) QEMU_CXXFLAGS="$QEMU_CXXFLAGS $optarg"
533   ;;
534   --extra-ldflags=*) QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg"
535                      EXTRA_LDFLAGS="$optarg"
536   ;;
537   --enable-debug-info) debug_info="yes"
538   ;;
539   --disable-debug-info) debug_info="no"
540   ;;
541   --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"
542   ;;
543   --cross-cc-cflags-*) cc_arch=${opt#--cross-cc-flags-}; cc_arch=${cc_arch%%=*}
544                       eval "cross_cc_cflags_${cc_arch}=\$optarg"
545                       cross_cc_vars="$cross_cc_vars cross_cc_cflags_${cc_arch}"
546   ;;
547   --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}
548                 cc_archs="$cc_archs $cc_arch"
549                 eval "cross_cc_${cc_arch}=\$optarg"
550                 cross_cc_vars="$cross_cc_vars cross_cc_${cc_arch}"
551   ;;
552   esac
553 done
554 # OS specific
555 # Using uname is really, really broken.  Once we have the right set of checks
556 # we can eliminate its usage altogether.
557
558 # Preferred compiler:
559 #  ${CC} (if set)
560 #  ${cross_prefix}gcc (if cross-prefix specified)
561 #  system compiler
562 if test -z "${CC}${cross_prefix}"; then
563   cc="$host_cc"
564 else
565   cc="${CC-${cross_prefix}gcc}"
566 fi
567
568 if test -z "${CXX}${cross_prefix}"; then
569   cxx="c++"
570 else
571   cxx="${CXX-${cross_prefix}g++}"
572 fi
573
574 ar="${AR-${cross_prefix}ar}"
575 as="${AS-${cross_prefix}as}"
576 ccas="${CCAS-$cc}"
577 cpp="${CPP-$cc -E}"
578 objcopy="${OBJCOPY-${cross_prefix}objcopy}"
579 ld="${LD-${cross_prefix}ld}"
580 ranlib="${RANLIB-${cross_prefix}ranlib}"
581 nm="${NM-${cross_prefix}nm}"
582 strip="${STRIP-${cross_prefix}strip}"
583 windres="${WINDRES-${cross_prefix}windres}"
584 pkg_config_exe="${PKG_CONFIG-${cross_prefix}pkg-config}"
585 query_pkg_config() {
586     "${pkg_config_exe}" ${QEMU_PKG_CONFIG_FLAGS} "$@"
587 }
588 pkg_config=query_pkg_config
589 sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
590
591 # If the user hasn't specified ARFLAGS, default to 'rv', just as make does.
592 ARFLAGS="${ARFLAGS-rv}"
593
594 # default flags for all hosts
595 # We use -fwrapv to tell the compiler that we require a C dialect where
596 # left shift of signed integers is well defined and has the expected
597 # 2s-complement style results. (Both clang and gcc agree that it
598 # provides these semantics.)
599 QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv -std=gnu99 $QEMU_CFLAGS"
600 QEMU_CFLAGS="-Wall -Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS"
601 QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS"
602 QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
603 QEMU_INCLUDES="-iquote . -iquote \$(SRC_PATH) -iquote \$(SRC_PATH)/accel/tcg -iquote \$(SRC_PATH)/include"
604 QEMU_INCLUDES="$QEMU_INCLUDES -iquote \$(SRC_PATH)/disas/libvixl"
605 if test "$debug_info" = "yes"; then
606     CFLAGS="-g $CFLAGS"
607 fi
608
609 # running configure in the source tree?
610 # we know that's the case if configure is there.
611 if test -f "./configure"; then
612     pwd_is_source_path="y"
613 else
614     pwd_is_source_path="n"
615 fi
616
617 check_define() {
618 cat > $TMPC <<EOF
619 #if !defined($1)
620 #error $1 not defined
621 #endif
622 int main(void) { return 0; }
623 EOF
624   compile_object
625 }
626
627 check_include() {
628 cat > $TMPC <<EOF
629 #include <$1>
630 int main(void) { return 0; }
631 EOF
632   compile_object
633 }
634
635 write_c_skeleton() {
636     cat > $TMPC <<EOF
637 int main(void) { return 0; }
638 EOF
639 }
640
641 write_c_fuzzer_skeleton() {
642     cat > $TMPC <<EOF
643 #include <stdint.h>
644 #include <sys/types.h>
645 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
646 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
647 EOF
648 }
649
650 if check_define __linux__ ; then
651   targetos="Linux"
652 elif check_define _WIN32 ; then
653   targetos='MINGW32'
654 elif check_define __OpenBSD__ ; then
655   targetos='OpenBSD'
656 elif check_define __sun__ ; then
657   targetos='SunOS'
658 elif check_define __HAIKU__ ; then
659   targetos='Haiku'
660 elif check_define __FreeBSD__ ; then
661   targetos='FreeBSD'
662 elif check_define __FreeBSD_kernel__ && check_define __GLIBC__; then
663   targetos='GNU/kFreeBSD'
664 elif check_define __DragonFly__ ; then
665   targetos='DragonFly'
666 elif check_define __NetBSD__; then
667   targetos='NetBSD'
668 elif check_define __APPLE__; then
669   targetos='Darwin'
670 else
671   # This is a fatal error, but don't report it yet, because we
672   # might be going to just print the --help text, or it might
673   # be the result of a missing compiler.
674   targetos='bogus'
675   bogus_os='yes'
676 fi
677
678 # Some host OSes need non-standard checks for which CPU to use.
679 # Note that these checks are broken for cross-compilation: if you're
680 # cross-compiling to one of these OSes then you'll need to specify
681 # the correct CPU with the --cpu option.
682 case $targetos in
683 Darwin)
684   # on Leopard most of the system is 32-bit, so we have to ask the kernel if we can
685   # run 64-bit userspace code.
686   # If the user didn't specify a CPU explicitly and the kernel says this is
687   # 64 bit hw, then assume x86_64. Otherwise fall through to the usual detection code.
688   if test -z "$cpu" && test "$(sysctl -n hw.optional.x86_64)" = "1"; then
689     cpu="x86_64"
690   fi
691   ;;
692 SunOS)
693   # $(uname -m) returns i86pc even on an x86_64 box, so default based on isainfo
694   if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then
695     cpu="x86_64"
696   fi
697 esac
698
699 if test ! -z "$cpu" ; then
700   # command line argument
701   :
702 elif check_define __i386__ ; then
703   cpu="i386"
704 elif check_define __x86_64__ ; then
705   if check_define __ILP32__ ; then
706     cpu="x32"
707   else
708     cpu="x86_64"
709   fi
710 elif check_define __sparc__ ; then
711   if check_define __arch64__ ; then
712     cpu="sparc64"
713   else
714     cpu="sparc"
715   fi
716 elif check_define _ARCH_PPC ; then
717   if check_define _ARCH_PPC64 ; then
718     if check_define _LITTLE_ENDIAN ; then
719       cpu="ppc64le"
720     else
721       cpu="ppc64"
722     fi
723   else
724     cpu="ppc"
725   fi
726 elif check_define __mips__ ; then
727   cpu="mips"
728 elif check_define __s390__ ; then
729   if check_define __s390x__ ; then
730     cpu="s390x"
731   else
732     cpu="s390"
733   fi
734 elif check_define __riscv ; then
735   if check_define _LP64 ; then
736     cpu="riscv64"
737   else
738     cpu="riscv32"
739   fi
740 elif check_define __arm__ ; then
741   cpu="arm"
742 elif check_define __aarch64__ ; then
743   cpu="aarch64"
744 else
745   cpu=$(uname -m)
746 fi
747
748 ARCH=
749 # Normalise host CPU name and set ARCH.
750 # Note that this case should only have supported host CPUs, not guests.
751 case "$cpu" in
752   ppc|ppc64|s390x|sparc64|x32|riscv32|riscv64)
753     supported_cpu="yes"
754   ;;
755   ppc64le)
756     ARCH="ppc64"
757     supported_cpu="yes"
758   ;;
759   i386|i486|i586|i686|i86pc|BePC)
760     cpu="i386"
761     supported_cpu="yes"
762   ;;
763   x86_64|amd64)
764     cpu="x86_64"
765     supported_cpu="yes"
766   ;;
767   armv*b|armv*l|arm)
768     cpu="arm"
769     supported_cpu="yes"
770   ;;
771   aarch64)
772     cpu="aarch64"
773     supported_cpu="yes"
774   ;;
775   mips*)
776     cpu="mips"
777     supported_cpu="yes"
778   ;;
779   sparc|sun4[cdmuv])
780     cpu="sparc"
781     supported_cpu="yes"
782   ;;
783   *)
784     # This will result in either an error or falling back to TCI later
785     ARCH=unknown
786   ;;
787 esac
788 if test -z "$ARCH"; then
789   ARCH="$cpu"
790 fi
791
792 # OS specific
793
794 # host *BSD for user mode
795 HOST_VARIANT_DIR=""
796
797 case $targetos in
798 MINGW32*)
799   mingw32="yes"
800   hax="yes"
801   vhost_user="no"
802   audio_possible_drivers="dsound sdl"
803   if check_include dsound.h; then
804     audio_drv_list="dsound"
805   else
806     audio_drv_list=""
807   fi
808   supported_os="yes"
809 ;;
810 GNU/kFreeBSD)
811   bsd="yes"
812   audio_drv_list="oss try-sdl"
813   audio_possible_drivers="oss sdl pa"
814 ;;
815 FreeBSD)
816   bsd="yes"
817   make="${MAKE-gmake}"
818   audio_drv_list="oss try-sdl"
819   audio_possible_drivers="oss sdl pa"
820   # needed for kinfo_getvmmap(3) in libutil.h
821   LIBS="-lutil $LIBS"
822   # needed for kinfo_getproc
823   libs_qga="-lutil $libs_qga"
824   netmap=""  # enable netmap autodetect
825   HOST_VARIANT_DIR="freebsd"
826   supported_os="yes"
827 ;;
828 DragonFly)
829   bsd="yes"
830   make="${MAKE-gmake}"
831   audio_drv_list="oss try-sdl"
832   audio_possible_drivers="oss sdl pa"
833   HOST_VARIANT_DIR="dragonfly"
834 ;;
835 NetBSD)
836   bsd="yes"
837   hax="yes"
838   make="${MAKE-gmake}"
839   audio_drv_list="oss try-sdl"
840   audio_possible_drivers="oss sdl"
841   oss_lib="-lossaudio"
842   HOST_VARIANT_DIR="netbsd"
843   supported_os="yes"
844 ;;
845 OpenBSD)
846   bsd="yes"
847   make="${MAKE-gmake}"
848   audio_drv_list="try-sdl"
849   audio_possible_drivers="sdl"
850   HOST_VARIANT_DIR="openbsd"
851   supported_os="yes"
852 ;;
853 Darwin)
854   bsd="yes"
855   darwin="yes"
856   hax="yes"
857   hvf="yes"
858   LDFLAGS_SHARED="-bundle -undefined dynamic_lookup"
859   if [ "$cpu" = "x86_64" ] ; then
860     QEMU_CFLAGS="-arch x86_64 $QEMU_CFLAGS"
861     QEMU_LDFLAGS="-arch x86_64 $QEMU_LDFLAGS"
862   fi
863   cocoa="yes"
864   audio_drv_list="coreaudio try-sdl"
865   audio_possible_drivers="coreaudio sdl"
866   QEMU_LDFLAGS="-framework CoreFoundation -framework IOKit $QEMU_LDFLAGS"
867   libs_softmmu="-F/System/Library/Frameworks -framework Cocoa -framework IOKit $libs_softmmu"
868   # Disable attempts to use ObjectiveC features in os/object.h since they
869   # won't work when we're compiling with gcc as a C compiler.
870   QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS"
871   HOST_VARIANT_DIR="darwin"
872   supported_os="yes"
873 ;;
874 SunOS)
875   solaris="yes"
876   make="${MAKE-gmake}"
877   install="${INSTALL-ginstall}"
878   smbd="${SMBD-/usr/sfw/sbin/smbd}"
879   if test -f /usr/include/sys/soundcard.h ; then
880     audio_drv_list="oss try-sdl"
881   fi
882   audio_possible_drivers="oss sdl"
883 # needed for CMSG_ macros in sys/socket.h
884   QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS"
885 # needed for TIOCWIN* defines in termios.h
886   QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
887   QEMU_CFLAGS="-std=gnu99 $QEMU_CFLAGS"
888   solarisnetlibs="-lsocket -lnsl -lresolv"
889   LIBS="$solarisnetlibs $LIBS"
890   libs_qga="$solarisnetlibs $libs_qga"
891 ;;
892 Haiku)
893   haiku="yes"
894   QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS $QEMU_CFLAGS"
895   LIBS="-lposix_error_mapper -lnetwork $LIBS"
896 ;;
897 Linux)
898   audio_drv_list="try-pa oss"
899   audio_possible_drivers="oss alsa sdl pa"
900   linux="yes"
901   linux_user="yes"
902   kvm="yes"
903   QEMU_INCLUDES="-isystem \$(SRC_PATH)/linux-headers -isystem $PWD/linux-headers $QEMU_INCLUDES"
904   supported_os="yes"
905   libudev="yes"
906 ;;
907 esac
908
909 if [ "$bsd" = "yes" ] ; then
910   if [ "$darwin" != "yes" ] ; then
911     bsd_user="yes"
912   fi
913 fi
914
915 : ${make=${MAKE-make}}
916 : ${install=${INSTALL-install}}
917 # We prefer python 3.x. A bare 'python' is traditionally
918 # python 2.x, but some distros have it as python 3.x, so
919 # we check that too
920 python=
921 for binary in "${PYTHON-python3}" python
922 do
923     if has "$binary"
924     then
925         python=$(command -v "$binary")
926         break
927     fi
928 done
929
930 sphinx_build=
931 for binary in sphinx-build-3 sphinx-build
932 do
933     if has "$binary"
934     then
935         sphinx_build=$(command -v "$binary")
936         break
937     fi
938 done
939
940 # Check for ancillary tools used in testing
941 genisoimage=
942 for binary in genisoimage
943 do
944     if has $binary
945     then
946         genisoimage=$(command -v "$binary")
947         break
948     fi
949 done
950
951 : ${smbd=${SMBD-/usr/sbin/smbd}}
952
953 # Default objcc to clang if available, otherwise use CC
954 if has clang; then
955   objcc=clang
956 else
957   objcc="$cc"
958 fi
959
960 if test "$mingw32" = "yes" ; then
961   EXESUF=".exe"
962   DSOSUF=".dll"
963   # MinGW needs -mthreads for TLS and macro _MT.
964   QEMU_CFLAGS="-mthreads $QEMU_CFLAGS"
965   LIBS="-lwinmm -lws2_32 $LIBS"
966   write_c_skeleton;
967   if compile_prog "" "-liberty" ; then
968     LIBS="-liberty $LIBS"
969   fi
970   prefix="c:/Program Files/QEMU"
971   mandir="\${prefix}"
972   datadir="\${prefix}"
973   qemu_docdir="\${prefix}"
974   bindir="\${prefix}"
975   sysconfdir="\${prefix}"
976   local_statedir=
977   confsuffix=""
978   libs_qga="-lws2_32 -lwinmm -lpowrprof -lwtsapi32 -lwininet -liphlpapi -lnetapi32 $libs_qga"
979 fi
980
981 werror=""
982
983 for opt do
984   optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
985   case "$opt" in
986   --help|-h) show_help=yes
987   ;;
988   --version|-V) exec cat $source_path/VERSION
989   ;;
990   --prefix=*) prefix="$optarg"
991   ;;
992   --interp-prefix=*) interp_prefix="$optarg"
993   ;;
994   --cross-prefix=*)
995   ;;
996   --cc=*)
997   ;;
998   --host-cc=*) host_cc="$optarg"
999   ;;
1000   --cxx=*)
1001   ;;
1002   --iasl=*) iasl="$optarg"
1003   ;;
1004   --objcc=*) objcc="$optarg"
1005   ;;
1006   --make=*) make="$optarg"
1007   ;;
1008   --install=*) install="$optarg"
1009   ;;
1010   --python=*) python="$optarg"
1011   ;;
1012   --sphinx-build=*) sphinx_build="$optarg"
1013   ;;
1014   --gcov=*) gcov_tool="$optarg"
1015   ;;
1016   --smbd=*) smbd="$optarg"
1017   ;;
1018   --extra-cflags=*)
1019   ;;
1020   --extra-cxxflags=*)
1021   ;;
1022   --extra-ldflags=*)
1023   ;;
1024   --enable-debug-info)
1025   ;;
1026   --disable-debug-info)
1027   ;;
1028   --cross-cc-*)
1029   ;;
1030   --enable-modules)
1031       modules="yes"
1032   ;;
1033   --disable-modules)
1034       modules="no"
1035   ;;
1036   --disable-module-upgrades) module_upgrades="no"
1037   ;;
1038   --enable-module-upgrades) module_upgrades="yes"
1039   ;;
1040   --cpu=*)
1041   ;;
1042   --target-list=*) target_list="$optarg"
1043                    if test "$target_list_exclude"; then
1044                        error_exit "Can't mix --target-list with --target-list-exclude"
1045                    fi
1046   ;;
1047   --target-list-exclude=*) target_list_exclude="$optarg"
1048                    if test "$target_list"; then
1049                        error_exit "Can't mix --target-list-exclude with --target-list"
1050                    fi
1051   ;;
1052   --enable-trace-backends=*) trace_backends="$optarg"
1053   ;;
1054   # XXX: backwards compatibility
1055   --enable-trace-backend=*) trace_backends="$optarg"
1056   ;;
1057   --with-trace-file=*) trace_file="$optarg"
1058   ;;
1059   --with-default-devices) default_devices="yes"
1060   ;;
1061   --without-default-devices) default_devices="no"
1062   ;;
1063   --enable-gprof) gprof="yes"
1064   ;;
1065   --enable-gcov) gcov="yes"
1066   ;;
1067   --static)
1068     static="yes"
1069     QEMU_LDFLAGS="-static $QEMU_LDFLAGS"
1070     QEMU_PKG_CONFIG_FLAGS="--static $QEMU_PKG_CONFIG_FLAGS"
1071   ;;
1072   --mandir=*) mandir="$optarg"
1073   ;;
1074   --bindir=*) bindir="$optarg"
1075   ;;
1076   --libdir=*) libdir="$optarg"
1077   ;;
1078   --libexecdir=*) libexecdir="$optarg"
1079   ;;
1080   --includedir=*) includedir="$optarg"
1081   ;;
1082   --datadir=*) datadir="$optarg"
1083   ;;
1084   --with-confsuffix=*) confsuffix="$optarg"
1085   ;;
1086   --docdir=*) qemu_docdir="$optarg"
1087   ;;
1088   --sysconfdir=*) sysconfdir="$optarg"
1089   ;;
1090   --localstatedir=*) local_statedir="$optarg"
1091   ;;
1092   --firmwarepath=*) firmwarepath="$optarg"
1093   ;;
1094   --host=*|--build=*|\
1095   --disable-dependency-tracking|\
1096   --sbindir=*|--sharedstatedir=*|\
1097   --oldincludedir=*|--datarootdir=*|--infodir=*|--localedir=*|\
1098   --htmldir=*|--dvidir=*|--pdfdir=*|--psdir=*)
1099     # These switches are silently ignored, for compatibility with
1100     # autoconf-generated configure scripts. This allows QEMU's
1101     # configure to be used by RPM and similar macros that set
1102     # lots of directory switches by default.
1103   ;;
1104   --disable-sdl) sdl="no"
1105   ;;
1106   --enable-sdl) sdl="yes"
1107   ;;
1108   --disable-sdl-image) sdl_image="no"
1109   ;;
1110   --enable-sdl-image) sdl_image="yes"
1111   ;;
1112   --disable-qom-cast-debug) qom_cast_debug="no"
1113   ;;
1114   --enable-qom-cast-debug) qom_cast_debug="yes"
1115   ;;
1116   --disable-virtfs) virtfs="no"
1117   ;;
1118   --enable-virtfs) virtfs="yes"
1119   ;;
1120   --disable-mpath) mpath="no"
1121   ;;
1122   --enable-mpath) mpath="yes"
1123   ;;
1124   --disable-vnc) vnc="no"
1125   ;;
1126   --enable-vnc) vnc="yes"
1127   ;;
1128   --oss-lib=*) oss_lib="$optarg"
1129   ;;
1130   --audio-drv-list=*) audio_drv_list="$optarg"
1131   ;;
1132   --block-drv-rw-whitelist=*|--block-drv-whitelist=*) block_drv_rw_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
1133   ;;
1134   --block-drv-ro-whitelist=*) block_drv_ro_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
1135   ;;
1136   --enable-debug-tcg) debug_tcg="yes"
1137   ;;
1138   --disable-debug-tcg) debug_tcg="no"
1139   ;;
1140   --enable-debug)
1141       # Enable debugging options that aren't excessively noisy
1142       debug_tcg="yes"
1143       debug_mutex="yes"
1144       debug="yes"
1145       strip_opt="no"
1146       fortify_source="no"
1147   ;;
1148   --enable-sanitizers) sanitizers="yes"
1149   ;;
1150   --disable-sanitizers) sanitizers="no"
1151   ;;
1152   --enable-sparse) sparse="yes"
1153   ;;
1154   --disable-sparse) sparse="no"
1155   ;;
1156   --disable-strip) strip_opt="no"
1157   ;;
1158   --disable-vnc-sasl) vnc_sasl="no"
1159   ;;
1160   --enable-vnc-sasl) vnc_sasl="yes"
1161   ;;
1162   --disable-vnc-jpeg) vnc_jpeg="no"
1163   ;;
1164   --enable-vnc-jpeg) vnc_jpeg="yes"
1165   ;;
1166   --disable-vnc-png) vnc_png="no"
1167   ;;
1168   --enable-vnc-png) vnc_png="yes"
1169   ;;
1170   --disable-slirp) slirp="no"
1171   ;;
1172   --enable-slirp=git) slirp="git"
1173   ;;
1174   --enable-slirp=system) slirp="system"
1175   ;;
1176   --disable-vde) vde="no"
1177   ;;
1178   --enable-vde) vde="yes"
1179   ;;
1180   --disable-netmap) netmap="no"
1181   ;;
1182   --enable-netmap) netmap="yes"
1183   ;;
1184   --disable-xen) xen="no"
1185   ;;
1186   --enable-xen) xen="yes"
1187   ;;
1188   --disable-xen-pci-passthrough) xen_pci_passthrough="no"
1189   ;;
1190   --enable-xen-pci-passthrough) xen_pci_passthrough="yes"
1191   ;;
1192   --disable-brlapi) brlapi="no"
1193   ;;
1194   --enable-brlapi) brlapi="yes"
1195   ;;
1196   --disable-kvm) kvm="no"
1197   ;;
1198   --enable-kvm) kvm="yes"
1199   ;;
1200   --disable-hax) hax="no"
1201   ;;
1202   --enable-hax) hax="yes"
1203   ;;
1204   --disable-hvf) hvf="no"
1205   ;;
1206   --enable-hvf) hvf="yes"
1207   ;;
1208   --disable-whpx) whpx="no"
1209   ;;
1210   --enable-whpx) whpx="yes"
1211   ;;
1212   --disable-tcg-interpreter) tcg_interpreter="no"
1213   ;;
1214   --enable-tcg-interpreter) tcg_interpreter="yes"
1215   ;;
1216   --disable-cap-ng)  cap_ng="no"
1217   ;;
1218   --enable-cap-ng) cap_ng="yes"
1219   ;;
1220   --disable-tcg) tcg="no"
1221   ;;
1222   --enable-tcg) tcg="yes"
1223   ;;
1224   --disable-malloc-trim) malloc_trim="no"
1225   ;;
1226   --enable-malloc-trim) malloc_trim="yes"
1227   ;;
1228   --disable-spice) spice="no"
1229   ;;
1230   --enable-spice) spice="yes"
1231   ;;
1232   --disable-libiscsi) libiscsi="no"
1233   ;;
1234   --enable-libiscsi) libiscsi="yes"
1235   ;;
1236   --disable-libnfs) libnfs="no"
1237   ;;
1238   --enable-libnfs) libnfs="yes"
1239   ;;
1240   --enable-profiler) profiler="yes"
1241   ;;
1242   --disable-cocoa) cocoa="no"
1243   ;;
1244   --enable-cocoa)
1245       cocoa="yes" ;
1246       audio_drv_list="coreaudio $(echo $audio_drv_list | sed s,coreaudio,,g)"
1247   ;;
1248   --disable-system) softmmu="no"
1249   ;;
1250   --enable-system) softmmu="yes"
1251   ;;
1252   --disable-user)
1253       linux_user="no" ;
1254       bsd_user="no" ;
1255   ;;
1256   --enable-user) ;;
1257   --disable-linux-user) linux_user="no"
1258   ;;
1259   --enable-linux-user) linux_user="yes"
1260   ;;
1261   --disable-bsd-user) bsd_user="no"
1262   ;;
1263   --enable-bsd-user) bsd_user="yes"
1264   ;;
1265   --enable-pie) pie="yes"
1266   ;;
1267   --disable-pie) pie="no"
1268   ;;
1269   --enable-werror) werror="yes"
1270   ;;
1271   --disable-werror) werror="no"
1272   ;;
1273   --enable-stack-protector) stack_protector="yes"
1274   ;;
1275   --disable-stack-protector) stack_protector="no"
1276   ;;
1277   --disable-curses) curses="no"
1278   ;;
1279   --enable-curses) curses="yes"
1280   ;;
1281   --disable-iconv) iconv="no"
1282   ;;
1283   --enable-iconv) iconv="yes"
1284   ;;
1285   --disable-curl) curl="no"
1286   ;;
1287   --enable-curl) curl="yes"
1288   ;;
1289   --disable-fdt) fdt="no"
1290   ;;
1291   --enable-fdt) fdt="yes"
1292   ;;
1293   --disable-linux-aio) linux_aio="no"
1294   ;;
1295   --enable-linux-aio) linux_aio="yes"
1296   ;;
1297   --disable-linux-io-uring) linux_io_uring="no"
1298   ;;
1299   --enable-linux-io-uring) linux_io_uring="yes"
1300   ;;
1301   --disable-attr) attr="no"
1302   ;;
1303   --enable-attr) attr="yes"
1304   ;;
1305   --disable-membarrier) membarrier="no"
1306   ;;
1307   --enable-membarrier) membarrier="yes"
1308   ;;
1309   --disable-blobs) blobs="no"
1310   ;;
1311   --with-pkgversion=*) pkgversion="$optarg"
1312   ;;
1313   --with-coroutine=*) coroutine="$optarg"
1314   ;;
1315   --disable-coroutine-pool) coroutine_pool="no"
1316   ;;
1317   --enable-coroutine-pool) coroutine_pool="yes"
1318   ;;
1319   --enable-debug-stack-usage) debug_stack_usage="yes"
1320   ;;
1321   --enable-crypto-afalg) crypto_afalg="yes"
1322   ;;
1323   --disable-crypto-afalg) crypto_afalg="no"
1324   ;;
1325   --disable-docs) docs="no"
1326   ;;
1327   --enable-docs) docs="yes"
1328   ;;
1329   --disable-vhost-net) vhost_net="no"
1330   ;;
1331   --enable-vhost-net) vhost_net="yes"
1332   ;;
1333   --disable-vhost-crypto) vhost_crypto="no"
1334   ;;
1335   --enable-vhost-crypto) vhost_crypto="yes"
1336   ;;
1337   --disable-vhost-scsi) vhost_scsi="no"
1338   ;;
1339   --enable-vhost-scsi) vhost_scsi="yes"
1340   ;;
1341   --disable-vhost-vsock) vhost_vsock="no"
1342   ;;
1343   --enable-vhost-vsock) vhost_vsock="yes"
1344   ;;
1345   --disable-vhost-user-fs) vhost_user_fs="no"
1346   ;;
1347   --enable-vhost-user-fs) vhost_user_fs="yes"
1348   ;;
1349   --disable-opengl) opengl="no"
1350   ;;
1351   --enable-opengl) opengl="yes"
1352   ;;
1353   --disable-rbd) rbd="no"
1354   ;;
1355   --enable-rbd) rbd="yes"
1356   ;;
1357   --disable-xfsctl) xfs="no"
1358   ;;
1359   --enable-xfsctl) xfs="yes"
1360   ;;
1361   --disable-smartcard) smartcard="no"
1362   ;;
1363   --enable-smartcard) smartcard="yes"
1364   ;;
1365   --disable-libusb) libusb="no"
1366   ;;
1367   --enable-libusb) libusb="yes"
1368   ;;
1369   --disable-usb-redir) usb_redir="no"
1370   ;;
1371   --enable-usb-redir) usb_redir="yes"
1372   ;;
1373   --disable-zlib-test) zlib="no"
1374   ;;
1375   --disable-lzo) lzo="no"
1376   ;;
1377   --enable-lzo) lzo="yes"
1378   ;;
1379   --disable-snappy) snappy="no"
1380   ;;
1381   --enable-snappy) snappy="yes"
1382   ;;
1383   --disable-bzip2) bzip2="no"
1384   ;;
1385   --enable-bzip2) bzip2="yes"
1386   ;;
1387   --enable-lzfse) lzfse="yes"
1388   ;;
1389   --disable-lzfse) lzfse="no"
1390   ;;
1391   --disable-zstd) zstd="no"
1392   ;;
1393   --enable-zstd) zstd="yes"
1394   ;;
1395   --enable-guest-agent) guest_agent="yes"
1396   ;;
1397   --disable-guest-agent) guest_agent="no"
1398   ;;
1399   --enable-guest-agent-msi) guest_agent_msi="yes"
1400   ;;
1401   --disable-guest-agent-msi) guest_agent_msi="no"
1402   ;;
1403   --with-vss-sdk) vss_win32_sdk=""
1404   ;;
1405   --with-vss-sdk=*) vss_win32_sdk="$optarg"
1406   ;;
1407   --without-vss-sdk) vss_win32_sdk="no"
1408   ;;
1409   --with-win-sdk) win_sdk=""
1410   ;;
1411   --with-win-sdk=*) win_sdk="$optarg"
1412   ;;
1413   --without-win-sdk) win_sdk="no"
1414   ;;
1415   --enable-tools) want_tools="yes"
1416   ;;
1417   --disable-tools) want_tools="no"
1418   ;;
1419   --enable-seccomp) seccomp="yes"
1420   ;;
1421   --disable-seccomp) seccomp="no"
1422   ;;
1423   --disable-glusterfs) glusterfs="no"
1424   ;;
1425   --disable-avx2) avx2_opt="no"
1426   ;;
1427   --enable-avx2) avx2_opt="yes"
1428   ;;
1429   --disable-avx512f) avx512f_opt="no"
1430   ;;
1431   --enable-avx512f) avx512f_opt="yes"
1432   ;;
1433
1434   --enable-glusterfs) glusterfs="yes"
1435   ;;
1436   --disable-virtio-blk-data-plane|--enable-virtio-blk-data-plane)
1437       echo "$0: $opt is obsolete, virtio-blk data-plane is always on" >&2
1438   ;;
1439   --enable-vhdx|--disable-vhdx)
1440       echo "$0: $opt is obsolete, VHDX driver is always built" >&2
1441   ;;
1442   --enable-uuid|--disable-uuid)
1443       echo "$0: $opt is obsolete, UUID support is always built" >&2
1444   ;;
1445   --disable-gtk) gtk="no"
1446   ;;
1447   --enable-gtk) gtk="yes"
1448   ;;
1449   --tls-priority=*) tls_priority="$optarg"
1450   ;;
1451   --disable-gnutls) gnutls="no"
1452   ;;
1453   --enable-gnutls) gnutls="yes"
1454   ;;
1455   --disable-nettle) nettle="no"
1456   ;;
1457   --enable-nettle) nettle="yes"
1458   ;;
1459   --disable-gcrypt) gcrypt="no"
1460   ;;
1461   --enable-gcrypt) gcrypt="yes"
1462   ;;
1463   --disable-auth-pam) auth_pam="no"
1464   ;;
1465   --enable-auth-pam) auth_pam="yes"
1466   ;;
1467   --enable-rdma) rdma="yes"
1468   ;;
1469   --disable-rdma) rdma="no"
1470   ;;
1471   --enable-pvrdma) pvrdma="yes"
1472   ;;
1473   --disable-pvrdma) pvrdma="no"
1474   ;;
1475   --disable-vte) vte="no"
1476   ;;
1477   --enable-vte) vte="yes"
1478   ;;
1479   --disable-virglrenderer) virglrenderer="no"
1480   ;;
1481   --enable-virglrenderer) virglrenderer="yes"
1482   ;;
1483   --disable-tpm) tpm="no"
1484   ;;
1485   --enable-tpm) tpm="yes"
1486   ;;
1487   --disable-libssh) libssh="no"
1488   ;;
1489   --enable-libssh) libssh="yes"
1490   ;;
1491   --disable-live-block-migration) live_block_migration="no"
1492   ;;
1493   --enable-live-block-migration) live_block_migration="yes"
1494   ;;
1495   --disable-numa) numa="no"
1496   ;;
1497   --enable-numa) numa="yes"
1498   ;;
1499   --disable-libxml2) libxml2="no"
1500   ;;
1501   --enable-libxml2) libxml2="yes"
1502   ;;
1503   --disable-tcmalloc) tcmalloc="no"
1504   ;;
1505   --enable-tcmalloc) tcmalloc="yes"
1506   ;;
1507   --disable-jemalloc) jemalloc="no"
1508   ;;
1509   --enable-jemalloc) jemalloc="yes"
1510   ;;
1511   --disable-replication) replication="no"
1512   ;;
1513   --enable-replication) replication="yes"
1514   ;;
1515   --disable-vxhs) vxhs="no"
1516   ;;
1517   --enable-vxhs) vxhs="yes"
1518   ;;
1519   --disable-bochs) bochs="no"
1520   ;;
1521   --enable-bochs) bochs="yes"
1522   ;;
1523   --disable-cloop) cloop="no"
1524   ;;
1525   --enable-cloop) cloop="yes"
1526   ;;
1527   --disable-dmg) dmg="no"
1528   ;;
1529   --enable-dmg) dmg="yes"
1530   ;;
1531   --disable-qcow1) qcow1="no"
1532   ;;
1533   --enable-qcow1) qcow1="yes"
1534   ;;
1535   --disable-vdi) vdi="no"
1536   ;;
1537   --enable-vdi) vdi="yes"
1538   ;;
1539   --disable-vvfat) vvfat="no"
1540   ;;
1541   --enable-vvfat) vvfat="yes"
1542   ;;
1543   --disable-qed) qed="no"
1544   ;;
1545   --enable-qed) qed="yes"
1546   ;;
1547   --disable-parallels) parallels="no"
1548   ;;
1549   --enable-parallels) parallels="yes"
1550   ;;
1551   --disable-sheepdog) sheepdog="no"
1552   ;;
1553   --enable-sheepdog) sheepdog="yes"
1554   ;;
1555   --disable-vhost-user) vhost_user="no"
1556   ;;
1557   --enable-vhost-user) vhost_user="yes"
1558   ;;
1559   --disable-vhost-kernel) vhost_kernel="no"
1560   ;;
1561   --enable-vhost-kernel) vhost_kernel="yes"
1562   ;;
1563   --disable-capstone) capstone="no"
1564   ;;
1565   --enable-capstone) capstone="yes"
1566   ;;
1567   --enable-capstone=git) capstone="git"
1568   ;;
1569   --enable-capstone=system) capstone="system"
1570   ;;
1571   --with-git=*) git="$optarg"
1572   ;;
1573   --enable-git-update) git_update=yes
1574   ;;
1575   --disable-git-update) git_update=no
1576   ;;
1577   --enable-debug-mutex) debug_mutex=yes
1578   ;;
1579   --disable-debug-mutex) debug_mutex=no
1580   ;;
1581   --enable-libpmem) libpmem=yes
1582   ;;
1583   --disable-libpmem) libpmem=no
1584   ;;
1585   --enable-xkbcommon) xkbcommon=yes
1586   ;;
1587   --disable-xkbcommon) xkbcommon=no
1588   ;;
1589   --enable-plugins) plugins="yes"
1590   ;;
1591   --disable-plugins) plugins="no"
1592   ;;
1593   --enable-containers) use_containers="yes"
1594   ;;
1595   --disable-containers) use_containers="no"
1596   ;;
1597   --enable-fuzzing) fuzzing=yes
1598   ;;
1599   --disable-fuzzing) fuzzing=no
1600   ;;
1601   *)
1602       echo "ERROR: unknown option $opt"
1603       echo "Try '$0 --help' for more information"
1604       exit 1
1605   ;;
1606   esac
1607 done
1608
1609 case "$cpu" in
1610     ppc)
1611            CPU_CFLAGS="-m32"
1612            QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS"
1613            ;;
1614     ppc64)
1615            CPU_CFLAGS="-m64"
1616            QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1617            ;;
1618     sparc)
1619            CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc"
1620            QEMU_LDFLAGS="-m32 -mv8plus $QEMU_LDFLAGS"
1621            ;;
1622     sparc64)
1623            CPU_CFLAGS="-m64 -mcpu=ultrasparc"
1624            QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1625            ;;
1626     s390)
1627            CPU_CFLAGS="-m31"
1628            QEMU_LDFLAGS="-m31 $QEMU_LDFLAGS"
1629            ;;
1630     s390x)
1631            CPU_CFLAGS="-m64"
1632            QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1633            ;;
1634     i386)
1635            CPU_CFLAGS="-m32"
1636            QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS"
1637            ;;
1638     x86_64)
1639            # ??? Only extremely old AMD cpus do not have cmpxchg16b.
1640            # If we truly care, we should simply detect this case at
1641            # runtime and generate the fallback to serial emulation.
1642            CPU_CFLAGS="-m64 -mcx16"
1643            QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1644            ;;
1645     x32)
1646            CPU_CFLAGS="-mx32"
1647            QEMU_LDFLAGS="-mx32 $QEMU_LDFLAGS"
1648            ;;
1649     # No special flags required for other host CPUs
1650 esac
1651
1652 eval "cross_cc_${cpu}=\$host_cc"
1653 cross_cc_vars="$cross_cc_vars cross_cc_${cpu}"
1654 QEMU_CFLAGS="$CPU_CFLAGS $QEMU_CFLAGS"
1655
1656 # For user-mode emulation the host arch has to be one we explicitly
1657 # support, even if we're using TCI.
1658 if [ "$ARCH" = "unknown" ]; then
1659   bsd_user="no"
1660   linux_user="no"
1661 fi
1662
1663 default_target_list=""
1664
1665 mak_wilds=""
1666
1667 if [ "$softmmu" = "yes" ]; then
1668     mak_wilds="${mak_wilds} $source_path/default-configs/*-softmmu.mak"
1669 fi
1670 if [ "$linux_user" = "yes" ]; then
1671     mak_wilds="${mak_wilds} $source_path/default-configs/*-linux-user.mak"
1672 fi
1673 if [ "$bsd_user" = "yes" ]; then
1674     mak_wilds="${mak_wilds} $source_path/default-configs/*-bsd-user.mak"
1675 fi
1676
1677 if test -z "$target_list_exclude"; then
1678     for config in $mak_wilds; do
1679         default_target_list="${default_target_list} $(basename "$config" .mak)"
1680     done
1681 else
1682     exclude_list=$(echo "$target_list_exclude" | sed -e 's/,/ /g')
1683     for config in $mak_wilds; do
1684         target="$(basename "$config" .mak)"
1685         exclude="no"
1686         for excl in $exclude_list; do
1687             if test "$excl" = "$target"; then
1688                 exclude="yes"
1689                 break;
1690             fi
1691         done
1692         if test "$exclude" = "no"; then
1693             default_target_list="${default_target_list} $target"
1694         fi
1695     done
1696 fi
1697
1698 # Enumerate public trace backends for --help output
1699 trace_backend_list=$(echo $(grep -le '^PUBLIC = True$' "$source_path"/scripts/tracetool/backend/*.py | sed -e 's/^.*\/\(.*\)\.py$/\1/'))
1700
1701 if test x"$show_help" = x"yes" ; then
1702 cat << EOF
1703
1704 Usage: configure [options]
1705 Options: [defaults in brackets after descriptions]
1706
1707 Standard options:
1708   --help                   print this message
1709   --prefix=PREFIX          install in PREFIX [$prefix]
1710   --interp-prefix=PREFIX   where to find shared libraries, etc.
1711                            use %M for cpu name [$interp_prefix]
1712   --target-list=LIST       set target list (default: build everything)
1713 $(echo Available targets: $default_target_list | \
1714   fold -s -w 53 | sed -e 's/^/                           /')
1715   --target-list-exclude=LIST exclude a set of targets from the default target-list
1716
1717 Advanced options (experts only):
1718   --cross-prefix=PREFIX    use PREFIX for compile tools [$cross_prefix]
1719   --cc=CC                  use C compiler CC [$cc]
1720   --iasl=IASL              use ACPI compiler IASL [$iasl]
1721   --host-cc=CC             use C compiler CC [$host_cc] for code run at
1722                            build time
1723   --cxx=CXX                use C++ compiler CXX [$cxx]
1724   --objcc=OBJCC            use Objective-C compiler OBJCC [$objcc]
1725   --extra-cflags=CFLAGS    append extra C compiler flags QEMU_CFLAGS
1726   --extra-cxxflags=CXXFLAGS append extra C++ compiler flags QEMU_CXXFLAGS
1727   --extra-ldflags=LDFLAGS  append extra linker flags LDFLAGS
1728   --cross-cc-ARCH=CC       use compiler when building ARCH guest test cases
1729   --cross-cc-flags-ARCH=   use compiler flags when building ARCH guest tests
1730   --make=MAKE              use specified make [$make]
1731   --install=INSTALL        use specified install [$install]
1732   --python=PYTHON          use specified python [$python]
1733   --sphinx-build=SPHINX    use specified sphinx-build [$sphinx_build]
1734   --smbd=SMBD              use specified smbd [$smbd]
1735   --with-git=GIT           use specified git [$git]
1736   --static                 enable static build [$static]
1737   --mandir=PATH            install man pages in PATH
1738   --datadir=PATH           install firmware in PATH$confsuffix
1739   --docdir=PATH            install documentation in PATH$confsuffix
1740   --bindir=PATH            install binaries in PATH
1741   --libdir=PATH            install libraries in PATH
1742   --libexecdir=PATH        install helper binaries in PATH
1743   --sysconfdir=PATH        install config in PATH$confsuffix
1744   --localstatedir=PATH     install local state in PATH (set at runtime on win32)
1745   --firmwarepath=PATH      search PATH for firmware files
1746   --with-confsuffix=SUFFIX suffix for QEMU data inside datadir/libdir/sysconfdir [$confsuffix]
1747   --with-pkgversion=VERS   use specified string as sub-version of the package
1748   --enable-debug           enable common debug build options
1749   --enable-sanitizers      enable default sanitizers
1750   --disable-strip          disable stripping binaries
1751   --disable-werror         disable compilation abort on warning
1752   --disable-stack-protector disable compiler-provided stack protection
1753   --audio-drv-list=LIST    set audio drivers list:
1754                            Available drivers: $audio_possible_drivers
1755   --block-drv-whitelist=L  Same as --block-drv-rw-whitelist=L
1756   --block-drv-rw-whitelist=L
1757                            set block driver read-write whitelist
1758                            (affects only QEMU, not qemu-img)
1759   --block-drv-ro-whitelist=L
1760                            set block driver read-only whitelist
1761                            (affects only QEMU, not qemu-img)
1762   --enable-trace-backends=B Set trace backend
1763                            Available backends: $trace_backend_list
1764   --with-trace-file=NAME   Full PATH,NAME of file to store traces
1765                            Default:trace-<pid>
1766   --disable-slirp          disable SLIRP userspace network connectivity
1767   --enable-tcg-interpreter enable TCG with bytecode interpreter (TCI)
1768   --enable-malloc-trim     enable libc malloc_trim() for memory optimization
1769   --oss-lib                path to OSS library
1770   --cpu=CPU                Build for host CPU [$cpu]
1771   --with-coroutine=BACKEND coroutine backend. Supported options:
1772                            ucontext, sigaltstack, windows
1773   --enable-gcov            enable test coverage analysis with gcov
1774   --gcov=GCOV              use specified gcov [$gcov_tool]
1775   --disable-blobs          disable installing provided firmware blobs
1776   --with-vss-sdk=SDK-path  enable Windows VSS support in QEMU Guest Agent
1777   --with-win-sdk=SDK-path  path to Windows Platform SDK (to build VSS .tlb)
1778   --tls-priority           default TLS protocol/cipher priority string
1779   --enable-gprof           QEMU profiling with gprof
1780   --enable-profiler        profiler support
1781   --enable-debug-stack-usage
1782                            track the maximum stack usage of stacks created by qemu_alloc_stack
1783   --enable-plugins
1784                            enable plugins via shared library loading
1785   --disable-containers     don't use containers for cross-building
1786
1787 Optional features, enabled with --enable-FEATURE and
1788 disabled with --disable-FEATURE, default is enabled if available:
1789
1790   system          all system emulation targets
1791   user            supported user emulation targets
1792   linux-user      all linux usermode emulation targets
1793   bsd-user        all BSD usermode emulation targets
1794   docs            build documentation
1795   guest-agent     build the QEMU Guest Agent
1796   guest-agent-msi build guest agent Windows MSI installation package
1797   pie             Position Independent Executables
1798   modules         modules support (non-Windows)
1799   module-upgrades try to load modules from alternate paths for upgrades
1800   debug-tcg       TCG debugging (default is disabled)
1801   debug-info      debugging information
1802   sparse          sparse checker
1803
1804   gnutls          GNUTLS cryptography support
1805   nettle          nettle cryptography support
1806   gcrypt          libgcrypt cryptography support
1807   auth-pam        PAM access control
1808   sdl             SDL UI
1809   sdl-image       SDL Image support for icons
1810   gtk             gtk UI
1811   vte             vte support for the gtk UI
1812   curses          curses UI
1813   iconv           font glyph conversion support
1814   vnc             VNC UI support
1815   vnc-sasl        SASL encryption for VNC server
1816   vnc-jpeg        JPEG lossy compression for VNC server
1817   vnc-png         PNG compression for VNC server
1818   cocoa           Cocoa UI (Mac OS X only)
1819   virtfs          VirtFS
1820   mpath           Multipath persistent reservation passthrough
1821   xen             xen backend driver support
1822   xen-pci-passthrough    PCI passthrough support for Xen
1823   brlapi          BrlAPI (Braile)
1824   curl            curl connectivity
1825   membarrier      membarrier system call (for Linux 4.14+ or Windows)
1826   fdt             fdt device tree
1827   kvm             KVM acceleration support
1828   hax             HAX acceleration support
1829   hvf             Hypervisor.framework acceleration support
1830   whpx            Windows Hypervisor Platform acceleration support
1831   rdma            Enable RDMA-based migration
1832   pvrdma          Enable PVRDMA support
1833   vde             support for vde network
1834   netmap          support for netmap network
1835   linux-aio       Linux AIO support
1836   linux-io-uring  Linux io_uring support
1837   cap-ng          libcap-ng support
1838   attr            attr and xattr support
1839   vhost-net       vhost-net kernel acceleration support
1840   vhost-vsock     virtio sockets device support
1841   vhost-scsi      vhost-scsi kernel target support
1842   vhost-crypto    vhost-user-crypto backend support
1843   vhost-kernel    vhost kernel backend support
1844   vhost-user      vhost-user backend support
1845   spice           spice
1846   rbd             rados block device (rbd)
1847   libiscsi        iscsi support
1848   libnfs          nfs support
1849   smartcard       smartcard support (libcacard)
1850   libusb          libusb (for usb passthrough)
1851   live-block-migration   Block migration in the main migration stream
1852   usb-redir       usb network redirection support
1853   lzo             support of lzo compression library
1854   snappy          support of snappy compression library
1855   bzip2           support of bzip2 compression library
1856                   (for reading bzip2-compressed dmg images)
1857   lzfse           support of lzfse compression library
1858                   (for reading lzfse-compressed dmg images)
1859   zstd            support for zstd compression library
1860                   (for migration compression)
1861   seccomp         seccomp support
1862   coroutine-pool  coroutine freelist (better performance)
1863   glusterfs       GlusterFS backend
1864   tpm             TPM support
1865   libssh          ssh block device support
1866   numa            libnuma support
1867   libxml2         for Parallels image format
1868   tcmalloc        tcmalloc support
1869   jemalloc        jemalloc support
1870   avx2            AVX2 optimization support
1871   avx512f         AVX512F optimization support
1872   replication     replication support
1873   opengl          opengl support
1874   virglrenderer   virgl rendering support
1875   xfsctl          xfsctl support
1876   qom-cast-debug  cast debugging support
1877   tools           build qemu-io, qemu-nbd and qemu-img tools
1878   vxhs            Veritas HyperScale vDisk backend support
1879   bochs           bochs image format support
1880   cloop           cloop image format support
1881   dmg             dmg image format support
1882   qcow1           qcow v1 image format support
1883   vdi             vdi image format support
1884   vvfat           vvfat image format support
1885   qed             qed image format support
1886   parallels       parallels image format support
1887   sheepdog        sheepdog block driver support
1888   crypto-afalg    Linux AF_ALG crypto backend driver
1889   capstone        capstone disassembler support
1890   debug-mutex     mutex debugging support
1891   libpmem         libpmem support
1892   xkbcommon       xkbcommon support
1893
1894 NOTE: The object files are built at the place where configure is launched
1895 EOF
1896 exit 0
1897 fi
1898
1899 # Remove old dependency files to make sure that they get properly regenerated
1900 rm -f */config-devices.mak.d
1901
1902 if test -z "$python"
1903 then
1904     error_exit "Python not found. Use --python=/path/to/python"
1905 fi
1906
1907 # Note that if the Python conditional here evaluates True we will exit
1908 # with status 1 which is a shell 'false' value.
1909 if ! $python -c 'import sys; sys.exit(sys.version_info < (3,5))'; then
1910   error_exit "Cannot use '$python', Python >= 3.5 is required." \
1911       "Use --python=/path/to/python to specify a supported Python."
1912 fi
1913
1914 # Preserve python version since some functionality is dependent on it
1915 python_version=$($python -c 'import sys; print("%d.%d.%d" % (sys.version_info[0], sys.version_info[1], sys.version_info[2]))' 2>/dev/null)
1916
1917 # Suppress writing compiled files
1918 python="$python -B"
1919
1920 # Check that the C compiler works. Doing this here before testing
1921 # the host CPU ensures that we had a valid CC to autodetect the
1922 # $cpu var (and we should bail right here if that's not the case).
1923 # It also allows the help message to be printed without a CC.
1924 write_c_skeleton;
1925 if compile_object ; then
1926   : C compiler works ok
1927 else
1928     error_exit "\"$cc\" either does not exist or does not work"
1929 fi
1930 if ! compile_prog ; then
1931     error_exit "\"$cc\" cannot build an executable (is your linker broken?)"
1932 fi
1933
1934 # Now we have handled --enable-tcg-interpreter and know we're not just
1935 # printing the help message, bail out if the host CPU isn't supported.
1936 if test "$ARCH" = "unknown"; then
1937     if test "$tcg_interpreter" = "yes" ; then
1938         echo "Unsupported CPU = $cpu, will use TCG with TCI (experimental)"
1939     else
1940         error_exit "Unsupported CPU = $cpu, try --enable-tcg-interpreter"
1941     fi
1942 fi
1943
1944 # Consult white-list to determine whether to enable werror
1945 # by default.  Only enable by default for git builds
1946 if test -z "$werror" ; then
1947     if test -e "$source_path/.git" && \
1948         { test "$linux" = "yes" || test "$mingw32" = "yes"; }; then
1949         werror="yes"
1950     else
1951         werror="no"
1952     fi
1953 fi
1954
1955 if test "$bogus_os" = "yes"; then
1956     # Now that we know that we're not printing the help and that
1957     # the compiler works (so the results of the check_defines we used
1958     # to identify the OS are reliable), if we didn't recognize the
1959     # host OS we should stop now.
1960     error_exit "Unrecognized host OS (uname -s reports '$(uname -s)')"
1961 fi
1962
1963 # Check whether the compiler matches our minimum requirements:
1964 cat > $TMPC << EOF
1965 #if defined(__clang_major__) && defined(__clang_minor__)
1966 # ifdef __apple_build_version__
1967 #  if __clang_major__ < 5 || (__clang_major__ == 5 && __clang_minor__ < 1)
1968 #   error You need at least XCode Clang v5.1 to compile QEMU
1969 #  endif
1970 # else
1971 #  if __clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ < 4)
1972 #   error You need at least Clang v3.4 to compile QEMU
1973 #  endif
1974 # endif
1975 #elif defined(__GNUC__) && defined(__GNUC_MINOR__)
1976 # if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8)
1977 #  error You need at least GCC v4.8 to compile QEMU
1978 # endif
1979 #else
1980 # error You either need GCC or Clang to compiler QEMU
1981 #endif
1982 int main (void) { return 0; }
1983 EOF
1984 if ! compile_prog "" "" ; then
1985     error_exit "You need at least GCC v4.8 or Clang v3.4 (or XCode Clang v5.1)"
1986 fi
1987
1988 gcc_flags="-Wold-style-declaration -Wold-style-definition -Wtype-limits"
1989 gcc_flags="-Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers $gcc_flags"
1990 gcc_flags="-Wno-missing-include-dirs -Wempty-body -Wnested-externs $gcc_flags"
1991 gcc_flags="-Wendif-labels -Wno-shift-negative-value $gcc_flags"
1992 gcc_flags="-Wno-initializer-overrides -Wexpansion-to-defined $gcc_flags"
1993 gcc_flags="-Wno-string-plus-int -Wno-typedef-redefinition $gcc_flags"
1994 # Note that we do not add -Werror to gcc_flags here, because that would
1995 # enable it for all configure tests. If a configure test failed due
1996 # to -Werror this would just silently disable some features,
1997 # so it's too error prone.
1998
1999 cc_has_warning_flag() {
2000     write_c_skeleton;
2001
2002     # Use the positive sense of the flag when testing for -Wno-wombat
2003     # support (gcc will happily accept the -Wno- form of unknown
2004     # warning options).
2005     optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
2006     compile_prog "-Werror $optflag" ""
2007 }
2008
2009 for flag in $gcc_flags; do
2010     if cc_has_warning_flag $flag ; then
2011         QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2012     fi
2013 done
2014
2015 if test "$stack_protector" != "no"; then
2016   cat > $TMPC << EOF
2017 int main(int argc, char *argv[])
2018 {
2019     char arr[64], *p = arr, *c = argv[0];
2020     while (*c) {
2021         *p++ = *c++;
2022     }
2023     return 0;
2024 }
2025 EOF
2026   gcc_flags="-fstack-protector-strong -fstack-protector-all"
2027   sp_on=0
2028   for flag in $gcc_flags; do
2029     # We need to check both a compile and a link, since some compiler
2030     # setups fail only on a .c->.o compile and some only at link time
2031     if do_cc $QEMU_CFLAGS -Werror $flag -c -o $TMPO $TMPC &&
2032        compile_prog "-Werror $flag" ""; then
2033       QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2034       QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
2035       sp_on=1
2036       break
2037     fi
2038   done
2039   if test "$stack_protector" = yes; then
2040     if test $sp_on = 0; then
2041       error_exit "Stack protector not supported"
2042     fi
2043   fi
2044 fi
2045
2046 # Disable -Wmissing-braces on older compilers that warn even for
2047 # the "universal" C zero initializer {0}.
2048 cat > $TMPC << EOF
2049 struct {
2050   int a[2];
2051 } x = {0};
2052 EOF
2053 if compile_object "-Werror" "" ; then
2054   :
2055 else
2056   QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces"
2057 fi
2058
2059 # Our module code doesn't support Windows
2060 if test "$modules" = "yes" && test "$mingw32" = "yes" ; then
2061   error_exit "Modules are not available for Windows"
2062 fi
2063
2064 # module_upgrades is only reasonable if modules are enabled
2065 if test "$modules" = "no" && test "$module_upgrades" = "yes" ; then
2066   error_exit "Can't enable module-upgrades as Modules are not enabled"
2067 fi
2068
2069 # Static linking is not possible with modules or PIE
2070 if test "$static" = "yes" ; then
2071   if test "$modules" = "yes" ; then
2072     error_exit "static and modules are mutually incompatible"
2073   fi
2074   if test "$pie" = "yes" ; then
2075     error_exit "static and pie are mutually incompatible"
2076   else
2077     pie="no"
2078   fi
2079 fi
2080
2081 # Unconditional check for compiler __thread support
2082   cat > $TMPC << EOF
2083 static __thread int tls_var;
2084 int main(void) { return tls_var; }
2085 EOF
2086
2087 if ! compile_prog "-Werror" "" ; then
2088     error_exit "Your compiler does not support the __thread specifier for " \
2089         "Thread-Local Storage (TLS). Please upgrade to a version that does."
2090 fi
2091
2092 if test "$pie" = ""; then
2093   case "$cpu-$targetos" in
2094     i386-Linux|x86_64-Linux|x32-Linux|i386-OpenBSD|x86_64-OpenBSD)
2095       ;;
2096     *)
2097       pie="no"
2098       ;;
2099   esac
2100 fi
2101
2102 if test "$pie" != "no" ; then
2103   cat > $TMPC << EOF
2104
2105 #ifdef __linux__
2106 #  define THREAD __thread
2107 #else
2108 #  define THREAD
2109 #endif
2110
2111 static THREAD int tls_var;
2112
2113 int main(void) { return tls_var; }
2114
2115 EOF
2116   # check we support --no-pie first...
2117   if compile_prog "-Werror -fno-pie" "-no-pie"; then
2118     CFLAGS_NOPIE="-fno-pie"
2119     LDFLAGS_NOPIE="-nopie"
2120   fi
2121
2122   if compile_prog "-fPIE -DPIE" "-pie"; then
2123     QEMU_CFLAGS="-fPIE -DPIE $QEMU_CFLAGS"
2124     QEMU_LDFLAGS="-pie $QEMU_LDFLAGS"
2125     pie="yes"
2126     if compile_prog "" "-Wl,-z,relro -Wl,-z,now" ; then
2127       QEMU_LDFLAGS="-Wl,-z,relro -Wl,-z,now $QEMU_LDFLAGS"
2128     fi
2129   else
2130     if test "$pie" = "yes"; then
2131       error_exit "PIE not available due to missing toolchain support"
2132     else
2133       echo "Disabling PIE due to missing toolchain support"
2134       pie="no"
2135     fi
2136   fi
2137 fi
2138
2139 ##########################################
2140 # __sync_fetch_and_and requires at least -march=i486. Many toolchains
2141 # use i686 as default anyway, but for those that don't, an explicit
2142 # specification is necessary
2143
2144 if test "$cpu" = "i386"; then
2145   cat > $TMPC << EOF
2146 static int sfaa(int *ptr)
2147 {
2148   return __sync_fetch_and_and(ptr, 0);
2149 }
2150
2151 int main(void)
2152 {
2153   int val = 42;
2154   val = __sync_val_compare_and_swap(&val, 0, 1);
2155   sfaa(&val);
2156   return val;
2157 }
2158 EOF
2159   if ! compile_prog "" "" ; then
2160     QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS"
2161   fi
2162 fi
2163
2164 #########################################
2165 # Solaris specific configure tool chain decisions
2166
2167 if test "$solaris" = "yes" ; then
2168   if has $install; then
2169     :
2170   else
2171     error_exit "Solaris install program not found. Use --install=/usr/ucb/install or" \
2172         "install fileutils from www.blastwave.org using pkg-get -i fileutils" \
2173         "to get ginstall which is used by default (which lives in /opt/csw/bin)"
2174   fi
2175   if test "$(path_of $install)" = "/usr/sbin/install" ; then
2176     error_exit "Solaris /usr/sbin/install is not an appropriate install program." \
2177         "try ginstall from the GNU fileutils available from www.blastwave.org" \
2178         "using pkg-get -i fileutils, or use --install=/usr/ucb/install"
2179   fi
2180   if has ar; then
2181     :
2182   else
2183     if test -f /usr/ccs/bin/ar ; then
2184       error_exit "No path includes ar" \
2185           "Add /usr/ccs/bin to your path and rerun configure"
2186     fi
2187     error_exit "No path includes ar"
2188   fi
2189 fi
2190
2191 if test -z "${target_list+xxx}" ; then
2192     for target in $default_target_list; do
2193         supported_target $target 2>/dev/null && \
2194             target_list="$target_list $target"
2195     done
2196     target_list="${target_list# }"
2197 else
2198     target_list=$(echo "$target_list" | sed -e 's/,/ /g')
2199     for target in $target_list; do
2200         # Check that we recognised the target name; this allows a more
2201         # friendly error message than if we let it fall through.
2202         case " $default_target_list " in
2203             *" $target "*)
2204                 ;;
2205             *)
2206                 error_exit "Unknown target name '$target'"
2207                 ;;
2208         esac
2209         supported_target $target || exit 1
2210     done
2211 fi
2212
2213 # see if system emulation was really requested
2214 case " $target_list " in
2215   *"-softmmu "*) softmmu=yes
2216   ;;
2217   *) softmmu=no
2218   ;;
2219 esac
2220
2221 for target in $target_list; do
2222   case "$target" in
2223     arm-softmmu | aarch64-softmmu | i386-softmmu | x86_64-softmmu)
2224       edk2_blobs="yes"
2225       ;;
2226   esac
2227 done
2228 # The EDK2 binaries are compressed with bzip2
2229 if test "$edk2_blobs" = "yes" && ! has bzip2; then
2230   error_exit "The bzip2 program is required for building QEMU"
2231 fi
2232
2233 feature_not_found() {
2234   feature=$1
2235   remedy=$2
2236
2237   error_exit "User requested feature $feature" \
2238       "configure was not able to find it." \
2239       "$remedy"
2240 }
2241
2242 # ---
2243 # big/little endian test
2244 cat > $TMPC << EOF
2245 short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, };
2246 short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, };
2247 extern int foo(short *, short *);
2248 int main(int argc, char *argv[]) {
2249     return foo(big_endian, little_endian);
2250 }
2251 EOF
2252
2253 if compile_object ; then
2254     if strings -a $TMPO | grep -q BiGeNdIaN ; then
2255         bigendian="yes"
2256     elif strings -a $TMPO | grep -q LiTtLeEnDiAn ; then
2257         bigendian="no"
2258     else
2259         echo big/little test failed
2260     fi
2261 else
2262     echo big/little test failed
2263 fi
2264
2265 ##########################################
2266 # system tools
2267 if test -z "$want_tools"; then
2268     if test "$softmmu" = "no"; then
2269         want_tools=no
2270     else
2271         want_tools=yes
2272     fi
2273 fi
2274
2275 ##########################################
2276 # cocoa implies not SDL or GTK
2277 # (the cocoa UI code currently assumes it is always the active UI
2278 # and doesn't interact well with other UI frontend code)
2279 if test "$cocoa" = "yes"; then
2280     if test "$sdl" = "yes"; then
2281         error_exit "Cocoa and SDL UIs cannot both be enabled at once"
2282     fi
2283     if test "$gtk" = "yes"; then
2284         error_exit "Cocoa and GTK UIs cannot both be enabled at once"
2285     fi
2286     gtk=no
2287     sdl=no
2288 fi
2289
2290 # Some versions of Mac OS X incorrectly define SIZE_MAX
2291 cat > $TMPC << EOF
2292 #include <stdint.h>
2293 #include <stdio.h>
2294 int main(int argc, char *argv[]) {
2295     return printf("%zu", SIZE_MAX);
2296 }
2297 EOF
2298 have_broken_size_max=no
2299 if ! compile_object -Werror ; then
2300     have_broken_size_max=yes
2301 fi
2302
2303 ##########################################
2304 # L2TPV3 probe
2305
2306 cat > $TMPC <<EOF
2307 #include <sys/socket.h>
2308 #include <linux/ip.h>
2309 int main(void) { return sizeof(struct mmsghdr); }
2310 EOF
2311 if compile_prog "" "" ; then
2312   l2tpv3=yes
2313 else
2314   l2tpv3=no
2315 fi
2316
2317 #########################################
2318 # vhost interdependencies and host support
2319
2320 # vhost backends
2321 test "$vhost_user" = "" && vhost_user=yes
2322 if test "$vhost_user" = "yes" && test "$mingw32" = "yes"; then
2323   error_exit "vhost-user isn't available on win32"
2324 fi
2325 test "$vhost_kernel" = "" && vhost_kernel=$linux
2326 if test "$vhost_kernel" = "yes" && test "$linux" != "yes"; then
2327   error_exit "vhost-kernel is only available on Linux"
2328 fi
2329
2330 # vhost-kernel devices
2331 test "$vhost_scsi" = "" && vhost_scsi=$vhost_kernel
2332 if test "$vhost_scsi" = "yes" && test "$vhost_kernel" != "yes"; then
2333   error_exit "--enable-vhost-scsi requires --enable-vhost-kernel"
2334 fi
2335 test "$vhost_vsock" = "" && vhost_vsock=$vhost_kernel
2336 if test "$vhost_vsock" = "yes" && test "$vhost_kernel" != "yes"; then
2337   error_exit "--enable-vhost-vsock requires --enable-vhost-kernel"
2338 fi
2339
2340 # vhost-user backends
2341 test "$vhost_net_user" = "" && vhost_net_user=$vhost_user
2342 if test "$vhost_net_user" = "yes" && test "$vhost_user" = "no"; then
2343   error_exit "--enable-vhost-net-user requires --enable-vhost-user"
2344 fi
2345 test "$vhost_crypto" = "" && vhost_crypto=$vhost_user
2346 if test "$vhost_crypto" = "yes" && test "$vhost_user" = "no"; then
2347   error_exit "--enable-vhost-crypto requires --enable-vhost-user"
2348 fi
2349 test "$vhost_user_fs" = "" && vhost_user_fs=$vhost_user
2350 if test "$vhost_user_fs" = "yes" && test "$vhost_user" = "no"; then
2351   error_exit "--enable-vhost-user-fs requires --enable-vhost-user"
2352 fi
2353
2354 # OR the vhost-kernel and vhost-user values for simplicity
2355 if test "$vhost_net" = ""; then
2356   test "$vhost_net_user" = "yes" && vhost_net=yes
2357   test "$vhost_kernel" = "yes" && vhost_net=yes
2358 fi
2359
2360 ##########################################
2361 # MinGW / Mingw-w64 localtime_r/gmtime_r check
2362
2363 if test "$mingw32" = "yes"; then
2364     # Some versions of MinGW / Mingw-w64 lack localtime_r
2365     # and gmtime_r entirely.
2366     #
2367     # Some versions of Mingw-w64 define a macro for
2368     # localtime_r/gmtime_r.
2369     #
2370     # Some versions of Mingw-w64 will define functions
2371     # for localtime_r/gmtime_r, but only if you have
2372     # _POSIX_THREAD_SAFE_FUNCTIONS defined. For fun
2373     # though, unistd.h and pthread.h both define
2374     # that for you.
2375     #
2376     # So this #undef localtime_r and #include <unistd.h>
2377     # are not in fact redundant.
2378 cat > $TMPC << EOF
2379 #include <unistd.h>
2380 #include <time.h>
2381 #undef localtime_r
2382 int main(void) { localtime_r(NULL, NULL); return 0; }
2383 EOF
2384     if compile_prog "" "" ; then
2385         localtime_r="yes"
2386     else
2387         localtime_r="no"
2388     fi
2389 fi
2390
2391 ##########################################
2392 # pkg-config probe
2393
2394 if ! has "$pkg_config_exe"; then
2395   error_exit "pkg-config binary '$pkg_config_exe' not found"
2396 fi
2397
2398 ##########################################
2399 # NPTL probe
2400
2401 if test "$linux_user" = "yes"; then
2402   cat > $TMPC <<EOF
2403 #include <sched.h>
2404 #include <linux/futex.h>
2405 int main(void) {
2406 #if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
2407 #error bork
2408 #endif
2409   return 0;
2410 }
2411 EOF
2412   if ! compile_object ; then
2413     feature_not_found "nptl" "Install glibc and linux kernel headers."
2414   fi
2415 fi
2416
2417 ##########################################
2418 # lzo check
2419
2420 if test "$lzo" != "no" ; then
2421     cat > $TMPC << EOF
2422 #include <lzo/lzo1x.h>
2423 int main(void) { lzo_version(); return 0; }
2424 EOF
2425     if compile_prog "" "-llzo2" ; then
2426         libs_softmmu="$libs_softmmu -llzo2"
2427         lzo="yes"
2428     else
2429         if test "$lzo" = "yes"; then
2430             feature_not_found "liblzo2" "Install liblzo2 devel"
2431         fi
2432         lzo="no"
2433     fi
2434 fi
2435
2436 ##########################################
2437 # snappy check
2438
2439 if test "$snappy" != "no" ; then
2440     cat > $TMPC << EOF
2441 #include <snappy-c.h>
2442 int main(void) { snappy_max_compressed_length(4096); return 0; }
2443 EOF
2444     if compile_prog "" "-lsnappy" ; then
2445         libs_softmmu="$libs_softmmu -lsnappy"
2446         snappy="yes"
2447     else
2448         if test "$snappy" = "yes"; then
2449             feature_not_found "libsnappy" "Install libsnappy devel"
2450         fi
2451         snappy="no"
2452     fi
2453 fi
2454
2455 ##########################################
2456 # bzip2 check
2457
2458 if test "$bzip2" != "no" ; then
2459     cat > $TMPC << EOF
2460 #include <bzlib.h>
2461 int main(void) { BZ2_bzlibVersion(); return 0; }
2462 EOF
2463     if compile_prog "" "-lbz2" ; then
2464         bzip2="yes"
2465     else
2466         if test "$bzip2" = "yes"; then
2467             feature_not_found "libbzip2" "Install libbzip2 devel"
2468         fi
2469         bzip2="no"
2470     fi
2471 fi
2472
2473 ##########################################
2474 # lzfse check
2475
2476 if test "$lzfse" != "no" ; then
2477     cat > $TMPC << EOF
2478 #include <lzfse.h>
2479 int main(void) { lzfse_decode_scratch_size(); return 0; }
2480 EOF
2481     if compile_prog "" "-llzfse" ; then
2482         lzfse="yes"
2483     else
2484         if test "$lzfse" = "yes"; then
2485             feature_not_found "lzfse" "Install lzfse devel"
2486         fi
2487         lzfse="no"
2488     fi
2489 fi
2490
2491 ##########################################
2492 # zstd check
2493
2494 if test "$zstd" != "no" ; then
2495     libzstd_minver="1.4.0"
2496     if $pkg_config --atleast-version=$libzstd_minver libzstd ; then
2497         zstd_cflags="$($pkg_config --cflags libzstd)"
2498         zstd_libs="$($pkg_config --libs libzstd)"
2499         LIBS="$zstd_libs $LIBS"
2500         QEMU_CFLAGS="$QEMU_CFLAGS $zstd_cflags"
2501         zstd="yes"
2502     else
2503         if test "$zstd" = "yes" ; then
2504             feature_not_found "libzstd" "Install libzstd devel"
2505         fi
2506         zstd="no"
2507     fi
2508 fi
2509
2510 ##########################################
2511 # libseccomp check
2512
2513 if test "$seccomp" != "no" ; then
2514     libseccomp_minver="2.3.0"
2515     if $pkg_config --atleast-version=$libseccomp_minver libseccomp ; then
2516         seccomp_cflags="$($pkg_config --cflags libseccomp)"
2517         seccomp_libs="$($pkg_config --libs libseccomp)"
2518         seccomp="yes"
2519     else
2520         if test "$seccomp" = "yes" ; then
2521             feature_not_found "libseccomp" \
2522                  "Install libseccomp devel >= $libseccomp_minver"
2523         fi
2524         seccomp="no"
2525     fi
2526 fi
2527 ##########################################
2528 # xen probe
2529
2530 if test "$xen" != "no" ; then
2531   # Check whether Xen library path is specified via --extra-ldflags to avoid
2532   # overriding this setting with pkg-config output. If not, try pkg-config
2533   # to obtain all needed flags.
2534
2535   if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
2536      $pkg_config --exists xencontrol ; then
2537     xen_ctrl_version="$(printf '%d%02d%02d' \
2538       $($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
2539     xen=yes
2540     xen_pc="xencontrol xenstore xenguest xenforeignmemory xengnttab"
2541     xen_pc="$xen_pc xenevtchn xendevicemodel"
2542     if $pkg_config --exists xentoolcore; then
2543       xen_pc="$xen_pc xentoolcore"
2544     fi
2545     QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags $xen_pc)"
2546     libs_softmmu="$($pkg_config --libs $xen_pc) $libs_softmmu"
2547   else
2548
2549     xen_libs="-lxenstore -lxenctrl -lxenguest"
2550     xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
2551
2552     # First we test whether Xen headers and libraries are available.
2553     # If no, we are done and there is no Xen support.
2554     # If yes, more tests are run to detect the Xen version.
2555
2556     # Xen (any)
2557     cat > $TMPC <<EOF
2558 #include <xenctrl.h>
2559 int main(void) {
2560   return 0;
2561 }
2562 EOF
2563     if ! compile_prog "" "$xen_libs" ; then
2564       # Xen not found
2565       if test "$xen" = "yes" ; then
2566         feature_not_found "xen" "Install xen devel"
2567       fi
2568       xen=no
2569
2570     # Xen unstable
2571     elif
2572         cat > $TMPC <<EOF &&
2573 #undef XC_WANT_COMPAT_DEVICEMODEL_API
2574 #define __XEN_TOOLS__
2575 #include <xendevicemodel.h>
2576 #include <xenforeignmemory.h>
2577 int main(void) {
2578   xendevicemodel_handle *xd;
2579   xenforeignmemory_handle *xfmem;
2580
2581   xd = xendevicemodel_open(0, 0);
2582   xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
2583
2584   xfmem = xenforeignmemory_open(0, 0);
2585   xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
2586
2587   return 0;
2588 }
2589 EOF
2590         compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2591       then
2592       xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2593       xen_ctrl_version=41100
2594       xen=yes
2595     elif
2596         cat > $TMPC <<EOF &&
2597 #undef XC_WANT_COMPAT_MAP_FOREIGN_API
2598 #include <xenforeignmemory.h>
2599 #include <xentoolcore.h>
2600 int main(void) {
2601   xenforeignmemory_handle *xfmem;
2602
2603   xfmem = xenforeignmemory_open(0, 0);
2604   xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
2605   xentoolcore_restrict_all(0);
2606
2607   return 0;
2608 }
2609 EOF
2610         compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2611       then
2612       xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2613       xen_ctrl_version=41000
2614       xen=yes
2615     elif
2616         cat > $TMPC <<EOF &&
2617 #undef XC_WANT_COMPAT_DEVICEMODEL_API
2618 #define __XEN_TOOLS__
2619 #include <xendevicemodel.h>
2620 int main(void) {
2621   xendevicemodel_handle *xd;
2622
2623   xd = xendevicemodel_open(0, 0);
2624   xendevicemodel_close(xd);
2625
2626   return 0;
2627 }
2628 EOF
2629         compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
2630       then
2631       xen_stable_libs="-lxendevicemodel $xen_stable_libs"
2632       xen_ctrl_version=40900
2633       xen=yes
2634     elif
2635         cat > $TMPC <<EOF &&
2636 /*
2637  * If we have stable libs the we don't want the libxc compat
2638  * layers, regardless of what CFLAGS we may have been given.
2639  *
2640  * Also, check if xengnttab_grant_copy_segment_t is defined and
2641  * grant copy operation is implemented.
2642  */
2643 #undef XC_WANT_COMPAT_EVTCHN_API
2644 #undef XC_WANT_COMPAT_GNTTAB_API
2645 #undef XC_WANT_COMPAT_MAP_FOREIGN_API
2646 #include <xenctrl.h>
2647 #include <xenstore.h>
2648 #include <xenevtchn.h>
2649 #include <xengnttab.h>
2650 #include <xenforeignmemory.h>
2651 #include <stdint.h>
2652 #include <xen/hvm/hvm_info_table.h>
2653 #if !defined(HVM_MAX_VCPUS)
2654 # error HVM_MAX_VCPUS not defined
2655 #endif
2656 int main(void) {
2657   xc_interface *xc = NULL;
2658   xenforeignmemory_handle *xfmem;
2659   xenevtchn_handle *xe;
2660   xengnttab_handle *xg;
2661   xengnttab_grant_copy_segment_t* seg = NULL;
2662
2663   xs_daemon_open();
2664
2665   xc = xc_interface_open(0, 0, 0);
2666   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2667   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2668   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2669   xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2670
2671   xfmem = xenforeignmemory_open(0, 0);
2672   xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2673
2674   xe = xenevtchn_open(0, 0);
2675   xenevtchn_fd(xe);
2676
2677   xg = xengnttab_open(0, 0);
2678   xengnttab_grant_copy(xg, 0, seg);
2679
2680   return 0;
2681 }
2682 EOF
2683         compile_prog "" "$xen_libs $xen_stable_libs"
2684       then
2685       xen_ctrl_version=40800
2686       xen=yes
2687     elif
2688         cat > $TMPC <<EOF &&
2689 /*
2690  * If we have stable libs the we don't want the libxc compat
2691  * layers, regardless of what CFLAGS we may have been given.
2692  */
2693 #undef XC_WANT_COMPAT_EVTCHN_API
2694 #undef XC_WANT_COMPAT_GNTTAB_API
2695 #undef XC_WANT_COMPAT_MAP_FOREIGN_API
2696 #include <xenctrl.h>
2697 #include <xenstore.h>
2698 #include <xenevtchn.h>
2699 #include <xengnttab.h>
2700 #include <xenforeignmemory.h>
2701 #include <stdint.h>
2702 #include <xen/hvm/hvm_info_table.h>
2703 #if !defined(HVM_MAX_VCPUS)
2704 # error HVM_MAX_VCPUS not defined
2705 #endif
2706 int main(void) {
2707   xc_interface *xc = NULL;
2708   xenforeignmemory_handle *xfmem;
2709   xenevtchn_handle *xe;
2710   xengnttab_handle *xg;
2711
2712   xs_daemon_open();
2713
2714   xc = xc_interface_open(0, 0, 0);
2715   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2716   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2717   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2718   xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2719
2720   xfmem = xenforeignmemory_open(0, 0);
2721   xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2722
2723   xe = xenevtchn_open(0, 0);
2724   xenevtchn_fd(xe);
2725
2726   xg = xengnttab_open(0, 0);
2727   xengnttab_map_grant_ref(xg, 0, 0, 0);
2728
2729   return 0;
2730 }
2731 EOF
2732         compile_prog "" "$xen_libs $xen_stable_libs"
2733       then
2734       xen_ctrl_version=40701
2735       xen=yes
2736
2737     # Xen 4.6
2738     elif
2739         cat > $TMPC <<EOF &&
2740 #include <xenctrl.h>
2741 #include <xenstore.h>
2742 #include <stdint.h>
2743 #include <xen/hvm/hvm_info_table.h>
2744 #if !defined(HVM_MAX_VCPUS)
2745 # error HVM_MAX_VCPUS not defined
2746 #endif
2747 int main(void) {
2748   xc_interface *xc;
2749   xs_daemon_open();
2750   xc = xc_interface_open(0, 0, 0);
2751   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2752   xc_gnttab_open(NULL, 0);
2753   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2754   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2755   xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2756   xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
2757   return 0;
2758 }
2759 EOF
2760         compile_prog "" "$xen_libs"
2761       then
2762       xen_ctrl_version=40600
2763       xen=yes
2764
2765     # Xen 4.5
2766     elif
2767         cat > $TMPC <<EOF &&
2768 #include <xenctrl.h>
2769 #include <xenstore.h>
2770 #include <stdint.h>
2771 #include <xen/hvm/hvm_info_table.h>
2772 #if !defined(HVM_MAX_VCPUS)
2773 # error HVM_MAX_VCPUS not defined
2774 #endif
2775 int main(void) {
2776   xc_interface *xc;
2777   xs_daemon_open();
2778   xc = xc_interface_open(0, 0, 0);
2779   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2780   xc_gnttab_open(NULL, 0);
2781   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2782   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2783   xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
2784   return 0;
2785 }
2786 EOF
2787         compile_prog "" "$xen_libs"
2788       then
2789       xen_ctrl_version=40500
2790       xen=yes
2791
2792     elif
2793         cat > $TMPC <<EOF &&
2794 #include <xenctrl.h>
2795 #include <xenstore.h>
2796 #include <stdint.h>
2797 #include <xen/hvm/hvm_info_table.h>
2798 #if !defined(HVM_MAX_VCPUS)
2799 # error HVM_MAX_VCPUS not defined
2800 #endif
2801 int main(void) {
2802   xc_interface *xc;
2803   xs_daemon_open();
2804   xc = xc_interface_open(0, 0, 0);
2805   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2806   xc_gnttab_open(NULL, 0);
2807   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2808   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2809   return 0;
2810 }
2811 EOF
2812         compile_prog "" "$xen_libs"
2813       then
2814       xen_ctrl_version=40200
2815       xen=yes
2816
2817     else
2818       if test "$xen" = "yes" ; then
2819         feature_not_found "xen (unsupported version)" \
2820                           "Install a supported xen (xen 4.2 or newer)"
2821       fi
2822       xen=no
2823     fi
2824
2825     if test "$xen" = yes; then
2826       if test $xen_ctrl_version -ge 40701  ; then
2827         libs_softmmu="$xen_stable_libs $libs_softmmu"
2828       fi
2829       libs_softmmu="$xen_libs $libs_softmmu"
2830     fi
2831   fi
2832 fi
2833
2834 if test "$xen_pci_passthrough" != "no"; then
2835   if test "$xen" = "yes" && test "$linux" = "yes"; then
2836     xen_pci_passthrough=yes
2837   else
2838     if test "$xen_pci_passthrough" = "yes"; then
2839       error_exit "User requested feature Xen PCI Passthrough" \
2840           " but this feature requires /sys from Linux"
2841     fi
2842     xen_pci_passthrough=no
2843   fi
2844 fi
2845
2846 ##########################################
2847 # Windows Hypervisor Platform accelerator (WHPX) check
2848 if test "$whpx" != "no" ; then
2849     if check_include "WinHvPlatform.h" && check_include "WinHvEmulation.h"; then
2850         whpx="yes"
2851     else
2852         if test "$whpx" = "yes"; then
2853             feature_not_found "WinHvPlatform" "WinHvEmulation is not installed"
2854         fi
2855         whpx="no"
2856     fi
2857 fi
2858
2859 ##########################################
2860 # Sparse probe
2861 if test "$sparse" != "no" ; then
2862   if has cgcc; then
2863     sparse=yes
2864   else
2865     if test "$sparse" = "yes" ; then
2866       feature_not_found "sparse" "Install sparse binary"
2867     fi
2868     sparse=no
2869   fi
2870 fi
2871
2872 ##########################################
2873 # X11 probe
2874 if $pkg_config --exists "x11"; then
2875     have_x11=yes
2876     x11_cflags=$($pkg_config --cflags x11)
2877     x11_libs=$($pkg_config --libs x11)
2878 fi
2879
2880 ##########################################
2881 # GTK probe
2882
2883 if test "$gtk" != "no"; then
2884     gtkpackage="gtk+-3.0"
2885     gtkx11package="gtk+-x11-3.0"
2886     gtkversion="3.14.0"
2887     if $pkg_config --exists "$gtkpackage >= $gtkversion"; then
2888         gtk_cflags=$($pkg_config --cflags $gtkpackage)
2889         gtk_libs=$($pkg_config --libs $gtkpackage)
2890         gtk_version=$($pkg_config --modversion $gtkpackage)
2891         if $pkg_config --exists "$gtkx11package >= $gtkversion"; then
2892             need_x11=yes
2893             gtk_cflags="$gtk_cflags $x11_cflags"
2894             gtk_libs="$gtk_libs $x11_libs"
2895         fi
2896         gtk="yes"
2897     elif test "$gtk" = "yes"; then
2898         feature_not_found "gtk" "Install gtk3-devel"
2899     else
2900         gtk="no"
2901     fi
2902 fi
2903
2904
2905 ##########################################
2906 # GNUTLS probe
2907
2908 if test "$gnutls" != "no"; then
2909     pass="no"
2910     if $pkg_config --exists "gnutls >= 3.1.18"; then
2911         gnutls_cflags=$($pkg_config --cflags gnutls)
2912         gnutls_libs=$($pkg_config --libs gnutls)
2913         # Packaging for the static libraries is not always correct.
2914         # At least ubuntu 18.04 ships only shared libraries.
2915         write_c_skeleton
2916         if compile_prog "" "$gnutls_libs" ; then
2917             LIBS="$gnutls_libs $LIBS"
2918             QEMU_CFLAGS="$QEMU_CFLAGS $gnutls_cflags"
2919             pass="yes"
2920         fi
2921     fi
2922     if test "$pass" = "no" && test "$gnutls" = "yes"; then
2923         feature_not_found "gnutls" "Install gnutls devel >= 3.1.18"
2924     else
2925         gnutls="$pass"
2926     fi
2927 fi
2928
2929
2930 # If user didn't give a --disable/enable-gcrypt flag,
2931 # then mark as disabled if user requested nettle
2932 # explicitly
2933 if test -z "$gcrypt"
2934 then
2935     if test "$nettle" = "yes"
2936     then
2937         gcrypt="no"
2938     fi
2939 fi
2940
2941 # If user didn't give a --disable/enable-nettle flag,
2942 # then mark as disabled if user requested gcrypt
2943 # explicitly
2944 if test -z "$nettle"
2945 then
2946     if test "$gcrypt" = "yes"
2947     then
2948         nettle="no"
2949     fi
2950 fi
2951
2952 has_libgcrypt() {
2953     if ! has "libgcrypt-config"
2954     then
2955         return 1
2956     fi
2957
2958     if test -n "$cross_prefix"
2959     then
2960         host=$(libgcrypt-config --host)
2961         if test "$host-" != $cross_prefix
2962         then
2963             return 1
2964         fi
2965     fi
2966
2967     maj=`libgcrypt-config --version | awk -F . '{print $1}'`
2968     min=`libgcrypt-config --version | awk -F . '{print $2}'`
2969
2970     if test $maj != 1 || test $min -lt 5
2971     then
2972        return 1
2973     fi
2974
2975     return 0
2976 }
2977
2978
2979 if test "$nettle" != "no"; then
2980     pass="no"
2981     if $pkg_config --exists "nettle >= 2.7.1"; then
2982         nettle_cflags=$($pkg_config --cflags nettle)
2983         nettle_libs=$($pkg_config --libs nettle)
2984         nettle_version=$($pkg_config --modversion nettle)
2985         # Link test to make sure the given libraries work (e.g for static).
2986         write_c_skeleton
2987         if compile_prog "" "$nettle_libs" ; then
2988             LIBS="$nettle_libs $LIBS"
2989             QEMU_CFLAGS="$QEMU_CFLAGS $nettle_cflags"
2990             if test -z "$gcrypt"; then
2991                gcrypt="no"
2992             fi
2993             pass="yes"
2994         fi
2995     fi
2996     if test "$pass" = "yes"
2997     then
2998         cat > $TMPC << EOF
2999 #include <nettle/xts.h>
3000 int main(void) {
3001   return 0;
3002 }
3003 EOF
3004         if compile_prog "$nettle_cflags" "$nettle_libs" ; then
3005             nettle_xts=yes
3006             qemu_private_xts=no
3007         fi
3008     fi
3009     if test "$pass" = "no" && test "$nettle" = "yes"; then
3010         feature_not_found "nettle" "Install nettle devel >= 2.7.1"
3011     else
3012         nettle="$pass"
3013     fi
3014 fi
3015
3016 if test "$gcrypt" != "no"; then
3017     pass="no"
3018     if has_libgcrypt; then
3019         gcrypt_cflags=$(libgcrypt-config --cflags)
3020         gcrypt_libs=$(libgcrypt-config --libs)
3021         # Debian has removed -lgpg-error from libgcrypt-config
3022         # as it "spreads unnecessary dependencies" which in
3023         # turn breaks static builds...
3024         if test "$static" = "yes"
3025         then
3026             gcrypt_libs="$gcrypt_libs -lgpg-error"
3027         fi
3028
3029         # Link test to make sure the given libraries work (e.g for static).
3030         write_c_skeleton
3031         if compile_prog "" "$gcrypt_libs" ; then
3032             LIBS="$gcrypt_libs $LIBS"
3033             QEMU_CFLAGS="$QEMU_CFLAGS $gcrypt_cflags"
3034             pass="yes"
3035         fi
3036     fi
3037     if test "$pass" = "yes"; then
3038         gcrypt="yes"
3039         cat > $TMPC << EOF
3040 #include <gcrypt.h>
3041 int main(void) {
3042   gcry_mac_hd_t handle;
3043   gcry_mac_open(&handle, GCRY_MAC_HMAC_MD5,
3044                 GCRY_MAC_FLAG_SECURE, NULL);
3045   return 0;
3046 }
3047 EOF
3048         if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
3049             gcrypt_hmac=yes
3050         fi
3051         cat > $TMPC << EOF
3052 #include <gcrypt.h>
3053 int main(void) {
3054   gcry_cipher_hd_t handle;
3055   gcry_cipher_open(&handle, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_XTS, 0);
3056   return 0;
3057 }
3058 EOF
3059         if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
3060             gcrypt_xts=yes
3061             qemu_private_xts=no
3062         fi
3063     elif test "$gcrypt" = "yes"; then
3064         feature_not_found "gcrypt" "Install gcrypt devel >= 1.5.0"
3065     else
3066         gcrypt="no"
3067     fi
3068 fi
3069
3070
3071 if test "$gcrypt" = "yes" && test "$nettle" = "yes"
3072 then
3073     error_exit "Only one of gcrypt & nettle can be enabled"
3074 fi
3075
3076 ##########################################
3077 # libtasn1 - only for the TLS creds/session test suite
3078
3079 tasn1=yes
3080 tasn1_cflags=""
3081 tasn1_libs=""
3082 if $pkg_config --exists "libtasn1"; then
3083     tasn1_cflags=$($pkg_config --cflags libtasn1)
3084     tasn1_libs=$($pkg_config --libs libtasn1)
3085 else
3086     tasn1=no
3087 fi
3088
3089
3090 ##########################################
3091 # PAM probe
3092
3093 if test "$auth_pam" != "no"; then
3094     cat > $TMPC <<EOF
3095 #include <security/pam_appl.h>
3096 #include <stdio.h>
3097 int main(void) {
3098    const char *service_name = "qemu";
3099    const char *user = "frank";
3100    const struct pam_conv pam_conv = { 0 };
3101    pam_handle_t *pamh = NULL;
3102    pam_start(service_name, user, &pam_conv, &pamh);
3103    return 0;
3104 }
3105 EOF
3106     if compile_prog "" "-lpam" ; then
3107         auth_pam=yes
3108     else
3109         if test "$auth_pam" = "yes"; then
3110             feature_not_found "PAM" "Install PAM development package"
3111         else
3112             auth_pam=no
3113         fi
3114     fi
3115 fi
3116
3117 ##########################################
3118 # getifaddrs (for tests/test-io-channel-socket )
3119
3120 have_ifaddrs_h=yes
3121 if ! check_include "ifaddrs.h" ; then
3122   have_ifaddrs_h=no
3123 fi
3124
3125 ##########################################
3126 # VTE probe
3127
3128 if test "$vte" != "no"; then
3129     vteminversion="0.32.0"
3130     if $pkg_config --exists "vte-2.91"; then
3131       vtepackage="vte-2.91"
3132     else
3133       vtepackage="vte-2.90"
3134     fi
3135     if $pkg_config --exists "$vtepackage >= $vteminversion"; then
3136         vte_cflags=$($pkg_config --cflags $vtepackage)
3137         vte_libs=$($pkg_config --libs $vtepackage)
3138         vteversion=$($pkg_config --modversion $vtepackage)
3139         vte="yes"
3140     elif test "$vte" = "yes"; then
3141         feature_not_found "vte" "Install libvte-2.90/2.91 devel"
3142     else
3143         vte="no"
3144     fi
3145 fi
3146
3147 ##########################################
3148 # SDL probe
3149
3150 # Look for sdl configuration program (pkg-config or sdl2-config).  Try
3151 # sdl2-config even without cross prefix, and favour pkg-config over sdl2-config.
3152
3153 sdl_probe ()
3154 {
3155   if $pkg_config sdl2 --exists; then
3156     sdlconfig="$pkg_config sdl2"
3157     sdlversion=$($sdlconfig --modversion 2>/dev/null)
3158   elif has "$sdl2_config"; then
3159     sdlconfig="$sdl2_config"
3160     sdlversion=$($sdlconfig --version)
3161   else
3162     if test "$sdl" = "yes" ; then
3163       feature_not_found "sdl" "Install SDL2-devel"
3164     fi
3165     sdl=no
3166     # no need to do the rest
3167     return
3168   fi
3169   if test -n "$cross_prefix" && test "$(basename "$sdlconfig")" = sdl2-config; then
3170     echo warning: using "\"$sdlconfig\"" to detect cross-compiled sdl >&2
3171   fi
3172
3173   cat > $TMPC << EOF
3174 #include <SDL.h>
3175 #undef main /* We don't want SDL to override our main() */
3176 int main( void ) { return SDL_Init (SDL_INIT_VIDEO); }
3177 EOF
3178   sdl_cflags=$($sdlconfig --cflags 2>/dev/null)
3179   sdl_cflags="$sdl_cflags -Wno-undef"  # workaround 2.0.8 bug
3180   if test "$static" = "yes" ; then
3181     if $pkg_config sdl2 --exists; then
3182       sdl_libs=$($pkg_config sdl2 --static --libs 2>/dev/null)
3183     else
3184       sdl_libs=$($sdlconfig --static-libs 2>/dev/null)
3185     fi
3186   else
3187     sdl_libs=$($sdlconfig --libs 2>/dev/null)
3188   fi
3189   if compile_prog "$sdl_cflags" "$sdl_libs" ; then
3190     sdl=yes
3191
3192     # static link with sdl ? (note: sdl.pc's --static --libs is broken)
3193     if test "$sdl" = "yes" && test "$static" = "yes" ; then
3194       if test $? = 0 && echo $sdl_libs | grep -- -laa > /dev/null; then
3195          sdl_libs="$sdl_libs $(aalib-config --static-libs 2>/dev/null)"
3196          sdl_cflags="$sdl_cflags $(aalib-config --cflags 2>/dev/null)"
3197       fi
3198       if compile_prog "$sdl_cflags" "$sdl_libs" ; then
3199         :
3200       else
3201         sdl=no
3202       fi
3203     fi # static link
3204   else # sdl not found
3205     if test "$sdl" = "yes" ; then
3206       feature_not_found "sdl" "Install SDL2 devel"
3207     fi
3208     sdl=no
3209   fi # sdl compile test
3210 }
3211
3212 sdl_image_probe ()
3213 {
3214     if test "$sdl_image" != "no" ; then
3215         if $pkg_config SDL2_image --exists; then
3216             if test "$static" = "yes"; then
3217                 sdl_image_libs=$($pkg_config SDL2_image --libs --static 2>/dev/null)
3218             else
3219                 sdl_image_libs=$($pkg_config SDL2_image --libs 2>/dev/null)
3220             fi
3221             sdl_image_cflags=$($pkg_config SDL2_image --cflags 2>/dev/null)
3222             sdl_image=yes
3223
3224             sdl_cflags="$sdl_cflags $sdl_image_cflags"
3225             sdl_libs="$sdl_libs $sdl_image_libs"
3226         else
3227             if test "$sdl_image" = "yes" ; then
3228                 feature_not_found "sdl_image" "Install SDL Image devel"
3229             else
3230                 sdl_image=no
3231             fi
3232         fi
3233     fi
3234 }
3235
3236 if test "$sdl" != "no" ; then
3237   sdl_probe
3238 fi
3239
3240 if test "$sdl" = "yes" ; then
3241   sdl_image_probe
3242 else
3243   if test "$sdl_image" = "yes"; then
3244     echo "warning: SDL Image requested, but SDL is not available, disabling"
3245   fi
3246   sdl_image=no
3247 fi
3248
3249 if test "$sdl" = "yes" ; then
3250   cat > $TMPC <<EOF
3251 #include <SDL.h>
3252 #if defined(SDL_VIDEO_DRIVER_X11)
3253 #include <X11/XKBlib.h>
3254 #else
3255 #error No x11 support
3256 #endif
3257 int main(void) { return 0; }
3258 EOF
3259   if compile_prog "$sdl_cflags $x11_cflags" "$sdl_libs $x11_libs" ; then
3260     need_x11=yes
3261     sdl_cflags="$sdl_cflags $x11_cflags"
3262     sdl_libs="$sdl_libs $x11_libs"
3263   fi
3264 fi
3265
3266 ##########################################
3267 # RDMA needs OpenFabrics libraries
3268 if test "$rdma" != "no" ; then
3269   cat > $TMPC <<EOF
3270 #include <rdma/rdma_cma.h>
3271 int main(void) { return 0; }
3272 EOF
3273   rdma_libs="-lrdmacm -libverbs -libumad"
3274   if compile_prog "" "$rdma_libs" ; then
3275     rdma="yes"
3276     libs_softmmu="$libs_softmmu $rdma_libs"
3277   else
3278     if test "$rdma" = "yes" ; then
3279         error_exit \
3280             " OpenFabrics librdmacm/libibverbs/libibumad not present." \
3281             " Your options:" \
3282             "  (1) Fast: Install infiniband packages (devel) from your distro." \
3283             "  (2) Cleanest: Install libraries from www.openfabrics.org" \
3284             "  (3) Also: Install softiwarp if you don't have RDMA hardware"
3285     fi
3286     rdma="no"
3287   fi
3288 fi
3289
3290 ##########################################
3291 # PVRDMA detection
3292
3293 cat > $TMPC <<EOF &&
3294 #include <sys/mman.h>
3295
3296 int
3297 main(void)
3298 {
3299     char buf = 0;
3300     void *addr = &buf;
3301     addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
3302
3303     return 0;
3304 }
3305 EOF
3306
3307 if test "$rdma" = "yes" ; then
3308     case "$pvrdma" in
3309     "")
3310         if compile_prog "" ""; then
3311             pvrdma="yes"
3312         else
3313             pvrdma="no"
3314         fi
3315         ;;
3316     "yes")
3317         if ! compile_prog "" ""; then
3318             error_exit "PVRDMA is not supported since mremap is not implemented"
3319         fi
3320         pvrdma="yes"
3321         ;;
3322     "no")
3323         pvrdma="no"
3324         ;;
3325     esac
3326 else
3327     if test "$pvrdma" = "yes" ; then
3328         error_exit "PVRDMA requires rdma suppport"
3329     fi
3330     pvrdma="no"
3331 fi
3332
3333 # Let's see if enhanced reg_mr is supported
3334 if test "$pvrdma" = "yes" ; then
3335
3336 cat > $TMPC <<EOF &&
3337 #include <infiniband/verbs.h>
3338
3339 int
3340 main(void)
3341 {
3342     struct ibv_mr *mr;
3343     struct ibv_pd *pd = NULL;
3344     size_t length = 10;
3345     uint64_t iova = 0;
3346     int access = 0;
3347     void *addr = NULL;
3348
3349     mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
3350
3351     ibv_dereg_mr(mr);
3352
3353     return 0;
3354 }
3355 EOF
3356     if ! compile_prog "" "-libverbs"; then
3357         QEMU_CFLAGS="$QEMU_CFLAGS -DLEGACY_RDMA_REG_MR"
3358     fi
3359 fi
3360
3361 ##########################################
3362 # VNC SASL detection
3363 if test "$vnc" = "yes" && test "$vnc_sasl" != "no" ; then
3364   cat > $TMPC <<EOF
3365 #include <sasl/sasl.h>
3366 #include <stdio.h>
3367 int main(void) { sasl_server_init(NULL, "qemu"); return 0; }
3368 EOF
3369   # Assuming Cyrus-SASL installed in /usr prefix
3370   # QEMU defines struct iovec in "qemu/osdep.h",
3371   # we don't want libsasl to redefine it in <sasl/sasl.h>.
3372   vnc_sasl_cflags="-DSTRUCT_IOVEC_DEFINED"
3373   vnc_sasl_libs="-lsasl2"
3374   if compile_prog "$vnc_sasl_cflags" "$vnc_sasl_libs" ; then
3375     vnc_sasl=yes
3376     libs_softmmu="$vnc_sasl_libs $libs_softmmu"
3377     QEMU_CFLAGS="$QEMU_CFLAGS $vnc_sasl_cflags"
3378   else
3379     if test "$vnc_sasl" = "yes" ; then
3380       feature_not_found "vnc-sasl" "Install Cyrus SASL devel"
3381     fi
3382     vnc_sasl=no
3383   fi
3384 fi
3385
3386 ##########################################
3387 # VNC JPEG detection
3388 if test "$vnc" = "yes" && test "$vnc_jpeg" != "no" ; then
3389 cat > $TMPC <<EOF
3390 #include <stdio.h>
3391 #include <jpeglib.h>
3392 int main(void) { struct jpeg_compress_struct s; jpeg_create_compress(&s); return 0; }
3393 EOF
3394     vnc_jpeg_cflags=""
3395     vnc_jpeg_libs="-ljpeg"
3396   if compile_prog "$vnc_jpeg_cflags" "$vnc_jpeg_libs" ; then
3397     vnc_jpeg=yes
3398     libs_softmmu="$vnc_jpeg_libs $libs_softmmu"
3399     QEMU_CFLAGS="$QEMU_CFLAGS $vnc_jpeg_cflags"
3400   else
3401     if test "$vnc_jpeg" = "yes" ; then
3402       feature_not_found "vnc-jpeg" "Install libjpeg-turbo devel"
3403     fi
3404     vnc_jpeg=no
3405   fi
3406 fi
3407
3408 ##########################################
3409 # VNC PNG detection
3410 if test "$vnc" = "yes" && test "$vnc_png" != "no" ; then
3411 cat > $TMPC <<EOF
3412 //#include <stdio.h>
3413 #include <png.h>
3414 #include <stddef.h>
3415 int main(void) {
3416     png_structp png_ptr;
3417     png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
3418     return png_ptr != 0;
3419 }
3420 EOF
3421   if $pkg_config libpng --exists; then
3422     vnc_png_cflags=$($pkg_config libpng --cflags)
3423     vnc_png_libs=$($pkg_config libpng --libs)
3424   else
3425     vnc_png_cflags=""
3426     vnc_png_libs="-lpng"
3427   fi
3428   if compile_prog "$vnc_png_cflags" "$vnc_png_libs" ; then
3429     vnc_png=yes
3430     libs_softmmu="$vnc_png_libs $libs_softmmu"
3431     QEMU_CFLAGS="$QEMU_CFLAGS $vnc_png_cflags"
3432   else
3433     if test "$vnc_png" = "yes" ; then
3434       feature_not_found "vnc-png" "Install libpng devel"
3435     fi
3436     vnc_png=no
3437   fi
3438 fi
3439
3440 ##########################################
3441 # xkbcommon probe
3442 if test "$xkbcommon" != "no" ; then
3443   if $pkg_config xkbcommon --exists; then
3444     xkbcommon_cflags=$($pkg_config xkbcommon --cflags)
3445     xkbcommon_libs=$($pkg_config xkbcommon --libs)
3446     xkbcommon=yes
3447   else
3448     if test "$xkbcommon" = "yes" ; then
3449       feature_not_found "xkbcommon" "Install libxkbcommon-devel"
3450     fi
3451     xkbcommon=no
3452   fi
3453 fi
3454
3455
3456 ##########################################
3457 # xfsctl() probe, used for file-posix.c
3458 if test "$xfs" != "no" ; then
3459   cat > $TMPC << EOF
3460 #include <stddef.h>  /* NULL */
3461 #include <xfs/xfs.h>
3462 int main(void)
3463 {
3464     xfsctl(NULL, 0, 0, NULL);
3465     return 0;
3466 }
3467 EOF
3468   if compile_prog "" "" ; then
3469     xfs="yes"
3470   else
3471     if test "$xfs" = "yes" ; then
3472       feature_not_found "xfs" "Instal xfsprogs/xfslibs devel"
3473     fi
3474     xfs=no
3475   fi
3476 fi
3477
3478 ##########################################
3479 # vde libraries probe
3480 if test "$vde" != "no" ; then
3481   vde_libs="-lvdeplug"
3482   cat > $TMPC << EOF
3483 #include <libvdeplug.h>
3484 int main(void)
3485 {
3486     struct vde_open_args a = {0, 0, 0};
3487     char s[] = "";
3488     vde_open(s, s, &a);
3489     return 0;
3490 }
3491 EOF
3492   if compile_prog "" "$vde_libs" ; then
3493     vde=yes
3494   else
3495     if test "$vde" = "yes" ; then
3496       feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
3497     fi
3498     vde=no
3499   fi
3500 fi
3501
3502 ##########################################
3503 # netmap support probe
3504 # Apart from looking for netmap headers, we make sure that the host API version
3505 # supports the netmap backend (>=11). The upper bound (15) is meant to simulate
3506 # a minor/major version number. Minor new features will be marked with values up
3507 # to 15, and if something happens that requires a change to the backend we will
3508 # move above 15, submit the backend fixes and modify this two bounds.
3509 if test "$netmap" != "no" ; then
3510   cat > $TMPC << EOF
3511 #include <inttypes.h>
3512 #include <net/if.h>
3513 #include <net/netmap.h>
3514 #include <net/netmap_user.h>
3515 #if (NETMAP_API < 11) || (NETMAP_API > 15)
3516 #error
3517 #endif
3518 int main(void) { return 0; }
3519 EOF
3520   if compile_prog "" "" ; then
3521     netmap=yes
3522   else
3523     if test "$netmap" = "yes" ; then
3524       feature_not_found "netmap"
3525     fi
3526     netmap=no
3527   fi
3528 fi
3529
3530 ##########################################
3531 # libcap-ng library probe
3532 if test "$cap_ng" != "no" ; then
3533   cap_libs="-lcap-ng"
3534   cat > $TMPC << EOF
3535 #include <cap-ng.h>
3536 int main(void)
3537 {
3538     capng_capability_to_name(CAPNG_EFFECTIVE);
3539     return 0;
3540 }
3541 EOF
3542   if compile_prog "" "$cap_libs" ; then
3543     cap_ng=yes
3544     libs_tools="$cap_libs $libs_tools"
3545   else
3546     if test "$cap_ng" = "yes" ; then
3547       feature_not_found "cap_ng" "Install libcap-ng devel"
3548     fi
3549     cap_ng=no
3550   fi
3551 fi
3552
3553 ##########################################
3554 # Sound support libraries probe
3555
3556 audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
3557 for drv in $audio_drv_list; do
3558     case $drv in
3559     alsa | try-alsa)
3560     if $pkg_config alsa --exists; then
3561         alsa_libs=$($pkg_config alsa --libs)
3562         if test "$drv" = "try-alsa"; then
3563             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa/alsa/')
3564         fi
3565     else
3566         if test "$drv" = "try-alsa"; then
3567             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa//')
3568         else
3569             error_exit "$drv check failed" \
3570                 "Make sure to have the $drv libs and headers installed."
3571         fi
3572     fi
3573     ;;
3574
3575     pa | try-pa)
3576     if $pkg_config libpulse --exists; then
3577         pulse_libs=$($pkg_config libpulse --libs)
3578         if test "$drv" = "try-pa"; then
3579             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa/pa/')
3580         fi
3581     else
3582         if test "$drv" = "try-pa"; then
3583             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa//')
3584         else
3585             error_exit "$drv check failed" \
3586                 "Make sure to have the $drv libs and headers installed."
3587         fi
3588     fi
3589     ;;
3590
3591     sdl)
3592     if test "$sdl" = "no"; then
3593         error_exit "sdl not found or disabled, can not use sdl audio driver"
3594     fi
3595     ;;
3596
3597     try-sdl)
3598     if test "$sdl" = "no"; then
3599         audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl//')
3600     else
3601         audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl/sdl/')
3602     fi
3603     ;;
3604
3605     coreaudio)
3606       coreaudio_libs="-framework CoreAudio"
3607     ;;
3608
3609     dsound)
3610       dsound_libs="-lole32 -ldxguid"
3611       audio_win_int="yes"
3612     ;;
3613
3614     oss)
3615       oss_libs="$oss_lib"
3616     ;;
3617
3618     *)
3619     echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
3620         error_exit "Unknown driver '$drv' selected" \
3621             "Possible drivers are: $audio_possible_drivers"
3622     }
3623     ;;
3624     esac
3625 done
3626
3627 ##########################################
3628 # BrlAPI probe
3629
3630 if test "$brlapi" != "no" ; then
3631   brlapi_libs="-lbrlapi"
3632   cat > $TMPC << EOF
3633 #include <brlapi.h>
3634 #include <stddef.h>
3635 int main( void ) { return brlapi__openConnection (NULL, NULL, NULL); }
3636 EOF
3637   if compile_prog "" "$brlapi_libs" ; then
3638     brlapi=yes
3639   else
3640     if test "$brlapi" = "yes" ; then
3641       feature_not_found "brlapi" "Install brlapi devel"
3642     fi
3643     brlapi=no
3644   fi
3645 fi
3646
3647 ##########################################
3648 # iconv probe
3649 if test "$iconv" != "no" ; then
3650   cat > $TMPC << EOF
3651 #include <iconv.h>
3652 int main(void) {
3653   iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
3654   return conv != (iconv_t) -1;
3655 }
3656 EOF
3657   iconv_prefix_list="/usr/local:/usr"
3658   iconv_lib_list=":-liconv"
3659   IFS=:
3660   for iconv_prefix in $iconv_prefix_list; do
3661     IFS=:
3662     iconv_cflags="-I$iconv_prefix/include"
3663     iconv_ldflags="-L$iconv_prefix/lib"
3664     for iconv_link in $iconv_lib_list; do
3665       unset IFS
3666       iconv_lib="$iconv_ldflags $iconv_link"
3667       echo "looking at iconv in '$iconv_cflags' '$iconv_lib'" >> config.log
3668       if compile_prog "$iconv_cflags" "$iconv_lib" ; then
3669         iconv_found=yes
3670         break
3671       fi
3672     done
3673     if test "$iconv_found" = yes ; then
3674       break
3675     fi
3676   done
3677   if test "$iconv_found" = "yes" ; then
3678     iconv=yes
3679   else
3680     if test "$iconv" = "yes" ; then
3681       feature_not_found "iconv" "Install iconv devel"
3682     fi
3683     iconv=no
3684   fi
3685 fi
3686
3687 ##########################################
3688 # curses probe
3689 if test "$iconv" = "no" ; then
3690   # curses will need iconv
3691   curses=no
3692 fi
3693 if test "$curses" != "no" ; then
3694   if test "$mingw32" = "yes" ; then
3695     curses_inc_list="$($pkg_config --cflags ncurses 2>/dev/null):"
3696     curses_lib_list="$($pkg_config --libs ncurses 2>/dev/null):-lpdcurses"
3697   else
3698     curses_inc_list="$($pkg_config --cflags ncursesw 2>/dev/null):-I/usr/include/ncursesw:"
3699     curses_lib_list="$($pkg_config --libs ncursesw 2>/dev/null):-lncursesw:-lcursesw"
3700   fi
3701   curses_found=no
3702   cat > $TMPC << EOF
3703 #include <locale.h>
3704 #include <curses.h>
3705 #include <wchar.h>
3706 #include <langinfo.h>
3707 int main(void) {
3708   const char *codeset;
3709   wchar_t wch = L'w';
3710   setlocale(LC_ALL, "");
3711   resize_term(0, 0);
3712   addwstr(L"wide chars\n");
3713   addnwstr(&wch, 1);
3714   add_wch(WACS_DEGREE);
3715   codeset = nl_langinfo(CODESET);
3716   return codeset != 0;
3717 }
3718 EOF
3719   IFS=:
3720   for curses_inc in $curses_inc_list; do
3721     # Make sure we get the wide character prototypes
3722     curses_inc="-DNCURSES_WIDECHAR $curses_inc"
3723     IFS=:
3724     for curses_lib in $curses_lib_list; do
3725       unset IFS
3726       if compile_prog "$curses_inc" "$curses_lib" ; then
3727         curses_found=yes
3728         break
3729       fi
3730     done
3731     if test "$curses_found" = yes ; then
3732       break
3733     fi
3734   done
3735   unset IFS
3736   if test "$curses_found" = "yes" ; then
3737     curses=yes
3738   else
3739     if test "$curses" = "yes" ; then
3740       feature_not_found "curses" "Install ncurses devel"
3741     fi
3742     curses=no
3743   fi
3744 fi
3745
3746 ##########################################
3747 # curl probe
3748 if test "$curl" != "no" ; then
3749   if $pkg_config libcurl --exists; then
3750     curlconfig="$pkg_config libcurl"
3751   else
3752     curlconfig=curl-config
3753   fi
3754   cat > $TMPC << EOF
3755 #include <curl/curl.h>
3756 int main(void) { curl_easy_init(); curl_multi_setopt(0, 0, 0); return 0; }
3757 EOF
3758   curl_cflags=$($curlconfig --cflags 2>/dev/null)
3759   curl_libs=$($curlconfig --libs 2>/dev/null)
3760   if compile_prog "$curl_cflags" "$curl_libs" ; then
3761     curl=yes
3762   else
3763     if test "$curl" = "yes" ; then
3764       feature_not_found "curl" "Install libcurl devel"
3765     fi
3766     curl=no
3767   fi
3768 fi # test "$curl"
3769
3770 ##########################################
3771 # glib support probe
3772
3773 glib_req_ver=2.48
3774 glib_modules=gthread-2.0
3775 if test "$modules" = yes; then
3776     glib_modules="$glib_modules gmodule-export-2.0"
3777 fi
3778 if test "$plugins" = yes; then
3779     glib_modules="$glib_modules gmodule-2.0"
3780 fi
3781
3782 # This workaround is required due to a bug in pkg-config file for glib as it
3783 # doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
3784
3785 if test "$static" = yes && test "$mingw32" = yes; then
3786     QEMU_CFLAGS="-DGLIB_STATIC_COMPILATION $QEMU_CFLAGS"
3787 fi
3788
3789 for i in $glib_modules; do
3790     if $pkg_config --atleast-version=$glib_req_ver $i; then
3791         glib_cflags=$($pkg_config --cflags $i)
3792         glib_libs=$($pkg_config --libs $i)
3793         QEMU_CFLAGS="$glib_cflags $QEMU_CFLAGS"
3794         LIBS="$glib_libs $LIBS"
3795         libs_qga="$glib_libs $libs_qga"
3796     else
3797         error_exit "glib-$glib_req_ver $i is required to compile QEMU"
3798     fi
3799 done
3800
3801 if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
3802     gio=yes
3803     gio_cflags=$($pkg_config --cflags gio-2.0)
3804     gio_libs=$($pkg_config --libs gio-2.0)
3805     gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
3806     if [ ! -x "$gdbus_codegen" ]; then
3807         gdbus_codegen=
3808     fi
3809 else
3810     gio=no
3811 fi
3812
3813 if $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
3814     gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
3815     gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
3816 fi
3817
3818 # Sanity check that the current size_t matches the
3819 # size that glib thinks it should be. This catches
3820 # problems on multi-arch where people try to build
3821 # 32-bit QEMU while pointing at 64-bit glib headers
3822 cat > $TMPC <<EOF
3823 #include <glib.h>
3824 #include <unistd.h>
3825
3826 #define QEMU_BUILD_BUG_ON(x) \
3827   typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
3828
3829 int main(void) {
3830    QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
3831    return 0;
3832 }
3833 EOF
3834
3835 if ! compile_prog "$CFLAGS" "$LIBS" ; then
3836     error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
3837                "You probably need to set PKG_CONFIG_LIBDIR"\
3838                "to point to the right pkg-config files for your"\
3839                "build target"
3840 fi
3841
3842 # Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
3843 cat > $TMPC << EOF
3844 #include <glib.h>
3845 int main(void) { return 0; }
3846 EOF
3847 if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3848     if cc_has_warning_flag "-Wno-unknown-attributes"; then
3849         glib_cflags="-Wno-unknown-attributes $glib_cflags"
3850         CFLAGS="-Wno-unknown-attributes $CFLAGS"
3851     fi
3852 fi
3853
3854 #########################################
3855 # zlib check
3856
3857 if test "$zlib" != "no" ; then
3858     if $pkg_config --exists zlib; then
3859         zlib_cflags=$($pkg_config --cflags zlib)
3860         zlib_libs=$($pkg_config --libs zlib)
3861         QEMU_CFLAGS="$zlib_cflags $QEMU_CFLAGS"
3862         LIBS="$zlib_libs $LIBS"
3863     else
3864         cat > $TMPC << EOF
3865 #include <zlib.h>
3866 int main(void) { zlibVersion(); return 0; }
3867 EOF
3868         if compile_prog "" "-lz" ; then
3869             LIBS="$LIBS -lz"
3870         else
3871             error_exit "zlib check failed" \
3872                 "Make sure to have the zlib libs and headers installed."
3873         fi
3874     fi
3875 fi
3876
3877 ##########################################
3878 # SHA command probe for modules
3879 if test "$modules" = yes; then
3880     shacmd_probe="sha1sum sha1 shasum"
3881     for c in $shacmd_probe; do
3882         if has $c; then
3883             shacmd="$c"
3884             break
3885         fi
3886     done
3887     if test "$shacmd" = ""; then
3888         error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
3889     fi
3890 fi
3891
3892 ##########################################
3893 # pixman support probe
3894
3895 if test "$want_tools" = "no" && test "$softmmu" = "no"; then
3896   pixman_cflags=
3897   pixman_libs=
3898 elif $pkg_config --atleast-version=0.21.8 pixman-1 > /dev/null 2>&1; then
3899   pixman_cflags=$($pkg_config --cflags pixman-1)
3900   pixman_libs=$($pkg_config --libs pixman-1)
3901 else
3902   error_exit "pixman >= 0.21.8 not present." \
3903       "Please install the pixman devel package."
3904 fi
3905
3906 ##########################################
3907 # libmpathpersist probe
3908
3909 if test "$mpath" != "no" ; then
3910   # probe for the new API
3911   cat > $TMPC <<EOF
3912 #include <libudev.h>
3913 #include <mpath_persist.h>
3914 unsigned mpath_mx_alloc_len = 1024;
3915 int logsink;
3916 static struct config *multipath_conf;
3917 extern struct udev *udev;
3918 extern struct config *get_multipath_config(void);
3919 extern void put_multipath_config(struct config *conf);
3920 struct udev *udev;
3921 struct config *get_multipath_config(void) { return multipath_conf; }
3922 void put_multipath_config(struct config *conf) { }
3923
3924 int main(void) {
3925     udev = udev_new();
3926     multipath_conf = mpath_lib_init();
3927     return 0;
3928 }
3929 EOF
3930   if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
3931     mpathpersist=yes
3932     mpathpersist_new_api=yes
3933   else
3934     # probe for the old API
3935     cat > $TMPC <<EOF
3936 #include <libudev.h>
3937 #include <mpath_persist.h>
3938 unsigned mpath_mx_alloc_len = 1024;
3939 int logsink;
3940 int main(void) {
3941     struct udev *udev = udev_new();
3942     mpath_lib_init(udev);
3943     return 0;
3944 }
3945 EOF
3946     if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
3947       mpathpersist=yes
3948       mpathpersist_new_api=no
3949     else
3950       mpathpersist=no
3951     fi
3952   fi
3953 else
3954   mpathpersist=no
3955 fi
3956
3957 ##########################################
3958 # pthread probe
3959 PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
3960
3961 pthread=no
3962 cat > $TMPC << EOF
3963 #include <pthread.h>
3964 static void *f(void *p) { return NULL; }
3965 int main(void) {
3966   pthread_t thread;
3967   pthread_create(&thread, 0, f, 0);
3968   return 0;
3969 }
3970 EOF
3971 if compile_prog "" "" ; then
3972   pthread=yes
3973 else
3974   for pthread_lib in $PTHREADLIBS_LIST; do
3975     if compile_prog "" "$pthread_lib" ; then
3976       pthread=yes
3977       found=no
3978       for lib_entry in $LIBS; do
3979         if test "$lib_entry" = "$pthread_lib"; then
3980           found=yes
3981           break
3982         fi
3983       done
3984       if test "$found" = "no"; then
3985         LIBS="$pthread_lib $LIBS"
3986         libs_qga="$pthread_lib $libs_qga"
3987       fi
3988       PTHREAD_LIB="$pthread_lib"
3989       break
3990     fi
3991   done
3992 fi
3993
3994 if test "$mingw32" != yes && test "$pthread" = no; then
3995   error_exit "pthread check failed" \
3996       "Make sure to have the pthread libs and headers installed."
3997 fi
3998
3999 # check for pthread_setname_np with thread id
4000 pthread_setname_np_w_tid=no
4001 cat > $TMPC << EOF
4002 #include <pthread.h>
4003
4004 static void *f(void *p) { return NULL; }
4005 int main(void)
4006 {
4007     pthread_t thread;
4008     pthread_create(&thread, 0, f, 0);
4009     pthread_setname_np(thread, "QEMU");
4010     return 0;
4011 }
4012 EOF
4013 if compile_prog "" "$pthread_lib" ; then
4014   pthread_setname_np_w_tid=yes
4015 fi
4016
4017 # check for pthread_setname_np without thread id
4018 pthread_setname_np_wo_tid=no
4019 cat > $TMPC << EOF
4020 #include <pthread.h>
4021
4022 static void *f(void *p) { pthread_setname_np("QEMU"); }
4023 int main(void)
4024 {
4025     pthread_t thread;
4026     pthread_create(&thread, 0, f, 0);
4027     return 0;
4028 }
4029 EOF
4030 if compile_prog "" "$pthread_lib" ; then
4031   pthread_setname_np_wo_tid=yes
4032 fi
4033
4034 ##########################################
4035 # rbd probe
4036 if test "$rbd" != "no" ; then
4037   cat > $TMPC <<EOF
4038 #include <stdio.h>
4039 #include <rbd/librbd.h>
4040 int main(void) {
4041     rados_t cluster;
4042     rados_create(&cluster, NULL);
4043     return 0;
4044 }
4045 EOF
4046   rbd_libs="-lrbd -lrados"
4047   if compile_prog "" "$rbd_libs" ; then
4048     rbd=yes
4049   else
4050     if test "$rbd" = "yes" ; then
4051       feature_not_found "rados block device" "Install librbd/ceph devel"
4052     fi
4053     rbd=no
4054   fi
4055 fi
4056
4057 ##########################################
4058 # libssh probe
4059 if test "$libssh" != "no" ; then
4060   if $pkg_config --exists libssh; then
4061     libssh_cflags=$($pkg_config libssh --cflags)
4062     libssh_libs=$($pkg_config libssh --libs)
4063     libssh=yes
4064   else
4065     if test "$libssh" = "yes" ; then
4066       error_exit "libssh required for --enable-libssh"
4067     fi
4068     libssh=no
4069   fi
4070 fi
4071
4072 ##########################################
4073 # Check for libssh 0.8
4074 # This is done like this instead of using the LIBSSH_VERSION_* and
4075 # SSH_VERSION_* macros because some distributions in the past shipped
4076 # snapshots of the future 0.8 from Git, and those snapshots did not
4077 # have updated version numbers (still referring to 0.7.0).
4078
4079 if test "$libssh" = "yes"; then
4080   cat > $TMPC <<EOF
4081 #include <libssh/libssh.h>
4082 int main(void) { return ssh_get_server_publickey(NULL, NULL); }
4083 EOF
4084   if compile_prog "$libssh_cflags" "$libssh_libs"; then
4085     libssh_cflags="-DHAVE_LIBSSH_0_8 $libssh_cflags"
4086   fi
4087 fi
4088
4089 ##########################################
4090 # linux-aio probe
4091
4092 if test "$linux_aio" != "no" ; then
4093   cat > $TMPC <<EOF
4094 #include <libaio.h>
4095 #include <sys/eventfd.h>
4096 #include <stddef.h>
4097 int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
4098 EOF
4099   if compile_prog "" "-laio" ; then
4100     linux_aio=yes
4101   else
4102     if test "$linux_aio" = "yes" ; then
4103       feature_not_found "linux AIO" "Install libaio devel"
4104     fi
4105     linux_aio=no
4106   fi
4107 fi
4108 ##########################################
4109 # linux-io-uring probe
4110
4111 if test "$linux_io_uring" != "no" ; then
4112   if $pkg_config liburing; then
4113     linux_io_uring_cflags=$($pkg_config --cflags liburing)
4114     linux_io_uring_libs=$($pkg_config --libs liburing)
4115     linux_io_uring=yes
4116
4117     # io_uring is used in libqemuutil.a where per-file -libs variables are not
4118     # seen by programs linking the archive.  It's not ideal, but just add the
4119     # library dependency globally.
4120     LIBS="$linux_io_uring_libs $LIBS"
4121   else
4122     if test "$linux_io_uring" = "yes" ; then
4123       feature_not_found "linux io_uring" "Install liburing devel"
4124     fi
4125     linux_io_uring=no
4126   fi
4127 fi
4128
4129 ##########################################
4130 # TPM emulation is only on POSIX
4131
4132 if test "$tpm" = ""; then
4133   if test "$mingw32" = "yes"; then
4134     tpm=no
4135   else
4136     tpm=yes
4137   fi
4138 elif test "$tpm" = "yes"; then
4139   if test "$mingw32" = "yes" ; then
4140     error_exit "TPM emulation only available on POSIX systems"
4141   fi
4142 fi
4143
4144 ##########################################
4145 # attr probe
4146
4147 if test "$attr" != "no" ; then
4148   cat > $TMPC <<EOF
4149 #include <stdio.h>
4150 #include <sys/types.h>
4151 #ifdef CONFIG_LIBATTR
4152 #include <attr/xattr.h>
4153 #else
4154 #include <sys/xattr.h>
4155 #endif
4156 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }
4157 EOF
4158   if compile_prog "" "" ; then
4159     attr=yes
4160   # Older distros have <attr/xattr.h>, and need -lattr:
4161   elif compile_prog "-DCONFIG_LIBATTR" "-lattr" ; then
4162     attr=yes
4163     LIBS="-lattr $LIBS"
4164     libattr=yes
4165   else
4166     if test "$attr" = "yes" ; then
4167       feature_not_found "ATTR" "Install libc6 or libattr devel"
4168     fi
4169     attr=no
4170   fi
4171 fi
4172
4173 ##########################################
4174 # iovec probe
4175 cat > $TMPC <<EOF
4176 #include <sys/types.h>
4177 #include <sys/uio.h>
4178 #include <unistd.h>
4179 int main(void) { return sizeof(struct iovec); }
4180 EOF
4181 iovec=no
4182 if compile_prog "" "" ; then
4183   iovec=yes
4184 fi
4185
4186 ##########################################
4187 # preadv probe
4188 cat > $TMPC <<EOF
4189 #include <sys/types.h>
4190 #include <sys/uio.h>
4191 #include <unistd.h>
4192 int main(void) { return preadv(0, 0, 0, 0); }
4193 EOF
4194 preadv=no
4195 if compile_prog "" "" ; then
4196   preadv=yes
4197 fi
4198
4199 ##########################################
4200 # fdt probe
4201 # fdt support is mandatory for at least some target architectures,
4202 # so insist on it if we're building those system emulators.
4203 fdt_required=no
4204 for target in $target_list; do
4205   case $target in
4206     aarch64*-softmmu|arm*-softmmu|ppc*-softmmu|microblaze*-softmmu|mips64el-softmmu|riscv*-softmmu)
4207       fdt_required=yes
4208     ;;
4209   esac
4210 done
4211
4212 if test "$fdt_required" = "yes"; then
4213   if test "$fdt" = "no"; then
4214     error_exit "fdt disabled but some requested targets require it." \
4215       "You can turn off fdt only if you also disable all the system emulation" \
4216       "targets which need it (by specifying a cut down --target-list)."
4217   fi
4218   fdt=yes
4219 elif test "$fdt" != "yes" ; then
4220   fdt=no
4221 fi
4222
4223 # fdt is only re