linux-user, nios2: sync syscall numbers with kernel v5.5
[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 xtensa sh4 microblaze arm ppc s390x sparc sparc64 \
1893     i386 x86_64 mips mips64 ; do
1894     # remove the file if it has been generated in the source directory
1895     rm -f "${source_path}/linux-user/${arch}/syscall_nr.h"
1896     # remove the dependency files
1897     find . -name "*.d" \
1898            -exec grep -q "${source_path}/linux-user/${arch}/syscall_nr.h" {} \; \
1899            -exec rm {} \;
1900 done
1901
1902 if test -z "$python"
1903 then
1904     error_exit "Python not found. Use --python=/path/to/python"
1905 fi
1906
1907 # Note that if the Python conditional here evaluates True we will exit
1908 # with status 1 which is a shell 'false' value.
1909 if ! $python -c 'import sys; sys.exit(sys.version_info < (3,5))'; then
1910   error_exit "Cannot use '$python', Python >= 3.5 is required." \
1911       "Use --python=/path/to/python to specify a supported Python."
1912 fi
1913
1914 # Preserve python version since some functionality is dependent on it
1915 python_version=$($python -c 'import sys; print("%d.%d.%d" % (sys.version_info[0], sys.version_info[1], sys.version_info[2]))' 2>/dev/null)
1916
1917 # Suppress writing compiled files
1918 python="$python -B"
1919
1920 # Check that the C compiler works. Doing this here before testing
1921 # the host CPU ensures that we had a valid CC to autodetect the
1922 # $cpu var (and we should bail right here if that's not the case).
1923 # It also allows the help message to be printed without a CC.
1924 write_c_skeleton;
1925 if compile_object ; then
1926   : C compiler works ok
1927 else
1928     error_exit "\"$cc\" either does not exist or does not work"
1929 fi
1930 if ! compile_prog ; then
1931     error_exit "\"$cc\" cannot build an executable (is your linker broken?)"
1932 fi
1933
1934 # Now we have handled --enable-tcg-interpreter and know we're not just
1935 # printing the help message, bail out if the host CPU isn't supported.
1936 if test "$ARCH" = "unknown"; then
1937     if test "$tcg_interpreter" = "yes" ; then
1938         echo "Unsupported CPU = $cpu, will use TCG with TCI (experimental)"
1939     else
1940         error_exit "Unsupported CPU = $cpu, try --enable-tcg-interpreter"
1941     fi
1942 fi
1943
1944 # Consult white-list to determine whether to enable werror
1945 # by default.  Only enable by default for git builds
1946 if test -z "$werror" ; then
1947     if test -e "$source_path/.git" && \
1948         { test "$linux" = "yes" || test "$mingw32" = "yes"; }; then
1949         werror="yes"
1950     else
1951         werror="no"
1952     fi
1953 fi
1954
1955 if test "$bogus_os" = "yes"; then
1956     # Now that we know that we're not printing the help and that
1957     # the compiler works (so the results of the check_defines we used
1958     # to identify the OS are reliable), if we didn't recognize the
1959     # host OS we should stop now.
1960     error_exit "Unrecognized host OS (uname -s reports '$(uname -s)')"
1961 fi
1962
1963 # Check whether the compiler matches our minimum requirements:
1964 cat > $TMPC << EOF
1965 #if defined(__clang_major__) && defined(__clang_minor__)
1966 # ifdef __apple_build_version__
1967 #  if __clang_major__ < 5 || (__clang_major__ == 5 && __clang_minor__ < 1)
1968 #   error You need at least XCode Clang v5.1 to compile QEMU
1969 #  endif
1970 # else
1971 #  if __clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ < 4)
1972 #   error You need at least Clang v3.4 to compile QEMU
1973 #  endif
1974 # endif
1975 #elif defined(__GNUC__) && defined(__GNUC_MINOR__)
1976 # if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8)
1977 #  error You need at least GCC v4.8 to compile QEMU
1978 # endif
1979 #else
1980 # error You either need GCC or Clang to compiler QEMU
1981 #endif
1982 int main (void) { return 0; }
1983 EOF
1984 if ! compile_prog "" "" ; then
1985     error_exit "You need at least GCC v4.8 or Clang v3.4 (or XCode Clang v5.1)"
1986 fi
1987
1988 gcc_flags="-Wold-style-declaration -Wold-style-definition -Wtype-limits"
1989 gcc_flags="-Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers $gcc_flags"
1990 gcc_flags="-Wno-missing-include-dirs -Wempty-body -Wnested-externs $gcc_flags"
1991 gcc_flags="-Wendif-labels -Wno-shift-negative-value $gcc_flags"
1992 gcc_flags="-Wno-initializer-overrides -Wexpansion-to-defined $gcc_flags"
1993 gcc_flags="-Wno-string-plus-int -Wno-typedef-redefinition $gcc_flags"
1994 # Note that we do not add -Werror to gcc_flags here, because that would
1995 # enable it for all configure tests. If a configure test failed due
1996 # to -Werror this would just silently disable some features,
1997 # so it's too error prone.
1998
1999 cc_has_warning_flag() {
2000     write_c_skeleton;
2001
2002     # Use the positive sense of the flag when testing for -Wno-wombat
2003     # support (gcc will happily accept the -Wno- form of unknown
2004     # warning options).
2005     optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
2006     compile_prog "-Werror $optflag" ""
2007 }
2008
2009 for flag in $gcc_flags; do
2010     if cc_has_warning_flag $flag ; then
2011         QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2012     fi
2013 done
2014
2015 if test "$stack_protector" != "no"; then
2016   cat > $TMPC << EOF
2017 int main(int argc, char *argv[])
2018 {
2019     char arr[64], *p = arr, *c = argv[0];
2020     while (*c) {
2021         *p++ = *c++;
2022     }
2023     return 0;
2024 }
2025 EOF
2026   gcc_flags="-fstack-protector-strong -fstack-protector-all"
2027   sp_on=0
2028   for flag in $gcc_flags; do
2029     # We need to check both a compile and a link, since some compiler
2030     # setups fail only on a .c->.o compile and some only at link time
2031     if do_cc $QEMU_CFLAGS -Werror $flag -c -o $TMPO $TMPC &&
2032        compile_prog "-Werror $flag" ""; then
2033       QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2034       QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
2035       sp_on=1
2036       break
2037     fi
2038   done
2039   if test "$stack_protector" = yes; then
2040     if test $sp_on = 0; then
2041       error_exit "Stack protector not supported"
2042     fi
2043   fi
2044 fi
2045
2046 # Disable -Wmissing-braces on older compilers that warn even for
2047 # the "universal" C zero initializer {0}.
2048 cat > $TMPC << EOF
2049 struct {
2050   int a[2];
2051 } x = {0};
2052 EOF
2053 if compile_object "-Werror" "" ; then
2054   :
2055 else
2056   QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces"
2057 fi
2058
2059 # Our module code doesn't support Windows
2060 if test "$modules" = "yes" && test "$mingw32" = "yes" ; then
2061   error_exit "Modules are not available for Windows"
2062 fi
2063
2064 # Static linking is not possible with modules or PIE
2065 if test "$static" = "yes" ; then
2066   if test "$modules" = "yes" ; then
2067     error_exit "static and modules are mutually incompatible"
2068   fi
2069   if test "$pie" = "yes" ; then
2070     error_exit "static and pie are mutually incompatible"
2071   else
2072     pie="no"
2073   fi
2074 fi
2075
2076 # Unconditional check for compiler __thread support
2077   cat > $TMPC << EOF
2078 static __thread int tls_var;
2079 int main(void) { return tls_var; }
2080 EOF
2081
2082 if ! compile_prog "-Werror" "" ; then
2083     error_exit "Your compiler does not support the __thread specifier for " \
2084         "Thread-Local Storage (TLS). Please upgrade to a version that does."
2085 fi
2086
2087 if test "$pie" = ""; then
2088   case "$cpu-$targetos" in
2089     i386-Linux|x86_64-Linux|x32-Linux|i386-OpenBSD|x86_64-OpenBSD)
2090       ;;
2091     *)
2092       pie="no"
2093       ;;
2094   esac
2095 fi
2096
2097 if test "$pie" != "no" ; then
2098   cat > $TMPC << EOF
2099
2100 #ifdef __linux__
2101 #  define THREAD __thread
2102 #else
2103 #  define THREAD
2104 #endif
2105
2106 static THREAD int tls_var;
2107
2108 int main(void) { return tls_var; }
2109
2110 EOF
2111   # check we support --no-pie first...
2112   if compile_prog "-Werror -fno-pie" "-no-pie"; then
2113     CFLAGS_NOPIE="-fno-pie"
2114     LDFLAGS_NOPIE="-nopie"
2115   fi
2116
2117   if compile_prog "-fPIE -DPIE" "-pie"; then
2118     QEMU_CFLAGS="-fPIE -DPIE $QEMU_CFLAGS"
2119     QEMU_LDFLAGS="-pie $QEMU_LDFLAGS"
2120     pie="yes"
2121     if compile_prog "" "-Wl,-z,relro -Wl,-z,now" ; then
2122       QEMU_LDFLAGS="-Wl,-z,relro -Wl,-z,now $QEMU_LDFLAGS"
2123     fi
2124   else
2125     if test "$pie" = "yes"; then
2126       error_exit "PIE not available due to missing toolchain support"
2127     else
2128       echo "Disabling PIE due to missing toolchain support"
2129       pie="no"
2130     fi
2131   fi
2132 fi
2133
2134 ##########################################
2135 # __sync_fetch_and_and requires at least -march=i486. Many toolchains
2136 # use i686 as default anyway, but for those that don't, an explicit
2137 # specification is necessary
2138
2139 if test "$cpu" = "i386"; then
2140   cat > $TMPC << EOF
2141 static int sfaa(int *ptr)
2142 {
2143   return __sync_fetch_and_and(ptr, 0);
2144 }
2145
2146 int main(void)
2147 {
2148   int val = 42;
2149   val = __sync_val_compare_and_swap(&val, 0, 1);
2150   sfaa(&val);
2151   return val;
2152 }
2153 EOF
2154   if ! compile_prog "" "" ; then
2155     QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS"
2156   fi
2157 fi
2158
2159 #########################################
2160 # Solaris specific configure tool chain decisions
2161
2162 if test "$solaris" = "yes" ; then
2163   if has $install; then
2164     :
2165   else
2166     error_exit "Solaris install program not found. Use --install=/usr/ucb/install or" \
2167         "install fileutils from www.blastwave.org using pkg-get -i fileutils" \
2168         "to get ginstall which is used by default (which lives in /opt/csw/bin)"
2169   fi
2170   if test "$(path_of $install)" = "/usr/sbin/install" ; then
2171     error_exit "Solaris /usr/sbin/install is not an appropriate install program." \
2172         "try ginstall from the GNU fileutils available from www.blastwave.org" \
2173         "using pkg-get -i fileutils, or use --install=/usr/ucb/install"
2174   fi
2175   if has ar; then
2176     :
2177   else
2178     if test -f /usr/ccs/bin/ar ; then
2179       error_exit "No path includes ar" \
2180           "Add /usr/ccs/bin to your path and rerun configure"
2181     fi
2182     error_exit "No path includes ar"
2183   fi
2184 fi
2185
2186 if test -z "${target_list+xxx}" ; then
2187     for target in $default_target_list; do
2188         supported_target $target 2>/dev/null && \
2189             target_list="$target_list $target"
2190     done
2191     target_list="${target_list# }"
2192 else
2193     target_list=$(echo "$target_list" | sed -e 's/,/ /g')
2194     for target in $target_list; do
2195         # Check that we recognised the target name; this allows a more
2196         # friendly error message than if we let it fall through.
2197         case " $default_target_list " in
2198             *" $target "*)
2199                 ;;
2200             *)
2201                 error_exit "Unknown target name '$target'"
2202                 ;;
2203         esac
2204         supported_target $target || exit 1
2205     done
2206 fi
2207
2208 # see if system emulation was really requested
2209 case " $target_list " in
2210   *"-softmmu "*) softmmu=yes
2211   ;;
2212   *) softmmu=no
2213   ;;
2214 esac
2215
2216 for target in $target_list; do
2217   case "$target" in
2218     arm-softmmu | aarch64-softmmu | i386-softmmu | x86_64-softmmu)
2219       edk2_blobs="yes"
2220       ;;
2221   esac
2222 done
2223 # The EDK2 binaries are compressed with bzip2
2224 if test "$edk2_blobs" = "yes" && ! has bzip2; then
2225   error_exit "The bzip2 program is required for building QEMU"
2226 fi
2227
2228 feature_not_found() {
2229   feature=$1
2230   remedy=$2
2231
2232   error_exit "User requested feature $feature" \
2233       "configure was not able to find it." \
2234       "$remedy"
2235 }
2236
2237 # ---
2238 # big/little endian test
2239 cat > $TMPC << EOF
2240 short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, };
2241 short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, };
2242 extern int foo(short *, short *);
2243 int main(int argc, char *argv[]) {
2244     return foo(big_endian, little_endian);
2245 }
2246 EOF
2247
2248 if compile_object ; then
2249     if strings -a $TMPO | grep -q BiGeNdIaN ; then
2250         bigendian="yes"
2251     elif strings -a $TMPO | grep -q LiTtLeEnDiAn ; then
2252         bigendian="no"
2253     else
2254         echo big/little test failed
2255     fi
2256 else
2257     echo big/little test failed
2258 fi
2259
2260 ##########################################
2261 # system tools
2262 if test -z "$want_tools"; then
2263     if test "$softmmu" = "no"; then
2264         want_tools=no
2265     else
2266         want_tools=yes
2267     fi
2268 fi
2269
2270 ##########################################
2271 # cocoa implies not SDL or GTK
2272 # (the cocoa UI code currently assumes it is always the active UI
2273 # and doesn't interact well with other UI frontend code)
2274 if test "$cocoa" = "yes"; then
2275     if test "$sdl" = "yes"; then
2276         error_exit "Cocoa and SDL UIs cannot both be enabled at once"
2277     fi
2278     if test "$gtk" = "yes"; then
2279         error_exit "Cocoa and GTK UIs cannot both be enabled at once"
2280     fi
2281     gtk=no
2282     sdl=no
2283 fi
2284
2285 # Some versions of Mac OS X incorrectly define SIZE_MAX
2286 cat > $TMPC << EOF
2287 #include <stdint.h>
2288 #include <stdio.h>
2289 int main(int argc, char *argv[]) {
2290     return printf("%zu", SIZE_MAX);
2291 }
2292 EOF
2293 have_broken_size_max=no
2294 if ! compile_object -Werror ; then
2295     have_broken_size_max=yes
2296 fi
2297
2298 ##########################################
2299 # L2TPV3 probe
2300
2301 cat > $TMPC <<EOF
2302 #include <sys/socket.h>
2303 #include <linux/ip.h>
2304 int main(void) { return sizeof(struct mmsghdr); }
2305 EOF
2306 if compile_prog "" "" ; then
2307   l2tpv3=yes
2308 else
2309   l2tpv3=no
2310 fi
2311
2312 #########################################
2313 # vhost interdependencies and host support
2314
2315 # vhost backends
2316 test "$vhost_user" = "" && vhost_user=yes
2317 if test "$vhost_user" = "yes" && test "$mingw32" = "yes"; then
2318   error_exit "vhost-user isn't available on win32"
2319 fi
2320 test "$vhost_kernel" = "" && vhost_kernel=$linux
2321 if test "$vhost_kernel" = "yes" && test "$linux" != "yes"; then
2322   error_exit "vhost-kernel is only available on Linux"
2323 fi
2324
2325 # vhost-kernel devices
2326 test "$vhost_scsi" = "" && vhost_scsi=$vhost_kernel
2327 if test "$vhost_scsi" = "yes" && test "$vhost_kernel" != "yes"; then
2328   error_exit "--enable-vhost-scsi requires --enable-vhost-kernel"
2329 fi
2330 test "$vhost_vsock" = "" && vhost_vsock=$vhost_kernel
2331 if test "$vhost_vsock" = "yes" && test "$vhost_kernel" != "yes"; then
2332   error_exit "--enable-vhost-vsock requires --enable-vhost-kernel"
2333 fi
2334
2335 # vhost-user backends
2336 test "$vhost_net_user" = "" && vhost_net_user=$vhost_user
2337 if test "$vhost_net_user" = "yes" && test "$vhost_user" = "no"; then
2338   error_exit "--enable-vhost-net-user requires --enable-vhost-user"
2339 fi
2340 test "$vhost_crypto" = "" && vhost_crypto=$vhost_user
2341 if test "$vhost_crypto" = "yes" && test "$vhost_user" = "no"; then
2342   error_exit "--enable-vhost-crypto requires --enable-vhost-user"
2343 fi
2344 test "$vhost_user_fs" = "" && vhost_user_fs=$vhost_user
2345 if test "$vhost_user_fs" = "yes" && test "$vhost_user" = "no"; then
2346   error_exit "--enable-vhost-user-fs requires --enable-vhost-user"
2347 fi
2348
2349 # OR the vhost-kernel and vhost-user values for simplicity
2350 if test "$vhost_net" = ""; then
2351   test "$vhost_net_user" = "yes" && vhost_net=yes
2352   test "$vhost_kernel" = "yes" && vhost_net=yes
2353 fi
2354
2355 ##########################################
2356 # MinGW / Mingw-w64 localtime_r/gmtime_r check
2357
2358 if test "$mingw32" = "yes"; then
2359     # Some versions of MinGW / Mingw-w64 lack localtime_r
2360     # and gmtime_r entirely.
2361     #
2362     # Some versions of Mingw-w64 define a macro for
2363     # localtime_r/gmtime_r.
2364     #
2365     # Some versions of Mingw-w64 will define functions
2366     # for localtime_r/gmtime_r, but only if you have
2367     # _POSIX_THREAD_SAFE_FUNCTIONS defined. For fun
2368     # though, unistd.h and pthread.h both define
2369     # that for you.
2370     #
2371     # So this #undef localtime_r and #include <unistd.h>
2372     # are not in fact redundant.
2373 cat > $TMPC << EOF
2374 #include <unistd.h>
2375 #include <time.h>
2376 #undef localtime_r
2377 int main(void) { localtime_r(NULL, NULL); return 0; }
2378 EOF
2379     if compile_prog "" "" ; then
2380         localtime_r="yes"
2381     else
2382         localtime_r="no"
2383     fi
2384 fi
2385
2386 ##########################################
2387 # pkg-config probe
2388
2389 if ! has "$pkg_config_exe"; then
2390   error_exit "pkg-config binary '$pkg_config_exe' not found"
2391 fi
2392
2393 ##########################################
2394 # NPTL probe
2395
2396 if test "$linux_user" = "yes"; then
2397   cat > $TMPC <<EOF
2398 #include <sched.h>
2399 #include <linux/futex.h>
2400 int main(void) {
2401 #if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
2402 #error bork
2403 #endif
2404   return 0;
2405 }
2406 EOF
2407   if ! compile_object ; then
2408     feature_not_found "nptl" "Install glibc and linux kernel headers."
2409   fi
2410 fi
2411
2412 ##########################################
2413 # lzo check
2414
2415 if test "$lzo" != "no" ; then
2416     cat > $TMPC << EOF
2417 #include <lzo/lzo1x.h>
2418 int main(void) { lzo_version(); return 0; }
2419 EOF
2420     if compile_prog "" "-llzo2" ; then
2421         libs_softmmu="$libs_softmmu -llzo2"
2422         lzo="yes"
2423     else
2424         if test "$lzo" = "yes"; then
2425             feature_not_found "liblzo2" "Install liblzo2 devel"
2426         fi
2427         lzo="no"
2428     fi
2429 fi
2430
2431 ##########################################
2432 # snappy check
2433
2434 if test "$snappy" != "no" ; then
2435     cat > $TMPC << EOF
2436 #include <snappy-c.h>
2437 int main(void) { snappy_max_compressed_length(4096); return 0; }
2438 EOF
2439     if compile_prog "" "-lsnappy" ; then
2440         libs_softmmu="$libs_softmmu -lsnappy"
2441         snappy="yes"
2442     else
2443         if test "$snappy" = "yes"; then
2444             feature_not_found "libsnappy" "Install libsnappy devel"
2445         fi
2446         snappy="no"
2447     fi
2448 fi
2449
2450 ##########################################
2451 # bzip2 check
2452
2453 if test "$bzip2" != "no" ; then
2454     cat > $TMPC << EOF
2455 #include <bzlib.h>
2456 int main(void) { BZ2_bzlibVersion(); return 0; }
2457 EOF
2458     if compile_prog "" "-lbz2" ; then
2459         bzip2="yes"
2460     else
2461         if test "$bzip2" = "yes"; then
2462             feature_not_found "libbzip2" "Install libbzip2 devel"
2463         fi
2464         bzip2="no"
2465     fi
2466 fi
2467
2468 ##########################################
2469 # lzfse check
2470
2471 if test "$lzfse" != "no" ; then
2472     cat > $TMPC << EOF
2473 #include <lzfse.h>
2474 int main(void) { lzfse_decode_scratch_size(); return 0; }
2475 EOF
2476     if compile_prog "" "-llzfse" ; then
2477         lzfse="yes"
2478     else
2479         if test "$lzfse" = "yes"; then
2480             feature_not_found "lzfse" "Install lzfse devel"
2481         fi
2482         lzfse="no"
2483     fi
2484 fi
2485
2486 ##########################################
2487 # zstd check
2488
2489 if test "$zstd" != "no" ; then
2490     if $pkg_config --exist libzstd ; then
2491         zstd_cflags="$($pkg_config --cflags libzstd)"
2492         zstd_libs="$($pkg_config --libs libzstd)"
2493         LIBS="$zstd_libs $LIBS"
2494         QEMU_CFLAGS="$QEMU_CFLAGS $zstd_cflags"
2495         zstd="yes"
2496     else
2497         if test "$zstd" = "yes" ; then
2498             feature_not_found "libzstd" "Install libzstd devel"
2499         fi
2500         zstd="no"
2501     fi
2502 fi
2503
2504 ##########################################
2505 # libseccomp check
2506
2507 if test "$seccomp" != "no" ; then
2508     libseccomp_minver="2.3.0"
2509     if $pkg_config --atleast-version=$libseccomp_minver libseccomp ; then
2510         seccomp_cflags="$($pkg_config --cflags libseccomp)"
2511         seccomp_libs="$($pkg_config --libs libseccomp)"
2512         seccomp="yes"
2513     else
2514         if test "$seccomp" = "yes" ; then
2515             feature_not_found "libseccomp" \
2516                  "Install libseccomp devel >= $libseccomp_minver"
2517         fi
2518         seccomp="no"
2519     fi
2520 fi
2521 ##########################################
2522 # xen probe
2523
2524 if test "$xen" != "no" ; then
2525   # Check whether Xen library path is specified via --extra-ldflags to avoid
2526   # overriding this setting with pkg-config output. If not, try pkg-config
2527   # to obtain all needed flags.
2528
2529   if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
2530      $pkg_config --exists xencontrol ; then
2531     xen_ctrl_version="$(printf '%d%02d%02d' \
2532       $($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
2533     xen=yes
2534     xen_pc="xencontrol xenstore xenguest xenforeignmemory xengnttab"
2535     xen_pc="$xen_pc xenevtchn xendevicemodel"
2536     if $pkg_config --exists xentoolcore; then
2537       xen_pc="$xen_pc xentoolcore"
2538     fi
2539     QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags $xen_pc)"
2540     libs_softmmu="$($pkg_config --libs $xen_pc) $libs_softmmu"
2541   else
2542
2543     xen_libs="-lxenstore -lxenctrl -lxenguest"
2544     xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
2545
2546     # First we test whether Xen headers and libraries are available.
2547     # If no, we are done and there is no Xen support.
2548     # If yes, more tests are run to detect the Xen version.
2549
2550     # Xen (any)
2551     cat > $TMPC <<EOF
2552 #include <xenctrl.h>
2553 int main(void) {
2554   return 0;
2555 }
2556 EOF
2557     if ! compile_prog "" "$xen_libs" ; then
2558       # Xen not found
2559       if test "$xen" = "yes" ; then
2560         feature_not_found "xen" "Install xen devel"
2561       fi
2562       xen=no
2563
2564     # Xen unstable
2565     elif
2566         cat > $TMPC <<EOF &&
2567 #undef XC_WANT_COMPAT_DEVICEMODEL_API
2568 #define __XEN_TOOLS__
2569 #include <xendevicemodel.h>
2570 #include <xenforeignmemory.h>
2571 int main(void) {
2572   xendevicemodel_handle *xd;
2573   xenforeignmemory_handle *xfmem;
2574
2575   xd = xendevicemodel_open(0, 0);
2576   xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
2577
2578   xfmem = xenforeignmemory_open(0, 0);
2579   xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
2580
2581   return 0;
2582 }
2583 EOF
2584         compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2585       then
2586       xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2587       xen_ctrl_version=41100
2588       xen=yes
2589     elif
2590         cat > $TMPC <<EOF &&
2591 #undef XC_WANT_COMPAT_MAP_FOREIGN_API
2592 #include <xenforeignmemory.h>
2593 #include <xentoolcore.h>
2594 int main(void) {
2595   xenforeignmemory_handle *xfmem;
2596
2597   xfmem = xenforeignmemory_open(0, 0);
2598   xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
2599   xentoolcore_restrict_all(0);
2600
2601   return 0;
2602 }
2603 EOF
2604         compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2605       then
2606       xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2607       xen_ctrl_version=41000
2608       xen=yes
2609     elif
2610         cat > $TMPC <<EOF &&
2611 #undef XC_WANT_COMPAT_DEVICEMODEL_API
2612 #define __XEN_TOOLS__
2613 #include <xendevicemodel.h>
2614 int main(void) {
2615   xendevicemodel_handle *xd;
2616
2617   xd = xendevicemodel_open(0, 0);
2618   xendevicemodel_close(xd);
2619
2620   return 0;
2621 }
2622 EOF
2623         compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
2624       then
2625       xen_stable_libs="-lxendevicemodel $xen_stable_libs"
2626       xen_ctrl_version=40900
2627       xen=yes
2628     elif
2629         cat > $TMPC <<EOF &&
2630 /*
2631  * If we have stable libs the we don't want the libxc compat
2632  * layers, regardless of what CFLAGS we may have been given.
2633  *
2634  * Also, check if xengnttab_grant_copy_segment_t is defined and
2635  * grant copy operation is implemented.
2636  */
2637 #undef XC_WANT_COMPAT_EVTCHN_API
2638 #undef XC_WANT_COMPAT_GNTTAB_API
2639 #undef XC_WANT_COMPAT_MAP_FOREIGN_API
2640 #include <xenctrl.h>
2641 #include <xenstore.h>
2642 #include <xenevtchn.h>
2643 #include <xengnttab.h>
2644 #include <xenforeignmemory.h>
2645 #include <stdint.h>
2646 #include <xen/hvm/hvm_info_table.h>
2647 #if !defined(HVM_MAX_VCPUS)
2648 # error HVM_MAX_VCPUS not defined
2649 #endif
2650 int main(void) {
2651   xc_interface *xc = NULL;
2652   xenforeignmemory_handle *xfmem;
2653   xenevtchn_handle *xe;
2654   xengnttab_handle *xg;
2655   xengnttab_grant_copy_segment_t* seg = NULL;
2656
2657   xs_daemon_open();
2658
2659   xc = xc_interface_open(0, 0, 0);
2660   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2661   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2662   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2663   xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2664
2665   xfmem = xenforeignmemory_open(0, 0);
2666   xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2667
2668   xe = xenevtchn_open(0, 0);
2669   xenevtchn_fd(xe);
2670
2671   xg = xengnttab_open(0, 0);
2672   xengnttab_grant_copy(xg, 0, seg);
2673
2674   return 0;
2675 }
2676 EOF
2677         compile_prog "" "$xen_libs $xen_stable_libs"
2678       then
2679       xen_ctrl_version=40800
2680       xen=yes
2681     elif
2682         cat > $TMPC <<EOF &&
2683 /*
2684  * If we have stable libs the we don't want the libxc compat
2685  * layers, regardless of what CFLAGS we may have been given.
2686  */
2687 #undef XC_WANT_COMPAT_EVTCHN_API
2688 #undef XC_WANT_COMPAT_GNTTAB_API
2689 #undef XC_WANT_COMPAT_MAP_FOREIGN_API
2690 #include <xenctrl.h>
2691 #include <xenstore.h>
2692 #include <xenevtchn.h>
2693 #include <xengnttab.h>
2694 #include <xenforeignmemory.h>
2695 #include <stdint.h>
2696 #include <xen/hvm/hvm_info_table.h>
2697 #if !defined(HVM_MAX_VCPUS)
2698 # error HVM_MAX_VCPUS not defined
2699 #endif
2700 int main(void) {
2701   xc_interface *xc = NULL;
2702   xenforeignmemory_handle *xfmem;
2703   xenevtchn_handle *xe;
2704   xengnttab_handle *xg;
2705
2706   xs_daemon_open();
2707
2708   xc = xc_interface_open(0, 0, 0);
2709   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2710   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2711   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2712   xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2713
2714   xfmem = xenforeignmemory_open(0, 0);
2715   xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2716
2717   xe = xenevtchn_open(0, 0);
2718   xenevtchn_fd(xe);
2719
2720   xg = xengnttab_open(0, 0);
2721   xengnttab_map_grant_ref(xg, 0, 0, 0);
2722
2723   return 0;
2724 }
2725 EOF
2726         compile_prog "" "$xen_libs $xen_stable_libs"
2727       then
2728       xen_ctrl_version=40701
2729       xen=yes
2730
2731     # Xen 4.6
2732     elif
2733         cat > $TMPC <<EOF &&
2734 #include <xenctrl.h>
2735 #include <xenstore.h>
2736 #include <stdint.h>
2737 #include <xen/hvm/hvm_info_table.h>
2738 #if !defined(HVM_MAX_VCPUS)
2739 # error HVM_MAX_VCPUS not defined
2740 #endif
2741 int main(void) {
2742   xc_interface *xc;
2743   xs_daemon_open();
2744   xc = xc_interface_open(0, 0, 0);
2745   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2746   xc_gnttab_open(NULL, 0);
2747   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2748   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2749   xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2750   xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
2751   return 0;
2752 }
2753 EOF
2754         compile_prog "" "$xen_libs"
2755       then
2756       xen_ctrl_version=40600
2757       xen=yes
2758
2759     # Xen 4.5
2760     elif
2761         cat > $TMPC <<EOF &&
2762 #include <xenctrl.h>
2763 #include <xenstore.h>
2764 #include <stdint.h>
2765 #include <xen/hvm/hvm_info_table.h>
2766 #if !defined(HVM_MAX_VCPUS)
2767 # error HVM_MAX_VCPUS not defined
2768 #endif
2769 int main(void) {
2770   xc_interface *xc;
2771   xs_daemon_open();
2772   xc = xc_interface_open(0, 0, 0);
2773   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2774   xc_gnttab_open(NULL, 0);
2775   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2776   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2777   xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
2778   return 0;
2779 }
2780 EOF
2781         compile_prog "" "$xen_libs"
2782       then
2783       xen_ctrl_version=40500
2784       xen=yes
2785
2786     elif
2787         cat > $TMPC <<EOF &&
2788 #include <xenctrl.h>
2789 #include <xenstore.h>
2790 #include <stdint.h>
2791 #include <xen/hvm/hvm_info_table.h>
2792 #if !defined(HVM_MAX_VCPUS)
2793 # error HVM_MAX_VCPUS not defined
2794 #endif
2795 int main(void) {
2796   xc_interface *xc;
2797   xs_daemon_open();
2798   xc = xc_interface_open(0, 0, 0);
2799   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2800   xc_gnttab_open(NULL, 0);
2801   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2802   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2803   return 0;
2804 }
2805 EOF
2806         compile_prog "" "$xen_libs"
2807       then
2808       xen_ctrl_version=40200
2809       xen=yes
2810
2811     else
2812       if test "$xen" = "yes" ; then
2813         feature_not_found "xen (unsupported version)" \
2814                           "Install a supported xen (xen 4.2 or newer)"
2815       fi
2816       xen=no
2817     fi
2818
2819     if test "$xen" = yes; then
2820       if test $xen_ctrl_version -ge 40701  ; then
2821         libs_softmmu="$xen_stable_libs $libs_softmmu"
2822       fi
2823       libs_softmmu="$xen_libs $libs_softmmu"
2824     fi
2825   fi
2826 fi
2827
2828 if test "$xen_pci_passthrough" != "no"; then
2829   if test "$xen" = "yes" && test "$linux" = "yes"; then
2830     xen_pci_passthrough=yes
2831   else
2832     if test "$xen_pci_passthrough" = "yes"; then
2833       error_exit "User requested feature Xen PCI Passthrough" \
2834           " but this feature requires /sys from Linux"
2835     fi
2836     xen_pci_passthrough=no
2837   fi
2838 fi
2839
2840 ##########################################
2841 # Windows Hypervisor Platform accelerator (WHPX) check
2842 if test "$whpx" != "no" ; then
2843     if check_include "WinHvPlatform.h" && check_include "WinHvEmulation.h"; then
2844         whpx="yes"
2845     else
2846         if test "$whpx" = "yes"; then
2847             feature_not_found "WinHvPlatform" "WinHvEmulation is not installed"
2848         fi
2849         whpx="no"
2850     fi
2851 fi
2852
2853 ##########################################
2854 # Sparse probe
2855 if test "$sparse" != "no" ; then
2856   if has cgcc; then
2857     sparse=yes
2858   else
2859     if test "$sparse" = "yes" ; then
2860       feature_not_found "sparse" "Install sparse binary"
2861     fi
2862     sparse=no
2863   fi
2864 fi
2865
2866 ##########################################
2867 # X11 probe
2868 if $pkg_config --exists "x11"; then
2869     have_x11=yes
2870     x11_cflags=$($pkg_config --cflags x11)
2871     x11_libs=$($pkg_config --libs x11)
2872 fi
2873
2874 ##########################################
2875 # GTK probe
2876
2877 if test "$gtk" != "no"; then
2878     gtkpackage="gtk+-3.0"
2879     gtkx11package="gtk+-x11-3.0"
2880     gtkversion="3.14.0"
2881     if $pkg_config --exists "$gtkpackage >= $gtkversion"; then
2882         gtk_cflags=$($pkg_config --cflags $gtkpackage)
2883         gtk_libs=$($pkg_config --libs $gtkpackage)
2884         gtk_version=$($pkg_config --modversion $gtkpackage)
2885         if $pkg_config --exists "$gtkx11package >= $gtkversion"; then
2886             need_x11=yes
2887             gtk_cflags="$gtk_cflags $x11_cflags"
2888             gtk_libs="$gtk_libs $x11_libs"
2889         fi
2890         gtk="yes"
2891     elif test "$gtk" = "yes"; then
2892         feature_not_found "gtk" "Install gtk3-devel"
2893     else
2894         gtk="no"
2895     fi
2896 fi
2897
2898
2899 ##########################################
2900 # GNUTLS probe
2901
2902 if test "$gnutls" != "no"; then
2903     pass="no"
2904     if $pkg_config --exists "gnutls >= 3.1.18"; then
2905         gnutls_cflags=$($pkg_config --cflags gnutls)
2906         gnutls_libs=$($pkg_config --libs gnutls)
2907         # Packaging for the static libraries is not always correct.
2908         # At least ubuntu 18.04 ships only shared libraries.
2909         write_c_skeleton
2910         if compile_prog "" "$gnutls_libs" ; then
2911             LIBS="$gnutls_libs $LIBS"
2912             QEMU_CFLAGS="$QEMU_CFLAGS $gnutls_cflags"
2913             pass="yes"
2914         fi
2915     fi
2916     if test "$pass" = "no" && test "$gnutls" = "yes"; then
2917         feature_not_found "gnutls" "Install gnutls devel >= 3.1.18"
2918     else
2919         gnutls="$pass"
2920     fi
2921 fi
2922
2923
2924 # If user didn't give a --disable/enable-gcrypt flag,
2925 # then mark as disabled if user requested nettle
2926 # explicitly
2927 if test -z "$gcrypt"
2928 then
2929     if test "$nettle" = "yes"
2930     then
2931         gcrypt="no"
2932     fi
2933 fi
2934
2935 # If user didn't give a --disable/enable-nettle flag,
2936 # then mark as disabled if user requested gcrypt
2937 # explicitly
2938 if test -z "$nettle"
2939 then
2940     if test "$gcrypt" = "yes"
2941     then
2942         nettle="no"
2943     fi
2944 fi
2945
2946 has_libgcrypt() {
2947     if ! has "libgcrypt-config"
2948     then
2949         return 1
2950     fi
2951
2952     if test -n "$cross_prefix"
2953     then
2954         host=$(libgcrypt-config --host)
2955         if test "$host-" != $cross_prefix
2956         then
2957             return 1
2958         fi
2959     fi
2960
2961     maj=`libgcrypt-config --version | awk -F . '{print $1}'`
2962     min=`libgcrypt-config --version | awk -F . '{print $2}'`
2963
2964     if test $maj != 1 || test $min -lt 5
2965     then
2966        return 1
2967     fi
2968
2969     return 0
2970 }
2971
2972
2973 if test "$nettle" != "no"; then
2974     pass="no"
2975     if $pkg_config --exists "nettle >= 2.7.1"; then
2976         nettle_cflags=$($pkg_config --cflags nettle)
2977         nettle_libs=$($pkg_config --libs nettle)
2978         nettle_version=$($pkg_config --modversion nettle)
2979         # Link test to make sure the given libraries work (e.g for static).
2980         write_c_skeleton
2981         if compile_prog "" "$nettle_libs" ; then
2982             LIBS="$nettle_libs $LIBS"
2983             QEMU_CFLAGS="$QEMU_CFLAGS $nettle_cflags"
2984             if test -z "$gcrypt"; then
2985                gcrypt="no"
2986             fi
2987             pass="yes"
2988         fi
2989     fi
2990     if test "$pass" = "yes"
2991     then
2992         cat > $TMPC << EOF
2993 #include <nettle/xts.h>
2994 int main(void) {
2995   return 0;
2996 }
2997 EOF
2998         if compile_prog "$nettle_cflags" "$nettle_libs" ; then
2999             nettle_xts=yes
3000             qemu_private_xts=no
3001         fi
3002     fi
3003     if test "$pass" = "no" && test "$nettle" = "yes"; then
3004         feature_not_found "nettle" "Install nettle devel >= 2.7.1"
3005     else
3006         nettle="$pass"
3007     fi
3008 fi
3009
3010 if test "$gcrypt" != "no"; then
3011     pass="no"
3012     if has_libgcrypt; then
3013         gcrypt_cflags=$(libgcrypt-config --cflags)
3014         gcrypt_libs=$(libgcrypt-config --libs)
3015         # Debian has removed -lgpg-error from libgcrypt-config
3016         # as it "spreads unnecessary dependencies" which in
3017         # turn breaks static builds...
3018         if test "$static" = "yes"
3019         then
3020             gcrypt_libs="$gcrypt_libs -lgpg-error"
3021         fi
3022
3023         # Link test to make sure the given libraries work (e.g for static).
3024         write_c_skeleton
3025         if compile_prog "" "$gcrypt_libs" ; then
3026             LIBS="$gcrypt_libs $LIBS"
3027             QEMU_CFLAGS="$QEMU_CFLAGS $gcrypt_cflags"
3028             pass="yes"
3029         fi
3030     fi
3031     if test "$pass" = "yes"; then
3032         gcrypt="yes"
3033         cat > $TMPC << EOF
3034 #include <gcrypt.h>
3035 int main(void) {
3036   gcry_mac_hd_t handle;
3037   gcry_mac_open(&handle, GCRY_MAC_HMAC_MD5,
3038                 GCRY_MAC_FLAG_SECURE, NULL);
3039   return 0;
3040 }
3041 EOF
3042         if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
3043             gcrypt_hmac=yes
3044         fi
3045         cat > $TMPC << EOF
3046 #include <gcrypt.h>
3047 int main(void) {
3048   gcry_cipher_hd_t handle;
3049   gcry_cipher_open(&handle, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_XTS, 0);
3050   return 0;
3051 }
3052 EOF
3053         if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
3054             gcrypt_xts=yes
3055             qemu_private_xts=no
3056         fi
3057     elif test "$gcrypt" = "yes"; then
3058         feature_not_found "gcrypt" "Install gcrypt devel >= 1.5.0"
3059     else
3060         gcrypt="no"
3061     fi
3062 fi
3063
3064
3065 if test "$gcrypt" = "yes" && test "$nettle" = "yes"
3066 then
3067     error_exit "Only one of gcrypt & nettle can be enabled"
3068 fi
3069
3070 ##########################################
3071 # libtasn1 - only for the TLS creds/session test suite
3072
3073 tasn1=yes
3074 tasn1_cflags=""
3075 tasn1_libs=""
3076 if $pkg_config --exists "libtasn1"; then
3077     tasn1_cflags=$($pkg_config --cflags libtasn1)
3078     tasn1_libs=$($pkg_config --libs libtasn1)
3079 else
3080     tasn1=no
3081 fi
3082
3083
3084 ##########################################
3085 # PAM probe
3086
3087 if test "$auth_pam" != "no"; then
3088     cat > $TMPC <<EOF
3089 #include <security/pam_appl.h>
3090 #include <stdio.h>
3091 int main(void) {
3092    const char *service_name = "qemu";
3093    const char *user = "frank";
3094    const struct pam_conv pam_conv = { 0 };
3095    pam_handle_t *pamh = NULL;
3096    pam_start(service_name, user, &pam_conv, &pamh);
3097    return 0;
3098 }
3099 EOF
3100     if compile_prog "" "-lpam" ; then
3101         auth_pam=yes
3102     else
3103         if test "$auth_pam" = "yes"; then
3104             feature_not_found "PAM" "Install PAM development package"
3105         else
3106             auth_pam=no
3107         fi
3108     fi
3109 fi
3110
3111 ##########################################
3112 # getifaddrs (for tests/test-io-channel-socket )
3113
3114 have_ifaddrs_h=yes
3115 if ! check_include "ifaddrs.h" ; then
3116   have_ifaddrs_h=no
3117 fi
3118
3119 ##########################################
3120 # VTE probe
3121
3122 if test "$vte" != "no"; then
3123     vteminversion="0.32.0"
3124     if $pkg_config --exists "vte-2.91"; then
3125       vtepackage="vte-2.91"
3126     else
3127       vtepackage="vte-2.90"
3128     fi
3129     if $pkg_config --exists "$vtepackage >= $vteminversion"; then
3130         vte_cflags=$($pkg_config --cflags $vtepackage)
3131         vte_libs=$($pkg_config --libs $vtepackage)
3132         vteversion=$($pkg_config --modversion $vtepackage)
3133         vte="yes"
3134     elif test "$vte" = "yes"; then
3135         feature_not_found "vte" "Install libvte-2.90/2.91 devel"
3136     else
3137         vte="no"
3138     fi
3139 fi
3140
3141 ##########################################
3142 # SDL probe
3143
3144 # Look for sdl configuration program (pkg-config or sdl2-config).  Try
3145 # sdl2-config even without cross prefix, and favour pkg-config over sdl2-config.
3146
3147 sdl_probe ()
3148 {
3149   if $pkg_config sdl2 --exists; then
3150     sdlconfig="$pkg_config sdl2"
3151     sdlversion=$($sdlconfig --modversion 2>/dev/null)
3152   elif has "$sdl2_config"; then
3153     sdlconfig="$sdl2_config"
3154     sdlversion=$($sdlconfig --version)
3155   else
3156     if test "$sdl" = "yes" ; then
3157       feature_not_found "sdl" "Install SDL2-devel"
3158     fi
3159     sdl=no
3160     # no need to do the rest
3161     return
3162   fi
3163   if test -n "$cross_prefix" && test "$(basename "$sdlconfig")" = sdl2-config; then
3164     echo warning: using "\"$sdlconfig\"" to detect cross-compiled sdl >&2
3165   fi
3166
3167   cat > $TMPC << EOF
3168 #include <SDL.h>
3169 #undef main /* We don't want SDL to override our main() */
3170 int main( void ) { return SDL_Init (SDL_INIT_VIDEO); }
3171 EOF
3172   sdl_cflags=$($sdlconfig --cflags 2>/dev/null)
3173   sdl_cflags="$sdl_cflags -Wno-undef"  # workaround 2.0.8 bug
3174   if test "$static" = "yes" ; then
3175     if $pkg_config sdl2 --exists; then
3176       sdl_libs=$($pkg_config sdl2 --static --libs 2>/dev/null)
3177     else
3178       sdl_libs=$($sdlconfig --static-libs 2>/dev/null)
3179     fi
3180   else
3181     sdl_libs=$($sdlconfig --libs 2>/dev/null)
3182   fi
3183   if compile_prog "$sdl_cflags" "$sdl_libs" ; then
3184     sdl=yes
3185
3186     # static link with sdl ? (note: sdl.pc's --static --libs is broken)
3187     if test "$sdl" = "yes" && test "$static" = "yes" ; then
3188       if test $? = 0 && echo $sdl_libs | grep -- -laa > /dev/null; then
3189          sdl_libs="$sdl_libs $(aalib-config --static-libs 2>/dev/null)"
3190          sdl_cflags="$sdl_cflags $(aalib-config --cflags 2>/dev/null)"
3191       fi
3192       if compile_prog "$sdl_cflags" "$sdl_libs" ; then
3193         :
3194       else
3195         sdl=no
3196       fi
3197     fi # static link
3198   else # sdl not found
3199     if test "$sdl" = "yes" ; then
3200       feature_not_found "sdl" "Install SDL2 devel"
3201     fi
3202     sdl=no
3203   fi # sdl compile test
3204 }
3205
3206 sdl_image_probe ()
3207 {
3208     if test "$sdl_image" != "no" ; then
3209         if $pkg_config SDL2_image --exists; then
3210             if test "$static" = "yes"; then
3211                 sdl_image_libs=$($pkg_config SDL2_image --libs --static 2>/dev/null)
3212             else
3213                 sdl_image_libs=$($pkg_config SDL2_image --libs 2>/dev/null)
3214             fi
3215             sdl_image_cflags=$($pkg_config SDL2_image --cflags 2>/dev/null)
3216             sdl_image=yes
3217
3218             sdl_cflags="$sdl_cflags $sdl_image_cflags"
3219             sdl_libs="$sdl_libs $sdl_image_libs"
3220         else
3221             if test "$sdl_image" = "yes" ; then
3222                 feature_not_found "sdl_image" "Install SDL Image devel"
3223             else
3224                 sdl_image=no
3225             fi
3226         fi
3227     fi
3228 }
3229
3230 if test "$sdl" != "no" ; then
3231   sdl_probe
3232 fi
3233
3234 if test "$sdl" = "yes" ; then
3235   sdl_image_probe
3236 else
3237   if test "$sdl_image" = "yes"; then
3238     echo "warning: SDL Image requested, but SDL is not available, disabling"
3239   fi
3240   sdl_image=no
3241 fi
3242
3243 if test "$sdl" = "yes" ; then
3244   cat > $TMPC <<EOF
3245 #include <SDL.h>
3246 #if defined(SDL_VIDEO_DRIVER_X11)
3247 #include <X11/XKBlib.h>
3248 #else
3249 #error No x11 support
3250 #endif
3251 int main(void) { return 0; }
3252 EOF
3253   if compile_prog "$sdl_cflags $x11_cflags" "$sdl_libs $x11_libs" ; then
3254     need_x11=yes
3255     sdl_cflags="$sdl_cflags $x11_cflags"
3256     sdl_libs="$sdl_libs $x11_libs"
3257   fi
3258 fi
3259
3260 ##########################################
3261 # RDMA needs OpenFabrics libraries
3262 if test "$rdma" != "no" ; then
3263   cat > $TMPC <<EOF
3264 #include <rdma/rdma_cma.h>
3265 int main(void) { return 0; }
3266 EOF
3267   rdma_libs="-lrdmacm -libverbs -libumad"
3268   if compile_prog "" "$rdma_libs" ; then
3269     rdma="yes"
3270     libs_softmmu="$libs_softmmu $rdma_libs"
3271   else
3272     if test "$rdma" = "yes" ; then
3273         error_exit \
3274             " OpenFabrics librdmacm/libibverbs/libibumad not present." \
3275             " Your options:" \
3276             "  (1) Fast: Install infiniband packages (devel) from your distro." \
3277             "  (2) Cleanest: Install libraries from www.openfabrics.org" \
3278             "  (3) Also: Install softiwarp if you don't have RDMA hardware"
3279     fi
3280     rdma="no"
3281   fi
3282 fi
3283
3284 ##########################################
3285 # PVRDMA detection
3286
3287 cat > $TMPC <<EOF &&
3288 #include <sys/mman.h>
3289
3290 int
3291 main(void)
3292 {
3293     char buf = 0;
3294     void *addr = &buf;
3295     addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
3296
3297     return 0;
3298 }
3299 EOF
3300
3301 if test "$rdma" = "yes" ; then
3302     case "$pvrdma" in
3303     "")
3304         if compile_prog "" ""; then
3305             pvrdma="yes"
3306         else
3307             pvrdma="no"
3308         fi
3309         ;;
3310     "yes")
3311         if ! compile_prog "" ""; then
3312             error_exit "PVRDMA is not supported since mremap is not implemented"
3313         fi
3314         pvrdma="yes"
3315         ;;
3316     "no")
3317         pvrdma="no"
3318         ;;
3319     esac
3320 else
3321     if test "$pvrdma" = "yes" ; then
3322         error_exit "PVRDMA requires rdma suppport"
3323     fi
3324     pvrdma="no"
3325 fi
3326
3327 # Let's see if enhanced reg_mr is supported
3328 if test "$pvrdma" = "yes" ; then
3329
3330 cat > $TMPC <<EOF &&
3331 #include <infiniband/verbs.h>
3332
3333 int
3334 main(void)
3335 {
3336     struct ibv_mr *mr;
3337     struct ibv_pd *pd = NULL;
3338     size_t length = 10;
3339     uint64_t iova = 0;
3340     int access = 0;
3341     void *addr = NULL;
3342
3343     mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
3344
3345     ibv_dereg_mr(mr);
3346
3347     return 0;
3348 }
3349 EOF
3350     if ! compile_prog "" "-libverbs"; then
3351         QEMU_CFLAGS="$QEMU_CFLAGS -DLEGACY_RDMA_REG_MR"
3352     fi
3353 fi
3354
3355 ##########################################
3356 # VNC SASL detection
3357 if test "$vnc" = "yes" && test "$vnc_sasl" != "no" ; then
3358   cat > $TMPC <<EOF
3359 #include <sasl/sasl.h>
3360 #include <stdio.h>
3361 int main(void) { sasl_server_init(NULL, "qemu"); return 0; }
3362 EOF
3363   # Assuming Cyrus-SASL installed in /usr prefix
3364   vnc_sasl_cflags=""
3365   vnc_sasl_libs="-lsasl2"
3366   if compile_prog "$vnc_sasl_cflags" "$vnc_sasl_libs" ; then
3367     vnc_sasl=yes
3368     libs_softmmu="$vnc_sasl_libs $libs_softmmu"
3369     QEMU_CFLAGS="$QEMU_CFLAGS $vnc_sasl_cflags"
3370   else
3371     if test "$vnc_sasl" = "yes" ; then
3372       feature_not_found "vnc-sasl" "Install Cyrus SASL devel"
3373     fi
3374     vnc_sasl=no
3375   fi
3376 fi
3377
3378 ##########################################
3379 # VNC JPEG detection
3380 if test "$vnc" = "yes" && test "$vnc_jpeg" != "no" ; then
3381 cat > $TMPC <<EOF
3382 #include <stdio.h>
3383 #include <jpeglib.h>
3384 int main(void) { struct jpeg_compress_struct s; jpeg_create_compress(&s); return 0; }
3385 EOF
3386     vnc_jpeg_cflags=""
3387     vnc_jpeg_libs="-ljpeg"
3388   if compile_prog "$vnc_jpeg_cflags" "$vnc_jpeg_libs" ; then
3389     vnc_jpeg=yes
3390     libs_softmmu="$vnc_jpeg_libs $libs_softmmu"
3391     QEMU_CFLAGS="$QEMU_CFLAGS $vnc_jpeg_cflags"
3392   else
3393     if test "$vnc_jpeg" = "yes" ; then
3394       feature_not_found "vnc-jpeg" "Install libjpeg-turbo devel"
3395     fi
3396     vnc_jpeg=no
3397   fi
3398 fi
3399
3400 ##########################################
3401 # VNC PNG detection
3402 if test "$vnc" = "yes" && test "$vnc_png" != "no" ; then
3403 cat > $TMPC <<EOF
3404 //#include <stdio.h>
3405 #include <png.h>
3406 #include <stddef.h>
3407 int main(void) {
3408     png_structp png_ptr;
3409     png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
3410     return png_ptr != 0;
3411 }
3412 EOF
3413   if $pkg_config libpng --exists; then
3414     vnc_png_cflags=$($pkg_config libpng --cflags)
3415     vnc_png_libs=$($pkg_config libpng --libs)
3416   else
3417     vnc_png_cflags=""
3418     vnc_png_libs="-lpng"
3419   fi
3420   if compile_prog "$vnc_png_cflags" "$vnc_png_libs" ; then
3421     vnc_png=yes
3422     libs_softmmu="$vnc_png_libs $libs_softmmu"
3423     QEMU_CFLAGS="$QEMU_CFLAGS $vnc_png_cflags"
3424   else
3425     if test "$vnc_png" = "yes" ; then
3426       feature_not_found "vnc-png" "Install libpng devel"
3427     fi
3428     vnc_png=no
3429   fi
3430 fi
3431
3432 ##########################################
3433 # xkbcommon probe
3434 if test "$xkbcommon" != "no" ; then
3435   if $pkg_config xkbcommon --exists; then
3436     xkbcommon_cflags=$($pkg_config xkbcommon --cflags)
3437     xkbcommon_libs=$($pkg_config xkbcommon --libs)
3438     xkbcommon=yes
3439   else
3440     if test "$xkbcommon" = "yes" ; then
3441       feature_not_found "xkbcommon" "Install libxkbcommon-devel"
3442     fi
3443     xkbcommon=no
3444   fi
3445 fi
3446
3447
3448 ##########################################
3449 # xfsctl() probe, used for file-posix.c
3450 if test "$xfs" != "no" ; then
3451   cat > $TMPC << EOF
3452 #include <stddef.h>  /* NULL */
3453 #include <xfs/xfs.h>
3454 int main(void)
3455 {
3456     xfsctl(NULL, 0, 0, NULL);
3457     return 0;
3458 }
3459 EOF
3460   if compile_prog "" "" ; then
3461     xfs="yes"
3462   else
3463     if test "$xfs" = "yes" ; then
3464       feature_not_found "xfs" "Instal xfsprogs/xfslibs devel"
3465     fi
3466     xfs=no
3467   fi
3468 fi
3469
3470 ##########################################
3471 # vde libraries probe
3472 if test "$vde" != "no" ; then
3473   vde_libs="-lvdeplug"
3474   cat > $TMPC << EOF
3475 #include <libvdeplug.h>
3476 int main(void)
3477 {
3478     struct vde_open_args a = {0, 0, 0};
3479     char s[] = "";
3480     vde_open(s, s, &a);
3481     return 0;
3482 }
3483 EOF
3484   if compile_prog "" "$vde_libs" ; then
3485     vde=yes
3486   else
3487     if test "$vde" = "yes" ; then
3488       feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
3489     fi
3490     vde=no
3491   fi
3492 fi
3493
3494 ##########################################
3495 # netmap support probe
3496 # Apart from looking for netmap headers, we make sure that the host API version
3497 # supports the netmap backend (>=11). The upper bound (15) is meant to simulate
3498 # a minor/major version number. Minor new features will be marked with values up
3499 # to 15, and if something happens that requires a change to the backend we will
3500 # move above 15, submit the backend fixes and modify this two bounds.
3501 if test "$netmap" != "no" ; then
3502   cat > $TMPC << EOF
3503 #include <inttypes.h>
3504 #include <net/if.h>
3505 #include <net/netmap.h>
3506 #include <net/netmap_user.h>
3507 #if (NETMAP_API < 11) || (NETMAP_API > 15)
3508 #error
3509 #endif
3510 int main(void) { return 0; }
3511 EOF
3512   if compile_prog "" "" ; then
3513     netmap=yes
3514   else
3515     if test "$netmap" = "yes" ; then
3516       feature_not_found "netmap"
3517     fi
3518     netmap=no
3519   fi
3520 fi
3521
3522 ##########################################
3523 # libcap-ng library probe
3524 if test "$cap_ng" != "no" ; then
3525   cap_libs="-lcap-ng"
3526   cat > $TMPC << EOF
3527 #include <cap-ng.h>
3528 int main(void)
3529 {
3530     capng_capability_to_name(CAPNG_EFFECTIVE);
3531     return 0;
3532 }
3533 EOF
3534   if compile_prog "" "$cap_libs" ; then
3535     cap_ng=yes
3536     libs_tools="$cap_libs $libs_tools"
3537   else
3538     if test "$cap_ng" = "yes" ; then
3539       feature_not_found "cap_ng" "Install libcap-ng devel"
3540     fi
3541     cap_ng=no
3542   fi
3543 fi
3544
3545 ##########################################
3546 # Sound support libraries probe
3547
3548 audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
3549 for drv in $audio_drv_list; do
3550     case $drv in
3551     alsa | try-alsa)
3552     if $pkg_config alsa --exists; then
3553         alsa_libs=$($pkg_config alsa --libs)
3554         if test "$drv" = "try-alsa"; then
3555             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa/alsa/')
3556         fi
3557     else
3558         if test "$drv" = "try-alsa"; then
3559             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa//')
3560         else
3561             error_exit "$drv check failed" \
3562                 "Make sure to have the $drv libs and headers installed."
3563         fi
3564     fi
3565     ;;
3566
3567     pa | try-pa)
3568     if $pkg_config libpulse --exists; then
3569         pulse_libs=$($pkg_config libpulse --libs)
3570         if test "$drv" = "try-pa"; then
3571             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa/pa/')
3572         fi
3573     else
3574         if test "$drv" = "try-pa"; then
3575             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa//')
3576         else
3577             error_exit "$drv check failed" \
3578                 "Make sure to have the $drv libs and headers installed."
3579         fi
3580     fi
3581     ;;
3582
3583     sdl)
3584     if test "$sdl" = "no"; then
3585         error_exit "sdl not found or disabled, can not use sdl audio driver"
3586     fi
3587     ;;
3588
3589     try-sdl)
3590     if test "$sdl" = "no"; then
3591         audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl//')
3592     else
3593         audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl/sdl/')
3594     fi
3595     ;;
3596
3597     coreaudio)
3598       coreaudio_libs="-framework CoreAudio"
3599     ;;
3600
3601     dsound)
3602       dsound_libs="-lole32 -ldxguid"
3603       audio_win_int="yes"
3604     ;;
3605
3606     oss)
3607       oss_libs="$oss_lib"
3608     ;;
3609
3610     *)
3611     echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
3612         error_exit "Unknown driver '$drv' selected" \
3613             "Possible drivers are: $audio_possible_drivers"
3614     }
3615     ;;
3616     esac
3617 done
3618
3619 ##########################################
3620 # BrlAPI probe
3621
3622 if test "$brlapi" != "no" ; then
3623   brlapi_libs="-lbrlapi"
3624   cat > $TMPC << EOF
3625 #include <brlapi.h>
3626 #include <stddef.h>
3627 int main( void ) { return brlapi__openConnection (NULL, NULL, NULL); }
3628 EOF
3629   if compile_prog "" "$brlapi_libs" ; then
3630     brlapi=yes
3631   else
3632     if test "$brlapi" = "yes" ; then
3633       feature_not_found "brlapi" "Install brlapi devel"
3634     fi
3635     brlapi=no
3636   fi
3637 fi
3638
3639 ##########################################
3640 # iconv probe
3641 if test "$iconv" != "no" ; then
3642   cat > $TMPC << EOF
3643 #include <iconv.h>
3644 int main(void) {
3645   iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
3646   return conv != (iconv_t) -1;
3647 }
3648 EOF
3649   iconv_prefix_list="/usr/local:/usr"
3650   iconv_lib_list=":-liconv"
3651   IFS=:
3652   for iconv_prefix in $iconv_prefix_list; do
3653     IFS=:
3654     iconv_cflags="-I$iconv_prefix/include"
3655     iconv_ldflags="-L$iconv_prefix/lib"
3656     for iconv_link in $iconv_lib_list; do
3657       unset IFS
3658       iconv_lib="$iconv_ldflags $iconv_link"
3659       echo "looking at iconv in '$iconv_cflags' '$iconv_lib'" >> config.log
3660       if compile_prog "$iconv_cflags" "$iconv_lib" ; then
3661         iconv_found=yes
3662         break
3663       fi
3664     done
3665     if test "$iconv_found" = yes ; then
3666       break
3667     fi
3668   done
3669   if test "$iconv_found" = "yes" ; then
3670     iconv=yes
3671   else
3672     if test "$iconv" = "yes" ; then
3673       feature_not_found "iconv" "Install iconv devel"
3674     fi
3675     iconv=no
3676   fi
3677 fi
3678
3679 ##########################################
3680 # curses probe
3681 if test "$iconv" = "no" ; then
3682   # curses will need iconv
3683   curses=no
3684 fi
3685 if test "$curses" != "no" ; then
3686   if test "$mingw32" = "yes" ; then
3687     curses_inc_list="$($pkg_config --cflags ncurses 2>/dev/null):"
3688     curses_lib_list="$($pkg_config --libs ncurses 2>/dev/null):-lpdcurses"
3689   else
3690     curses_inc_list="$($pkg_config --cflags ncursesw 2>/dev/null):-I/usr/include/ncursesw:"
3691     curses_lib_list="$($pkg_config --libs ncursesw 2>/dev/null):-lncursesw:-lcursesw"
3692   fi
3693   curses_found=no
3694   cat > $TMPC << EOF
3695 #include <locale.h>
3696 #include <curses.h>
3697 #include <wchar.h>
3698 #include <langinfo.h>
3699 int main(void) {
3700   const char *codeset;
3701   wchar_t wch = L'w';
3702   setlocale(LC_ALL, "");
3703   resize_term(0, 0);
3704   addwstr(L"wide chars\n");
3705   addnwstr(&wch, 1);
3706   add_wch(WACS_DEGREE);
3707   codeset = nl_langinfo(CODESET);
3708   return codeset != 0;
3709 }
3710 EOF
3711   IFS=:
3712   for curses_inc in $curses_inc_list; do
3713     # Make sure we get the wide character prototypes
3714     curses_inc="-DNCURSES_WIDECHAR $curses_inc"
3715     IFS=:
3716     for curses_lib in $curses_lib_list; do
3717       unset IFS
3718       if compile_prog "$curses_inc" "$curses_lib" ; then
3719         curses_found=yes
3720         break
3721       fi
3722     done
3723     if test "$curses_found" = yes ; then
3724       break
3725     fi
3726   done
3727   unset IFS
3728   if test "$curses_found" = "yes" ; then
3729     curses=yes
3730   else
3731     if test "$curses" = "yes" ; then
3732       feature_not_found "curses" "Install ncurses devel"
3733     fi
3734     curses=no
3735   fi
3736 fi
3737
3738 ##########################################
3739 # curl probe
3740 if test "$curl" != "no" ; then
3741   if $pkg_config libcurl --exists; then
3742     curlconfig="$pkg_config libcurl"
3743   else
3744     curlconfig=curl-config
3745   fi
3746   cat > $TMPC << EOF
3747 #include <curl/curl.h>
3748 int main(void) { curl_easy_init(); curl_multi_setopt(0, 0, 0); return 0; }
3749 EOF
3750   curl_cflags=$($curlconfig --cflags 2>/dev/null)
3751   curl_libs=$($curlconfig --libs 2>/dev/null)
3752   if compile_prog "$curl_cflags" "$curl_libs" ; then
3753     curl=yes
3754   else
3755     if test "$curl" = "yes" ; then
3756       feature_not_found "curl" "Install libcurl devel"
3757     fi
3758     curl=no
3759   fi
3760 fi # test "$curl"
3761
3762 ##########################################
3763 # glib support probe
3764
3765 glib_req_ver=2.48
3766 glib_modules=gthread-2.0
3767 if test "$modules" = yes; then
3768     glib_modules="$glib_modules gmodule-export-2.0"
3769 fi
3770 if test "$plugins" = yes; then
3771     glib_modules="$glib_modules gmodule-2.0"
3772 fi
3773
3774 # This workaround is required due to a bug in pkg-config file for glib as it
3775 # doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
3776
3777 if test "$static" = yes && test "$mingw32" = yes; then
3778     QEMU_CFLAGS="-DGLIB_STATIC_COMPILATION $QEMU_CFLAGS"
3779 fi
3780
3781 for i in $glib_modules; do
3782     if $pkg_config --atleast-version=$glib_req_ver $i; then
3783         glib_cflags=$($pkg_config --cflags $i)
3784         glib_libs=$($pkg_config --libs $i)
3785         QEMU_CFLAGS="$glib_cflags $QEMU_CFLAGS"
3786         LIBS="$glib_libs $LIBS"
3787         libs_qga="$glib_libs $libs_qga"
3788     else
3789         error_exit "glib-$glib_req_ver $i is required to compile QEMU"
3790     fi
3791 done
3792
3793 if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
3794     gio=yes
3795     gio_cflags=$($pkg_config --cflags gio-2.0)
3796     gio_libs=$($pkg_config --libs gio-2.0)
3797     gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
3798     if [ ! -x "$gdbus_codegen" ]; then
3799         gdbus_codegen=
3800     fi
3801 else
3802     gio=no
3803 fi
3804
3805 if $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
3806     gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
3807     gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
3808 fi
3809
3810 # Sanity check that the current size_t matches the
3811 # size that glib thinks it should be. This catches
3812 # problems on multi-arch where people try to build
3813 # 32-bit QEMU while pointing at 64-bit glib headers
3814 cat > $TMPC <<EOF
3815 #include <glib.h>
3816 #include <unistd.h>
3817
3818 #define QEMU_BUILD_BUG_ON(x) \
3819   typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
3820
3821 int main(void) {
3822    QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
3823    return 0;
3824 }
3825 EOF
3826
3827 if ! compile_prog "$CFLAGS" "$LIBS" ; then
3828     error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
3829                "You probably need to set PKG_CONFIG_LIBDIR"\
3830                "to point to the right pkg-config files for your"\
3831                "build target"
3832 fi
3833
3834 # Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
3835 cat > $TMPC << EOF
3836 #include <glib.h>
3837 int main(void) { return 0; }
3838 EOF
3839 if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3840     if cc_has_warning_flag "-Wno-unknown-attributes"; then
3841         glib_cflags="-Wno-unknown-attributes $glib_cflags"
3842         CFLAGS="-Wno-unknown-attributes $CFLAGS"
3843     fi
3844 fi
3845
3846 #########################################
3847 # zlib check
3848
3849 if test "$zlib" != "no" ; then
3850     if $pkg_config --exists zlib; then
3851         zlib_cflags=$($pkg_config --cflags zlib)
3852         zlib_libs=$($pkg_config --libs zlib)
3853         QEMU_CFLAGS="$zlib_cflags $QEMU_CFLAGS"
3854         LIBS="$zlib_libs $LIBS"
3855     else
3856         cat > $TMPC << EOF
3857 #include <zlib.h>
3858 int main(void) { zlibVersion(); return 0; }
3859 EOF
3860         if compile_prog "" "-lz" ; then
3861             LIBS="$LIBS -lz"
3862         else
3863             error_exit "zlib check failed" \
3864                 "Make sure to have the zlib libs and headers installed."
3865         fi
3866     fi
3867 fi
3868
3869 ##########################################
3870 # SHA command probe for modules
3871 if test "$modules" = yes; then
3872     shacmd_probe="sha1sum sha1 shasum"
3873     for c in $shacmd_probe; do
3874         if has $c; then
3875             shacmd="$c"
3876             break
3877         fi
3878     done
3879     if test "$shacmd" = ""; then
3880         error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
3881     fi
3882 fi
3883
3884 ##########################################
3885 # pixman support probe
3886
3887 if test "$want_tools" = "no" && test "$softmmu" = "no"; then
3888   pixman_cflags=
3889   pixman_libs=
3890 elif $pkg_config --atleast-version=0.21.8 pixman-1 > /dev/null 2>&1; then
3891   pixman_cflags=$($pkg_config --cflags pixman-1)
3892   pixman_libs=$($pkg_config --libs pixman-1)
3893 else
3894   error_exit "pixman >= 0.21.8 not present." \
3895       "Please install the pixman devel package."
3896 fi
3897
3898 ##########################################
3899 # libmpathpersist probe
3900
3901 if test "$mpath" != "no" ; then
3902   # probe for the new API
3903   cat > $TMPC <<EOF
3904 #include <libudev.h>
3905 #include <mpath_persist.h>
3906 unsigned mpath_mx_alloc_len = 1024;
3907 int logsink;
3908 static struct config *multipath_conf;
3909 extern struct udev *udev;
3910 extern struct config *get_multipath_config(void);
3911 extern void put_multipath_config(struct config *conf);
3912 struct udev *udev;
3913 struct config *get_multipath_config(void) { return multipath_conf; }
3914 void put_multipath_config(struct config *conf) { }
3915
3916 int main(void) {
3917     udev = udev_new();
3918     multipath_conf = mpath_lib_init();
3919     return 0;
3920 }
3921 EOF
3922   if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
3923     mpathpersist=yes
3924     mpathpersist_new_api=yes
3925   else
3926     # probe for the old API
3927     cat > $TMPC <<EOF
3928 #include <libudev.h>
3929 #include <mpath_persist.h>
3930 unsigned mpath_mx_alloc_len = 1024;
3931 int logsink;
3932 int main(void) {
3933     struct udev *udev = udev_new();
3934     mpath_lib_init(udev);
3935     return 0;
3936 }
3937 EOF
3938     if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
3939       mpathpersist=yes
3940       mpathpersist_new_api=no
3941     else
3942       mpathpersist=no
3943     fi
3944   fi
3945 else
3946   mpathpersist=no
3947 fi
3948
3949 ##########################################
3950 # pthread probe
3951 PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
3952
3953 pthread=no
3954 cat > $TMPC << EOF
3955 #include <pthread.h>
3956 static void *f(void *p) { return NULL; }
3957 int main(void) {
3958   pthread_t thread;
3959   pthread_create(&thread, 0, f, 0);
3960   return 0;
3961 }
3962 EOF
3963 if compile_prog "" "" ; then
3964   pthread=yes
3965 else
3966   for pthread_lib in $PTHREADLIBS_LIST; do
3967     if compile_prog "" "$pthread_lib" ; then
3968       pthread=yes
3969       found=no
3970       for lib_entry in $LIBS; do
3971         if test "$lib_entry" = "$pthread_lib"; then
3972           found=yes
3973           break
3974         fi
3975       done
3976       if test "$found" = "no"; then
3977         LIBS="$pthread_lib $LIBS"
3978         libs_qga="$pthread_lib $libs_qga"
3979       fi
3980       PTHREAD_LIB="$pthread_lib"
3981       break
3982     fi
3983   done
3984 fi
3985
3986 if test "$mingw32" != yes && test "$pthread" = no; then
3987   error_exit "pthread check failed" \
3988       "Make sure to have the pthread libs and headers installed."
3989 fi
3990
3991 # check for pthread_setname_np with thread id
3992 pthread_setname_np_w_tid=no
3993 cat > $TMPC << EOF
3994 #include <pthread.h>
3995
3996 static void *f(void *p) { return NULL; }
3997 int main(void)
3998 {
3999     pthread_t thread;
4000     pthread_create(&thread, 0, f, 0);
4001     pthread_setname_np(thread, "QEMU");
4002     return 0;
4003 }
4004 EOF
4005 if compile_prog "" "$pthread_lib" ; then
4006   pthread_setname_np_w_tid=yes
4007 fi
4008
4009 # check for pthread_setname_np without thread id
4010 pthread_setname_np_wo_tid=no
4011 cat > $TMPC << EOF
4012 #include <pthread.h>
4013
4014 static void *f(void *p) { pthread_setname_np("QEMU"); }
4015 int main(void)
4016 {
4017     pthread_t thread;
4018     pthread_create(&thread, 0, f, 0);
4019     return 0;
4020 }
4021 EOF
4022 if compile_prog "" "$pthread_lib" ; then
4023   pthread_setname_np_wo_tid=yes
4024 fi
4025
4026 ##########################################
4027 # rbd probe
4028 if test "$rbd" != "no" ; then
4029   cat > $TMPC <<EOF
4030 #include <stdio.h>
4031 #include <rbd/librbd.h>
4032 int main(void) {
4033     rados_t cluster;
4034     rados_create(&cluster, NULL);
4035     return 0;
4036 }
4037 EOF
4038   rbd_libs="-lrbd -lrados"
4039   if compile_prog "" "$rbd_libs" ; then
4040     rbd=yes
4041   else
4042     if test "$rbd" = "yes" ; then
4043       feature_not_found "rados block device" "Install librbd/ceph devel"
4044     fi
4045     rbd=no
4046   fi
4047 fi
4048
4049 ##########################################
4050 # libssh probe
4051 if test "$libssh" != "no" ; then
4052   if $pkg_config --exists libssh; then
4053     libssh_cflags=$($pkg_config libssh --cflags)
4054     libssh_libs=$($pkg_config libssh --libs)
4055     libssh=yes
4056   else
4057     if test "$libssh" = "yes" ; then
4058       error_exit "libssh required for --enable-libssh"
4059     fi
4060     libssh=no
4061   fi
4062 fi
4063
4064 ##########################################
4065 # Check for libssh 0.8
4066 # This is done like this instead of using the LIBSSH_VERSION_* and
4067 # SSH_VERSION_* macros because some distributions in the past shipped
4068 # snapshots of the future 0.8 from Git, and those snapshots did not
4069 # have updated version numbers (still referring to 0.7.0).
4070
4071 if test "$libssh" = "yes"; then
4072   cat > $TMPC <<EOF
4073 #include <libssh/libssh.h>
4074 int main(void) { return ssh_get_server_publickey(NULL, NULL); }
4075 EOF
4076   if compile_prog "$libssh_cflags" "$libssh_libs"; then
4077     libssh_cflags="-DHAVE_LIBSSH_0_8 $libssh_cflags"
4078   fi
4079 fi
4080
4081 ##########################################
4082 # linux-aio probe
4083
4084 if test "$linux_aio" != "no" ; then
4085   cat > $TMPC <<EOF
4086 #include <libaio.h>
4087 #include <sys/eventfd.h>
4088 #include <stddef.h>
4089 int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
4090 EOF
4091   if compile_prog "" "-laio" ; then
4092     linux_aio=yes
4093   else
4094     if test "$linux_aio" = "yes" ; then
4095       feature_not_found "linux AIO" "Install libaio devel"
4096     fi
4097     linux_aio=no
4098   fi
4099 fi
4100 ##########################################
4101 # linux-io-uring probe
4102
4103 if test "$linux_io_uring" != "no" ; then
4104   if $pkg_config liburing; then
4105     linux_io_uring_cflags=$($pkg_config --cflags liburing)
4106     linux_io_uring_libs=$($pkg_config --libs liburing)
4107     linux_io_uring=yes
4108   else
4109     if test "$linux_io_uring" = "yes" ; then
4110       feature_not_found "linux io_uring" "Install liburing devel"
4111     fi
4112     linux_io_uring=no
4113   fi
4114 fi
4115
4116 ##########################################
4117 # TPM emulation is only on POSIX
4118
4119 if test "$tpm" = ""; then
4120   if test "$mingw32" = "yes"; then
4121     tpm=no
4122   else
4123     tpm=yes
4124   fi
4125 elif test "$tpm" = "yes"; then
4126   if test "$mingw32" = "yes" ; then
4127     error_exit "TPM emulation only available on POSIX systems"
4128   fi
4129 fi
4130
4131 ##########################################
4132 # attr probe
4133
4134 if test "$attr" != "no" ; then
4135   cat > $TMPC <<EOF
4136 #include <stdio.h>
4137 #include <sys/types.h>
4138 #ifdef CONFIG_LIBATTR
4139 #include <attr/xattr.h>
4140 #else
4141 #include <sys/xattr.h>
4142 #endif
4143 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }
4144 EOF
4145   if compile_prog "" "" ; then
4146     attr=yes
4147   # Older distros have <attr/xattr.h>, and need -lattr:
4148   elif compile_prog "-DCONFIG_LIBATTR" "-lattr" ; then
4149     attr=yes
4150     LIBS="-lattr $LIBS"
4151     libattr=yes
4152   else
4153     if test "$attr" = "yes" ; then
4154       feature_not_found "ATTR" "Install libc6 or libattr devel"
4155     fi
4156     attr=no
4157   fi
4158 fi
4159
4160 ##########################################
4161 # iovec probe
4162 cat > $TMPC <<EOF
4163 #include <sys/types.h>
4164 #include <sys/uio.h>
4165 #include <unistd.h>
4166 int main(void) { return sizeof(struct iovec); }
4167 EOF
4168 iovec=no
4169 if compile_prog "" "" ; then
4170   iovec=yes
4171 fi
4172
4173 ##########################################
4174 # preadv probe
4175 cat > $TMPC <<EOF
4176 #include <sys/types.h>
4177 #include <sys/uio.h>
4178 #include <unistd.h>
4179 int main(void) { return preadv(0, 0, 0, 0); }
4180 EOF
4181 preadv=no
4182 if compile_prog "" "" ; then
4183   preadv=yes
4184 fi
4185
4186 ##########################################
4187 # fdt probe
4188 # fdt support is mandatory for at least some target architectures,
4189 # so insist on it if we're building those system emulators.
4190 fdt_required=no
4191 for target in $target_list; do
4192   case $target in
4193     aarch64*-softmmu|arm*-softmmu|ppc*-softmmu|microblaze*-softmmu|mips64el-softmmu|riscv*-softmmu)
4194       fdt_required=yes
4195     ;;
4196   esac
4197 done
4198
4199 if test "$fdt_required" = "yes"; then
4200   if test "$fdt" = "no"; then
4201     error_exit "fdt disabled but some requested targets require it." \
4202       "You can turn off fdt only if you also disable all the system emulation" \
4203       "targets which need it (by specifying a cut down --target-list)."
4204   fi
4205   fdt=yes
4206 elif test "$fdt" != "yes" ; then
4207   fdt=no
4208 fi
4209
4210 # fdt is only required when building softmmu targets
4211 if test -z "$fdt" -a "$softmmu" != "yes" ; then
4212     fdt="no"
4213 fi
4214
4215 if test "$fdt" != "no" ; then
4216   fdt_libs="-lfdt"
4217   # explicitly check for libfdt_env.h as it is missing in some stable installs
4218   # and test for required functions to make sure we are on a version >= 1.4.2
4219   cat > $TMPC << EOF
4220 #include <libfdt.h>
4221 #include <libfdt_env.h>
4222 int main(void) { fdt_check_full(NULL, 0); return 0; }