modules: load modules from versioned /var/run dir
[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="-I\$(SRC_PATH)/linux-headers -I$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   vnc_sasl_cflags=""
3371   vnc_sasl_libs="-lsasl2"
3372   if compile_prog "$vnc_sasl_cflags" "$vnc_sasl_libs" ; then
3373     vnc_sasl=yes
3374     libs_softmmu="$vnc_sasl_libs $libs_softmmu"
3375     QEMU_CFLAGS="$QEMU_CFLAGS $vnc_sasl_cflags"
3376   else
3377     if test "$vnc_sasl" = "yes" ; then
3378       feature_not_found "vnc-sasl" "Install Cyrus SASL devel"
3379     fi
3380     vnc_sasl=no
3381   fi
3382 fi
3383
3384 ##########################################
3385 # VNC JPEG detection
3386 if test "$vnc" = "yes" && test "$vnc_jpeg" != "no" ; then
3387 cat > $TMPC <<EOF
3388 #include <stdio.h>
3389 #include <jpeglib.h>
3390 int main(void) { struct jpeg_compress_struct s; jpeg_create_compress(&s); return 0; }
3391 EOF
3392     vnc_jpeg_cflags=""
3393     vnc_jpeg_libs="-ljpeg"
3394   if compile_prog "$vnc_jpeg_cflags" "$vnc_jpeg_libs" ; then
3395     vnc_jpeg=yes
3396     libs_softmmu="$vnc_jpeg_libs $libs_softmmu"
3397     QEMU_CFLAGS="$QEMU_CFLAGS $vnc_jpeg_cflags"
3398   else
3399     if test "$vnc_jpeg" = "yes" ; then
3400       feature_not_found "vnc-jpeg" "Install libjpeg-turbo devel"
3401     fi
3402     vnc_jpeg=no
3403   fi
3404 fi
3405
3406 ##########################################
3407 # VNC PNG detection
3408 if test "$vnc" = "yes" && test "$vnc_png" != "no" ; then
3409 cat > $TMPC <<EOF
3410 //#include <stdio.h>
3411 #include <png.h>
3412 #include <stddef.h>
3413 int main(void) {
3414     png_structp png_ptr;
3415     png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
3416     return png_ptr != 0;
3417 }
3418 EOF
3419   if $pkg_config libpng --exists; then
3420     vnc_png_cflags=$($pkg_config libpng --cflags)
3421     vnc_png_libs=$($pkg_config libpng --libs)
3422   else
3423     vnc_png_cflags=""
3424     vnc_png_libs="-lpng"
3425   fi
3426   if compile_prog "$vnc_png_cflags" "$vnc_png_libs" ; then
3427     vnc_png=yes
3428     libs_softmmu="$vnc_png_libs $libs_softmmu"
3429     QEMU_CFLAGS="$QEMU_CFLAGS $vnc_png_cflags"
3430   else
3431     if test "$vnc_png" = "yes" ; then
3432       feature_not_found "vnc-png" "Install libpng devel"
3433     fi
3434     vnc_png=no
3435   fi
3436 fi
3437
3438 ##########################################
3439 # xkbcommon probe
3440 if test "$xkbcommon" != "no" ; then
3441   if $pkg_config xkbcommon --exists; then
3442     xkbcommon_cflags=$($pkg_config xkbcommon --cflags)
3443     xkbcommon_libs=$($pkg_config xkbcommon --libs)
3444     xkbcommon=yes
3445   else
3446     if test "$xkbcommon" = "yes" ; then
3447       feature_not_found "xkbcommon" "Install libxkbcommon-devel"
3448     fi
3449     xkbcommon=no
3450   fi
3451 fi
3452
3453
3454 ##########################################
3455 # xfsctl() probe, used for file-posix.c
3456 if test "$xfs" != "no" ; then
3457   cat > $TMPC << EOF
3458 #include <stddef.h>  /* NULL */
3459 #include <xfs/xfs.h>
3460 int main(void)
3461 {
3462     xfsctl(NULL, 0, 0, NULL);
3463     return 0;
3464 }
3465 EOF
3466   if compile_prog "" "" ; then
3467     xfs="yes"
3468   else
3469     if test "$xfs" = "yes" ; then
3470       feature_not_found "xfs" "Instal xfsprogs/xfslibs devel"
3471     fi
3472     xfs=no
3473   fi
3474 fi
3475
3476 ##########################################
3477 # vde libraries probe
3478 if test "$vde" != "no" ; then
3479   vde_libs="-lvdeplug"
3480   cat > $TMPC << EOF
3481 #include <libvdeplug.h>
3482 int main(void)
3483 {
3484     struct vde_open_args a = {0, 0, 0};
3485     char s[] = "";
3486     vde_open(s, s, &a);
3487     return 0;
3488 }
3489 EOF
3490   if compile_prog "" "$vde_libs" ; then
3491     vde=yes
3492   else
3493     if test "$vde" = "yes" ; then
3494       feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
3495     fi
3496     vde=no
3497   fi
3498 fi
3499
3500 ##########################################
3501 # netmap support probe
3502 # Apart from looking for netmap headers, we make sure that the host API version
3503 # supports the netmap backend (>=11). The upper bound (15) is meant to simulate
3504 # a minor/major version number. Minor new features will be marked with values up
3505 # to 15, and if something happens that requires a change to the backend we will
3506 # move above 15, submit the backend fixes and modify this two bounds.
3507 if test "$netmap" != "no" ; then
3508   cat > $TMPC << EOF
3509 #include <inttypes.h>
3510 #include <net/if.h>
3511 #include <net/netmap.h>
3512 #include <net/netmap_user.h>
3513 #if (NETMAP_API < 11) || (NETMAP_API > 15)
3514 #error
3515 #endif
3516 int main(void) { return 0; }
3517 EOF
3518   if compile_prog "" "" ; then
3519     netmap=yes
3520   else
3521     if test "$netmap" = "yes" ; then
3522       feature_not_found "netmap"
3523     fi
3524     netmap=no
3525   fi
3526 fi
3527
3528 ##########################################
3529 # libcap-ng library probe
3530 if test "$cap_ng" != "no" ; then
3531   cap_libs="-lcap-ng"
3532   cat > $TMPC << EOF
3533 #include <cap-ng.h>
3534 int main(void)
3535 {
3536     capng_capability_to_name(CAPNG_EFFECTIVE);
3537     return 0;
3538 }
3539 EOF
3540   if compile_prog "" "$cap_libs" ; then
3541     cap_ng=yes
3542     libs_tools="$cap_libs $libs_tools"
3543   else
3544     if test "$cap_ng" = "yes" ; then
3545       feature_not_found "cap_ng" "Install libcap-ng devel"
3546     fi
3547     cap_ng=no
3548   fi
3549 fi
3550
3551 ##########################################
3552 # Sound support libraries probe
3553
3554 audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
3555 for drv in $audio_drv_list; do
3556     case $drv in
3557     alsa | try-alsa)
3558     if $pkg_config alsa --exists; then
3559         alsa_libs=$($pkg_config alsa --libs)
3560         if test "$drv" = "try-alsa"; then
3561             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa/alsa/')
3562         fi
3563     else
3564         if test "$drv" = "try-alsa"; then
3565             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa//')
3566         else
3567             error_exit "$drv check failed" \
3568                 "Make sure to have the $drv libs and headers installed."
3569         fi
3570     fi
3571     ;;
3572
3573     pa | try-pa)
3574     if $pkg_config libpulse --exists; then
3575         pulse_libs=$($pkg_config libpulse --libs)
3576         if test "$drv" = "try-pa"; then
3577             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa/pa/')
3578         fi
3579     else
3580         if test "$drv" = "try-pa"; then
3581             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa//')
3582         else
3583             error_exit "$drv check failed" \
3584                 "Make sure to have the $drv libs and headers installed."
3585         fi
3586     fi
3587     ;;
3588
3589     sdl)
3590     if test "$sdl" = "no"; then
3591         error_exit "sdl not found or disabled, can not use sdl audio driver"
3592     fi
3593     ;;
3594
3595     try-sdl)
3596     if test "$sdl" = "no"; then
3597         audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl//')
3598     else
3599         audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl/sdl/')
3600     fi
3601     ;;
3602
3603     coreaudio)
3604       coreaudio_libs="-framework CoreAudio"
3605     ;;
3606
3607     dsound)
3608       dsound_libs="-lole32 -ldxguid"
3609       audio_win_int="yes"
3610     ;;
3611
3612     oss)
3613       oss_libs="$oss_lib"
3614     ;;
3615
3616     *)
3617     echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
3618         error_exit "Unknown driver '$drv' selected" \
3619             "Possible drivers are: $audio_possible_drivers"
3620     }
3621     ;;
3622     esac
3623 done
3624
3625 ##########################################
3626 # BrlAPI probe
3627
3628 if test "$brlapi" != "no" ; then
3629   brlapi_libs="-lbrlapi"
3630   cat > $TMPC << EOF
3631 #include <brlapi.h>
3632 #include <stddef.h>
3633 int main( void ) { return brlapi__openConnection (NULL, NULL, NULL); }
3634 EOF
3635   if compile_prog "" "$brlapi_libs" ; then
3636     brlapi=yes
3637   else
3638     if test "$brlapi" = "yes" ; then
3639       feature_not_found "brlapi" "Install brlapi devel"
3640     fi
3641     brlapi=no
3642   fi
3643 fi
3644
3645 ##########################################
3646 # iconv probe
3647 if test "$iconv" != "no" ; then
3648   cat > $TMPC << EOF
3649 #include <iconv.h>
3650 int main(void) {
3651   iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
3652   return conv != (iconv_t) -1;
3653 }
3654 EOF
3655   iconv_prefix_list="/usr/local:/usr"
3656   iconv_lib_list=":-liconv"
3657   IFS=:
3658   for iconv_prefix in $iconv_prefix_list; do
3659     IFS=:
3660     iconv_cflags="-I$iconv_prefix/include"
3661     iconv_ldflags="-L$iconv_prefix/lib"
3662     for iconv_link in $iconv_lib_list; do
3663       unset IFS
3664       iconv_lib="$iconv_ldflags $iconv_link"
3665       echo "looking at iconv in '$iconv_cflags' '$iconv_lib'" >> config.log
3666       if compile_prog "$iconv_cflags" "$iconv_lib" ; then
3667         iconv_found=yes
3668         break
3669       fi
3670     done
3671     if test "$iconv_found" = yes ; then
3672       break
3673     fi
3674   done
3675   if test "$iconv_found" = "yes" ; then
3676     iconv=yes
3677   else
3678     if test "$iconv" = "yes" ; then
3679       feature_not_found "iconv" "Install iconv devel"
3680     fi
3681     iconv=no
3682   fi
3683 fi
3684
3685 ##########################################
3686 # curses probe
3687 if test "$iconv" = "no" ; then
3688   # curses will need iconv
3689   curses=no
3690 fi
3691 if test "$curses" != "no" ; then
3692   if test "$mingw32" = "yes" ; then
3693     curses_inc_list="$($pkg_config --cflags ncurses 2>/dev/null):"
3694     curses_lib_list="$($pkg_config --libs ncurses 2>/dev/null):-lpdcurses"
3695   else
3696     curses_inc_list="$($pkg_config --cflags ncursesw 2>/dev/null):-I/usr/include/ncursesw:"
3697     curses_lib_list="$($pkg_config --libs ncursesw 2>/dev/null):-lncursesw:-lcursesw"
3698   fi
3699   curses_found=no
3700   cat > $TMPC << EOF
3701 #include <locale.h>
3702 #include <curses.h>
3703 #include <wchar.h>
3704 #include <langinfo.h>
3705 int main(void) {
3706   const char *codeset;
3707   wchar_t wch = L'w';
3708   setlocale(LC_ALL, "");
3709   resize_term(0, 0);
3710   addwstr(L"wide chars\n");
3711   addnwstr(&wch, 1);
3712   add_wch(WACS_DEGREE);
3713   codeset = nl_langinfo(CODESET);
3714   return codeset != 0;
3715 }
3716 EOF
3717   IFS=:
3718   for curses_inc in $curses_inc_list; do
3719     # Make sure we get the wide character prototypes
3720     curses_inc="-DNCURSES_WIDECHAR $curses_inc"
3721     IFS=:
3722     for curses_lib in $curses_lib_list; do
3723       unset IFS
3724       if compile_prog "$curses_inc" "$curses_lib" ; then
3725         curses_found=yes
3726         break
3727       fi
3728     done
3729     if test "$curses_found" = yes ; then
3730       break
3731     fi
3732   done
3733   unset IFS
3734   if test "$curses_found" = "yes" ; then
3735     curses=yes
3736   else
3737     if test "$curses" = "yes" ; then
3738       feature_not_found "curses" "Install ncurses devel"
3739     fi
3740     curses=no
3741   fi
3742 fi
3743
3744 ##########################################
3745 # curl probe
3746 if test "$curl" != "no" ; then
3747   if $pkg_config libcurl --exists; then
3748     curlconfig="$pkg_config libcurl"
3749   else
3750     curlconfig=curl-config
3751   fi
3752   cat > $TMPC << EOF
3753 #include <curl/curl.h>
3754 int main(void) { curl_easy_init(); curl_multi_setopt(0, 0, 0); return 0; }
3755 EOF
3756   curl_cflags=$($curlconfig --cflags 2>/dev/null)
3757   curl_libs=$($curlconfig --libs 2>/dev/null)
3758   if compile_prog "$curl_cflags" "$curl_libs" ; then
3759     curl=yes
3760   else
3761     if test "$curl" = "yes" ; then
3762       feature_not_found "curl" "Install libcurl devel"
3763     fi
3764     curl=no
3765   fi
3766 fi # test "$curl"
3767
3768 ##########################################
3769 # glib support probe
3770
3771 glib_req_ver=2.48
3772 glib_modules=gthread-2.0
3773 if test "$modules" = yes; then
3774     glib_modules="$glib_modules gmodule-export-2.0"
3775 fi
3776 if test "$plugins" = yes; then
3777     glib_modules="$glib_modules gmodule-2.0"
3778 fi
3779
3780 # This workaround is required due to a bug in pkg-config file for glib as it
3781 # doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
3782
3783 if test "$static" = yes && test "$mingw32" = yes; then
3784     QEMU_CFLAGS="-DGLIB_STATIC_COMPILATION $QEMU_CFLAGS"
3785 fi
3786
3787 for i in $glib_modules; do
3788     if $pkg_config --atleast-version=$glib_req_ver $i; then
3789         glib_cflags=$($pkg_config --cflags $i)
3790         glib_libs=$($pkg_config --libs $i)
3791         QEMU_CFLAGS="$glib_cflags $QEMU_CFLAGS"
3792         LIBS="$glib_libs $LIBS"
3793         libs_qga="$glib_libs $libs_qga"
3794     else
3795         error_exit "glib-$glib_req_ver $i is required to compile QEMU"
3796     fi
3797 done
3798
3799 if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
3800     gio=yes
3801     gio_cflags=$($pkg_config --cflags gio-2.0)
3802     gio_libs=$($pkg_config --libs gio-2.0)
3803     gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
3804     if [ ! -x "$gdbus_codegen" ]; then
3805         gdbus_codegen=
3806     fi
3807 else
3808     gio=no
3809 fi
3810
3811 if $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
3812     gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
3813     gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
3814 fi
3815
3816 # Sanity check that the current size_t matches the
3817 # size that glib thinks it should be. This catches
3818 # problems on multi-arch where people try to build
3819 # 32-bit QEMU while pointing at 64-bit glib headers
3820 cat > $TMPC <<EOF
3821 #include <glib.h>
3822 #include <unistd.h>
3823
3824 #define QEMU_BUILD_BUG_ON(x) \
3825   typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
3826
3827 int main(void) {
3828    QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
3829    return 0;
3830 }
3831 EOF
3832
3833 if ! compile_prog "$CFLAGS" "$LIBS" ; then
3834     error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
3835                "You probably need to set PKG_CONFIG_LIBDIR"\
3836                "to point to the right pkg-config files for your"\
3837                "build target"
3838 fi
3839
3840 # Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
3841 cat > $TMPC << EOF
3842 #include <glib.h>
3843 int main(void) { return 0; }
3844 EOF
3845 if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3846     if cc_has_warning_flag "-Wno-unknown-attributes"; then
3847         glib_cflags="-Wno-unknown-attributes $glib_cflags"
3848         CFLAGS="-Wno-unknown-attributes $CFLAGS"
3849     fi
3850 fi
3851
3852 #########################################
3853 # zlib check
3854
3855 if test "$zlib" != "no" ; then
3856     if $pkg_config --exists zlib; then
3857         zlib_cflags=$($pkg_config --cflags zlib)
3858         zlib_libs=$($pkg_config --libs zlib)
3859         QEMU_CFLAGS="$zlib_cflags $QEMU_CFLAGS"
3860         LIBS="$zlib_libs $LIBS"
3861     else
3862         cat > $TMPC << EOF
3863 #include <zlib.h>
3864 int main(void) { zlibVersion(); return 0; }
3865 EOF
3866         if compile_prog "" "-lz" ; then
3867             LIBS="$LIBS -lz"
3868         else
3869             error_exit "zlib check failed" \
3870                 "Make sure to have the zlib libs and headers installed."
3871         fi
3872     fi
3873 fi
3874
3875 ##########################################
3876 # SHA command probe for modules
3877 if test "$modules" = yes; then
3878     shacmd_probe="sha1sum sha1 shasum"
3879     for c in $shacmd_probe; do
3880         if has $c; then
3881             shacmd="$c"
3882             break
3883         fi
3884     done
3885     if test "$shacmd" = ""; then
3886         error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
3887     fi
3888 fi
3889
3890 ##########################################
3891 # pixman support probe
3892
3893 if test "$want_tools" = "no" && test "$softmmu" = "no"; then
3894   pixman_cflags=
3895   pixman_libs=
3896 elif $pkg_config --atleast-version=0.21.8 pixman-1 > /dev/null 2>&1; then
3897   pixman_cflags=$($pkg_config --cflags pixman-1)
3898   pixman_libs=$($pkg_config --libs pixman-1)
3899 else
3900   error_exit "pixman >= 0.21.8 not present." \
3901       "Please install the pixman devel package."
3902 fi
3903
3904 ##########################################
3905 # libmpathpersist probe
3906
3907 if test "$mpath" != "no" ; then
3908   # probe for the new API
3909   cat > $TMPC <<EOF
3910 #include <libudev.h>
3911 #include <mpath_persist.h>
3912 unsigned mpath_mx_alloc_len = 1024;
3913 int logsink;
3914 static struct config *multipath_conf;
3915 extern struct udev *udev;
3916 extern struct config *get_multipath_config(void);
3917 extern void put_multipath_config(struct config *conf);
3918 struct udev *udev;
3919 struct config *get_multipath_config(void) { return multipath_conf; }
3920 void put_multipath_config(struct config *conf) { }
3921
3922 int main(void) {
3923     udev = udev_new();
3924     multipath_conf = mpath_lib_init();
3925     return 0;
3926 }
3927 EOF
3928   if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
3929     mpathpersist=yes
3930     mpathpersist_new_api=yes
3931   else
3932     # probe for the old API
3933     cat > $TMPC <<EOF
3934 #include <libudev.h>
3935 #include <mpath_persist.h>
3936 unsigned mpath_mx_alloc_len = 1024;
3937 int logsink;
3938 int main(void) {
3939     struct udev *udev = udev_new();
3940     mpath_lib_init(udev);
3941     return 0;
3942 }
3943 EOF
3944     if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
3945       mpathpersist=yes
3946       mpathpersist_new_api=no
3947     else
3948       mpathpersist=no
3949     fi
3950   fi
3951 else
3952   mpathpersist=no
3953 fi
3954
3955 ##########################################
3956 # pthread probe
3957 PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
3958
3959 pthread=no
3960 cat > $TMPC << EOF
3961 #include <pthread.h>
3962 static void *f(void *p) { return NULL; }
3963 int main(void) {
3964   pthread_t thread;
3965   pthread_create(&thread, 0, f, 0);
3966   return 0;
3967 }
3968 EOF
3969 if compile_prog "" "" ; then
3970   pthread=yes
3971 else
3972   for pthread_lib in $PTHREADLIBS_LIST; do
3973     if compile_prog "" "$pthread_lib" ; then
3974       pthread=yes
3975       found=no
3976       for lib_entry in $LIBS; do
3977         if test "$lib_entry" = "$pthread_lib"; then
3978           found=yes
3979           break
3980         fi
3981       done
3982       if test "$found" = "no"; then
3983         LIBS="$pthread_lib $LIBS"
3984         libs_qga="$pthread_lib $libs_qga"
3985       fi
3986       PTHREAD_LIB="$pthread_lib"
3987       break
3988     fi
3989   done
3990 fi
3991
3992 if test "$mingw32" != yes && test "$pthread" = no; then
3993   error_exit "pthread check failed" \
3994       "Make sure to have the pthread libs and headers installed."
3995 fi
3996
3997 # check for pthread_setname_np with thread id
3998 pthread_setname_np_w_tid=no
3999 cat > $TMPC << EOF
4000 #include <pthread.h>
4001
4002 static void *f(void *p) { return NULL; }
4003 int main(void)
4004 {
4005     pthread_t thread;
4006     pthread_create(&thread, 0, f, 0);
4007     pthread_setname_np(thread, "QEMU");
4008     return 0;
4009 }
4010 EOF
4011 if compile_prog "" "$pthread_lib" ; then
4012   pthread_setname_np_w_tid=yes
4013 fi
4014
4015 # check for pthread_setname_np without thread id
4016 pthread_setname_np_wo_tid=no
4017 cat > $TMPC << EOF
4018 #include <pthread.h>
4019
4020 static void *f(void *p) { pthread_setname_np("QEMU"); }
4021 int main(void)
4022 {
4023     pthread_t thread;
4024     pthread_create(&thread, 0, f, 0);
4025     return 0;
4026 }
4027 EOF
4028 if compile_prog "" "$pthread_lib" ; then
4029   pthread_setname_np_wo_tid=yes
4030 fi
4031
4032 ##########################################
4033 # rbd probe
4034 if test "$rbd" != "no" ; then
4035   cat > $TMPC <<EOF
4036 #include <stdio.h>
4037 #include <rbd/librbd.h>
4038 int main(void) {
4039     rados_t cluster;
4040     rados_create(&cluster, NULL);
4041     return 0;
4042 }
4043 EOF
4044   rbd_libs="-lrbd -lrados"
4045   if compile_prog "" "$rbd_libs" ; then
4046     rbd=yes
4047   else
4048     if test "$rbd" = "yes" ; then
4049       feature_not_found "rados block device" "Install librbd/ceph devel"
4050     fi
4051     rbd=no
4052   fi
4053 fi
4054
4055 ##########################################
4056 # libssh probe
4057 if test "$libssh" != "no" ; then
4058   if $pkg_config --exists libssh; then
4059     libssh_cflags=$($pkg_config libssh --cflags)
4060     libssh_libs=$($pkg_config libssh --libs)
4061     libssh=yes
4062   else
4063     if test "$libssh" = "yes" ; then
4064       error_exit "libssh required for --enable-libssh"
4065     fi
4066     libssh=no
4067   fi
4068 fi
4069
4070 ##########################################
4071 # Check for libssh 0.8
4072 # This is done like this instead of using the LIBSSH_VERSION_* and
4073 # SSH_VERSION_* macros because some distributions in the past shipped
4074 # snapshots of the future 0.8 from Git, and those snapshots did not
4075 # have updated version numbers (still referring to 0.7.0).
4076
4077 if test "$libssh" = "yes"; then
4078   cat > $TMPC <<EOF
4079 #include <libssh/libssh.h>
4080 int main(void) { return ssh_get_server_publickey(NULL, NULL); }
4081 EOF
4082   if compile_prog "$libssh_cflags" "$libssh_libs"; then
4083     libssh_cflags="-DHAVE_LIBSSH_0_8 $libssh_cflags"
4084   fi
4085 fi
4086
4087 ##########################################
4088 # linux-aio probe
4089
4090 if test "$linux_aio" != "no" ; then
4091   cat > $TMPC <<EOF
4092 #include <libaio.h>
4093 #include <sys/eventfd.h>
4094 #include <stddef.h>
4095 int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
4096 EOF
4097   if compile_prog "" "-laio" ; then
4098     linux_aio=yes
4099   else
4100     if test "$linux_aio" = "yes" ; then
4101       feature_not_found "linux AIO" "Install libaio devel"
4102     fi
4103     linux_aio=no
4104   fi
4105 fi
4106 ##########################################
4107 # linux-io-uring probe
4108
4109 if test "$linux_io_uring" != "no" ; then
4110   if $pkg_config liburing; then
4111     linux_io_uring_cflags=$($pkg_config --cflags liburing)
4112     linux_io_uring_libs=$($pkg_config --libs liburing)
4113     linux_io_uring=yes
4114
4115     # io_uring is used in libqemuutil.a where per-file -libs variables are not
4116     # seen by programs linking the archive.  It's not ideal, but just add the
4117     # library dependency globally.
4118     LIBS="$linux_io_uring_libs $LIBS"
4119   else
4120     if test "$linux_io_uring" = "yes" ; then
4121       feature_not_found "linux io_uring" "Install liburing devel"
4122     fi
4123     linux_io_uring=no
4124   fi
4125 fi
4126
4127 ##########################################
4128 # TPM emulation is only on POSIX
4129
4130 if test "$tpm" = ""; then
4131   if test "$mingw32" = "yes"; then
4132     tpm=no
4133   else
4134     tpm=yes
4135   fi
4136 elif test "$tpm" = "yes"; then
4137   if test "$mingw32" = "yes" ; then
4138     error_exit "TPM emulation only available on POSIX systems"
4139   fi
4140 fi
4141
4142 ##########################################
4143 # attr probe
4144
4145 if test "$attr" != "no" ; then
4146   cat > $TMPC <<EOF
4147 #include <stdio.h>
4148 #include <sys/types.h>
4149 #ifdef CONFIG_LIBATTR
4150 #include <attr/xattr.h>
4151 #else
4152 #include <sys/xattr.h>
4153 #endif
4154 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }
4155 EOF
4156   if compile_prog "" "" ; then
4157     attr=yes
4158   # Older distros have <attr/xattr.h>, and need -lattr:
4159   elif compile_prog "-DCONFIG_LIBATTR" "-lattr" ; then
4160     attr=yes
4161     LIBS="-lattr $LIBS"
4162     libattr=yes
4163   else
4164     if test "$attr" = "yes" ; then
4165       feature_not_found "ATTR" "Install libc6 or libattr devel"
4166     fi
4167     attr=no
4168   fi
4169 fi
4170
4171 ##########################################
4172 # iovec probe
4173 cat > $TMPC <<EOF
4174 #include <sys/types.h>
4175 #include <sys/uio.h>
4176 #include <unistd.h>
4177 int main(void) { return sizeof(struct iovec); }
4178 EOF
4179 iovec=no
4180 if compile_prog "" "" ; then
4181   iovec=yes
4182 fi
4183
4184 ##########################################
4185 # preadv probe
4186 cat > $TMPC <<EOF
4187 #include <sys/types.h>
4188 #include <sys/uio.h>
4189 #include <unistd.h>
4190 int main(void) { return preadv(0, 0, 0, 0); }
4191 EOF
4192 preadv=no
4193 if compile_prog "" "" ; then
4194   preadv=yes
4195 fi
4196
4197 ##########################################
4198 # fdt probe
4199 # fdt support is mandatory for at least some target architectures,
4200 # so insist on it if we're building those system emulators.
4201 fdt_required=no
4202 for target in $target_list; do
4203   case $target in
4204     aarch64*-softmmu|arm*-softmmu|ppc*-softmmu|microblaze*-softmmu|mips64el-softmmu|riscv*-softmmu)
4205       fdt_required=yes
4206     ;;
4207   esac
4208 done
4209
4210 if test "$fdt_required" = "yes"; then
4211   if test "$fdt" = "no"; then
4212     error_exit "fdt disabled but some requested targets require it." \
4213       "You can turn off fdt only if you also disable all the system emulation" \
4214       "targets which need it (by specifying a cut down --target-list)."
4215   fi
4216   fdt=yes
4217 elif test "$fdt" != "yes" ; then
4218   fdt=no
4219 fi
4220
4221 # fdt is only required when building softmmu targets
4222 if test -z "$fdt" -a "$softmmu" != "yes" ; then
4223     fdt="no"