Update version for v5.1.0 release
[qemu.git] / configure
1 #!/bin/sh
2 #
3 # qemu configure script (c) 2003 Fabrice Bellard
4 #
5
6 # Unset some variables known to interfere with behavior of common tools,
7 # just as autoconf does.
8 CLICOLOR_FORCE= GREP_OPTIONS=
9 unset CLICOLOR_FORCE GREP_OPTIONS
10
11 # Don't allow CCACHE, if present, to use cached results of compile tests!
12 export CCACHE_RECACHE=yes
13
14 # Temporary directory used for files created while
15 # configure runs. Since it is in the build directory
16 # we can safely blow away any previous version of it
17 # (and we need not jump through hoops to try to delete
18 # it when configure exits.)
19 TMPDIR1="config-temp"
20 rm -rf "${TMPDIR1}"
21 mkdir -p "${TMPDIR1}"
22 if [ $? -ne 0 ]; then
23     echo "ERROR: failed to create temporary directory"
24     exit 1
25 fi
26
27 TMPB="qemu-conf"
28 TMPC="${TMPDIR1}/${TMPB}.c"
29 TMPO="${TMPDIR1}/${TMPB}.o"
30 TMPCXX="${TMPDIR1}/${TMPB}.cxx"
31 TMPE="${TMPDIR1}/${TMPB}.exe"
32 TMPMO="${TMPDIR1}/${TMPB}.mo"
33 TMPTXT="${TMPDIR1}/${TMPB}.txt"
34
35 rm -f config.log
36
37 # Print a helpful header at the top of config.log
38 echo "# QEMU configure log $(date)" >> config.log
39 printf "# Configured with:" >> config.log
40 printf " '%s'" "$0" "$@" >> config.log
41 echo >> config.log
42 echo "#" >> config.log
43
44 print_error() {
45     (echo
46     echo "ERROR: $1"
47     while test -n "$2"; do
48         echo "       $2"
49         shift
50     done
51     echo) >&2
52 }
53
54 error_exit() {
55     print_error "$@"
56     exit 1
57 }
58
59 do_compiler() {
60     # Run the compiler, capturing its output to the log. First argument
61     # is compiler binary to execute.
62     local compiler="$1"
63     shift
64     if test -n "$BASH_VERSION"; then eval '
65         echo >>config.log "
66 funcs: ${FUNCNAME[*]}
67 lines: ${BASH_LINENO[*]}"
68     '; fi
69     echo $compiler "$@" >> config.log
70     $compiler "$@" >> config.log 2>&1 || return $?
71     # Test passed. If this is an --enable-werror build, rerun
72     # the test with -Werror and bail out if it fails. This
73     # makes warning-generating-errors in configure test code
74     # obvious to developers.
75     if test "$werror" != "yes"; then
76         return 0
77     fi
78     # Don't bother rerunning the compile if we were already using -Werror
79     case "$*" in
80         *-Werror*)
81            return 0
82         ;;
83     esac
84     echo $compiler -Werror "$@" >> config.log
85     $compiler -Werror "$@" >> config.log 2>&1 && return $?
86     error_exit "configure test passed without -Werror but failed with -Werror." \
87         "This is probably a bug in the configure script. The failing command" \
88         "will be at the bottom of config.log." \
89         "You can run configure with --disable-werror to bypass this check."
90 }
91
92 do_cc() {
93     do_compiler "$cc" "$@"
94 }
95
96 do_cxx() {
97     do_compiler "$cxx" "$@"
98 }
99
100 # Append $2 to the variable named $1, with space separation
101 add_to() {
102     eval $1=\${$1:+\"\$$1 \"}\$2
103 }
104
105 update_cxxflags() {
106     # Set QEMU_CXXFLAGS from QEMU_CFLAGS by filtering out those
107     # options which some versions of GCC's C++ compiler complain about
108     # because they only make sense for C programs.
109     QEMU_CXXFLAGS="$QEMU_CXXFLAGS -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"
110
111     for arg in $QEMU_CFLAGS; do
112         case $arg in
113             -Wstrict-prototypes|-Wmissing-prototypes|-Wnested-externs|\
114             -Wold-style-declaration|-Wold-style-definition|-Wredundant-decls)
115                 ;;
116             -std=gnu99)
117                 QEMU_CXXFLAGS=${QEMU_CXXFLAGS:+$QEMU_CXXFLAGS }"-std=gnu++98"
118                 ;;
119             *)
120                 QEMU_CXXFLAGS=${QEMU_CXXFLAGS:+$QEMU_CXXFLAGS }$arg
121                 ;;
122         esac
123     done
124 }
125
126 compile_object() {
127   local_cflags="$1"
128   do_cc $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
129 }
130
131 compile_prog() {
132   local_cflags="$1"
133   local_ldflags="$2"
134   do_cc $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC $QEMU_LDFLAGS $local_ldflags
135 }
136
137 # symbolically link $1 to $2.  Portable version of "ln -sf".
138 symlink() {
139   rm -rf "$2"
140   mkdir -p "$(dirname "$2")"
141   ln -s "$1" "$2"
142 }
143
144 # check whether a command is available to this shell (may be either an
145 # executable or a builtin)
146 has() {
147     type "$1" >/dev/null 2>&1
148 }
149
150 # search for an executable in PATH
151 path_of() {
152     local_command="$1"
153     local_ifs="$IFS"
154     local_dir=""
155
156     # pathname has a dir component?
157     if [ "${local_command#*/}" != "$local_command" ]; then
158         if [ -x "$local_command" ] && [ ! -d "$local_command" ]; then
159             echo "$local_command"
160             return 0
161         fi
162     fi
163     if [ -z "$local_command" ]; then
164         return 1
165     fi
166
167     IFS=:
168     for local_dir in $PATH; do
169         if [ -x "$local_dir/$local_command" ] && [ ! -d "$local_dir/$local_command" ]; then
170             echo "$local_dir/$local_command"
171             IFS="${local_ifs:-$(printf ' \t\n')}"
172             return 0
173         fi
174     done
175     # not found
176     IFS="${local_ifs:-$(printf ' \t\n')}"
177     return 1
178 }
179
180 have_backend () {
181     echo "$trace_backends" | grep "$1" >/dev/null
182 }
183
184 glob() {
185     eval test -z '"${1#'"$2"'}"'
186 }
187
188 supported_hax_target() {
189     test "$hax" = "yes" || return 1
190     glob "$1" "*-softmmu" || return 1
191     case "${1%-softmmu}" in
192         i386|x86_64)
193             return 0
194         ;;
195     esac
196     return 1
197 }
198
199 supported_kvm_target() {
200     test "$kvm" = "yes" || return 1
201     glob "$1" "*-softmmu" || return 1
202     case "${1%-softmmu}:$cpu" in
203         arm:arm | aarch64:aarch64 | \
204         i386:i386 | i386:x86_64 | i386:x32 | \
205         x86_64:i386 | x86_64:x86_64 | x86_64:x32 | \
206         mips:mips | mipsel:mips | mips64:mips | mips64el:mips | \
207         ppc:ppc | ppc64:ppc | ppc:ppc64 | ppc64:ppc64 | ppc64:ppc64le | \
208         s390x:s390x)
209             return 0
210         ;;
211     esac
212     return 1
213 }
214
215 supported_xen_target() {
216     test "$xen" = "yes" || return 1
217     glob "$1" "*-softmmu" || return 1
218     # Only i386 and x86_64 provide the xenpv machine.
219     case "${1%-softmmu}" in
220         i386|x86_64)
221             return 0
222         ;;
223     esac
224     return 1
225 }
226
227 supported_hvf_target() {
228     test "$hvf" = "yes" || return 1
229     glob "$1" "*-softmmu" || return 1
230     case "${1%-softmmu}" in
231         x86_64)
232             return 0
233         ;;
234     esac
235     return 1
236 }
237
238 supported_whpx_target() {
239     test "$whpx" = "yes" || return 1
240     glob "$1" "*-softmmu" || return 1
241     case "${1%-softmmu}" in
242         i386|x86_64)
243             return 0
244         ;;
245     esac
246     return 1
247 }
248
249 supported_target() {
250     case "$1" in
251         *-softmmu)
252             ;;
253         *-linux-user)
254             if test "$linux" != "yes"; then
255                 print_error "Target '$target' is only available on a Linux host"
256                 return 1
257             fi
258             ;;
259         *-bsd-user)
260             if test "$bsd" != "yes"; then
261                 print_error "Target '$target' is only available on a BSD host"
262                 return 1
263             fi
264             ;;
265         *)
266             print_error "Invalid target name '$target'"
267             return 1
268             ;;
269     esac
270     test "$tcg" = "yes" && return 0
271     supported_kvm_target "$1" && return 0
272     supported_xen_target "$1" && return 0
273     supported_hax_target "$1" && return 0
274     supported_hvf_target "$1" && return 0
275     supported_whpx_target "$1" && return 0
276     print_error "TCG disabled, but hardware accelerator not available for '$target'"
277     return 1
278 }
279
280
281 ld_has() {
282     $ld --help 2>/dev/null | grep ".$1" >/dev/null 2>&1
283 }
284
285 # make source path absolute
286 source_path=$(cd "$(dirname -- "$0")"; pwd)
287
288 if printf %s\\n "$source_path" "$PWD" | grep -q "[[:space:]:]";
289 then
290   error_exit "main directory cannot contain spaces nor colons"
291 fi
292
293 # default parameters
294 cpu=""
295 iasl="iasl"
296 interp_prefix="/usr/gnemul/qemu-%M"
297 static="no"
298 cross_prefix=""
299 audio_drv_list=""
300 block_drv_rw_whitelist=""
301 block_drv_ro_whitelist=""
302 host_cc="cc"
303 libs_cpu=""
304 libs_softmmu=""
305 libs_tools=""
306 audio_win_int=""
307 libs_qga=""
308 debug_info="yes"
309 stack_protector=""
310 safe_stack=""
311 use_containers="yes"
312 gdb_bin=$(command -v "gdb-multiarch" || command -v "gdb")
313
314 if test -e "$source_path/.git"
315 then
316     git_update=yes
317     git_submodules="ui/keycodemapdb"
318     git_submodules="$git_submodules tests/fp/berkeley-testfloat-3"
319     git_submodules="$git_submodules tests/fp/berkeley-softfloat-3"
320 else
321     git_update=no
322     git_submodules=""
323
324     if ! test -f "$source_path/ui/keycodemapdb/README"
325     then
326         echo
327         echo "ERROR: missing file $source_path/ui/keycodemapdb/README"
328         echo
329         echo "This is not a GIT checkout but module content appears to"
330         echo "be missing. Do not use 'git archive' or GitHub download links"
331         echo "to acquire QEMU source archives. Non-GIT builds are only"
332         echo "supported with source archives linked from:"
333         echo
334         echo "  https://www.qemu.org/download/#source"
335         echo
336         echo "Developers working with GIT can use scripts/archive-source.sh"
337         echo "if they need to create valid source archives."
338         echo
339         exit 1
340     fi
341 fi
342 git="git"
343
344 # Don't accept a target_list environment variable.
345 unset target_list
346 unset target_list_exclude
347
348 # Default value for a variable defining feature "foo".
349 #  * foo="no"  feature will only be used if --enable-foo arg is given
350 #  * foo=""    feature will be searched for, and if found, will be used
351 #              unless --disable-foo is given
352 #  * foo="yes" this value will only be set by --enable-foo flag.
353 #              feature will searched for,
354 #              if not found, configure exits with error
355 #
356 # Always add --enable-foo and --disable-foo command line args.
357 # Distributions want to ensure that several features are compiled in, and it
358 # is impossible without a --enable-foo that exits if a feature is not found.
359
360 brlapi=""
361 curl=""
362 curses=""
363 docs=""
364 fdt=""
365 netmap="no"
366 sdl=""
367 sdl_image=""
368 virtfs=""
369 mpath=""
370 vnc="yes"
371 sparse="no"
372 vde=""
373 vnc_sasl=""
374 vnc_jpeg=""
375 vnc_png=""
376 xkbcommon=""
377 xen=""
378 xen_ctrl_version=""
379 xen_pci_passthrough=""
380 linux_aio=""
381 linux_io_uring=""
382 cap_ng=""
383 attr=""
384 libattr=""
385 xfs=""
386 tcg="yes"
387 membarrier=""
388 vhost_net=""
389 vhost_crypto=""
390 vhost_scsi=""
391 vhost_vsock=""
392 vhost_user=""
393 vhost_user_fs=""
394 kvm="no"
395 hax="no"
396 hvf="no"
397 whpx="no"
398 rdma=""
399 pvrdma=""
400 gprof="no"
401 debug_tcg="no"
402 debug="no"
403 sanitizers="no"
404 tsan="no"
405 fortify_source=""
406 strip_opt="yes"
407 tcg_interpreter="no"
408 bigendian="no"
409 mingw32="no"
410 gcov="no"
411 gcov_tool="gcov"
412 EXESUF=""
413 DSOSUF=".so"
414 LDFLAGS_SHARED="-shared"
415 modules="no"
416 module_upgrades="no"
417 prefix="/usr/local"
418 mandir="\${prefix}/share/man"
419 datadir="\${prefix}/share"
420 firmwarepath="\${prefix}/share/qemu-firmware"
421 efi_aarch64=""
422 qemu_docdir="\${prefix}/share/doc/qemu"
423 bindir="\${prefix}/bin"
424 libdir="\${prefix}/lib"
425 libexecdir="\${prefix}/libexec"
426 includedir="\${prefix}/include"
427 sysconfdir="\${prefix}/etc"
428 local_statedir="\${prefix}/var"
429 confsuffix="/qemu"
430 slirp=""
431 oss_lib=""
432 bsd="no"
433 linux="no"
434 solaris="no"
435 profiler="no"
436 cocoa="no"
437 softmmu="yes"
438 linux_user="no"
439 bsd_user="no"
440 blobs="yes"
441 edk2_blobs="no"
442 pkgversion=""
443 pie=""
444 qom_cast_debug="yes"
445 trace_backends="log"
446 trace_file="trace"
447 spice=""
448 rbd=""
449 smartcard=""
450 libusb=""
451 usb_redir=""
452 opengl=""
453 opengl_dmabuf="no"
454 cpuid_h="no"
455 avx2_opt=""
456 zlib="yes"
457 capstone=""
458 lzo=""
459 snappy=""
460 bzip2=""
461 lzfse=""
462 zstd=""
463 guest_agent=""
464 guest_agent_with_vss="no"
465 guest_agent_ntddscsi="no"
466 guest_agent_msi=""
467 vss_win32_sdk=""
468 win_sdk="no"
469 want_tools=""
470 libiscsi=""
471 libnfs=""
472 coroutine=""
473 coroutine_pool=""
474 debug_stack_usage="no"
475 crypto_afalg="no"
476 seccomp=""
477 glusterfs=""
478 glusterfs_xlator_opt="no"
479 glusterfs_discard="no"
480 glusterfs_fallocate="no"
481 glusterfs_zerofill="no"
482 glusterfs_ftruncate_has_stat="no"
483 glusterfs_iocb_has_stat="no"
484 gtk=""
485 gtk_gl="no"
486 tls_priority="NORMAL"
487 gnutls=""
488 nettle=""
489 nettle_xts="no"
490 gcrypt=""
491 gcrypt_hmac="no"
492 gcrypt_xts="no"
493 qemu_private_xts="yes"
494 auth_pam=""
495 vte=""
496 virglrenderer=""
497 tpm=""
498 libssh=""
499 live_block_migration="yes"
500 numa=""
501 tcmalloc="no"
502 jemalloc="no"
503 replication="yes"
504 bochs="yes"
505 cloop="yes"
506 dmg="yes"
507 qcow1="yes"
508 vdi="yes"
509 vvfat="yes"
510 qed="yes"
511 parallels="yes"
512 sheepdog="yes"
513 libxml2=""
514 debug_mutex="no"
515 libpmem=""
516 default_devices="yes"
517 plugins="no"
518 fuzzing="no"
519 rng_none="no"
520 secret_keyring=""
521 libdaxctl=""
522
523 supported_cpu="no"
524 supported_os="no"
525 bogus_os="no"
526 malloc_trim=""
527
528 # parse CC options first
529 for opt do
530   optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
531   case "$opt" in
532   --cross-prefix=*) cross_prefix="$optarg"
533   ;;
534   --cc=*) CC="$optarg"
535   ;;
536   --cxx=*) CXX="$optarg"
537   ;;
538   --cpu=*) cpu="$optarg"
539   ;;
540   --extra-cflags=*) QEMU_CFLAGS="$QEMU_CFLAGS $optarg"
541                     QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg"
542   ;;
543   --extra-cxxflags=*) QEMU_CXXFLAGS="$QEMU_CXXFLAGS $optarg"
544   ;;
545   --extra-ldflags=*) QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg"
546                      EXTRA_LDFLAGS="$optarg"
547   ;;
548   --enable-debug-info) debug_info="yes"
549   ;;
550   --disable-debug-info) debug_info="no"
551   ;;
552   --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"
553   ;;
554   --cross-cc-cflags-*) cc_arch=${opt#--cross-cc-flags-}; cc_arch=${cc_arch%%=*}
555                       eval "cross_cc_cflags_${cc_arch}=\$optarg"
556                       cross_cc_vars="$cross_cc_vars cross_cc_cflags_${cc_arch}"
557   ;;
558   --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}
559                 cc_archs="$cc_archs $cc_arch"
560                 eval "cross_cc_${cc_arch}=\$optarg"
561                 cross_cc_vars="$cross_cc_vars cross_cc_${cc_arch}"
562   ;;
563   esac
564 done
565 # OS specific
566 # Using uname is really, really broken.  Once we have the right set of checks
567 # we can eliminate its usage altogether.
568
569 # Preferred compiler:
570 #  ${CC} (if set)
571 #  ${cross_prefix}gcc (if cross-prefix specified)
572 #  system compiler
573 if test -z "${CC}${cross_prefix}"; then
574   cc="$host_cc"
575 else
576   cc="${CC-${cross_prefix}gcc}"
577 fi
578
579 if test -z "${CXX}${cross_prefix}"; then
580   cxx="c++"
581 else
582   cxx="${CXX-${cross_prefix}g++}"
583 fi
584
585 ar="${AR-${cross_prefix}ar}"
586 as="${AS-${cross_prefix}as}"
587 ccas="${CCAS-$cc}"
588 cpp="${CPP-$cc -E}"
589 objcopy="${OBJCOPY-${cross_prefix}objcopy}"
590 ld="${LD-${cross_prefix}ld}"
591 ranlib="${RANLIB-${cross_prefix}ranlib}"
592 nm="${NM-${cross_prefix}nm}"
593 strip="${STRIP-${cross_prefix}strip}"
594 windres="${WINDRES-${cross_prefix}windres}"
595 pkg_config_exe="${PKG_CONFIG-${cross_prefix}pkg-config}"
596 query_pkg_config() {
597     "${pkg_config_exe}" ${QEMU_PKG_CONFIG_FLAGS} "$@"
598 }
599 pkg_config=query_pkg_config
600 sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
601
602 # If the user hasn't specified ARFLAGS, default to 'rv', just as make does.
603 ARFLAGS="${ARFLAGS-rv}"
604
605 # default flags for all hosts
606 # We use -fwrapv to tell the compiler that we require a C dialect where
607 # left shift of signed integers is well defined and has the expected
608 # 2s-complement style results. (Both clang and gcc agree that it
609 # provides these semantics.)
610 QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv -std=gnu99 $QEMU_CFLAGS"
611 QEMU_CFLAGS="-Wall -Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS"
612 QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS"
613 QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
614 QEMU_INCLUDES="-iquote . -iquote \$(SRC_PATH) -iquote \$(SRC_PATH)/accel/tcg -iquote \$(SRC_PATH)/include"
615 QEMU_INCLUDES="$QEMU_INCLUDES -iquote \$(SRC_PATH)/disas/libvixl"
616 if test "$debug_info" = "yes"; then
617     CFLAGS="-g $CFLAGS"
618 fi
619
620 # running configure in the source tree?
621 # we know that's the case if configure is there.
622 if test -f "./configure"; then
623     pwd_is_source_path="y"
624 else
625     pwd_is_source_path="n"
626 fi
627
628 check_define() {
629 cat > $TMPC <<EOF
630 #if !defined($1)
631 #error $1 not defined
632 #endif
633 int main(void) { return 0; }
634 EOF
635   compile_object
636 }
637
638 check_include() {
639 cat > $TMPC <<EOF
640 #include <$1>
641 int main(void) { return 0; }
642 EOF
643   compile_object
644 }
645
646 write_c_skeleton() {
647     cat > $TMPC <<EOF
648 int main(void) { return 0; }
649 EOF
650 }
651
652 write_c_fuzzer_skeleton() {
653     cat > $TMPC <<EOF
654 #include <stdint.h>
655 #include <sys/types.h>
656 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
657 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
658 EOF
659 }
660
661 if check_define __linux__ ; then
662   targetos="Linux"
663 elif check_define _WIN32 ; then
664   targetos='MINGW32'
665 elif check_define __OpenBSD__ ; then
666   targetos='OpenBSD'
667 elif check_define __sun__ ; then
668   targetos='SunOS'
669 elif check_define __HAIKU__ ; then
670   targetos='Haiku'
671 elif check_define __FreeBSD__ ; then
672   targetos='FreeBSD'
673 elif check_define __FreeBSD_kernel__ && check_define __GLIBC__; then
674   targetos='GNU/kFreeBSD'
675 elif check_define __DragonFly__ ; then
676   targetos='DragonFly'
677 elif check_define __NetBSD__; then
678   targetos='NetBSD'
679 elif check_define __APPLE__; then
680   targetos='Darwin'
681 else
682   # This is a fatal error, but don't report it yet, because we
683   # might be going to just print the --help text, or it might
684   # be the result of a missing compiler.
685   targetos='bogus'
686   bogus_os='yes'
687 fi
688
689 # Some host OSes need non-standard checks for which CPU to use.
690 # Note that these checks are broken for cross-compilation: if you're
691 # cross-compiling to one of these OSes then you'll need to specify
692 # the correct CPU with the --cpu option.
693 case $targetos in
694 Darwin)
695   # on Leopard most of the system is 32-bit, so we have to ask the kernel if we can
696   # run 64-bit userspace code.
697   # If the user didn't specify a CPU explicitly and the kernel says this is
698   # 64 bit hw, then assume x86_64. Otherwise fall through to the usual detection code.
699   if test -z "$cpu" && test "$(sysctl -n hw.optional.x86_64)" = "1"; then
700     cpu="x86_64"
701   fi
702   ;;
703 SunOS)
704   # $(uname -m) returns i86pc even on an x86_64 box, so default based on isainfo
705   if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then
706     cpu="x86_64"
707   fi
708 esac
709
710 if test ! -z "$cpu" ; then
711   # command line argument
712   :
713 elif check_define __i386__ ; then
714   cpu="i386"
715 elif check_define __x86_64__ ; then
716   if check_define __ILP32__ ; then
717     cpu="x32"
718   else
719     cpu="x86_64"
720   fi
721 elif check_define __sparc__ ; then
722   if check_define __arch64__ ; then
723     cpu="sparc64"
724   else
725     cpu="sparc"
726   fi
727 elif check_define _ARCH_PPC ; then
728   if check_define _ARCH_PPC64 ; then
729     if check_define _LITTLE_ENDIAN ; then
730       cpu="ppc64le"
731     else
732       cpu="ppc64"
733     fi
734   else
735     cpu="ppc"
736   fi
737 elif check_define __mips__ ; then
738   cpu="mips"
739 elif check_define __s390__ ; then
740   if check_define __s390x__ ; then
741     cpu="s390x"
742   else
743     cpu="s390"
744   fi
745 elif check_define __riscv ; then
746   if check_define _LP64 ; then
747     cpu="riscv64"
748   else
749     cpu="riscv32"
750   fi
751 elif check_define __arm__ ; then
752   cpu="arm"
753 elif check_define __aarch64__ ; then
754   cpu="aarch64"
755 else
756   cpu=$(uname -m)
757 fi
758
759 ARCH=
760 # Normalise host CPU name and set ARCH.
761 # Note that this case should only have supported host CPUs, not guests.
762 case "$cpu" in
763   ppc|ppc64|s390x|sparc64|x32|riscv32|riscv64)
764     supported_cpu="yes"
765   ;;
766   ppc64le)
767     ARCH="ppc64"
768     supported_cpu="yes"
769   ;;
770   i386|i486|i586|i686|i86pc|BePC)
771     cpu="i386"
772     supported_cpu="yes"
773   ;;
774   x86_64|amd64)
775     cpu="x86_64"
776     supported_cpu="yes"
777   ;;
778   armv*b|armv*l|arm)
779     cpu="arm"
780     supported_cpu="yes"
781   ;;
782   aarch64)
783     cpu="aarch64"
784     supported_cpu="yes"
785   ;;
786   mips*)
787     cpu="mips"
788     supported_cpu="yes"
789   ;;
790   sparc|sun4[cdmuv])
791     cpu="sparc"
792     supported_cpu="yes"
793   ;;
794   *)
795     # This will result in either an error or falling back to TCI later
796     ARCH=unknown
797   ;;
798 esac
799 if test -z "$ARCH"; then
800   ARCH="$cpu"
801 fi
802
803 # OS specific
804
805 # host *BSD for user mode
806 HOST_VARIANT_DIR=""
807
808 case $targetos in
809 MINGW32*)
810   mingw32="yes"
811   hax="yes"
812   vhost_user="no"
813   audio_possible_drivers="dsound sdl"
814   if check_include dsound.h; then
815     audio_drv_list="dsound"
816   else
817     audio_drv_list=""
818   fi
819   supported_os="yes"
820   pie="no"
821 ;;
822 GNU/kFreeBSD)
823   bsd="yes"
824   audio_drv_list="oss try-sdl"
825   audio_possible_drivers="oss sdl pa"
826 ;;
827 FreeBSD)
828   bsd="yes"
829   make="${MAKE-gmake}"
830   audio_drv_list="oss try-sdl"
831   audio_possible_drivers="oss sdl pa"
832   # needed for kinfo_getvmmap(3) in libutil.h
833   LIBS="-lutil $LIBS"
834   # needed for kinfo_getproc
835   libs_qga="-lutil $libs_qga"
836   netmap=""  # enable netmap autodetect
837   HOST_VARIANT_DIR="freebsd"
838   supported_os="yes"
839 ;;
840 DragonFly)
841   bsd="yes"
842   make="${MAKE-gmake}"
843   audio_drv_list="oss try-sdl"
844   audio_possible_drivers="oss sdl pa"
845   HOST_VARIANT_DIR="dragonfly"
846 ;;
847 NetBSD)
848   bsd="yes"
849   hax="yes"
850   make="${MAKE-gmake}"
851   audio_drv_list="oss try-sdl"
852   audio_possible_drivers="oss sdl"
853   oss_lib="-lossaudio"
854   HOST_VARIANT_DIR="netbsd"
855   supported_os="yes"
856 ;;
857 OpenBSD)
858   bsd="yes"
859   make="${MAKE-gmake}"
860   audio_drv_list="try-sdl"
861   audio_possible_drivers="sdl"
862   HOST_VARIANT_DIR="openbsd"
863   supported_os="yes"
864 ;;
865 Darwin)
866   bsd="yes"
867   darwin="yes"
868   hax="yes"
869   hvf="yes"
870   LDFLAGS_SHARED="-bundle -undefined dynamic_lookup"
871   if [ "$cpu" = "x86_64" ] ; then
872     QEMU_CFLAGS="-arch x86_64 $QEMU_CFLAGS"
873     QEMU_LDFLAGS="-arch x86_64 $QEMU_LDFLAGS"
874   fi
875   cocoa="yes"
876   audio_drv_list="coreaudio try-sdl"
877   audio_possible_drivers="coreaudio sdl"
878   QEMU_LDFLAGS="-framework CoreFoundation -framework IOKit $QEMU_LDFLAGS"
879   libs_softmmu="-F/System/Library/Frameworks -framework Cocoa -framework IOKit $libs_softmmu"
880   # Disable attempts to use ObjectiveC features in os/object.h since they
881   # won't work when we're compiling with gcc as a C compiler.
882   QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS"
883   HOST_VARIANT_DIR="darwin"
884   supported_os="yes"
885 ;;
886 SunOS)
887   solaris="yes"
888   make="${MAKE-gmake}"
889   install="${INSTALL-ginstall}"
890   smbd="${SMBD-/usr/sfw/sbin/smbd}"
891   if test -f /usr/include/sys/soundcard.h ; then
892     audio_drv_list="oss try-sdl"
893   fi
894   audio_possible_drivers="oss sdl"
895 # needed for CMSG_ macros in sys/socket.h
896   QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS"
897 # needed for TIOCWIN* defines in termios.h
898   QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
899   QEMU_CFLAGS="-std=gnu99 $QEMU_CFLAGS"
900   solarisnetlibs="-lsocket -lnsl -lresolv"
901   LIBS="$solarisnetlibs $LIBS"
902   libs_qga="$solarisnetlibs $libs_qga"
903 ;;
904 Haiku)
905   haiku="yes"
906   QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS -DBSD_SOURCE $QEMU_CFLAGS"
907   LIBS="-lposix_error_mapper -lnetwork -lbsd $LIBS"
908 ;;
909 Linux)
910   audio_drv_list="try-pa oss"
911   audio_possible_drivers="oss alsa sdl pa"
912   linux="yes"
913   linux_user="yes"
914   kvm="yes"
915   QEMU_INCLUDES="-isystem \$(SRC_PATH)/linux-headers -isystem $PWD/linux-headers $QEMU_INCLUDES"
916   supported_os="yes"
917   libudev="yes"
918 ;;
919 esac
920
921 if [ "$bsd" = "yes" ] ; then
922   if [ "$darwin" != "yes" ] ; then
923     bsd_user="yes"
924   fi
925 fi
926
927 : ${make=${MAKE-make}}
928 : ${install=${INSTALL-install}}
929 # We prefer python 3.x. A bare 'python' is traditionally
930 # python 2.x, but some distros have it as python 3.x, so
931 # we check that too
932 python=
933 for binary in "${PYTHON-python3}" python
934 do
935     if has "$binary"
936     then
937         python=$(command -v "$binary")
938         break
939     fi
940 done
941
942 sphinx_build=
943 for binary in sphinx-build-3 sphinx-build
944 do
945     if has "$binary"
946     then
947         sphinx_build=$(command -v "$binary")
948         break
949     fi
950 done
951
952 # Check for ancillary tools used in testing
953 genisoimage=
954 for binary in genisoimage mkisofs
955 do
956     if has $binary
957     then
958         genisoimage=$(command -v "$binary")
959         break
960     fi
961 done
962
963 # Check for existence of python3 yaml, needed to
964 # import yaml config files into vm-build.
965 python_yaml="no"
966 if $(python3 -c "import yaml" 2> /dev/null); then
967     python_yaml="yes"
968 fi
969
970 : ${smbd=${SMBD-/usr/sbin/smbd}}
971
972 # Default objcc to clang if available, otherwise use CC
973 if has clang; then
974   objcc=clang
975 else
976   objcc="$cc"
977 fi
978
979 if test "$mingw32" = "yes" ; then
980   EXESUF=".exe"
981   DSOSUF=".dll"
982   # MinGW needs -mthreads for TLS and macro _MT.
983   QEMU_CFLAGS="-mthreads $QEMU_CFLAGS"
984   LIBS="-lwinmm -lws2_32 $LIBS"
985   write_c_skeleton;
986   if compile_prog "" "-liberty" ; then
987     LIBS="-liberty $LIBS"
988   fi
989   prefix="c:/Program Files/QEMU"
990   mandir="\${prefix}"
991   datadir="\${prefix}"
992   qemu_docdir="\${prefix}"
993   bindir="\${prefix}"
994   sysconfdir="\${prefix}"
995   local_statedir=
996   confsuffix=""
997   libs_qga="-lws2_32 -lwinmm -lpowrprof -lwtsapi32 -lwininet -liphlpapi -lnetapi32 $libs_qga"
998 fi
999
1000 werror=""
1001
1002 for opt do
1003   optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
1004   case "$opt" in
1005   --help|-h) show_help=yes
1006   ;;
1007   --version|-V) exec cat $source_path/VERSION
1008   ;;
1009   --prefix=*) prefix="$optarg"
1010   ;;
1011   --interp-prefix=*) interp_prefix="$optarg"
1012   ;;
1013   --cross-prefix=*)
1014   ;;
1015   --cc=*)
1016   ;;
1017   --host-cc=*) host_cc="$optarg"
1018   ;;
1019   --cxx=*)
1020   ;;
1021   --iasl=*) iasl="$optarg"
1022   ;;
1023   --objcc=*) objcc="$optarg"
1024   ;;
1025   --make=*) make="$optarg"
1026   ;;
1027   --install=*) install="$optarg"
1028   ;;
1029   --python=*) python="$optarg"
1030   ;;
1031   --sphinx-build=*) sphinx_build="$optarg"
1032   ;;
1033   --gcov=*) gcov_tool="$optarg"
1034   ;;
1035   --smbd=*) smbd="$optarg"
1036   ;;
1037   --extra-cflags=*)
1038   ;;
1039   --extra-cxxflags=*)
1040   ;;
1041   --extra-ldflags=*)
1042   ;;
1043   --enable-debug-info)
1044   ;;
1045   --disable-debug-info)
1046   ;;
1047   --cross-cc-*)
1048   ;;
1049   --enable-modules)
1050       modules="yes"
1051   ;;
1052   --disable-modules)
1053       modules="no"
1054   ;;
1055   --disable-module-upgrades) module_upgrades="no"
1056   ;;
1057   --enable-module-upgrades) module_upgrades="yes"
1058   ;;
1059   --cpu=*)
1060   ;;
1061   --target-list=*) target_list="$optarg"
1062                    if test "$target_list_exclude"; then
1063                        error_exit "Can't mix --target-list with --target-list-exclude"
1064                    fi
1065   ;;
1066   --target-list-exclude=*) target_list_exclude="$optarg"
1067                    if test "$target_list"; then
1068                        error_exit "Can't mix --target-list-exclude with --target-list"
1069                    fi
1070   ;;
1071   --enable-trace-backends=*) trace_backends="$optarg"
1072   ;;
1073   # XXX: backwards compatibility
1074   --enable-trace-backend=*) trace_backends="$optarg"
1075   ;;
1076   --with-trace-file=*) trace_file="$optarg"
1077   ;;
1078   --with-default-devices) default_devices="yes"
1079   ;;
1080   --without-default-devices) default_devices="no"
1081   ;;
1082   --enable-gprof) gprof="yes"
1083   ;;
1084   --enable-gcov) gcov="yes"
1085   ;;
1086   --static)
1087     static="yes"
1088     QEMU_PKG_CONFIG_FLAGS="--static $QEMU_PKG_CONFIG_FLAGS"
1089   ;;
1090   --mandir=*) mandir="$optarg"
1091   ;;
1092   --bindir=*) bindir="$optarg"
1093   ;;
1094   --libdir=*) libdir="$optarg"
1095   ;;
1096   --libexecdir=*) libexecdir="$optarg"
1097   ;;
1098   --includedir=*) includedir="$optarg"
1099   ;;
1100   --datadir=*) datadir="$optarg"
1101   ;;
1102   --with-confsuffix=*) confsuffix="$optarg"
1103   ;;
1104   --docdir=*) qemu_docdir="$optarg"
1105   ;;
1106   --sysconfdir=*) sysconfdir="$optarg"
1107   ;;
1108   --localstatedir=*) local_statedir="$optarg"
1109   ;;
1110   --firmwarepath=*) firmwarepath="$optarg"
1111   ;;
1112   --efi-aarch64=*) efi_aarch64="$optarg"
1113   ;;
1114   --host=*|--build=*|\
1115   --disable-dependency-tracking|\
1116   --sbindir=*|--sharedstatedir=*|\
1117   --oldincludedir=*|--datarootdir=*|--infodir=*|--localedir=*|\
1118   --htmldir=*|--dvidir=*|--pdfdir=*|--psdir=*)
1119     # These switches are silently ignored, for compatibility with
1120     # autoconf-generated configure scripts. This allows QEMU's
1121     # configure to be used by RPM and similar macros that set
1122     # lots of directory switches by default.
1123   ;;
1124   --disable-sdl) sdl="no"
1125   ;;
1126   --enable-sdl) sdl="yes"
1127   ;;
1128   --disable-sdl-image) sdl_image="no"
1129   ;;
1130   --enable-sdl-image) sdl_image="yes"
1131   ;;
1132   --disable-qom-cast-debug) qom_cast_debug="no"
1133   ;;
1134   --enable-qom-cast-debug) qom_cast_debug="yes"
1135   ;;
1136   --disable-virtfs) virtfs="no"
1137   ;;
1138   --enable-virtfs) virtfs="yes"
1139   ;;
1140   --disable-mpath) mpath="no"
1141   ;;
1142   --enable-mpath) mpath="yes"
1143   ;;
1144   --disable-vnc) vnc="no"
1145   ;;
1146   --enable-vnc) vnc="yes"
1147   ;;
1148   --oss-lib=*) oss_lib="$optarg"
1149   ;;
1150   --audio-drv-list=*) audio_drv_list="$optarg"
1151   ;;
1152   --block-drv-rw-whitelist=*|--block-drv-whitelist=*) block_drv_rw_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
1153   ;;
1154   --block-drv-ro-whitelist=*) block_drv_ro_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
1155   ;;
1156   --enable-debug-tcg) debug_tcg="yes"
1157   ;;
1158   --disable-debug-tcg) debug_tcg="no"
1159   ;;
1160   --enable-debug)
1161       # Enable debugging options that aren't excessively noisy
1162       debug_tcg="yes"
1163       debug_mutex="yes"
1164       debug="yes"
1165       strip_opt="no"
1166       fortify_source="no"
1167   ;;
1168   --enable-sanitizers) sanitizers="yes"
1169   ;;
1170   --disable-sanitizers) sanitizers="no"
1171   ;;
1172   --enable-tsan) tsan="yes"
1173   ;;
1174   --disable-tsan) tsan="no"
1175   ;;
1176   --enable-sparse) sparse="yes"
1177   ;;
1178   --disable-sparse) sparse="no"
1179   ;;
1180   --disable-strip) strip_opt="no"
1181   ;;
1182   --disable-vnc-sasl) vnc_sasl="no"
1183   ;;
1184   --enable-vnc-sasl) vnc_sasl="yes"
1185   ;;
1186   --disable-vnc-jpeg) vnc_jpeg="no"
1187   ;;
1188   --enable-vnc-jpeg) vnc_jpeg="yes"
1189   ;;
1190   --disable-vnc-png) vnc_png="no"
1191   ;;
1192   --enable-vnc-png) vnc_png="yes"
1193   ;;
1194   --disable-slirp) slirp="no"
1195   ;;
1196   --enable-slirp=git) slirp="git"
1197   ;;
1198   --enable-slirp=system) slirp="system"
1199   ;;
1200   --disable-vde) vde="no"
1201   ;;
1202   --enable-vde) vde="yes"
1203   ;;
1204   --disable-netmap) netmap="no"
1205   ;;
1206   --enable-netmap) netmap="yes"
1207   ;;
1208   --disable-xen) xen="no"
1209   ;;
1210   --enable-xen) xen="yes"
1211   ;;
1212   --disable-xen-pci-passthrough) xen_pci_passthrough="no"
1213   ;;
1214   --enable-xen-pci-passthrough) xen_pci_passthrough="yes"
1215   ;;
1216   --disable-brlapi) brlapi="no"
1217   ;;
1218   --enable-brlapi) brlapi="yes"
1219   ;;
1220   --disable-kvm) kvm="no"
1221   ;;
1222   --enable-kvm) kvm="yes"
1223   ;;
1224   --disable-hax) hax="no"
1225   ;;
1226   --enable-hax) hax="yes"
1227   ;;
1228   --disable-hvf) hvf="no"
1229   ;;
1230   --enable-hvf) hvf="yes"
1231   ;;
1232   --disable-whpx) whpx="no"
1233   ;;
1234   --enable-whpx) whpx="yes"
1235   ;;
1236   --disable-tcg-interpreter) tcg_interpreter="no"
1237   ;;
1238   --enable-tcg-interpreter) tcg_interpreter="yes"
1239   ;;
1240   --disable-cap-ng)  cap_ng="no"
1241   ;;
1242   --enable-cap-ng) cap_ng="yes"
1243   ;;
1244   --disable-tcg) tcg="no"
1245   ;;
1246   --enable-tcg) tcg="yes"
1247   ;;
1248   --disable-malloc-trim) malloc_trim="no"
1249   ;;
1250   --enable-malloc-trim) malloc_trim="yes"
1251   ;;
1252   --disable-spice) spice="no"
1253   ;;
1254   --enable-spice) spice="yes"
1255   ;;
1256   --disable-libiscsi) libiscsi="no"
1257   ;;
1258   --enable-libiscsi) libiscsi="yes"
1259   ;;
1260   --disable-libnfs) libnfs="no"
1261   ;;
1262   --enable-libnfs) libnfs="yes"
1263   ;;
1264   --enable-profiler) profiler="yes"
1265   ;;
1266   --disable-cocoa) cocoa="no"
1267   ;;
1268   --enable-cocoa)
1269       cocoa="yes" ;
1270       audio_drv_list="coreaudio $(echo $audio_drv_list | sed s,coreaudio,,g)"
1271   ;;
1272   --disable-system) softmmu="no"
1273   ;;
1274   --enable-system) softmmu="yes"
1275   ;;
1276   --disable-user)
1277       linux_user="no" ;
1278       bsd_user="no" ;
1279   ;;
1280   --enable-user) ;;
1281   --disable-linux-user) linux_user="no"
1282   ;;
1283   --enable-linux-user) linux_user="yes"
1284   ;;
1285   --disable-bsd-user) bsd_user="no"
1286   ;;
1287   --enable-bsd-user) bsd_user="yes"
1288   ;;
1289   --enable-pie) pie="yes"
1290   ;;
1291   --disable-pie) pie="no"
1292   ;;
1293   --enable-werror) werror="yes"
1294   ;;
1295   --disable-werror) werror="no"
1296   ;;
1297   --enable-stack-protector) stack_protector="yes"
1298   ;;
1299   --disable-stack-protector) stack_protector="no"
1300   ;;
1301   --enable-safe-stack) safe_stack="yes"
1302   ;;
1303   --disable-safe-stack) safe_stack="no"
1304   ;;
1305   --disable-curses) curses="no"
1306   ;;
1307   --enable-curses) curses="yes"
1308   ;;
1309   --disable-iconv) iconv="no"
1310   ;;
1311   --enable-iconv) iconv="yes"
1312   ;;
1313   --disable-curl) curl="no"
1314   ;;
1315   --enable-curl) curl="yes"
1316   ;;
1317   --disable-fdt) fdt="no"
1318   ;;
1319   --enable-fdt) fdt="yes"
1320   ;;
1321   --disable-linux-aio) linux_aio="no"
1322   ;;
1323   --enable-linux-aio) linux_aio="yes"
1324   ;;
1325   --disable-linux-io-uring) linux_io_uring="no"
1326   ;;
1327   --enable-linux-io-uring) linux_io_uring="yes"
1328   ;;
1329   --disable-attr) attr="no"
1330   ;;
1331   --enable-attr) attr="yes"
1332   ;;
1333   --disable-membarrier) membarrier="no"
1334   ;;
1335   --enable-membarrier) membarrier="yes"
1336   ;;
1337   --disable-blobs) blobs="no"
1338   ;;
1339   --with-pkgversion=*) pkgversion="$optarg"
1340   ;;
1341   --with-coroutine=*) coroutine="$optarg"
1342   ;;
1343   --disable-coroutine-pool) coroutine_pool="no"
1344   ;;
1345   --enable-coroutine-pool) coroutine_pool="yes"
1346   ;;
1347   --enable-debug-stack-usage) debug_stack_usage="yes"
1348   ;;
1349   --enable-crypto-afalg) crypto_afalg="yes"
1350   ;;
1351   --disable-crypto-afalg) crypto_afalg="no"
1352   ;;
1353   --disable-docs) docs="no"
1354   ;;
1355   --enable-docs) docs="yes"
1356   ;;
1357   --disable-vhost-net) vhost_net="no"
1358   ;;
1359   --enable-vhost-net) vhost_net="yes"
1360   ;;
1361   --disable-vhost-crypto) vhost_crypto="no"
1362   ;;
1363   --enable-vhost-crypto) vhost_crypto="yes"
1364   ;;
1365   --disable-vhost-scsi) vhost_scsi="no"
1366   ;;
1367   --enable-vhost-scsi) vhost_scsi="yes"
1368   ;;
1369   --disable-vhost-vsock) vhost_vsock="no"
1370   ;;
1371   --enable-vhost-vsock) vhost_vsock="yes"
1372   ;;
1373   --disable-vhost-user-fs) vhost_user_fs="no"
1374   ;;
1375   --enable-vhost-user-fs) vhost_user_fs="yes"
1376   ;;
1377   --disable-opengl) opengl="no"
1378   ;;
1379   --enable-opengl) opengl="yes"
1380   ;;
1381   --disable-rbd) rbd="no"
1382   ;;
1383   --enable-rbd) rbd="yes"
1384   ;;
1385   --disable-xfsctl) xfs="no"
1386   ;;
1387   --enable-xfsctl) xfs="yes"
1388   ;;
1389   --disable-smartcard) smartcard="no"
1390   ;;
1391   --enable-smartcard) smartcard="yes"
1392   ;;
1393   --disable-libusb) libusb="no"
1394   ;;
1395   --enable-libusb) libusb="yes"
1396   ;;
1397   --disable-usb-redir) usb_redir="no"
1398   ;;
1399   --enable-usb-redir) usb_redir="yes"
1400   ;;
1401   --disable-zlib-test) zlib="no"
1402   ;;
1403   --disable-lzo) lzo="no"
1404   ;;
1405   --enable-lzo) lzo="yes"
1406   ;;
1407   --disable-snappy) snappy="no"
1408   ;;
1409   --enable-snappy) snappy="yes"
1410   ;;
1411   --disable-bzip2) bzip2="no"
1412   ;;
1413   --enable-bzip2) bzip2="yes"
1414   ;;
1415   --enable-lzfse) lzfse="yes"
1416   ;;
1417   --disable-lzfse) lzfse="no"
1418   ;;
1419   --disable-zstd) zstd="no"
1420   ;;
1421   --enable-zstd) zstd="yes"
1422   ;;
1423   --enable-guest-agent) guest_agent="yes"
1424   ;;
1425   --disable-guest-agent) guest_agent="no"
1426   ;;
1427   --enable-guest-agent-msi) guest_agent_msi="yes"
1428   ;;
1429   --disable-guest-agent-msi) guest_agent_msi="no"
1430   ;;
1431   --with-vss-sdk) vss_win32_sdk=""
1432   ;;
1433   --with-vss-sdk=*) vss_win32_sdk="$optarg"
1434   ;;
1435   --without-vss-sdk) vss_win32_sdk="no"
1436   ;;
1437   --with-win-sdk) win_sdk=""
1438   ;;
1439   --with-win-sdk=*) win_sdk="$optarg"
1440   ;;
1441   --without-win-sdk) win_sdk="no"
1442   ;;
1443   --enable-tools) want_tools="yes"
1444   ;;
1445   --disable-tools) want_tools="no"
1446   ;;
1447   --enable-seccomp) seccomp="yes"
1448   ;;
1449   --disable-seccomp) seccomp="no"
1450   ;;
1451   --disable-glusterfs) glusterfs="no"
1452   ;;
1453   --disable-avx2) avx2_opt="no"
1454   ;;
1455   --enable-avx2) avx2_opt="yes"
1456   ;;
1457   --disable-avx512f) avx512f_opt="no"
1458   ;;
1459   --enable-avx512f) avx512f_opt="yes"
1460   ;;
1461
1462   --enable-glusterfs) glusterfs="yes"
1463   ;;
1464   --disable-virtio-blk-data-plane|--enable-virtio-blk-data-plane)
1465       echo "$0: $opt is obsolete, virtio-blk data-plane is always on" >&2
1466   ;;
1467   --enable-vhdx|--disable-vhdx)
1468       echo "$0: $opt is obsolete, VHDX driver is always built" >&2
1469   ;;
1470   --enable-uuid|--disable-uuid)
1471       echo "$0: $opt is obsolete, UUID support is always built" >&2
1472   ;;
1473   --disable-gtk) gtk="no"
1474   ;;
1475   --enable-gtk) gtk="yes"
1476   ;;
1477   --tls-priority=*) tls_priority="$optarg"
1478   ;;
1479   --disable-gnutls) gnutls="no"
1480   ;;
1481   --enable-gnutls) gnutls="yes"
1482   ;;
1483   --disable-nettle) nettle="no"
1484   ;;
1485   --enable-nettle) nettle="yes"
1486   ;;
1487   --disable-gcrypt) gcrypt="no"
1488   ;;
1489   --enable-gcrypt) gcrypt="yes"
1490   ;;
1491   --disable-auth-pam) auth_pam="no"
1492   ;;
1493   --enable-auth-pam) auth_pam="yes"
1494   ;;
1495   --enable-rdma) rdma="yes"
1496   ;;
1497   --disable-rdma) rdma="no"
1498   ;;
1499   --enable-pvrdma) pvrdma="yes"
1500   ;;
1501   --disable-pvrdma) pvrdma="no"
1502   ;;
1503   --disable-vte) vte="no"
1504   ;;
1505   --enable-vte) vte="yes"
1506   ;;
1507   --disable-virglrenderer) virglrenderer="no"
1508   ;;
1509   --enable-virglrenderer) virglrenderer="yes"
1510   ;;
1511   --disable-tpm) tpm="no"
1512   ;;
1513   --enable-tpm) tpm="yes"
1514   ;;
1515   --disable-libssh) libssh="no"
1516   ;;
1517   --enable-libssh) libssh="yes"
1518   ;;
1519   --disable-live-block-migration) live_block_migration="no"
1520   ;;
1521   --enable-live-block-migration) live_block_migration="yes"
1522   ;;
1523   --disable-numa) numa="no"
1524   ;;
1525   --enable-numa) numa="yes"
1526   ;;
1527   --disable-libxml2) libxml2="no"
1528   ;;
1529   --enable-libxml2) libxml2="yes"
1530   ;;
1531   --disable-tcmalloc) tcmalloc="no"
1532   ;;
1533   --enable-tcmalloc) tcmalloc="yes"
1534   ;;
1535   --disable-jemalloc) jemalloc="no"
1536   ;;
1537   --enable-jemalloc) jemalloc="yes"
1538   ;;
1539   --disable-replication) replication="no"
1540   ;;
1541   --enable-replication) replication="yes"
1542   ;;
1543   --disable-bochs) bochs="no"
1544   ;;
1545   --enable-bochs) bochs="yes"
1546   ;;
1547   --disable-cloop) cloop="no"
1548   ;;
1549   --enable-cloop) cloop="yes"
1550   ;;
1551   --disable-dmg) dmg="no"
1552   ;;
1553   --enable-dmg) dmg="yes"
1554   ;;
1555   --disable-qcow1) qcow1="no"
1556   ;;
1557   --enable-qcow1) qcow1="yes"
1558   ;;
1559   --disable-vdi) vdi="no"
1560   ;;
1561   --enable-vdi) vdi="yes"
1562   ;;
1563   --disable-vvfat) vvfat="no"
1564   ;;
1565   --enable-vvfat) vvfat="yes"
1566   ;;
1567   --disable-qed) qed="no"
1568   ;;
1569   --enable-qed) qed="yes"
1570   ;;
1571   --disable-parallels) parallels="no"
1572   ;;
1573   --enable-parallels) parallels="yes"
1574   ;;
1575   --disable-sheepdog) sheepdog="no"
1576   ;;
1577   --enable-sheepdog) sheepdog="yes"
1578   ;;
1579   --disable-vhost-user) vhost_user="no"
1580   ;;
1581   --enable-vhost-user) vhost_user="yes"
1582   ;;
1583   --disable-vhost-vdpa) vhost_vdpa="no"
1584   ;;
1585   --enable-vhost-vdpa) vhost_vdpa="yes"
1586   ;;
1587   --disable-vhost-kernel) vhost_kernel="no"
1588   ;;
1589   --enable-vhost-kernel) vhost_kernel="yes"
1590   ;;
1591   --disable-capstone) capstone="no"
1592   ;;
1593   --enable-capstone) capstone="yes"
1594   ;;
1595   --enable-capstone=git) capstone="git"
1596   ;;
1597   --enable-capstone=system) capstone="system"
1598   ;;
1599   --with-git=*) git="$optarg"
1600   ;;
1601   --enable-git-update) git_update=yes
1602   ;;
1603   --disable-git-update) git_update=no
1604   ;;
1605   --enable-debug-mutex) debug_mutex=yes
1606   ;;
1607   --disable-debug-mutex) debug_mutex=no
1608   ;;
1609   --enable-libpmem) libpmem=yes
1610   ;;
1611   --disable-libpmem) libpmem=no
1612   ;;
1613   --enable-xkbcommon) xkbcommon=yes
1614   ;;
1615   --disable-xkbcommon) xkbcommon=no
1616   ;;
1617   --enable-plugins) plugins="yes"
1618   ;;
1619   --disable-plugins) plugins="no"
1620   ;;
1621   --enable-containers) use_containers="yes"
1622   ;;
1623   --disable-containers) use_containers="no"
1624   ;;
1625   --enable-fuzzing) fuzzing=yes
1626   ;;
1627   --disable-fuzzing) fuzzing=no
1628   ;;
1629   --gdb=*) gdb_bin="$optarg"
1630   ;;
1631   --enable-rng-none) rng_none=yes
1632   ;;
1633   --disable-rng-none) rng_none=no
1634   ;;
1635   --enable-keyring) secret_keyring="yes"
1636   ;;
1637   --disable-keyring) secret_keyring="no"
1638   ;;
1639   --enable-libdaxctl) libdaxctl=yes
1640   ;;
1641   --disable-libdaxctl) libdaxctl=no
1642   ;;
1643   *)
1644       echo "ERROR: unknown option $opt"
1645       echo "Try '$0 --help' for more information"
1646       exit 1
1647   ;;
1648   esac
1649 done
1650
1651 case "$cpu" in
1652     ppc)
1653            CPU_CFLAGS="-m32"
1654            QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS"
1655            ;;
1656     ppc64)
1657            CPU_CFLAGS="-m64"
1658            QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1659            ;;
1660     sparc)
1661            CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc"
1662            QEMU_LDFLAGS="-m32 -mv8plus $QEMU_LDFLAGS"
1663            ;;
1664     sparc64)
1665            CPU_CFLAGS="-m64 -mcpu=ultrasparc"
1666            QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1667            ;;
1668     s390)
1669            CPU_CFLAGS="-m31"
1670            QEMU_LDFLAGS="-m31 $QEMU_LDFLAGS"
1671            ;;
1672     s390x)
1673            CPU_CFLAGS="-m64"
1674            QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1675            ;;
1676     i386)
1677            CPU_CFLAGS="-m32"
1678            QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS"
1679            ;;
1680     x86_64)
1681            # ??? Only extremely old AMD cpus do not have cmpxchg16b.
1682            # If we truly care, we should simply detect this case at
1683            # runtime and generate the fallback to serial emulation.
1684            CPU_CFLAGS="-m64 -mcx16"
1685            QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1686            ;;
1687     x32)
1688            CPU_CFLAGS="-mx32"
1689            QEMU_LDFLAGS="-mx32 $QEMU_LDFLAGS"
1690            ;;
1691     # No special flags required for other host CPUs
1692 esac
1693
1694 eval "cross_cc_${cpu}=\$host_cc"
1695 cross_cc_vars="$cross_cc_vars cross_cc_${cpu}"
1696 QEMU_CFLAGS="$CPU_CFLAGS $QEMU_CFLAGS"
1697
1698 # For user-mode emulation the host arch has to be one we explicitly
1699 # support, even if we're using TCI.
1700 if [ "$ARCH" = "unknown" ]; then
1701   bsd_user="no"
1702   linux_user="no"
1703 fi
1704
1705 if [ "$bsd_user" = "no" -a "$linux_user" = "no" -a "$softmmu" = "no" ] ; then
1706   tcg="no"
1707 fi
1708
1709 default_target_list=""
1710
1711 mak_wilds=""
1712
1713 if [ "$softmmu" = "yes" ]; then
1714     mak_wilds="${mak_wilds} $source_path/default-configs/*-softmmu.mak"
1715 fi
1716 if [ "$linux_user" = "yes" ]; then
1717     mak_wilds="${mak_wilds} $source_path/default-configs/*-linux-user.mak"
1718 fi
1719 if [ "$bsd_user" = "yes" ]; then
1720     mak_wilds="${mak_wilds} $source_path/default-configs/*-bsd-user.mak"
1721 fi
1722
1723 if test -z "$target_list_exclude"; then
1724     for config in $mak_wilds; do
1725         default_target_list="${default_target_list} $(basename "$config" .mak)"
1726     done
1727 else
1728     exclude_list=$(echo "$target_list_exclude" | sed -e 's/,/ /g')
1729     for config in $mak_wilds; do
1730         target="$(basename "$config" .mak)"
1731         exclude="no"
1732         for excl in $exclude_list; do
1733             if test "$excl" = "$target"; then
1734                 exclude="yes"
1735                 break;
1736             fi
1737         done
1738         if test "$exclude" = "no"; then
1739             default_target_list="${default_target_list} $target"
1740         fi
1741     done
1742 fi
1743
1744 # Enumerate public trace backends for --help output
1745 trace_backend_list=$(echo $(grep -le '^PUBLIC = True$' "$source_path"/scripts/tracetool/backend/*.py | sed -e 's/^.*\/\(.*\)\.py$/\1/'))
1746
1747 if test x"$show_help" = x"yes" ; then
1748 cat << EOF
1749
1750 Usage: configure [options]
1751 Options: [defaults in brackets after descriptions]
1752
1753 Standard options:
1754   --help                   print this message
1755   --prefix=PREFIX          install in PREFIX [$prefix]
1756   --interp-prefix=PREFIX   where to find shared libraries, etc.
1757                            use %M for cpu name [$interp_prefix]
1758   --target-list=LIST       set target list (default: build everything)
1759 $(echo Available targets: $default_target_list | \
1760   fold -s -w 53 | sed -e 's/^/                           /')
1761   --target-list-exclude=LIST exclude a set of targets from the default target-list
1762
1763 Advanced options (experts only):
1764   --cross-prefix=PREFIX    use PREFIX for compile tools [$cross_prefix]
1765   --cc=CC                  use C compiler CC [$cc]
1766   --iasl=IASL              use ACPI compiler IASL [$iasl]
1767   --host-cc=CC             use C compiler CC [$host_cc] for code run at
1768                            build time
1769   --cxx=CXX                use C++ compiler CXX [$cxx]
1770   --objcc=OBJCC            use Objective-C compiler OBJCC [$objcc]
1771   --extra-cflags=CFLAGS    append extra C compiler flags QEMU_CFLAGS
1772   --extra-cxxflags=CXXFLAGS append extra C++ compiler flags QEMU_CXXFLAGS
1773   --extra-ldflags=LDFLAGS  append extra linker flags LDFLAGS
1774   --cross-cc-ARCH=CC       use compiler when building ARCH guest test cases
1775   --cross-cc-flags-ARCH=   use compiler flags when building ARCH guest tests
1776   --make=MAKE              use specified make [$make]
1777   --install=INSTALL        use specified install [$install]
1778   --python=PYTHON          use specified python [$python]
1779   --sphinx-build=SPHINX    use specified sphinx-build [$sphinx_build]
1780   --smbd=SMBD              use specified smbd [$smbd]
1781   --with-git=GIT           use specified git [$git]
1782   --static                 enable static build [$static]
1783   --mandir=PATH            install man pages in PATH
1784   --datadir=PATH           install firmware in PATH$confsuffix
1785   --docdir=PATH            install documentation in PATH$confsuffix
1786   --bindir=PATH            install binaries in PATH
1787   --libdir=PATH            install libraries in PATH
1788   --libexecdir=PATH        install helper binaries in PATH
1789   --sysconfdir=PATH        install config in PATH$confsuffix
1790   --localstatedir=PATH     install local state in PATH (set at runtime on win32)
1791   --firmwarepath=PATH      search PATH for firmware files
1792   --efi-aarch64=PATH       PATH of efi file to use for aarch64 VMs.
1793   --with-confsuffix=SUFFIX suffix for QEMU data inside datadir/libdir/sysconfdir [$confsuffix]
1794   --with-pkgversion=VERS   use specified string as sub-version of the package
1795   --enable-debug           enable common debug build options
1796   --enable-sanitizers      enable default sanitizers
1797   --enable-tsan            enable thread sanitizer
1798   --disable-strip          disable stripping binaries
1799   --disable-werror         disable compilation abort on warning
1800   --disable-stack-protector disable compiler-provided stack protection
1801   --audio-drv-list=LIST    set audio drivers list:
1802                            Available drivers: $audio_possible_drivers
1803   --block-drv-whitelist=L  Same as --block-drv-rw-whitelist=L
1804   --block-drv-rw-whitelist=L
1805                            set block driver read-write whitelist
1806                            (affects only QEMU, not qemu-img)
1807   --block-drv-ro-whitelist=L
1808                            set block driver read-only whitelist
1809                            (affects only QEMU, not qemu-img)
1810   --enable-trace-backends=B Set trace backend
1811                            Available backends: $trace_backend_list
1812   --with-trace-file=NAME   Full PATH,NAME of file to store traces
1813                            Default:trace-<pid>
1814   --disable-slirp          disable SLIRP userspace network connectivity
1815   --enable-tcg-interpreter enable TCG with bytecode interpreter (TCI)
1816   --enable-malloc-trim     enable libc malloc_trim() for memory optimization
1817   --oss-lib                path to OSS library
1818   --cpu=CPU                Build for host CPU [$cpu]
1819   --with-coroutine=BACKEND coroutine backend. Supported options:
1820                            ucontext, sigaltstack, windows
1821   --enable-gcov            enable test coverage analysis with gcov
1822   --gcov=GCOV              use specified gcov [$gcov_tool]
1823   --disable-blobs          disable installing provided firmware blobs
1824   --with-vss-sdk=SDK-path  enable Windows VSS support in QEMU Guest Agent
1825   --with-win-sdk=SDK-path  path to Windows Platform SDK (to build VSS .tlb)
1826   --tls-priority           default TLS protocol/cipher priority string
1827   --enable-gprof           QEMU profiling with gprof
1828   --enable-profiler        profiler support
1829   --enable-debug-stack-usage
1830                            track the maximum stack usage of stacks created by qemu_alloc_stack
1831   --enable-plugins
1832                            enable plugins via shared library loading
1833   --disable-containers     don't use containers for cross-building
1834   --gdb=GDB-path           gdb to use for gdbstub tests [$gdb_bin]
1835
1836 Optional features, enabled with --enable-FEATURE and
1837 disabled with --disable-FEATURE, default is enabled if available:
1838
1839   system          all system emulation targets
1840   user            supported user emulation targets
1841   linux-user      all linux usermode emulation targets
1842   bsd-user        all BSD usermode emulation targets
1843   docs            build documentation
1844   guest-agent     build the QEMU Guest Agent
1845   guest-agent-msi build guest agent Windows MSI installation package
1846   pie             Position Independent Executables
1847   modules         modules support (non-Windows)
1848   module-upgrades try to load modules from alternate paths for upgrades
1849   debug-tcg       TCG debugging (default is disabled)
1850   debug-info      debugging information
1851   sparse          sparse checker
1852   safe-stack      SafeStack Stack Smash Protection. Depends on
1853                   clang/llvm >= 3.7 and requires coroutine backend ucontext.
1854
1855   gnutls          GNUTLS cryptography support
1856   nettle          nettle cryptography support
1857   gcrypt          libgcrypt cryptography support
1858   auth-pam        PAM access control
1859   sdl             SDL UI
1860   sdl-image       SDL Image support for icons
1861   gtk             gtk UI
1862   vte             vte support for the gtk UI
1863   curses          curses UI
1864   iconv           font glyph conversion support
1865   vnc             VNC UI support
1866   vnc-sasl        SASL encryption for VNC server
1867   vnc-jpeg        JPEG lossy compression for VNC server
1868   vnc-png         PNG compression for VNC server
1869   cocoa           Cocoa UI (Mac OS X only)
1870   virtfs          VirtFS
1871   mpath           Multipath persistent reservation passthrough
1872   xen             xen backend driver support
1873   xen-pci-passthrough    PCI passthrough support for Xen
1874   brlapi          BrlAPI (Braile)
1875   curl            curl connectivity
1876   membarrier      membarrier system call (for Linux 4.14+ or Windows)
1877   fdt             fdt device tree
1878   kvm             KVM acceleration support
1879   hax             HAX acceleration support
1880   hvf             Hypervisor.framework acceleration support
1881   whpx            Windows Hypervisor Platform acceleration support
1882   rdma            Enable RDMA-based migration
1883   pvrdma          Enable PVRDMA support
1884   vde             support for vde network
1885   netmap          support for netmap network
1886   linux-aio       Linux AIO support
1887   linux-io-uring  Linux io_uring support
1888   cap-ng          libcap-ng support
1889   attr            attr and xattr support
1890   vhost-net       vhost-net kernel acceleration support
1891   vhost-vsock     virtio sockets device support
1892   vhost-scsi      vhost-scsi kernel target support
1893   vhost-crypto    vhost-user-crypto backend support
1894   vhost-kernel    vhost kernel backend support
1895   vhost-user      vhost-user backend support
1896   vhost-vdpa      vhost-vdpa kernel backend support
1897   spice           spice
1898   rbd             rados block device (rbd)
1899   libiscsi        iscsi support
1900   libnfs          nfs support
1901   smartcard       smartcard support (libcacard)
1902   libusb          libusb (for usb passthrough)
1903   live-block-migration   Block migration in the main migration stream
1904   usb-redir       usb network redirection support
1905   lzo             support of lzo compression library
1906   snappy          support of snappy compression library
1907   bzip2           support of bzip2 compression library
1908                   (for reading bzip2-compressed dmg images)
1909   lzfse           support of lzfse compression library
1910                   (for reading lzfse-compressed dmg images)
1911   zstd            support for zstd compression library
1912                   (for migration compression and qcow2 cluster compression)
1913   seccomp         seccomp support
1914   coroutine-pool  coroutine freelist (better performance)
1915   glusterfs       GlusterFS backend
1916   tpm             TPM support
1917   libssh          ssh block device support
1918   numa            libnuma support
1919   libxml2         for Parallels image format
1920   tcmalloc        tcmalloc support
1921   jemalloc        jemalloc support
1922   avx2            AVX2 optimization support
1923   avx512f         AVX512F optimization support
1924   replication     replication support
1925   opengl          opengl support
1926   virglrenderer   virgl rendering support
1927   xfsctl          xfsctl support
1928   qom-cast-debug  cast debugging support
1929   tools           build qemu-io, qemu-nbd and qemu-img tools
1930   bochs           bochs image format support
1931   cloop           cloop image format support
1932   dmg             dmg image format support
1933   qcow1           qcow v1 image format support
1934   vdi             vdi image format support
1935   vvfat           vvfat image format support
1936   qed             qed image format support
1937   parallels       parallels image format support
1938   sheepdog        sheepdog block driver support
1939   crypto-afalg    Linux AF_ALG crypto backend driver
1940   capstone        capstone disassembler support
1941   debug-mutex     mutex debugging support
1942   libpmem         libpmem support
1943   xkbcommon       xkbcommon support
1944   rng-none        dummy RNG, avoid using /dev/(u)random and getrandom()
1945   libdaxctl       libdaxctl support
1946
1947 NOTE: The object files are built at the place where configure is launched
1948 EOF
1949 exit 0
1950 fi
1951
1952 # Remove old dependency files to make sure that they get properly regenerated
1953 rm -f */config-devices.mak.d
1954
1955 # Remove syscall_nr.h to be sure they will be regenerated in the build
1956 # directory, not in the source directory
1957 for arch in alpha hppa m68k xtensa sh4 microblaze arm ppc s390x sparc sparc64 \
1958     i386 x86_64 mips mips64 ; do
1959     # remove the file if it has been generated in the source directory
1960     rm -f "${source_path}/linux-user/${arch}/syscall_nr.h"
1961     # remove the dependency files
1962     for target in ${arch}*-linux-user ; do
1963         test -d "${target}" && find "${target}" -type f -name "*.d" \
1964              -exec grep -q "${source_path}/linux-user/${arch}/syscall_nr.h" {} \; \
1965              -print | while read file ; do rm "${file}" "${file%.d}.o" ; done
1966     done
1967 done
1968
1969 if test -z "$python"
1970 then
1971     error_exit "Python not found. Use --python=/path/to/python"
1972 fi
1973
1974 # Note that if the Python conditional here evaluates True we will exit
1975 # with status 1 which is a shell 'false' value.
1976 if ! $python -c 'import sys; sys.exit(sys.version_info < (3,5))'; then
1977   error_exit "Cannot use '$python', Python >= 3.5 is required." \
1978       "Use --python=/path/to/python to specify a supported Python."
1979 fi
1980
1981 # Preserve python version since some functionality is dependent on it
1982 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)
1983
1984 # Suppress writing compiled files
1985 python="$python -B"
1986
1987 # Check that the C compiler works. Doing this here before testing
1988 # the host CPU ensures that we had a valid CC to autodetect the
1989 # $cpu var (and we should bail right here if that's not the case).
1990 # It also allows the help message to be printed without a CC.
1991 write_c_skeleton;
1992 if compile_object ; then
1993   : C compiler works ok
1994 else
1995     error_exit "\"$cc\" either does not exist or does not work"
1996 fi
1997 if ! compile_prog ; then
1998     error_exit "\"$cc\" cannot build an executable (is your linker broken?)"
1999 fi
2000
2001 # Now we have handled --enable-tcg-interpreter and know we're not just
2002 # printing the help message, bail out if the host CPU isn't supported.
2003 if test "$ARCH" = "unknown"; then
2004     if test "$tcg_interpreter" = "yes" ; then
2005         echo "Unsupported CPU = $cpu, will use TCG with TCI (experimental)"
2006     else
2007         error_exit "Unsupported CPU = $cpu, try --enable-tcg-interpreter"
2008     fi
2009 fi
2010
2011 # Consult white-list to determine whether to enable werror
2012 # by default.  Only enable by default for git builds
2013 if test -z "$werror" ; then
2014     if test -e "$source_path/.git" && \
2015         { test "$linux" = "yes" || test "$mingw32" = "yes"; }; then
2016         werror="yes"
2017     else
2018         werror="no"
2019     fi
2020 fi
2021
2022 if test "$bogus_os" = "yes"; then
2023     # Now that we know that we're not printing the help and that
2024     # the compiler works (so the results of the check_defines we used
2025     # to identify the OS are reliable), if we didn't recognize the
2026     # host OS we should stop now.
2027     error_exit "Unrecognized host OS (uname -s reports '$(uname -s)')"
2028 fi
2029
2030 # Check whether the compiler matches our minimum requirements:
2031 cat > $TMPC << EOF
2032 #if defined(__clang_major__) && defined(__clang_minor__)
2033 # ifdef __apple_build_version__
2034 #  if __clang_major__ < 5 || (__clang_major__ == 5 && __clang_minor__ < 1)
2035 #   error You need at least XCode Clang v5.1 to compile QEMU
2036 #  endif
2037 # else
2038 #  if __clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ < 4)
2039 #   error You need at least Clang v3.4 to compile QEMU
2040 #  endif
2041 # endif
2042 #elif defined(__GNUC__) && defined(__GNUC_MINOR__)
2043 # if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8)
2044 #  error You need at least GCC v4.8 to compile QEMU
2045 # endif
2046 #else
2047 # error You either need GCC or Clang to compiler QEMU
2048 #endif
2049 int main (void) { return 0; }
2050 EOF
2051 if ! compile_prog "" "" ; then
2052     error_exit "You need at least GCC v4.8 or Clang v3.4 (or XCode Clang v5.1)"
2053 fi
2054
2055 # Accumulate -Wfoo and -Wno-bar separately.
2056 # We will list all of the enable flags first, and the disable flags second.
2057 # Note that we do not add -Werror, because that would enable it for all
2058 # configure tests. If a configure test failed due to -Werror this would
2059 # just silently disable some features, so it's too error prone.
2060
2061 warn_flags=
2062 add_to warn_flags -Wold-style-declaration
2063 add_to warn_flags -Wold-style-definition
2064 add_to warn_flags -Wtype-limits
2065 add_to warn_flags -Wformat-security
2066 add_to warn_flags -Wformat-y2k
2067 add_to warn_flags -Winit-self
2068 add_to warn_flags -Wignored-qualifiers
2069 add_to warn_flags -Wempty-body
2070 add_to warn_flags -Wnested-externs
2071 add_to warn_flags -Wendif-labels
2072 add_to warn_flags -Wexpansion-to-defined
2073
2074 nowarn_flags=
2075 add_to nowarn_flags -Wno-initializer-overrides
2076 add_to nowarn_flags -Wno-missing-include-dirs
2077 add_to nowarn_flags -Wno-shift-negative-value
2078 add_to nowarn_flags -Wno-string-plus-int
2079 add_to nowarn_flags -Wno-typedef-redefinition
2080 add_to nowarn_flags -Wno-tautological-type-limit-compare
2081 add_to nowarn_flags -Wno-psabi
2082
2083 gcc_flags="$warn_flags $nowarn_flags"
2084
2085 cc_has_warning_flag() {
2086     write_c_skeleton;
2087
2088     # Use the positive sense of the flag when testing for -Wno-wombat
2089     # support (gcc will happily accept the -Wno- form of unknown
2090     # warning options).
2091     optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
2092     compile_prog "-Werror $optflag" ""
2093 }
2094
2095 for flag in $gcc_flags; do
2096     if cc_has_warning_flag $flag ; then
2097         QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2098     fi
2099 done
2100
2101 if test "$stack_protector" != "no"; then
2102   cat > $TMPC << EOF
2103 int main(int argc, char *argv[])
2104 {
2105     char arr[64], *p = arr, *c = argv[0];
2106     while (*c) {
2107         *p++ = *c++;
2108     }
2109     return 0;
2110 }
2111 EOF
2112   gcc_flags="-fstack-protector-strong -fstack-protector-all"
2113   sp_on=0
2114   for flag in $gcc_flags; do
2115     # We need to check both a compile and a link, since some compiler
2116     # setups fail only on a .c->.o compile and some only at link time
2117     if do_cc $QEMU_CFLAGS -Werror $flag -c -o $TMPO $TMPC &&
2118        compile_prog "-Werror $flag" ""; then
2119       QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2120       QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
2121       sp_on=1
2122       break
2123     fi
2124   done
2125   if test "$stack_protector" = yes; then
2126     if test $sp_on = 0; then
2127       error_exit "Stack protector not supported"
2128     fi
2129   fi
2130 fi
2131
2132 # Disable -Wmissing-braces on older compilers that warn even for
2133 # the "universal" C zero initializer {0}.
2134 cat > $TMPC << EOF
2135 struct {
2136   int a[2];
2137 } x = {0};
2138 EOF
2139 if compile_object "-Werror" "" ; then
2140   :
2141 else
2142   QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces"
2143 fi
2144
2145 # Our module code doesn't support Windows
2146 if test "$modules" = "yes" && test "$mingw32" = "yes" ; then
2147   error_exit "Modules are not available for Windows"
2148 fi
2149
2150 # module_upgrades is only reasonable if modules are enabled
2151 if test "$modules" = "no" && test "$module_upgrades" = "yes" ; then
2152   error_exit "Can't enable module-upgrades as Modules are not enabled"
2153 fi
2154
2155 # Static linking is not possible with modules or PIE
2156 if test "$static" = "yes" ; then
2157   if test "$modules" = "yes" ; then
2158     error_exit "static and modules are mutually incompatible"
2159   fi
2160 fi
2161
2162 # Unconditional check for compiler __thread support
2163   cat > $TMPC << EOF
2164 static __thread int tls_var;
2165 int main(void) { return tls_var; }
2166 EOF
2167
2168 if ! compile_prog "-Werror" "" ; then
2169     error_exit "Your compiler does not support the __thread specifier for " \
2170         "Thread-Local Storage (TLS). Please upgrade to a version that does."
2171 fi
2172
2173 cat > $TMPC << EOF
2174
2175 #ifdef __linux__
2176 #  define THREAD __thread
2177 #else
2178 #  define THREAD
2179 #endif
2180 static THREAD int tls_var;
2181 int main(void) { return tls_var; }
2182 EOF
2183
2184 # Check we support --no-pie first; we will need this for building ROMs.
2185 if compile_prog "-Werror -fno-pie" "-no-pie"; then
2186   CFLAGS_NOPIE="-fno-pie"
2187   LDFLAGS_NOPIE="-no-pie"
2188 fi
2189
2190 if test "$static" = "yes"; then
2191   if test "$pie" != "no" && compile_prog "-Werror -fPIE -DPIE" "-static-pie"; then
2192     QEMU_CFLAGS="-fPIE -DPIE $QEMU_CFLAGS"
2193     QEMU_LDFLAGS="-static-pie $QEMU_LDFLAGS"
2194     pie="yes"
2195   elif test "$pie" = "yes"; then
2196     error_exit "-static-pie not available due to missing toolchain support"
2197   else
2198     QEMU_LDFLAGS="-static $QEMU_LDFLAGS"
2199     pie="no"
2200   fi
2201 elif test "$pie" = "no"; then
2202   QEMU_CFLAGS="$CFLAGS_NOPIE $QEMU_CFLAGS"
2203   QEMU_LDFLAGS="$LDFLAGS_NOPIE $QEMU_LDFLAGS"
2204 elif compile_prog "-Werror -fPIE -DPIE" "-pie"; then
2205   QEMU_CFLAGS="-fPIE -DPIE $QEMU_CFLAGS"
2206   QEMU_LDFLAGS="-pie $QEMU_LDFLAGS"
2207   pie="yes"
2208 elif test "$pie" = "yes"; then
2209   error_exit "PIE not available due to missing toolchain support"
2210 else
2211   echo "Disabling PIE due to missing toolchain support"
2212   pie="no"
2213 fi
2214
2215 # Detect support for PT_GNU_RELRO + DT_BIND_NOW.
2216 # The combination is known as "full relro", because .got.plt is read-only too.
2217 if compile_prog "" "-Wl,-z,relro -Wl,-z,now" ; then
2218   QEMU_LDFLAGS="-Wl,-z,relro -Wl,-z,now $QEMU_LDFLAGS"
2219 fi
2220
2221 ##########################################
2222 # __sync_fetch_and_and requires at least -march=i486. Many toolchains
2223 # use i686 as default anyway, but for those that don't, an explicit
2224 # specification is necessary
2225
2226 if test "$cpu" = "i386"; then
2227   cat > $TMPC << EOF
2228 static int sfaa(int *ptr)
2229 {
2230   return __sync_fetch_and_and(ptr, 0);
2231 }
2232
2233 int main(void)
2234 {
2235   int val = 42;
2236   val = __sync_val_compare_and_swap(&val, 0, 1);
2237   sfaa(&val);
2238   return val;
2239 }
2240 EOF
2241   if ! compile_prog "" "" ; then
2242     QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS"
2243   fi
2244 fi
2245
2246 #########################################
2247 # Solaris specific configure tool chain decisions
2248
2249 if test "$solaris" = "yes" ; then
2250   if has $install; then
2251     :
2252   else
2253     error_exit "Solaris install program not found. Use --install=/usr/ucb/install or" \
2254         "install fileutils from www.blastwave.org using pkg-get -i fileutils" \
2255         "to get ginstall which is used by default (which lives in /opt/csw/bin)"
2256   fi
2257   if test "$(path_of $install)" = "/usr/sbin/install" ; then
2258     error_exit "Solaris /usr/sbin/install is not an appropriate install program." \
2259         "try ginstall from the GNU fileutils available from www.blastwave.org" \
2260         "using pkg-get -i fileutils, or use --install=/usr/ucb/install"
2261   fi
2262   if has ar; then
2263     :
2264   else
2265     if test -f /usr/ccs/bin/ar ; then
2266       error_exit "No path includes ar" \
2267           "Add /usr/ccs/bin to your path and rerun configure"
2268     fi
2269     error_exit "No path includes ar"
2270   fi
2271 fi
2272
2273 if test -z "${target_list+xxx}" ; then
2274     for target in $default_target_list; do
2275         supported_target $target 2>/dev/null && \
2276             target_list="$target_list $target"
2277     done
2278     target_list="${target_list# }"
2279 else
2280     target_list=$(echo "$target_list" | sed -e 's/,/ /g')
2281     for target in $target_list; do
2282         # Check that we recognised the target name; this allows a more
2283         # friendly error message than if we let it fall through.
2284         case " $default_target_list " in
2285             *" $target "*)
2286                 ;;
2287             *)
2288                 error_exit "Unknown target name '$target'"
2289                 ;;
2290         esac
2291         supported_target $target || exit 1
2292     done
2293 fi
2294
2295 # see if system emulation was really requested
2296 case " $target_list " in
2297   *"-softmmu "*) softmmu=yes
2298   ;;
2299   *) softmmu=no
2300   ;;
2301 esac
2302
2303 for target in $target_list; do
2304   case "$target" in
2305     arm-softmmu | aarch64-softmmu | i386-softmmu | x86_64-softmmu)
2306       edk2_blobs="yes"
2307       ;;
2308   esac
2309 done
2310 # The EDK2 binaries are compressed with bzip2
2311 if test "$edk2_blobs" = "yes" && ! has bzip2; then
2312   error_exit "The bzip2 program is required for building QEMU"
2313 fi
2314
2315 feature_not_found() {
2316   feature=$1
2317   remedy=$2
2318
2319   error_exit "User requested feature $feature" \
2320       "configure was not able to find it." \
2321       "$remedy"
2322 }
2323
2324 # ---
2325 # big/little endian test
2326 cat > $TMPC << EOF
2327 short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, };
2328 short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, };
2329 extern int foo(short *, short *);
2330 int main(int argc, char *argv[]) {
2331     return foo(big_endian, little_endian);
2332 }
2333 EOF
2334
2335 if compile_object ; then
2336     if strings -a $TMPO | grep -q BiGeNdIaN ; then
2337         bigendian="yes"
2338     elif strings -a $TMPO | grep -q LiTtLeEnDiAn ; then
2339         bigendian="no"
2340     else
2341         echo big/little test failed
2342     fi
2343 else
2344     echo big/little test failed
2345 fi
2346
2347 ##########################################
2348 # system tools
2349 if test -z "$want_tools"; then
2350     if test "$softmmu" = "no"; then
2351         want_tools=no
2352     else
2353         want_tools=yes
2354     fi
2355 fi
2356
2357 ##########################################
2358 # cocoa implies not SDL or GTK
2359 # (the cocoa UI code currently assumes it is always the active UI
2360 # and doesn't interact well with other UI frontend code)
2361 if test "$cocoa" = "yes"; then
2362     if test "$sdl" = "yes"; then
2363         error_exit "Cocoa and SDL UIs cannot both be enabled at once"
2364     fi
2365     if test "$gtk" = "yes"; then
2366         error_exit "Cocoa and GTK UIs cannot both be enabled at once"
2367     fi
2368     gtk=no
2369     sdl=no
2370 fi
2371
2372 # Some versions of Mac OS X incorrectly define SIZE_MAX
2373 cat > $TMPC << EOF
2374 #include <stdint.h>
2375 #include <stdio.h>
2376 int main(int argc, char *argv[]) {
2377     return printf("%zu", SIZE_MAX);
2378 }
2379 EOF
2380 have_broken_size_max=no
2381 if ! compile_object -Werror ; then
2382     have_broken_size_max=yes
2383 fi
2384
2385 ##########################################
2386 # L2TPV3 probe
2387
2388 cat > $TMPC <<EOF
2389 #include <sys/socket.h>
2390 #include <linux/ip.h>
2391 int main(void) { return sizeof(struct mmsghdr); }
2392 EOF
2393 if compile_prog "" "" ; then
2394   l2tpv3=yes
2395 else
2396   l2tpv3=no
2397 fi
2398
2399 if check_include "pty.h" ; then
2400   pty_h=yes
2401 else
2402   pty_h=no
2403 fi
2404
2405 cat > $TMPC <<EOF
2406 #include <sys/mman.h>
2407 int main(int argc, char *argv[]) {
2408     return mlockall(MCL_FUTURE);
2409 }
2410 EOF
2411 if compile_prog "" "" ; then
2412   have_mlockall=yes
2413 else
2414   have_mlockall=no
2415 fi
2416
2417 #########################################
2418 # vhost interdependencies and host support
2419
2420 # vhost backends
2421 test "$vhost_user" = "" && vhost_user=yes
2422 if test "$vhost_user" = "yes" && test "$mingw32" = "yes"; then
2423   error_exit "vhost-user isn't available on win32"
2424 fi
2425 test "$vhost_vdpa" = "" && vhost_vdpa=$linux
2426 if test "$vhost_vdpa" = "yes" && test "$linux" != "yes"; then
2427   error_exit "vhost-vdpa is only available on Linux"
2428 fi
2429 test "$vhost_kernel" = "" && vhost_kernel=$linux
2430 if test "$vhost_kernel" = "yes" && test "$linux" != "yes"; then
2431   error_exit "vhost-kernel is only available on Linux"
2432 fi
2433
2434 # vhost-kernel devices
2435 test "$vhost_scsi" = "" && vhost_scsi=$vhost_kernel
2436 if test "$vhost_scsi" = "yes" && test "$vhost_kernel" != "yes"; then
2437   error_exit "--enable-vhost-scsi requires --enable-vhost-kernel"
2438 fi
2439 test "$vhost_vsock" = "" && vhost_vsock=$vhost_kernel
2440 if test "$vhost_vsock" = "yes" && test "$vhost_kernel" != "yes"; then
2441   error_exit "--enable-vhost-vsock requires --enable-vhost-kernel"
2442 fi
2443
2444 # vhost-user backends
2445 test "$vhost_net_user" = "" && vhost_net_user=$vhost_user
2446 if test "$vhost_net_user" = "yes" && test "$vhost_user" = "no"; then
2447   error_exit "--enable-vhost-net-user requires --enable-vhost-user"
2448 fi
2449 test "$vhost_crypto" = "" && vhost_crypto=$vhost_user
2450 if test "$vhost_crypto" = "yes" && test "$vhost_user" = "no"; then
2451   error_exit "--enable-vhost-crypto requires --enable-vhost-user"
2452 fi
2453 test "$vhost_user_fs" = "" && vhost_user_fs=$vhost_user
2454 if test "$vhost_user_fs" = "yes" && test "$vhost_user" = "no"; then
2455   error_exit "--enable-vhost-user-fs requires --enable-vhost-user"
2456 fi
2457 #vhost-vdpa backends
2458 test "$vhost_net_vdpa" = "" && vhost_net_vdpa=$vhost_vdpa
2459 if test "$vhost_net_vdpa" = "yes" && test "$vhost_vdpa" = "no"; then
2460   error_exit "--enable-vhost-net-vdpa requires --enable-vhost-vdpa"
2461 fi
2462
2463 # OR the vhost-kernel and vhost-user values for simplicity
2464 if test "$vhost_net" = ""; then
2465   test "$vhost_net_user" = "yes" && vhost_net=yes
2466   test "$vhost_kernel" = "yes" && vhost_net=yes
2467 fi
2468
2469 ##########################################
2470 # MinGW / Mingw-w64 localtime_r/gmtime_r check
2471
2472 if test "$mingw32" = "yes"; then
2473     # Some versions of MinGW / Mingw-w64 lack localtime_r
2474     # and gmtime_r entirely.
2475     #
2476     # Some versions of Mingw-w64 define a macro for
2477     # localtime_r/gmtime_r.
2478     #
2479     # Some versions of Mingw-w64 will define functions
2480     # for localtime_r/gmtime_r, but only if you have
2481     # _POSIX_THREAD_SAFE_FUNCTIONS defined. For fun
2482     # though, unistd.h and pthread.h both define
2483     # that for you.
2484     #
2485     # So this #undef localtime_r and #include <unistd.h>
2486     # are not in fact redundant.
2487 cat > $TMPC << EOF
2488 #include <unistd.h>
2489 #include <time.h>
2490 #undef localtime_r
2491 int main(void) { localtime_r(NULL, NULL); return 0; }
2492 EOF
2493     if compile_prog "" "" ; then
2494         localtime_r="yes"
2495     else
2496         localtime_r="no"
2497     fi
2498 fi
2499
2500 ##########################################
2501 # pkg-config probe
2502
2503 if ! has "$pkg_config_exe"; then
2504   error_exit "pkg-config binary '$pkg_config_exe' not found"
2505 fi
2506
2507 ##########################################
2508 # NPTL probe
2509
2510 if test "$linux_user" = "yes"; then
2511   cat > $TMPC <<EOF
2512 #include <sched.h>
2513 #include <linux/futex.h>
2514 int main(void) {
2515 #if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
2516 #error bork
2517 #endif
2518   return 0;
2519 }
2520 EOF
2521   if ! compile_object ; then
2522     feature_not_found "nptl" "Install glibc and linux kernel headers."
2523   fi
2524 fi
2525
2526 ##########################################
2527 # lzo check
2528
2529 if test "$lzo" != "no" ; then
2530     cat > $TMPC << EOF
2531 #include <lzo/lzo1x.h>
2532 int main(void) { lzo_version(); return 0; }
2533 EOF
2534     if compile_prog "" "-llzo2" ; then
2535         libs_softmmu="$libs_softmmu -llzo2"
2536         lzo="yes"
2537     else
2538         if test "$lzo" = "yes"; then
2539             feature_not_found "liblzo2" "Install liblzo2 devel"
2540         fi
2541         lzo="no"
2542     fi
2543 fi
2544
2545 ##########################################
2546 # snappy check
2547
2548 if test "$snappy" != "no" ; then
2549     cat > $TMPC << EOF
2550 #include <snappy-c.h>
2551 int main(void) { snappy_max_compressed_length(4096); return 0; }
2552 EOF
2553     if compile_prog "" "-lsnappy" ; then
2554         libs_softmmu="$libs_softmmu -lsnappy"
2555         snappy="yes"
2556     else
2557         if test "$snappy" = "yes"; then
2558             feature_not_found "libsnappy" "Install libsnappy devel"
2559         fi
2560         snappy="no"
2561     fi
2562 fi
2563
2564 ##########################################
2565 # bzip2 check
2566
2567 if test "$bzip2" != "no" ; then
2568     cat > $TMPC << EOF
2569 #include <bzlib.h>
2570 int main(void) { BZ2_bzlibVersion(); return 0; }
2571 EOF
2572     if compile_prog "" "-lbz2" ; then
2573         bzip2="yes"
2574     else
2575         if test "$bzip2" = "yes"; then
2576             feature_not_found "libbzip2" "Install libbzip2 devel"
2577         fi
2578         bzip2="no"
2579     fi
2580 fi
2581
2582 ##########################################
2583 # lzfse check
2584
2585 if test "$lzfse" != "no" ; then
2586     cat > $TMPC << EOF
2587 #include <lzfse.h>
2588 int main(void) { lzfse_decode_scratch_size(); return 0; }
2589 EOF
2590     if compile_prog "" "-llzfse" ; then
2591         lzfse="yes"
2592     else
2593         if test "$lzfse" = "yes"; then
2594             feature_not_found "lzfse" "Install lzfse devel"
2595         fi
2596         lzfse="no"
2597     fi
2598 fi
2599
2600 ##########################################
2601 # zstd check
2602
2603 if test "$zstd" != "no" ; then
2604     libzstd_minver="1.4.0"
2605     if $pkg_config --atleast-version=$libzstd_minver libzstd ; then
2606         zstd_cflags="$($pkg_config --cflags libzstd)"
2607         zstd_libs="$($pkg_config --libs libzstd)"
2608         LIBS="$zstd_libs $LIBS"
2609         QEMU_CFLAGS="$QEMU_CFLAGS $zstd_cflags"
2610         zstd="yes"
2611     else
2612         if test "$zstd" = "yes" ; then
2613             feature_not_found "libzstd" "Install libzstd devel"
2614         fi
2615         zstd="no"
2616     fi
2617 fi
2618
2619 ##########################################
2620 # libseccomp check
2621
2622 if test "$seccomp" != "no" ; then
2623     libseccomp_minver="2.3.0"
2624     if $pkg_config --atleast-version=$libseccomp_minver libseccomp ; then
2625         seccomp_cflags="$($pkg_config --cflags libseccomp)"
2626         seccomp_libs="$($pkg_config --libs libseccomp)"
2627         seccomp="yes"
2628     else
2629         if test "$seccomp" = "yes" ; then
2630             feature_not_found "libseccomp" \
2631                  "Install libseccomp devel >= $libseccomp_minver"
2632         fi
2633         seccomp="no"
2634     fi
2635 fi
2636 ##########################################
2637 # xen probe
2638
2639 if test "$xen" != "no" ; then
2640   # Check whether Xen library path is specified via --extra-ldflags to avoid
2641   # overriding this setting with pkg-config output. If not, try pkg-config
2642   # to obtain all needed flags.
2643
2644   if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
2645      $pkg_config --exists xencontrol ; then
2646     xen_ctrl_version="$(printf '%d%02d%02d' \
2647       $($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
2648     xen=yes
2649     xen_pc="xencontrol xenstore xenguest xenforeignmemory xengnttab"
2650     xen_pc="$xen_pc xenevtchn xendevicemodel"
2651     if $pkg_config --exists xentoolcore; then
2652       xen_pc="$xen_pc xentoolcore"
2653     fi
2654     QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags $xen_pc)"
2655     libs_softmmu="$($pkg_config --libs $xen_pc) $libs_softmmu"
2656   else
2657
2658     xen_libs="-lxenstore -lxenctrl -lxenguest"
2659     xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
2660
2661     # First we test whether Xen headers and libraries are available.
2662     # If no, we are done and there is no Xen support.
2663     # If yes, more tests are run to detect the Xen version.
2664
2665     # Xen (any)
2666     cat > $TMPC <<EOF
2667 #include <xenctrl.h>
2668 int main(void) {
2669   return 0;
2670 }
2671 EOF
2672     if ! compile_prog "" "$xen_libs" ; then
2673       # Xen not found
2674       if test "$xen" = "yes" ; then
2675         feature_not_found "xen" "Install xen devel"
2676       fi
2677       xen=no
2678
2679     # Xen unstable
2680     elif
2681         cat > $TMPC <<EOF &&
2682 #undef XC_WANT_COMPAT_DEVICEMODEL_API
2683 #define __XEN_TOOLS__
2684 #include <xendevicemodel.h>
2685 #include <xenforeignmemory.h>
2686 int main(void) {
2687   xendevicemodel_handle *xd;
2688   xenforeignmemory_handle *xfmem;
2689
2690   xd = xendevicemodel_open(0, 0);
2691   xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
2692
2693   xfmem = xenforeignmemory_open(0, 0);
2694   xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
2695
2696   return 0;
2697 }
2698 EOF
2699         compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2700       then
2701       xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2702       xen_ctrl_version=41100
2703       xen=yes
2704     elif
2705         cat > $TMPC <<EOF &&
2706 #undef XC_WANT_COMPAT_MAP_FOREIGN_API
2707 #include <xenforeignmemory.h>
2708 #include <xentoolcore.h>
2709 int main(void) {
2710   xenforeignmemory_handle *xfmem;
2711
2712   xfmem = xenforeignmemory_open(0, 0);
2713   xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
2714   xentoolcore_restrict_all(0);
2715
2716   return 0;
2717 }
2718 EOF
2719         compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2720       then
2721       xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2722       xen_ctrl_version=41000
2723       xen=yes
2724     elif
2725         cat > $TMPC <<EOF &&
2726 #undef XC_WANT_COMPAT_DEVICEMODEL_API
2727 #define __XEN_TOOLS__
2728 #include <xendevicemodel.h>
2729 int main(void) {
2730   xendevicemodel_handle *xd;
2731
2732   xd = xendevicemodel_open(0, 0);
2733   xendevicemodel_close(xd);
2734
2735   return 0;
2736 }
2737 EOF
2738         compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
2739       then
2740       xen_stable_libs="-lxendevicemodel $xen_stable_libs"
2741       xen_ctrl_version=40900
2742       xen=yes
2743     elif
2744         cat > $TMPC <<EOF &&
2745 /*
2746  * If we have stable libs the we don't want the libxc compat
2747  * layers, regardless of what CFLAGS we may have been given.
2748  *
2749  * Also, check if xengnttab_grant_copy_segment_t is defined and
2750  * grant copy operation is implemented.
2751  */
2752 #undef XC_WANT_COMPAT_EVTCHN_API
2753 #undef XC_WANT_COMPAT_GNTTAB_API
2754 #undef XC_WANT_COMPAT_MAP_FOREIGN_API
2755 #include <xenctrl.h>
2756 #include <xenstore.h>
2757 #include <xenevtchn.h>
2758 #include <xengnttab.h>
2759 #include <xenforeignmemory.h>
2760 #include <stdint.h>
2761 #include <xen/hvm/hvm_info_table.h>
2762 #if !defined(HVM_MAX_VCPUS)
2763 # error HVM_MAX_VCPUS not defined
2764 #endif
2765 int main(void) {
2766   xc_interface *xc = NULL;
2767   xenforeignmemory_handle *xfmem;
2768   xenevtchn_handle *xe;
2769   xengnttab_handle *xg;
2770   xengnttab_grant_copy_segment_t* seg = NULL;
2771
2772   xs_daemon_open();
2773
2774   xc = xc_interface_open(0, 0, 0);
2775   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2776   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2777   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2778   xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2779
2780   xfmem = xenforeignmemory_open(0, 0);
2781   xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2782
2783   xe = xenevtchn_open(0, 0);
2784   xenevtchn_fd(xe);
2785
2786   xg = xengnttab_open(0, 0);
2787   xengnttab_grant_copy(xg, 0, seg);
2788
2789   return 0;
2790 }
2791 EOF
2792         compile_prog "" "$xen_libs $xen_stable_libs"
2793       then
2794       xen_ctrl_version=40800
2795       xen=yes
2796     elif
2797         cat > $TMPC <<EOF &&
2798 /*
2799  * If we have stable libs the we don't want the libxc compat
2800  * layers, regardless of what CFLAGS we may have been given.
2801  */
2802 #undef XC_WANT_COMPAT_EVTCHN_API
2803 #undef XC_WANT_COMPAT_GNTTAB_API
2804 #undef XC_WANT_COMPAT_MAP_FOREIGN_API
2805 #include <xenctrl.h>
2806 #include <xenstore.h>
2807 #include <xenevtchn.h>
2808 #include <xengnttab.h>
2809 #include <xenforeignmemory.h>
2810 #include <stdint.h>
2811 #include <xen/hvm/hvm_info_table.h>
2812 #if !defined(HVM_MAX_VCPUS)
2813 # error HVM_MAX_VCPUS not defined
2814 #endif
2815 int main(void) {
2816   xc_interface *xc = NULL;
2817   xenforeignmemory_handle *xfmem;
2818   xenevtchn_handle *xe;
2819   xengnttab_handle *xg;
2820
2821   xs_daemon_open();
2822
2823   xc = xc_interface_open(0, 0, 0);
2824   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2825   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2826   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2827   xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2828
2829   xfmem = xenforeignmemory_open(0, 0);
2830   xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2831
2832   xe = xenevtchn_open(0, 0);
2833   xenevtchn_fd(xe);
2834
2835   xg = xengnttab_open(0, 0);
2836   xengnttab_map_grant_ref(xg, 0, 0, 0);
2837
2838   return 0;
2839 }
2840 EOF
2841         compile_prog "" "$xen_libs $xen_stable_libs"
2842       then
2843       xen_ctrl_version=40701
2844       xen=yes
2845
2846     # Xen 4.6
2847     elif
2848         cat > $TMPC <<EOF &&
2849 #include <xenctrl.h>
2850 #include <xenstore.h>
2851 #include <stdint.h>
2852 #include <xen/hvm/hvm_info_table.h>
2853 #if !defined(HVM_MAX_VCPUS)
2854 # error HVM_MAX_VCPUS not defined
2855 #endif
2856 int main(void) {
2857   xc_interface *xc;
2858   xs_daemon_open();
2859   xc = xc_interface_open(0, 0, 0);
2860   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2861   xc_gnttab_open(NULL, 0);
2862   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2863   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2864   xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2865   xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
2866   return 0;
2867 }
2868 EOF
2869         compile_prog "" "$xen_libs"
2870       then
2871       xen_ctrl_version=40600
2872       xen=yes
2873
2874     # Xen 4.5
2875     elif
2876         cat > $TMPC <<EOF &&
2877 #include <xenctrl.h>
2878 #include <xenstore.h>
2879 #include <stdint.h>
2880 #include <xen/hvm/hvm_info_table.h>
2881 #if !defined(HVM_MAX_VCPUS)
2882 # error HVM_MAX_VCPUS not defined
2883 #endif
2884 int main(void) {
2885   xc_interface *xc;
2886   xs_daemon_open();
2887   xc = xc_interface_open(0, 0, 0);
2888   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2889   xc_gnttab_open(NULL, 0);
2890   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2891   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2892   xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
2893   return 0;
2894 }
2895 EOF
2896         compile_prog "" "$xen_libs"
2897       then
2898       xen_ctrl_version=40500
2899       xen=yes
2900
2901     elif
2902         cat > $TMPC <<EOF &&
2903 #include <xenctrl.h>
2904 #include <xenstore.h>
2905 #include <stdint.h>
2906 #include <xen/hvm/hvm_info_table.h>
2907 #if !defined(HVM_MAX_VCPUS)
2908 # error HVM_MAX_VCPUS not defined
2909 #endif
2910 int main(void) {
2911   xc_interface *xc;
2912   xs_daemon_open();
2913   xc = xc_interface_open(0, 0, 0);
2914   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2915   xc_gnttab_open(NULL, 0);
2916   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2917   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2918   return 0;
2919 }
2920 EOF
2921         compile_prog "" "$xen_libs"
2922       then
2923       xen_ctrl_version=40200
2924       xen=yes
2925
2926     else
2927       if test "$xen" = "yes" ; then
2928         feature_not_found "xen (unsupported version)" \
2929                           "Install a supported xen (xen 4.2 or newer)"
2930       fi
2931       xen=no
2932     fi
2933
2934     if test "$xen" = yes; then
2935       if test $xen_ctrl_version -ge 40701  ; then
2936         libs_softmmu="$xen_stable_libs $libs_softmmu"
2937       fi
2938       libs_softmmu="$xen_libs $libs_softmmu"
2939     fi
2940   fi
2941 fi
2942
2943 if test "$xen_pci_passthrough" != "no"; then
2944   if test "$xen" = "yes" && test "$linux" = "yes"; then
2945     xen_pci_passthrough=yes
2946   else
2947     if test "$xen_pci_passthrough" = "yes"; then
2948       error_exit "User requested feature Xen PCI Passthrough" \
2949           " but this feature requires /sys from Linux"
2950     fi
2951     xen_pci_passthrough=no
2952   fi
2953 fi
2954
2955 ##########################################
2956 # Windows Hypervisor Platform accelerator (WHPX) check
2957 if test "$whpx" != "no" ; then
2958     if check_include "WinHvPlatform.h" && check_include "WinHvEmulation.h"; then
2959         whpx="yes"
2960     else
2961         if test "$whpx" = "yes"; then
2962             feature_not_found "WinHvPlatform" "WinHvEmulation is not installed"
2963         fi
2964         whpx="no"
2965     fi
2966 fi
2967
2968 ##########################################
2969 # Sparse probe
2970 if test "$sparse" != "no" ; then
2971   if has cgcc; then
2972     sparse=yes
2973   else
2974     if test "$sparse" = "yes" ; then
2975       feature_not_found "sparse" "Install sparse binary"
2976     fi
2977     sparse=no
2978   fi
2979 fi
2980
2981 ##########################################
2982 # X11 probe
2983 if $pkg_config --exists "x11"; then
2984     have_x11=yes
2985     x11_cflags=$($pkg_config --cflags x11)
2986     x11_libs=$($pkg_config --libs x11)
2987 fi
2988
2989 ##########################################
2990 # GTK probe
2991
2992 if test "$gtk" != "no"; then
2993     gtkpackage="gtk+-3.0"
2994     gtkx11package="gtk+-x11-3.0"
2995     gtkversion="3.22.0"
2996     if $pkg_config --exists "$gtkpackage >= $gtkversion"; then
2997         gtk_cflags=$($pkg_config --cflags $gtkpackage)
2998         gtk_libs=$($pkg_config --libs $gtkpackage)
2999         gtk_version=$($pkg_config --modversion $gtkpackage)
3000         if $pkg_config --exists "$gtkx11package >= $gtkversion"; then
3001             need_x11=yes
3002             gtk_cflags="$gtk_cflags $x11_cflags"
3003             gtk_libs="$gtk_libs $x11_libs"
3004         fi
3005         gtk="yes"
3006     elif test "$gtk" = "yes"; then
3007         feature_not_found "gtk" "Install gtk3-devel"
3008     else
3009         gtk="no"
3010     fi
3011 fi
3012
3013
3014 ##########################################
3015 # GNUTLS probe
3016
3017 if test "$gnutls" != "no"; then
3018     pass="no"
3019     if $pkg_config --exists "gnutls >= 3.1.18"; then
3020         gnutls_cflags=$($pkg_config --cflags gnutls)
3021         gnutls_libs=$($pkg_config --libs gnutls)
3022         # Packaging for the static libraries is not always correct.
3023         # At least ubuntu 18.04 ships only shared libraries.
3024         write_c_skeleton
3025         if compile_prog "" "$gnutls_libs" ; then
3026             LIBS="$gnutls_libs $LIBS"
3027             QEMU_CFLAGS="$QEMU_CFLAGS $gnutls_cflags"
3028             pass="yes"
3029         fi
3030     fi
3031     if test "$pass" = "no" && test "$gnutls" = "yes"; then
3032         feature_not_found "gnutls" "Install gnutls devel >= 3.1.18"
3033     else
3034         gnutls="$pass"
3035     fi
3036 fi
3037
3038
3039 # If user didn't give a --disable/enable-gcrypt flag,
3040 # then mark as disabled if user requested nettle
3041 # explicitly
3042 if test -z "$gcrypt"
3043 then
3044     if test "$nettle" = "yes"
3045     then
3046         gcrypt="no"
3047     fi
3048 fi
3049
3050 # If user didn't give a --disable/enable-nettle flag,
3051 # then mark as disabled if user requested gcrypt
3052 # explicitly
3053 if test -z "$nettle"
3054 then
3055     if test "$gcrypt" = "yes"
3056     then
3057         nettle="no"
3058     fi
3059 fi
3060
3061 has_libgcrypt() {
3062     if ! has "libgcrypt-config"
3063     then
3064         return 1
3065     fi
3066
3067     if test -n "$cross_prefix"
3068     then
3069         host=$(libgcrypt-config --host)
3070         if test "$host-" != $cross_prefix
3071         then
3072             return 1
3073         fi
3074     fi
3075
3076     maj=`libgcrypt-config --version | awk -F . '{print $1}'`
3077     min=`libgcrypt-config --version | awk -F . '{print $2}'`
3078
3079     if test $maj != 1 || test $min -lt 5
3080     then
3081        return 1
3082     fi
3083
3084     return 0
3085 }
3086
3087
3088 if test "$nettle" != "no"; then
3089     pass="no"
3090     if $pkg_config --exists "nettle >= 2.7.1"; then
3091         nettle_cflags=$($pkg_config --cflags nettle)
3092         nettle_libs=$($pkg_config --libs nettle)
3093         nettle_version=$($pkg_config --modversion nettle)
3094         # Link test to make sure the given libraries work (e.g for static).
3095         write_c_skeleton
3096         if compile_prog "" "$nettle_libs" ; then
3097             LIBS="$nettle_libs $LIBS"
3098             QEMU_CFLAGS="$QEMU_CFLAGS $nettle_cflags"
3099             if test -z "$gcrypt"; then
3100                gcrypt="no"
3101             fi
3102             pass="yes"
3103         fi
3104     fi
3105     if test "$pass" = "yes"
3106     then
3107         cat > $TMPC << EOF
3108 #include <nettle/xts.h>
3109 int main(void) {
3110   return 0;
3111 }
3112 EOF
3113         if compile_prog "$nettle_cflags" "$nettle_libs" ; then
3114             nettle_xts=yes
3115             qemu_private_xts=no
3116         fi
3117     fi
3118     if test "$pass" = "no" && test "$nettle" = "yes"; then
3119         feature_not_found "nettle" "Install nettle devel >= 2.7.1"
3120     else
3121         nettle="$pass"
3122     fi
3123 fi
3124
3125 if test "$gcrypt" != "no"; then
3126     pass="no"
3127     if has_libgcrypt; then
3128         gcrypt_cflags=$(libgcrypt-config --cflags)
3129         gcrypt_libs=$(libgcrypt-config --libs)
3130         # Debian has removed -lgpg-error from libgcrypt-config
3131         # as it "spreads unnecessary dependencies" which in
3132         # turn breaks static builds...
3133         if test "$static" = "yes"
3134         then
3135             gcrypt_libs="$gcrypt_libs -lgpg-error"
3136         fi
3137
3138         # Link test to make sure the given libraries work (e.g for static).
3139         write_c_skeleton
3140         if compile_prog "" "$gcrypt_libs" ; then
3141             LIBS="$gcrypt_libs $LIBS"
3142             QEMU_CFLAGS="$QEMU_CFLAGS $gcrypt_cflags"
3143             pass="yes"
3144         fi
3145     fi
3146     if test "$pass" = "yes"; then
3147         gcrypt="yes"
3148         cat > $TMPC << EOF
3149 #include <gcrypt.h>
3150 int main(void) {
3151   gcry_mac_hd_t handle;
3152   gcry_mac_open(&handle, GCRY_MAC_HMAC_MD5,
3153                 GCRY_MAC_FLAG_SECURE, NULL);
3154   return 0;
3155 }
3156 EOF
3157         if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
3158             gcrypt_hmac=yes
3159         fi
3160         cat > $TMPC << EOF
3161 #include <gcrypt.h>
3162 int main(void) {
3163   gcry_cipher_hd_t handle;
3164   gcry_cipher_open(&handle, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_XTS, 0);
3165   return 0;
3166 }
3167 EOF
3168         if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
3169             gcrypt_xts=yes
3170             qemu_private_xts=no
3171         fi
3172     elif test "$gcrypt" = "yes"; then
3173         feature_not_found "gcrypt" "Install gcrypt devel >= 1.5.0"
3174     else
3175         gcrypt="no"
3176     fi
3177 fi
3178
3179
3180 if test "$gcrypt" = "yes" && test "$nettle" = "yes"
3181 then
3182     error_exit "Only one of gcrypt & nettle can be enabled"
3183 fi
3184
3185 ##########################################
3186 # libtasn1 - only for the TLS creds/session test suite
3187
3188 tasn1=yes
3189 tasn1_cflags=""
3190 tasn1_libs=""
3191 if $pkg_config --exists "libtasn1"; then
3192     tasn1_cflags=$($pkg_config --cflags libtasn1)
3193     tasn1_libs=$($pkg_config --libs libtasn1)
3194 else
3195     tasn1=no
3196 fi
3197
3198
3199 ##########################################
3200 # PAM probe
3201
3202 if test "$auth_pam" != "no"; then
3203     cat > $TMPC <<EOF
3204 #include <security/pam_appl.h>
3205 #include <stdio.h>
3206 int main(void) {
3207    const char *service_name = "qemu";
3208    const char *user = "frank";
3209    const struct pam_conv pam_conv = { 0 };
3210    pam_handle_t *pamh = NULL;
3211    pam_start(service_name, user, &pam_conv, &pamh);
3212    return 0;
3213 }
3214 EOF
3215     if compile_prog "" "-lpam" ; then
3216         auth_pam=yes
3217     else
3218         if test "$auth_pam" = "yes"; then
3219             feature_not_found "PAM" "Install PAM development package"
3220         else
3221             auth_pam=no
3222         fi
3223     fi
3224 fi
3225
3226 ##########################################
3227 # getifaddrs (for tests/test-io-channel-socket )
3228
3229 have_ifaddrs_h=yes
3230 if ! check_include "ifaddrs.h" ; then
3231   have_ifaddrs_h=no
3232 fi
3233
3234 #########################################
3235 # libdrm check
3236 have_drm_h=no
3237 if check_include "libdrm/drm.h" ; then
3238     have_drm_h=yes
3239 fi
3240
3241 #########################################
3242 # sys/signal.h check
3243 have_sys_signal_h=no
3244 if check_include "sys/signal.h" ; then
3245   have_sys_signal_h=yes
3246 fi
3247
3248 ##########################################
3249 # VTE probe
3250
3251 if test "$vte" != "no"; then
3252     vteminversion="0.32.0"
3253     if $pkg_config --exists "vte-2.91"; then
3254       vtepackage="vte-2.91"
3255     else
3256       vtepackage="vte-2.90"
3257     fi
3258     if $pkg_config --exists "$vtepackage >= $vteminversion"; then
3259         vte_cflags=$($pkg_config --cflags $vtepackage)
3260         vte_libs=$($pkg_config --libs $vtepackage)
3261         vteversion=$($pkg_config --modversion $vtepackage)
3262         vte="yes"
3263     elif test "$vte" = "yes"; then
3264         feature_not_found "vte" "Install libvte-2.90/2.91 devel"
3265     else
3266         vte="no"
3267     fi
3268 fi
3269
3270 ##########################################
3271 # SDL probe
3272
3273 # Look for sdl configuration program (pkg-config or sdl2-config).  Try
3274 # sdl2-config even without cross prefix, and favour pkg-config over sdl2-config.
3275
3276 sdl_probe ()
3277 {
3278   if $pkg_config sdl2 --exists; then
3279     sdlconfig="$pkg_config sdl2"
3280     sdlversion=$($sdlconfig --modversion 2>/dev/null)
3281   elif has "$sdl2_config"; then
3282     sdlconfig="$sdl2_config"
3283     sdlversion=$($sdlconfig --version)
3284   else
3285     if test "$sdl" = "yes" ; then
3286       feature_not_found "sdl" "Install SDL2-devel"
3287     fi
3288     sdl=no
3289     # no need to do the rest
3290     return
3291   fi
3292   if test -n "$cross_prefix" && test "$(basename "$sdlconfig")" = sdl2-config; then
3293     echo warning: using "\"$sdlconfig\"" to detect cross-compiled sdl >&2
3294   fi
3295
3296   cat > $TMPC << EOF
3297 #include <SDL.h>
3298 #undef main /* We don't want SDL to override our main() */
3299 int main( void ) { return SDL_Init (SDL_INIT_VIDEO); }
3300 EOF
3301   sdl_cflags=$($sdlconfig --cflags 2>/dev/null)
3302   sdl_cflags="$sdl_cflags -Wno-undef"  # workaround 2.0.8 bug
3303   if test "$static" = "yes" ; then
3304     if $pkg_config sdl2 --exists; then
3305       sdl_libs=$($pkg_config sdl2 --static --libs 2>/dev/null)
3306     else
3307       sdl_libs=$($sdlconfig --static-libs 2>/dev/null)
3308     fi
3309   else
3310     sdl_libs=$($sdlconfig --libs 2>/dev/null)
3311   fi
3312   if compile_prog "$sdl_cflags" "$sdl_libs" ; then
3313     sdl=yes
3314
3315     # static link with sdl ? (note: sdl.pc's --static --libs is broken)
3316     if test "$sdl" = "yes" && test "$static" = "yes" ; then
3317       if test $? = 0 && echo $sdl_libs | grep -- -laa > /dev/null; then
3318          sdl_libs="$sdl_libs $(aalib-config --static-libs 2>/dev/null)"
3319          sdl_cflags="$sdl_cflags $(aalib-config --cflags 2>/dev/null)"
3320       fi
3321       if compile_prog "$sdl_cflags" "$sdl_libs" ; then
3322         :
3323       else
3324         sdl=no
3325       fi
3326     fi # static link
3327   else # sdl not found
3328     if test "$sdl" = "yes" ; then
3329       feature_not_found "sdl" "Install SDL2 devel"
3330     fi
3331     sdl=no
3332   fi # sdl compile test
3333 }
3334
3335 sdl_image_probe ()
3336 {
3337     if test "$sdl_image" != "no" ; then
3338         if $pkg_config SDL2_image --exists; then
3339             if test "$static" = "yes"; then
3340                 sdl_image_libs=$($pkg_config SDL2_image --libs --static 2>/dev/null)
3341             else
3342                 sdl_image_libs=$($pkg_config SDL2_image --libs 2>/dev/null)
3343             fi
3344             sdl_image_cflags=$($pkg_config SDL2_image --cflags 2>/dev/null)
3345             sdl_image=yes
3346
3347             sdl_cflags="$sdl_cflags $sdl_image_cflags"
3348             sdl_libs="$sdl_libs $sdl_image_libs"
3349         else
3350             if test "$sdl_image" = "yes" ; then
3351                 feature_not_found "sdl_image" "Install SDL Image devel"
3352             else
3353                 sdl_image=no
3354             fi
3355         fi
3356     fi
3357 }
3358
3359 if test "$sdl" != "no" ; then
3360   sdl_probe
3361 fi
3362
3363 if test "$sdl" = "yes" ; then
3364   sdl_image_probe
3365 else
3366   if test "$sdl_image" = "yes"; then
3367     echo "warning: SDL Image requested, but SDL is not available, disabling"
3368   fi
3369   sdl_image=no
3370 fi
3371
3372 if test "$sdl" = "yes" ; then
3373   cat > $TMPC <<EOF
3374 #include <SDL.h>
3375 #if defined(SDL_VIDEO_DRIVER_X11)
3376 #include <X11/XKBlib.h>
3377 #else
3378 #error No x11 support
3379 #endif
3380 int main(void) { return 0; }
3381 EOF
3382   if compile_prog "$sdl_cflags $x11_cflags" "$sdl_libs $x11_libs" ; then
3383     need_x11=yes
3384     sdl_cflags="$sdl_cflags $x11_cflags"
3385     sdl_libs="$sdl_libs $x11_libs"
3386   fi
3387 fi
3388
3389 ##########################################
3390 # RDMA needs OpenFabrics libraries
3391 if test "$rdma" != "no" ; then
3392   cat > $TMPC <<EOF
3393 #include <rdma/rdma_cma.h>
3394 int main(void) { return 0; }
3395 EOF
3396   rdma_libs="-lrdmacm -libverbs -libumad"
3397   if compile_prog "" "$rdma_libs" ; then
3398     rdma="yes"
3399     libs_softmmu="$libs_softmmu $rdma_libs"
3400   else
3401     if test "$rdma" = "yes" ; then
3402         error_exit \
3403             " OpenFabrics librdmacm/libibverbs/libibumad not present." \
3404             " Your options:" \
3405             "  (1) Fast: Install infiniband packages (devel) from your distro." \
3406             "  (2) Cleanest: Install libraries from www.openfabrics.org" \
3407             "  (3) Also: Install softiwarp if you don't have RDMA hardware"
3408     fi
3409     rdma="no"
3410   fi
3411 fi
3412
3413 ##########################################
3414 # PVRDMA detection
3415
3416 cat > $TMPC <<EOF &&
3417 #include <sys/mman.h>
3418
3419 int
3420 main(void)
3421 {
3422     char buf = 0;
3423     void *addr = &buf;
3424     addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
3425
3426     return 0;
3427 }
3428 EOF
3429
3430 if test "$rdma" = "yes" ; then
3431     case "$pvrdma" in
3432     "")
3433         if compile_prog "" ""; then
3434             pvrdma="yes"
3435         else
3436             pvrdma="no"
3437         fi
3438         ;;
3439     "yes")
3440         if ! compile_prog "" ""; then
3441             error_exit "PVRDMA is not supported since mremap is not implemented"
3442         fi
3443         pvrdma="yes"
3444         ;;
3445     "no")
3446         pvrdma="no"
3447         ;;
3448     esac
3449 else
3450     if test "$pvrdma" = "yes" ; then
3451         error_exit "PVRDMA requires rdma suppport"
3452     fi
3453     pvrdma="no"
3454 fi
3455
3456 # Let's see if enhanced reg_mr is supported
3457 if test "$pvrdma" = "yes" ; then
3458
3459 cat > $TMPC <<EOF &&
3460 #include <infiniband/verbs.h>
3461
3462 int
3463 main(void)
3464 {
3465     struct ibv_mr *mr;
3466     struct ibv_pd *pd = NULL;
3467     size_t length = 10;
3468     uint64_t iova = 0;
3469     int access = 0;
3470     void *addr = NULL;
3471
3472     mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
3473
3474     ibv_dereg_mr(mr);
3475
3476     return 0;
3477 }
3478 EOF
3479     if ! compile_prog "" "-libverbs"; then
3480         QEMU_CFLAGS="$QEMU_CFLAGS -DLEGACY_RDMA_REG_MR"
3481     fi
3482 fi
3483
3484 ##########################################
3485 # VNC SASL detection
3486 if test "$vnc" = "yes" && test "$vnc_sasl" != "no" ; then
3487   cat > $TMPC <<EOF
3488 #include <sasl/sasl.h>
3489 #include <stdio.h>
3490 int main(void) { sasl_server_init(NULL, "qemu"); return 0; }
3491 EOF
3492   # Assuming Cyrus-SASL installed in /usr prefix
3493   # QEMU defines struct iovec in "qemu/osdep.h",
3494   # we don't want libsasl to redefine it in <sasl/sasl.h>.
3495   vnc_sasl_cflags="-DSTRUCT_IOVEC_DEFINED"
3496   vnc_sasl_libs="-lsasl2"
3497   if compile_prog "$vnc_sasl_cflags" "$vnc_sasl_libs" ; then
3498     vnc_sasl=yes
3499     libs_softmmu="$vnc_sasl_libs $libs_softmmu"
3500     QEMU_CFLAGS="$QEMU_CFLAGS $vnc_sasl_cflags"
3501   else
3502     if test "$vnc_sasl" = "yes" ; then
3503       feature_not_found "vnc-sasl" "Install Cyrus SASL devel"
3504     fi
3505     vnc_sasl=no
3506   fi
3507 fi
3508
3509 ##########################################
3510 # VNC JPEG detection
3511 if test "$vnc" = "yes" && test "$vnc_jpeg" != "no" ; then
3512 cat > $TMPC <<EOF
3513 #include <stdio.h>
3514 #include <jpeglib.h>
3515 int main(void) { struct jpeg_compress_struct s; jpeg_create_compress(&s); return 0; }
3516 EOF
3517     vnc_jpeg_cflags=""
3518     vnc_jpeg_libs="-ljpeg"
3519   if compile_prog "$vnc_jpeg_cflags" "$vnc_jpeg_libs" ; then
3520     vnc_jpeg=yes
3521     libs_softmmu="$vnc_jpeg_libs $libs_softmmu"
3522     QEMU_CFLAGS="$QEMU_CFLAGS $vnc_jpeg_cflags"
3523   else
3524     if test "$vnc_jpeg" = "yes" ; then
3525       feature_not_found "vnc-jpeg" "Install libjpeg-turbo devel"
3526     fi
3527     vnc_jpeg=no
3528   fi
3529 fi
3530
3531 ##########################################
3532 # VNC PNG detection
3533 if test "$vnc" = "yes" && test "$vnc_png" != "no" ; then
3534 cat > $TMPC <<EOF
3535 //#include <stdio.h>
3536 #include <png.h>
3537 #include <stddef.h>
3538 int main(void) {
3539     png_structp png_ptr;
3540     png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
3541     return png_ptr != 0;
3542 }
3543 EOF
3544   if $pkg_config libpng --exists; then
3545     vnc_png_cflags=$($pkg_config libpng --cflags)
3546     vnc_png_libs=$($pkg_config libpng --libs)
3547   else
3548     vnc_png_cflags=""
3549     vnc_png_libs="-lpng"
3550   fi
3551   if compile_prog "$vnc_png_cflags" "$vnc_png_libs" ; then
3552     vnc_png=yes
3553     libs_softmmu="$vnc_png_libs $libs_softmmu"
3554     QEMU_CFLAGS="$QEMU_CFLAGS $vnc_png_cflags"
3555   else
3556     if test "$vnc_png" = "yes" ; then
3557       feature_not_found "vnc-png" "Install libpng devel"
3558     fi
3559     vnc_png=no
3560   fi
3561 fi
3562
3563 ##########################################
3564 # xkbcommon probe
3565 if test "$xkbcommon" != "no" ; then
3566   if $pkg_config xkbcommon --exists; then
3567     xkbcommon_cflags=$($pkg_config xkbcommon --cflags)
3568     xkbcommon_libs=$($pkg_config xkbcommon --libs)
3569     xkbcommon=yes
3570   else
3571     if test "$xkbcommon" = "yes" ; then
3572       feature_not_found "xkbcommon" "Install libxkbcommon-devel"
3573     fi
3574     xkbcommon=no
3575   fi
3576 fi
3577
3578
3579 ##########################################
3580 # xfsctl() probe, used for file-posix.c
3581 if test "$xfs" != "no" ; then
3582   cat > $TMPC << EOF
3583 #include <stddef.h>  /* NULL */
3584 #include <xfs/xfs.h>
3585 int main(void)
3586 {
3587     xfsctl(NULL, 0, 0, NULL);
3588     return 0;
3589 }
3590 EOF
3591   if compile_prog "" "" ; then
3592     xfs="yes"
3593   else
3594     if test "$xfs" = "yes" ; then
3595       feature_not_found "xfs" "Instal xfsprogs/xfslibs devel"
3596     fi
3597     xfs=no
3598   fi
3599 fi
3600
3601 ##########################################
3602 # vde libraries probe
3603 if test "$vde" != "no" ; then
3604   vde_libs="-lvdeplug"
3605   cat > $TMPC << EOF
3606 #include <libvdeplug.h>
3607 int main(void)
3608 {
3609     struct vde_open_args a = {0, 0, 0};
3610     char s[] = "";
3611     vde_open(s, s, &a);
3612     return 0;
3613 }
3614 EOF
3615   if compile_prog "" "$vde_libs" ; then
3616     vde=yes
3617   else
3618     if test "$vde" = "yes" ; then
3619       feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
3620     fi
3621     vde=no
3622   fi
3623 fi
3624
3625 ##########################################
3626 # netmap support probe
3627 # Apart from looking for netmap headers, we make sure that the host API version
3628 # supports the netmap backend (>=11). The upper bound (15) is meant to simulate
3629 # a minor/major version number. Minor new features will be marked with values up
3630 # to 15, and if something happens that requires a change to the backend we will
3631 # move above 15, submit the backend fixes and modify this two bounds.
3632 if test "$netmap" != "no" ; then
3633   cat > $TMPC << EOF
3634 #include <inttypes.h>
3635 #include <net/if.h>
3636 #include <net/netmap.h>
3637 #include <net/netmap_user.h>
3638 #if (NETMAP_API < 11) || (NETMAP_API > 15)
3639 #error
3640 #endif
3641 int main(void) { return 0; }
3642 EOF
3643   if compile_prog "" "" ; then
3644     netmap=yes
3645   else
3646     if test "$netmap" = "yes" ; then
3647       feature_not_found "netmap"
3648     fi
3649     netmap=no
3650   fi
3651 fi
3652
3653 ############################################
3654 # efi-aarch64 probe
3655 # Check for efi files needed by aarch64 VMs.
3656 # By default we will use the efi included with QEMU.
3657 # Allow user to override the path for efi also.
3658 if ! test -f "$efi_aarch64"; then
3659   if test -f $source_path/pc-bios/edk2-aarch64-code.fd.bz2; then
3660     # valid after build
3661     efi_aarch64=$PWD/pc-bios/edk2-aarch64-code.fd
3662   else
3663     efi_aarch64=""
3664   fi
3665 fi
3666
3667 ##########################################
3668 # libcap-ng library probe
3669 if test "$cap_ng" != "no" ; then
3670   cap_libs="-lcap-ng"
3671   cat > $TMPC << EOF
3672 #include <cap-ng.h>
3673 int main(void)
3674 {
3675     capng_capability_to_name(CAPNG_EFFECTIVE);
3676     return 0;
3677 }
3678 EOF
3679   if compile_prog "" "$cap_libs" ; then
3680     cap_ng=yes
3681     libs_tools="$cap_libs $libs_tools"
3682   else
3683     if test "$cap_ng" = "yes" ; then
3684       feature_not_found "cap_ng" "Install libcap-ng devel"
3685     fi
3686     cap_ng=no
3687   fi
3688 fi
3689
3690 ##########################################
3691 # Sound support libraries probe
3692
3693 audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
3694 for drv in $audio_drv_list; do
3695     case $drv in
3696     alsa | try-alsa)
3697     if $pkg_config alsa --exists; then
3698         alsa_libs=$($pkg_config alsa --libs)
3699         if test "$drv" = "try-alsa"; then
3700             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa/alsa/')
3701         fi
3702     else
3703         if test "$drv" = "try-alsa"; then
3704             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa//')
3705         else
3706             error_exit "$drv check failed" \
3707                 "Make sure to have the $drv libs and headers installed."
3708         fi
3709     fi
3710     ;;
3711
3712     pa | try-pa)
3713     if $pkg_config libpulse --exists; then
3714         pulse_libs=$($pkg_config libpulse --libs)
3715         if test "$drv" = "try-pa"; then
3716             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa/pa/')
3717         fi
3718     else
3719         if test "$drv" = "try-pa"; then
3720             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa//')
3721         else
3722             error_exit "$drv check failed" \
3723                 "Make sure to have the $drv libs and headers installed."
3724         fi
3725     fi
3726     ;;
3727
3728     sdl)
3729     if test "$sdl" = "no"; then
3730         error_exit "sdl not found or disabled, can not use sdl audio driver"
3731     fi
3732     ;;
3733
3734     try-sdl)
3735     if test "$sdl" = "no"; then
3736         audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl//')
3737     else
3738         audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl/sdl/')
3739     fi
3740     ;;
3741
3742     coreaudio)
3743       coreaudio_libs="-framework CoreAudio"
3744     ;;
3745
3746     dsound)
3747       dsound_libs="-lole32 -ldxguid"
3748       audio_win_int="yes"
3749     ;;
3750
3751     oss)
3752       oss_libs="$oss_lib"
3753     ;;
3754
3755     jack | try-jack)
3756     if $pkg_config jack --exists; then
3757         jack_libs=$($pkg_config jack --libs)
3758         if test "$drv" = "try-jack"; then
3759             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack/jack/')
3760         fi
3761     else
3762         if test "$drv" = "try-jack"; then
3763             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack//')
3764         else
3765             error_exit "$drv check failed" \
3766                 "Make sure to have the $drv libs and headers installed."
3767         fi
3768     fi
3769     ;;
3770
3771     *)
3772     echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
3773         error_exit "Unknown driver '$drv' selected" \
3774             "Possible drivers are: $audio_possible_drivers"
3775     }
3776     ;;
3777     esac
3778 done
3779
3780 ##########################################
3781 # BrlAPI probe
3782
3783 if test "$brlapi" != "no" ; then
3784   brlapi_libs="-lbrlapi"
3785   cat > $TMPC << EOF
3786 #include <brlapi.h>
3787 #include <stddef.h>
3788 int main( void ) { return brlapi__openConnection (NULL, NULL, NULL); }
3789 EOF
3790   if compile_prog "" "$brlapi_libs" ; then
3791     brlapi=yes
3792   else
3793     if test "$brlapi" = "yes" ; then
3794       feature_not_found "brlapi" "Install brlapi devel"
3795     fi
3796     brlapi=no
3797   fi
3798 fi
3799
3800 ##########################################
3801 # iconv probe
3802 if test "$iconv" != "no" ; then
3803   cat > $TMPC << EOF
3804 #include <iconv.h>
3805 int main(void) {
3806   iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
3807   return conv != (iconv_t) -1;
3808 }
3809 EOF
3810   iconv_prefix_list="/usr/local:/usr"
3811   iconv_lib_list=":-liconv"
3812   IFS=:
3813   for iconv_prefix in $iconv_prefix_list; do
3814     IFS=:
3815     iconv_cflags="-I$iconv_prefix/include"
3816     iconv_ldflags="-L$iconv_prefix/lib"
3817     for iconv_link in $iconv_lib_list; do
3818       unset IFS
3819       iconv_lib="$iconv_ldflags $iconv_link"
3820       echo "looking at iconv in '$iconv_cflags' '$iconv_lib'" >> config.log
3821       if compile_prog "$iconv_cflags" "$iconv_lib" ; then
3822         iconv_found=yes
3823         break
3824       fi
3825     done
3826     if test "$iconv_found" = yes ; then
3827       break
3828     fi
3829   done
3830   if test "$iconv_found" = "yes" ; then
3831     iconv=yes
3832   else
3833     if test "$iconv" = "yes" ; then
3834       feature_not_found "iconv" "Install iconv devel"
3835     fi
3836     iconv=no
3837   fi
3838 fi
3839
3840 ##########################################
3841 # curses probe
3842 if test "$iconv" = "no" ; then
3843   # curses will need iconv
3844   curses=no
3845 fi
3846 if test "$curses" != "no" ; then
3847   if test "$mingw32" = "yes" ; then
3848     curses_inc_list="$($pkg_config --cflags ncurses 2>/dev/null):"
3849     curses_lib_list="$($pkg_config --libs ncurses 2>/dev/null):-lpdcurses"
3850   else
3851     curses_inc_list="$($pkg_config --cflags ncursesw 2>/dev/null):-I/usr/include/ncursesw:"
3852     curses_lib_list="$($pkg_config --libs ncursesw 2>/dev/null):-lncursesw:-lcursesw"
3853   fi
3854   curses_found=no
3855   cat > $TMPC << EOF
3856 #include <locale.h>
3857 #include <curses.h>
3858 #include <wchar.h>
3859 #include <langinfo.h>
3860 int main(void) {
3861   const char *codeset;
3862   wchar_t wch = L'w';
3863   setlocale(LC_ALL, "");
3864   resize_term(0, 0);
3865   addwstr(L"wide chars\n");
3866   addnwstr(&wch, 1);
3867   add_wch(WACS_DEGREE);
3868   codeset = nl_langinfo(CODESET);
3869   return codeset != 0;
3870 }
3871 EOF
3872   IFS=:
3873   for curses_inc in $curses_inc_list; do
3874     # Make sure we get the wide character prototypes
3875     curses_inc="-DNCURSES_WIDECHAR $curses_inc"
3876     IFS=:
3877     for curses_lib in $curses_lib_list; do
3878       unset IFS
3879       if compile_prog "$curses_inc" "$curses_lib" ; then
3880         curses_found=yes
3881         break
3882       fi
3883     done
3884     if test "$curses_found" = yes ; then
3885       break
3886     fi
3887   done
3888   unset IFS
3889   if test "$curses_found" = "yes" ; then
3890     curses=yes
3891   else
3892     if test "$curses" = "yes" ; then
3893       feature_not_found "curses" "Install ncurses devel"
3894     fi
3895     curses=no
3896   fi
3897 fi
3898
3899 ##########################################
3900 # curl probe
3901 if test "$curl" != "no" ; then
3902   if $pkg_config libcurl --exists; then
3903     curlconfig="$pkg_config libcurl"
3904   else
3905     curlconfig=curl-config
3906   fi
3907   cat > $TMPC << EOF
3908 #include <curl/curl.h>
3909 int main(void) { curl_easy_init(); curl_multi_setopt(0, 0, 0); return 0; }
3910 EOF
3911   curl_cflags=$($curlconfig --cflags 2>/dev/null)
3912   curl_libs=$($curlconfig --libs 2>/dev/null)
3913   if compile_prog "$curl_cflags" "$curl_libs" ; then
3914     curl=yes
3915   else
3916     if test "$curl" = "yes" ; then
3917       feature_not_found "curl" "Install libcurl devel"
3918     fi
3919     curl=no
3920   fi
3921 fi # test "$curl"
3922
3923 ##########################################
3924 # glib support probe
3925
3926 glib_req_ver=2.48
3927 glib_modules=gthread-2.0
3928 if test "$modules" = yes; then
3929     glib_modules="$glib_modules gmodule-export-2.0"
3930 fi
3931 if test "$plugins" = yes; then
3932     glib_modules="$glib_modules gmodule-2.0"
3933 fi
3934
3935 # This workaround is required due to a bug in pkg-config file for glib as it
3936 # doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
3937
3938 if test "$static" = yes && test "$mingw32" = yes; then
3939     QEMU_CFLAGS="-DGLIB_STATIC_COMPILATION $QEMU_CFLAGS"
3940 fi
3941
3942 for i in $glib_modules; do
3943     if $pkg_config --atleast-version=$glib_req_ver $i; then
3944         glib_cflags=$($pkg_config --cflags $i)
3945         glib_libs=$($pkg_config --libs $i)
3946         QEMU_CFLAGS="$glib_cflags $QEMU_CFLAGS"
3947         LIBS="$glib_libs $LIBS"
3948         libs_qga="$glib_libs $libs_qga"
3949     else
3950         error_exit "glib-$glib_req_ver $i is required to compile QEMU"
3951     fi
3952 done
3953
3954 if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
3955     gio=yes
3956     gio_cflags=$($pkg_config --cflags gio-2.0)
3957     gio_libs=$($pkg_config --libs gio-2.0)
3958     gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
3959     if [ ! -x "$gdbus_codegen" ]; then
3960         gdbus_codegen=
3961     fi
3962 else
3963     gio=no
3964 fi
3965
3966 if $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
3967     gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
3968     gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
3969 fi
3970
3971 # Sanity check that the current size_t matches the
3972 # size that glib thinks it should be. This catches
3973 # problems on multi-arch where people try to build
3974 # 32-bit QEMU while pointing at 64-bit glib headers
3975 cat > $TMPC <<EOF
3976 #include <glib.h>
3977 #include <unistd.h>
3978
3979 #define QEMU_BUILD_BUG_ON(x) \
3980   typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
3981
3982 int main(void) {
3983    QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
3984    return 0;
3985 }
3986 EOF
3987
3988 if ! compile_prog "$CFLAGS" "$LIBS" ; then
3989     error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
3990                "You probably need to set PKG_CONFIG_LIBDIR"\
3991                "to point to the right pkg-config files for your"\
3992                "build target"
3993 fi
3994
3995 # Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
3996 cat > $TMPC << EOF
3997 #include <glib.h>
3998 int main(void) { return 0; }
3999 EOF
4000 if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
4001     if cc_has_warning_flag "-Wno-unknown-attributes"; then
4002         glib_cflags="-Wno-unknown-attributes $glib_cflags"
4003         CFLAGS="-Wno-unknown-attributes $CFLAGS"
4004     fi
4005 fi
4006
4007 # Silence clang warnings triggered by glib < 2.57.2
4008 cat > $TMPC << EOF
4009 #include <glib.h>
4010 typedef struct Foo {
4011     int i;
4012 } Foo;
4013 static void foo_free(Foo *f)
4014 {
4015     g_free(f);
4016 }
4017 G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free);
4018 int main(void) { return 0; }
4019 EOF
4020 if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
4021     if cc_has_warning_flag "-Wno-unused-function"; then
4022         glib_cflags="$glib_cflags -Wno-unused-function"
4023         CFLAGS="$CFLAGS -Wno-unused-function"
4024     fi
4025 fi
4026
4027 #########################################
4028 # zlib check
4029
4030 if test "$zlib" != "no" ; then
4031     if $pkg_config --exists zlib; then
4032         zlib_cflags=$($pkg_config --cflags zlib)
4033         zlib_libs=$($pkg_config --libs zlib)
4034         QEMU_CFLAGS="$zlib_cflags $QEMU_CFLAGS"
4035         LIBS="$zlib_libs $LIBS"
4036     else
4037         cat > $TMPC << EOF
4038 #include <zlib.h>
4039 int main(void) { zlibVersion(); return 0; }
4040 EOF
4041         if compile_prog "" "-lz" ; then
4042             LIBS="$LIBS -lz"
4043         else
4044             error_exit "zlib check failed" \
4045                 "Make sure to have the zlib libs and headers installed."
4046         fi
4047     fi
4048 fi
4049
4050 ##########################################
4051 # SHA command probe for modules
4052 if test "$modules" = yes; then
4053     shacmd_probe="sha1sum sha1 shasum"
4054     for c in $shacmd_probe; do
4055         if has $c; then
4056             shacmd="$c"
4057             break
4058         fi
4059     done
4060     if test "$shacmd" = ""; then
4061         error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
4062     fi
4063 fi
4064
4065 ##########################################
4066 # pixman support probe
4067
4068 if test "$softmmu" = "no"; then
4069   pixman_cflags=
4070   pixman_libs=
4071 elif $pkg_config --atleast-version=0.21.8 pixman-1 > /dev/null 2>&1; then
4072   pixman_cflags=$($pkg_config --cflags pixman-1)
4073   pixman_libs=$($pkg_config --libs pixman-1)
4074 else
4075   error_exit "pixman >= 0.21.8 not present." \
4076       "Please install the pixman devel package."
4077 fi
4078
4079 ##########################################
4080 # libmpathpersist probe
4081
4082 if test "$mpath" != "no" ; then
4083   # probe for the new API
4084   cat > $TMPC <<EOF
4085 #include <libudev.h>
4086 #include <mpath_persist.h>
4087 unsigned mpath_mx_alloc_len = 1024;
4088 int logsink;
4089 static struct config *multipath_conf;
4090 extern struct udev *udev;
4091 extern struct config *get_multipath_config(void);
4092 extern void put_multipath_config(struct config *conf);
4093 struct udev *udev;
4094 struct config *get_multipath_config(void) { return multipath_conf; }
4095 void put_multipath_config(struct config *conf) { }
4096
4097 int main(void) {
4098     udev = udev_new();
4099     multipath_conf = mpath_lib_init();
4100     return 0;
4101 }
4102 EOF
4103   if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
4104     mpathpersist=yes
4105     mpathpersist_new_api=yes
4106   else
4107     # probe for the old API
4108     cat > $TMPC <<EOF
4109 #include <libudev.h>
4110 #include <mpath_persist.h>
4111 unsigned mpath_mx_alloc_len = 1024;
4112 int logsink;
4113 int main(void) {
4114     struct udev *udev = udev_new();
4115     mpath_lib_init(udev);
4116     return 0;
4117 }
4118 EOF
4119     if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
4120       mpathpersist=yes
4121       mpathpersist_new_api=no
4122     else
4123       mpathpersist=no
4124     fi
4125   fi
4126 else
4127   mpathpersist=no
4128 fi
4129
4130 ##########################################
4131 # pthread probe
4132 PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
4133
4134 pthread=no
4135 cat > $TMPC << EOF
4136 #include <pthread.h>
4137 static void *f(void *p) { return NULL; }
4138 int main(void) {
4139   pthread_t thread;
4140   pthread_create(&thread, 0, f, 0);
4141   return 0;
4142 }
4143 EOF
4144 if compile_prog "" "" ; then
4145   pthread=yes
4146 else
4147   for pthread_lib in $PTHREADLIBS_LIST; do
4148     if compile_prog "" "$pthread_lib" ; then
4149       pthread=yes
4150       found=no
4151       for lib_entry in $LIBS; do
4152         if test "$lib_entry" = "$pthread_lib"; then
4153           found=yes
4154           break
4155         fi
4156       done
4157       if test "$found" = "no"; then
4158         LIBS="$pthread_lib $LIBS"
4159         libs_qga="$pthread_lib $libs_qga"
4160       fi
4161       PTHREAD_LIB="$pthread_lib"
4162       break
4163     fi
4164   done
4165 fi
4166
4167 if test "$mingw32" != yes && test "$pthread" = no; then
4168   error_exit "pthread check failed" \
4169       "Make sure to have the pthread libs and headers installed."
4170 fi
4171
4172 # check for pthread_setname_np with thread id
4173 pthread_setname_np_w_tid=no
4174 cat > $TMPC << EOF
4175 #include <pthread.h>
4176
4177 static void *f(void *p) { return NULL; }
4178 int main(void)
4179 {
4180     pthread_t thread;
4181     pthread_create(&thread, 0, f, 0);
4182     pthread_setname_np(thread, "QEMU");
4183     return 0;
4184 }
4185 EOF
4186 if compile_prog "" "$pthread_lib" ; then
4187   pthread_setname_np_w_tid=yes
4188 fi
4189
4190 # check for pthread_setname_np without thread id
4191 pthread_setname_np_wo_tid=no
4192 cat > $TMPC << EOF
4193 #include <pthread.h>
4194
4195 static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
4196 int main(void)
4197 {
4198     pthread_t thread;
4199     pthread_create(&thread, 0, f, 0);
4200     return 0;
4201 }
4202 EOF
4203 if compile_prog "" "$pthread_lib" ; then
4204   pthread_setname_np_wo_tid=yes
4205 fi
4206
4207 ##########################################
4208 # rbd probe
4209 if test "$rbd" != "no" ; then
4210   cat > $TMPC <<EOF
4211 #include <stdio.h>
4212 #include <rbd/librbd.h>
4213 int main(void) {
4214     rados_t cluster;
4215     rados_create(&cluster, NULL);
4216     return 0;
4217 }
4218 EOF
4219   rbd_libs="-lrbd -lrados"
4220   if compile_prog "" "$rbd_libs" ; then
4221     rbd=yes
4222   else
4223     if test "$rbd" = "yes" ; then
4224       feature_not_found "rados block device" "Install librbd/ceph devel"
4225     fi
4226     rbd=no
4227   fi
4228 fi
4229
4230 ##########################################
4231 # libssh probe
4232 if test "$libssh" != "no" ; then
4233   if $pkg_config --exists libssh; then
4234     libssh_cflags=$($pkg_config libssh --cflags)
4235     libssh_libs=$($pkg_config libssh --libs)
4236     libssh=yes
4237   else
4238     if test "$libssh" = "yes" ; then
4239       error_exit "libssh required for --enable-libssh"
4240     fi
4241     libssh=no
4242   fi
4243 fi
4244
4245 ##########################################
4246 # Check for libssh 0.8
4247 # This is done like this instead of using the LIBSSH_VERSION_* and
4248 # SSH_VERSION_* macros because some distributions in the past shipped
4249 # snapshots of the future 0.8 from Git, and those snapshots did not
4250 # have updated version numbers (still referring to 0.7.0).
4251
4252 if test "$libssh" = "yes"; then
4253   cat > $TMPC <<EOF
4254 #include <libssh/libssh.h>
4255 int main(void) { return ssh_get_server_publickey(NULL, NULL); }
4256 EOF
4257   if compile_prog "$libssh_cflags" "$libssh_libs"; then
4258     libssh_cflags="-DHAVE_LIBSSH_0_8 $libssh_cflags"
4259   fi
4260 fi
4261
4262 ##########################################
4263 # linux-aio probe
4264
4265 if test "$linux_aio" != "no" ; then
4266   cat > $TMPC <<EOF
4267 #include <libaio.h>
4268 #include <sys/eventfd.h>
4269 #include <stddef.h>
4270 int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
4271 EOF
4272   if compile_prog "" "-laio" ; then
4273     linux_aio=yes
4274   else
4275     if test "$linux_aio" = "yes" ; then
4276       feature_not_found "linux AIO" "Install libaio devel"
4277     fi
4278     linux_aio=no
4279   fi
4280 fi
4281 ##########################################
4282 # linux-io-uring probe
4283
4284 if test "$linux_io_uring" != "no" ; then
4285   if $pkg_config liburing; then
4286     linux_io_uring_cflags=$($pkg_config --cflags liburing)
4287     linux_io_uring_libs=$($pkg_config --libs liburing)
4288     linux_io_uring=yes
4289
4290     # io_uring is used in libqemuutil.a where per-file -libs variables are not
4291     # seen by programs linking the archive.  It's not ideal, but just add the
4292     # library dependency globally.
4293     LIBS="$linux_io_uring_libs $LIBS"
4294   else
4295     if test "$linux_io_uring" = "yes" ; then
4296       feature_not_found "linux io_uring" "Install liburing devel"
4297     fi
4298     linux_io_uring=no
4299   fi
4300 fi
4301
4302 ##########################################
4303 # TPM emulation is only on POSIX
4304
4305 if test "$tpm" = ""; then
4306   if test "$mingw32" = "yes"; then
4307     tpm=no
4308   else
4309     tpm=yes
4310   fi
4311 elif test "$tpm" = "yes"; then
4312   if test "$mingw32" = "yes" ; then
4313     error_exit "TPM emulation only available on POSIX systems"
4314   fi
4315 fi
4316
4317 ##########################################
4318 # attr probe
4319
4320 if test "$attr" != "no" ; then
4321   cat > $TMPC <<EOF
4322 #include <stdio.h>
4323 #include <sys/types.h>
4324 #ifdef CONFIG_LIBATTR
4325 #include <attr/xattr.h>
4326 #else
4327 #include <sys/xattr.h>
4328 #endif
4329 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }
4330 EOF
4331   if compile_prog "" "" ; then
4332     attr=yes
4333   # Older distros have <attr/xattr.h>, and need -lattr:
4334   elif compile_prog "-DCONFIG_LIBATTR" "-lattr" ; then
4335     attr=yes
4336     LIBS="-lattr $LIBS"
4337     libattr=yes
4338   else
4339     if test "$attr" = "yes" ; then
4340       feature_not_found "ATTR" "Install libc6 or libattr devel"
4341     fi
4342     attr=no
4343   fi
4344 fi
4345
4346 ##########################################
4347 # iovec probe
4348 cat > $TMPC <<EOF
4349 #include <sys/types.h>
4350 #include <sys/uio.h>
4351 #include <unistd.h>
4352 int main(void) { return sizeof(struct iovec); }
4353 EOF
4354 iovec=no
4355 if compile_prog "" "" ; then
4356   iovec=yes
4357 fi
4358
4359 ##########################################
4360 # preadv probe
4361 cat > $TMPC <<EOF
4362 #include <sys/types.h>
4363 #include <sys/uio.h>
4364 #include <unistd.h>
4365 int main(void) { return preadv(0, 0, 0, 0); }
4366 EOF
4367 preadv=no
4368 if compile_prog "" "" ; then
4369   preadv=yes
4370 fi
4371
4372 ##########################################
4373 # fdt probe
4374 # fdt support is mandatory for at least some target architectures,
4375 # so insist on it if we're building those system emulators.
4376 fdt_required=no
4377 for target in $target_list; do
4378   case $target in
4379     aarch64*-softmmu|arm*-softmmu|ppc*-softmmu|microblaze*-softmmu|mips64el-softmmu|riscv*-softmmu|rx-softmmu)
4380       fdt_required=yes
4381     ;;
4382   esac
4383 done
4384
4385 if test "$fdt_required" = "yes"; then
4386   if test "$fdt" = "no"; then
4387     error_exit "fdt disabled but some requested targets require it." \
4388       "You can turn off fdt only if you also disable all the system emulation" \
4389       "targets which need it (by specifying a cut down --target-list)."
4390   fi
4391   fdt=yes
4392 elif test "$fdt" != "yes" ; then
4393   fdt=no
4394 fi
4395
4396 # fdt is only required when building softmmu targets
4397 if test -z "$fdt" -a "$softmmu" != "yes" ; then
4398     fdt="no"
4399 fi
4400
4401 if test "$fdt" != "no" ; then
4402   fdt_libs="-lfdt"
4403   # explicitly check for libfdt_env.h as it is missing in some stable installs
4404   # and test for required functions to make sure we are on a version >= 1.4.2
4405   cat > $TMPC << EOF
4406 #include <libfdt.h>
4407 #include <libfdt_env.h>
4408 int main(void) { fdt_check_full(NULL, 0); return 0; }
4409 EOF
4410   if compile_prog "" "$fdt_libs" ; then
4411     # system DTC is good - use it
4412     fdt=system
4413   else
4414       # have GIT checkout, so activate dtc submodule
4415       if test -e "${source_path}/.git" ; then
4416           git_submodules="${git_submodules} dtc"
4417       fi
4418       if test -d "${source_path}/dtc/libfdt" || test -e "${source_path}/.git" ; then
4419           fdt=git
4420           mkdir -p dtc
4421           if [ "$pwd_is_source_path" != "y" ] ; then
4422               symlink "$source_path/dtc/Makefile" "dtc/Makefile"
4423           fi
4424           fdt_cflags="-I\$(SRC_PATH)/dtc/libfdt"
4425           fdt_ldflags="-L\$(BUILD_DIR)/dtc/libfdt"
4426           fdt_libs="$fdt_libs"
4427       elif test "$fdt" = "yes" ; then
4428           # Not a git build & no libfdt found, prompt for system install
4429           error_exit "DTC (libfdt) version >= 1.4.2 not present." \
4430                      "Please install the DTC (libfdt) devel package"
4431       else
4432           # don't have and don't want
4433           fdt_libs=
4434           fdt=no
4435       fi
4436   fi
4437 fi
4438
4439 libs_softmmu="$libs_softmmu $fdt_libs"
4440
4441 ##########################################
4442 # opengl probe (for sdl2, gtk, milkymist-tmu2)
4443
4444 gbm="no"
4445 if $pkg_config gbm; then
4446     gbm_cflags="$($pkg_config --cflags gbm)"
4447     gbm_libs="$($pkg_config --libs gbm)"
4448     gbm="yes"
4449 fi
4450
4451 if test "$opengl" != "no" ; then
4452   opengl_pkgs="epoxy gbm"
4453   if $pkg_config $opengl_pkgs; then
4454     opengl_cflags="$($pkg_config --cflags $opengl_pkgs)"
4455     opengl_libs="$($pkg_config --libs $opengl_pkgs)"
4456     opengl=yes
4457     if test "$gtk" = "yes" && $pkg_config --exists "$gtkpackage >= 3.16"; then
4458         gtk_gl="yes"
4459     fi
4460     QEMU_CFLAGS="$QEMU_CFLAGS $opengl_cflags"
4461   else
4462     if test "$opengl" = "yes" ; then
4463       feature_not_found "opengl" "Please install opengl (mesa) devel pkgs: $opengl_pkgs"
4464     fi
4465     opengl_cflags=""
4466     opengl_libs=""
4467     opengl=no
4468   fi
4469 fi
4470
4471 if test "$opengl" = "yes"; then
4472   cat > $TMPC << EOF
4473 #include <epoxy/egl.h>
4474 #ifndef EGL_MESA_image_dma_buf_export
4475 # error mesa/epoxy lacks support for dmabufs (mesa 10.6+)
4476 #endif
4477 int main(void) { return 0; }
4478 EOF
4479   if compile_prog "" "" ; then
4480     opengl_dmabuf=yes
4481   fi
4482 fi
4483
4484 if test "$opengl" = "yes" && test "$have_x11" = "yes"; then
4485   for target in $target_list; do
4486     case $target in
4487       lm32-softmmu) # milkymist-tmu2 requires X11 and OpenGL
4488         need_x11=yes
4489       ;;
4490     esac
4491   done
4492 fi
4493
4494 ##########################################
4495 # libxml2 probe
4496 if test "$libxml2" != "no" ; then
4497     if $pkg_config --exists libxml-2.0; then
4498         libxml2="yes"
4499         libxml2_cflags=$($pkg_config --cflags libxml-2.0)
4500         libxml2_libs=$($pkg_config --libs libxml-2.0)
4501     else
4502         if test "$libxml2" = "yes"; then
4503             feature_not_found "libxml2" "Install libxml2 devel"
4504         fi
4505         libxml2="no"
4506     fi
4507 fi
4508
4509 ##########################################
4510 # glusterfs probe
4511 if test "$glusterfs" != "no" ; then
4512   if $pkg_config --atleast-version=3 glusterfs-api; then
4513     glusterfs="yes"
4514     glusterfs_cflags=$($pkg_config --cflags glusterfs-api)
4515     glusterfs_libs=$($pkg_config --libs glusterfs-api)
4516     if $pkg_config --atleast-version=4 glusterfs-api; then
4517       glusterfs_xlator_opt="yes"
4518     fi
4519     if $pkg_config --atleast-version=5 glusterfs-api; then
4520       glusterfs_discard="yes"
4521     fi
4522     if $pkg_config --atleast-version=6 glusterfs-api; then
4523       glusterfs_fallocate="yes"
4524       glusterfs_zerofill="yes"
4525     fi
4526     cat > $TMPC << EOF
4527 #include <glusterfs/api/glfs.h>
4528
4529 int
4530 main(void)
4531 {
4532         /* new glfs_ftruncate() passes two additional args */
4533         return glfs_ftruncate(NULL, 0, NULL, NULL);
4534 }
4535 EOF
4536     if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
4537       glusterfs_ftruncate_has_stat="yes"
4538     fi
4539     cat > $TMPC << EOF
4540 #include <glusterfs/api/glfs.h>
4541
4542 /* new glfs_io_cbk() passes two additional glfs_stat structs */
4543 static void
4544 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
4545 {}
4546
4547 int
4548 main(void)
4549 {
4550         glfs_io_cbk iocb = &glusterfs_iocb;
4551         iocb(NULL, 0 , NULL, NULL, NULL);
4552         return 0;
4553 }
4554 EOF
4555     if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
4556       glusterfs_iocb_has_stat="yes"
4557     fi
4558   else
4559     if test "$glusterfs" = "yes" ; then
4560       feature_not_found "GlusterFS backend support" \
4561           "Install glusterfs-api devel >= 3"
4562     fi
4563     glusterfs="no"
4564   fi
4565 fi
4566
4567 # Check for inotify functions when we are building linux-user
4568 # emulator.  This is done because older glibc versions don't
4569 # have syscall stubs for these implemented.  In that case we
4570 # don't provide them even if kernel supports them.
4571 #
4572 inotify=no
4573 cat > $TMPC << EOF
4574 #include <sys/inotify.h>
4575
4576 int
4577 main(void)
4578 {
4579         /* try to start inotify */
4580         return inotify_init();
4581 }
4582 EOF
4583 if compile_prog "" "" ; then
4584   inotify=yes
4585 fi
4586
4587 inotify1=no
4588 cat > $TMPC << EOF
4589 #include <sys/inotify.h>
4590
4591 int
4592 main(void)
4593 {
4594     /* try to start inotify */
4595     return inotify_init1(0);
4596 }
4597 EOF
4598 if compile_prog "" "" ; then
4599   inotify1=yes
4600 fi
4601
4602 # check if pipe2 is there
4603 pipe2=no
4604 cat > $TMPC << EOF
4605 #include <unistd.h>
4606 #include <fcntl.h>
4607
4608 int main(void)
4609 {
4610     int pipefd[2];
4611     return pipe2(pipefd, O_CLOEXEC);
4612 }
4613 EOF
4614 if compile_prog "" "" ; then
4615   pipe2=yes
4616 fi
4617
4618 # check if accept4 is there
4619 accept4=no
4620 cat > $TMPC << EOF
4621 #include <sys/socket.h>
4622 #include <stddef.h>
4623
4624 int main(void)
4625 {
4626     accept4(0, NULL, NULL, SOCK_CLOEXEC);
4627     return 0;
4628 }
4629 EOF
4630 if compile_prog "" "" ; then
4631   accept4=yes
4632 fi
4633
4634 # check if tee/splice is there. vmsplice was added same time.
4635 splice=no
4636 cat > $TMPC << EOF
4637 #include <unistd.h>
4638 #include <fcntl.h>
4639 #include <limits.h>
4640
4641 int main(void)
4642 {
4643     int len, fd = 0;
4644     len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
4645     splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
4646     return 0;
4647 }
4648 EOF
4649 if compile_prog "" "" ; then
4650   splice=yes
4651 fi
4652
4653 ##########################################
4654 # libnuma probe
4655
4656 if test "$numa" != "no" ; then
4657   cat > $TMPC << EOF
4658 #include <numa.h>
4659 int main(void) { return numa_available(); }
4660 EOF
4661
4662   if compile_prog "" "-lnuma" ; then
4663     numa=yes
4664     libs_softmmu="-lnuma $libs_softmmu"
4665   else
4666     if test "$numa" = "yes" ; then
4667       feature_not_found "numa" "install numactl devel"
4668     fi
4669     numa=no
4670   fi
4671 fi
4672
4673 if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
4674     echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
4675     exit 1
4676 fi
4677
4678 # Even if malloc_trim() is available, these non-libc memory allocators
4679 # do not support it.
4680 if test "$tcmalloc" = "yes" || test "$jemalloc" = "yes" ; then
4681     if test "$malloc_trim" = "yes" ; then
4682         echo "Disabling malloc_trim with non-libc memory allocator"
4683     fi
4684     malloc_trim="no"
4685 fi
4686
4687 #######################################
4688 # malloc_trim
4689
4690 if test "$malloc_trim" != "no" ; then
4691     cat > $TMPC << EOF
4692 #include <malloc.h>
4693 int main(void) { malloc_trim(0); return 0; }
4694 EOF
4695     if compile_prog "" "" ; then
4696         malloc_trim="yes"
4697     else
4698         malloc_trim="no"
4699     fi
4700 fi
4701
4702 ##########################################
4703 # tcmalloc probe
4704
4705 if test "$tcmalloc" = "yes" ; then
4706   cat > $TMPC << EOF
4707 #include <stdlib.h>
4708 int main(void) {
4709     void *tmp = malloc(1);
4710     if (tmp != NULL) {
4711         return 0;
4712     }
4713     return 1;
4714 }
4715 EOF
4716
4717   if compile_prog "" "-ltcmalloc" ; then
4718     LIBS="-ltcmalloc $LIBS"
4719   else
4720     feature_not_found "tcmalloc" "install gperftools devel"
4721   fi
4722 fi
4723
4724 ##########################################
4725 # jemalloc probe
4726
4727 if test "$jemalloc" = "yes" ; then
4728   cat > $TMPC << EOF
4729 #include <stdlib.h>
4730 int main(void) {
4731     void *tmp = malloc(1);
4732     if (tmp != NULL) {
4733         return 0;
4734     }
4735     return 1;
4736 }
4737 EOF
4738
4739   if compile_prog "" "-ljemalloc" ; then
4740     LIBS="-ljemalloc $LIBS"
4741   else
4742     feature_not_found "jemalloc" "install jemalloc devel"
4743   fi
4744 fi
4745
4746 ##########################################
4747 # signalfd probe
4748 signalfd="no"
4749 cat > $TMPC << EOF
4750 #include <unistd.h>
4751 #include <sys/syscall.h>
4752 #include <signal.h>
4753 int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }
4754 EOF
4755
4756 if compile_prog "" "" ; then
4757   signalfd=yes
4758 fi
4759
4760 # check if optreset global is declared by <getopt.h>
4761 optreset="no"
4762 cat > $TMPC << EOF
4763 #include <getopt.h>
4764 int main(void) { return optreset; }
4765 EOF
4766
4767 if compile_prog "" "" ; then
4768   optreset=yes
4769 fi
4770
4771 # check if eventfd is supported
4772 eventfd=no
4773 cat > $TMPC << EOF
4774 #include <sys/eventfd.h>
4775
4776 int main(void)
4777 {
4778     return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
4779 }
4780 EOF
4781 if compile_prog "" "" ; then
4782   eventfd=yes
4783 fi
4784
4785 # check if memfd is supported
4786 memfd=no
4787 cat > $TMPC << EOF
4788 #include <sys/mman.h>
4789
4790 int main(void)
4791 {
4792     return memfd_create("foo", MFD_ALLOW_SEALING);
4793 }
4794 EOF
4795 if compile_prog "" "" ; then
4796   memfd=yes
4797 fi
4798
4799 # check for usbfs
4800 have_usbfs=no
4801 if test "$linux_user" = "yes"; then
4802   cat > $TMPC << EOF
4803 #include <linux/usbdevice_fs.h>
4804
4805 #ifndef USBDEVFS_GET_CAPABILITIES
4806 #error "USBDEVFS_GET_CAPABILITIES undefined"
4807 #endif
4808
4809 #ifndef USBDEVFS_DISCONNECT_CLAIM
4810 #error "USBDEVFS_DISCONNECT_CLAIM undefined"
4811 #endif
4812
4813 int main(void)
4814 {
4815     return 0;
4816 }
4817 EOF
4818   if compile_prog "" ""; then
4819     have_usbfs=yes
4820   fi
4821 fi
4822
4823 # check for fallocate
4824 fallocate=no
4825 cat > $TMPC << EOF
4826 #include <fcntl.h>
4827
4828 int main(void)
4829 {
4830     fallocate(0, 0, 0, 0);
4831     return 0;
4832 }
4833 EOF
4834 if compile_prog "" "" ; then
4835   fallocate=yes
4836 fi
4837
4838 # check for fallocate hole punching
4839 fallocate_punch_hole=no
4840 cat > $TMPC << EOF
4841 #include <fcntl.h>
4842 #include <linux/falloc.h>
4843
4844 int main(void)
4845 {
4846     fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
4847     return 0;
4848 }
4849 EOF
4850 if compile_prog "" "" ; then
4851   fallocate_punch_hole=yes
4852 fi
4853
4854 # check that fallocate supports range zeroing inside the file
4855 fallocate_zero_range=no
4856 cat > $TMPC << EOF
4857 #include <fcntl.h>
4858 #include <linux/falloc.h>
4859
4860 int main(void)
4861 {
4862     fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0);
4863     return 0;
4864 }
4865 EOF
4866 if compile_prog "" "" ; then
4867   fallocate_zero_range=yes
4868 fi
4869
4870 # check for posix_fallocate
4871 posix_fallocate=no
4872 cat > $TMPC << EOF
4873 #include <fcntl.h>
4874
4875 int main(void)
4876 {
4877     posix_fallocate(0, 0, 0);
4878     return 0;
4879 }
4880 EOF
4881 if compile_prog "" "" ; then
4882     posix_fallocate=yes
4883 fi
4884
4885 # check for sync_file_range
4886 sync_file_range=no
4887 cat > $TMPC << EOF
4888 #include <fcntl.h>
4889
4890 int main(void)
4891 {
4892     sync_file_range(0, 0, 0, 0);
4893     return 0;
4894 }
4895 EOF
4896 if compile_prog "" "" ; then
4897   sync_file_range=yes
4898 fi
4899
4900 # check for linux/fiemap.h and FS_IOC_FIEMAP
4901 fiemap=no
4902 cat > $TMPC << EOF
4903 #include <sys/ioctl.h>
4904 #include <linux/fs.h>
4905 #include <linux/fiemap.h>
4906
4907 int main(void)
4908 {
4909     ioctl(0, FS_IOC_FIEMAP, 0);
4910     return 0;
4911 }
4912 EOF
4913 if compile_prog "" "" ; then
4914   fiemap=yes
4915 fi
4916
4917 # check for dup3
4918 dup3=no
4919 cat > $TMPC << EOF
4920 #include <unistd.h>
4921
4922 int main(void)
4923 {
4924     dup3(0, 0, 0);
4925     return 0;
4926 }
4927 EOF
4928 if compile_prog "" "" ; then
4929   dup3=yes
4930 fi
4931
4932 # check for ppoll support
4933 ppoll=no
4934 cat > $TMPC << EOF
4935 #include <poll.h>
4936
4937 int main(void)
4938 {
4939     struct pollfd pfd = { .fd = 0, .events = 0, .revents = 0 };
4940     ppoll(&pfd, 1, 0, 0);
4941     return 0;
4942 }
4943 EOF
4944 if compile_prog "" "" ; then
4945   ppoll=yes
4946 fi
4947
4948 # check for prctl(PR_SET_TIMERSLACK , ... ) support
4949 prctl_pr_set_timerslack=no
4950 cat > $TMPC << EOF
4951 #include <sys/prctl.h>
4952
4953 int main(void)
4954 {
4955     prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0);
4956     return 0;
4957 }
4958 EOF
4959 if compile_prog "" "" ; then
4960   prctl_pr_set_timerslack=yes
4961 fi
4962
4963 # check for epoll support
4964 epoll=no
4965 cat > $TMPC << EOF
4966 #include <sys/epoll.h>
4967
4968 int main(void)
4969 {
4970     epoll_create(0);
4971     return 0;
4972 }
4973 EOF
4974 if compile_prog "" "" ; then
4975   epoll=yes
4976 fi
4977
4978 # epoll_create1 is a later addition
4979 # so we must check separately for its presence
4980 epoll_create1=no
4981 cat > $TMPC << EOF
4982 #include <sys/epoll.h>
4983
4984 int main(void)
4985 {
4986     /* Note that we use epoll_create1 as a value, not as
4987      * a function being called. This is necessary so that on
4988      * old SPARC glibc versions where the function was present in
4989      * the library but not declared in the header file we will
4990      * fail the configure check. (Otherwise we will get a compiler
4991      * warning but not an error, and will proceed to fail the
4992      * qemu compile where we compile with -Werror.)
4993      */
4994     return (int)(uintptr_t)&epoll_create1;
4995 }
4996 EOF
4997 if compile_prog "" "" ; then
4998   epoll_create1=yes
4999 fi
5000
5001 # check for sendfile support
5002 sendfile=no
5003 cat > $TMPC << EOF
5004 #include <sys/sendfile.h>
5005
5006 int main(void)
5007 {
5008     return sendfile(0, 0, 0, 0);
5009 }
5010 EOF
5011 if compile_prog "" "" ; then
5012   sendfile=yes
5013 fi
5014
5015 # check for timerfd support (glibc 2.8 and newer)
5016 timerfd=no
5017 cat > $TMPC << EOF
5018 #include <sys/timerfd.h>
5019
5020 int main(void)
5021 {
5022     return(timerfd_create(CLOCK_REALTIME, 0));
5023 }
5024 EOF
5025 if compile_prog "" "" ; then
5026   timerfd=yes
5027 fi
5028
5029 # check for setns and unshare support
5030 setns=no
5031 cat > $TMPC << EOF
5032 #include <sched.h>
5033
5034 int main(void)
5035 {
5036     int ret;
5037     ret = setns(0, 0);
5038     ret = unshare(0);
5039     return ret;
5040 }
5041 EOF
5042 if compile_prog "" "" ; then
5043   setns=yes
5044 fi
5045
5046 # clock_adjtime probe
5047 clock_adjtime=no
5048 cat > $TMPC <<EOF
5049 #include <time.h>
5050
5051 int main(void)
5052 {
5053     return clock_adjtime(0, 0);
5054 }
5055 EOF
5056 clock_adjtime=no
5057 if compile_prog "" "" ; then
5058   clock_adjtime=yes
5059 fi
5060
5061 # syncfs probe
5062 syncfs=no
5063 cat > $TMPC <<EOF
5064 #include <unistd.h>
5065
5066 int main(void)
5067 {
5068     return syncfs(0);
5069 }
5070 EOF
5071 syncfs=no
5072 if compile_prog "" "" ; then
5073   syncfs=yes
5074 fi
5075
5076 # check for kcov support (kernel must be 4.4+, compiled with certain options)
5077 kcov=no
5078 if check_include sys/kcov.h ; then
5079     kcov=yes
5080 fi
5081
5082 # If we're making warnings fatal, apply this to Sphinx runs as well
5083 sphinx_werror=""
5084 if test "$werror" = "yes"; then
5085     sphinx_werror="-W"
5086 fi
5087
5088 # Check we have a new enough version of sphinx-build
5089 has_sphinx_build() {
5090     # This is a bit awkward but works: create a trivial document and
5091     # try to run it with our configuration file (which enforces a
5092     # version requirement). This will fail if either
5093     # sphinx-build doesn't exist at all or if it is too old.
5094     mkdir -p "$TMPDIR1/sphinx"
5095     touch "$TMPDIR1/sphinx/index.rst"
5096     "$sphinx_build" $sphinx_werror -c "$source_path/docs" \
5097                     -b html "$TMPDIR1/sphinx" \
5098                     "$TMPDIR1/sphinx/out"  >> config.log 2>&1
5099 }
5100
5101 # Check if tools are available to build documentation.
5102 if test "$docs" != "no" ; then
5103   if has_sphinx_build; then
5104     sphinx_ok=yes
5105   else
5106     sphinx_ok=no
5107   fi
5108   if has makeinfo && has pod2man && test "$sphinx_ok" = "yes"; then
5109     docs=yes
5110   else
5111     if test "$docs" = "yes" ; then
5112       if has $sphinx_build && test "$sphinx_ok" != "yes"; then
5113         echo "Warning: $sphinx_build exists but it is either too old or uses too old a Python version" >&2
5114       fi
5115       feature_not_found "docs" "Install texinfo, Perl/perl-podlators and a Python 3 version of python-sphinx"
5116     fi
5117     docs=no
5118   fi
5119 fi
5120
5121 # Search for bswap_32 function
5122 byteswap_h=no
5123 cat > $TMPC << EOF
5124 #include <byteswap.h>
5125 int main(void) { return bswap_32(0); }
5126 EOF
5127 if compile_prog "" "" ; then
5128   byteswap_h=yes
5129 fi
5130
5131 # Search for bswap32 function
5132 bswap_h=no
5133 cat > $TMPC << EOF
5134 #include <sys/endian.h>
5135 #include <sys/types.h>
5136 #include <machine/bswap.h>
5137 int main(void) { return bswap32(0); }
5138 EOF
5139 if compile_prog "" "" ; then
5140   bswap_h=yes
5141 fi
5142
5143 ##########################################
5144 # Do we have libiscsi >= 1.9.0
5145 if test "$libiscsi" != "no" ; then
5146   if $pkg_config --atleast-version=1.9.0 libiscsi; then
5147     libiscsi="yes"
5148     libiscsi_cflags=$($pkg_config --cflags libiscsi)
5149     libiscsi_libs=$($pkg_config --libs libiscsi)
5150   else
5151     if test "$libiscsi" = "yes" ; then
5152       feature_not_found "libiscsi" "Install libiscsi >= 1.9.0"
5153     fi
5154     libiscsi="no"
5155   fi
5156 fi
5157
5158 ##########################################
5159 # Do we need libm
5160 cat > $TMPC << EOF
5161 #include <math.h>
5162 int main(int argc, char **argv) { return isnan(sin((double)argc)); }
5163 EOF
5164 if compile_prog "" "" ; then
5165   :
5166 elif compile_prog "" "-lm" ; then
5167   LIBS="-lm $LIBS"
5168   libs_qga="-lm $libs_qga"
5169 else
5170   error_exit "libm check failed"
5171 fi
5172
5173 ##########################################
5174 # Do we need librt
5175 # uClibc provides 2 versions of clock_gettime(), one with realtime
5176 # support and one without. This means that the clock_gettime() don't
5177 # need -lrt. We still need it for timer_create() so we check for this
5178 # function in addition.
5179 cat > $TMPC <<EOF
5180 #include <signal.h>
5181 #include <time.h>
5182 int main(void) {
5183   timer_create(CLOCK_REALTIME, NULL, NULL);
5184   return clock_gettime(CLOCK_REALTIME, NULL);
5185 }
5186 EOF
5187
5188 if compile_prog "" "" ; then
5189   :
5190 # we need pthread for static linking. use previous pthread test result
5191 elif compile_prog "" "$pthread_lib -lrt" ; then
5192   LIBS="$LIBS -lrt"
5193   libs_qga="$libs_qga -lrt"
5194 fi
5195
5196 # Check whether we need to link libutil for openpty()
5197 cat > $TMPC << EOF
5198 extern int openpty(int *am, int *as, char *name, void *termp, void *winp);
5199 int main(void) { return openpty(0, 0, 0, 0, 0); }
5200 EOF
5201
5202 have_openpty="no"
5203 if compile_prog "" "" ; then
5204   have_openpty="yes"
5205 else
5206   if compile_prog "" "-lutil" ; then
5207     libs_softmmu="-lutil $libs_softmmu"
5208     libs_tools="-lutil $libs_tools"
5209     have_openpty="yes"
5210   fi
5211 fi
5212
5213 ##########################################
5214 # spice probe
5215 if test "$spice" != "no" ; then
5216   cat > $TMPC << EOF
5217 #include <spice.h>
5218 int main(void) { spice_server_new(); return 0; }
5219 EOF
5220   spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
5221   spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
5222   if $pkg_config --atleast-version=0.12.5 spice-server && \
5223      $pkg_config --atleast-version=0.12.3 spice-protocol && \
5224      compile_prog "$spice_cflags" "$spice_libs" ; then
5225     spice="yes"
5226     libs_softmmu="$libs_softmmu $spice_libs"
5227     QEMU_CFLAGS="$QEMU_CFLAGS $spice_cflags"
5228     spice_protocol_version=$($pkg_config --modversion spice-protocol)
5229     spice_server_version=$($pkg_config --modversion spice-server)
5230   else
5231     if test "$spice" = "yes" ; then
5232       feature_not_found "spice" \
5233           "Install spice-server(>=0.12.5) and spice-protocol(>=0.12.3) devel"
5234     fi
5235     spice="no"
5236   fi
5237 fi
5238
5239 # check for smartcard support
5240 if test "$smartcard" != "no"; then
5241     if $pkg_config --atleast-version=2.5.1 libcacard; then
5242         libcacard_cflags=$($pkg_config --cflags libcacard)
5243         libcacard_libs=$($pkg_config --libs libcacard)
5244         smartcard="yes"
5245     else
5246         if test "$smartcard" = "yes"; then
5247             feature_not_found "smartcard" "Install libcacard devel"
5248         fi
5249         smartcard="no"
5250     fi
5251 fi
5252
5253 # check for libusb
5254 if test "$libusb" != "no" ; then
5255     if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
5256         libusb="yes"
5257         libusb_cflags=$($pkg_config --cflags libusb-1.0)
5258         libusb_libs=$($pkg_config --libs libusb-1.0)
5259     else
5260         if test "$libusb" = "yes"; then
5261             feature_not_found "libusb" "Install libusb devel >= 1.0.13"
5262         fi
5263         libusb="no"
5264     fi
5265 fi
5266
5267 # check for usbredirparser for usb network redirection support
5268 if test "$usb_redir" != "no" ; then
5269     if $pkg_config --atleast-version=0.6 libusbredirparser-0.5; then
5270         usb_redir="yes"
5271         usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5)
5272         usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5)
5273     else
5274         if test "$usb_redir" = "yes"; then
5275             feature_not_found "usb-redir" "Install usbredir devel"
5276         fi
5277         usb_redir="no"
5278     fi
5279 fi
5280
5281 ##########################################
5282 # check if we have VSS SDK headers for win
5283
5284 if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
5285         test "$vss_win32_sdk" != "no" ; then
5286   case "$vss_win32_sdk" in
5287     "")   vss_win32_include="-isystem $source_path" ;;
5288     *\ *) # The SDK is installed in "Program Files" by default, but we cannot
5289           # handle path with spaces. So we symlink the headers into ".sdk/vss".
5290           vss_win32_include="-isystem $source_path/.sdk/vss"
5291           symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
5292           ;;
5293     *)    vss_win32_include="-isystem $vss_win32_sdk"
5294   esac
5295   cat > $TMPC << EOF
5296 #define __MIDL_user_allocate_free_DEFINED__
5297 #include <inc/win2003/vss.h>
5298 int main(void) { return VSS_CTX_BACKUP; }
5299 EOF
5300   if compile_prog "$vss_win32_include" "" ; then
5301     guest_agent_with_vss="yes"
5302     QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
5303     libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
5304     qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
5305   else
5306     if test "$vss_win32_sdk" != "" ; then
5307       echo "ERROR: Please download and install Microsoft VSS SDK:"
5308       echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
5309       echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
5310       echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
5311       echo "ERROR: The headers are extracted in the directory \`inc'."
5312       feature_not_found "VSS support"
5313     fi
5314     guest_agent_with_vss="no"
5315   fi
5316 fi
5317
5318 ##########################################
5319 # lookup Windows platform SDK (if not specified)
5320 # The SDK is needed only to build .tlb (type library) file of guest agent
5321 # VSS provider from the source. It is usually unnecessary because the
5322 # pre-compiled .tlb file is included.
5323
5324 if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
5325         test "$guest_agent_with_vss" = "yes" ; then
5326   if test -z "$win_sdk"; then
5327     programfiles="$PROGRAMFILES"
5328     test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
5329     if test -n "$programfiles"; then
5330       win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
5331     else
5332       feature_not_found "Windows SDK"
5333     fi
5334   elif test "$win_sdk" = "no"; then
5335     win_sdk=""
5336   fi
5337 fi
5338
5339 ##########################################
5340 # check if mingw environment provides a recent ntddscsi.h
5341 if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
5342   cat > $TMPC << EOF
5343 #include <windows.h>
5344 #include <ntddscsi.h>
5345 int main(void) {
5346 #if !defined(IOCTL_SCSI_GET_ADDRESS)
5347 #error Missing required ioctl definitions
5348 #endif
5349   SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
5350   return addr.Lun;
5351 }
5352 EOF
5353   if compile_prog "" "" ; then
5354     guest_agent_ntddscsi=yes
5355     libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
5356   fi
5357 fi
5358
5359 ##########################################
5360 # virgl renderer probe
5361
5362 if test "$virglrenderer" != "no" ; then
5363   cat > $TMPC << EOF
5364 #include <virglrenderer.h>
5365 int main(void) { virgl_renderer_poll(); return 0; }
5366 EOF
5367   virgl_cflags=$($pkg_config --cflags virglrenderer 2>/dev/null)
5368   virgl_libs=$($pkg_config --libs virglrenderer 2>/dev/null)
5369   virgl_version=$($pkg_config --modversion virglrenderer 2>/dev/null)
5370   if $pkg_config virglrenderer >/dev/null 2>&1 && \
5371      compile_prog "$virgl_cflags" "$virgl_libs" ; then
5372     virglrenderer="yes"
5373   else
5374     if test "$virglrenderer" = "yes" ; then
5375       feature_not_found "virglrenderer"
5376     fi
5377     virglrenderer="no"
5378   fi
5379 fi
5380
5381 ##########################################
5382 # capstone
5383
5384 case "$capstone" in
5385   "" | yes)
5386     if $pkg_config capstone; then
5387       capstone=system
5388     elif test -e "${source_path}/.git" && test $git_update = 'yes' ; then
5389       capstone=git
5390     elif test -e "${source_path}/capstone/Makefile" ; then
5391       capstone=internal
5392     elif test -z "$capstone" ; then
5393       capstone=no
5394     else
5395       feature_not_found "capstone" "Install capstone devel or git submodule"
5396     fi
5397     ;;
5398
5399   system)
5400     if ! $pkg_config capstone; then
5401       feature_not_found "capstone" "Install capstone devel"
5402     fi
5403     ;;
5404 esac
5405
5406 case "$capstone" in
5407   git | internal)
5408     if test "$capstone" = git; then
5409       git_submodules="${git_submodules} capstone"
5410     fi
5411     mkdir -p capstone
5412     QEMU_CFLAGS="$QEMU_CFLAGS -I\$(SRC_PATH)/capstone/include"
5413     if test "$mingw32" = "yes"; then
5414       LIBCAPSTONE=capstone.lib
5415     else
5416       LIBCAPSTONE=libcapstone.a
5417     fi
5418     libs_cpu="-L\$(BUILD_DIR)/capstone -lcapstone $libs_cpu"
5419     ;;
5420
5421   system)
5422     QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags capstone)"
5423     libs_cpu="$($pkg_config --libs capstone) $libs_cpu"
5424     ;;
5425
5426   no)
5427     ;;
5428   *)
5429     error_exit "Unknown state for capstone: $capstone"
5430     ;;
5431 esac
5432
5433 ##########################################
5434 # check if we have fdatasync
5435
5436 fdatasync=no
5437 cat > $TMPC << EOF
5438 #include <unistd.h>
5439 int main(void) {
5440 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
5441 return fdatasync(0);
5442 #else
5443 #error Not supported
5444 #endif
5445 }
5446 EOF
5447 if compile_prog "" "" ; then
5448     fdatasync=yes
5449 fi
5450
5451 ##########################################
5452 # check if we have madvise
5453
5454 madvise=no
5455 cat > $TMPC << EOF
5456 #include <sys/types.h>
5457 #include <sys/mman.h>
5458 #include <stddef.h>
5459 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }
5460 EOF
5461 if compile_prog "" "" ; then
5462     madvise=yes
5463 fi
5464
5465 ##########################################
5466 # check if we have posix_madvise
5467
5468 posix_madvise=no
5469 cat > $TMPC << EOF
5470 #include <sys/mman.h>
5471 #include <stddef.h>
5472 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }
5473 EOF
5474 if compile_prog "" "" ; then
5475     posix_madvise=yes
5476 fi
5477
5478 ##########################################
5479 # check if we have posix_memalign()
5480
5481 posix_memalign=no
5482 cat > $TMPC << EOF
5483 #include <stdlib.h>
5484 int main(void) {
5485     void *p;
5486     return posix_memalign(&p, 8, 8);
5487 }
5488 EOF
5489 if compile_prog "" "" ; then
5490     posix_memalign=yes
5491 fi
5492
5493 ##########################################
5494 # check if we have posix_syslog
5495
5496 posix_syslog=no
5497 cat > $TMPC << EOF
5498 #include <syslog.h>
5499 int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; }
5500 EOF
5501 if compile_prog "" "" ; then
5502     posix_syslog=yes
5503 fi
5504
5505 ##########################################
5506 # check if we have sem_timedwait
5507
5508 sem_timedwait=no
5509 cat > $TMPC << EOF
5510 #include <semaphore.h>
5511 int main(void) { sem_t s; struct timespec t = {0}; return sem_timedwait(&s, &t); }
5512 EOF
5513 if compile_prog "" "" ; then
5514     sem_timedwait=yes
5515 fi
5516
5517 ##########################################
5518 # check if we have strchrnul
5519
5520 strchrnul=no
5521 cat > $TMPC << EOF
5522 #include <string.h>
5523 int main(void);
5524 // Use a haystack that the compiler shouldn't be able to constant fold
5525 char *haystack = (char*)&main;
5526 int main(void) { return strchrnul(haystack, 'x') != &haystack[6]; }
5527 EOF
5528 if compile_prog "" "" ; then
5529     strchrnul=yes
5530 fi
5531
5532 #########################################
5533 # check if we have st_atim
5534
5535 st_atim=no
5536 cat > $TMPC << EOF
5537 #include <sys/stat.h>
5538 #include <stddef.h>
5539 int main(void) { return offsetof(struct stat, st_atim); }
5540 EOF
5541 if compile_prog "" "" ; then
5542     st_atim=yes
5543 fi
5544
5545 ##########################################
5546 # check if trace backend exists
5547
5548 $python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
5549 if test "$?" -ne 0 ; then
5550   error_exit "invalid trace backends" \
5551       "Please choose supported trace backends."
5552 fi
5553
5554 ##########################################
5555 # For 'ust' backend, test if ust headers are present
5556 if have_backend "ust"; then
5557   cat > $TMPC << EOF
5558 #include <lttng/tracepoint.h>
5559 int main(void) { return 0; }
5560 EOF
5561   if compile_prog "" "-Wl,--no-as-needed -ldl" ; then
5562     if $pkg_config lttng-ust --exists; then
5563       lttng_ust_libs=$($pkg_config --libs lttng-ust)
5564     else
5565       lttng_ust_libs="-llttng-ust -ldl"
5566     fi
5567     if $pkg_config liburcu-bp --exists; then
5568       urcu_bp_libs=$($pkg_config --libs liburcu-bp)
5569     else
5570       urcu_bp_libs="-lurcu-bp"
5571     fi
5572
5573     LIBS="$lttng_ust_libs $urcu_bp_libs $LIBS"
5574     libs_qga="$lttng_ust_libs $urcu_bp_libs $libs_qga"
5575   else
5576     error_exit "Trace backend 'ust' missing lttng-ust header files"
5577   fi
5578 fi
5579
5580 ##########################################
5581 # For 'dtrace' backend, test if 'dtrace' command is present
5582 if have_backend "dtrace"; then
5583   if ! has 'dtrace' ; then
5584     error_exit "dtrace command is not found in PATH $PATH"
5585   fi
5586   trace_backend_stap="no"
5587   if has 'stap' ; then
5588     trace_backend_stap="yes"
5589   fi
5590 fi
5591
5592 ##########################################
5593 # check and set a backend for coroutine
5594
5595 # We prefer ucontext, but it's not always possible. The fallback
5596 # is sigcontext. On Windows the only valid backend is the Windows
5597 # specific one.
5598
5599 ucontext_works=no
5600 if test "$darwin" != "yes"; then
5601   cat > $TMPC << EOF
5602 #include <ucontext.h>
5603 #ifdef __stub_makecontext
5604 #error Ignoring glibc stub makecontext which will always fail
5605 #endif
5606 int main(void) { makecontext(0, 0, 0); return 0; }
5607 EOF
5608   if compile_prog "" "" ; then
5609     ucontext_works=yes
5610   fi
5611 fi
5612
5613 if test "$coroutine" = ""; then
5614   if test "$mingw32" = "yes"; then
5615     coroutine=win32
5616   elif test "$ucontext_works" = "yes"; then
5617     coroutine=ucontext
5618   else
5619     coroutine=sigaltstack
5620   fi
5621 else
5622   case $coroutine in
5623   windows)
5624     if test "$mingw32" != "yes"; then
5625       error_exit "'windows' coroutine backend only valid for Windows"
5626     fi
5627     # Unfortunately the user visible backend name doesn't match the
5628     # coroutine-*.c filename for this case, so we have to adjust it here.
5629     coroutine=win32
5630     ;;
5631   ucontext)
5632     if test "$ucontext_works" != "yes"; then
5633       feature_not_found "ucontext"
5634     fi
5635     ;;
5636   sigaltstack)
5637     if test "$mingw32" = "yes"; then
5638       error_exit "only the 'windows' coroutine backend is valid for Windows"
5639     fi
5640     ;;
5641   *)
5642     error_exit "unknown coroutine backend $coroutine"
5643     ;;
5644   esac
5645 fi
5646
5647 if test "$coroutine_pool" = ""; then
5648   coroutine_pool=yes
5649 fi
5650
5651 if test "$debug_stack_usage" = "yes"; then
5652   if test "$coroutine_pool" = "yes"; then
5653     echo "WARN: disabling coroutine pool for stack usage debugging"
5654     coroutine_pool=no
5655   fi
5656 fi
5657
5658 ##################################################
5659 # SafeStack
5660
5661
5662 if test "$safe_stack" = "yes"; then
5663 cat > $TMPC << EOF
5664 int main(int argc, char *argv[])
5665 {
5666 #if ! __has_feature(safe_stack)
5667 #error SafeStack Disabled
5668 #endif
5669     return 0;
5670 }
5671 EOF
5672   flag="-fsanitize=safe-stack"
5673   # Check that safe-stack is supported and enabled.
5674   if compile_prog "-Werror $flag" "$flag"; then
5675     # Flag needed both at compilation and at linking
5676     QEMU_CFLAGS="$QEMU_CFLAGS $flag"
5677     QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
5678   else
5679     error_exit "SafeStack not supported by your compiler"
5680   fi
5681   if test "$coroutine" != "ucontext"; then
5682     error_exit "SafeStack is only supported by the coroutine backend ucontext"
5683   fi
5684 else
5685 cat > $TMPC << EOF
5686 int main(int argc, char *argv[])
5687 {
5688 #if defined(__has_feature)
5689 #if __has_feature(safe_stack)
5690 #error SafeStack Enabled
5691 #endif
5692 #endif
5693     return 0;
5694 }
5695 EOF
5696 if test "$safe_stack" = "no"; then
5697   # Make sure that safe-stack is disabled
5698   if ! compile_prog "-Werror" ""; then
5699     # SafeStack was already enabled, try to explicitly remove the feature
5700     flag="-fno-sanitize=safe-stack"
5701     if ! compile_prog "-Werror $flag" "$flag"; then
5702       error_exit "Configure cannot disable SafeStack"
5703     fi
5704     QEMU_CFLAGS="$QEMU_CFLAGS $flag"
5705     QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
5706   fi
5707 else # "$safe_stack" = ""
5708   # Set safe_stack to yes or no based on pre-existing flags
5709   if compile_prog "-Werror" ""; then
5710     safe_stack="no"
5711   else
5712     safe_stack="yes"
5713     if test "$coroutine" != "ucontext"; then
5714       error_exit "SafeStack is only supported by the coroutine backend ucontext"
5715     fi
5716   fi
5717 fi
5718 fi
5719
5720 ##########################################
5721 # check if we have open_by_handle_at
5722
5723 open_by_handle_at=no
5724 cat > $TMPC << EOF
5725 #include <fcntl.h>
5726 #if !defined(AT_EMPTY_PATH)
5727 # error missing definition
5728 #else
5729 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
5730 #endif
5731 EOF
5732 if compile_prog "" "" ; then
5733     open_by_handle_at=yes
5734 fi
5735
5736 ########################################
5737 # check if we have linux/magic.h
5738
5739 linux_magic_h=no
5740 cat > $TMPC << EOF
5741 #include <linux/magic.h>
5742 int main(void) {
5743   return 0;
5744 }
5745 EOF
5746 if compile_prog "" "" ; then
5747     linux_magic_h=yes
5748 fi
5749
5750 ########################################
5751 # check if we have valgrind/valgrind.h
5752
5753 valgrind_h=no
5754 cat > $TMPC << EOF
5755 #include <valgrind/valgrind.h>
5756 int main(void) {
5757   return 0;
5758 }
5759 EOF
5760 if compile_prog "" "" ; then
5761     valgrind_h=yes
5762 fi
5763
5764 ########################################
5765 # check if environ is declared
5766
5767 has_environ=no
5768 cat > $TMPC << EOF
5769 #include <unistd.h>
5770 int main(void) {
5771     environ = 0;
5772     return 0;
5773 }
5774 EOF
5775 if compile_prog "" "" ; then
5776     has_environ=yes
5777 fi
5778
5779 ########################################
5780 # check if cpuid.h is usable.
5781
5782 cat > $TMPC << EOF
5783 #include <cpuid.h>
5784 int main(void) {
5785     unsigned a, b, c, d;
5786     int max = __get_cpuid_max(0, 0);
5787
5788     if (max >= 1) {
5789         __cpuid(1, a, b, c, d);
5790     }
5791
5792     if (max >= 7) {
5793         __cpuid_count(7, 0, a, b, c, d);
5794     }
5795
5796     return 0;
5797 }
5798 EOF
5799 if compile_prog "" "" ; then
5800     cpuid_h=yes
5801 fi
5802
5803 ##########################################
5804 # avx2 optimization requirement check
5805 #
5806 # There is no point enabling this if cpuid.h is not usable,
5807 # since we won't be able to select the new routines.
5808
5809 if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
5810   cat > $TMPC << EOF
5811 #pragma GCC push_options
5812 #pragma GCC target("avx2")
5813 #include <cpuid.h>
5814 #include <immintrin.h>
5815 static int bar(void *a) {
5816     __m256i x = *(__m256i *)a;
5817     return _mm256_testz_si256(x, x);
5818 }
5819 int main(int argc, char *argv[]) { return bar(argv[0]); }
5820 EOF
5821   if compile_object "" ; then
5822     avx2_opt="yes"
5823   else
5824     avx2_opt="no"
5825   fi
5826 fi
5827
5828 ##########################################
5829 # avx512f optimization requirement check
5830 #
5831 # There is no point enabling this if cpuid.h is not usable,
5832 # since we won't be able to select the new routines.
5833 # by default, it is turned off.
5834 # if user explicitly want to enable it, check environment
5835
5836 if test "$cpuid_h" = "yes" && test "$avx512f_opt" = "yes"; then
5837   cat > $TMPC << EOF
5838 #pragma GCC push_options
5839 #pragma GCC target("avx512f")
5840 #include <cpuid.h>
5841 #include <immintrin.h>
5842 static int bar(void *a) {
5843     __m512i x = *(__m512i *)a;
5844     return _mm512_test_epi64_mask(x, x);
5845 }
5846 int main(int argc, char *argv[])
5847 {
5848         return bar(argv[0]);
5849 }
5850 EOF
5851   if ! compile_object "" ; then
5852     avx512f_opt="no"
5853   fi
5854 else
5855   avx512f_opt="no"
5856 fi
5857
5858 ########################################
5859 # check if __[u]int128_t is usable.
5860
5861 int128=no
5862 cat > $TMPC << EOF
5863 __int128_t a;
5864 __uint128_t b;
5865 int main (void) {
5866   a = a + b;
5867   b = a * b;
5868   a = a * a;
5869   return 0;
5870 }
5871 EOF
5872 if compile_prog "" "" ; then
5873     int128=yes
5874 fi
5875
5876 #########################################
5877 # See if 128-bit atomic operations are supported.
5878
5879 atomic128=no
5880 if test "$int128" = "yes"; then
5881   cat > $TMPC << EOF
5882 int main(void)
5883 {
5884   unsigned __int128 x = 0, y = 0;
5885   y = __atomic_load_16(&x, 0);
5886   __atomic_store_16(&x, y, 0);
5887   __atomic_compare_exchange_16(&x, &y, x, 0, 0, 0);
5888   return 0;
5889 }
5890 EOF
5891   if compile_prog "" "" ; then
5892     atomic128=yes
5893   fi
5894 fi
5895
5896 cmpxchg128=no
5897 if test "$int128" = yes && test "$atomic128" = no; then
5898   cat > $TMPC << EOF
5899 int main(void)
5900 {
5901   unsigned __int128 x = 0, y = 0;
5902   __sync_val_compare_and_swap_16(&x, y, x);
5903   return 0;
5904 }
5905 EOF
5906   if compile_prog "" "" ; then
5907     cmpxchg128=yes
5908   fi
5909 fi
5910
5911 #########################################
5912 # See if 64-bit atomic operations are supported.
5913 # Note that without __atomic builtins, we can only
5914 # assume atomic loads/stores max at pointer size.
5915
5916 cat > $TMPC << EOF
5917 #include <stdint.h>
5918 int main(void)
5919 {
5920   uint64_t x = 0, y = 0;
5921 #ifdef __ATOMIC_RELAXED
5922   y = __atomic_load_8(&x, 0);
5923   __atomic_store_8(&x, y, 0);
5924   __atomic_compare_exchange_8(&x, &y, x, 0, 0, 0);
5925   __atomic_exchange_8(&x, y, 0);
5926   __atomic_fetch_add_8(&x, y, 0);
5927 #else
5928   typedef char is_host64[sizeof(void *) >= sizeof(uint64_t) ? 1 : -1];
5929   __sync_lock_test_and_set(&x, y);
5930   __sync_val_compare_and_swap(&x, y, 0);
5931   __sync_fetch_and_add(&x, y);
5932 #endif
5933   return 0;
5934 }
5935 EOF
5936 if compile_prog "" "" ; then
5937   atomic64=yes
5938 fi
5939
5940 #########################################
5941 # See if --dynamic-list is supported by the linker
5942 ld_dynamic_list="no"
5943 if test "$static" = "no" ; then
5944     cat > $TMPTXT <<EOF
5945 {
5946   foo;
5947 };
5948 EOF
5949
5950     cat > $TMPC <<EOF
5951 #include <stdio.h>
5952 void foo(void);
5953
5954 void foo(void)
5955 {
5956   printf("foo\n");
5957 }
5958
5959 int main(void)
5960 {
5961   foo();
5962   return 0;
5963 }
5964 EOF
5965
5966     if compile_prog "" "-Wl,--dynamic-list=$TMPTXT" ; then
5967         ld_dynamic_list="yes"
5968     fi
5969 fi
5970
5971 #########################################
5972 # See if -exported_symbols_list is supported by the linker
5973
5974 ld_exported_symbols_list="no"
5975 if test "$static" = "no" ; then
5976     cat > $TMPTXT <<EOF
5977   _foo
5978 EOF
5979
5980     if compile_prog "" "-Wl,-exported_symbols_list,$TMPTXT" ; then
5981         ld_exported_symbols_list="yes"
5982     fi
5983 fi
5984
5985 if  test "$plugins" = "yes" &&
5986     test "$ld_dynamic_list" = "no" &&
5987     test "$ld_exported_symbols_list" = "no" ; then
5988   error_exit \
5989       "Plugin support requires dynamic linking and specifying a set of symbols " \
5990       "that are exported to plugins. Unfortunately your linker doesn't " \
5991       "support the flag (--dynamic-list or -exported_symbols_list) used " \
5992       "for this purpose. You can't build with --static."
5993 fi
5994
5995 ########################################
5996 # See if __attribute__((alias)) is supported.
5997 # This false for Xcode 9, but has been remedied for Xcode 10.
5998 # Unfortunately, travis uses Xcode 9 by default.
5999
6000 attralias=no
6001 cat > $TMPC << EOF
6002 int x = 1;
6003 extern const int y __attribute__((alias("x")));
6004 int main(void) { return 0; }
6005 EOF
6006 if compile_prog "" "" ; then
6007     attralias=yes
6008 fi
6009
6010 ########################################
6011 # check if getauxval is available.
6012
6013 getauxval=no
6014 cat > $TMPC << EOF
6015 #include <sys/auxv.h>
6016 int main(void) {
6017   return getauxval(AT_HWCAP) == 0;
6018 }
6019 EOF
6020 if compile_prog "" "" ; then
6021     getauxval=yes
6022 fi
6023
6024 ########################################
6025 # check if ccache is interfering with
6026 # semantic analysis of macros
6027
6028 unset CCACHE_CPP2
6029 ccache_cpp2=no
6030 cat > $TMPC << EOF
6031 static const int Z = 1;
6032 #define fn() ({ Z; })
6033 #define TAUT(X) ((X) == Z)
6034 #define PAREN(X, Y) (X == Y)
6035 #define ID(X) (X)
6036 int main(int argc, char *argv[])
6037 {
6038     int x = 0, y = 0;
6039     x = ID(x);
6040     x = fn();
6041     fn();
6042     if (PAREN(x, y)) return 0;
6043     if (TAUT(Z)) return 0;
6044     return 0;
6045 }
6046 EOF
6047
6048 if ! compile_object "-Werror"; then
6049     ccache_cpp2=yes
6050 fi
6051
6052 #################################################
6053 # clang does not support glibc + FORTIFY_SOURCE.
6054
6055 if test "$fortify_source" != "no"; then
6056   if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
6057     fortify_source="no";
6058   elif test -n "$cxx" && has $cxx &&
6059        echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
6060     fortify_source="no";
6061   else
6062     fortify_source="yes"
6063   fi
6064 fi
6065
6066 ###############################################
6067 # Check if copy_file_range is provided by glibc
6068 have_copy_file_range=no
6069 cat > $TMPC << EOF
6070 #include <unistd.h>
6071 int main(void) {
6072   copy_file_range(0, NULL, 0, NULL, 0, 0);
6073   return 0;
6074 }
6075 EOF
6076 if compile_prog "" "" ; then
6077     have_copy_file_range=yes
6078 fi
6079
6080 ##########################################
6081 # check if struct fsxattr is available via linux/fs.h
6082
6083 have_fsxattr=no
6084 cat > $TMPC << EOF
6085 #include <linux/fs.h>
6086 struct fsxattr foo;
6087 int main(void) {
6088   return 0;
6089 }
6090 EOF
6091 if compile_prog "" "" ; then
6092     have_fsxattr=yes
6093 fi
6094
6095 ##########################################
6096 # check for usable membarrier system call
6097 if test "$membarrier" = "yes"; then
6098     have_membarrier=no
6099     if test "$mingw32" = "yes" ; then
6100         have_membarrier=yes
6101     elif test "$linux" = "yes" ; then
6102         cat > $TMPC << EOF
6103     #include <linux/membarrier.h>
6104     #include <sys/syscall.h>
6105     #include <unistd.h>
6106     #include <stdlib.h>
6107     int main(void) {
6108         syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
6109         syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
6110         exit(0);
6111     }
6112 EOF
6113         if compile_prog "" "" ; then
6114             have_membarrier=yes
6115         fi
6116     fi
6117     if test "$have_membarrier" = "no"; then
6118       feature_not_found "membarrier" "membarrier system call not available"
6119     fi
6120 else
6121     # Do not enable it by default even for Mingw32, because it doesn't
6122     # work on Wine.
6123     membarrier=no
6124 fi
6125
6126 ##########################################
6127 # check if rtnetlink.h exists and is useful
6128 have_rtnetlink=no
6129 cat > $TMPC << EOF
6130 #include <linux/rtnetlink.h>
6131 int main(void) {
6132   return IFLA_PROTO_DOWN;
6133 }
6134 EOF
6135 if compile_prog "" "" ; then
6136     have_rtnetlink=yes
6137 fi
6138
6139 ##########################################
6140 # check for usable AF_VSOCK environment
6141 have_af_vsock=no
6142 cat > $TMPC << EOF
6143 #include <errno.h>
6144 #include <sys/types.h>
6145 #include <sys/socket.h>
6146 #if !defined(AF_VSOCK)
6147 # error missing AF_VSOCK flag
6148 #endif
6149 #include <linux/vm_sockets.h>
6150 int main(void) {
6151     int sock, ret;
6152     struct sockaddr_vm svm;
6153     socklen_t len = sizeof(svm);
6154     sock = socket(AF_VSOCK, SOCK_STREAM, 0);
6155     ret = getpeername(sock, (struct sockaddr *)&svm, &len);
6156     if ((ret == -1) && (errno == ENOTCONN)) {
6157         return 0;
6158     }
6159     return -1;
6160 }
6161 EOF
6162 if compile_prog "" "" ; then
6163     have_af_vsock=yes
6164 fi
6165
6166 ##########################################
6167 # check for usable AF_ALG environment
6168 have_afalg=no
6169 cat > $TMPC << EOF
6170 #include <errno.h>
6171 #include <sys/types.h>
6172 #include <sys/socket.h>
6173 #include <linux/if_alg.h>
6174 int main(void) {
6175     int sock;
6176     sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
6177     return sock;
6178 }
6179 EOF
6180 if compile_prog "" "" ; then
6181     have_afalg=yes
6182 fi
6183 if test "$crypto_afalg" = "yes"
6184 then
6185     if test "$have_afalg" != "yes"
6186     then
6187         error_exit "AF_ALG requested but could not be detected"
6188     fi
6189 fi
6190
6191
6192 #################################################
6193 # Check to see if we have the Hypervisor framework
6194 if [ "$darwin" = "yes" ] ; then
6195   cat > $TMPC << EOF
6196 #include <Hypervisor/hv.h>
6197 int main() { return 0;}
6198 EOF
6199   if ! compile_object ""; then
6200     hvf='no'
6201   else
6202     hvf='yes'
6203     QEMU_LDFLAGS="-framework Hypervisor $QEMU_LDFLAGS"
6204   fi
6205 fi
6206
6207 #################################################
6208 # Sparc implicitly links with --relax, which is
6209 # incompatible with -r, so --no-relax should be
6210 # given. It does no harm to give it on other
6211 # platforms too.
6212
6213 # Note: the prototype is needed since QEMU_CFLAGS
6214 #       contains -Wmissing-prototypes
6215 cat > $TMPC << EOF
6216 extern int foo(void);
6217 int foo(void) { return 0; }
6218 EOF
6219 if ! compile_object ""; then
6220   error_exit "Failed to compile object file for LD_REL_FLAGS test"
6221 fi
6222 for i in '-Wl,-r -Wl,--no-relax' -Wl,-r -r; do
6223   if do_cc -nostdlib $i -o $TMPMO $TMPO; then
6224     LD_REL_FLAGS=$i
6225     break
6226   fi
6227 done
6228 if test "$modules" = "yes" && test "$LD_REL_FLAGS" = ""; then
6229   feature_not_found "modules" "Cannot find how to build relocatable objects"
6230 fi
6231
6232 ##########################################
6233 # check for sysmacros.h
6234
6235 have_sysmacros=no
6236 cat > $TMPC << EOF
6237 #include <sys/sysmacros.h>
6238 int main(void) {
6239     return makedev(0, 0);
6240 }
6241 EOF
6242 if compile_prog "" "" ; then
6243     have_sysmacros=yes
6244 fi
6245
6246 ##########################################
6247 # check for _Static_assert()
6248
6249 have_static_assert=no
6250 cat > $TMPC << EOF
6251 _Static_assert(1, "success");
6252 int main(void) {
6253     return 0;
6254 }
6255 EOF
6256 if compile_prog "" "" ; then
6257     have_static_assert=yes
6258 fi
6259
6260 ##########################################
6261 # check for utmpx.h, it is missing e.g. on OpenBSD
6262
6263 have_utmpx=no
6264 cat > $TMPC << EOF
6265 #include <utmpx.h>
6266 struct utmpx user_info;
6267 int main(void) {
6268     return 0;
6269 }
6270 EOF
6271 if compile_prog "" "" ; then
6272     have_utmpx=yes
6273 fi
6274
6275 ##########################################
6276 # check for getrandom()
6277
6278 have_getrandom=no
6279 cat > $TMPC << EOF
6280 #include <sys/random.h>
6281 int main(void) {
6282     return getrandom(0, 0, GRND_NONBLOCK);
6283 }
6284 EOF
6285 if compile_prog "" "" ; then
6286     have_getrandom=yes
6287 fi
6288
6289 ##########################################
6290 # checks for sanitizers
6291
6292 have_asan=no
6293 have_ubsan=no
6294 have_asan_iface_h=no
6295 have_asan_iface_fiber=no
6296
6297 if test "$sanitizers" = "yes" ; then
6298   write_c_skeleton
6299   if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
6300       have_asan=yes
6301   fi
6302
6303   # we could use a simple skeleton for flags checks, but this also
6304   # detect the static linking issue of ubsan, see also:
6305   # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
6306   cat > $TMPC << EOF
6307 #include <stdlib.h>
6308 int main(void) {
6309     void *tmp = malloc(10);
6310     if (tmp != NULL) {
6311         ret