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