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