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