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