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