xref: /openbmc/qemu/configure (revision a872e4328bb3c2dda0699e04abf0f902950221f3)
1 #!/bin/sh
2 #
3 # qemu configure script (c) 2003 Fabrice Bellard
4 #
5 
6 # Unset some variables known to interfere with behavior of common tools,
7 # just as autoconf does.
8 CLICOLOR_FORCE= GREP_OPTIONS=
9 unset CLICOLOR_FORCE GREP_OPTIONS
10 
11 # Don't allow CCACHE, if present, to use cached results of compile tests!
12 export CCACHE_RECACHE=yes
13 
14 # Temporary directory used for files created while
15 # configure runs. Since it is in the build directory
16 # we can safely blow away any previous version of it
17 # (and we need not jump through hoops to try to delete
18 # it when configure exits.)
19 TMPDIR1="config-temp"
20 rm -rf "${TMPDIR1}"
21 mkdir -p "${TMPDIR1}"
22 if [ $? -ne 0 ]; then
23     echo "ERROR: failed to create temporary directory"
24     exit 1
25 fi
26 
27 TMPB="qemu-conf"
28 TMPC="${TMPDIR1}/${TMPB}.c"
29 TMPO="${TMPDIR1}/${TMPB}.o"
30 TMPCXX="${TMPDIR1}/${TMPB}.cxx"
31 TMPE="${TMPDIR1}/${TMPB}.exe"
32 TMPMO="${TMPDIR1}/${TMPB}.mo"
33 TMPTXT="${TMPDIR1}/${TMPB}.txt"
34 
35 rm -f config.log
36 
37 # Print a helpful header at the top of config.log
38 echo "# QEMU configure log $(date)" >> config.log
39 printf "# Configured with:" >> config.log
40 printf " '%s'" "$0" "$@" >> config.log
41 echo >> config.log
42 echo "#" >> config.log
43 
44 print_error() {
45     (echo
46     echo "ERROR: $1"
47     while test -n "$2"; do
48         echo "       $2"
49         shift
50     done
51     echo) >&2
52 }
53 
54 error_exit() {
55     print_error "$@"
56     exit 1
57 }
58 
59 do_compiler() {
60     # Run the compiler, capturing its output to the log. First argument
61     # is compiler binary to execute.
62     local compiler="$1"
63     shift
64     if test -n "$BASH_VERSION"; then eval '
65         echo >>config.log "
66 funcs: ${FUNCNAME[*]}
67 lines: ${BASH_LINENO[*]}"
68     '; fi
69     echo $compiler "$@" >> config.log
70     $compiler "$@" >> config.log 2>&1 || return $?
71     # Test passed. If this is an --enable-werror build, rerun
72     # the test with -Werror and bail out if it fails. This
73     # makes warning-generating-errors in configure test code
74     # obvious to developers.
75     if test "$werror" != "yes"; then
76         return 0
77     fi
78     # Don't bother rerunning the compile if we were already using -Werror
79     case "$*" in
80         *-Werror*)
81            return 0
82         ;;
83     esac
84     echo $compiler -Werror "$@" >> config.log
85     $compiler -Werror "$@" >> config.log 2>&1 && return $?
86     error_exit "configure test passed without -Werror but failed with -Werror." \
87         "This is probably a bug in the configure script. The failing command" \
88         "will be at the bottom of config.log." \
89         "You can run configure with --disable-werror to bypass this check."
90 }
91 
92 do_cc() {
93     do_compiler "$cc" "$@"
94 }
95 
96 do_cxx() {
97     do_compiler "$cxx" "$@"
98 }
99 
100 update_cxxflags() {
101     # Set QEMU_CXXFLAGS from QEMU_CFLAGS by filtering out those
102     # options which some versions of GCC's C++ compiler complain about
103     # because they only make sense for C programs.
104     QEMU_CXXFLAGS="$QEMU_CXXFLAGS -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"
105 
106     for arg in $QEMU_CFLAGS; do
107         case $arg in
108             -Wstrict-prototypes|-Wmissing-prototypes|-Wnested-externs|\
109             -Wold-style-declaration|-Wold-style-definition|-Wredundant-decls)
110                 ;;
111             -std=gnu99)
112                 QEMU_CXXFLAGS=${QEMU_CXXFLAGS:+$QEMU_CXXFLAGS }"-std=gnu++98"
113                 ;;
114             *)
115                 QEMU_CXXFLAGS=${QEMU_CXXFLAGS:+$QEMU_CXXFLAGS }$arg
116                 ;;
117         esac
118     done
119 }
120 
121 compile_object() {
122   local_cflags="$1"
123   do_cc $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
124 }
125 
126 compile_prog() {
127   local_cflags="$1"
128   local_ldflags="$2"
129   do_cc $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC $QEMU_LDFLAGS $local_ldflags
130 }
131 
132 # symbolically link $1 to $2.  Portable version of "ln -sf".
133 symlink() {
134   rm -rf "$2"
135   mkdir -p "$(dirname "$2")"
136   ln -s "$1" "$2"
137 }
138 
139 # check whether a command is available to this shell (may be either an
140 # executable or a builtin)
141 has() {
142     type "$1" >/dev/null 2>&1
143 }
144 
145 # search for an executable in PATH
146 path_of() {
147     local_command="$1"
148     local_ifs="$IFS"
149     local_dir=""
150 
151     # pathname has a dir component?
152     if [ "${local_command#*/}" != "$local_command" ]; then
153         if [ -x "$local_command" ] && [ ! -d "$local_command" ]; then
154             echo "$local_command"
155             return 0
156         fi
157     fi
158     if [ -z "$local_command" ]; then
159         return 1
160     fi
161 
162     IFS=:
163     for local_dir in $PATH; do
164         if [ -x "$local_dir/$local_command" ] && [ ! -d "$local_dir/$local_command" ]; then
165             echo "$local_dir/$local_command"
166             IFS="${local_ifs:-$(printf ' \t\n')}"
167             return 0
168         fi
169     done
170     # not found
171     IFS="${local_ifs:-$(printf ' \t\n')}"
172     return 1
173 }
174 
175 have_backend () {
176     echo "$trace_backends" | grep "$1" >/dev/null
177 }
178 
179 glob() {
180     eval test -z '"${1#'"$2"'}"'
181 }
182 
183 supported_hax_target() {
184     test "$hax" = "yes" || return 1
185     glob "$1" "*-softmmu" || return 1
186     case "${1%-softmmu}" in
187         i386|x86_64)
188             return 0
189         ;;
190     esac
191     return 1
192 }
193 
194 supported_kvm_target() {
195     test "$kvm" = "yes" || return 1
196     glob "$1" "*-softmmu" || return 1
197     case "${1%-softmmu}:$cpu" in
198         arm:arm | aarch64:aarch64 | \
199         i386:i386 | i386:x86_64 | i386:x32 | \
200         x86_64:i386 | x86_64:x86_64 | x86_64:x32 | \
201         mips:mips | mipsel:mips | \
202         ppc:ppc | ppc64:ppc | ppc:ppc64 | ppc64:ppc64 | ppc64:ppc64le | \
203         s390x:s390x)
204             return 0
205         ;;
206     esac
207     return 1
208 }
209 
210 supported_xen_target() {
211     test "$xen" = "yes" || return 1
212     glob "$1" "*-softmmu" || return 1
213     # Only i386 and x86_64 provide the xenpv machine.
214     case "${1%-softmmu}" in
215         i386|x86_64)
216             return 0
217         ;;
218     esac
219     return 1
220 }
221 
222 supported_hvf_target() {
223     test "$hvf" = "yes" || return 1
224     glob "$1" "*-softmmu" || return 1
225     case "${1%-softmmu}" in
226         x86_64)
227             return 0
228         ;;
229     esac
230     return 1
231 }
232 
233 supported_whpx_target() {
234     test "$whpx" = "yes" || return 1
235     glob "$1" "*-softmmu" || return 1
236     case "${1%-softmmu}" in
237         i386|x86_64)
238             return 0
239         ;;
240     esac
241     return 1
242 }
243 
244 supported_target() {
245     case "$1" in
246         *-softmmu)
247             ;;
248         *-linux-user)
249             if test "$linux" != "yes"; then
250                 print_error "Target '$target' is only available on a Linux host"
251                 return 1
252             fi
253             ;;
254         *-bsd-user)
255             if test "$bsd" != "yes"; then
256                 print_error "Target '$target' is only available on a BSD host"
257                 return 1
258             fi
259             ;;
260         *)
261             print_error "Invalid target name '$target'"
262             return 1
263             ;;
264     esac
265     test "$tcg" = "yes" && return 0
266     supported_kvm_target "$1" && return 0
267     supported_xen_target "$1" && return 0
268     supported_hax_target "$1" && return 0
269     supported_hvf_target "$1" && return 0
270     supported_whpx_target "$1" && return 0
271     print_error "TCG disabled, but hardware accelerator not available for '$target'"
272     return 1
273 }
274 
275 
276 ld_has() {
277     $ld --help 2>/dev/null | grep ".$1" >/dev/null 2>&1
278 }
279 
280 # make source path absolute
281 source_path=$(cd "$(dirname -- "$0")"; pwd)
282 
283 if printf %s\\n "$source_path" "$PWD" | grep -q "[[:space:]:]";
284 then
285   error_exit "main directory cannot contain spaces nor colons"
286 fi
287 
288 # default parameters
289 cpu=""
290 iasl="iasl"
291 interp_prefix="/usr/gnemul/qemu-%M"
292 static="no"
293 cross_prefix=""
294 audio_drv_list=""
295 block_drv_rw_whitelist=""
296 block_drv_ro_whitelist=""
297 host_cc="cc"
298 libs_cpu=""
299 libs_softmmu=""
300 libs_tools=""
301 audio_win_int=""
302 libs_qga=""
303 debug_info="yes"
304 stack_protector=""
305 use_containers="yes"
306 gdb_bin=$(command -v "gdb")
307 
308 if test -e "$source_path/.git"
309 then
310     git_update=yes
311     git_submodules="ui/keycodemapdb"
312     git_submodules="$git_submodules tests/fp/berkeley-testfloat-3"
313     git_submodules="$git_submodules tests/fp/berkeley-softfloat-3"
314 else
315     git_update=no
316     git_submodules=""
317 
318     if ! test -f "$source_path/ui/keycodemapdb/README"
319     then
320         echo
321         echo "ERROR: missing file $source_path/ui/keycodemapdb/README"
322         echo
323         echo "This is not a GIT checkout but module content appears to"
324         echo "be missing. Do not use 'git archive' or GitHub download links"
325         echo "to acquire QEMU source archives. Non-GIT builds are only"
326         echo "supported with source archives linked from:"
327         echo
328         echo "  https://www.qemu.org/download/#source"
329         echo
330         echo "Developers working with GIT can use scripts/archive-source.sh"
331         echo "if they need to create valid source archives."
332         echo
333         exit 1
334     fi
335 fi
336 git="git"
337 
338 # Don't accept a target_list environment variable.
339 unset target_list
340 unset target_list_exclude
341 
342 # Default value for a variable defining feature "foo".
343 #  * foo="no"  feature will only be used if --enable-foo arg is given
344 #  * foo=""    feature will be searched for, and if found, will be used
345 #              unless --disable-foo is given
346 #  * foo="yes" this value will only be set by --enable-foo flag.
347 #              feature will searched for,
348 #              if not found, configure exits with error
349 #
350 # Always add --enable-foo and --disable-foo command line args.
351 # Distributions want to ensure that several features are compiled in, and it
352 # is impossible without a --enable-foo that exits if a feature is not found.
353 
354 brlapi=""
355 curl=""
356 curses=""
357 docs=""
358 fdt=""
359 netmap="no"
360 sdl=""
361 sdl_image=""
362 virtfs=""
363 mpath=""
364 vnc="yes"
365 sparse="no"
366 vde=""
367 vnc_sasl=""
368 vnc_jpeg=""
369 vnc_png=""
370 xkbcommon=""
371 xen=""
372 xen_ctrl_version=""
373 xen_pci_passthrough=""
374 linux_aio=""
375 linux_io_uring=""
376 cap_ng=""
377 attr=""
378 libattr=""
379 xfs=""
380 tcg="yes"
381 membarrier=""
382 vhost_net=""
383 vhost_crypto=""
384 vhost_scsi=""
385 vhost_vsock=""
386 vhost_user=""
387 vhost_user_fs=""
388 kvm="no"
389 hax="no"
390 hvf="no"
391 whpx="no"
392 rdma=""
393 pvrdma=""
394 gprof="no"
395 debug_tcg="no"
396 debug="no"
397 sanitizers="no"
398 fortify_source=""
399 strip_opt="yes"
400 tcg_interpreter="no"
401 bigendian="no"
402 mingw32="no"
403 gcov="no"
404 gcov_tool="gcov"
405 EXESUF=""
406 DSOSUF=".so"
407 LDFLAGS_SHARED="-shared"
408 modules="no"
409 module_upgrades="no"
410 prefix="/usr/local"
411 mandir="\${prefix}/share/man"
412 datadir="\${prefix}/share"
413 firmwarepath="\${prefix}/share/qemu-firmware"
414 qemu_docdir="\${prefix}/share/doc/qemu"
415 bindir="\${prefix}/bin"
416 libdir="\${prefix}/lib"
417 libexecdir="\${prefix}/libexec"
418 includedir="\${prefix}/include"
419 sysconfdir="\${prefix}/etc"
420 local_statedir="\${prefix}/var"
421 confsuffix="/qemu"
422 slirp=""
423 oss_lib=""
424 bsd="no"
425 linux="no"
426 solaris="no"
427 profiler="no"
428 cocoa="no"
429 softmmu="yes"
430 linux_user="no"
431 bsd_user="no"
432 blobs="yes"
433 edk2_blobs="no"
434 pkgversion=""
435 pie=""
436 qom_cast_debug="yes"
437 trace_backends="log"
438 trace_file="trace"
439 spice=""
440 rbd=""
441 smartcard=""
442 libusb=""
443 usb_redir=""
444 opengl=""
445 opengl_dmabuf="no"
446 cpuid_h="no"
447 avx2_opt=""
448 zlib="yes"
449 capstone=""
450 lzo=""
451 snappy=""
452 bzip2=""
453 lzfse=""
454 zstd=""
455 guest_agent=""
456 guest_agent_with_vss="no"
457 guest_agent_ntddscsi="no"
458 guest_agent_msi=""
459 vss_win32_sdk=""
460 win_sdk="no"
461 want_tools=""
462 libiscsi=""
463 libnfs=""
464 coroutine=""
465 coroutine_pool=""
466 debug_stack_usage="no"
467 crypto_afalg="no"
468 seccomp=""
469 glusterfs=""
470 glusterfs_xlator_opt="no"
471 glusterfs_discard="no"
472 glusterfs_fallocate="no"
473 glusterfs_zerofill="no"
474 glusterfs_ftruncate_has_stat="no"
475 glusterfs_iocb_has_stat="no"
476 gtk=""
477 gtk_gl="no"
478 tls_priority="NORMAL"
479 gnutls=""
480 nettle=""
481 nettle_xts="no"
482 gcrypt=""
483 gcrypt_hmac="no"
484 gcrypt_xts="no"
485 qemu_private_xts="yes"
486 auth_pam=""
487 vte=""
488 virglrenderer=""
489 tpm=""
490 libssh=""
491 live_block_migration="yes"
492 numa=""
493 tcmalloc="no"
494 jemalloc="no"
495 replication="yes"
496 vxhs=""
497 bochs="yes"
498 cloop="yes"
499 dmg="yes"
500 qcow1="yes"
501 vdi="yes"
502 vvfat="yes"
503 qed="yes"
504 parallels="yes"
505 sheepdog="yes"
506 libxml2=""
507 debug_mutex="no"
508 libpmem=""
509 default_devices="yes"
510 plugins="no"
511 fuzzing="no"
512 
513 supported_cpu="no"
514 supported_os="no"
515 bogus_os="no"
516 malloc_trim=""
517 
518 # parse CC options first
519 for opt do
520   optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
521   case "$opt" in
522   --cross-prefix=*) cross_prefix="$optarg"
523   ;;
524   --cc=*) CC="$optarg"
525   ;;
526   --cxx=*) CXX="$optarg"
527   ;;
528   --cpu=*) cpu="$optarg"
529   ;;
530   --extra-cflags=*) QEMU_CFLAGS="$QEMU_CFLAGS $optarg"
531                     QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg"
532   ;;
533   --extra-cxxflags=*) QEMU_CXXFLAGS="$QEMU_CXXFLAGS $optarg"
534   ;;
535   --extra-ldflags=*) QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg"
536                      EXTRA_LDFLAGS="$optarg"
537   ;;
538   --enable-debug-info) debug_info="yes"
539   ;;
540   --disable-debug-info) debug_info="no"
541   ;;
542   --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"
543   ;;
544   --cross-cc-cflags-*) cc_arch=${opt#--cross-cc-flags-}; cc_arch=${cc_arch%%=*}
545                       eval "cross_cc_cflags_${cc_arch}=\$optarg"
546                       cross_cc_vars="$cross_cc_vars cross_cc_cflags_${cc_arch}"
547   ;;
548   --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}
549                 cc_archs="$cc_archs $cc_arch"
550                 eval "cross_cc_${cc_arch}=\$optarg"
551                 cross_cc_vars="$cross_cc_vars cross_cc_${cc_arch}"
552   ;;
553   esac
554 done
555 # OS specific
556 # Using uname is really, really broken.  Once we have the right set of checks
557 # we can eliminate its usage altogether.
558 
559 # Preferred compiler:
560 #  ${CC} (if set)
561 #  ${cross_prefix}gcc (if cross-prefix specified)
562 #  system compiler
563 if test -z "${CC}${cross_prefix}"; then
564   cc="$host_cc"
565 else
566   cc="${CC-${cross_prefix}gcc}"
567 fi
568 
569 if test -z "${CXX}${cross_prefix}"; then
570   cxx="c++"
571 else
572   cxx="${CXX-${cross_prefix}g++}"
573 fi
574 
575 ar="${AR-${cross_prefix}ar}"
576 as="${AS-${cross_prefix}as}"
577 ccas="${CCAS-$cc}"
578 cpp="${CPP-$cc -E}"
579 objcopy="${OBJCOPY-${cross_prefix}objcopy}"
580 ld="${LD-${cross_prefix}ld}"
581 ranlib="${RANLIB-${cross_prefix}ranlib}"
582 nm="${NM-${cross_prefix}nm}"
583 strip="${STRIP-${cross_prefix}strip}"
584 windres="${WINDRES-${cross_prefix}windres}"
585 pkg_config_exe="${PKG_CONFIG-${cross_prefix}pkg-config}"
586 query_pkg_config() {
587     "${pkg_config_exe}" ${QEMU_PKG_CONFIG_FLAGS} "$@"
588 }
589 pkg_config=query_pkg_config
590 sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
591 
592 # If the user hasn't specified ARFLAGS, default to 'rv', just as make does.
593 ARFLAGS="${ARFLAGS-rv}"
594 
595 # default flags for all hosts
596 # We use -fwrapv to tell the compiler that we require a C dialect where
597 # left shift of signed integers is well defined and has the expected
598 # 2s-complement style results. (Both clang and gcc agree that it
599 # provides these semantics.)
600 QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv -std=gnu99 $QEMU_CFLAGS"
601 QEMU_CFLAGS="-Wall -Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS"
602 QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS"
603 QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
604 QEMU_INCLUDES="-iquote . -iquote \$(SRC_PATH) -iquote \$(SRC_PATH)/accel/tcg -iquote \$(SRC_PATH)/include"
605 QEMU_INCLUDES="$QEMU_INCLUDES -iquote \$(SRC_PATH)/disas/libvixl"
606 if test "$debug_info" = "yes"; then
607     CFLAGS="-g $CFLAGS"
608 fi
609 
610 # running configure in the source tree?
611 # we know that's the case if configure is there.
612 if test -f "./configure"; then
613     pwd_is_source_path="y"
614 else
615     pwd_is_source_path="n"
616 fi
617 
618 check_define() {
619 cat > $TMPC <<EOF
620 #if !defined($1)
621 #error $1 not defined
622 #endif
623 int main(void) { return 0; }
624 EOF
625   compile_object
626 }
627 
628 check_include() {
629 cat > $TMPC <<EOF
630 #include <$1>
631 int main(void) { return 0; }
632 EOF
633   compile_object
634 }
635 
636 write_c_skeleton() {
637     cat > $TMPC <<EOF
638 int main(void) { return 0; }
639 EOF
640 }
641 
642 write_c_fuzzer_skeleton() {
643     cat > $TMPC <<EOF
644 #include <stdint.h>
645 #include <sys/types.h>
646 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
647 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
648 EOF
649 }
650 
651 if check_define __linux__ ; then
652   targetos="Linux"
653 elif check_define _WIN32 ; then
654   targetos='MINGW32'
655 elif check_define __OpenBSD__ ; then
656   targetos='OpenBSD'
657 elif check_define __sun__ ; then
658   targetos='SunOS'
659 elif check_define __HAIKU__ ; then
660   targetos='Haiku'
661 elif check_define __FreeBSD__ ; then
662   targetos='FreeBSD'
663 elif check_define __FreeBSD_kernel__ && check_define __GLIBC__; then
664   targetos='GNU/kFreeBSD'
665 elif check_define __DragonFly__ ; then
666   targetos='DragonFly'
667 elif check_define __NetBSD__; then
668   targetos='NetBSD'
669 elif check_define __APPLE__; then
670   targetos='Darwin'
671 else
672   # This is a fatal error, but don't report it yet, because we
673   # might be going to just print the --help text, or it might
674   # be the result of a missing compiler.
675   targetos='bogus'
676   bogus_os='yes'
677 fi
678 
679 # Some host OSes need non-standard checks for which CPU to use.
680 # Note that these checks are broken for cross-compilation: if you're
681 # cross-compiling to one of these OSes then you'll need to specify
682 # the correct CPU with the --cpu option.
683 case $targetos in
684 Darwin)
685   # on Leopard most of the system is 32-bit, so we have to ask the kernel if we can
686   # run 64-bit userspace code.
687   # If the user didn't specify a CPU explicitly and the kernel says this is
688   # 64 bit hw, then assume x86_64. Otherwise fall through to the usual detection code.
689   if test -z "$cpu" && test "$(sysctl -n hw.optional.x86_64)" = "1"; then
690     cpu="x86_64"
691   fi
692   ;;
693 SunOS)
694   # $(uname -m) returns i86pc even on an x86_64 box, so default based on isainfo
695   if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then
696     cpu="x86_64"
697   fi
698 esac
699 
700 if test ! -z "$cpu" ; then
701   # command line argument
702   :
703 elif check_define __i386__ ; then
704   cpu="i386"
705 elif check_define __x86_64__ ; then
706   if check_define __ILP32__ ; then
707     cpu="x32"
708   else
709     cpu="x86_64"
710   fi
711 elif check_define __sparc__ ; then
712   if check_define __arch64__ ; then
713     cpu="sparc64"
714   else
715     cpu="sparc"
716   fi
717 elif check_define _ARCH_PPC ; then
718   if check_define _ARCH_PPC64 ; then
719     if check_define _LITTLE_ENDIAN ; then
720       cpu="ppc64le"
721     else
722       cpu="ppc64"
723     fi
724   else
725     cpu="ppc"
726   fi
727 elif check_define __mips__ ; then
728   cpu="mips"
729 elif check_define __s390__ ; then
730   if check_define __s390x__ ; then
731     cpu="s390x"
732   else
733     cpu="s390"
734   fi
735 elif check_define __riscv ; then
736   if check_define _LP64 ; then
737     cpu="riscv64"
738   else
739     cpu="riscv32"
740   fi
741 elif check_define __arm__ ; then
742   cpu="arm"
743 elif check_define __aarch64__ ; then
744   cpu="aarch64"
745 else
746   cpu=$(uname -m)
747 fi
748 
749 ARCH=
750 # Normalise host CPU name and set ARCH.
751 # Note that this case should only have supported host CPUs, not guests.
752 case "$cpu" in
753   ppc|ppc64|s390x|sparc64|x32|riscv32|riscv64)
754     supported_cpu="yes"
755   ;;
756   ppc64le)
757     ARCH="ppc64"
758     supported_cpu="yes"
759   ;;
760   i386|i486|i586|i686|i86pc|BePC)
761     cpu="i386"
762     supported_cpu="yes"
763   ;;
764   x86_64|amd64)
765     cpu="x86_64"
766     supported_cpu="yes"
767   ;;
768   armv*b|armv*l|arm)
769     cpu="arm"
770     supported_cpu="yes"
771   ;;
772   aarch64)
773     cpu="aarch64"
774     supported_cpu="yes"
775   ;;
776   mips*)
777     cpu="mips"
778     supported_cpu="yes"
779   ;;
780   sparc|sun4[cdmuv])
781     cpu="sparc"
782     supported_cpu="yes"
783   ;;
784   *)
785     # This will result in either an error or falling back to TCI later
786     ARCH=unknown
787   ;;
788 esac
789 if test -z "$ARCH"; then
790   ARCH="$cpu"
791 fi
792 
793 # OS specific
794 
795 # host *BSD for user mode
796 HOST_VARIANT_DIR=""
797 
798 case $targetos in
799 MINGW32*)
800   mingw32="yes"
801   hax="yes"
802   vhost_user="no"
803   audio_possible_drivers="dsound sdl"
804   if check_include dsound.h; then
805     audio_drv_list="dsound"
806   else
807     audio_drv_list=""
808   fi
809   supported_os="yes"
810 ;;
811 GNU/kFreeBSD)
812   bsd="yes"
813   audio_drv_list="oss try-sdl"
814   audio_possible_drivers="oss sdl pa"
815 ;;
816 FreeBSD)
817   bsd="yes"
818   make="${MAKE-gmake}"
819   audio_drv_list="oss try-sdl"
820   audio_possible_drivers="oss sdl pa"
821   # needed for kinfo_getvmmap(3) in libutil.h
822   LIBS="-lutil $LIBS"
823   # needed for kinfo_getproc
824   libs_qga="-lutil $libs_qga"
825   netmap=""  # enable netmap autodetect
826   HOST_VARIANT_DIR="freebsd"
827   supported_os="yes"
828 ;;
829 DragonFly)
830   bsd="yes"
831   make="${MAKE-gmake}"
832   audio_drv_list="oss try-sdl"
833   audio_possible_drivers="oss sdl pa"
834   HOST_VARIANT_DIR="dragonfly"
835 ;;
836 NetBSD)
837   bsd="yes"
838   hax="yes"
839   make="${MAKE-gmake}"
840   audio_drv_list="oss try-sdl"
841   audio_possible_drivers="oss sdl"
842   oss_lib="-lossaudio"
843   HOST_VARIANT_DIR="netbsd"
844   supported_os="yes"
845 ;;
846 OpenBSD)
847   bsd="yes"
848   make="${MAKE-gmake}"
849   audio_drv_list="try-sdl"
850   audio_possible_drivers="sdl"
851   HOST_VARIANT_DIR="openbsd"
852   supported_os="yes"
853 ;;
854 Darwin)
855   bsd="yes"
856   darwin="yes"
857   hax="yes"
858   hvf="yes"
859   LDFLAGS_SHARED="-bundle -undefined dynamic_lookup"
860   if [ "$cpu" = "x86_64" ] ; then
861     QEMU_CFLAGS="-arch x86_64 $QEMU_CFLAGS"
862     QEMU_LDFLAGS="-arch x86_64 $QEMU_LDFLAGS"
863   fi
864   cocoa="yes"
865   audio_drv_list="coreaudio try-sdl"
866   audio_possible_drivers="coreaudio sdl"
867   QEMU_LDFLAGS="-framework CoreFoundation -framework IOKit $QEMU_LDFLAGS"
868   libs_softmmu="-F/System/Library/Frameworks -framework Cocoa -framework IOKit $libs_softmmu"
869   # Disable attempts to use ObjectiveC features in os/object.h since they
870   # won't work when we're compiling with gcc as a C compiler.
871   QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS"
872   HOST_VARIANT_DIR="darwin"
873   supported_os="yes"
874 ;;
875 SunOS)
876   solaris="yes"
877   make="${MAKE-gmake}"
878   install="${INSTALL-ginstall}"
879   smbd="${SMBD-/usr/sfw/sbin/smbd}"
880   if test -f /usr/include/sys/soundcard.h ; then
881     audio_drv_list="oss try-sdl"
882   fi
883   audio_possible_drivers="oss sdl"
884 # needed for CMSG_ macros in sys/socket.h
885   QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS"
886 # needed for TIOCWIN* defines in termios.h
887   QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
888   QEMU_CFLAGS="-std=gnu99 $QEMU_CFLAGS"
889   solarisnetlibs="-lsocket -lnsl -lresolv"
890   LIBS="$solarisnetlibs $LIBS"
891   libs_qga="$solarisnetlibs $libs_qga"
892 ;;
893 Haiku)
894   haiku="yes"
895   QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS $QEMU_CFLAGS"
896   LIBS="-lposix_error_mapper -lnetwork $LIBS"
897 ;;
898 Linux)
899   audio_drv_list="try-pa oss"
900   audio_possible_drivers="oss alsa sdl pa"
901   linux="yes"
902   linux_user="yes"
903   kvm="yes"
904   QEMU_INCLUDES="-isystem \$(SRC_PATH)/linux-headers -isystem $PWD/linux-headers $QEMU_INCLUDES"
905   supported_os="yes"
906   libudev="yes"
907 ;;
908 esac
909 
910 if [ "$bsd" = "yes" ] ; then
911   if [ "$darwin" != "yes" ] ; then
912     bsd_user="yes"
913   fi
914 fi
915 
916 : ${make=${MAKE-make}}
917 : ${install=${INSTALL-install}}
918 # We prefer python 3.x. A bare 'python' is traditionally
919 # python 2.x, but some distros have it as python 3.x, so
920 # we check that too
921 python=
922 for binary in "${PYTHON-python3}" python
923 do
924     if has "$binary"
925     then
926         python=$(command -v "$binary")
927         break
928     fi
929 done
930 
931 sphinx_build=
932 for binary in sphinx-build-3 sphinx-build
933 do
934     if has "$binary"
935     then
936         sphinx_build=$(command -v "$binary")
937         break
938     fi
939 done
940 
941 # Check for ancillary tools used in testing
942 genisoimage=
943 for binary in genisoimage
944 do
945     if has $binary
946     then
947         genisoimage=$(command -v "$binary")
948         break
949     fi
950 done
951 
952 : ${smbd=${SMBD-/usr/sbin/smbd}}
953 
954 # Default objcc to clang if available, otherwise use CC
955 if has clang; then
956   objcc=clang
957 else
958   objcc="$cc"
959 fi
960 
961 if test "$mingw32" = "yes" ; then
962   EXESUF=".exe"
963   DSOSUF=".dll"
964   # MinGW needs -mthreads for TLS and macro _MT.
965   QEMU_CFLAGS="-mthreads $QEMU_CFLAGS"
966   LIBS="-lwinmm -lws2_32 $LIBS"
967   write_c_skeleton;
968   if compile_prog "" "-liberty" ; then
969     LIBS="-liberty $LIBS"
970   fi
971   prefix="c:/Program Files/QEMU"
972   mandir="\${prefix}"
973   datadir="\${prefix}"
974   qemu_docdir="\${prefix}"
975   bindir="\${prefix}"
976   sysconfdir="\${prefix}"
977   local_statedir=
978   confsuffix=""
979   libs_qga="-lws2_32 -lwinmm -lpowrprof -lwtsapi32 -lwininet -liphlpapi -lnetapi32 $libs_qga"
980 fi
981 
982 werror=""
983 
984 for opt do
985   optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
986   case "$opt" in
987   --help|-h) show_help=yes
988   ;;
989   --version|-V) exec cat $source_path/VERSION
990   ;;
991   --prefix=*) prefix="$optarg"
992   ;;
993   --interp-prefix=*) interp_prefix="$optarg"
994   ;;
995   --cross-prefix=*)
996   ;;
997   --cc=*)
998   ;;
999   --host-cc=*) host_cc="$optarg"
1000   ;;
1001   --cxx=*)
1002   ;;
1003   --iasl=*) iasl="$optarg"
1004   ;;
1005   --objcc=*) objcc="$optarg"
1006   ;;
1007   --make=*) make="$optarg"
1008   ;;
1009   --install=*) install="$optarg"
1010   ;;
1011   --python=*) python="$optarg"
1012   ;;
1013   --sphinx-build=*) sphinx_build="$optarg"
1014   ;;
1015   --gcov=*) gcov_tool="$optarg"
1016   ;;
1017   --smbd=*) smbd="$optarg"
1018   ;;
1019   --extra-cflags=*)
1020   ;;
1021   --extra-cxxflags=*)
1022   ;;
1023   --extra-ldflags=*)
1024   ;;
1025   --enable-debug-info)
1026   ;;
1027   --disable-debug-info)
1028   ;;
1029   --cross-cc-*)
1030   ;;
1031   --enable-modules)
1032       modules="yes"
1033   ;;
1034   --disable-modules)
1035       modules="no"
1036   ;;
1037   --disable-module-upgrades) module_upgrades="no"
1038   ;;
1039   --enable-module-upgrades) module_upgrades="yes"
1040   ;;
1041   --cpu=*)
1042   ;;
1043   --target-list=*) target_list="$optarg"
1044                    if test "$target_list_exclude"; then
1045                        error_exit "Can't mix --target-list with --target-list-exclude"
1046                    fi
1047   ;;
1048   --target-list-exclude=*) target_list_exclude="$optarg"
1049                    if test "$target_list"; then
1050                        error_exit "Can't mix --target-list-exclude with --target-list"
1051                    fi
1052   ;;
1053   --enable-trace-backends=*) trace_backends="$optarg"
1054   ;;
1055   # XXX: backwards compatibility
1056   --enable-trace-backend=*) trace_backends="$optarg"
1057   ;;
1058   --with-trace-file=*) trace_file="$optarg"
1059   ;;
1060   --with-default-devices) default_devices="yes"
1061   ;;
1062   --without-default-devices) default_devices="no"
1063   ;;
1064   --enable-gprof) gprof="yes"
1065   ;;
1066   --enable-gcov) gcov="yes"
1067   ;;
1068   --static)
1069     static="yes"
1070     QEMU_PKG_CONFIG_FLAGS="--static $QEMU_PKG_CONFIG_FLAGS"
1071   ;;
1072   --mandir=*) mandir="$optarg"
1073   ;;
1074   --bindir=*) bindir="$optarg"
1075   ;;
1076   --libdir=*) libdir="$optarg"
1077   ;;
1078   --libexecdir=*) libexecdir="$optarg"
1079   ;;
1080   --includedir=*) includedir="$optarg"
1081   ;;
1082   --datadir=*) datadir="$optarg"
1083   ;;
1084   --with-confsuffix=*) confsuffix="$optarg"
1085   ;;
1086   --docdir=*) qemu_docdir="$optarg"
1087   ;;
1088   --sysconfdir=*) sysconfdir="$optarg"
1089   ;;
1090   --localstatedir=*) local_statedir="$optarg"
1091   ;;
1092   --firmwarepath=*) firmwarepath="$optarg"
1093   ;;
1094   --host=*|--build=*|\
1095   --disable-dependency-tracking|\
1096   --sbindir=*|--sharedstatedir=*|\
1097   --oldincludedir=*|--datarootdir=*|--infodir=*|--localedir=*|\
1098   --htmldir=*|--dvidir=*|--pdfdir=*|--psdir=*)
1099     # These switches are silently ignored, for compatibility with
1100     # autoconf-generated configure scripts. This allows QEMU's
1101     # configure to be used by RPM and similar macros that set
1102     # lots of directory switches by default.
1103   ;;
1104   --disable-sdl) sdl="no"
1105   ;;
1106   --enable-sdl) sdl="yes"
1107   ;;
1108   --disable-sdl-image) sdl_image="no"
1109   ;;
1110   --enable-sdl-image) sdl_image="yes"
1111   ;;
1112   --disable-qom-cast-debug) qom_cast_debug="no"
1113   ;;
1114   --enable-qom-cast-debug) qom_cast_debug="yes"
1115   ;;
1116   --disable-virtfs) virtfs="no"
1117   ;;
1118   --enable-virtfs) virtfs="yes"
1119   ;;
1120   --disable-mpath) mpath="no"
1121   ;;
1122   --enable-mpath) mpath="yes"
1123   ;;
1124   --disable-vnc) vnc="no"
1125   ;;
1126   --enable-vnc) vnc="yes"
1127   ;;
1128   --oss-lib=*) oss_lib="$optarg"
1129   ;;
1130   --audio-drv-list=*) audio_drv_list="$optarg"
1131   ;;
1132   --block-drv-rw-whitelist=*|--block-drv-whitelist=*) block_drv_rw_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
1133   ;;
1134   --block-drv-ro-whitelist=*) block_drv_ro_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
1135   ;;
1136   --enable-debug-tcg) debug_tcg="yes"
1137   ;;
1138   --disable-debug-tcg) debug_tcg="no"
1139   ;;
1140   --enable-debug)
1141       # Enable debugging options that aren't excessively noisy
1142       debug_tcg="yes"
1143       debug_mutex="yes"
1144       debug="yes"
1145       strip_opt="no"
1146       fortify_source="no"
1147   ;;
1148   --enable-sanitizers) sanitizers="yes"
1149   ;;
1150   --disable-sanitizers) sanitizers="no"
1151   ;;
1152   --enable-sparse) sparse="yes"
1153   ;;
1154   --disable-sparse) sparse="no"
1155   ;;
1156   --disable-strip) strip_opt="no"
1157   ;;
1158   --disable-vnc-sasl) vnc_sasl="no"
1159   ;;
1160   --enable-vnc-sasl) vnc_sasl="yes"
1161   ;;
1162   --disable-vnc-jpeg) vnc_jpeg="no"
1163   ;;
1164   --enable-vnc-jpeg) vnc_jpeg="yes"
1165   ;;
1166   --disable-vnc-png) vnc_png="no"
1167   ;;
1168   --enable-vnc-png) vnc_png="yes"
1169   ;;
1170   --disable-slirp) slirp="no"
1171   ;;
1172   --enable-slirp=git) slirp="git"
1173   ;;
1174   --enable-slirp=system) slirp="system"
1175   ;;
1176   --disable-vde) vde="no"
1177   ;;
1178   --enable-vde) vde="yes"
1179   ;;
1180   --disable-netmap) netmap="no"
1181   ;;
1182   --enable-netmap) netmap="yes"
1183   ;;
1184   --disable-xen) xen="no"
1185   ;;
1186   --enable-xen) xen="yes"
1187   ;;
1188   --disable-xen-pci-passthrough) xen_pci_passthrough="no"
1189   ;;
1190   --enable-xen-pci-passthrough) xen_pci_passthrough="yes"
1191   ;;
1192   --disable-brlapi) brlapi="no"
1193   ;;
1194   --enable-brlapi) brlapi="yes"
1195   ;;
1196   --disable-kvm) kvm="no"
1197   ;;
1198   --enable-kvm) kvm="yes"
1199   ;;
1200   --disable-hax) hax="no"
1201   ;;
1202   --enable-hax) hax="yes"
1203   ;;
1204   --disable-hvf) hvf="no"
1205   ;;
1206   --enable-hvf) hvf="yes"
1207   ;;
1208   --disable-whpx) whpx="no"
1209   ;;
1210   --enable-whpx) whpx="yes"
1211   ;;
1212   --disable-tcg-interpreter) tcg_interpreter="no"
1213   ;;
1214   --enable-tcg-interpreter) tcg_interpreter="yes"
1215   ;;
1216   --disable-cap-ng)  cap_ng="no"
1217   ;;
1218   --enable-cap-ng) cap_ng="yes"
1219   ;;
1220   --disable-tcg) tcg="no"
1221   ;;
1222   --enable-tcg) tcg="yes"
1223   ;;
1224   --disable-malloc-trim) malloc_trim="no"
1225   ;;
1226   --enable-malloc-trim) malloc_trim="yes"
1227   ;;
1228   --disable-spice) spice="no"
1229   ;;
1230   --enable-spice) spice="yes"
1231   ;;
1232   --disable-libiscsi) libiscsi="no"
1233   ;;
1234   --enable-libiscsi) libiscsi="yes"
1235   ;;
1236   --disable-libnfs) libnfs="no"
1237   ;;
1238   --enable-libnfs) libnfs="yes"
1239   ;;
1240   --enable-profiler) profiler="yes"
1241   ;;
1242   --disable-cocoa) cocoa="no"
1243   ;;
1244   --enable-cocoa)
1245       cocoa="yes" ;
1246       audio_drv_list="coreaudio $(echo $audio_drv_list | sed s,coreaudio,,g)"
1247   ;;
1248   --disable-system) softmmu="no"
1249   ;;
1250   --enable-system) softmmu="yes"
1251   ;;
1252   --disable-user)
1253       linux_user="no" ;
1254       bsd_user="no" ;
1255   ;;
1256   --enable-user) ;;
1257   --disable-linux-user) linux_user="no"
1258   ;;
1259   --enable-linux-user) linux_user="yes"
1260   ;;
1261   --disable-bsd-user) bsd_user="no"
1262   ;;
1263   --enable-bsd-user) bsd_user="yes"
1264   ;;
1265   --enable-pie) pie="yes"
1266   ;;
1267   --disable-pie) pie="no"
1268   ;;
1269   --enable-werror) werror="yes"
1270   ;;
1271   --disable-werror) werror="no"
1272   ;;
1273   --enable-stack-protector) stack_protector="yes"
1274   ;;
1275   --disable-stack-protector) stack_protector="no"
1276   ;;
1277   --disable-curses) curses="no"
1278   ;;
1279   --enable-curses) curses="yes"
1280   ;;
1281   --disable-iconv) iconv="no"
1282   ;;
1283   --enable-iconv) iconv="yes"
1284   ;;
1285   --disable-curl) curl="no"
1286   ;;
1287   --enable-curl) curl="yes"
1288   ;;
1289   --disable-fdt) fdt="no"
1290   ;;
1291   --enable-fdt) fdt="yes"
1292   ;;
1293   --disable-linux-aio) linux_aio="no"
1294   ;;
1295   --enable-linux-aio) linux_aio="yes"
1296   ;;
1297   --disable-linux-io-uring) linux_io_uring="no"
1298   ;;
1299   --enable-linux-io-uring) linux_io_uring="yes"
1300   ;;
1301   --disable-attr) attr="no"
1302   ;;
1303   --enable-attr) attr="yes"
1304   ;;
1305   --disable-membarrier) membarrier="no"
1306   ;;
1307   --enable-membarrier) membarrier="yes"
1308   ;;
1309   --disable-blobs) blobs="no"
1310   ;;
1311   --with-pkgversion=*) pkgversion="$optarg"
1312   ;;
1313   --with-coroutine=*) coroutine="$optarg"
1314   ;;
1315   --disable-coroutine-pool) coroutine_pool="no"
1316   ;;
1317   --enable-coroutine-pool) coroutine_pool="yes"
1318   ;;
1319   --enable-debug-stack-usage) debug_stack_usage="yes"
1320   ;;
1321   --enable-crypto-afalg) crypto_afalg="yes"
1322   ;;
1323   --disable-crypto-afalg) crypto_afalg="no"
1324   ;;
1325   --disable-docs) docs="no"
1326   ;;
1327   --enable-docs) docs="yes"
1328   ;;
1329   --disable-vhost-net) vhost_net="no"
1330   ;;
1331   --enable-vhost-net) vhost_net="yes"
1332   ;;
1333   --disable-vhost-crypto) vhost_crypto="no"
1334   ;;
1335   --enable-vhost-crypto) vhost_crypto="yes"
1336   ;;
1337   --disable-vhost-scsi) vhost_scsi="no"
1338   ;;
1339   --enable-vhost-scsi) vhost_scsi="yes"
1340   ;;
1341   --disable-vhost-vsock) vhost_vsock="no"
1342   ;;
1343   --enable-vhost-vsock) vhost_vsock="yes"
1344   ;;
1345   --disable-vhost-user-fs) vhost_user_fs="no"
1346   ;;
1347   --enable-vhost-user-fs) vhost_user_fs="yes"
1348   ;;
1349   --disable-opengl) opengl="no"
1350   ;;
1351   --enable-opengl) opengl="yes"
1352   ;;
1353   --disable-rbd) rbd="no"
1354   ;;
1355   --enable-rbd) rbd="yes"
1356   ;;
1357   --disable-xfsctl) xfs="no"
1358   ;;
1359   --enable-xfsctl) xfs="yes"
1360   ;;
1361   --disable-smartcard) smartcard="no"
1362   ;;
1363   --enable-smartcard) smartcard="yes"
1364   ;;
1365   --disable-libusb) libusb="no"
1366   ;;
1367   --enable-libusb) libusb="yes"
1368   ;;
1369   --disable-usb-redir) usb_redir="no"
1370   ;;
1371   --enable-usb-redir) usb_redir="yes"
1372   ;;
1373   --disable-zlib-test) zlib="no"
1374   ;;
1375   --disable-lzo) lzo="no"
1376   ;;
1377   --enable-lzo) lzo="yes"
1378   ;;
1379   --disable-snappy) snappy="no"
1380   ;;
1381   --enable-snappy) snappy="yes"
1382   ;;
1383   --disable-bzip2) bzip2="no"
1384   ;;
1385   --enable-bzip2) bzip2="yes"
1386   ;;
1387   --enable-lzfse) lzfse="yes"
1388   ;;
1389   --disable-lzfse) lzfse="no"
1390   ;;
1391   --disable-zstd) zstd="no"
1392   ;;
1393   --enable-zstd) zstd="yes"
1394   ;;
1395   --enable-guest-agent) guest_agent="yes"
1396   ;;
1397   --disable-guest-agent) guest_agent="no"
1398   ;;
1399   --enable-guest-agent-msi) guest_agent_msi="yes"
1400   ;;
1401   --disable-guest-agent-msi) guest_agent_msi="no"
1402   ;;
1403   --with-vss-sdk) vss_win32_sdk=""
1404   ;;
1405   --with-vss-sdk=*) vss_win32_sdk="$optarg"
1406   ;;
1407   --without-vss-sdk) vss_win32_sdk="no"
1408   ;;
1409   --with-win-sdk) win_sdk=""
1410   ;;
1411   --with-win-sdk=*) win_sdk="$optarg"
1412   ;;
1413   --without-win-sdk) win_sdk="no"
1414   ;;
1415   --enable-tools) want_tools="yes"
1416   ;;
1417   --disable-tools) want_tools="no"
1418   ;;
1419   --enable-seccomp) seccomp="yes"
1420   ;;
1421   --disable-seccomp) seccomp="no"
1422   ;;
1423   --disable-glusterfs) glusterfs="no"
1424   ;;
1425   --disable-avx2) avx2_opt="no"
1426   ;;
1427   --enable-avx2) avx2_opt="yes"
1428   ;;
1429   --disable-avx512f) avx512f_opt="no"
1430   ;;
1431   --enable-avx512f) avx512f_opt="yes"
1432   ;;
1433 
1434   --enable-glusterfs) glusterfs="yes"
1435   ;;
1436   --disable-virtio-blk-data-plane|--enable-virtio-blk-data-plane)
1437       echo "$0: $opt is obsolete, virtio-blk data-plane is always on" >&2
1438   ;;
1439   --enable-vhdx|--disable-vhdx)
1440       echo "$0: $opt is obsolete, VHDX driver is always built" >&2
1441   ;;
1442   --enable-uuid|--disable-uuid)
1443       echo "$0: $opt is obsolete, UUID support is always built" >&2
1444   ;;
1445   --disable-gtk) gtk="no"
1446   ;;
1447   --enable-gtk) gtk="yes"
1448   ;;
1449   --tls-priority=*) tls_priority="$optarg"
1450   ;;
1451   --disable-gnutls) gnutls="no"
1452   ;;
1453   --enable-gnutls) gnutls="yes"
1454   ;;
1455   --disable-nettle) nettle="no"
1456   ;;
1457   --enable-nettle) nettle="yes"
1458   ;;
1459   --disable-gcrypt) gcrypt="no"
1460   ;;
1461   --enable-gcrypt) gcrypt="yes"
1462   ;;
1463   --disable-auth-pam) auth_pam="no"
1464   ;;
1465   --enable-auth-pam) auth_pam="yes"
1466   ;;
1467   --enable-rdma) rdma="yes"
1468   ;;
1469   --disable-rdma) rdma="no"
1470   ;;
1471   --enable-pvrdma) pvrdma="yes"
1472   ;;
1473   --disable-pvrdma) pvrdma="no"
1474   ;;
1475   --disable-vte) vte="no"
1476   ;;
1477   --enable-vte) vte="yes"
1478   ;;
1479   --disable-virglrenderer) virglrenderer="no"
1480   ;;
1481   --enable-virglrenderer) virglrenderer="yes"
1482   ;;
1483   --disable-tpm) tpm="no"
1484   ;;
1485   --enable-tpm) tpm="yes"
1486   ;;
1487   --disable-libssh) libssh="no"
1488   ;;
1489   --enable-libssh) libssh="yes"
1490   ;;
1491   --disable-live-block-migration) live_block_migration="no"
1492   ;;
1493   --enable-live-block-migration) live_block_migration="yes"
1494   ;;
1495   --disable-numa) numa="no"
1496   ;;
1497   --enable-numa) numa="yes"
1498   ;;
1499   --disable-libxml2) libxml2="no"
1500   ;;
1501   --enable-libxml2) libxml2="yes"
1502   ;;
1503   --disable-tcmalloc) tcmalloc="no"
1504   ;;
1505   --enable-tcmalloc) tcmalloc="yes"
1506   ;;
1507   --disable-jemalloc) jemalloc="no"
1508   ;;
1509   --enable-jemalloc) jemalloc="yes"
1510   ;;
1511   --disable-replication) replication="no"
1512   ;;
1513   --enable-replication) replication="yes"
1514   ;;
1515   --disable-vxhs) vxhs="no"
1516   ;;
1517   --enable-vxhs) vxhs="yes"
1518   ;;
1519   --disable-bochs) bochs="no"
1520   ;;
1521   --enable-bochs) bochs="yes"
1522   ;;
1523   --disable-cloop) cloop="no"
1524   ;;
1525   --enable-cloop) cloop="yes"
1526   ;;
1527   --disable-dmg) dmg="no"
1528   ;;
1529   --enable-dmg) dmg="yes"
1530   ;;
1531   --disable-qcow1) qcow1="no"
1532   ;;
1533   --enable-qcow1) qcow1="yes"
1534   ;;
1535   --disable-vdi) vdi="no"
1536   ;;
1537   --enable-vdi) vdi="yes"
1538   ;;
1539   --disable-vvfat) vvfat="no"
1540   ;;
1541   --enable-vvfat) vvfat="yes"
1542   ;;
1543   --disable-qed) qed="no"
1544   ;;
1545   --enable-qed) qed="yes"
1546   ;;
1547   --disable-parallels) parallels="no"
1548   ;;
1549   --enable-parallels) parallels="yes"
1550   ;;
1551   --disable-sheepdog) sheepdog="no"
1552   ;;
1553   --enable-sheepdog) sheepdog="yes"
1554   ;;
1555   --disable-vhost-user) vhost_user="no"
1556   ;;
1557   --enable-vhost-user) vhost_user="yes"
1558   ;;
1559   --disable-vhost-kernel) vhost_kernel="no"
1560   ;;
1561   --enable-vhost-kernel) vhost_kernel="yes"
1562   ;;
1563   --disable-capstone) capstone="no"
1564   ;;
1565   --enable-capstone) capstone="yes"
1566   ;;
1567   --enable-capstone=git) capstone="git"
1568   ;;
1569   --enable-capstone=system) capstone="system"
1570   ;;
1571   --with-git=*) git="$optarg"
1572   ;;
1573   --enable-git-update) git_update=yes
1574   ;;
1575   --disable-git-update) git_update=no
1576   ;;
1577   --enable-debug-mutex) debug_mutex=yes
1578   ;;
1579   --disable-debug-mutex) debug_mutex=no
1580   ;;
1581   --enable-libpmem) libpmem=yes
1582   ;;
1583   --disable-libpmem) libpmem=no
1584   ;;
1585   --enable-xkbcommon) xkbcommon=yes
1586   ;;
1587   --disable-xkbcommon) xkbcommon=no
1588   ;;
1589   --enable-plugins) plugins="yes"
1590   ;;
1591   --disable-plugins) plugins="no"
1592   ;;
1593   --enable-containers) use_containers="yes"
1594   ;;
1595   --disable-containers) use_containers="no"
1596   ;;
1597   --enable-fuzzing) fuzzing=yes
1598   ;;
1599   --disable-fuzzing) fuzzing=no
1600   ;;
1601   --gdb=*) gdb_bin="$optarg"
1602   ;;
1603   *)
1604       echo "ERROR: unknown option $opt"
1605       echo "Try '$0 --help' for more information"
1606       exit 1
1607   ;;
1608   esac
1609 done
1610 
1611 case "$cpu" in
1612     ppc)
1613            CPU_CFLAGS="-m32"
1614            QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS"
1615            ;;
1616     ppc64)
1617            CPU_CFLAGS="-m64"
1618            QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1619            ;;
1620     sparc)
1621            CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc"
1622            QEMU_LDFLAGS="-m32 -mv8plus $QEMU_LDFLAGS"
1623            ;;
1624     sparc64)
1625            CPU_CFLAGS="-m64 -mcpu=ultrasparc"
1626            QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1627            ;;
1628     s390)
1629            CPU_CFLAGS="-m31"
1630            QEMU_LDFLAGS="-m31 $QEMU_LDFLAGS"
1631            ;;
1632     s390x)
1633            CPU_CFLAGS="-m64"
1634            QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1635            ;;
1636     i386)
1637            CPU_CFLAGS="-m32"
1638            QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS"
1639            ;;
1640     x86_64)
1641            # ??? Only extremely old AMD cpus do not have cmpxchg16b.
1642            # If we truly care, we should simply detect this case at
1643            # runtime and generate the fallback to serial emulation.
1644            CPU_CFLAGS="-m64 -mcx16"
1645            QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1646            ;;
1647     x32)
1648            CPU_CFLAGS="-mx32"
1649            QEMU_LDFLAGS="-mx32 $QEMU_LDFLAGS"
1650            ;;
1651     # No special flags required for other host CPUs
1652 esac
1653 
1654 eval "cross_cc_${cpu}=\$host_cc"
1655 cross_cc_vars="$cross_cc_vars cross_cc_${cpu}"
1656 QEMU_CFLAGS="$CPU_CFLAGS $QEMU_CFLAGS"
1657 
1658 # For user-mode emulation the host arch has to be one we explicitly
1659 # support, even if we're using TCI.
1660 if [ "$ARCH" = "unknown" ]; then
1661   bsd_user="no"
1662   linux_user="no"
1663 fi
1664 
1665 default_target_list=""
1666 
1667 mak_wilds=""
1668 
1669 if [ "$softmmu" = "yes" ]; then
1670     mak_wilds="${mak_wilds} $source_path/default-configs/*-softmmu.mak"
1671 fi
1672 if [ "$linux_user" = "yes" ]; then
1673     mak_wilds="${mak_wilds} $source_path/default-configs/*-linux-user.mak"
1674 fi
1675 if [ "$bsd_user" = "yes" ]; then
1676     mak_wilds="${mak_wilds} $source_path/default-configs/*-bsd-user.mak"
1677 fi
1678 
1679 if test -z "$target_list_exclude"; then
1680     for config in $mak_wilds; do
1681         default_target_list="${default_target_list} $(basename "$config" .mak)"
1682     done
1683 else
1684     exclude_list=$(echo "$target_list_exclude" | sed -e 's/,/ /g')
1685     for config in $mak_wilds; do
1686         target="$(basename "$config" .mak)"
1687         exclude="no"
1688         for excl in $exclude_list; do
1689             if test "$excl" = "$target"; then
1690                 exclude="yes"
1691                 break;
1692             fi
1693         done
1694         if test "$exclude" = "no"; then
1695             default_target_list="${default_target_list} $target"
1696         fi
1697     done
1698 fi
1699 
1700 # Enumerate public trace backends for --help output
1701 trace_backend_list=$(echo $(grep -le '^PUBLIC = True$' "$source_path"/scripts/tracetool/backend/*.py | sed -e 's/^.*\/\(.*\)\.py$/\1/'))
1702 
1703 if test x"$show_help" = x"yes" ; then
1704 cat << EOF
1705 
1706 Usage: configure [options]
1707 Options: [defaults in brackets after descriptions]
1708 
1709 Standard options:
1710   --help                   print this message
1711   --prefix=PREFIX          install in PREFIX [$prefix]
1712   --interp-prefix=PREFIX   where to find shared libraries, etc.
1713                            use %M for cpu name [$interp_prefix]
1714   --target-list=LIST       set target list (default: build everything)
1715 $(echo Available targets: $default_target_list | \
1716   fold -s -w 53 | sed -e 's/^/                           /')
1717   --target-list-exclude=LIST exclude a set of targets from the default target-list
1718 
1719 Advanced options (experts only):
1720   --cross-prefix=PREFIX    use PREFIX for compile tools [$cross_prefix]
1721   --cc=CC                  use C compiler CC [$cc]
1722   --iasl=IASL              use ACPI compiler IASL [$iasl]
1723   --host-cc=CC             use C compiler CC [$host_cc] for code run at
1724                            build time
1725   --cxx=CXX                use C++ compiler CXX [$cxx]
1726   --objcc=OBJCC            use Objective-C compiler OBJCC [$objcc]
1727   --extra-cflags=CFLAGS    append extra C compiler flags QEMU_CFLAGS
1728   --extra-cxxflags=CXXFLAGS append extra C++ compiler flags QEMU_CXXFLAGS
1729   --extra-ldflags=LDFLAGS  append extra linker flags LDFLAGS
1730   --cross-cc-ARCH=CC       use compiler when building ARCH guest test cases
1731   --cross-cc-flags-ARCH=   use compiler flags when building ARCH guest tests
1732   --make=MAKE              use specified make [$make]
1733   --install=INSTALL        use specified install [$install]
1734   --python=PYTHON          use specified python [$python]
1735   --sphinx-build=SPHINX    use specified sphinx-build [$sphinx_build]
1736   --smbd=SMBD              use specified smbd [$smbd]
1737   --with-git=GIT           use specified git [$git]
1738   --static                 enable static build [$static]
1739   --mandir=PATH            install man pages in PATH
1740   --datadir=PATH           install firmware in PATH$confsuffix
1741   --docdir=PATH            install documentation in PATH$confsuffix
1742   --bindir=PATH            install binaries in PATH
1743   --libdir=PATH            install libraries in PATH
1744   --libexecdir=PATH        install helper binaries in PATH
1745   --sysconfdir=PATH        install config in PATH$confsuffix
1746   --localstatedir=PATH     install local state in PATH (set at runtime on win32)
1747   --firmwarepath=PATH      search PATH for firmware files
1748   --with-confsuffix=SUFFIX suffix for QEMU data inside datadir/libdir/sysconfdir [$confsuffix]
1749   --with-pkgversion=VERS   use specified string as sub-version of the package
1750   --enable-debug           enable common debug build options
1751   --enable-sanitizers      enable default sanitizers
1752   --disable-strip          disable stripping binaries
1753   --disable-werror         disable compilation abort on warning
1754   --disable-stack-protector disable compiler-provided stack protection
1755   --audio-drv-list=LIST    set audio drivers list:
1756                            Available drivers: $audio_possible_drivers
1757   --block-drv-whitelist=L  Same as --block-drv-rw-whitelist=L
1758   --block-drv-rw-whitelist=L
1759                            set block driver read-write whitelist
1760                            (affects only QEMU, not qemu-img)
1761   --block-drv-ro-whitelist=L
1762                            set block driver read-only whitelist
1763                            (affects only QEMU, not qemu-img)
1764   --enable-trace-backends=B Set trace backend
1765                            Available backends: $trace_backend_list
1766   --with-trace-file=NAME   Full PATH,NAME of file to store traces
1767                            Default:trace-<pid>
1768   --disable-slirp          disable SLIRP userspace network connectivity
1769   --enable-tcg-interpreter enable TCG with bytecode interpreter (TCI)
1770   --enable-malloc-trim     enable libc malloc_trim() for memory optimization
1771   --oss-lib                path to OSS library
1772   --cpu=CPU                Build for host CPU [$cpu]
1773   --with-coroutine=BACKEND coroutine backend. Supported options:
1774                            ucontext, sigaltstack, windows
1775   --enable-gcov            enable test coverage analysis with gcov
1776   --gcov=GCOV              use specified gcov [$gcov_tool]
1777   --disable-blobs          disable installing provided firmware blobs
1778   --with-vss-sdk=SDK-path  enable Windows VSS support in QEMU Guest Agent
1779   --with-win-sdk=SDK-path  path to Windows Platform SDK (to build VSS .tlb)
1780   --tls-priority           default TLS protocol/cipher priority string
1781   --enable-gprof           QEMU profiling with gprof
1782   --enable-profiler        profiler support
1783   --enable-debug-stack-usage
1784                            track the maximum stack usage of stacks created by qemu_alloc_stack
1785   --enable-plugins
1786                            enable plugins via shared library loading
1787   --disable-containers     don't use containers for cross-building
1788   --gdb=GDB-path           gdb to use for gdbstub tests [$gdb_bin]
1789 
1790 Optional features, enabled with --enable-FEATURE and
1791 disabled with --disable-FEATURE, default is enabled if available:
1792 
1793   system          all system emulation targets
1794   user            supported user emulation targets
1795   linux-user      all linux usermode emulation targets
1796   bsd-user        all BSD usermode emulation targets
1797   docs            build documentation
1798   guest-agent     build the QEMU Guest Agent
1799   guest-agent-msi build guest agent Windows MSI installation package
1800   pie             Position Independent Executables
1801   modules         modules support (non-Windows)
1802   module-upgrades try to load modules from alternate paths for upgrades
1803   debug-tcg       TCG debugging (default is disabled)
1804   debug-info      debugging information
1805   sparse          sparse checker
1806 
1807   gnutls          GNUTLS cryptography support
1808   nettle          nettle cryptography support
1809   gcrypt          libgcrypt cryptography support
1810   auth-pam        PAM access control
1811   sdl             SDL UI
1812   sdl-image       SDL Image support for icons
1813   gtk             gtk UI
1814   vte             vte support for the gtk UI
1815   curses          curses UI
1816   iconv           font glyph conversion support
1817   vnc             VNC UI support
1818   vnc-sasl        SASL encryption for VNC server
1819   vnc-jpeg        JPEG lossy compression for VNC server
1820   vnc-png         PNG compression for VNC server
1821   cocoa           Cocoa UI (Mac OS X only)
1822   virtfs          VirtFS
1823   mpath           Multipath persistent reservation passthrough
1824   xen             xen backend driver support
1825   xen-pci-passthrough    PCI passthrough support for Xen
1826   brlapi          BrlAPI (Braile)
1827   curl            curl connectivity
1828   membarrier      membarrier system call (for Linux 4.14+ or Windows)
1829   fdt             fdt device tree
1830   kvm             KVM acceleration support
1831   hax             HAX acceleration support
1832   hvf             Hypervisor.framework acceleration support
1833   whpx            Windows Hypervisor Platform acceleration support
1834   rdma            Enable RDMA-based migration
1835   pvrdma          Enable PVRDMA support
1836   vde             support for vde network
1837   netmap          support for netmap network
1838   linux-aio       Linux AIO support
1839   linux-io-uring  Linux io_uring support
1840   cap-ng          libcap-ng support
1841   attr            attr and xattr support
1842   vhost-net       vhost-net kernel acceleration support
1843   vhost-vsock     virtio sockets device support
1844   vhost-scsi      vhost-scsi kernel target support
1845   vhost-crypto    vhost-user-crypto backend support
1846   vhost-kernel    vhost kernel backend support
1847   vhost-user      vhost-user backend support
1848   spice           spice
1849   rbd             rados block device (rbd)
1850   libiscsi        iscsi support
1851   libnfs          nfs support
1852   smartcard       smartcard support (libcacard)
1853   libusb          libusb (for usb passthrough)
1854   live-block-migration   Block migration in the main migration stream
1855   usb-redir       usb network redirection support
1856   lzo             support of lzo compression library
1857   snappy          support of snappy compression library
1858   bzip2           support of bzip2 compression library
1859                   (for reading bzip2-compressed dmg images)
1860   lzfse           support of lzfse compression library
1861                   (for reading lzfse-compressed dmg images)
1862   zstd            support for zstd compression library
1863                   (for migration compression)
1864   seccomp         seccomp support
1865   coroutine-pool  coroutine freelist (better performance)
1866   glusterfs       GlusterFS backend
1867   tpm             TPM support
1868   libssh          ssh block device support
1869   numa            libnuma support
1870   libxml2         for Parallels image format
1871   tcmalloc        tcmalloc support
1872   jemalloc        jemalloc support
1873   avx2            AVX2 optimization support
1874   avx512f         AVX512F optimization support
1875   replication     replication support
1876   opengl          opengl support
1877   virglrenderer   virgl rendering support
1878   xfsctl          xfsctl support
1879   qom-cast-debug  cast debugging support
1880   tools           build qemu-io, qemu-nbd and qemu-img tools
1881   vxhs            Veritas HyperScale vDisk backend support
1882   bochs           bochs image format support
1883   cloop           cloop image format support
1884   dmg             dmg image format support
1885   qcow1           qcow v1 image format support
1886   vdi             vdi image format support
1887   vvfat           vvfat image format support
1888   qed             qed image format support
1889   parallels       parallels image format support
1890   sheepdog        sheepdog block driver support
1891   crypto-afalg    Linux AF_ALG crypto backend driver
1892   capstone        capstone disassembler support
1893   debug-mutex     mutex debugging support
1894   libpmem         libpmem support
1895   xkbcommon       xkbcommon support
1896 
1897 NOTE: The object files are built at the place where configure is launched
1898 EOF
1899 exit 0
1900 fi
1901 
1902 # Remove old dependency files to make sure that they get properly regenerated
1903 rm -f */config-devices.mak.d
1904 
1905 # Remove syscall_nr.h to be sure they will be regenerated in the build
1906 # directory, not in the source directory
1907 for arch in alpha hppa m68k xtensa sh4 microblaze arm ppc s390x sparc sparc64 \
1908     i386 x86_64 mips mips64 ; do
1909     # remove the file if it has been generated in the source directory
1910     rm -f "${source_path}/linux-user/${arch}/syscall_nr.h"
1911     # remove the dependency files
1912     for target in ${arch}*-linux-user ; do
1913         test -d "${target}" && find "${target}" -type f -name "*.d" \
1914              -exec grep -q "${source_path}/linux-user/${arch}/syscall_nr.h" {} \; \
1915              -print | while read file ; do rm "${file}" "${file%.d}.o" ; done
1916     done
1917 done
1918 
1919 if test -z "$python"
1920 then
1921     error_exit "Python not found. Use --python=/path/to/python"
1922 fi
1923 
1924 # Note that if the Python conditional here evaluates True we will exit
1925 # with status 1 which is a shell 'false' value.
1926 if ! $python -c 'import sys; sys.exit(sys.version_info < (3,5))'; then
1927   error_exit "Cannot use '$python', Python >= 3.5 is required." \
1928       "Use --python=/path/to/python to specify a supported Python."
1929 fi
1930 
1931 # Preserve python version since some functionality is dependent on it
1932 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)
1933 
1934 # Suppress writing compiled files
1935 python="$python -B"
1936 
1937 # Check that the C compiler works. Doing this here before testing
1938 # the host CPU ensures that we had a valid CC to autodetect the
1939 # $cpu var (and we should bail right here if that's not the case).
1940 # It also allows the help message to be printed without a CC.
1941 write_c_skeleton;
1942 if compile_object ; then
1943   : C compiler works ok
1944 else
1945     error_exit "\"$cc\" either does not exist or does not work"
1946 fi
1947 if ! compile_prog ; then
1948     error_exit "\"$cc\" cannot build an executable (is your linker broken?)"
1949 fi
1950 
1951 # Now we have handled --enable-tcg-interpreter and know we're not just
1952 # printing the help message, bail out if the host CPU isn't supported.
1953 if test "$ARCH" = "unknown"; then
1954     if test "$tcg_interpreter" = "yes" ; then
1955         echo "Unsupported CPU = $cpu, will use TCG with TCI (experimental)"
1956     else
1957         error_exit "Unsupported CPU = $cpu, try --enable-tcg-interpreter"
1958     fi
1959 fi
1960 
1961 # Consult white-list to determine whether to enable werror
1962 # by default.  Only enable by default for git builds
1963 if test -z "$werror" ; then
1964     if test -e "$source_path/.git" && \
1965         { test "$linux" = "yes" || test "$mingw32" = "yes"; }; then
1966         werror="yes"
1967     else
1968         werror="no"
1969     fi
1970 fi
1971 
1972 if test "$bogus_os" = "yes"; then
1973     # Now that we know that we're not printing the help and that
1974     # the compiler works (so the results of the check_defines we used
1975     # to identify the OS are reliable), if we didn't recognize the
1976     # host OS we should stop now.
1977     error_exit "Unrecognized host OS (uname -s reports '$(uname -s)')"
1978 fi
1979 
1980 # Check whether the compiler matches our minimum requirements:
1981 cat > $TMPC << EOF
1982 #if defined(__clang_major__) && defined(__clang_minor__)
1983 # ifdef __apple_build_version__
1984 #  if __clang_major__ < 5 || (__clang_major__ == 5 && __clang_minor__ < 1)
1985 #   error You need at least XCode Clang v5.1 to compile QEMU
1986 #  endif
1987 # else
1988 #  if __clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ < 4)
1989 #   error You need at least Clang v3.4 to compile QEMU
1990 #  endif
1991 # endif
1992 #elif defined(__GNUC__) && defined(__GNUC_MINOR__)
1993 # if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8)
1994 #  error You need at least GCC v4.8 to compile QEMU
1995 # endif
1996 #else
1997 # error You either need GCC or Clang to compiler QEMU
1998 #endif
1999 int main (void) { return 0; }
2000 EOF
2001 if ! compile_prog "" "" ; then
2002     error_exit "You need at least GCC v4.8 or Clang v3.4 (or XCode Clang v5.1)"
2003 fi
2004 
2005 gcc_flags="-Wold-style-declaration -Wold-style-definition -Wtype-limits"
2006 gcc_flags="-Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers $gcc_flags"
2007 gcc_flags="-Wno-missing-include-dirs -Wempty-body -Wnested-externs $gcc_flags"
2008 gcc_flags="-Wendif-labels -Wno-shift-negative-value $gcc_flags"
2009 gcc_flags="-Wno-initializer-overrides -Wexpansion-to-defined $gcc_flags"
2010 gcc_flags="-Wno-string-plus-int -Wno-typedef-redefinition $gcc_flags"
2011 # Note that we do not add -Werror to gcc_flags here, because that would
2012 # enable it for all configure tests. If a configure test failed due
2013 # to -Werror this would just silently disable some features,
2014 # so it's too error prone.
2015 
2016 cc_has_warning_flag() {
2017     write_c_skeleton;
2018 
2019     # Use the positive sense of the flag when testing for -Wno-wombat
2020     # support (gcc will happily accept the -Wno- form of unknown
2021     # warning options).
2022     optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
2023     compile_prog "-Werror $optflag" ""
2024 }
2025 
2026 for flag in $gcc_flags; do
2027     if cc_has_warning_flag $flag ; then
2028         QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2029     fi
2030 done
2031 
2032 if test "$stack_protector" != "no"; then
2033   cat > $TMPC << EOF
2034 int main(int argc, char *argv[])
2035 {
2036     char arr[64], *p = arr, *c = argv[0];
2037     while (*c) {
2038         *p++ = *c++;
2039     }
2040     return 0;
2041 }
2042 EOF
2043   gcc_flags="-fstack-protector-strong -fstack-protector-all"
2044   sp_on=0
2045   for flag in $gcc_flags; do
2046     # We need to check both a compile and a link, since some compiler
2047     # setups fail only on a .c->.o compile and some only at link time
2048     if do_cc $QEMU_CFLAGS -Werror $flag -c -o $TMPO $TMPC &&
2049        compile_prog "-Werror $flag" ""; then
2050       QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2051       QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
2052       sp_on=1
2053       break
2054     fi
2055   done
2056   if test "$stack_protector" = yes; then
2057     if test $sp_on = 0; then
2058       error_exit "Stack protector not supported"
2059     fi
2060   fi
2061 fi
2062 
2063 # Disable -Wmissing-braces on older compilers that warn even for
2064 # the "universal" C zero initializer {0}.
2065 cat > $TMPC << EOF
2066 struct {
2067   int a[2];
2068 } x = {0};
2069 EOF
2070 if compile_object "-Werror" "" ; then
2071   :
2072 else
2073   QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces"
2074 fi
2075 
2076 # Our module code doesn't support Windows
2077 if test "$modules" = "yes" && test "$mingw32" = "yes" ; then
2078   error_exit "Modules are not available for Windows"
2079 fi
2080 
2081 # module_upgrades is only reasonable if modules are enabled
2082 if test "$modules" = "no" && test "$module_upgrades" = "yes" ; then
2083   error_exit "Can't enable module-upgrades as Modules are not enabled"
2084 fi
2085 
2086 # Static linking is not possible with modules or PIE
2087 if test "$static" = "yes" ; then
2088   if test "$modules" = "yes" ; then
2089     error_exit "static and modules are mutually incompatible"
2090   fi
2091 fi
2092 
2093 # Unconditional check for compiler __thread support
2094   cat > $TMPC << EOF
2095 static __thread int tls_var;
2096 int main(void) { return tls_var; }
2097 EOF
2098 
2099 if ! compile_prog "-Werror" "" ; then
2100     error_exit "Your compiler does not support the __thread specifier for " \
2101 	"Thread-Local Storage (TLS). Please upgrade to a version that does."
2102 fi
2103 
2104 cat > $TMPC << EOF
2105 
2106 #ifdef __linux__
2107 #  define THREAD __thread
2108 #else
2109 #  define THREAD
2110 #endif
2111 static THREAD int tls_var;
2112 int main(void) { return tls_var; }
2113 EOF
2114 
2115 # Check we support --no-pie first; we will need this for building ROMs.
2116 if compile_prog "-Werror -fno-pie" "-no-pie"; then
2117   CFLAGS_NOPIE="-fno-pie"
2118   LDFLAGS_NOPIE="-no-pie"
2119 fi
2120 
2121 if test "$static" = "yes"; then
2122   if test "$pie" != "no" && compile_prog "-fPIE -DPIE" "-static-pie"; then
2123     QEMU_CFLAGS="-fPIE -DPIE $QEMU_CFLAGS"
2124     QEMU_LDFLAGS="-static-pie $QEMU_LDFLAGS"
2125     pie="yes"
2126   elif test "$pie" = "yes"; then
2127     error_exit "-static-pie not available due to missing toolchain support"
2128   else
2129     QEMU_LDFLAGS="-static $QEMU_LDFLAGS"
2130     pie="no"
2131   fi
2132 elif test "$pie" = "no"; then
2133   QEMU_CFLAGS="$CFLAGS_NOPIE $QEMU_CFLAGS"
2134   QEMU_LDFLAGS="$LDFLAGS_NOPIE $QEMU_LDFLAGS"
2135 elif compile_prog "-fPIE -DPIE" "-pie"; then
2136   QEMU_CFLAGS="-fPIE -DPIE $QEMU_CFLAGS"
2137   QEMU_LDFLAGS="-pie $QEMU_LDFLAGS"
2138   pie="yes"
2139 elif test "$pie" = "yes"; then
2140   error_exit "PIE not available due to missing toolchain support"
2141 else
2142   echo "Disabling PIE due to missing toolchain support"
2143   pie="no"
2144 fi
2145 
2146 # Detect support for PT_GNU_RELRO + DT_BIND_NOW.
2147 # The combination is known as "full relro", because .got.plt is read-only too.
2148 if compile_prog "" "-Wl,-z,relro -Wl,-z,now" ; then
2149   QEMU_LDFLAGS="-Wl,-z,relro -Wl,-z,now $QEMU_LDFLAGS"
2150 fi
2151 
2152 ##########################################
2153 # __sync_fetch_and_and requires at least -march=i486. Many toolchains
2154 # use i686 as default anyway, but for those that don't, an explicit
2155 # specification is necessary
2156 
2157 if test "$cpu" = "i386"; then
2158   cat > $TMPC << EOF
2159 static int sfaa(int *ptr)
2160 {
2161   return __sync_fetch_and_and(ptr, 0);
2162 }
2163 
2164 int main(void)
2165 {
2166   int val = 42;
2167   val = __sync_val_compare_and_swap(&val, 0, 1);
2168   sfaa(&val);
2169   return val;
2170 }
2171 EOF
2172   if ! compile_prog "" "" ; then
2173     QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS"
2174   fi
2175 fi
2176 
2177 #########################################
2178 # Solaris specific configure tool chain decisions
2179 
2180 if test "$solaris" = "yes" ; then
2181   if has $install; then
2182     :
2183   else
2184     error_exit "Solaris install program not found. Use --install=/usr/ucb/install or" \
2185         "install fileutils from www.blastwave.org using pkg-get -i fileutils" \
2186         "to get ginstall which is used by default (which lives in /opt/csw/bin)"
2187   fi
2188   if test "$(path_of $install)" = "/usr/sbin/install" ; then
2189     error_exit "Solaris /usr/sbin/install is not an appropriate install program." \
2190         "try ginstall from the GNU fileutils available from www.blastwave.org" \
2191         "using pkg-get -i fileutils, or use --install=/usr/ucb/install"
2192   fi
2193   if has ar; then
2194     :
2195   else
2196     if test -f /usr/ccs/bin/ar ; then
2197       error_exit "No path includes ar" \
2198           "Add /usr/ccs/bin to your path and rerun configure"
2199     fi
2200     error_exit "No path includes ar"
2201   fi
2202 fi
2203 
2204 if test -z "${target_list+xxx}" ; then
2205     for target in $default_target_list; do
2206         supported_target $target 2>/dev/null && \
2207             target_list="$target_list $target"
2208     done
2209     target_list="${target_list# }"
2210 else
2211     target_list=$(echo "$target_list" | sed -e 's/,/ /g')
2212     for target in $target_list; do
2213         # Check that we recognised the target name; this allows a more
2214         # friendly error message than if we let it fall through.
2215         case " $default_target_list " in
2216             *" $target "*)
2217                 ;;
2218             *)
2219                 error_exit "Unknown target name '$target'"
2220                 ;;
2221         esac
2222         supported_target $target || exit 1
2223     done
2224 fi
2225 
2226 # see if system emulation was really requested
2227 case " $target_list " in
2228   *"-softmmu "*) softmmu=yes
2229   ;;
2230   *) softmmu=no
2231   ;;
2232 esac
2233 
2234 for target in $target_list; do
2235   case "$target" in
2236     arm-softmmu | aarch64-softmmu | i386-softmmu | x86_64-softmmu)
2237       edk2_blobs="yes"
2238       ;;
2239   esac
2240 done
2241 # The EDK2 binaries are compressed with bzip2
2242 if test "$edk2_blobs" = "yes" && ! has bzip2; then
2243   error_exit "The bzip2 program is required for building QEMU"
2244 fi
2245 
2246 feature_not_found() {
2247   feature=$1
2248   remedy=$2
2249 
2250   error_exit "User requested feature $feature" \
2251       "configure was not able to find it." \
2252       "$remedy"
2253 }
2254 
2255 # ---
2256 # big/little endian test
2257 cat > $TMPC << EOF
2258 short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, };
2259 short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, };
2260 extern int foo(short *, short *);
2261 int main(int argc, char *argv[]) {
2262     return foo(big_endian, little_endian);
2263 }
2264 EOF
2265 
2266 if compile_object ; then
2267     if strings -a $TMPO | grep -q BiGeNdIaN ; then
2268         bigendian="yes"
2269     elif strings -a $TMPO | grep -q LiTtLeEnDiAn ; then
2270         bigendian="no"
2271     else
2272         echo big/little test failed
2273     fi
2274 else
2275     echo big/little test failed
2276 fi
2277 
2278 ##########################################
2279 # system tools
2280 if test -z "$want_tools"; then
2281     if test "$softmmu" = "no"; then
2282         want_tools=no
2283     else
2284         want_tools=yes
2285     fi
2286 fi
2287 
2288 ##########################################
2289 # cocoa implies not SDL or GTK
2290 # (the cocoa UI code currently assumes it is always the active UI
2291 # and doesn't interact well with other UI frontend code)
2292 if test "$cocoa" = "yes"; then
2293     if test "$sdl" = "yes"; then
2294         error_exit "Cocoa and SDL UIs cannot both be enabled at once"
2295     fi
2296     if test "$gtk" = "yes"; then
2297         error_exit "Cocoa and GTK UIs cannot both be enabled at once"
2298     fi
2299     gtk=no
2300     sdl=no
2301 fi
2302 
2303 # Some versions of Mac OS X incorrectly define SIZE_MAX
2304 cat > $TMPC << EOF
2305 #include <stdint.h>
2306 #include <stdio.h>
2307 int main(int argc, char *argv[]) {
2308     return printf("%zu", SIZE_MAX);
2309 }
2310 EOF
2311 have_broken_size_max=no
2312 if ! compile_object -Werror ; then
2313     have_broken_size_max=yes
2314 fi
2315 
2316 ##########################################
2317 # L2TPV3 probe
2318 
2319 cat > $TMPC <<EOF
2320 #include <sys/socket.h>
2321 #include <linux/ip.h>
2322 int main(void) { return sizeof(struct mmsghdr); }
2323 EOF
2324 if compile_prog "" "" ; then
2325   l2tpv3=yes
2326 else
2327   l2tpv3=no
2328 fi
2329 
2330 #########################################
2331 # vhost interdependencies and host support
2332 
2333 # vhost backends
2334 test "$vhost_user" = "" && vhost_user=yes
2335 if test "$vhost_user" = "yes" && test "$mingw32" = "yes"; then
2336   error_exit "vhost-user isn't available on win32"
2337 fi
2338 test "$vhost_kernel" = "" && vhost_kernel=$linux
2339 if test "$vhost_kernel" = "yes" && test "$linux" != "yes"; then
2340   error_exit "vhost-kernel is only available on Linux"
2341 fi
2342 
2343 # vhost-kernel devices
2344 test "$vhost_scsi" = "" && vhost_scsi=$vhost_kernel
2345 if test "$vhost_scsi" = "yes" && test "$vhost_kernel" != "yes"; then
2346   error_exit "--enable-vhost-scsi requires --enable-vhost-kernel"
2347 fi
2348 test "$vhost_vsock" = "" && vhost_vsock=$vhost_kernel
2349 if test "$vhost_vsock" = "yes" && test "$vhost_kernel" != "yes"; then
2350   error_exit "--enable-vhost-vsock requires --enable-vhost-kernel"
2351 fi
2352 
2353 # vhost-user backends
2354 test "$vhost_net_user" = "" && vhost_net_user=$vhost_user
2355 if test "$vhost_net_user" = "yes" && test "$vhost_user" = "no"; then
2356   error_exit "--enable-vhost-net-user requires --enable-vhost-user"
2357 fi
2358 test "$vhost_crypto" = "" && vhost_crypto=$vhost_user
2359 if test "$vhost_crypto" = "yes" && test "$vhost_user" = "no"; then
2360   error_exit "--enable-vhost-crypto requires --enable-vhost-user"
2361 fi
2362 test "$vhost_user_fs" = "" && vhost_user_fs=$vhost_user
2363 if test "$vhost_user_fs" = "yes" && test "$vhost_user" = "no"; then
2364   error_exit "--enable-vhost-user-fs requires --enable-vhost-user"
2365 fi
2366 
2367 # OR the vhost-kernel and vhost-user values for simplicity
2368 if test "$vhost_net" = ""; then
2369   test "$vhost_net_user" = "yes" && vhost_net=yes
2370   test "$vhost_kernel" = "yes" && vhost_net=yes
2371 fi
2372 
2373 ##########################################
2374 # MinGW / Mingw-w64 localtime_r/gmtime_r check
2375 
2376 if test "$mingw32" = "yes"; then
2377     # Some versions of MinGW / Mingw-w64 lack localtime_r
2378     # and gmtime_r entirely.
2379     #
2380     # Some versions of Mingw-w64 define a macro for
2381     # localtime_r/gmtime_r.
2382     #
2383     # Some versions of Mingw-w64 will define functions
2384     # for localtime_r/gmtime_r, but only if you have
2385     # _POSIX_THREAD_SAFE_FUNCTIONS defined. For fun
2386     # though, unistd.h and pthread.h both define
2387     # that for you.
2388     #
2389     # So this #undef localtime_r and #include <unistd.h>
2390     # are not in fact redundant.
2391 cat > $TMPC << EOF
2392 #include <unistd.h>
2393 #include <time.h>
2394 #undef localtime_r
2395 int main(void) { localtime_r(NULL, NULL); return 0; }
2396 EOF
2397     if compile_prog "" "" ; then
2398         localtime_r="yes"
2399     else
2400         localtime_r="no"
2401     fi
2402 fi
2403 
2404 ##########################################
2405 # pkg-config probe
2406 
2407 if ! has "$pkg_config_exe"; then
2408   error_exit "pkg-config binary '$pkg_config_exe' not found"
2409 fi
2410 
2411 ##########################################
2412 # NPTL probe
2413 
2414 if test "$linux_user" = "yes"; then
2415   cat > $TMPC <<EOF
2416 #include <sched.h>
2417 #include <linux/futex.h>
2418 int main(void) {
2419 #if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
2420 #error bork
2421 #endif
2422   return 0;
2423 }
2424 EOF
2425   if ! compile_object ; then
2426     feature_not_found "nptl" "Install glibc and linux kernel headers."
2427   fi
2428 fi
2429 
2430 ##########################################
2431 # lzo check
2432 
2433 if test "$lzo" != "no" ; then
2434     cat > $TMPC << EOF
2435 #include <lzo/lzo1x.h>
2436 int main(void) { lzo_version(); return 0; }
2437 EOF
2438     if compile_prog "" "-llzo2" ; then
2439         libs_softmmu="$libs_softmmu -llzo2"
2440         lzo="yes"
2441     else
2442         if test "$lzo" = "yes"; then
2443             feature_not_found "liblzo2" "Install liblzo2 devel"
2444         fi
2445         lzo="no"
2446     fi
2447 fi
2448 
2449 ##########################################
2450 # snappy check
2451 
2452 if test "$snappy" != "no" ; then
2453     cat > $TMPC << EOF
2454 #include <snappy-c.h>
2455 int main(void) { snappy_max_compressed_length(4096); return 0; }
2456 EOF
2457     if compile_prog "" "-lsnappy" ; then
2458         libs_softmmu="$libs_softmmu -lsnappy"
2459         snappy="yes"
2460     else
2461         if test "$snappy" = "yes"; then
2462             feature_not_found "libsnappy" "Install libsnappy devel"
2463         fi
2464         snappy="no"
2465     fi
2466 fi
2467 
2468 ##########################################
2469 # bzip2 check
2470 
2471 if test "$bzip2" != "no" ; then
2472     cat > $TMPC << EOF
2473 #include <bzlib.h>
2474 int main(void) { BZ2_bzlibVersion(); return 0; }
2475 EOF
2476     if compile_prog "" "-lbz2" ; then
2477         bzip2="yes"
2478     else
2479         if test "$bzip2" = "yes"; then
2480             feature_not_found "libbzip2" "Install libbzip2 devel"
2481         fi
2482         bzip2="no"
2483     fi
2484 fi
2485 
2486 ##########################################
2487 # lzfse check
2488 
2489 if test "$lzfse" != "no" ; then
2490     cat > $TMPC << EOF
2491 #include <lzfse.h>
2492 int main(void) { lzfse_decode_scratch_size(); return 0; }
2493 EOF
2494     if compile_prog "" "-llzfse" ; then
2495         lzfse="yes"
2496     else
2497         if test "$lzfse" = "yes"; then
2498             feature_not_found "lzfse" "Install lzfse devel"
2499         fi
2500         lzfse="no"
2501     fi
2502 fi
2503 
2504 ##########################################
2505 # zstd check
2506 
2507 if test "$zstd" != "no" ; then
2508     libzstd_minver="1.4.0"
2509     if $pkg_config --atleast-version=$libzstd_minver libzstd ; then
2510         zstd_cflags="$($pkg_config --cflags libzstd)"
2511         zstd_libs="$($pkg_config --libs libzstd)"
2512         LIBS="$zstd_libs $LIBS"
2513         QEMU_CFLAGS="$QEMU_CFLAGS $zstd_cflags"
2514         zstd="yes"
2515     else
2516         if test "$zstd" = "yes" ; then
2517             feature_not_found "libzstd" "Install libzstd devel"
2518         fi
2519         zstd="no"
2520     fi
2521 fi
2522 
2523 ##########################################
2524 # libseccomp check
2525 
2526 if test "$seccomp" != "no" ; then
2527     libseccomp_minver="2.3.0"
2528     if $pkg_config --atleast-version=$libseccomp_minver libseccomp ; then
2529         seccomp_cflags="$($pkg_config --cflags libseccomp)"
2530         seccomp_libs="$($pkg_config --libs libseccomp)"
2531         seccomp="yes"
2532     else
2533         if test "$seccomp" = "yes" ; then
2534             feature_not_found "libseccomp" \
2535                  "Install libseccomp devel >= $libseccomp_minver"
2536         fi
2537         seccomp="no"
2538     fi
2539 fi
2540 ##########################################
2541 # xen probe
2542 
2543 if test "$xen" != "no" ; then
2544   # Check whether Xen library path is specified via --extra-ldflags to avoid
2545   # overriding this setting with pkg-config output. If not, try pkg-config
2546   # to obtain all needed flags.
2547 
2548   if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
2549      $pkg_config --exists xencontrol ; then
2550     xen_ctrl_version="$(printf '%d%02d%02d' \
2551       $($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
2552     xen=yes
2553     xen_pc="xencontrol xenstore xenguest xenforeignmemory xengnttab"
2554     xen_pc="$xen_pc xenevtchn xendevicemodel"
2555     if $pkg_config --exists xentoolcore; then
2556       xen_pc="$xen_pc xentoolcore"
2557     fi
2558     QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags $xen_pc)"
2559     libs_softmmu="$($pkg_config --libs $xen_pc) $libs_softmmu"
2560   else
2561 
2562     xen_libs="-lxenstore -lxenctrl -lxenguest"
2563     xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
2564 
2565     # First we test whether Xen headers and libraries are available.
2566     # If no, we are done and there is no Xen support.
2567     # If yes, more tests are run to detect the Xen version.
2568 
2569     # Xen (any)
2570     cat > $TMPC <<EOF
2571 #include <xenctrl.h>
2572 int main(void) {
2573   return 0;
2574 }
2575 EOF
2576     if ! compile_prog "" "$xen_libs" ; then
2577       # Xen not found
2578       if test "$xen" = "yes" ; then
2579         feature_not_found "xen" "Install xen devel"
2580       fi
2581       xen=no
2582 
2583     # Xen unstable
2584     elif
2585         cat > $TMPC <<EOF &&
2586 #undef XC_WANT_COMPAT_DEVICEMODEL_API
2587 #define __XEN_TOOLS__
2588 #include <xendevicemodel.h>
2589 #include <xenforeignmemory.h>
2590 int main(void) {
2591   xendevicemodel_handle *xd;
2592   xenforeignmemory_handle *xfmem;
2593 
2594   xd = xendevicemodel_open(0, 0);
2595   xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
2596 
2597   xfmem = xenforeignmemory_open(0, 0);
2598   xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
2599 
2600   return 0;
2601 }
2602 EOF
2603         compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2604       then
2605       xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2606       xen_ctrl_version=41100
2607       xen=yes
2608     elif
2609         cat > $TMPC <<EOF &&
2610 #undef XC_WANT_COMPAT_MAP_FOREIGN_API
2611 #include <xenforeignmemory.h>
2612 #include <xentoolcore.h>
2613 int main(void) {
2614   xenforeignmemory_handle *xfmem;
2615 
2616   xfmem = xenforeignmemory_open(0, 0);
2617   xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
2618   xentoolcore_restrict_all(0);
2619 
2620   return 0;
2621 }
2622 EOF
2623         compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2624       then
2625       xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2626       xen_ctrl_version=41000
2627       xen=yes
2628     elif
2629         cat > $TMPC <<EOF &&
2630 #undef XC_WANT_COMPAT_DEVICEMODEL_API
2631 #define __XEN_TOOLS__
2632 #include <xendevicemodel.h>
2633 int main(void) {
2634   xendevicemodel_handle *xd;
2635 
2636   xd = xendevicemodel_open(0, 0);
2637   xendevicemodel_close(xd);
2638 
2639   return 0;
2640 }
2641 EOF
2642         compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
2643       then
2644       xen_stable_libs="-lxendevicemodel $xen_stable_libs"
2645       xen_ctrl_version=40900
2646       xen=yes
2647     elif
2648         cat > $TMPC <<EOF &&
2649 /*
2650  * If we have stable libs the we don't want the libxc compat
2651  * layers, regardless of what CFLAGS we may have been given.
2652  *
2653  * Also, check if xengnttab_grant_copy_segment_t is defined and
2654  * grant copy operation is implemented.
2655  */
2656 #undef XC_WANT_COMPAT_EVTCHN_API
2657 #undef XC_WANT_COMPAT_GNTTAB_API
2658 #undef XC_WANT_COMPAT_MAP_FOREIGN_API
2659 #include <xenctrl.h>
2660 #include <xenstore.h>
2661 #include <xenevtchn.h>
2662 #include <xengnttab.h>
2663 #include <xenforeignmemory.h>
2664 #include <stdint.h>
2665 #include <xen/hvm/hvm_info_table.h>
2666 #if !defined(HVM_MAX_VCPUS)
2667 # error HVM_MAX_VCPUS not defined
2668 #endif
2669 int main(void) {
2670   xc_interface *xc = NULL;
2671   xenforeignmemory_handle *xfmem;
2672   xenevtchn_handle *xe;
2673   xengnttab_handle *xg;
2674   xengnttab_grant_copy_segment_t* seg = NULL;
2675 
2676   xs_daemon_open();
2677 
2678   xc = xc_interface_open(0, 0, 0);
2679   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2680   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2681   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2682   xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2683 
2684   xfmem = xenforeignmemory_open(0, 0);
2685   xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2686 
2687   xe = xenevtchn_open(0, 0);
2688   xenevtchn_fd(xe);
2689 
2690   xg = xengnttab_open(0, 0);
2691   xengnttab_grant_copy(xg, 0, seg);
2692 
2693   return 0;
2694 }
2695 EOF
2696         compile_prog "" "$xen_libs $xen_stable_libs"
2697       then
2698       xen_ctrl_version=40800
2699       xen=yes
2700     elif
2701         cat > $TMPC <<EOF &&
2702 /*
2703  * If we have stable libs the we don't want the libxc compat
2704  * layers, regardless of what CFLAGS we may have been given.
2705  */
2706 #undef XC_WANT_COMPAT_EVTCHN_API
2707 #undef XC_WANT_COMPAT_GNTTAB_API
2708 #undef XC_WANT_COMPAT_MAP_FOREIGN_API
2709 #include <xenctrl.h>
2710 #include <xenstore.h>
2711 #include <xenevtchn.h>
2712 #include <xengnttab.h>
2713 #include <xenforeignmemory.h>
2714 #include <stdint.h>
2715 #include <xen/hvm/hvm_info_table.h>
2716 #if !defined(HVM_MAX_VCPUS)
2717 # error HVM_MAX_VCPUS not defined
2718 #endif
2719 int main(void) {
2720   xc_interface *xc = NULL;
2721   xenforeignmemory_handle *xfmem;
2722   xenevtchn_handle *xe;
2723   xengnttab_handle *xg;
2724 
2725   xs_daemon_open();
2726 
2727   xc = xc_interface_open(0, 0, 0);
2728   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2729   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2730   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2731   xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2732 
2733   xfmem = xenforeignmemory_open(0, 0);
2734   xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2735 
2736   xe = xenevtchn_open(0, 0);
2737   xenevtchn_fd(xe);
2738 
2739   xg = xengnttab_open(0, 0);
2740   xengnttab_map_grant_ref(xg, 0, 0, 0);
2741 
2742   return 0;
2743 }
2744 EOF
2745         compile_prog "" "$xen_libs $xen_stable_libs"
2746       then
2747       xen_ctrl_version=40701
2748       xen=yes
2749 
2750     # Xen 4.6
2751     elif
2752         cat > $TMPC <<EOF &&
2753 #include <xenctrl.h>
2754 #include <xenstore.h>
2755 #include <stdint.h>
2756 #include <xen/hvm/hvm_info_table.h>
2757 #if !defined(HVM_MAX_VCPUS)
2758 # error HVM_MAX_VCPUS not defined
2759 #endif
2760 int main(void) {
2761   xc_interface *xc;
2762   xs_daemon_open();
2763   xc = xc_interface_open(0, 0, 0);
2764   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2765   xc_gnttab_open(NULL, 0);
2766   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2767   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2768   xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2769   xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
2770   return 0;
2771 }
2772 EOF
2773         compile_prog "" "$xen_libs"
2774       then
2775       xen_ctrl_version=40600
2776       xen=yes
2777 
2778     # Xen 4.5
2779     elif
2780         cat > $TMPC <<EOF &&
2781 #include <xenctrl.h>
2782 #include <xenstore.h>
2783 #include <stdint.h>
2784 #include <xen/hvm/hvm_info_table.h>
2785 #if !defined(HVM_MAX_VCPUS)
2786 # error HVM_MAX_VCPUS not defined
2787 #endif
2788 int main(void) {
2789   xc_interface *xc;
2790   xs_daemon_open();
2791   xc = xc_interface_open(0, 0, 0);
2792   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2793   xc_gnttab_open(NULL, 0);
2794   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2795   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2796   xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
2797   return 0;
2798 }
2799 EOF
2800         compile_prog "" "$xen_libs"
2801       then
2802       xen_ctrl_version=40500
2803       xen=yes
2804 
2805     elif
2806         cat > $TMPC <<EOF &&
2807 #include <xenctrl.h>
2808 #include <xenstore.h>
2809 #include <stdint.h>
2810 #include <xen/hvm/hvm_info_table.h>
2811 #if !defined(HVM_MAX_VCPUS)
2812 # error HVM_MAX_VCPUS not defined
2813 #endif
2814 int main(void) {
2815   xc_interface *xc;
2816   xs_daemon_open();
2817   xc = xc_interface_open(0, 0, 0);
2818   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2819   xc_gnttab_open(NULL, 0);
2820   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2821   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2822   return 0;
2823 }
2824 EOF
2825         compile_prog "" "$xen_libs"
2826       then
2827       xen_ctrl_version=40200
2828       xen=yes
2829 
2830     else
2831       if test "$xen" = "yes" ; then
2832         feature_not_found "xen (unsupported version)" \
2833                           "Install a supported xen (xen 4.2 or newer)"
2834       fi
2835       xen=no
2836     fi
2837 
2838     if test "$xen" = yes; then
2839       if test $xen_ctrl_version -ge 40701  ; then
2840         libs_softmmu="$xen_stable_libs $libs_softmmu"
2841       fi
2842       libs_softmmu="$xen_libs $libs_softmmu"
2843     fi
2844   fi
2845 fi
2846 
2847 if test "$xen_pci_passthrough" != "no"; then
2848   if test "$xen" = "yes" && test "$linux" = "yes"; then
2849     xen_pci_passthrough=yes
2850   else
2851     if test "$xen_pci_passthrough" = "yes"; then
2852       error_exit "User requested feature Xen PCI Passthrough" \
2853           " but this feature requires /sys from Linux"
2854     fi
2855     xen_pci_passthrough=no
2856   fi
2857 fi
2858 
2859 ##########################################
2860 # Windows Hypervisor Platform accelerator (WHPX) check
2861 if test "$whpx" != "no" ; then
2862     if check_include "WinHvPlatform.h" && check_include "WinHvEmulation.h"; then
2863         whpx="yes"
2864     else
2865         if test "$whpx" = "yes"; then
2866             feature_not_found "WinHvPlatform" "WinHvEmulation is not installed"
2867         fi
2868         whpx="no"
2869     fi
2870 fi
2871 
2872 ##########################################
2873 # Sparse probe
2874 if test "$sparse" != "no" ; then
2875   if has cgcc; then
2876     sparse=yes
2877   else
2878     if test "$sparse" = "yes" ; then
2879       feature_not_found "sparse" "Install sparse binary"
2880     fi
2881     sparse=no
2882   fi
2883 fi
2884 
2885 ##########################################
2886 # X11 probe
2887 if $pkg_config --exists "x11"; then
2888     have_x11=yes
2889     x11_cflags=$($pkg_config --cflags x11)
2890     x11_libs=$($pkg_config --libs x11)
2891 fi
2892 
2893 ##########################################
2894 # GTK probe
2895 
2896 if test "$gtk" != "no"; then
2897     gtkpackage="gtk+-3.0"
2898     gtkx11package="gtk+-x11-3.0"
2899     gtkversion="3.14.0"
2900     if $pkg_config --exists "$gtkpackage >= $gtkversion"; then
2901         gtk_cflags=$($pkg_config --cflags $gtkpackage)
2902         gtk_libs=$($pkg_config --libs $gtkpackage)
2903         gtk_version=$($pkg_config --modversion $gtkpackage)
2904         if $pkg_config --exists "$gtkx11package >= $gtkversion"; then
2905             need_x11=yes
2906             gtk_cflags="$gtk_cflags $x11_cflags"
2907             gtk_libs="$gtk_libs $x11_libs"
2908         fi
2909         gtk="yes"
2910     elif test "$gtk" = "yes"; then
2911         feature_not_found "gtk" "Install gtk3-devel"
2912     else
2913         gtk="no"
2914     fi
2915 fi
2916 
2917 
2918 ##########################################
2919 # GNUTLS probe
2920 
2921 if test "$gnutls" != "no"; then
2922     pass="no"
2923     if $pkg_config --exists "gnutls >= 3.1.18"; then
2924         gnutls_cflags=$($pkg_config --cflags gnutls)
2925         gnutls_libs=$($pkg_config --libs gnutls)
2926         # Packaging for the static libraries is not always correct.
2927         # At least ubuntu 18.04 ships only shared libraries.
2928         write_c_skeleton
2929         if compile_prog "" "$gnutls_libs" ; then
2930             LIBS="$gnutls_libs $LIBS"
2931             QEMU_CFLAGS="$QEMU_CFLAGS $gnutls_cflags"
2932             pass="yes"
2933         fi
2934     fi
2935     if test "$pass" = "no" && test "$gnutls" = "yes"; then
2936 	feature_not_found "gnutls" "Install gnutls devel >= 3.1.18"
2937     else
2938         gnutls="$pass"
2939     fi
2940 fi
2941 
2942 
2943 # If user didn't give a --disable/enable-gcrypt flag,
2944 # then mark as disabled if user requested nettle
2945 # explicitly
2946 if test -z "$gcrypt"
2947 then
2948     if test "$nettle" = "yes"
2949     then
2950         gcrypt="no"
2951     fi
2952 fi
2953 
2954 # If user didn't give a --disable/enable-nettle flag,
2955 # then mark as disabled if user requested gcrypt
2956 # explicitly
2957 if test -z "$nettle"
2958 then
2959     if test "$gcrypt" = "yes"
2960     then
2961         nettle="no"
2962     fi
2963 fi
2964 
2965 has_libgcrypt() {
2966     if ! has "libgcrypt-config"
2967     then
2968 	return 1
2969     fi
2970 
2971     if test -n "$cross_prefix"
2972     then
2973 	host=$(libgcrypt-config --host)
2974 	if test "$host-" != $cross_prefix
2975 	then
2976 	    return 1
2977 	fi
2978     fi
2979 
2980     maj=`libgcrypt-config --version | awk -F . '{print $1}'`
2981     min=`libgcrypt-config --version | awk -F . '{print $2}'`
2982 
2983     if test $maj != 1 || test $min -lt 5
2984     then
2985        return 1
2986     fi
2987 
2988     return 0
2989 }
2990 
2991 
2992 if test "$nettle" != "no"; then
2993     pass="no"
2994     if $pkg_config --exists "nettle >= 2.7.1"; then
2995         nettle_cflags=$($pkg_config --cflags nettle)
2996         nettle_libs=$($pkg_config --libs nettle)
2997         nettle_version=$($pkg_config --modversion nettle)
2998         # Link test to make sure the given libraries work (e.g for static).
2999         write_c_skeleton
3000         if compile_prog "" "$nettle_libs" ; then
3001             LIBS="$nettle_libs $LIBS"
3002             QEMU_CFLAGS="$QEMU_CFLAGS $nettle_cflags"
3003             if test -z "$gcrypt"; then
3004                gcrypt="no"
3005             fi
3006             pass="yes"
3007         fi
3008     fi
3009     if test "$pass" = "yes"
3010     then
3011         cat > $TMPC << EOF
3012 #include <nettle/xts.h>
3013 int main(void) {
3014   return 0;
3015 }
3016 EOF
3017         if compile_prog "$nettle_cflags" "$nettle_libs" ; then
3018             nettle_xts=yes
3019             qemu_private_xts=no
3020         fi
3021     fi
3022     if test "$pass" = "no" && test "$nettle" = "yes"; then
3023         feature_not_found "nettle" "Install nettle devel >= 2.7.1"
3024     else
3025         nettle="$pass"
3026     fi
3027 fi
3028 
3029 if test "$gcrypt" != "no"; then
3030     pass="no"
3031     if has_libgcrypt; then
3032         gcrypt_cflags=$(libgcrypt-config --cflags)
3033         gcrypt_libs=$(libgcrypt-config --libs)
3034         # Debian has removed -lgpg-error from libgcrypt-config
3035         # as it "spreads unnecessary dependencies" which in
3036         # turn breaks static builds...
3037         if test "$static" = "yes"
3038         then
3039             gcrypt_libs="$gcrypt_libs -lgpg-error"
3040         fi
3041 
3042         # Link test to make sure the given libraries work (e.g for static).
3043         write_c_skeleton
3044         if compile_prog "" "$gcrypt_libs" ; then
3045             LIBS="$gcrypt_libs $LIBS"
3046             QEMU_CFLAGS="$QEMU_CFLAGS $gcrypt_cflags"
3047             pass="yes"
3048         fi
3049     fi
3050     if test "$pass" = "yes"; then
3051         gcrypt="yes"
3052         cat > $TMPC << EOF
3053 #include <gcrypt.h>
3054 int main(void) {
3055   gcry_mac_hd_t handle;
3056   gcry_mac_open(&handle, GCRY_MAC_HMAC_MD5,
3057                 GCRY_MAC_FLAG_SECURE, NULL);
3058   return 0;
3059 }
3060 EOF
3061         if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
3062             gcrypt_hmac=yes
3063         fi
3064         cat > $TMPC << EOF
3065 #include <gcrypt.h>
3066 int main(void) {
3067   gcry_cipher_hd_t handle;
3068   gcry_cipher_open(&handle, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_XTS, 0);
3069   return 0;
3070 }
3071 EOF
3072         if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
3073             gcrypt_xts=yes
3074             qemu_private_xts=no
3075         fi
3076     elif test "$gcrypt" = "yes"; then
3077         feature_not_found "gcrypt" "Install gcrypt devel >= 1.5.0"
3078     else
3079         gcrypt="no"
3080     fi
3081 fi
3082 
3083 
3084 if test "$gcrypt" = "yes" && test "$nettle" = "yes"
3085 then
3086     error_exit "Only one of gcrypt & nettle can be enabled"
3087 fi
3088 
3089 ##########################################
3090 # libtasn1 - only for the TLS creds/session test suite
3091 
3092 tasn1=yes
3093 tasn1_cflags=""
3094 tasn1_libs=""
3095 if $pkg_config --exists "libtasn1"; then
3096     tasn1_cflags=$($pkg_config --cflags libtasn1)
3097     tasn1_libs=$($pkg_config --libs libtasn1)
3098 else
3099     tasn1=no
3100 fi
3101 
3102 
3103 ##########################################
3104 # PAM probe
3105 
3106 if test "$auth_pam" != "no"; then
3107     cat > $TMPC <<EOF
3108 #include <security/pam_appl.h>
3109 #include <stdio.h>
3110 int main(void) {
3111    const char *service_name = "qemu";
3112    const char *user = "frank";
3113    const struct pam_conv pam_conv = { 0 };
3114    pam_handle_t *pamh = NULL;
3115    pam_start(service_name, user, &pam_conv, &pamh);
3116    return 0;
3117 }
3118 EOF
3119     if compile_prog "" "-lpam" ; then
3120         auth_pam=yes
3121     else
3122         if test "$auth_pam" = "yes"; then
3123             feature_not_found "PAM" "Install PAM development package"
3124         else
3125             auth_pam=no
3126         fi
3127     fi
3128 fi
3129 
3130 ##########################################
3131 # getifaddrs (for tests/test-io-channel-socket )
3132 
3133 have_ifaddrs_h=yes
3134 if ! check_include "ifaddrs.h" ; then
3135   have_ifaddrs_h=no
3136 fi
3137 
3138 ##########################################
3139 # VTE probe
3140 
3141 if test "$vte" != "no"; then
3142     vteminversion="0.32.0"
3143     if $pkg_config --exists "vte-2.91"; then
3144       vtepackage="vte-2.91"
3145     else
3146       vtepackage="vte-2.90"
3147     fi
3148     if $pkg_config --exists "$vtepackage >= $vteminversion"; then
3149         vte_cflags=$($pkg_config --cflags $vtepackage)
3150         vte_libs=$($pkg_config --libs $vtepackage)
3151         vteversion=$($pkg_config --modversion $vtepackage)
3152         vte="yes"
3153     elif test "$vte" = "yes"; then
3154         feature_not_found "vte" "Install libvte-2.90/2.91 devel"
3155     else
3156         vte="no"
3157     fi
3158 fi
3159 
3160 ##########################################
3161 # SDL probe
3162 
3163 # Look for sdl configuration program (pkg-config or sdl2-config).  Try
3164 # sdl2-config even without cross prefix, and favour pkg-config over sdl2-config.
3165 
3166 sdl_probe ()
3167 {
3168   if $pkg_config sdl2 --exists; then
3169     sdlconfig="$pkg_config sdl2"
3170     sdlversion=$($sdlconfig --modversion 2>/dev/null)
3171   elif has "$sdl2_config"; then
3172     sdlconfig="$sdl2_config"
3173     sdlversion=$($sdlconfig --version)
3174   else
3175     if test "$sdl" = "yes" ; then
3176       feature_not_found "sdl" "Install SDL2-devel"
3177     fi
3178     sdl=no
3179     # no need to do the rest
3180     return
3181   fi
3182   if test -n "$cross_prefix" && test "$(basename "$sdlconfig")" = sdl2-config; then
3183     echo warning: using "\"$sdlconfig\"" to detect cross-compiled sdl >&2
3184   fi
3185 
3186   cat > $TMPC << EOF
3187 #include <SDL.h>
3188 #undef main /* We don't want SDL to override our main() */
3189 int main( void ) { return SDL_Init (SDL_INIT_VIDEO); }
3190 EOF
3191   sdl_cflags=$($sdlconfig --cflags 2>/dev/null)
3192   sdl_cflags="$sdl_cflags -Wno-undef"  # workaround 2.0.8 bug
3193   if test "$static" = "yes" ; then
3194     if $pkg_config sdl2 --exists; then
3195       sdl_libs=$($pkg_config sdl2 --static --libs 2>/dev/null)
3196     else
3197       sdl_libs=$($sdlconfig --static-libs 2>/dev/null)
3198     fi
3199   else
3200     sdl_libs=$($sdlconfig --libs 2>/dev/null)
3201   fi
3202   if compile_prog "$sdl_cflags" "$sdl_libs" ; then
3203     sdl=yes
3204 
3205     # static link with sdl ? (note: sdl.pc's --static --libs is broken)
3206     if test "$sdl" = "yes" && test "$static" = "yes" ; then
3207       if test $? = 0 && echo $sdl_libs | grep -- -laa > /dev/null; then
3208          sdl_libs="$sdl_libs $(aalib-config --static-libs 2>/dev/null)"
3209          sdl_cflags="$sdl_cflags $(aalib-config --cflags 2>/dev/null)"
3210       fi
3211       if compile_prog "$sdl_cflags" "$sdl_libs" ; then
3212 	:
3213       else
3214         sdl=no
3215       fi
3216     fi # static link
3217   else # sdl not found
3218     if test "$sdl" = "yes" ; then
3219       feature_not_found "sdl" "Install SDL2 devel"
3220     fi
3221     sdl=no
3222   fi # sdl compile test
3223 }
3224 
3225 sdl_image_probe ()
3226 {
3227     if test "$sdl_image" != "no" ; then
3228         if $pkg_config SDL2_image --exists; then
3229             if test "$static" = "yes"; then
3230                 sdl_image_libs=$($pkg_config SDL2_image --libs --static 2>/dev/null)
3231             else
3232                 sdl_image_libs=$($pkg_config SDL2_image --libs 2>/dev/null)
3233             fi
3234             sdl_image_cflags=$($pkg_config SDL2_image --cflags 2>/dev/null)
3235             sdl_image=yes
3236 
3237             sdl_cflags="$sdl_cflags $sdl_image_cflags"
3238             sdl_libs="$sdl_libs $sdl_image_libs"
3239         else
3240             if test "$sdl_image" = "yes" ; then
3241                 feature_not_found "sdl_image" "Install SDL Image devel"
3242             else
3243                 sdl_image=no
3244             fi
3245         fi
3246     fi
3247 }
3248 
3249 if test "$sdl" != "no" ; then
3250   sdl_probe
3251 fi
3252 
3253 if test "$sdl" = "yes" ; then
3254   sdl_image_probe
3255 else
3256   if test "$sdl_image" = "yes"; then
3257     echo "warning: SDL Image requested, but SDL is not available, disabling"
3258   fi
3259   sdl_image=no
3260 fi
3261 
3262 if test "$sdl" = "yes" ; then
3263   cat > $TMPC <<EOF
3264 #include <SDL.h>
3265 #if defined(SDL_VIDEO_DRIVER_X11)
3266 #include <X11/XKBlib.h>
3267 #else
3268 #error No x11 support
3269 #endif
3270 int main(void) { return 0; }
3271 EOF
3272   if compile_prog "$sdl_cflags $x11_cflags" "$sdl_libs $x11_libs" ; then
3273     need_x11=yes
3274     sdl_cflags="$sdl_cflags $x11_cflags"
3275     sdl_libs="$sdl_libs $x11_libs"
3276   fi
3277 fi
3278 
3279 ##########################################
3280 # RDMA needs OpenFabrics libraries
3281 if test "$rdma" != "no" ; then
3282   cat > $TMPC <<EOF
3283 #include <rdma/rdma_cma.h>
3284 int main(void) { return 0; }
3285 EOF
3286   rdma_libs="-lrdmacm -libverbs -libumad"
3287   if compile_prog "" "$rdma_libs" ; then
3288     rdma="yes"
3289     libs_softmmu="$libs_softmmu $rdma_libs"
3290   else
3291     if test "$rdma" = "yes" ; then
3292         error_exit \
3293             " OpenFabrics librdmacm/libibverbs/libibumad not present." \
3294             " Your options:" \
3295             "  (1) Fast: Install infiniband packages (devel) from your distro." \
3296             "  (2) Cleanest: Install libraries from www.openfabrics.org" \
3297             "  (3) Also: Install softiwarp if you don't have RDMA hardware"
3298     fi
3299     rdma="no"
3300   fi
3301 fi
3302 
3303 ##########################################
3304 # PVRDMA detection
3305 
3306 cat > $TMPC <<EOF &&
3307 #include <sys/mman.h>
3308 
3309 int
3310 main(void)
3311 {
3312     char buf = 0;
3313     void *addr = &buf;
3314     addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
3315 
3316     return 0;
3317 }
3318 EOF
3319 
3320 if test "$rdma" = "yes" ; then
3321     case "$pvrdma" in
3322     "")
3323         if compile_prog "" ""; then
3324             pvrdma="yes"
3325         else
3326             pvrdma="no"
3327         fi
3328         ;;
3329     "yes")
3330         if ! compile_prog "" ""; then
3331             error_exit "PVRDMA is not supported since mremap is not implemented"
3332         fi
3333         pvrdma="yes"
3334         ;;
3335     "no")
3336         pvrdma="no"
3337         ;;
3338     esac
3339 else
3340     if test "$pvrdma" = "yes" ; then
3341         error_exit "PVRDMA requires rdma suppport"
3342     fi
3343     pvrdma="no"
3344 fi
3345 
3346 # Let's see if enhanced reg_mr is supported
3347 if test "$pvrdma" = "yes" ; then
3348 
3349 cat > $TMPC <<EOF &&
3350 #include <infiniband/verbs.h>
3351 
3352 int
3353 main(void)
3354 {
3355     struct ibv_mr *mr;
3356     struct ibv_pd *pd = NULL;
3357     size_t length = 10;
3358     uint64_t iova = 0;
3359     int access = 0;
3360     void *addr = NULL;
3361 
3362     mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
3363 
3364     ibv_dereg_mr(mr);
3365 
3366     return 0;
3367 }
3368 EOF
3369     if ! compile_prog "" "-libverbs"; then
3370         QEMU_CFLAGS="$QEMU_CFLAGS -DLEGACY_RDMA_REG_MR"
3371     fi
3372 fi
3373 
3374 ##########################################
3375 # VNC SASL detection
3376 if test "$vnc" = "yes" && test "$vnc_sasl" != "no" ; then
3377   cat > $TMPC <<EOF
3378 #include <sasl/sasl.h>
3379 #include <stdio.h>
3380 int main(void) { sasl_server_init(NULL, "qemu"); return 0; }
3381 EOF
3382   # Assuming Cyrus-SASL installed in /usr prefix
3383   # QEMU defines struct iovec in "qemu/osdep.h",
3384   # we don't want libsasl to redefine it in <sasl/sasl.h>.
3385   vnc_sasl_cflags="-DSTRUCT_IOVEC_DEFINED"
3386   vnc_sasl_libs="-lsasl2"
3387   if compile_prog "$vnc_sasl_cflags" "$vnc_sasl_libs" ; then
3388     vnc_sasl=yes
3389     libs_softmmu="$vnc_sasl_libs $libs_softmmu"
3390     QEMU_CFLAGS="$QEMU_CFLAGS $vnc_sasl_cflags"
3391   else
3392     if test "$vnc_sasl" = "yes" ; then
3393       feature_not_found "vnc-sasl" "Install Cyrus SASL devel"
3394     fi
3395     vnc_sasl=no
3396   fi
3397 fi
3398 
3399 ##########################################
3400 # VNC JPEG detection
3401 if test "$vnc" = "yes" && test "$vnc_jpeg" != "no" ; then
3402 cat > $TMPC <<EOF
3403 #include <stdio.h>
3404 #include <jpeglib.h>
3405 int main(void) { struct jpeg_compress_struct s; jpeg_create_compress(&s); return 0; }
3406 EOF
3407     vnc_jpeg_cflags=""
3408     vnc_jpeg_libs="-ljpeg"
3409   if compile_prog "$vnc_jpeg_cflags" "$vnc_jpeg_libs" ; then
3410     vnc_jpeg=yes
3411     libs_softmmu="$vnc_jpeg_libs $libs_softmmu"
3412     QEMU_CFLAGS="$QEMU_CFLAGS $vnc_jpeg_cflags"
3413   else
3414     if test "$vnc_jpeg" = "yes" ; then
3415       feature_not_found "vnc-jpeg" "Install libjpeg-turbo devel"
3416     fi
3417     vnc_jpeg=no
3418   fi
3419 fi
3420 
3421 ##########################################
3422 # VNC PNG detection
3423 if test "$vnc" = "yes" && test "$vnc_png" != "no" ; then
3424 cat > $TMPC <<EOF
3425 //#include <stdio.h>
3426 #include <png.h>
3427 #include <stddef.h>
3428 int main(void) {
3429     png_structp png_ptr;
3430     png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
3431     return png_ptr != 0;
3432 }
3433 EOF
3434   if $pkg_config libpng --exists; then
3435     vnc_png_cflags=$($pkg_config libpng --cflags)
3436     vnc_png_libs=$($pkg_config libpng --libs)
3437   else
3438     vnc_png_cflags=""
3439     vnc_png_libs="-lpng"
3440   fi
3441   if compile_prog "$vnc_png_cflags" "$vnc_png_libs" ; then
3442     vnc_png=yes
3443     libs_softmmu="$vnc_png_libs $libs_softmmu"
3444     QEMU_CFLAGS="$QEMU_CFLAGS $vnc_png_cflags"
3445   else
3446     if test "$vnc_png" = "yes" ; then
3447       feature_not_found "vnc-png" "Install libpng devel"
3448     fi
3449     vnc_png=no
3450   fi
3451 fi
3452 
3453 ##########################################
3454 # xkbcommon probe
3455 if test "$xkbcommon" != "no" ; then
3456   if $pkg_config xkbcommon --exists; then
3457     xkbcommon_cflags=$($pkg_config xkbcommon --cflags)
3458     xkbcommon_libs=$($pkg_config xkbcommon --libs)
3459     xkbcommon=yes
3460   else
3461     if test "$xkbcommon" = "yes" ; then
3462       feature_not_found "xkbcommon" "Install libxkbcommon-devel"
3463     fi
3464     xkbcommon=no
3465   fi
3466 fi
3467 
3468 
3469 ##########################################
3470 # xfsctl() probe, used for file-posix.c
3471 if test "$xfs" != "no" ; then
3472   cat > $TMPC << EOF
3473 #include <stddef.h>  /* NULL */
3474 #include <xfs/xfs.h>
3475 int main(void)
3476 {
3477     xfsctl(NULL, 0, 0, NULL);
3478     return 0;
3479 }
3480 EOF
3481   if compile_prog "" "" ; then
3482     xfs="yes"
3483   else
3484     if test "$xfs" = "yes" ; then
3485       feature_not_found "xfs" "Instal xfsprogs/xfslibs devel"
3486     fi
3487     xfs=no
3488   fi
3489 fi
3490 
3491 ##########################################
3492 # vde libraries probe
3493 if test "$vde" != "no" ; then
3494   vde_libs="-lvdeplug"
3495   cat > $TMPC << EOF
3496 #include <libvdeplug.h>
3497 int main(void)
3498 {
3499     struct vde_open_args a = {0, 0, 0};
3500     char s[] = "";
3501     vde_open(s, s, &a);
3502     return 0;
3503 }
3504 EOF
3505   if compile_prog "" "$vde_libs" ; then
3506     vde=yes
3507   else
3508     if test "$vde" = "yes" ; then
3509       feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
3510     fi
3511     vde=no
3512   fi
3513 fi
3514 
3515 ##########################################
3516 # netmap support probe
3517 # Apart from looking for netmap headers, we make sure that the host API version
3518 # supports the netmap backend (>=11). The upper bound (15) is meant to simulate
3519 # a minor/major version number. Minor new features will be marked with values up
3520 # to 15, and if something happens that requires a change to the backend we will
3521 # move above 15, submit the backend fixes and modify this two bounds.
3522 if test "$netmap" != "no" ; then
3523   cat > $TMPC << EOF
3524 #include <inttypes.h>
3525 #include <net/if.h>
3526 #include <net/netmap.h>
3527 #include <net/netmap_user.h>
3528 #if (NETMAP_API < 11) || (NETMAP_API > 15)
3529 #error
3530 #endif
3531 int main(void) { return 0; }
3532 EOF
3533   if compile_prog "" "" ; then
3534     netmap=yes
3535   else
3536     if test "$netmap" = "yes" ; then
3537       feature_not_found "netmap"
3538     fi
3539     netmap=no
3540   fi
3541 fi
3542 
3543 ##########################################
3544 # libcap-ng library probe
3545 if test "$cap_ng" != "no" ; then
3546   cap_libs="-lcap-ng"
3547   cat > $TMPC << EOF
3548 #include <cap-ng.h>
3549 int main(void)
3550 {
3551     capng_capability_to_name(CAPNG_EFFECTIVE);
3552     return 0;
3553 }
3554 EOF
3555   if compile_prog "" "$cap_libs" ; then
3556     cap_ng=yes
3557     libs_tools="$cap_libs $libs_tools"
3558   else
3559     if test "$cap_ng" = "yes" ; then
3560       feature_not_found "cap_ng" "Install libcap-ng devel"
3561     fi
3562     cap_ng=no
3563   fi
3564 fi
3565 
3566 ##########################################
3567 # Sound support libraries probe
3568 
3569 audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
3570 for drv in $audio_drv_list; do
3571     case $drv in
3572     alsa | try-alsa)
3573     if $pkg_config alsa --exists; then
3574         alsa_libs=$($pkg_config alsa --libs)
3575         if test "$drv" = "try-alsa"; then
3576             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa/alsa/')
3577         fi
3578     else
3579         if test "$drv" = "try-alsa"; then
3580             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa//')
3581         else
3582             error_exit "$drv check failed" \
3583                 "Make sure to have the $drv libs and headers installed."
3584         fi
3585     fi
3586     ;;
3587 
3588     pa | try-pa)
3589     if $pkg_config libpulse --exists; then
3590         pulse_libs=$($pkg_config libpulse --libs)
3591         if test "$drv" = "try-pa"; then
3592             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa/pa/')
3593         fi
3594     else
3595         if test "$drv" = "try-pa"; then
3596             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa//')
3597         else
3598             error_exit "$drv check failed" \
3599                 "Make sure to have the $drv libs and headers installed."
3600         fi
3601     fi
3602     ;;
3603 
3604     sdl)
3605     if test "$sdl" = "no"; then
3606         error_exit "sdl not found or disabled, can not use sdl audio driver"
3607     fi
3608     ;;
3609 
3610     try-sdl)
3611     if test "$sdl" = "no"; then
3612         audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl//')
3613     else
3614         audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl/sdl/')
3615     fi
3616     ;;
3617 
3618     coreaudio)
3619       coreaudio_libs="-framework CoreAudio"
3620     ;;
3621 
3622     dsound)
3623       dsound_libs="-lole32 -ldxguid"
3624       audio_win_int="yes"
3625     ;;
3626 
3627     oss)
3628       oss_libs="$oss_lib"
3629     ;;
3630 
3631     *)
3632     echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
3633         error_exit "Unknown driver '$drv' selected" \
3634             "Possible drivers are: $audio_possible_drivers"
3635     }
3636     ;;
3637     esac
3638 done
3639 
3640 ##########################################
3641 # BrlAPI probe
3642 
3643 if test "$brlapi" != "no" ; then
3644   brlapi_libs="-lbrlapi"
3645   cat > $TMPC << EOF
3646 #include <brlapi.h>
3647 #include <stddef.h>
3648 int main( void ) { return brlapi__openConnection (NULL, NULL, NULL); }
3649 EOF
3650   if compile_prog "" "$brlapi_libs" ; then
3651     brlapi=yes
3652   else
3653     if test "$brlapi" = "yes" ; then
3654       feature_not_found "brlapi" "Install brlapi devel"
3655     fi
3656     brlapi=no
3657   fi
3658 fi
3659 
3660 ##########################################
3661 # iconv probe
3662 if test "$iconv" != "no" ; then
3663   cat > $TMPC << EOF
3664 #include <iconv.h>
3665 int main(void) {
3666   iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
3667   return conv != (iconv_t) -1;
3668 }
3669 EOF
3670   iconv_prefix_list="/usr/local:/usr"
3671   iconv_lib_list=":-liconv"
3672   IFS=:
3673   for iconv_prefix in $iconv_prefix_list; do
3674     IFS=:
3675     iconv_cflags="-I$iconv_prefix/include"
3676     iconv_ldflags="-L$iconv_prefix/lib"
3677     for iconv_link in $iconv_lib_list; do
3678       unset IFS
3679       iconv_lib="$iconv_ldflags $iconv_link"
3680       echo "looking at iconv in '$iconv_cflags' '$iconv_lib'" >> config.log
3681       if compile_prog "$iconv_cflags" "$iconv_lib" ; then
3682         iconv_found=yes
3683         break
3684       fi
3685     done
3686     if test "$iconv_found" = yes ; then
3687       break
3688     fi
3689   done
3690   if test "$iconv_found" = "yes" ; then
3691     iconv=yes
3692   else
3693     if test "$iconv" = "yes" ; then
3694       feature_not_found "iconv" "Install iconv devel"
3695     fi
3696     iconv=no
3697   fi
3698 fi
3699 
3700 ##########################################
3701 # curses probe
3702 if test "$iconv" = "no" ; then
3703   # curses will need iconv
3704   curses=no
3705 fi
3706 if test "$curses" != "no" ; then
3707   if test "$mingw32" = "yes" ; then
3708     curses_inc_list="$($pkg_config --cflags ncurses 2>/dev/null):"
3709     curses_lib_list="$($pkg_config --libs ncurses 2>/dev/null):-lpdcurses"
3710   else
3711     curses_inc_list="$($pkg_config --cflags ncursesw 2>/dev/null):-I/usr/include/ncursesw:"
3712     curses_lib_list="$($pkg_config --libs ncursesw 2>/dev/null):-lncursesw:-lcursesw"
3713   fi
3714   curses_found=no
3715   cat > $TMPC << EOF
3716 #include <locale.h>
3717 #include <curses.h>
3718 #include <wchar.h>
3719 #include <langinfo.h>
3720 int main(void) {
3721   const char *codeset;
3722   wchar_t wch = L'w';
3723   setlocale(LC_ALL, "");
3724   resize_term(0, 0);
3725   addwstr(L"wide chars\n");
3726   addnwstr(&wch, 1);
3727   add_wch(WACS_DEGREE);
3728   codeset = nl_langinfo(CODESET);
3729   return codeset != 0;
3730 }
3731 EOF
3732   IFS=:
3733   for curses_inc in $curses_inc_list; do
3734     # Make sure we get the wide character prototypes
3735     curses_inc="-DNCURSES_WIDECHAR $curses_inc"
3736     IFS=:
3737     for curses_lib in $curses_lib_list; do
3738       unset IFS
3739       if compile_prog "$curses_inc" "$curses_lib" ; then
3740         curses_found=yes
3741         break
3742       fi
3743     done
3744     if test "$curses_found" = yes ; then
3745       break
3746     fi
3747   done
3748   unset IFS
3749   if test "$curses_found" = "yes" ; then
3750     curses=yes
3751   else
3752     if test "$curses" = "yes" ; then
3753       feature_not_found "curses" "Install ncurses devel"
3754     fi
3755     curses=no
3756   fi
3757 fi
3758 
3759 ##########################################
3760 # curl probe
3761 if test "$curl" != "no" ; then
3762   if $pkg_config libcurl --exists; then
3763     curlconfig="$pkg_config libcurl"
3764   else
3765     curlconfig=curl-config
3766   fi
3767   cat > $TMPC << EOF
3768 #include <curl/curl.h>
3769 int main(void) { curl_easy_init(); curl_multi_setopt(0, 0, 0); return 0; }
3770 EOF
3771   curl_cflags=$($curlconfig --cflags 2>/dev/null)
3772   curl_libs=$($curlconfig --libs 2>/dev/null)
3773   if compile_prog "$curl_cflags" "$curl_libs" ; then
3774     curl=yes
3775   else
3776     if test "$curl" = "yes" ; then
3777       feature_not_found "curl" "Install libcurl devel"
3778     fi
3779     curl=no
3780   fi
3781 fi # test "$curl"
3782 
3783 ##########################################
3784 # glib support probe
3785 
3786 glib_req_ver=2.48
3787 glib_modules=gthread-2.0
3788 if test "$modules" = yes; then
3789     glib_modules="$glib_modules gmodule-export-2.0"
3790 fi
3791 if test "$plugins" = yes; then
3792     glib_modules="$glib_modules gmodule-2.0"
3793 fi
3794 
3795 # This workaround is required due to a bug in pkg-config file for glib as it
3796 # doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
3797 
3798 if test "$static" = yes && test "$mingw32" = yes; then
3799     QEMU_CFLAGS="-DGLIB_STATIC_COMPILATION $QEMU_CFLAGS"
3800 fi
3801 
3802 for i in $glib_modules; do
3803     if $pkg_config --atleast-version=$glib_req_ver $i; then
3804         glib_cflags=$($pkg_config --cflags $i)
3805         glib_libs=$($pkg_config --libs $i)
3806         QEMU_CFLAGS="$glib_cflags $QEMU_CFLAGS"
3807         LIBS="$glib_libs $LIBS"
3808         libs_qga="$glib_libs $libs_qga"
3809     else
3810         error_exit "glib-$glib_req_ver $i is required to compile QEMU"
3811     fi
3812 done
3813 
3814 if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
3815     gio=yes
3816     gio_cflags=$($pkg_config --cflags gio-2.0)
3817     gio_libs=$($pkg_config --libs gio-2.0)
3818     gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
3819     if [ ! -x "$gdbus_codegen" ]; then
3820         gdbus_codegen=
3821     fi
3822 else
3823     gio=no
3824 fi
3825 
3826 if $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
3827     gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
3828     gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
3829 fi
3830 
3831 # Sanity check that the current size_t matches the
3832 # size that glib thinks it should be. This catches
3833 # problems on multi-arch where people try to build
3834 # 32-bit QEMU while pointing at 64-bit glib headers
3835 cat > $TMPC <<EOF
3836 #include <glib.h>
3837 #include <unistd.h>
3838 
3839 #define QEMU_BUILD_BUG_ON(x) \
3840   typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
3841 
3842 int main(void) {
3843    QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
3844    return 0;
3845 }
3846 EOF
3847 
3848 if ! compile_prog "$CFLAGS" "$LIBS" ; then
3849     error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
3850                "You probably need to set PKG_CONFIG_LIBDIR"\
3851 	       "to point to the right pkg-config files for your"\
3852 	       "build target"
3853 fi
3854 
3855 # Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
3856 cat > $TMPC << EOF
3857 #include <glib.h>
3858 int main(void) { return 0; }
3859 EOF
3860 if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3861     if cc_has_warning_flag "-Wno-unknown-attributes"; then
3862         glib_cflags="-Wno-unknown-attributes $glib_cflags"
3863         CFLAGS="-Wno-unknown-attributes $CFLAGS"
3864     fi
3865 fi
3866 
3867 # Silence clang warnings triggered by glib < 2.57.2
3868 cat > $TMPC << EOF
3869 #include <glib.h>
3870 typedef struct Foo {
3871     int i;
3872 } Foo;
3873 static void foo_free(Foo *f)
3874 {
3875     g_free(f);
3876 }
3877 G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free);
3878 int main(void) { return 0; }
3879 EOF
3880 if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3881     if cc_has_warning_flag "-Wno-unused-function"; then
3882         glib_cflags="$glib_cflags -Wno-unused-function"
3883         CFLAGS="$CFLAGS -Wno-unused-function"
3884     fi
3885 fi
3886 
3887 #########################################
3888 # zlib check
3889 
3890 if test "$zlib" != "no" ; then
3891     if $pkg_config --exists zlib; then
3892         zlib_cflags=$($pkg_config --cflags zlib)
3893         zlib_libs=$($pkg_config --libs zlib)
3894         QEMU_CFLAGS="$zlib_cflags $QEMU_CFLAGS"
3895         LIBS="$zlib_libs $LIBS"
3896     else
3897         cat > $TMPC << EOF
3898 #include <zlib.h>
3899 int main(void) { zlibVersion(); return 0; }
3900 EOF
3901         if compile_prog "" "-lz" ; then
3902             LIBS="$LIBS -lz"
3903         else
3904             error_exit "zlib check failed" \
3905                 "Make sure to have the zlib libs and headers installed."
3906         fi
3907     fi
3908 fi
3909 
3910 ##########################################
3911 # SHA command probe for modules
3912 if test "$modules" = yes; then
3913     shacmd_probe="sha1sum sha1 shasum"
3914     for c in $shacmd_probe; do
3915         if has $c; then
3916             shacmd="$c"
3917             break
3918         fi
3919     done
3920     if test "$shacmd" = ""; then
3921         error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
3922     fi
3923 fi
3924 
3925 ##########################################
3926 # pixman support probe
3927 
3928 if test "$want_tools" = "no" && test "$softmmu" = "no"; then
3929   pixman_cflags=
3930   pixman_libs=
3931 elif $pkg_config --atleast-version=0.21.8 pixman-1 > /dev/null 2>&1; then
3932   pixman_cflags=$($pkg_config --cflags pixman-1)
3933   pixman_libs=$($pkg_config --libs pixman-1)
3934 else
3935   error_exit "pixman >= 0.21.8 not present." \
3936       "Please install the pixman devel package."
3937 fi
3938 
3939 ##########################################
3940 # libmpathpersist probe
3941 
3942 if test "$mpath" != "no" ; then
3943   # probe for the new API
3944   cat > $TMPC <<EOF
3945 #include <libudev.h>
3946 #include <mpath_persist.h>
3947 unsigned mpath_mx_alloc_len = 1024;
3948 int logsink;
3949 static struct config *multipath_conf;
3950 extern struct udev *udev;
3951 extern struct config *get_multipath_config(void);
3952 extern void put_multipath_config(struct config *conf);
3953 struct udev *udev;
3954 struct config *get_multipath_config(void) { return multipath_conf; }
3955 void put_multipath_config(struct config *conf) { }
3956 
3957 int main(void) {
3958     udev = udev_new();
3959     multipath_conf = mpath_lib_init();
3960     return 0;
3961 }
3962 EOF
3963   if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
3964     mpathpersist=yes
3965     mpathpersist_new_api=yes
3966   else
3967     # probe for the old API
3968     cat > $TMPC <<EOF
3969 #include <libudev.h>
3970 #include <mpath_persist.h>
3971 unsigned mpath_mx_alloc_len = 1024;
3972 int logsink;
3973 int main(void) {
3974     struct udev *udev = udev_new();
3975     mpath_lib_init(udev);
3976     return 0;
3977 }
3978 EOF
3979     if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
3980       mpathpersist=yes
3981       mpathpersist_new_api=no
3982     else
3983       mpathpersist=no
3984     fi
3985   fi
3986 else
3987   mpathpersist=no
3988 fi
3989 
3990 ##########################################
3991 # pthread probe
3992 PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
3993 
3994 pthread=no
3995 cat > $TMPC << EOF
3996 #include <pthread.h>
3997 static void *f(void *p) { return NULL; }
3998 int main(void) {
3999   pthread_t thread;
4000   pthread_create(&thread, 0, f, 0);
4001   return 0;
4002 }
4003 EOF
4004 if compile_prog "" "" ; then
4005   pthread=yes
4006 else
4007   for pthread_lib in $PTHREADLIBS_LIST; do
4008     if compile_prog "" "$pthread_lib" ; then
4009       pthread=yes
4010       found=no
4011       for lib_entry in $LIBS; do
4012         if test "$lib_entry" = "$pthread_lib"; then
4013           found=yes
4014           break
4015         fi
4016       done
4017       if test "$found" = "no"; then
4018         LIBS="$pthread_lib $LIBS"
4019         libs_qga="$pthread_lib $libs_qga"
4020       fi
4021       PTHREAD_LIB="$pthread_lib"
4022       break
4023     fi
4024   done
4025 fi
4026 
4027 if test "$mingw32" != yes && test "$pthread" = no; then
4028   error_exit "pthread check failed" \
4029       "Make sure to have the pthread libs and headers installed."
4030 fi
4031 
4032 # check for pthread_setname_np with thread id
4033 pthread_setname_np_w_tid=no
4034 cat > $TMPC << EOF
4035 #include <pthread.h>
4036 
4037 static void *f(void *p) { return NULL; }
4038 int main(void)
4039 {
4040     pthread_t thread;
4041     pthread_create(&thread, 0, f, 0);
4042     pthread_setname_np(thread, "QEMU");
4043     return 0;
4044 }
4045 EOF
4046 if compile_prog "" "$pthread_lib" ; then
4047   pthread_setname_np_w_tid=yes
4048 fi
4049 
4050 # check for pthread_setname_np without thread id
4051 pthread_setname_np_wo_tid=no
4052 cat > $TMPC << EOF
4053 #include <pthread.h>
4054 
4055 static void *f(void *p) { pthread_setname_np("QEMU"); }
4056 int main(void)
4057 {
4058     pthread_t thread;
4059     pthread_create(&thread, 0, f, 0);
4060     return 0;
4061 }
4062 EOF
4063 if compile_prog "" "$pthread_lib" ; then
4064   pthread_setname_np_wo_tid=yes
4065 fi
4066 
4067 ##########################################
4068 # rbd probe
4069 if test "$rbd" != "no" ; then
4070   cat > $TMPC <<EOF
4071 #include <stdio.h>
4072 #include <rbd/librbd.h>
4073 int main(void) {
4074     rados_t cluster;
4075     rados_create(&cluster, NULL);
4076     return 0;
4077 }
4078 EOF
4079   rbd_libs="-lrbd -lrados"
4080   if compile_prog "" "$rbd_libs" ; then
4081     rbd=yes
4082   else
4083     if test "$rbd" = "yes" ; then
4084       feature_not_found "rados block device" "Install librbd/ceph devel"
4085     fi
4086     rbd=no
4087   fi
4088 fi
4089 
4090 ##########################################
4091 # libssh probe
4092 if test "$libssh" != "no" ; then
4093   if $pkg_config --exists libssh; then
4094     libssh_cflags=$($pkg_config libssh --cflags)
4095     libssh_libs=$($pkg_config libssh --libs)
4096     libssh=yes
4097   else
4098     if test "$libssh" = "yes" ; then
4099       error_exit "libssh required for --enable-libssh"
4100     fi
4101     libssh=no
4102   fi
4103 fi
4104 
4105 ##########################################
4106 # Check for libssh 0.8
4107 # This is done like this instead of using the LIBSSH_VERSION_* and
4108 # SSH_VERSION_* macros because some distributions in the past shipped
4109 # snapshots of the future 0.8 from Git, and those snapshots did not
4110 # have updated version numbers (still referring to 0.7.0).
4111 
4112 if test "$libssh" = "yes"; then
4113   cat > $TMPC <<EOF
4114 #include <libssh/libssh.h>
4115 int main(void) { return ssh_get_server_publickey(NULL, NULL); }
4116 EOF
4117   if compile_prog "$libssh_cflags" "$libssh_libs"; then
4118     libssh_cflags="-DHAVE_LIBSSH_0_8 $libssh_cflags"
4119   fi
4120 fi
4121 
4122 ##########################################
4123 # linux-aio probe
4124 
4125 if test "$linux_aio" != "no" ; then
4126   cat > $TMPC <<EOF
4127 #include <libaio.h>
4128 #include <sys/eventfd.h>
4129 #include <stddef.h>
4130 int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
4131 EOF
4132   if compile_prog "" "-laio" ; then
4133     linux_aio=yes
4134   else
4135     if test "$linux_aio" = "yes" ; then
4136       feature_not_found "linux AIO" "Install libaio devel"
4137     fi
4138     linux_aio=no
4139   fi
4140 fi
4141 ##########################################
4142 # linux-io-uring probe
4143 
4144 if test "$linux_io_uring" != "no" ; then
4145   if $pkg_config liburing; then
4146     linux_io_uring_cflags=$($pkg_config --cflags liburing)
4147     linux_io_uring_libs=$($pkg_config --libs liburing)
4148     linux_io_uring=yes
4149 
4150     # io_uring is used in libqemuutil.a where per-file -libs variables are not
4151     # seen by programs linking the archive.  It's not ideal, but just add the
4152     # library dependency globally.
4153     LIBS="$linux_io_uring_libs $LIBS"
4154   else
4155     if test "$linux_io_uring" = "yes" ; then
4156       feature_not_found "linux io_uring" "Install liburing devel"
4157     fi
4158     linux_io_uring=no
4159   fi
4160 fi
4161 
4162 ##########################################
4163 # TPM emulation is only on POSIX
4164 
4165 if test "$tpm" = ""; then
4166   if test "$mingw32" = "yes"; then
4167     tpm=no
4168   else
4169     tpm=yes
4170   fi
4171 elif test "$tpm" = "yes"; then
4172   if test "$mingw32" = "yes" ; then
4173     error_exit "TPM emulation only available on POSIX systems"
4174   fi
4175 fi
4176 
4177 ##########################################
4178 # attr probe
4179 
4180 if test "$attr" != "no" ; then
4181   cat > $TMPC <<EOF
4182 #include <stdio.h>
4183 #include <sys/types.h>
4184 #ifdef CONFIG_LIBATTR
4185 #include <attr/xattr.h>
4186 #else
4187 #include <sys/xattr.h>
4188 #endif
4189 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }
4190 EOF
4191   if compile_prog "" "" ; then
4192     attr=yes
4193   # Older distros have <attr/xattr.h>, and need -lattr:
4194   elif compile_prog "-DCONFIG_LIBATTR" "-lattr" ; then
4195     attr=yes
4196     LIBS="-lattr $LIBS"
4197     libattr=yes
4198   else
4199     if test "$attr" = "yes" ; then
4200       feature_not_found "ATTR" "Install libc6 or libattr devel"
4201     fi
4202     attr=no
4203   fi
4204 fi
4205 
4206 ##########################################
4207 # iovec probe
4208 cat > $TMPC <<EOF
4209 #include <sys/types.h>
4210 #include <sys/uio.h>
4211 #include <unistd.h>
4212 int main(void) { return sizeof(struct iovec); }
4213 EOF
4214 iovec=no
4215 if compile_prog "" "" ; then
4216   iovec=yes
4217 fi
4218 
4219 ##########################################
4220 # preadv probe
4221 cat > $TMPC <<EOF
4222 #include <sys/types.h>
4223 #include <sys/uio.h>
4224 #include <unistd.h>
4225 int main(void) { return preadv(0, 0, 0, 0); }
4226 EOF
4227 preadv=no
4228 if compile_prog "" "" ; then
4229   preadv=yes
4230 fi
4231 
4232 ##########################################
4233 # fdt probe
4234 # fdt support is mandatory for at least some target architectures,
4235 # so insist on it if we're building those system emulators.
4236 fdt_required=no
4237 for target in $target_list; do
4238   case $target in
4239     aarch64*-softmmu|arm*-softmmu|ppc*-softmmu|microblaze*-softmmu|mips64el-softmmu|riscv*-softmmu|rx-softmmu)
4240       fdt_required=yes
4241     ;;
4242   esac
4243 done
4244 
4245 if test "$fdt_required" = "yes"; then
4246   if test "$fdt" = "no"; then
4247     error_exit "fdt disabled but some requested targets require it." \
4248       "You can turn off fdt only if you also disable all the system emulation" \
4249       "targets which need it (by specifying a cut down --target-list)."
4250   fi
4251   fdt=yes
4252 elif test "$fdt" != "yes" ; then
4253   fdt=no
4254 fi
4255 
4256 # fdt is only required when building softmmu targets
4257 if test -z "$fdt" -a "$softmmu" != "yes" ; then
4258     fdt="no"
4259 fi
4260 
4261 if test "$fdt" != "no" ; then
4262   fdt_libs="-lfdt"
4263   # explicitly check for libfdt_env.h as it is missing in some stable installs
4264   # and test for required functions to make sure we are on a version >= 1.4.2
4265   cat > $TMPC << EOF
4266 #include <libfdt.h>
4267 #include <libfdt_env.h>
4268 int main(void) { fdt_check_full(NULL, 0); return 0; }
4269 EOF
4270   if compile_prog "" "$fdt_libs" ; then
4271     # system DTC is good - use it
4272     fdt=system
4273   else
4274       # have GIT checkout, so activate dtc submodule
4275       if test -e "${source_path}/.git" ; then
4276           git_submodules="${git_submodules} dtc"
4277       fi
4278       if test -d "${source_path}/dtc/libfdt" || test -e "${source_path}/.git" ; then
4279           fdt=git
4280           mkdir -p dtc
4281           if [ "$pwd_is_source_path" != "y" ] ; then
4282               symlink "$source_path/dtc/Makefile" "dtc/Makefile"
4283               symlink "$source_path/dtc/scripts" "dtc/scripts"
4284           fi
4285           fdt_cflags="-I\$(SRC_PATH)/dtc/libfdt"
4286           fdt_ldflags="-L\$(BUILD_DIR)/dtc/libfdt"
4287           fdt_libs="$fdt_libs"
4288       elif test "$fdt" = "yes" ; then
4289           # Not a git build & no libfdt found, prompt for system install
4290           error_exit "DTC (libfdt) version >= 1.4.2 not present." \
4291                      "Please install the DTC (libfdt) devel package"
4292       else
4293           # don't have and don't want
4294           fdt_libs=
4295           fdt=no
4296       fi
4297   fi
4298 fi
4299 
4300 libs_softmmu="$libs_softmmu $fdt_libs"
4301 
4302 ##########################################
4303 # opengl probe (for sdl2, gtk, milkymist-tmu2)
4304 
4305 gbm="no"
4306 if $pkg_config gbm; then
4307     gbm_cflags="$($pkg_config --cflags gbm)"
4308     gbm_libs="$($pkg_config --libs gbm)"
4309     gbm="yes"
4310 fi
4311 
4312 if test "$opengl" != "no" ; then
4313   opengl_pkgs="epoxy gbm"
4314   if $pkg_config $opengl_pkgs; then
4315     opengl_cflags="$($pkg_config --cflags $opengl_pkgs)"
4316     opengl_libs="$($pkg_config --libs $opengl_pkgs)"
4317     opengl=yes
4318     if test "$gtk" = "yes" && $pkg_config --exists "$gtkpackage >= 3.16"; then
4319         gtk_gl="yes"
4320     fi
4321     QEMU_CFLAGS="$QEMU_CFLAGS $opengl_cflags"
4322   else
4323     if test "$opengl" = "yes" ; then
4324       feature_not_found "opengl" "Please install opengl (mesa) devel pkgs: $opengl_pkgs"
4325     fi
4326     opengl_cflags=""
4327     opengl_libs=""
4328     opengl=no
4329   fi
4330 fi
4331 
4332 if test "$opengl" = "yes"; then
4333   cat > $TMPC << EOF
4334 #include <epoxy/egl.h>
4335 #ifndef EGL_MESA_image_dma_buf_export
4336 # error mesa/epoxy lacks support for dmabufs (mesa 10.6+)
4337 #endif
4338 int main(void) { return 0; }
4339 EOF
4340   if compile_prog "" "" ; then
4341     opengl_dmabuf=yes
4342   fi
4343 fi
4344 
4345 if test "$opengl" = "yes" && test "$have_x11" = "yes"; then
4346   for target in $target_list; do
4347     case $target in
4348       lm32-softmmu) # milkymist-tmu2 requires X11 and OpenGL
4349         need_x11=yes
4350       ;;
4351     esac
4352   done
4353 fi
4354 
4355 ##########################################
4356 # libxml2 probe
4357 if test "$libxml2" != "no" ; then
4358     if $pkg_config --exists libxml-2.0; then
4359         libxml2="yes"
4360         libxml2_cflags=$($pkg_config --cflags libxml-2.0)
4361         libxml2_libs=$($pkg_config --libs libxml-2.0)
4362     else
4363         if test "$libxml2" = "yes"; then
4364             feature_not_found "libxml2" "Install libxml2 devel"
4365         fi
4366         libxml2="no"
4367     fi
4368 fi
4369 
4370 ##########################################
4371 # glusterfs probe
4372 if test "$glusterfs" != "no" ; then
4373   if $pkg_config --atleast-version=3 glusterfs-api; then
4374     glusterfs="yes"
4375     glusterfs_cflags=$($pkg_config --cflags glusterfs-api)
4376     glusterfs_libs=$($pkg_config --libs glusterfs-api)
4377     if $pkg_config --atleast-version=4 glusterfs-api; then
4378       glusterfs_xlator_opt="yes"
4379     fi
4380     if $pkg_config --atleast-version=5 glusterfs-api; then
4381       glusterfs_discard="yes"
4382     fi
4383     if $pkg_config --atleast-version=6 glusterfs-api; then
4384       glusterfs_fallocate="yes"
4385       glusterfs_zerofill="yes"
4386     fi
4387     cat > $TMPC << EOF
4388 #include <glusterfs/api/glfs.h>
4389 
4390 int
4391 main(void)
4392 {
4393 	/* new glfs_ftruncate() passes two additional args */
4394 	return glfs_ftruncate(NULL, 0, NULL, NULL);
4395 }
4396 EOF
4397     if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
4398       glusterfs_ftruncate_has_stat="yes"
4399     fi
4400     cat > $TMPC << EOF
4401 #include <glusterfs/api/glfs.h>
4402 
4403 /* new glfs_io_cbk() passes two additional glfs_stat structs */
4404 static void
4405 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
4406 {}
4407 
4408 int
4409 main(void)
4410 {
4411 	glfs_io_cbk iocb = &glusterfs_iocb;
4412 	iocb(NULL, 0 , NULL, NULL, NULL);
4413 	return 0;
4414 }
4415 EOF
4416     if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
4417       glusterfs_iocb_has_stat="yes"
4418     fi
4419   else
4420     if test "$glusterfs" = "yes" ; then
4421       feature_not_found "GlusterFS backend support" \
4422           "Install glusterfs-api devel >= 3"
4423     fi
4424     glusterfs="no"
4425   fi
4426 fi
4427 
4428 # Check for inotify functions when we are building linux-user
4429 # emulator.  This is done because older glibc versions don't
4430 # have syscall stubs for these implemented.  In that case we
4431 # don't provide them even if kernel supports them.
4432 #
4433 inotify=no
4434 cat > $TMPC << EOF
4435 #include <sys/inotify.h>
4436 
4437 int
4438 main(void)
4439 {
4440 	/* try to start inotify */
4441 	return inotify_init();
4442 }
4443 EOF
4444 if compile_prog "" "" ; then
4445   inotify=yes
4446 fi
4447 
4448 inotify1=no
4449 cat > $TMPC << EOF
4450 #include <sys/inotify.h>
4451 
4452 int
4453 main(void)
4454 {
4455     /* try to start inotify */
4456     return inotify_init1(0);
4457 }
4458 EOF
4459 if compile_prog "" "" ; then
4460   inotify1=yes
4461 fi
4462 
4463 # check if pipe2 is there
4464 pipe2=no
4465 cat > $TMPC << EOF
4466 #include <unistd.h>
4467 #include <fcntl.h>
4468 
4469 int main(void)
4470 {
4471     int pipefd[2];
4472     return pipe2(pipefd, O_CLOEXEC);
4473 }
4474 EOF
4475 if compile_prog "" "" ; then
4476   pipe2=yes
4477 fi
4478 
4479 # check if accept4 is there
4480 accept4=no
4481 cat > $TMPC << EOF
4482 #include <sys/socket.h>
4483 #include <stddef.h>
4484 
4485 int main(void)
4486 {
4487     accept4(0, NULL, NULL, SOCK_CLOEXEC);
4488     return 0;
4489 }
4490 EOF
4491 if compile_prog "" "" ; then
4492   accept4=yes
4493 fi
4494 
4495 # check if tee/splice is there. vmsplice was added same time.
4496 splice=no
4497 cat > $TMPC << EOF
4498 #include <unistd.h>
4499 #include <fcntl.h>
4500 #include <limits.h>
4501 
4502 int main(void)
4503 {
4504     int len, fd = 0;
4505     len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
4506     splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
4507     return 0;
4508 }
4509 EOF
4510 if compile_prog "" "" ; then
4511   splice=yes
4512 fi
4513 
4514 ##########################################
4515 # libnuma probe
4516 
4517 if test "$numa" != "no" ; then
4518   cat > $TMPC << EOF
4519 #include <numa.h>
4520 int main(void) { return numa_available(); }
4521 EOF
4522 
4523   if compile_prog "" "-lnuma" ; then
4524     numa=yes
4525     libs_softmmu="-lnuma $libs_softmmu"
4526   else
4527     if test "$numa" = "yes" ; then
4528       feature_not_found "numa" "install numactl devel"
4529     fi
4530     numa=no
4531   fi
4532 fi
4533 
4534 if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
4535     echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
4536     exit 1
4537 fi
4538 
4539 # Even if malloc_trim() is available, these non-libc memory allocators
4540 # do not support it.
4541 if test "$tcmalloc" = "yes" || test "$jemalloc" = "yes" ; then
4542     if test "$malloc_trim" = "yes" ; then
4543         echo "Disabling malloc_trim with non-libc memory allocator"
4544     fi
4545     malloc_trim="no"
4546 fi
4547 
4548 #######################################
4549 # malloc_trim
4550 
4551 if test "$malloc_trim" != "no" ; then
4552     cat > $TMPC << EOF
4553 #include <malloc.h>
4554 int main(void) { malloc_trim(0); return 0; }
4555 EOF
4556     if compile_prog "" "" ; then
4557         malloc_trim="yes"
4558     else
4559         malloc_trim="no"
4560     fi
4561 fi
4562 
4563 ##########################################
4564 # tcmalloc probe
4565 
4566 if test "$tcmalloc" = "yes" ; then
4567   cat > $TMPC << EOF
4568 #include <stdlib.h>
4569 int main(void) { malloc(1); return 0; }
4570 EOF
4571 
4572   if compile_prog "" "-ltcmalloc" ; then
4573     LIBS="-ltcmalloc $LIBS"
4574   else
4575     feature_not_found "tcmalloc" "install gperftools devel"
4576   fi
4577 fi
4578 
4579 ##########################################
4580 # jemalloc probe
4581 
4582 if test "$jemalloc" = "yes" ; then
4583   cat > $TMPC << EOF
4584 #include <stdlib.h>
4585 int main(void) { malloc(1); return 0; }
4586 EOF
4587 
4588   if compile_prog "" "-ljemalloc" ; then
4589     LIBS="-ljemalloc $LIBS"
4590   else
4591     feature_not_found "jemalloc" "install jemalloc devel"
4592   fi
4593 fi
4594 
4595 ##########################################
4596 # signalfd probe
4597 signalfd="no"
4598 cat > $TMPC << EOF
4599 #include <unistd.h>
4600 #include <sys/syscall.h>
4601 #include <signal.h>
4602 int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }
4603 EOF
4604 
4605 if compile_prog "" "" ; then
4606   signalfd=yes
4607 fi
4608 
4609 # check if optreset global is declared by <getopt.h>
4610 optreset="no"
4611 cat > $TMPC << EOF
4612 #include <getopt.h>
4613 int main(void) { return optreset; }
4614 EOF
4615 
4616 if compile_prog "" "" ; then
4617   optreset=yes
4618 fi
4619 
4620 # check if eventfd is supported
4621 eventfd=no
4622 cat > $TMPC << EOF
4623 #include <sys/eventfd.h>
4624 
4625 int main(void)
4626 {
4627     return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
4628 }
4629 EOF
4630 if compile_prog "" "" ; then
4631   eventfd=yes
4632 fi
4633 
4634 # check if memfd is supported
4635 memfd=no
4636 cat > $TMPC << EOF
4637 #include <sys/mman.h>
4638 
4639 int main(void)
4640 {
4641     return memfd_create("foo", MFD_ALLOW_SEALING);
4642 }
4643 EOF
4644 if compile_prog "" "" ; then
4645   memfd=yes
4646 fi
4647 
4648 # check for usbfs
4649 have_usbfs=no
4650 if test "$linux_user" = "yes"; then
4651   cat > $TMPC << EOF
4652 #include <linux/usbdevice_fs.h>
4653 
4654 #ifndef USBDEVFS_GET_CAPABILITIES
4655 #error "USBDEVFS_GET_CAPABILITIES undefined"
4656 #endif
4657 
4658 #ifndef USBDEVFS_DISCONNECT_CLAIM
4659 #error "USBDEVFS_DISCONNECT_CLAIM undefined"
4660 #endif
4661 
4662 int main(void)
4663 {
4664     return 0;
4665 }
4666 EOF
4667   if compile_prog "" ""; then
4668     have_usbfs=yes
4669   fi
4670 fi
4671 
4672 # check for fallocate
4673 fallocate=no
4674 cat > $TMPC << EOF
4675 #include <fcntl.h>
4676 
4677 int main(void)
4678 {
4679     fallocate(0, 0, 0, 0);
4680     return 0;
4681 }
4682 EOF
4683 if compile_prog "" "" ; then
4684   fallocate=yes
4685 fi
4686 
4687 # check for fallocate hole punching
4688 fallocate_punch_hole=no
4689 cat > $TMPC << EOF
4690 #include <fcntl.h>
4691 #include <linux/falloc.h>
4692 
4693 int main(void)
4694 {
4695     fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
4696     return 0;
4697 }
4698 EOF
4699 if compile_prog "" "" ; then
4700   fallocate_punch_hole=yes
4701 fi
4702 
4703 # check that fallocate supports range zeroing inside the file
4704 fallocate_zero_range=no
4705 cat > $TMPC << EOF
4706 #include <fcntl.h>
4707 #include <linux/falloc.h>
4708 
4709 int main(void)
4710 {
4711     fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0);
4712     return 0;
4713 }
4714 EOF
4715 if compile_prog "" "" ; then
4716   fallocate_zero_range=yes
4717 fi
4718 
4719 # check for posix_fallocate
4720 posix_fallocate=no
4721 cat > $TMPC << EOF
4722 #include <fcntl.h>
4723 
4724 int main(void)
4725 {
4726     posix_fallocate(0, 0, 0);
4727     return 0;
4728 }
4729 EOF
4730 if compile_prog "" "" ; then
4731     posix_fallocate=yes
4732 fi
4733 
4734 # check for sync_file_range
4735 sync_file_range=no
4736 cat > $TMPC << EOF
4737 #include <fcntl.h>
4738 
4739 int main(void)
4740 {
4741     sync_file_range(0, 0, 0, 0);
4742     return 0;
4743 }
4744 EOF
4745 if compile_prog "" "" ; then
4746   sync_file_range=yes
4747 fi
4748 
4749 # check for linux/fiemap.h and FS_IOC_FIEMAP
4750 fiemap=no
4751 cat > $TMPC << EOF
4752 #include <sys/ioctl.h>
4753 #include <linux/fs.h>
4754 #include <linux/fiemap.h>
4755 
4756 int main(void)
4757 {
4758     ioctl(0, FS_IOC_FIEMAP, 0);
4759     return 0;
4760 }
4761 EOF
4762 if compile_prog "" "" ; then
4763   fiemap=yes
4764 fi
4765 
4766 # check for dup3
4767 dup3=no
4768 cat > $TMPC << EOF
4769 #include <unistd.h>
4770 
4771 int main(void)
4772 {
4773     dup3(0, 0, 0);
4774     return 0;
4775 }
4776 EOF
4777 if compile_prog "" "" ; then
4778   dup3=yes
4779 fi
4780 
4781 # check for ppoll support
4782 ppoll=no
4783 cat > $TMPC << EOF
4784 #include <poll.h>
4785 
4786 int main(void)
4787 {
4788     struct pollfd pfd = { .fd = 0, .events = 0, .revents = 0 };
4789     ppoll(&pfd, 1, 0, 0);
4790     return 0;
4791 }
4792 EOF
4793 if compile_prog "" "" ; then
4794   ppoll=yes
4795 fi
4796 
4797 # check for prctl(PR_SET_TIMERSLACK , ... ) support
4798 prctl_pr_set_timerslack=no
4799 cat > $TMPC << EOF
4800 #include <sys/prctl.h>
4801 
4802 int main(void)
4803 {
4804     prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0);
4805     return 0;
4806 }
4807 EOF
4808 if compile_prog "" "" ; then
4809   prctl_pr_set_timerslack=yes
4810 fi
4811 
4812 # check for epoll support
4813 epoll=no
4814 cat > $TMPC << EOF
4815 #include <sys/epoll.h>
4816 
4817 int main(void)
4818 {
4819     epoll_create(0);
4820     return 0;
4821 }
4822 EOF
4823 if compile_prog "" "" ; then
4824   epoll=yes
4825 fi
4826 
4827 # epoll_create1 is a later addition
4828 # so we must check separately for its presence
4829 epoll_create1=no
4830 cat > $TMPC << EOF
4831 #include <sys/epoll.h>
4832 
4833 int main(void)
4834 {
4835     /* Note that we use epoll_create1 as a value, not as
4836      * a function being called. This is necessary so that on
4837      * old SPARC glibc versions where the function was present in
4838      * the library but not declared in the header file we will
4839      * fail the configure check. (Otherwise we will get a compiler
4840      * warning but not an error, and will proceed to fail the
4841      * qemu compile where we compile with -Werror.)
4842      */
4843     return (int)(uintptr_t)&epoll_create1;
4844 }
4845 EOF
4846 if compile_prog "" "" ; then
4847   epoll_create1=yes
4848 fi
4849 
4850 # check for sendfile support
4851 sendfile=no
4852 cat > $TMPC << EOF
4853 #include <sys/sendfile.h>
4854 
4855 int main(void)
4856 {
4857     return sendfile(0, 0, 0, 0);
4858 }
4859 EOF
4860 if compile_prog "" "" ; then
4861   sendfile=yes
4862 fi
4863 
4864 # check for timerfd support (glibc 2.8 and newer)
4865 timerfd=no
4866 cat > $TMPC << EOF
4867 #include <sys/timerfd.h>
4868 
4869 int main(void)
4870 {
4871     return(timerfd_create(CLOCK_REALTIME, 0));
4872 }
4873 EOF
4874 if compile_prog "" "" ; then
4875   timerfd=yes
4876 fi
4877 
4878 # check for setns and unshare support
4879 setns=no
4880 cat > $TMPC << EOF
4881 #include <sched.h>
4882 
4883 int main(void)
4884 {
4885     int ret;
4886     ret = setns(0, 0);
4887     ret = unshare(0);
4888     return ret;
4889 }
4890 EOF
4891 if compile_prog "" "" ; then
4892   setns=yes
4893 fi
4894 
4895 # clock_adjtime probe
4896 clock_adjtime=no
4897 cat > $TMPC <<EOF
4898 #include <time.h>
4899 
4900 int main(void)
4901 {
4902     return clock_adjtime(0, 0);
4903 }
4904 EOF
4905 clock_adjtime=no
4906 if compile_prog "" "" ; then
4907   clock_adjtime=yes
4908 fi
4909 
4910 # syncfs probe
4911 syncfs=no
4912 cat > $TMPC <<EOF
4913 #include <unistd.h>
4914 
4915 int main(void)
4916 {
4917     return syncfs(0);
4918 }
4919 EOF
4920 syncfs=no
4921 if compile_prog "" "" ; then
4922   syncfs=yes
4923 fi
4924 
4925 # check for kcov support (kernel must be 4.4+, compiled with certain options)
4926 kcov=no
4927 if check_include sys/kcov.h ; then
4928     kcov=yes
4929 fi
4930 
4931 # Check we have a new enough version of sphinx-build
4932 has_sphinx_build() {
4933     # This is a bit awkward but works: create a trivial document and
4934     # try to run it with our configuration file (which enforces a
4935     # version requirement). This will fail if either
4936     # sphinx-build doesn't exist at all or if it is too old.
4937     mkdir -p "$TMPDIR1/sphinx"
4938     touch "$TMPDIR1/sphinx/index.rst"
4939     "$sphinx_build" -c "$source_path/docs" -b html "$TMPDIR1/sphinx" "$TMPDIR1/sphinx/out" >/dev/null 2>&1
4940 }
4941 
4942 # Check if tools are available to build documentation.
4943 if test "$docs" != "no" ; then
4944   if has_sphinx_build; then
4945     sphinx_ok=yes
4946   else
4947     sphinx_ok=no
4948   fi
4949   if has makeinfo && has pod2man && test "$sphinx_ok" = "yes"; then
4950     docs=yes
4951   else
4952     if test "$docs" = "yes" ; then
4953       if has $sphinx_build && test "$sphinx_ok" != "yes"; then
4954         echo "Warning: $sphinx_build exists but it is either too old or uses too old a Python version" >&2
4955       fi
4956       feature_not_found "docs" "Install texinfo, Perl/perl-podlators and a Python 3 version of python-sphinx"
4957     fi
4958     docs=no
4959   fi
4960 fi
4961 
4962 # Search for bswap_32 function
4963 byteswap_h=no
4964 cat > $TMPC << EOF
4965 #include <byteswap.h>
4966 int main(void) { return bswap_32(0); }
4967 EOF
4968 if compile_prog "" "" ; then
4969   byteswap_h=yes
4970 fi
4971 
4972 # Search for bswap32 function
4973 bswap_h=no
4974 cat > $TMPC << EOF
4975 #include <sys/endian.h>
4976 #include <sys/types.h>
4977 #include <machine/bswap.h>
4978 int main(void) { return bswap32(0); }
4979 EOF
4980 if compile_prog "" "" ; then
4981   bswap_h=yes
4982 fi
4983 
4984 ##########################################
4985 # Do we have libiscsi >= 1.9.0
4986 if test "$libiscsi" != "no" ; then
4987   if $pkg_config --atleast-version=1.9.0 libiscsi; then
4988     libiscsi="yes"
4989     libiscsi_cflags=$($pkg_config --cflags libiscsi)
4990     libiscsi_libs=$($pkg_config --libs libiscsi)
4991   else
4992     if test "$libiscsi" = "yes" ; then
4993       feature_not_found "libiscsi" "Install libiscsi >= 1.9.0"
4994     fi
4995     libiscsi="no"
4996   fi
4997 fi
4998 
4999 ##########################################
5000 # Do we need libm
5001 cat > $TMPC << EOF
5002 #include <math.h>
5003 int main(int argc, char **argv) { return isnan(sin((double)argc)); }
5004 EOF
5005 if compile_prog "" "" ; then
5006   :
5007 elif compile_prog "" "-lm" ; then
5008   LIBS="-lm $LIBS"
5009   libs_qga="-lm $libs_qga"
5010 else
5011   error_exit "libm check failed"
5012 fi
5013 
5014 ##########################################
5015 # Do we need librt
5016 # uClibc provides 2 versions of clock_gettime(), one with realtime
5017 # support and one without. This means that the clock_gettime() don't
5018 # need -lrt. We still need it for timer_create() so we check for this
5019 # function in addition.
5020 cat > $TMPC <<EOF
5021 #include <signal.h>
5022 #include <time.h>
5023 int main(void) {
5024   timer_create(CLOCK_REALTIME, NULL, NULL);
5025   return clock_gettime(CLOCK_REALTIME, NULL);
5026 }
5027 EOF
5028 
5029 if compile_prog "" "" ; then
5030   :
5031 # we need pthread for static linking. use previous pthread test result
5032 elif compile_prog "" "$pthread_lib -lrt" ; then
5033   LIBS="$LIBS -lrt"
5034   libs_qga="$libs_qga -lrt"
5035 fi
5036 
5037 # Check whether we need to link libutil for openpty()
5038 cat > $TMPC << EOF
5039 extern int openpty(int *am, int *as, char *name, void *termp, void *winp);
5040 int main(void) { return openpty(0, 0, 0, 0, 0); }
5041 EOF
5042 
5043 if ! compile_prog "" "" ; then
5044   if compile_prog "" "-lutil" ; then
5045     libs_softmmu="-lutil $libs_softmmu"
5046     libs_tools="-lutil $libs_tools"
5047   fi
5048 fi
5049 
5050 ##########################################
5051 # spice probe
5052 if test "$spice" != "no" ; then
5053   cat > $TMPC << EOF
5054 #include <spice.h>
5055 int main(void) { spice_server_new(); return 0; }
5056 EOF
5057   spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
5058   spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
5059   if $pkg_config --atleast-version=0.12.5 spice-server && \
5060      $pkg_config --atleast-version=0.12.3 spice-protocol && \
5061      compile_prog "$spice_cflags" "$spice_libs" ; then
5062     spice="yes"
5063     libs_softmmu="$libs_softmmu $spice_libs"
5064     QEMU_CFLAGS="$QEMU_CFLAGS $spice_cflags"
5065     spice_protocol_version=$($pkg_config --modversion spice-protocol)
5066     spice_server_version=$($pkg_config --modversion spice-server)
5067   else
5068     if test "$spice" = "yes" ; then
5069       feature_not_found "spice" \
5070           "Install spice-server(>=0.12.5) and spice-protocol(>=0.12.3) devel"
5071     fi
5072     spice="no"
5073   fi
5074 fi
5075 
5076 # check for smartcard support
5077 if test "$smartcard" != "no"; then
5078     if $pkg_config --atleast-version=2.5.1 libcacard; then
5079         libcacard_cflags=$($pkg_config --cflags libcacard)
5080         libcacard_libs=$($pkg_config --libs libcacard)
5081         smartcard="yes"
5082     else
5083         if test "$smartcard" = "yes"; then
5084             feature_not_found "smartcard" "Install libcacard devel"
5085         fi
5086         smartcard="no"
5087     fi
5088 fi
5089 
5090 # check for libusb
5091 if test "$libusb" != "no" ; then
5092     if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
5093         libusb="yes"
5094         libusb_cflags=$($pkg_config --cflags libusb-1.0)
5095         libusb_libs=$($pkg_config --libs libusb-1.0)
5096     else
5097         if test "$libusb" = "yes"; then
5098             feature_not_found "libusb" "Install libusb devel >= 1.0.13"
5099         fi
5100         libusb="no"
5101     fi
5102 fi
5103 
5104 # check for usbredirparser for usb network redirection support
5105 if test "$usb_redir" != "no" ; then
5106     if $pkg_config --atleast-version=0.6 libusbredirparser-0.5; then
5107         usb_redir="yes"
5108         usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5)
5109         usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5)
5110     else
5111         if test "$usb_redir" = "yes"; then
5112             feature_not_found "usb-redir" "Install usbredir devel"
5113         fi
5114         usb_redir="no"
5115     fi
5116 fi
5117 
5118 ##########################################
5119 # check if we have VSS SDK headers for win
5120 
5121 if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
5122         test "$vss_win32_sdk" != "no" ; then
5123   case "$vss_win32_sdk" in
5124     "")   vss_win32_include="-isystem $source_path" ;;
5125     *\ *) # The SDK is installed in "Program Files" by default, but we cannot
5126           # handle path with spaces. So we symlink the headers into ".sdk/vss".
5127           vss_win32_include="-isystem $source_path/.sdk/vss"
5128 	  symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
5129 	  ;;
5130     *)    vss_win32_include="-isystem $vss_win32_sdk"
5131   esac
5132   cat > $TMPC << EOF
5133 #define __MIDL_user_allocate_free_DEFINED__
5134 #include <inc/win2003/vss.h>
5135 int main(void) { return VSS_CTX_BACKUP; }
5136 EOF
5137   if compile_prog "$vss_win32_include" "" ; then
5138     guest_agent_with_vss="yes"
5139     QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
5140     libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
5141     qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
5142   else
5143     if test "$vss_win32_sdk" != "" ; then
5144       echo "ERROR: Please download and install Microsoft VSS SDK:"
5145       echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
5146       echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
5147       echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
5148       echo "ERROR: The headers are extracted in the directory \`inc'."
5149       feature_not_found "VSS support"
5150     fi
5151     guest_agent_with_vss="no"
5152   fi
5153 fi
5154 
5155 ##########################################
5156 # lookup Windows platform SDK (if not specified)
5157 # The SDK is needed only to build .tlb (type library) file of guest agent
5158 # VSS provider from the source. It is usually unnecessary because the
5159 # pre-compiled .tlb file is included.
5160 
5161 if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
5162         test "$guest_agent_with_vss" = "yes" ; then
5163   if test -z "$win_sdk"; then
5164     programfiles="$PROGRAMFILES"
5165     test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
5166     if test -n "$programfiles"; then
5167       win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
5168     else
5169       feature_not_found "Windows SDK"
5170     fi
5171   elif test "$win_sdk" = "no"; then
5172     win_sdk=""
5173   fi
5174 fi
5175 
5176 ##########################################
5177 # check if mingw environment provides a recent ntddscsi.h
5178 if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
5179   cat > $TMPC << EOF
5180 #include <windows.h>
5181 #include <ntddscsi.h>
5182 int main(void) {
5183 #if !defined(IOCTL_SCSI_GET_ADDRESS)
5184 #error Missing required ioctl definitions
5185 #endif
5186   SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
5187   return addr.Lun;
5188 }
5189 EOF
5190   if compile_prog "" "" ; then
5191     guest_agent_ntddscsi=yes
5192     libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
5193   fi
5194 fi
5195 
5196 ##########################################
5197 # virgl renderer probe
5198 
5199 if test "$virglrenderer" != "no" ; then
5200   cat > $TMPC << EOF
5201 #include <virglrenderer.h>
5202 int main(void) { virgl_renderer_poll(); return 0; }
5203 EOF
5204   virgl_cflags=$($pkg_config --cflags virglrenderer 2>/dev/null)
5205   virgl_libs=$($pkg_config --libs virglrenderer 2>/dev/null)
5206   virgl_version=$($pkg_config --modversion virglrenderer 2>/dev/null)
5207   if $pkg_config virglrenderer >/dev/null 2>&1 && \
5208      compile_prog "$virgl_cflags" "$virgl_libs" ; then
5209     virglrenderer="yes"
5210   else
5211     if test "$virglrenderer" = "yes" ; then
5212       feature_not_found "virglrenderer"
5213     fi
5214     virglrenderer="no"
5215   fi
5216 fi
5217 
5218 ##########################################
5219 # capstone
5220 
5221 case "$capstone" in
5222   "" | yes)
5223     if $pkg_config capstone; then
5224       capstone=system
5225     elif test -e "${source_path}/.git" && test $git_update = 'yes' ; then
5226       capstone=git
5227     elif test -e "${source_path}/capstone/Makefile" ; then
5228       capstone=internal
5229     elif test -z "$capstone" ; then
5230       capstone=no
5231     else
5232       feature_not_found "capstone" "Install capstone devel or git submodule"
5233     fi
5234     ;;
5235 
5236   system)
5237     if ! $pkg_config capstone; then
5238       feature_not_found "capstone" "Install capstone devel"
5239     fi
5240     ;;
5241 esac
5242 
5243 case "$capstone" in
5244   git | internal)
5245     if test "$capstone" = git; then
5246       git_submodules="${git_submodules} capstone"
5247     fi
5248     mkdir -p capstone
5249     QEMU_CFLAGS="$QEMU_CFLAGS -I\$(SRC_PATH)/capstone/include"
5250     if test "$mingw32" = "yes"; then
5251       LIBCAPSTONE=capstone.lib
5252     else
5253       LIBCAPSTONE=libcapstone.a
5254     fi
5255     libs_cpu="-L\$(BUILD_DIR)/capstone -lcapstone $libs_cpu"
5256     ;;
5257 
5258   system)
5259     QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags capstone)"
5260     libs_cpu="$($pkg_config --libs capstone) $libs_cpu"
5261     ;;
5262 
5263   no)
5264     ;;
5265   *)
5266     error_exit "Unknown state for capstone: $capstone"
5267     ;;
5268 esac
5269 
5270 ##########################################
5271 # check if we have fdatasync
5272 
5273 fdatasync=no
5274 cat > $TMPC << EOF
5275 #include <unistd.h>
5276 int main(void) {
5277 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
5278 return fdatasync(0);
5279 #else
5280 #error Not supported
5281 #endif
5282 }
5283 EOF
5284 if compile_prog "" "" ; then
5285     fdatasync=yes
5286 fi
5287 
5288 ##########################################
5289 # check if we have madvise
5290 
5291 madvise=no
5292 cat > $TMPC << EOF
5293 #include <sys/types.h>
5294 #include <sys/mman.h>
5295 #include <stddef.h>
5296 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }
5297 EOF
5298 if compile_prog "" "" ; then
5299     madvise=yes
5300 fi
5301 
5302 ##########################################
5303 # check if we have posix_madvise
5304 
5305 posix_madvise=no
5306 cat > $TMPC << EOF
5307 #include <sys/mman.h>
5308 #include <stddef.h>
5309 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }
5310 EOF
5311 if compile_prog "" "" ; then
5312     posix_madvise=yes
5313 fi
5314 
5315 ##########################################
5316 # check if we have posix_memalign()
5317 
5318 posix_memalign=no
5319 cat > $TMPC << EOF
5320 #include <stdlib.h>
5321 int main(void) {
5322     void *p;
5323     return posix_memalign(&p, 8, 8);
5324 }
5325 EOF
5326 if compile_prog "" "" ; then
5327     posix_memalign=yes
5328 fi
5329 
5330 ##########################################
5331 # check if we have posix_syslog
5332 
5333 posix_syslog=no
5334 cat > $TMPC << EOF
5335 #include <syslog.h>
5336 int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; }
5337 EOF
5338 if compile_prog "" "" ; then
5339     posix_syslog=yes
5340 fi
5341 
5342 ##########################################
5343 # check if we have sem_timedwait
5344 
5345 sem_timedwait=no
5346 cat > $TMPC << EOF
5347 #include <semaphore.h>
5348 int main(void) { sem_t s; struct timespec t = {0}; return sem_timedwait(&s, &t); }
5349 EOF
5350 if compile_prog "" "" ; then
5351     sem_timedwait=yes
5352 fi
5353 
5354 ##########################################
5355 # check if we have strchrnul
5356 
5357 strchrnul=no
5358 cat > $TMPC << EOF
5359 #include <string.h>
5360 int main(void);
5361 // Use a haystack that the compiler shouldn't be able to constant fold
5362 char *haystack = (char*)&main;
5363 int main(void) { return strchrnul(haystack, 'x') != &haystack[6]; }
5364 EOF
5365 if compile_prog "" "" ; then
5366     strchrnul=yes
5367 fi
5368 
5369 #########################################
5370 # check if we have st_atim
5371 
5372 st_atim=no
5373 cat > $TMPC << EOF
5374 #include <sys/stat.h>
5375 #include <stddef.h>
5376 int main(void) { return offsetof(struct stat, st_atim); }
5377 EOF
5378 if compile_prog "" "" ; then
5379     st_atim=yes
5380 fi
5381 
5382 ##########################################
5383 # check if trace backend exists
5384 
5385 $python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
5386 if test "$?" -ne 0 ; then
5387   error_exit "invalid trace backends" \
5388       "Please choose supported trace backends."
5389 fi
5390 
5391 ##########################################
5392 # For 'ust' backend, test if ust headers are present
5393 if have_backend "ust"; then
5394   cat > $TMPC << EOF
5395 #include <lttng/tracepoint.h>
5396 int main(void) { return 0; }
5397 EOF
5398   if compile_prog "" "-Wl,--no-as-needed -ldl" ; then
5399     if $pkg_config lttng-ust --exists; then
5400       lttng_ust_libs=$($pkg_config --libs lttng-ust)
5401     else
5402       lttng_ust_libs="-llttng-ust -ldl"
5403     fi
5404     if $pkg_config liburcu-bp --exists; then
5405       urcu_bp_libs=$($pkg_config --libs liburcu-bp)
5406     else
5407       urcu_bp_libs="-lurcu-bp"
5408     fi
5409 
5410     LIBS="$lttng_ust_libs $urcu_bp_libs $LIBS"
5411     libs_qga="$lttng_ust_libs $urcu_bp_libs $libs_qga"
5412   else
5413     error_exit "Trace backend 'ust' missing lttng-ust header files"
5414   fi
5415 fi
5416 
5417 ##########################################
5418 # For 'dtrace' backend, test if 'dtrace' command is present
5419 if have_backend "dtrace"; then
5420   if ! has 'dtrace' ; then
5421     error_exit "dtrace command is not found in PATH $PATH"
5422   fi
5423   trace_backend_stap="no"
5424   if has 'stap' ; then
5425     trace_backend_stap="yes"
5426   fi
5427 fi
5428 
5429 ##########################################
5430 # check and set a backend for coroutine
5431 
5432 # We prefer ucontext, but it's not always possible. The fallback
5433 # is sigcontext. On Windows the only valid backend is the Windows
5434 # specific one.
5435 
5436 ucontext_works=no
5437 if test "$darwin" != "yes"; then
5438   cat > $TMPC << EOF
5439 #include <ucontext.h>
5440 #ifdef __stub_makecontext
5441 #error Ignoring glibc stub makecontext which will always fail
5442 #endif
5443 int main(void) { makecontext(0, 0, 0); return 0; }
5444 EOF
5445   if compile_prog "" "" ; then
5446     ucontext_works=yes
5447   fi
5448 fi
5449 
5450 if test "$coroutine" = ""; then
5451   if test "$mingw32" = "yes"; then
5452     coroutine=win32
5453   elif test "$ucontext_works" = "yes"; then
5454     coroutine=ucontext
5455   else
5456     coroutine=sigaltstack
5457   fi
5458 else
5459   case $coroutine in
5460   windows)
5461     if test "$mingw32" != "yes"; then
5462       error_exit "'windows' coroutine backend only valid for Windows"
5463     fi
5464     # Unfortunately the user visible backend name doesn't match the
5465     # coroutine-*.c filename for this case, so we have to adjust it here.
5466     coroutine=win32
5467     ;;
5468   ucontext)
5469     if test "$ucontext_works" != "yes"; then
5470       feature_not_found "ucontext"
5471     fi
5472     ;;
5473   sigaltstack)
5474     if test "$mingw32" = "yes"; then
5475       error_exit "only the 'windows' coroutine backend is valid for Windows"
5476     fi
5477     ;;
5478   *)
5479     error_exit "unknown coroutine backend $coroutine"
5480     ;;
5481   esac
5482 fi
5483 
5484 if test "$coroutine_pool" = ""; then
5485   coroutine_pool=yes
5486 fi
5487 
5488 if test "$debug_stack_usage" = "yes"; then
5489   if test "$coroutine_pool" = "yes"; then
5490     echo "WARN: disabling coroutine pool for stack usage debugging"
5491     coroutine_pool=no
5492   fi
5493 fi
5494 
5495 
5496 ##########################################
5497 # check if we have open_by_handle_at
5498 
5499 open_by_handle_at=no
5500 cat > $TMPC << EOF
5501 #include <fcntl.h>
5502 #if !defined(AT_EMPTY_PATH)
5503 # error missing definition
5504 #else
5505 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
5506 #endif
5507 EOF
5508 if compile_prog "" "" ; then
5509     open_by_handle_at=yes
5510 fi
5511 
5512 ########################################
5513 # check if we have linux/magic.h
5514 
5515 linux_magic_h=no
5516 cat > $TMPC << EOF
5517 #include <linux/magic.h>
5518 int main(void) {
5519   return 0;
5520 }
5521 EOF
5522 if compile_prog "" "" ; then
5523     linux_magic_h=yes
5524 fi
5525 
5526 ########################################
5527 # check whether we can disable warning option with a pragma (this is needed
5528 # to silence warnings in the headers of some versions of external libraries).
5529 # This test has to be compiled with -Werror as otherwise an unknown pragma is
5530 # only a warning.
5531 #
5532 # If we can't selectively disable warning in the code, disable -Werror so that
5533 # the build doesn't fail anyway.
5534 
5535 pragma_disable_unused_but_set=no
5536 cat > $TMPC << EOF
5537 #pragma GCC diagnostic push
5538 #pragma GCC diagnostic ignored "-Wstrict-prototypes"
5539 #pragma GCC diagnostic pop
5540 
5541 int main(void) {
5542     return 0;
5543 }
5544 EOF
5545 if compile_prog "-Werror" "" ; then
5546     pragma_diagnostic_available=yes
5547 else
5548     werror=no
5549 fi
5550 
5551 ########################################
5552 # check if we have valgrind/valgrind.h
5553 
5554 valgrind_h=no
5555 cat > $TMPC << EOF
5556 #include <valgrind/valgrind.h>
5557 int main(void) {
5558   return 0;
5559 }
5560 EOF
5561 if compile_prog "" "" ; then
5562     valgrind_h=yes
5563 fi
5564 
5565 ########################################
5566 # check if environ is declared
5567 
5568 has_environ=no
5569 cat > $TMPC << EOF
5570 #include <unistd.h>
5571 int main(void) {
5572     environ = 0;
5573     return 0;
5574 }
5575 EOF
5576 if compile_prog "" "" ; then
5577     has_environ=yes
5578 fi
5579 
5580 ########################################
5581 # check if cpuid.h is usable.
5582 
5583 cat > $TMPC << EOF
5584 #include <cpuid.h>
5585 int main(void) {
5586     unsigned a, b, c, d;
5587     int max = __get_cpuid_max(0, 0);
5588 
5589     if (max >= 1) {
5590         __cpuid(1, a, b, c, d);
5591     }
5592 
5593     if (max >= 7) {
5594         __cpuid_count(7, 0, a, b, c, d);
5595     }
5596 
5597     return 0;
5598 }
5599 EOF
5600 if compile_prog "" "" ; then
5601     cpuid_h=yes
5602 fi
5603 
5604 ##########################################
5605 # avx2 optimization requirement check
5606 #
5607 # There is no point enabling this if cpuid.h is not usable,
5608 # since we won't be able to select the new routines.
5609 
5610 if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
5611   cat > $TMPC << EOF
5612 #pragma GCC push_options
5613 #pragma GCC target("avx2")
5614 #include <cpuid.h>
5615 #include <immintrin.h>
5616 static int bar(void *a) {
5617     __m256i x = *(__m256i *)a;
5618     return _mm256_testz_si256(x, x);
5619 }
5620 int main(int argc, char *argv[]) { return bar(argv[0]); }
5621 EOF
5622   if compile_object "" ; then
5623     avx2_opt="yes"
5624   else
5625     avx2_opt="no"
5626   fi
5627 fi
5628 
5629 ##########################################
5630 # avx512f optimization requirement check
5631 #
5632 # There is no point enabling this if cpuid.h is not usable,
5633 # since we won't be able to select the new routines.
5634 # by default, it is turned off.
5635 # if user explicitly want to enable it, check environment
5636 
5637 if test "$cpuid_h" = "yes" && test "$avx512f_opt" = "yes"; then
5638   cat > $TMPC << EOF
5639 #pragma GCC push_options
5640 #pragma GCC target("avx512f")
5641 #include <cpuid.h>
5642 #include <immintrin.h>
5643 static int bar(void *a) {
5644     __m512i x = *(__m512i *)a;
5645     return _mm512_test_epi64_mask(x, x);
5646 }
5647 int main(int argc, char *argv[])
5648 {
5649 	return bar(argv[0]);
5650 }
5651 EOF
5652   if ! compile_object "" ; then
5653     avx512f_opt="no"
5654   fi
5655 else
5656   avx512f_opt="no"
5657 fi
5658 
5659 ########################################
5660 # check if __[u]int128_t is usable.
5661 
5662 int128=no
5663 cat > $TMPC << EOF
5664 __int128_t a;
5665 __uint128_t b;
5666 int main (void) {
5667   a = a + b;
5668   b = a * b;
5669   a = a * a;
5670   return 0;
5671 }
5672 EOF
5673 if compile_prog "" "" ; then
5674     int128=yes
5675 fi
5676 
5677 #########################################
5678 # See if 128-bit atomic operations are supported.
5679 
5680 atomic128=no
5681 if test "$int128" = "yes"; then
5682   cat > $TMPC << EOF
5683 int main(void)
5684 {
5685   unsigned __int128 x = 0, y = 0;
5686   y = __atomic_load_16(&x, 0);
5687   __atomic_store_16(&x, y, 0);
5688   __atomic_compare_exchange_16(&x, &y, x, 0, 0, 0);
5689   return 0;
5690 }
5691 EOF
5692   if compile_prog "" "" ; then
5693     atomic128=yes
5694   fi
5695 fi
5696 
5697 cmpxchg128=no
5698 if test "$int128" = yes && test "$atomic128" = no; then
5699   cat > $TMPC << EOF
5700 int main(void)
5701 {
5702   unsigned __int128 x = 0, y = 0;
5703   __sync_val_compare_and_swap_16(&x, y, x);
5704   return 0;
5705 }
5706 EOF
5707   if compile_prog "" "" ; then
5708     cmpxchg128=yes
5709   fi
5710 fi
5711 
5712 #########################################
5713 # See if 64-bit atomic operations are supported.
5714 # Note that without __atomic builtins, we can only
5715 # assume atomic loads/stores max at pointer size.
5716 
5717 cat > $TMPC << EOF
5718 #include <stdint.h>
5719 int main(void)
5720 {
5721   uint64_t x = 0, y = 0;
5722 #ifdef __ATOMIC_RELAXED
5723   y = __atomic_load_8(&x, 0);
5724   __atomic_store_8(&x, y, 0);
5725   __atomic_compare_exchange_8(&x, &y, x, 0, 0, 0);
5726   __atomic_exchange_8(&x, y, 0);
5727   __atomic_fetch_add_8(&x, y, 0);
5728 #else
5729   typedef char is_host64[sizeof(void *) >= sizeof(uint64_t) ? 1 : -1];
5730   __sync_lock_test_and_set(&x, y);
5731   __sync_val_compare_and_swap(&x, y, 0);
5732   __sync_fetch_and_add(&x, y);
5733 #endif
5734   return 0;
5735 }
5736 EOF
5737 if compile_prog "" "" ; then
5738   atomic64=yes
5739 fi
5740 
5741 #########################################
5742 # See if --dynamic-list is supported by the linker
5743 ld_dynamic_list="no"
5744 if test "$static" = "no" ; then
5745     cat > $TMPTXT <<EOF
5746 {
5747   foo;
5748 };
5749 EOF
5750 
5751     cat > $TMPC <<EOF
5752 #include <stdio.h>
5753 void foo(void);
5754 
5755 void foo(void)
5756 {
5757   printf("foo\n");
5758 }
5759 
5760 int main(void)
5761 {
5762   foo();
5763   return 0;
5764 }
5765 EOF
5766 
5767     if compile_prog "" "-Wl,--dynamic-list=$TMPTXT" ; then
5768         ld_dynamic_list="yes"
5769     fi
5770 fi
5771 
5772 #########################################
5773 # See if -exported_symbols_list is supported by the linker
5774 
5775 ld_exported_symbols_list="no"
5776 if test "$static" = "no" ; then
5777     cat > $TMPTXT <<EOF
5778   _foo
5779 EOF
5780 
5781     if compile_prog "" "-Wl,-exported_symbols_list,$TMPTXT" ; then
5782         ld_exported_symbols_list="yes"
5783     fi
5784 fi
5785 
5786 if  test "$plugins" = "yes" &&
5787     test "$ld_dynamic_list" = "no" &&
5788     test "$ld_exported_symbols_list" = "no" ; then
5789   error_exit \
5790       "Plugin support requires dynamic linking and specifying a set of symbols " \
5791       "that are exported to plugins. Unfortunately your linker doesn't " \
5792       "support the flag (--dynamic-list or -exported_symbols_list) used " \
5793       "for this purpose. You can't build with --static."
5794 fi
5795 
5796 ########################################
5797 # See if __attribute__((alias)) is supported.
5798 # This false for Xcode 9, but has been remedied for Xcode 10.
5799 # Unfortunately, travis uses Xcode 9 by default.
5800 
5801 attralias=no
5802 cat > $TMPC << EOF
5803 int x = 1;
5804 extern const int y __attribute__((alias("x")));
5805 int main(void) { return 0; }
5806 EOF
5807 if compile_prog "" "" ; then
5808     attralias=yes
5809 fi
5810 
5811 ########################################
5812 # check if getauxval is available.
5813 
5814 getauxval=no
5815 cat > $TMPC << EOF
5816 #include <sys/auxv.h>
5817 int main(void) {
5818   return getauxval(AT_HWCAP) == 0;
5819 }
5820 EOF
5821 if compile_prog "" "" ; then
5822     getauxval=yes
5823 fi
5824 
5825 ########################################
5826 # check if ccache is interfering with
5827 # semantic analysis of macros
5828 
5829 unset CCACHE_CPP2
5830 ccache_cpp2=no
5831 cat > $TMPC << EOF
5832 static const int Z = 1;
5833 #define fn() ({ Z; })
5834 #define TAUT(X) ((X) == Z)
5835 #define PAREN(X, Y) (X == Y)
5836 #define ID(X) (X)
5837 int main(int argc, char *argv[])
5838 {
5839     int x = 0, y = 0;
5840     x = ID(x);
5841     x = fn();
5842     fn();
5843     if (PAREN(x, y)) return 0;
5844     if (TAUT(Z)) return 0;
5845     return 0;
5846 }
5847 EOF
5848 
5849 if ! compile_object "-Werror"; then
5850     ccache_cpp2=yes
5851 fi
5852 
5853 #################################################
5854 # clang does not support glibc + FORTIFY_SOURCE.
5855 
5856 if test "$fortify_source" != "no"; then
5857   if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
5858     fortify_source="no";
5859   elif test -n "$cxx" && has $cxx &&
5860        echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
5861     fortify_source="no";
5862   else
5863     fortify_source="yes"
5864   fi
5865 fi
5866 
5867 ###############################################
5868 # Check if copy_file_range is provided by glibc
5869 have_copy_file_range=no
5870 cat > $TMPC << EOF
5871 #include <unistd.h>
5872 int main(void) {
5873   copy_file_range(0, NULL, 0, NULL, 0, 0);
5874   return 0;
5875 }
5876 EOF
5877 if compile_prog "" "" ; then
5878     have_copy_file_range=yes
5879 fi
5880 
5881 ##########################################
5882 # check if struct fsxattr is available via linux/fs.h
5883 
5884 have_fsxattr=no
5885 cat > $TMPC << EOF
5886 #include <linux/fs.h>
5887 struct fsxattr foo;
5888 int main(void) {
5889   return 0;
5890 }
5891 EOF
5892 if compile_prog "" "" ; then
5893     have_fsxattr=yes
5894 fi
5895 
5896 ##########################################
5897 # check for usable membarrier system call
5898 if test "$membarrier" = "yes"; then
5899     have_membarrier=no
5900     if test "$mingw32" = "yes" ; then
5901         have_membarrier=yes
5902     elif test "$linux" = "yes" ; then
5903         cat > $TMPC << EOF
5904     #include <linux/membarrier.h>
5905     #include <sys/syscall.h>
5906     #include <unistd.h>
5907     #include <stdlib.h>
5908     int main(void) {
5909         syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
5910         syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
5911 	exit(0);
5912     }
5913 EOF
5914         if compile_prog "" "" ; then
5915             have_membarrier=yes
5916         fi
5917     fi
5918     if test "$have_membarrier" = "no"; then
5919       feature_not_found "membarrier" "membarrier system call not available"
5920     fi
5921 else
5922     # Do not enable it by default even for Mingw32, because it doesn't
5923     # work on Wine.
5924     membarrier=no
5925 fi
5926 
5927 ##########################################
5928 # check if rtnetlink.h exists and is useful
5929 have_rtnetlink=no
5930 cat > $TMPC << EOF
5931 #include <linux/rtnetlink.h>
5932 int main(void) {
5933   return IFLA_PROTO_DOWN;
5934 }
5935 EOF
5936 if compile_prog "" "" ; then
5937     have_rtnetlink=yes
5938 fi
5939 
5940 ##########################################
5941 # check for usable AF_VSOCK environment
5942 have_af_vsock=no
5943 cat > $TMPC << EOF
5944 #include <errno.h>
5945 #include <sys/types.h>
5946 #include <sys/socket.h>
5947 #if !defined(AF_VSOCK)
5948 # error missing AF_VSOCK flag
5949 #endif
5950 #include <linux/vm_sockets.h>
5951 int main(void) {
5952     int sock, ret;
5953     struct sockaddr_vm svm;
5954     socklen_t len = sizeof(svm);
5955     sock = socket(AF_VSOCK, SOCK_STREAM, 0);
5956     ret = getpeername(sock, (struct sockaddr *)&svm, &len);
5957     if ((ret == -1) && (errno == ENOTCONN)) {
5958         return 0;
5959     }
5960     return -1;
5961 }
5962 EOF
5963 if compile_prog "" "" ; then
5964     have_af_vsock=yes
5965 fi
5966 
5967 ##########################################
5968 # check for usable AF_ALG environment
5969 have_afalg=no
5970 cat > $TMPC << EOF
5971 #include <errno.h>
5972 #include <sys/types.h>
5973 #include <sys/socket.h>
5974 #include <linux/if_alg.h>
5975 int main(void) {
5976     int sock;
5977     sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
5978     return sock;
5979 }
5980 EOF
5981 if compile_prog "" "" ; then
5982     have_afalg=yes
5983 fi
5984 if test "$crypto_afalg" = "yes"
5985 then
5986     if test "$have_afalg" != "yes"
5987     then
5988 	error_exit "AF_ALG requested but could not be detected"
5989     fi
5990 fi
5991 
5992 
5993 #################################################
5994 # Check to see if we have the Hypervisor framework
5995 if [ "$darwin" = "yes" ] ; then
5996   cat > $TMPC << EOF
5997 #include <Hypervisor/hv.h>
5998 int main() { return 0;}
5999 EOF
6000   if ! compile_object ""; then
6001     hvf='no'
6002   else
6003     hvf='yes'
6004     QEMU_LDFLAGS="-framework Hypervisor $QEMU_LDFLAGS"
6005   fi
6006 fi
6007 
6008 #################################################
6009 # Sparc implicitly links with --relax, which is
6010 # incompatible with -r, so --no-relax should be
6011 # given. It does no harm to give it on other
6012 # platforms too.
6013 
6014 # Note: the prototype is needed since QEMU_CFLAGS
6015 #       contains -Wmissing-prototypes
6016 cat > $TMPC << EOF
6017 extern int foo(void);
6018 int foo(void) { return 0; }
6019 EOF
6020 if ! compile_object ""; then
6021   error_exit "Failed to compile object file for LD_REL_FLAGS test"
6022 fi
6023 for i in '-Wl,-r -Wl,--no-relax' -Wl,-r -r; do
6024   if do_cc -nostdlib $i -o $TMPMO $TMPO; then
6025     LD_REL_FLAGS=$i
6026     break
6027   fi
6028 done
6029 if test "$modules" = "yes" && test "$LD_REL_FLAGS" = ""; then
6030   feature_not_found "modules" "Cannot find how to build relocatable objects"
6031 fi
6032 
6033 ##########################################
6034 # check for sysmacros.h
6035 
6036 have_sysmacros=no
6037 cat > $TMPC << EOF
6038 #include <sys/sysmacros.h>
6039 int main(void) {
6040     return makedev(0, 0);
6041 }
6042 EOF
6043 if compile_prog "" "" ; then
6044     have_sysmacros=yes
6045 fi
6046 
6047 ##########################################
6048 # Veritas HyperScale block driver VxHS
6049 # Check if libvxhs is installed
6050 
6051 if test "$vxhs" != "no" ; then
6052   cat > $TMPC <<EOF
6053 #include <stdint.h>
6054 #include <qnio/qnio_api.h>
6055 
6056 void *vxhs_callback;
6057 
6058 int main(void) {
6059     iio_init(QNIO_VERSION, vxhs_callback);
6060     return 0;
6061 }
6062 EOF
6063   vxhs_libs="-lvxhs -lssl"
6064   if compile_prog "" "$vxhs_libs" ; then
6065     vxhs=yes
6066   else
6067     if test "$vxhs" = "yes" ; then
6068       feature_not_found "vxhs block device" "Install libvxhs See github"
6069     fi
6070     vxhs=no
6071   fi
6072 fi
6073 
6074 ##########################################
6075 # check for _Static_assert()
6076 
6077 have_static_assert=no
6078 cat > $TMPC << EOF
6079 _Static_assert(1, "success");
6080 int main(void) {
6081     return 0;
6082 }
6083 EOF
6084 if compile_prog "" "" ; then
6085     have_static_assert=yes
6086 fi
6087 
6088 ##########################################
6089 # check for utmpx.h, it is missing e.g. on OpenBSD
6090 
6091 have_utmpx=no
6092 cat > $TMPC << EOF
6093 #include <utmpx.h>
6094 struct utmpx user_info;
6095 int main(void) {
6096     return 0;
6097 }
6098 EOF
6099 if compile_prog "" "" ; then
6100     have_utmpx=yes
6101 fi
6102 
6103 ##########################################
6104 # check for getrandom()
6105 
6106 have_getrandom=no
6107 cat > $TMPC << EOF
6108 #include <sys/random.h>
6109 int main(void) {
6110     return getrandom(0, 0, GRND_NONBLOCK);
6111 }
6112 EOF
6113 if compile_prog "" "" ; then
6114     have_getrandom=yes
6115 fi
6116 
6117 ##########################################
6118 # checks for sanitizers
6119 
6120 have_asan=no
6121 have_ubsan=no
6122 have_asan_iface_h=no
6123 have_asan_iface_fiber=no
6124 
6125 if test "$sanitizers" = "yes" ; then
6126   write_c_skeleton
6127   if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
6128       have_asan=yes
6129   fi
6130 
6131   # we could use a simple skeleton for flags checks, but this also
6132   # detect the static linking issue of ubsan, see also:
6133   # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
6134   cat > $TMPC << EOF
6135 #include <stdlib.h>
6136 int main(void) {
6137     void *tmp = malloc(10);
6138     return *(int *)(tmp + 2);
6139 }
6140 EOF
6141   if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
6142       have_ubsan=yes
6143   fi
6144 
6145   if check_include "sanitizer/asan_interface.h" ; then
6146       have_asan_iface_h=yes
6147   fi
6148 
6149   cat > $TMPC << EOF
6150 #include <sanitizer/asan_interface.h>
6151 int main(void) {
6152   __sanitizer_start_switch_fiber(0, 0, 0);
6153   return 0;
6154 }
6155 EOF
6156   if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
6157       have_asan_iface_fiber=yes
6158   fi
6159 fi
6160 
6161 ##########################################
6162 # checks for fuzzer
6163 if test "$fuzzing" = "yes" ; then
6164   write_c_fuzzer_skeleton
6165   if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address,fuzzer" ""; then
6166       have_fuzzer=yes
6167   fi
6168 fi
6169 
6170 ##########################################
6171 # check for libpmem
6172 
6173 if test "$libpmem" != "no"; then
6174 	if $pkg_config --exists "libpmem"; then
6175 		libpmem="yes"
6176 		libpmem_libs=$($pkg_config --libs libpmem)
6177 		libpmem_cflags=$($pkg_config --cflags libpmem)
6178 		libs_softmmu="$libs_softmmu $libpmem_libs"
6179 		QEMU_CFLAGS="$QEMU_CFLAGS $libpmem_cflags"
6180 	else
6181 		if test "$libpmem" = "yes" ; then
6182 			feature_not_found "libpmem" "Install nvml or pmdk"
6183 		fi
6184 		libpmem="no"
6185 	fi
6186 fi
6187 
6188 ##########################################
6189 # check for slirp
6190 
6191 # slirp is only required when building softmmu targets
6192 if test -z "$slirp" -a "$softmmu" != "yes" ; then
6193     slirp="no"
6194 fi
6195 
6196 case "$slirp" in
6197   "" | yes)
6198     if $pkg_config slirp; then
6199       slirp=system
6200     elif test -e "${source_path}/.git" && test $git_update = 'yes' ; then
6201       slirp=git
6202     elif test -e "${source_path}/slirp/Makefile" ; then
6203       slirp=internal
6204     elif test -z "$slirp" ; then
6205       slirp=no
6206     else
6207       feature_not_found "slirp" "Install slirp devel or git submodule"
6208     fi
6209     ;;
6210 
6211   system)
6212     if ! $pkg_config slirp; then
6213       feature_not_found "slirp" "Install slirp devel"
6214     fi
6215     ;;
6216 esac
6217 
6218 case "$slirp" in
6219   git | internal)
6220     if test "$slirp" = git; then
6221       git_submodules="${git_submodules} slirp"
6222     fi
6223     mkdir -p slirp
6224     slirp_cflags="-I\$(SRC_PATH)/slirp/src -I\$(BUILD_DIR)/slirp/src"
6225     slirp_libs="-L\$(BUILD_DIR)/slirp -lslirp"
6226     if test "$mingw32" = "yes" ; then
6227       slirp_libs="$slirp_libs -lws2_32 -liphlpapi"
6228     fi
6229     ;;
6230 
6231   system)
6232     slirp_version=$($pkg_config --modversion slirp 2>/dev/null)
6233     slirp_cflags=$($pkg_config --cflags slirp 2>/dev/null)
6234     slirp_libs=$($pkg_config --libs slirp 2>/dev/null)
6235     ;;
6236 
6237   no)
6238     ;;
6239   *)
6240     error_exit "Unknown state for slirp: $slirp"
6241     ;;
6242 esac
6243 
6244 
6245 ##########################################
6246 # End of CC checks
6247 # After here, no more $cc or $ld runs
6248 
6249 write_c_skeleton
6250 
6251 if test "$gcov" = "yes" ; then
6252   QEMU_CFLAGS="-fprofile-arcs -ftest-coverage -g $QEMU_CFLAGS"
6253   QEMU_LDFLAGS="-fprofile-arcs -ftest-coverage $QEMU_LDFLAGS"
6254 elif test "$fortify_source" = "yes" ; then
6255   CFLAGS="-O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $CFLAGS"
6256 elif test "$debug" = "no"; then
6257   CFLAGS="-O2 $CFLAGS"
6258 fi
6259 
6260 if test "$have_asan" = "yes"; then
6261   QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
6262   QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
6263   if test "$have_asan_iface_h" = "no" ; then
6264       echo "ASAN build enabled, but ASAN header missing." \
6265            "Without code annotation, the report may be inferior."
6266   elif test "$have_asan_iface_fiber" = "no" ; then
6267       echo "ASAN build enabled, but ASAN header is too old." \
6268            "Without code annotation, the report may be inferior."
6269   fi
6270 fi
6271 if test "$have_ubsan" = "yes"; then
6272   QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS"
6273   QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
6274 fi
6275 
6276 ##########################################
6277 # Do we have libnfs
6278 if test "$libnfs" != "no" ; then
6279   if $pkg_config --atleast-version=1.9.3 libnfs; then
6280     libnfs="yes"
6281     libnfs_libs=$($pkg_config --libs libnfs)
6282   else
6283     if test "$libnfs" = "yes" ; then
6284       feature_not_found "libnfs" "Install libnfs devel >= 1.9.3"
6285     fi
6286     libnfs="no"
6287   fi
6288 fi
6289 
6290 ##########################################
6291 # Do we have libudev
6292 if test "$libudev" != "no" ; then
6293   if $pkg_config libudev && test "$static" != "yes"; then
6294     libudev="yes"
6295     libudev_libs=$($pkg_config --libs libudev)
6296   else
6297     libudev="no"
6298   fi
6299 fi
6300 
6301 # Now we've finished running tests it's OK to add -Werror to the compiler flags
6302 if test "$werror" = "yes"; then
6303     QEMU_CFLAGS="-Werror $QEMU_CFLAGS"
6304 fi
6305 
6306 if test "$solaris" = "no" ; then
6307     if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
6308         QEMU_LDFLAGS="-Wl,--warn-common $QEMU_LDFLAGS"
6309     fi
6310 fi
6311 
6312 # test if pod2man has --utf8 option
6313 if pod2man --help | grep -q utf8; then
6314     POD2MAN="pod2man --utf8"
6315 else
6316     POD2MAN="pod2man"
6317 fi
6318 
6319 # Use ASLR, no-SEH and DEP if available
6320 if test "$mingw32" = "yes" ; then
6321     for flag in --dynamicbase --no-seh --nxcompat; do
6322         if ld_has $flag ; then
6323             QEMU_LDFLAGS="-Wl,$flag $QEMU_LDFLAGS"
6324         fi
6325     done
6326 fi
6327 
6328 # Disable OpenBSD W^X if available
6329 if test "$tcg" = "yes" && test "$targetos" = "OpenBSD"; then
6330     cat > $TMPC <<EOF
6331     int main(void) { return 0; }
6332 EOF
6333     wx_ldflags="-Wl,-z,wxneeded"
6334     if compile_prog "" "$wx_ldflags"; then
6335         QEMU_LDFLAGS="$QEMU_LDFLAGS $wx_ldflags"
6336     fi
6337 fi
6338 
6339 qemu_confdir=$sysconfdir$confsuffix
6340 qemu_moddir=$libdir$confsuffix
6341 qemu_datadir=$datadir$confsuffix
6342 qemu_localedir="$datadir/locale"
6343 qemu_icondir="$datadir/icons"
6344 qemu_desktopdir="$datadir/applications"
6345 
6346 # We can only support ivshmem if we have eventfd
6347 if [ "$eventfd" = "yes" ]; then
6348   ivshmem=yes
6349 fi
6350 
6351 tools=""
6352 if test "$want_tools" = "yes" ; then
6353   tools="qemu-img\$(EXESUF) qemu-io\$(EXESUF) qemu-edid\$(EXESUF) $tools"
6354   if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" ] ; then
6355     tools="qemu-nbd\$(EXESUF) qemu-storage-daemon\$(EXESUF) $tools"
6356   fi
6357   if [ "$ivshmem" = "yes" ]; then
6358     tools="ivshmem-client\$(EXESUF) ivshmem-server\$(EXESUF) $tools"
6359   fi
6360   if [ "$curl" = "yes" ]; then
6361       tools="elf2dmp\$(EXESUF) $tools"
6362   fi
6363 fi
6364 if test "$softmmu" = yes ; then
6365   if test "$linux" = yes; then
6366     if test "$virtfs" != no && test "$cap_ng" = yes && test "$attr" = yes ; then
6367       virtfs=yes
6368       tools="$tools fsdev/virtfs-proxy-helper\$(EXESUF)"
6369     else
6370       if test "$virtfs" = yes; then
6371         error_exit "VirtFS requires libcap-ng devel and libattr devel"
6372       fi
6373       virtfs=no
6374     fi
6375     if test "$mpath" != no && test "$mpathpersist" = yes ; then
6376       mpath=yes
6377     else
6378       if test "$mpath" = yes; then
6379         error_exit "Multipath requires libmpathpersist devel"
6380       fi
6381       mpath=no
6382     fi
6383     tools="$tools scsi/qemu-pr-helper\$(EXESUF)"
6384   else
6385     if test "$virtfs" = yes; then
6386       error_exit "VirtFS is supported only on Linux"
6387     fi
6388     virtfs=no
6389     if test "$mpath" = yes; then
6390       error_exit "Multipath is supported only on Linux"
6391     fi
6392     mpath=no
6393   fi
6394   if test "$xkbcommon" = "yes"; then
6395     tools="qemu-keymap\$(EXESUF) $tools"
6396   fi
6397 fi
6398 
6399 # Probe for guest agent support/options
6400 
6401 if [ "$guest_agent" != "no" ]; then
6402   if [ "$softmmu" = no -a "$want_tools" = no ] ; then
6403       guest_agent=no
6404   elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
6405       tools="qemu-ga\$(EXESUF) $tools"
6406       guest_agent=yes
6407   elif [ "$guest_agent" != yes ]; then
6408       guest_agent=no
6409   else
6410       error_exit "Guest agent is not supported on this platform"
6411   fi
6412 fi
6413 
6414 # Guest agent Window MSI  package
6415 
6416 if test "$guest_agent" != yes; then
6417   if test "$guest_agent_msi" = yes; then
6418     error_exit "MSI guest agent package requires guest agent enabled"
6419   fi
6420   guest_agent_msi=no
6421 elif test "$mingw32" != "yes"; then
6422   if test "$guest_agent_msi" = "yes"; then
6423     error_exit "MSI guest agent package is available only for MinGW Windows cross-compilation"
6424   fi
6425   guest_agent_msi=no
6426 elif ! has wixl; then
6427   if test "$guest_agent_msi" = "yes"; then
6428     error_exit "MSI guest agent package requires wixl tool installed ( usually from msitools package )"
6429   fi
6430   guest_agent_msi=no
6431 else
6432   # we support qemu-ga, mingw32, and wixl: default to MSI enabled if it wasn't
6433   # disabled explicitly
6434   if test "$guest_agent_msi" != "no"; then
6435     guest_agent_msi=yes
6436   fi
6437 fi
6438 
6439 if test "$guest_agent_msi" = "yes"; then
6440   if test "$guest_agent_with_vss" = "yes"; then
6441     QEMU_GA_MSI_WITH_VSS="-D InstallVss"
6442   fi
6443 
6444   if test "$QEMU_GA_MANUFACTURER" = ""; then
6445     QEMU_GA_MANUFACTURER=QEMU
6446   fi
6447 
6448   if test "$QEMU_GA_DISTRO" = ""; then
6449     QEMU_GA_DISTRO=Linux
6450   fi
6451 
6452   if test "$QEMU_GA_VERSION" = ""; then
6453       QEMU_GA_VERSION=$(cat $source_path/VERSION)
6454   fi
6455 
6456   QEMU_GA_MSI_MINGW_DLL_PATH="-D Mingw_dlls=$($pkg_config --variable=prefix glib-2.0)/bin"
6457 
6458   case "$cpu" in
6459   x86_64)
6460     QEMU_GA_MSI_ARCH="-a x64 -D Arch=64"
6461     ;;
6462   i386)
6463     QEMU_GA_MSI_ARCH="-D Arch=32"
6464     ;;
6465   *)
6466     error_exit "CPU $cpu not supported for building installation package"
6467     ;;
6468   esac
6469 fi
6470 
6471 # Mac OS X ships with a broken assembler
6472 roms=
6473 if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
6474         test "$targetos" != "Darwin" && test "$targetos" != "SunOS" && \
6475         test "$softmmu" = yes ; then
6476     # Different host OS linkers have different ideas about the name of the ELF
6477     # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
6478     # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
6479     for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
6480         if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
6481             ld_i386_emulation="$emu"
6482             roms="optionrom"
6483             break
6484         fi
6485     done
6486 fi
6487 
6488 # Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
6489 if test "$cpu" = "s390x" ; then
6490   write_c_skeleton
6491   if compile_prog "-march=z900" ""; then
6492     roms="$roms s390-ccw"
6493   fi
6494 fi
6495 
6496 # Check that the C++ compiler exists and works with the C compiler.
6497 # All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
6498 if has $cxx; then
6499     cat > $TMPC <<EOF
6500 int c_function(void);
6501 int main(void) { return c_function(); }
6502 EOF
6503 
6504     compile_object
6505 
6506     cat > $TMPCXX <<EOF
6507 extern "C" {
6508    int c_function(void);
6509 }
6510 int c_function(void) { return 42; }
6511 EOF
6512 
6513     update_cxxflags
6514 
6515     if do_cxx $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
6516         # C++ compiler $cxx works ok with C compiler $cc
6517         :
6518     else
6519         echo "C++ compiler $cxx does not work with C compiler $cc"
6520         echo "Disabling C++ specific optional code"
6521         cxx=
6522     fi
6523 else
6524     echo "No C++ compiler available; disabling C++ specific optional code"
6525     cxx=
6526 fi
6527 
6528 echo_version() {
6529     if test "$1" = "yes" ; then
6530         echo "($2)"
6531     fi
6532 }
6533 
6534 # prepend pixman and ftd flags after all config tests are done
6535 QEMU_CFLAGS="$pixman_cflags $fdt_cflags $QEMU_CFLAGS"
6536 QEMU_LDFLAGS="$fdt_ldflags $QEMU_LDFLAGS"
6537 libs_softmmu="$pixman_libs $libs_softmmu"
6538 
6539 echo "Install prefix    $prefix"
6540 echo "BIOS directory    $(eval echo $qemu_datadir)"
6541 echo "firmware path     $(eval echo $firmwarepath)"
6542 echo "binary directory  $(eval echo $bindir)"
6543 echo "library directory $(eval echo $libdir)"
6544 echo "module directory  $(eval echo $qemu_moddir)"
6545 echo "libexec directory $(eval echo $libexecdir)"
6546 echo "include directory $(eval echo $includedir)"
6547 echo "config directory  $(eval echo $sysconfdir)"
6548 if test "$mingw32" = "no" ; then
6549 echo "local state directory   $(eval echo $local_statedir)"
6550 echo "Manual directory  $(eval echo $mandir)"
6551 echo "ELF interp prefix $interp_prefix"
6552 else
6553 echo "local state directory   queried at runtime"
6554 echo "Windows SDK       $win_sdk"
6555 fi
6556 echo "Build directory   $(pwd)"
6557 echo "Source path       $source_path"
6558 echo "GIT binary        $git"
6559 echo "GIT submodules    $git_submodules"
6560 echo "C compiler        $cc"
6561 echo "Host C compiler   $host_cc"
6562 echo "C++ compiler      $cxx"
6563 echo "Objective-C compiler $objcc"
6564 echo "ARFLAGS           $ARFLAGS"
6565 echo "CFLAGS            $CFLAGS"
6566 echo "QEMU_CFLAGS       $QEMU_CFLAGS"
6567 echo "QEMU_LDFLAGS      $QEMU_LDFLAGS"
6568 echo "make              $make"
6569 echo "install           $install"
6570 echo "python            $python ($python_version)"
6571 if test "$docs" != "no"; then
6572     echo "sphinx-build      $sphinx_build"
6573 fi
6574 echo "genisoimage       $genisoimage"
6575 echo "slirp support     $slirp $(echo_version $slirp $slirp_version)"
6576 if test "$slirp" != "no" ; then
6577     echo "smbd              $smbd"
6578 fi
6579 echo "module support    $modules"
6580 echo "alt path mod load $module_upgrades"
6581 echo "host CPU          $cpu"
6582 echo "host big endian   $bigendian"
6583 echo "target list       $target_list"
6584 echo "gprof enabled     $gprof"
6585 echo "sparse enabled    $sparse"
6586 echo "strip binaries    $strip_opt"
6587 echo "profiler          $profiler"
6588 echo "static build      $static"
6589 if test "$darwin" = "yes" ; then
6590     echo "Cocoa support     $cocoa"
6591 fi
6592 echo "SDL support       $sdl $(echo_version $sdl $sdlversion)"
6593 echo "SDL image support $sdl_image"
6594 echo "GTK support       $gtk $(echo_version $gtk $gtk_version)"
6595 echo "GTK GL support    $gtk_gl"
6596 echo "VTE support       $vte $(echo_version $vte $vteversion)"
6597 echo "TLS priority      $tls_priority"
6598 echo "GNUTLS support    $gnutls"
6599 echo "libgcrypt         $gcrypt"
6600 if test "$gcrypt" = "yes"
6601 then
6602    echo "  hmac            $gcrypt_hmac"
6603    echo "  XTS             $gcrypt_xts"
6604 fi
6605 echo "nettle            $nettle $(echo_version $nettle $nettle_version)"
6606 if test "$nettle" = "yes"
6607 then
6608    echo "  XTS             $nettle_xts"
6609 fi
6610 echo "libtasn1          $tasn1"
6611 echo "PAM               $auth_pam"
6612 echo "iconv support     $iconv"
6613 echo "curses support    $curses"
6614 echo "virgl support     $virglrenderer $(echo_version $virglrenderer $virgl_version)"
6615 echo "curl support      $curl"
6616 echo "mingw32 support   $mingw32"
6617 echo "Audio drivers     $audio_drv_list"
6618 echo "Block whitelist (rw) $block_drv_rw_whitelist"
6619 echo "Block whitelist (ro) $block_drv_ro_whitelist"
6620 echo "VirtFS support    $virtfs"
6621 echo "Multipath support $mpath"
6622 echo "VNC support       $vnc"
6623 if test "$vnc" = "yes" ; then
6624     echo "VNC SASL support  $vnc_sasl"
6625     echo "VNC JPEG support  $vnc_jpeg"
6626     echo "VNC PNG support   $vnc_png"
6627 fi
6628 echo "xen support       $xen"
6629 if test "$xen" = "yes" ; then
6630   echo "xen ctrl version  $xen_ctrl_version"
6631 fi
6632 echo "brlapi support    $brlapi"
6633 echo "Documentation     $docs"
6634 echo "PIE               $pie"
6635 echo "vde support       $vde"
6636 echo "netmap support    $netmap"
6637 echo "Linux AIO support $linux_aio"
6638 echo "Linux io_uring support $linux_io_uring"
6639 echo "ATTR/XATTR support $attr"
6640 echo "Install blobs     $blobs"
6641 echo "KVM support       $kvm"
6642 echo "HAX support       $hax"
6643 echo "HVF support       $hvf"
6644 echo "WHPX support      $whpx"
6645 echo "TCG support       $tcg"
6646 if test "$tcg" = "yes" ; then
6647     echo "TCG debug enabled $debug_tcg"
6648     echo "TCG interpreter   $tcg_interpreter"
6649 fi
6650 echo "malloc trim support $malloc_trim"
6651 echo "RDMA support      $rdma"
6652 echo "PVRDMA support    $pvrdma"
6653 echo "fdt support       $fdt"
6654 echo "membarrier        $membarrier"
6655 echo "preadv support    $preadv"
6656 echo "fdatasync         $fdatasync"
6657 echo "madvise           $madvise"
6658 echo "posix_madvise     $posix_madvise"
6659 echo "posix_memalign    $posix_memalign"
6660 echo "libcap-ng support $cap_ng"
6661 echo "vhost-net support $vhost_net"
6662 echo "vhost-crypto support $vhost_crypto"
6663 echo "vhost-scsi support $vhost_scsi"
6664 echo "vhost-vsock support $vhost_vsock"
6665 echo "vhost-user support $vhost_user"
6666 echo "vhost-user-fs support $vhost_user_fs"
6667 echo "Trace backends    $trace_backends"
6668 if have_backend "simple"; then
6669 echo "Trace output file $trace_file-<pid>"
6670 fi
6671 echo "spice support     $spice $(echo_version $spice $spice_protocol_version/$spice_server_version)"
6672 echo "rbd support       $rbd"
6673 echo "xfsctl support    $xfs"
6674 echo "smartcard support $smartcard"
6675 echo "libusb            $libusb"
6676 echo "usb net redir     $usb_redir"
6677 echo "OpenGL support    $opengl"
6678 echo "OpenGL dmabufs    $opengl_dmabuf"
6679 echo "libiscsi support  $libiscsi"
6680 echo "libnfs support    $libnfs"
6681 echo "build guest agent $guest_agent"
6682 echo "QGA VSS support   $guest_agent_with_vss"
6683 echo "QGA w32 disk info $guest_agent_ntddscsi"
6684 echo "QGA MSI support   $guest_agent_msi"
6685 echo "seccomp support   $seccomp"
6686 echo "coroutine backend $coroutine"
6687 echo "coroutine pool    $coroutine_pool"
6688 echo "debug stack usage $debug_stack_usage"
6689 echo "mutex debugging   $debug_mutex"
6690 echo "crypto afalg      $crypto_afalg"
6691 echo "GlusterFS support $glusterfs"
6692 echo "gcov              $gcov_tool"
6693 echo "gcov enabled      $gcov"
6694 echo "TPM support       $tpm"
6695 echo "libssh support    $libssh"
6696 echo "QOM debugging     $qom_cast_debug"
6697 echo "Live block migration $live_block_migration"
6698 echo "lzo support       $lzo"
6699 echo "snappy support    $snappy"
6700 echo "bzip2 support     $bzip2"
6701 echo "lzfse support     $lzfse"
6702 echo "zstd support      $zstd"
6703 echo "NUMA host support $numa"
6704 echo "libxml2           $libxml2"
6705 echo "tcmalloc support  $tcmalloc"
6706 echo "jemalloc support  $jemalloc"
6707 echo "avx2 optimization $avx2_opt"
6708 echo "avx512f optimization $avx512f_opt"
6709 echo "replication support $replication"
6710 echo "VxHS block device $vxhs"
6711 echo "bochs support     $bochs"
6712 echo "cloop support     $cloop"
6713 echo "dmg support       $dmg"
6714 echo "qcow v1 support   $qcow1"
6715 echo "vdi support       $vdi"
6716 echo "vvfat support     $vvfat"
6717 echo "qed support       $qed"
6718 echo "parallels support $parallels"
6719 echo "sheepdog support  $sheepdog"
6720 echo "capstone          $capstone"
6721 echo "libpmem support   $libpmem"
6722 echo "libudev           $libudev"
6723 echo "default devices   $default_devices"
6724 echo "plugin support    $plugins"
6725 echo "fuzzing support   $fuzzing"
6726 echo "gdb               $gdb_bin"
6727 
6728 if test "$supported_cpu" = "no"; then
6729     echo
6730     echo "WARNING: SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!"
6731     echo
6732     echo "CPU host architecture $cpu support is not currently maintained."
6733     echo "The QEMU project intends to remove support for this host CPU in"
6734     echo "a future release if nobody volunteers to maintain it and to"
6735     echo "provide a build host for our continuous integration setup."
6736     echo "configure has succeeded and you can continue to build, but"
6737     echo "if you care about QEMU on this platform you should contact"
6738     echo "us upstream at qemu-devel@nongnu.org."
6739 fi
6740 
6741 if test "$supported_os" = "no"; then
6742     echo
6743     echo "WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!"
6744     echo
6745     echo "Host OS $targetos support is not currently maintained."
6746     echo "The QEMU project intends to remove support for this host OS in"
6747     echo "a future release if nobody volunteers to maintain it and to"
6748     echo "provide a build host for our continuous integration setup."
6749     echo "configure has succeeded and you can continue to build, but"
6750     echo "if you care about QEMU on this platform you should contact"
6751     echo "us upstream at qemu-devel@nongnu.org."
6752 fi
6753 
6754 config_host_mak="config-host.mak"
6755 
6756 echo "# Automatically generated by configure - do not modify" >config-all-disas.mak
6757 
6758 echo "# Automatically generated by configure - do not modify" > $config_host_mak
6759 echo >> $config_host_mak
6760 
6761 echo all: >> $config_host_mak
6762 echo "prefix=$prefix" >> $config_host_mak
6763 echo "bindir=$bindir" >> $config_host_mak
6764 echo "libdir=$libdir" >> $config_host_mak
6765 echo "libexecdir=$libexecdir" >> $config_host_mak
6766 echo "includedir=$includedir" >> $config_host_mak
6767 echo "mandir=$mandir" >> $config_host_mak
6768 echo "sysconfdir=$sysconfdir" >> $config_host_mak
6769 echo "qemu_confdir=$qemu_confdir" >> $config_host_mak
6770 echo "qemu_datadir=$qemu_datadir" >> $config_host_mak
6771 echo "qemu_firmwarepath=$firmwarepath" >> $config_host_mak
6772 echo "qemu_docdir=$qemu_docdir" >> $config_host_mak
6773 echo "qemu_moddir=$qemu_moddir" >> $config_host_mak
6774 if test "$mingw32" = "no" ; then
6775   echo "qemu_localstatedir=$local_statedir" >> $config_host_mak
6776 fi
6777 echo "qemu_helperdir=$libexecdir" >> $config_host_mak
6778 echo "qemu_localedir=$qemu_localedir" >> $config_host_mak
6779 echo "qemu_icondir=$qemu_icondir" >> $config_host_mak
6780 echo "qemu_desktopdir=$qemu_desktopdir" >> $config_host_mak
6781 echo "libs_cpu=$libs_cpu" >> $config_host_mak
6782 echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
6783 echo "GIT=$git" >> $config_host_mak
6784 echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
6785 echo "GIT_UPDATE=$git_update" >> $config_host_mak
6786 
6787 echo "ARCH=$ARCH" >> $config_host_mak
6788 
6789 if test "$default_devices" = "yes" ; then
6790   echo "CONFIG_MINIKCONF_MODE=--defconfig" >> $config_host_mak
6791 else
6792   echo "CONFIG_MINIKCONF_MODE=--allnoconfig" >> $config_host_mak
6793 fi
6794 if test "$debug_tcg" = "yes" ; then
6795   echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
6796 fi
6797 if test "$strip_opt" = "yes" ; then
6798   echo "STRIP=${strip}" >> $config_host_mak
6799 fi
6800 if test "$bigendian" = "yes" ; then
6801   echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
6802 fi
6803 if test "$mingw32" = "yes" ; then
6804   echo "CONFIG_WIN32=y" >> $config_host_mak
6805   rc_version=$(cat $source_path/VERSION)
6806   version_major=${rc_version%%.*}
6807   rc_version=${rc_version#*.}
6808   version_minor=${rc_version%%.*}
6809   rc_version=${rc_version#*.}
6810   version_subminor=${rc_version%%.*}
6811   version_micro=0
6812   echo "CONFIG_FILEVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
6813   echo "CONFIG_PRODUCTVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
6814   if test "$guest_agent_with_vss" = "yes" ; then
6815     echo "CONFIG_QGA_VSS=y" >> $config_host_mak
6816     echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
6817     echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
6818   fi
6819   if test "$guest_agent_ntddscsi" = "yes" ; then
6820     echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
6821   fi
6822   if test "$guest_agent_msi" = "yes"; then
6823     echo "QEMU_GA_MSI_ENABLED=yes" >> $config_host_mak
6824     echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
6825     echo "QEMU_GA_MSI_WITH_VSS=${QEMU_GA_MSI_WITH_VSS}" >> $config_host_mak
6826     echo "QEMU_GA_MSI_ARCH=${QEMU_GA_MSI_ARCH}" >> $config_host_mak
6827     echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
6828     echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
6829     echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
6830   fi
6831 else
6832   echo "CONFIG_POSIX=y" >> $config_host_mak
6833 fi
6834 
6835 if test "$linux" = "yes" ; then
6836   echo "CONFIG_LINUX=y" >> $config_host_mak
6837 fi
6838 
6839 if test "$darwin" = "yes" ; then
6840   echo "CONFIG_DARWIN=y" >> $config_host_mak
6841 fi
6842 
6843 if test "$solaris" = "yes" ; then
6844   echo "CONFIG_SOLARIS=y" >> $config_host_mak
6845 fi
6846 if test "$haiku" = "yes" ; then
6847   echo "CONFIG_HAIKU=y" >> $config_host_mak
6848 fi
6849 if test "$static" = "yes" ; then
6850   echo "CONFIG_STATIC=y" >> $config_host_mak
6851 fi
6852 if test "$profiler" = "yes" ; then
6853   echo "CONFIG_PROFILER=y" >> $config_host_mak
6854 fi
6855 if test "$want_tools" = "yes" ; then
6856   echo "CONFIG_TOOLS=y" >> $config_host_mak
6857 fi
6858 if test "$slirp" != "no"; then
6859   echo "CONFIG_SLIRP=y" >> $config_host_mak
6860   echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
6861   echo "SLIRP_CFLAGS=$slirp_cflags" >> $config_host_mak
6862   echo "SLIRP_LIBS=$slirp_libs" >> $config_host_mak
6863 fi
6864 if [ "$slirp" = "git" -o "$slirp" = "internal" ]; then
6865     echo "config-host.h: slirp/all" >> $config_host_mak
6866 fi
6867 if test "$vde" = "yes" ; then
6868   echo "CONFIG_VDE=y" >> $config_host_mak
6869   echo "VDE_LIBS=$vde_libs" >> $config_host_mak
6870 fi
6871 if test "$netmap" = "yes" ; then
6872   echo "CONFIG_NETMAP=y" >> $config_host_mak
6873 fi
6874 if test "$l2tpv3" = "yes" ; then
6875   echo "CONFIG_L2TPV3=y" >> $config_host_mak
6876 fi
6877 if test "$gprof" = "yes" ; then
6878   echo "CONFIG_GPROF=y" >> $config_host_mak
6879 fi
6880 if test "$cap_ng" = "yes" ; then
6881   echo "CONFIG_LIBCAP_NG=y" >> $config_host_mak
6882 fi
6883 echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
6884 for drv in $audio_drv_list; do
6885     def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
6886     case "$drv" in
6887 	alsa | oss | pa | sdl)
6888 	    echo "$def=m" >> $config_host_mak ;;
6889 	*)
6890 	    echo "$def=y" >> $config_host_mak ;;
6891     esac
6892 done
6893 echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak
6894 echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
6895 echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak
6896 echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak
6897 echo "OSS_LIBS=$oss_libs" >> $config_host_mak
6898 if test "$audio_win_int" = "yes" ; then
6899   echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
6900 fi
6901 echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
6902 echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
6903 if test "$vnc" = "yes" ; then
6904   echo "CONFIG_VNC=y" >> $config_host_mak
6905 fi
6906 if test "$vnc_sasl" = "yes" ; then
6907   echo "CONFIG_VNC_SASL=y" >> $config_host_mak
6908 fi
6909 if test "$vnc_jpeg" = "yes" ; then
6910   echo "CONFIG_VNC_JPEG=y" >> $config_host_mak
6911 fi
6912 if test "$vnc_png" = "yes" ; then
6913   echo "CONFIG_VNC_PNG=y" >> $config_host_mak
6914 fi
6915 if test "$xkbcommon" = "yes" ; then
6916   echo "XKBCOMMON_CFLAGS=$xkbcommon_cflags" >> $config_host_mak
6917   echo "XKBCOMMON_LIBS=$xkbcommon_libs" >> $config_host_mak
6918 fi
6919 if test "$xfs" = "yes" ; then
6920   echo "CONFIG_XFS=y" >> $config_host_mak
6921 fi
6922 qemu_version=$(head $source_path/VERSION)
6923 echo "VERSION=$qemu_version" >>$config_host_mak
6924 echo "PKGVERSION=$pkgversion" >>$config_host_mak
6925 echo "SRC_PATH=$source_path" >> $config_host_mak
6926 echo "TARGET_DIRS=$target_list" >> $config_host_mak
6927 if [ "$docs" = "yes" ] ; then
6928   echo "BUILD_DOCS=yes" >> $config_host_mak
6929 fi
6930 if test "$modules" = "yes"; then
6931   # $shacmd can generate a hash started with digit, which the compiler doesn't
6932   # like as an symbol. So prefix it with an underscore
6933   echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
6934   echo "CONFIG_MODULES=y" >> $config_host_mak
6935 fi
6936 if test "$module_upgrades" = "yes"; then
6937   echo "CONFIG_MODULE_UPGRADES=y" >> $config_host_mak
6938 fi
6939 if test "$have_x11" = "yes" && test "$need_x11" = "yes"; then
6940   echo "CONFIG_X11=y" >> $config_host_mak
6941   echo "X11_CFLAGS=$x11_cflags" >> $config_host_mak
6942   echo "X11_LIBS=$x11_libs" >> $config_host_mak
6943 fi
6944 if test "$sdl" = "yes" ; then
6945   echo "CONFIG_SDL=m" >> $config_host_mak
6946   echo "SDL_CFLAGS=$sdl_cflags" >> $config_host_mak
6947   echo "SDL_LIBS=$sdl_libs" >> $config_host_mak
6948   if test "$sdl_image" = "yes" ; then
6949       echo "CONFIG_SDL_IMAGE=y" >> $config_host_mak
6950   fi
6951 fi
6952 if test "$cocoa" = "yes" ; then
6953   echo "CONFIG_COCOA=y" >> $config_host_mak
6954 fi
6955 if test "$iconv" = "yes" ; then
6956   echo "CONFIG_ICONV=y" >> $config_host_mak
6957   echo "ICONV_CFLAGS=$iconv_cflags" >> $config_host_mak
6958   echo "ICONV_LIBS=$iconv_lib" >> $config_host_mak
6959 fi
6960 if test "$curses" = "yes" ; then
6961   echo "CONFIG_CURSES=m" >> $config_host_mak
6962   echo "CURSES_CFLAGS=$curses_inc" >> $config_host_mak
6963   echo "CURSES_LIBS=$curses_lib" >> $config_host_mak
6964 fi
6965 if test "$pipe2" = "yes" ; then
6966   echo "CONFIG_PIPE2=y" >> $config_host_mak
6967 fi
6968 if test "$accept4" = "yes" ; then
6969   echo "CONFIG_ACCEPT4=y" >> $config_host_mak
6970 fi
6971 if test "$splice" = "yes" ; then
6972   echo "CONFIG_SPLICE=y" >> $config_host_mak
6973 fi
6974 if test "$eventfd" = "yes" ; then
6975   echo "CONFIG_EVENTFD=y" >> $config_host_mak
6976 fi
6977 if test "$memfd" = "yes" ; then
6978   echo "CONFIG_MEMFD=y" >> $config_host_mak
6979 fi
6980 if test "$have_usbfs" = "yes" ; then
6981   echo "CONFIG_USBFS=y" >> $config_host_mak
6982 fi
6983 if test "$fallocate" = "yes" ; then
6984   echo "CONFIG_FALLOCATE=y" >> $config_host_mak
6985 fi
6986 if test "$fallocate_punch_hole" = "yes" ; then
6987   echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
6988 fi
6989 if test "$fallocate_zero_range" = "yes" ; then
6990   echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak
6991 fi
6992 if test "$posix_fallocate" = "yes" ; then
6993   echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
6994 fi
6995 if test "$sync_file_range" = "yes" ; then
6996   echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
6997 fi
6998 if test "$fiemap" = "yes" ; then
6999   echo "CONFIG_FIEMAP=y" >> $config_host_mak
7000 fi
7001 if test "$dup3" = "yes" ; then
7002   echo "CONFIG_DUP3=y" >> $config_host_mak
7003 fi
7004 if test "$ppoll" = "yes" ; then
7005   echo "CONFIG_PPOLL=y" >> $config_host_mak
7006 fi
7007 if test "$prctl_pr_set_timerslack" = "yes" ; then
7008   echo "CONFIG_PRCTL_PR_SET_TIMERSLACK=y" >> $config_host_mak
7009 fi
7010 if test "$epoll" = "yes" ; then
7011   echo "CONFIG_EPOLL=y" >> $config_host_mak
7012 fi
7013 if test "$epoll_create1" = "yes" ; then
7014   echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
7015 fi
7016 if test "$sendfile" = "yes" ; then
7017   echo "CONFIG_SENDFILE=y" >> $config_host_mak
7018 fi
7019 if test "$timerfd" = "yes" ; then
7020   echo "CONFIG_TIMERFD=y" >> $config_host_mak
7021 fi
7022 if test "$setns" = "yes" ; then
7023   echo "CONFIG_SETNS=y" >> $config_host_mak
7024 fi
7025 if test "$clock_adjtime" = "yes" ; then
7026   echo "CONFIG_CLOCK_ADJTIME=y" >> $config_host_mak
7027 fi
7028 if test "$syncfs" = "yes" ; then
7029   echo "CONFIG_SYNCFS=y" >> $config_host_mak
7030 fi
7031 if test "$kcov" = "yes" ; then
7032   echo "CONFIG_KCOV=y" >> $config_host_mak
7033 fi
7034 if test "$inotify" = "yes" ; then
7035   echo "CONFIG_INOTIFY=y" >> $config_host_mak
7036 fi
7037 if test "$inotify1" = "yes" ; then
7038   echo "CONFIG_INOTIFY1=y" >> $config_host_mak
7039 fi
7040 if test "$sem_timedwait" = "yes" ; then
7041   echo "CONFIG_SEM_TIMEDWAIT=y" >> $config_host_mak
7042 fi
7043 if test "$strchrnul" = "yes" ; then
7044   echo "HAVE_STRCHRNUL=y" >> $config_host_mak
7045 fi
7046 if test "$st_atim" = "yes" ; then
7047   echo "HAVE_STRUCT_STAT_ST_ATIM=y" >> $config_host_mak
7048 fi
7049 if test "$byteswap_h" = "yes" ; then
7050   echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
7051 fi
7052 if test "$bswap_h" = "yes" ; then
7053   echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
7054 fi
7055 if test "$curl" = "yes" ; then
7056   echo "CONFIG_CURL=m" >> $config_host_mak
7057   echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak
7058   echo "CURL_LIBS=$curl_libs" >> $config_host_mak
7059 fi
7060 if test "$brlapi" = "yes" ; then
7061   echo "CONFIG_BRLAPI=y" >> $config_host_mak
7062   echo "BRLAPI_LIBS=$brlapi_libs" >> $config_host_mak
7063 fi
7064 if test "$gtk" = "yes" ; then
7065   echo "CONFIG_GTK=m" >> $config_host_mak
7066   echo "GTK_CFLAGS=$gtk_cflags" >> $config_host_mak
7067   echo "GTK_LIBS=$gtk_libs" >> $config_host_mak
7068   if test "$gtk_gl" = "yes" ; then
7069     echo "CONFIG_GTK_GL=y" >> $config_host_mak
7070   fi
7071 fi
7072 if test "$gio" = "yes" ; then
7073     echo "CONFIG_GIO=y" >> $config_host_mak
7074     echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
7075     echo "GIO_LIBS=$gio_libs" >> $config_host_mak
7076     echo "GDBUS_CODEGEN=$gdbus_codegen" >> $config_host_mak
7077 fi
7078 echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
7079 if test "$gnutls" = "yes" ; then
7080   echo "CONFIG_GNUTLS=y" >> $config_host_mak
7081 fi
7082 if test "$gcrypt" = "yes" ; then
7083   echo "CONFIG_GCRYPT=y" >> $config_host_mak
7084   if test "$gcrypt_hmac" = "yes" ; then
7085     echo "CONFIG_GCRYPT_HMAC=y" >> $config_host_mak
7086   fi
7087 fi
7088 if test "$nettle" = "yes" ; then
7089   echo "CONFIG_NETTLE=y" >> $config_host_mak
7090   echo "CONFIG_NETTLE_VERSION_MAJOR=${nettle_version%%.*}" >> $config_host_mak
7091 fi
7092 if test "$qemu_private_xts" = "yes" ; then
7093   echo "CONFIG_QEMU_PRIVATE_XTS=y" >> $config_host_mak
7094 fi
7095 if test "$tasn1" = "yes" ; then
7096   echo "CONFIG_TASN1=y" >> $config_host_mak
7097 fi
7098 if test "$auth_pam" = "yes" ; then
7099     echo "CONFIG_AUTH_PAM=y" >> $config_host_mak
7100 fi
7101 if test "$have_ifaddrs_h" = "yes" ; then
7102     echo "HAVE_IFADDRS_H=y" >> $config_host_mak
7103 fi
7104 if test "$have_broken_size_max" = "yes" ; then
7105     echo "HAVE_BROKEN_SIZE_MAX=y" >> $config_host_mak
7106 fi
7107 
7108 # Work around a system header bug with some kernel/XFS header
7109 # versions where they both try to define 'struct fsxattr':
7110 # xfs headers will not try to redefine structs from linux headers
7111 # if this macro is set.
7112 if test "$have_fsxattr" = "yes" ; then
7113     echo "HAVE_FSXATTR=y" >> $config_host_mak
7114 fi
7115 if test "$have_copy_file_range" = "yes" ; then
7116     echo "HAVE_COPY_FILE_RANGE=y" >> $config_host_mak
7117 fi
7118 if test "$vte" = "yes" ; then
7119   echo "CONFIG_VTE=y" >> $config_host_mak
7120   echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak
7121   echo "VTE_LIBS=$vte_libs" >> $config_host_mak
7122 fi
7123 if test "$virglrenderer" = "yes" ; then
7124   echo "CONFIG_VIRGL=y" >> $config_host_mak
7125   echo "VIRGL_CFLAGS=$virgl_cflags" >> $config_host_mak
7126   echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak
7127 fi
7128 if test "$xen" = "yes" ; then
7129   echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
7130   echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
7131 fi
7132 if test "$linux_aio" = "yes" ; then
7133   echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
7134 fi
7135 if test "$linux_io_uring" = "yes" ; then
7136   echo "CONFIG_LINUX_IO_URING=y" >> $config_host_mak
7137   echo "LINUX_IO_URING_CFLAGS=$linux_io_uring_cflags" >> $config_host_mak
7138   echo "LINUX_IO_URING_LIBS=$linux_io_uring_libs" >> $config_host_mak
7139 fi
7140 if test "$attr" = "yes" ; then
7141   echo "CONFIG_ATTR=y" >> $config_host_mak
7142 fi
7143 if test "$libattr" = "yes" ; then
7144   echo "CONFIG_LIBATTR=y" >> $config_host_mak
7145 fi
7146 if test "$virtfs" = "yes" ; then
7147   echo "CONFIG_VIRTFS=y" >> $config_host_mak
7148 fi
7149 if test "$mpath" = "yes" ; then
7150   echo "CONFIG_MPATH=y" >> $config_host_mak
7151   if test "$mpathpersist_new_api" = "yes"; then
7152     echo "CONFIG_MPATH_NEW_API=y" >> $config_host_mak
7153   fi
7154 fi
7155 if test "$vhost_scsi" = "yes" ; then
7156   echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
7157 fi
7158 if test "$vhost_net" = "yes" ; then
7159   echo "CONFIG_VHOST_NET=y" >> $config_host_mak
7160 fi
7161 if test "$vhost_net_user" = "yes" ; then
7162   echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
7163 fi
7164 if test "$vhost_crypto" = "yes" ; then
7165   echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
7166 fi
7167 if test "$vhost_vsock" = "yes" ; then
7168   echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
7169 fi
7170 if test "$vhost_kernel" = "yes" ; then
7171   echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
7172 fi
7173 if test "$vhost_user" = "yes" ; then
7174   echo "CONFIG_VHOST_USER=y" >> $config_host_mak
7175 fi
7176 if test "$vhost_user_fs" = "yes" ; then
7177   echo "CONFIG_VHOST_USER_FS=y" >> $config_host_mak
7178 fi
7179 if test "$blobs" = "yes" ; then
7180   echo "INSTALL_BLOBS=yes" >> $config_host_mak
7181 fi
7182 if test "$iovec" = "yes" ; then
7183   echo "CONFIG_IOVEC=y" >> $config_host_mak
7184 fi
7185 if test "$preadv" = "yes" ; then
7186   echo "CONFIG_PREADV=y" >> $config_host_mak
7187 fi
7188 if test "$fdt" != "no" ; then
7189   echo "CONFIG_FDT=y" >> $config_host_mak
7190 fi
7191 if test "$membarrier" = "yes" ; then
7192   echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
7193 fi
7194 if test "$signalfd" = "yes" ; then
7195   echo "CONFIG_SIGNALFD=y" >> $config_host_mak
7196 fi
7197 if test "$optreset" = "yes" ; then
7198   echo "HAVE_OPTRESET=y" >> $config_host_mak
7199 fi
7200 if test "$tcg" = "yes"; then
7201   echo "CONFIG_TCG=y" >> $config_host_mak
7202   if test "$tcg_interpreter" = "yes" ; then
7203     echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
7204   fi
7205 fi
7206 if test "$fdatasync" = "yes" ; then
7207   echo "CONFIG_FDATASYNC=y" >> $config_host_mak
7208 fi
7209 if test "$madvise" = "yes" ; then
7210   echo "CONFIG_MADVISE=y" >> $config_host_mak
7211 fi
7212 if test "$posix_madvise" = "yes" ; then
7213   echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak
7214 fi
7215 if test "$posix_memalign" = "yes" ; then
7216   echo "CONFIG_POSIX_MEMALIGN=y" >> $config_host_mak
7217 fi
7218 
7219 if test "$spice" = "yes" ; then
7220   echo "CONFIG_SPICE=y" >> $config_host_mak
7221 fi
7222 
7223 if test "$smartcard" = "yes" ; then
7224   echo "CONFIG_SMARTCARD=y" >> $config_host_mak
7225   echo "SMARTCARD_CFLAGS=$libcacard_cflags" >> $config_host_mak
7226   echo "SMARTCARD_LIBS=$libcacard_libs" >> $config_host_mak
7227 fi
7228 
7229 if test "$libusb" = "yes" ; then
7230   echo "CONFIG_USB_LIBUSB=y" >> $config_host_mak
7231   echo "LIBUSB_CFLAGS=$libusb_cflags" >> $config_host_mak
7232   echo "LIBUSB_LIBS=$libusb_libs" >> $config_host_mak
7233 fi
7234 
7235 if test "$usb_redir" = "yes" ; then
7236   echo "CONFIG_USB_REDIR=y" >> $config_host_mak
7237   echo "USB_REDIR_CFLAGS=$usb_redir_cflags" >> $config_host_mak
7238   echo "USB_REDIR_LIBS=$usb_redir_libs" >> $config_host_mak
7239 fi
7240 
7241 if test "$opengl" = "yes" ; then
7242   echo "CONFIG_OPENGL=y" >> $config_host_mak
7243   echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
7244   if test "$opengl_dmabuf" = "yes" ; then
7245     echo "CONFIG_OPENGL_DMABUF=y" >> $config_host_mak
7246   fi
7247 fi
7248 
7249 if test "$gbm" = "yes" ; then
7250     echo "CONFIG_GBM=y" >> $config_host_mak
7251     echo "GBM_LIBS=$gbm_libs" >> $config_host_mak
7252     echo "GBM_CFLAGS=$gbm_cflags" >> $config_host_mak
7253 fi
7254 
7255 
7256 if test "$malloc_trim" = "yes" ; then
7257   echo "CONFIG_MALLOC_TRIM=y" >> $config_host_mak
7258 fi
7259 
7260 if test "$avx2_opt" = "yes" ; then
7261   echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
7262 fi
7263 
7264 if test "$avx512f_opt" = "yes" ; then
7265   echo "CONFIG_AVX512F_OPT=y" >> $config_host_mak
7266 fi
7267 
7268 if test "$lzo" = "yes" ; then
7269   echo "CONFIG_LZO=y" >> $config_host_mak
7270 fi
7271 
7272 if test "$snappy" = "yes" ; then
7273   echo "CONFIG_SNAPPY=y" >> $config_host_mak
7274 fi
7275 
7276 if test "$bzip2" = "yes" ; then
7277   echo "CONFIG_BZIP2=y" >> $config_host_mak
7278   echo "BZIP2_LIBS=-lbz2" >> $config_host_mak
7279 fi
7280 
7281 if test "$lzfse" = "yes" ; then
7282   echo "CONFIG_LZFSE=y" >> $config_host_mak
7283   echo "LZFSE_LIBS=-llzfse" >> $config_host_mak
7284 fi
7285 
7286 if test "$zstd" = "yes" ; then
7287   echo "CONFIG_ZSTD=y" >> $config_host_mak
7288 fi
7289 
7290 if test "$libiscsi" = "yes" ; then
7291   echo "CONFIG_LIBISCSI=m" >> $config_host_mak
7292   echo "LIBISCSI_CFLAGS=$libiscsi_cflags" >> $config_host_mak
7293   echo "LIBISCSI_LIBS=$libiscsi_libs" >> $config_host_mak
7294 fi
7295 
7296 if test "$libnfs" = "yes" ; then
7297   echo "CONFIG_LIBNFS=m" >> $config_host_mak
7298   echo "LIBNFS_LIBS=$libnfs_libs" >> $config_host_mak
7299 fi
7300 
7301 if test "$seccomp" = "yes"; then
7302   echo "CONFIG_SECCOMP=y" >> $config_host_mak
7303   echo "SECCOMP_CFLAGS=$seccomp_cflags" >> $config_host_mak
7304   echo "SECCOMP_LIBS=$seccomp_libs" >> $config_host_mak
7305 fi
7306 
7307 # XXX: suppress that
7308 if [ "$bsd" = "yes" ] ; then
7309   echo "CONFIG_BSD=y" >> $config_host_mak
7310 fi
7311 
7312 if test "$localtime_r" = "yes" ; then
7313   echo "CONFIG_LOCALTIME_R=y" >> $config_host_mak
7314 fi
7315 if test "$qom_cast_debug" = "yes" ; then
7316   echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
7317 fi
7318 if test "$rbd" = "yes" ; then
7319   echo "CONFIG_RBD=m" >> $config_host_mak
7320   echo "RBD_CFLAGS=$rbd_cflags" >> $config_host_mak
7321   echo "RBD_LIBS=$rbd_libs" >> $config_host_mak
7322 fi
7323 
7324 echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
7325 if test "$coroutine_pool" = "yes" ; then
7326   echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
7327 else
7328   echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
7329 fi
7330 
7331 if test "$debug_stack_usage" = "yes" ; then
7332   echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
7333 fi
7334 
7335 if test "$crypto_afalg" = "yes" ; then
7336   echo "CONFIG_AF_ALG=y" >> $config_host_mak
7337 fi
7338 
7339 if test "$open_by_handle_at" = "yes" ; then
7340   echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
7341 fi
7342 
7343 if test "$linux_magic_h" = "yes" ; then
7344   echo "CONFIG_LINUX_MAGIC_H=y" >> $config_host_mak
7345 fi
7346 
7347 if test "$pragma_diagnostic_available" = "yes" ; then
7348   echo "CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE=y" >> $config_host_mak
7349 fi
7350 
7351 if test "$valgrind_h" = "yes" ; then
7352   echo "CONFIG_VALGRIND_H=y" >> $config_host_mak
7353 fi
7354 
7355 if test "$have_asan_iface_fiber" = "yes" ; then
7356     echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
7357 fi
7358 
7359 if test "$has_environ" = "yes" ; then
7360   echo "CONFIG_HAS_ENVIRON=y" >> $config_host_mak
7361 fi
7362 
7363 if test "$cpuid_h" = "yes" ; then
7364   echo "CONFIG_CPUID_H=y" >> $config_host_mak
7365 fi
7366 
7367 if test "$int128" = "yes" ; then
7368   echo "CONFIG_INT128=y" >> $config_host_mak
7369 fi
7370 
7371 if test "$atomic128" = "yes" ; then
7372   echo "CONFIG_ATOMIC128=y" >> $config_host_mak
7373 fi
7374 
7375 if test "$cmpxchg128" = "yes" ; then
7376   echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
7377 fi
7378 
7379 if test "$atomic64" = "yes" ; then
7380   echo "CONFIG_ATOMIC64=y" >> $config_host_mak
7381 fi
7382 
7383 if test "$attralias" = "yes" ; then
7384   echo "CONFIG_ATTRIBUTE_ALIAS=y" >> $config_host_mak
7385 fi
7386 
7387 if test "$getauxval" = "yes" ; then
7388   echo "CONFIG_GETAUXVAL=y" >> $config_host_mak
7389 fi
7390 
7391 if test "$glusterfs" = "yes" ; then
7392   echo "CONFIG_GLUSTERFS=m" >> $config_host_mak
7393   echo "GLUSTERFS_CFLAGS=$glusterfs_cflags" >> $config_host_mak
7394   echo "GLUSTERFS_LIBS=$glusterfs_libs" >> $config_host_mak
7395 fi
7396 
7397 if test "$glusterfs_xlator_opt" = "yes" ; then
7398   echo "CONFIG_GLUSTERFS_XLATOR_OPT=y" >> $config_host_mak
7399 fi
7400 
7401 if test "$glusterfs_discard" = "yes" ; then
7402   echo "CONFIG_GLUSTERFS_DISCARD=y" >> $config_host_mak
7403 fi
7404 
7405 if test "$glusterfs_fallocate" = "yes" ; then
7406   echo "CONFIG_GLUSTERFS_FALLOCATE=y" >> $config_host_mak
7407 fi
7408 
7409 if test "$glusterfs_zerofill" = "yes" ; then
7410   echo "CONFIG_GLUSTERFS_ZEROFILL=y" >> $config_host_mak
7411 fi
7412 
7413 if test "$glusterfs_ftruncate_has_stat" = "yes" ; then
7414   echo "CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT=y" >> $config_host_mak
7415 fi
7416 
7417 if test "$glusterfs_iocb_has_stat" = "yes" ; then
7418   echo "CONFIG_GLUSTERFS_IOCB_HAS_STAT=y" >> $config_host_mak
7419 fi
7420 
7421 if test "$libssh" = "yes" ; then
7422   echo "CONFIG_LIBSSH=m" >> $config_host_mak
7423   echo "LIBSSH_CFLAGS=$libssh_cflags" >> $config_host_mak
7424   echo "LIBSSH_LIBS=$libssh_libs" >> $config_host_mak
7425 fi
7426 
7427 if test "$live_block_migration" = "yes" ; then
7428   echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
7429 fi
7430 
7431 if test "$tpm" = "yes"; then
7432   echo 'CONFIG_TPM=y' >> $config_host_mak
7433 fi
7434 
7435 echo "TRACE_BACKENDS=$trace_backends" >> $config_host_mak
7436 if have_backend "nop"; then
7437   echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
7438 fi
7439 if have_backend "simple"; then
7440   echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
7441   # Set the appropriate trace file.
7442   trace_file="\"$trace_file-\" FMT_pid"
7443 fi
7444 if have_backend "log"; then
7445   echo "CONFIG_TRACE_LOG=y" >> $config_host_mak
7446 fi
7447 if have_backend "ust"; then
7448   echo "CONFIG_TRACE_UST=y" >> $config_host_mak
7449 fi
7450 if have_backend "dtrace"; then
7451   echo "CONFIG_TRACE_DTRACE=y" >> $config_host_mak
7452   if test "$trace_backend_stap" = "yes" ; then
7453     echo "CONFIG_TRACE_SYSTEMTAP=y" >> $config_host_mak
7454   fi
7455 fi
7456 if have_backend "ftrace"; then
7457   if test "$linux" = "yes" ; then
7458     echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak
7459   else
7460     feature_not_found "ftrace(trace backend)" "ftrace requires Linux"
7461   fi
7462 fi
7463 if have_backend "syslog"; then
7464   if test "$posix_syslog" = "yes" ; then
7465     echo "CONFIG_TRACE_SYSLOG=y" >> $config_host_mak
7466   else
7467     feature_not_found "syslog(trace backend)" "syslog not available"
7468   fi
7469 fi
7470 echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
7471 
7472 if test "$rdma" = "yes" ; then
7473   echo "CONFIG_RDMA=y" >> $config_host_mak
7474   echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
7475 fi
7476 
7477 if test "$pvrdma" = "yes" ; then
7478   echo "CONFIG_PVRDMA=y" >> $config_host_mak
7479 fi
7480 
7481 if test "$have_rtnetlink" = "yes" ; then
7482   echo "CONFIG_RTNETLINK=y" >> $config_host_mak
7483 fi
7484 
7485 if test "$libxml2" = "yes" ; then
7486   echo "CONFIG_LIBXML2=y" >> $config_host_mak
7487   echo "LIBXML2_CFLAGS=$libxml2_cflags" >> $config_host_mak
7488   echo "LIBXML2_LIBS=$libxml2_libs" >> $config_host_mak
7489 fi
7490 
7491 if test "$replication" = "yes" ; then
7492   echo "CONFIG_REPLICATION=y" >> $config_host_mak
7493 fi
7494 
7495 if test "$have_af_vsock" = "yes" ; then
7496   echo "CONFIG_AF_VSOCK=y" >> $config_host_mak
7497 fi
7498 
7499 if test "$have_sysmacros" = "yes" ; then
7500   echo "CONFIG_SYSMACROS=y" >> $config_host_mak
7501 fi
7502 
7503 if test "$have_static_assert" = "yes" ; then
7504   echo "CONFIG_STATIC_ASSERT=y" >> $config_host_mak
7505 fi
7506 
7507 if test "$have_utmpx" = "yes" ; then
7508   echo "HAVE_UTMPX=y" >> $config_host_mak
7509 fi
7510 if test "$have_getrandom" = "yes" ; then
7511   echo "CONFIG_GETRANDOM=y" >> $config_host_mak
7512 fi
7513 if test "$ivshmem" = "yes" ; then
7514   echo "CONFIG_IVSHMEM=y" >> $config_host_mak
7515 fi
7516 if test "$capstone" != "no" ; then
7517   echo "CONFIG_CAPSTONE=y" >> $config_host_mak
7518 fi
7519 if test "$debug_mutex" = "yes" ; then
7520   echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
7521 fi
7522 
7523 # Hold two types of flag:
7524 #   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
7525 #                                     a thread we have a handle to
7526 #   CONFIG_PTHREAD_SETNAME_NP_W_TID - A way of doing it on a particular
7527 #                                     platform
7528 if test "$pthread_setname_np_w_tid" = "yes" ; then
7529   echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
7530   echo "CONFIG_PTHREAD_SETNAME_NP_W_TID=y" >> $config_host_mak
7531 elif test "$pthread_setname_np_wo_tid" = "yes" ; then
7532   echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
7533   echo "CONFIG_PTHREAD_SETNAME_NP_WO_TID=y" >> $config_host_mak
7534 fi
7535 
7536 if test "$vxhs" = "yes" ; then
7537   echo "CONFIG_VXHS=y" >> $config_host_mak
7538   echo "VXHS_LIBS=$vxhs_libs" >> $config_host_mak
7539 fi
7540 
7541 if test "$libpmem" = "yes" ; then
7542   echo "CONFIG_LIBPMEM=y" >> $config_host_mak
7543 fi
7544 
7545 if test "$bochs" = "yes" ; then
7546   echo "CONFIG_BOCHS=y" >> $config_host_mak
7547 fi
7548 if test "$cloop" = "yes" ; then
7549   echo "CONFIG_CLOOP=y" >> $config_host_mak
7550 fi
7551 if test "$dmg" = "yes" ; then
7552   echo "CONFIG_DMG=y" >> $config_host_mak
7553 fi
7554 if test "$qcow1" = "yes" ; then
7555   echo "CONFIG_QCOW1=y" >> $config_host_mak
7556 fi
7557 if test "$vdi" = "yes" ; then
7558   echo "CONFIG_VDI=y" >> $config_host_mak
7559 fi
7560 if test "$vvfat" = "yes" ; then
7561   echo "CONFIG_VVFAT=y" >> $config_host_mak
7562 fi
7563 if test "$qed" = "yes" ; then
7564   echo "CONFIG_QED=y" >> $config_host_mak
7565 fi
7566 if test "$parallels" = "yes" ; then
7567   echo "CONFIG_PARALLELS=y" >> $config_host_mak
7568 fi
7569 if test "$sheepdog" = "yes" ; then
7570   echo "CONFIG_SHEEPDOG=y" >> $config_host_mak
7571 fi
7572 if test "$fuzzing" = "yes" ; then
7573   if test "$have_fuzzer" = "yes"; then
7574     FUZZ_LDFLAGS=" -fsanitize=address,fuzzer"
7575     FUZZ_CFLAGS=" -fsanitize=address,fuzzer"
7576     CFLAGS=" -fsanitize=address,fuzzer-no-link"
7577   else
7578     error_exit "Your compiler doesn't support -fsanitize=address,fuzzer"
7579     exit 1
7580   fi
7581 fi
7582 
7583 if test "$plugins" = "yes" ; then
7584     echo "CONFIG_PLUGIN=y" >> $config_host_mak
7585     LIBS="-ldl $LIBS"
7586     # Copy the export object list to the build dir
7587     if test "$ld_dynamic_list" = "yes" ; then
7588 	echo "CONFIG_HAS_LD_DYNAMIC_LIST=yes" >> $config_host_mak
7589 	ld_symbols=qemu-plugins-ld.symbols
7590 	cp "$source_path/plugins/qemu-plugins.symbols" $ld_symbols
7591     elif test "$ld_exported_symbols_list" = "yes" ; then
7592 	echo "CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST=yes" >> $config_host_mak
7593 	ld64_symbols=qemu-plugins-ld64.symbols
7594 	echo "# Automatically generated by configure - do not modify" > $ld64_symbols
7595 	grep 'qemu_' "$source_path/plugins/qemu-plugins.symbols" | sed 's/;//g' | \
7596 	    sed -E 's/^[[:space:]]*(.*)/_\1/' >> $ld64_symbols
7597     else
7598 	error_exit \
7599 	    "If \$plugins=yes, either \$ld_dynamic_list or " \
7600 	    "\$ld_exported_symbols_list should have been set to 'yes'."
7601     fi
7602 fi
7603 
7604 if test -n "$gdb_bin" ; then
7605     echo "HAVE_GDB_BIN=$gdb_bin" >> $config_host_mak
7606 fi
7607 
7608 if test "$tcg_interpreter" = "yes"; then
7609   QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/tci $QEMU_INCLUDES"
7610 elif test "$ARCH" = "sparc64" ; then
7611   QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/sparc $QEMU_INCLUDES"
7612 elif test "$ARCH" = "s390x" ; then
7613   QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/s390 $QEMU_INCLUDES"
7614 elif test "$ARCH" = "x86_64" || test "$ARCH" = "x32" ; then
7615   QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/i386 $QEMU_INCLUDES"
7616 elif test "$ARCH" = "ppc64" ; then
7617   QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/ppc $QEMU_INCLUDES"
7618 elif test "$ARCH" = "riscv32" || test "$ARCH" = "riscv64" ; then
7619   QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/riscv $QEMU_INCLUDES"
7620 else
7621   QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/\$(ARCH) $QEMU_INCLUDES"
7622 fi
7623 
7624 echo "TOOLS=$tools" >> $config_host_mak
7625 echo "ROMS=$roms" >> $config_host_mak
7626 echo "MAKE=$make" >> $config_host_mak
7627 echo "INSTALL=$install" >> $config_host_mak
7628 echo "INSTALL_DIR=$install -d -m 0755" >> $config_host_mak
7629 echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
7630 echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
7631 echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
7632 echo "PYTHON=$python" >> $config_host_mak
7633 echo "SPHINX_BUILD=$sphinx_build" >> $config_host_mak
7634 echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
7635 echo "CC=$cc" >> $config_host_mak
7636 if $iasl -h > /dev/null 2>&1; then
7637   echo "IASL=$iasl" >> $config_host_mak
7638 fi
7639 echo "HOST_CC=$host_cc" >> $config_host_mak
7640 echo "CXX=$cxx" >> $config_host_mak
7641 echo "OBJCC=$objcc" >> $config_host_mak
7642 echo "AR=$ar" >> $config_host_mak
7643 echo "ARFLAGS=$ARFLAGS" >> $config_host_mak
7644 echo "AS=$as" >> $config_host_mak
7645 echo "CCAS=$ccas" >> $config_host_mak
7646 echo "CPP=$cpp" >> $config_host_mak
7647 echo "OBJCOPY=$objcopy" >> $config_host_mak
7648 echo "LD=$ld" >> $config_host_mak
7649 echo "RANLIB=$ranlib" >> $config_host_mak
7650 echo "NM=$nm" >> $config_host_mak
7651 echo "PKG_CONFIG=$pkg_config_exe" >> $config_host_mak
7652 echo "WINDRES=$windres" >> $config_host_mak
7653 echo "CFLAGS=$CFLAGS" >> $config_host_mak
7654 echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
7655 echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
7656 echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
7657 echo "QEMU_INCLUDES=$QEMU_INCLUDES" >> $config_host_mak
7658 if test "$sparse" = "yes" ; then
7659   echo "CC           := REAL_CC=\"\$(CC)\" cgcc"       >> $config_host_mak
7660   echo "CPP          := REAL_CC=\"\$(CPP)\" cgcc"      >> $config_host_mak
7661   echo "CXX          := REAL_CC=\"\$(CXX)\" cgcc"      >> $config_host_mak
7662   echo "HOST_CC      := REAL_CC=\"\$(HOST_CC)\" cgcc"  >> $config_host_mak
7663   echo "QEMU_CFLAGS  += -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-non-pointer-null" >> $config_host_mak
7664 fi
7665 echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
7666 echo "LDFLAGS_NOPIE=$LDFLAGS_NOPIE" >> $config_host_mak
7667 echo "LD_REL_FLAGS=$LD_REL_FLAGS" >> $config_host_mak
7668 echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
7669 echo "LIBS+=$LIBS" >> $config_host_mak
7670 echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak
7671 echo "PTHREAD_LIB=$PTHREAD_LIB" >> $config_host_mak
7672 echo "EXESUF=$EXESUF" >> $config_host_mak
7673 echo "DSOSUF=$DSOSUF" >> $config_host_mak
7674 echo "LDFLAGS_SHARED=$LDFLAGS_SHARED" >> $config_host_mak
7675 echo "LIBS_QGA+=$libs_qga" >> $config_host_mak
7676 echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak
7677 echo "TASN1_CFLAGS=$tasn1_cflags" >> $config_host_mak
7678 echo "POD2MAN=$POD2MAN" >> $config_host_mak
7679 if test "$gcov" = "yes" ; then
7680   echo "CONFIG_GCOV=y" >> $config_host_mak
7681   echo "GCOV=$gcov_tool" >> $config_host_mak
7682 fi
7683 
7684 if test "$libudev" != "no"; then
7685     echo "CONFIG_LIBUDEV=y" >> $config_host_mak
7686     echo "LIBUDEV_LIBS=$libudev_libs" >> $config_host_mak
7687 fi
7688 if test "$fuzzing" != "no"; then
7689     echo "CONFIG_FUZZ=y" >> $config_host_mak
7690     echo "FUZZ_CFLAGS=$FUZZ_CFLAGS" >> $config_host_mak
7691     echo "FUZZ_LDFLAGS=$FUZZ_LDFLAGS" >> $config_host_mak
7692 fi
7693 
7694 if test "$edk2_blobs" = "yes" ; then
7695   echo "DECOMPRESS_EDK2_BLOBS=y" >> $config_host_mak
7696 fi
7697 
7698 # use included Linux headers
7699 if test "$linux" = "yes" ; then
7700   mkdir -p linux-headers
7701   case "$cpu" in
7702   i386|x86_64|x32)
7703     linux_arch=x86
7704     ;;
7705   ppc|ppc64|ppc64le)
7706     linux_arch=powerpc
7707     ;;
7708   s390x)
7709     linux_arch=s390
7710     ;;
7711   aarch64)
7712     linux_arch=arm64
7713     ;;
7714   mips64)
7715     linux_arch=mips
7716     ;;
7717   *)
7718     # For most CPUs the kernel architecture name and QEMU CPU name match.
7719     linux_arch="$cpu"
7720     ;;
7721   esac
7722     # For non-KVM architectures we will not have asm headers
7723     if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
7724       symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
7725     fi
7726 fi
7727 
7728 for target in $target_list; do
7729 target_dir="$target"
7730 config_target_mak=$target_dir/config-target.mak
7731 target_name=$(echo $target | cut -d '-' -f 1)
7732 target_aligned_only="no"
7733 case "$target_name" in
7734   alpha|hppa|mips64el|mips64|mipsel|mips|mipsn32|mipsn32el|sh4|sh4eb|sparc|sparc64|sparc32plus|xtensa|xtensaeb)
7735   target_aligned_only="yes"
7736   ;;
7737 esac
7738 target_bigendian="no"
7739 case "$target_name" in
7740   armeb|aarch64_be|hppa|lm32|m68k|microblaze|mips|mipsn32|mips64|moxie|or1k|ppc|ppc64|ppc64abi32|s390x|sh4eb|sparc|sparc64|sparc32plus|xtensaeb)
7741   target_bigendian="yes"
7742   ;;
7743 esac
7744 target_softmmu="no"
7745 target_user_only="no"
7746 target_linux_user="no"
7747 target_bsd_user="no"
7748 case "$target" in
7749   ${target_name}-softmmu)
7750     target_softmmu="yes"
7751     ;;
7752   ${target_name}-linux-user)
7753     target_user_only="yes"
7754     target_linux_user="yes"
7755     ;;
7756   ${target_name}-bsd-user)
7757     target_user_only="yes"
7758     target_bsd_user="yes"
7759     ;;
7760   *)
7761     error_exit "Target '$target' not recognised"
7762     exit 1
7763     ;;
7764 esac
7765 
7766 mkdir -p $target_dir
7767 echo "# Automatically generated by configure - do not modify" > $config_target_mak
7768 
7769 bflt="no"
7770 mttcg="no"
7771 interp_prefix1=$(echo "$interp_prefix" | sed "s/%M/$target_name/g")
7772 gdb_xml_files=""
7773 
7774 TARGET_ARCH="$target_name"
7775 TARGET_BASE_ARCH=""
7776 TARGET_ABI_DIR=""
7777 
7778 case "$target_name" in
7779   i386)
7780     mttcg="yes"
7781 	gdb_xml_files="i386-32bit.xml"
7782     TARGET_SYSTBL_ABI=i386
7783   ;;
7784   x86_64)
7785     TARGET_BASE_ARCH=i386
7786     TARGET_SYSTBL_ABI=common,64
7787     mttcg="yes"
7788 	gdb_xml_files="i386-64bit.xml"
7789   ;;
7790   alpha)
7791     mttcg="yes"
7792     TARGET_SYSTBL_ABI=common
7793   ;;
7794   arm|armeb)
7795     TARGET_ARCH=arm
7796     TARGET_SYSTBL_ABI=common,oabi
7797     bflt="yes"
7798     mttcg="yes"
7799     gdb_xml_files="arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"
7800   ;;
7801   aarch64|aarch64_be)
7802     TARGET_ARCH=aarch64
7803     TARGET_BASE_ARCH=arm
7804     bflt="yes"
7805     mttcg="yes"
7806     gdb_xml_files="aarch64-core.xml aarch64-fpu.xml arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"
7807   ;;
7808   cris)
7809   ;;
7810   hppa)
7811     mttcg="yes"
7812     TARGET_SYSTBL_ABI=common,32
7813   ;;
7814   lm32)
7815   ;;
7816   m68k)
7817     bflt="yes"
7818     gdb_xml_files="cf-core.xml cf-fp.xml m68k-fp.xml"
7819     TARGET_SYSTBL_ABI=common
7820   ;;
7821   microblaze|microblazeel)
7822     TARGET_ARCH=microblaze
7823     TARGET_SYSTBL_ABI=common
7824     bflt="yes"
7825     echo "TARGET_ABI32=y" >> $config_target_mak
7826   ;;
7827   mips|mipsel)
7828     mttcg="yes"
7829     TARGET_ARCH=mips
7830     echo "TARGET_ABI_MIPSO32=y" >> $config_target_mak
7831     TARGET_SYSTBL_ABI=o32
7832   ;;
7833   mipsn32|mipsn32el)
7834     mttcg="yes"
7835     TARGET_ARCH=mips64
7836     TARGET_BASE_ARCH=mips
7837     echo "TARGET_ABI_MIPSN32=y" >> $config_target_mak
7838     echo "TARGET_ABI32=y" >> $config_target_mak
7839     TARGET_SYSTBL_ABI=n32
7840   ;;
7841   mips64|mips64el)
7842     mttcg="no"
7843     TARGET_ARCH=mips64
7844     TARGET_BASE_ARCH=mips
7845     echo "TARGET_ABI_MIPSN64=y" >> $config_target_mak
7846     TARGET_SYSTBL_ABI=n64
7847   ;;
7848   moxie)
7849   ;;
7850   nios2)
7851   ;;
7852   or1k)
7853     TARGET_ARCH=openrisc
7854     TARGET_BASE_ARCH=openrisc
7855   ;;
7856   ppc)
7857     gdb_xml_files="power-core.xml power-fpu.xml power-altivec.xml power-spe.xml"
7858     TARGET_SYSTBL_ABI=common,nospu,32
7859   ;;
7860   ppc64)
7861     TARGET_BASE_ARCH=ppc
7862     TARGET_ABI_DIR=ppc
7863     TARGET_SYSTBL_ABI=common,nospu,64
7864     mttcg=yes
7865     gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
7866   ;;
7867   ppc64le)
7868     TARGET_ARCH=ppc64
7869     TARGET_BASE_ARCH=ppc
7870     TARGET_ABI_DIR=ppc
7871     TARGET_SYSTBL_ABI=common,nospu,64
7872     mttcg=yes
7873     gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
7874   ;;
7875   ppc64abi32)
7876     TARGET_ARCH=ppc64
7877     TARGET_BASE_ARCH=ppc
7878     TARGET_ABI_DIR=ppc
7879     TARGET_SYSTBL_ABI=common,nospu,32
7880     echo "TARGET_ABI32=y" >> $config_target_mak
7881     gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
7882   ;;
7883   riscv32)
7884     TARGET_BASE_ARCH=riscv
7885     TARGET_ABI_DIR=riscv
7886     mttcg=yes
7887     gdb_xml_files="riscv-32bit-cpu.xml riscv-32bit-fpu.xml riscv-64bit-fpu.xml riscv-32bit-csr.xml riscv-32bit-virtual.xml"
7888   ;;
7889   riscv64)
7890     TARGET_BASE_ARCH=riscv
7891     TARGET_ABI_DIR=riscv
7892     mttcg=yes
7893     gdb_xml_files="riscv-64bit-cpu.xml riscv-32bit-fpu.xml riscv-64bit-fpu.xml riscv-64bit-csr.xml riscv-64bit-virtual.xml"
7894   ;;
7895   rx)
7896     TARGET_ARCH=rx
7897     bflt="yes"
7898     target_compiler=$cross_cc_rx
7899     gdb_xml_files="rx-core.xml"
7900   ;;
7901   sh4|sh4eb)
7902     TARGET_ARCH=sh4
7903     TARGET_SYSTBL_ABI=common
7904     bflt="yes"
7905   ;;
7906   sparc)
7907     TARGET_SYSTBL_ABI=common,32
7908   ;;
7909   sparc64)
7910     TARGET_BASE_ARCH=sparc
7911     TARGET_SYSTBL_ABI=common,64
7912   ;;
7913   sparc32plus)
7914     TARGET_ARCH=sparc64
7915     TARGET_BASE_ARCH=sparc
7916     TARGET_ABI_DIR=sparc
7917     TARGET_SYSTBL_ABI=common,32
7918     echo "TARGET_ABI32=y" >> $config_target_mak
7919   ;;
7920   s390x)
7921     TARGET_SYSTBL_ABI=common,64
7922     mttcg=yes
7923     gdb_xml_files="s390x-core64.xml s390-acr.xml s390-fpr.xml s390-vx.xml s390-cr.xml s390-virt.xml s390-gs.xml"
7924   ;;
7925   tilegx)
7926   ;;
7927   tricore)
7928   ;;
7929   unicore32)
7930   ;;
7931   xtensa|xtensaeb)
7932     TARGET_ARCH=xtensa
7933     TARGET_SYSTBL_ABI=common
7934     bflt="yes"
7935     mttcg="yes"
7936   ;;
7937   *)
7938     error_exit "Unsupported target CPU"
7939   ;;
7940 esac
7941 # TARGET_BASE_ARCH needs to be defined after TARGET_ARCH
7942 if [ "$TARGET_BASE_ARCH" = "" ]; then
7943   TARGET_BASE_ARCH=$TARGET_ARCH
7944 fi
7945 
7946 symlink "$source_path/Makefile.target" "$target_dir/Makefile"
7947 
7948 upper() {
7949     echo "$@"| LC_ALL=C tr '[a-z]' '[A-Z]'
7950 }
7951 
7952 target_arch_name="$(upper $TARGET_ARCH)"
7953 echo "TARGET_$target_arch_name=y" >> $config_target_mak
7954 echo "TARGET_NAME=$target_name" >> $config_target_mak
7955 echo "TARGET_BASE_ARCH=$TARGET_BASE_ARCH" >> $config_target_mak
7956 if [ "$TARGET_ABI_DIR" = "" ]; then
7957   TARGET_ABI_DIR=$TARGET_ARCH
7958 fi
7959 echo "TARGET_ABI_DIR=$TARGET_ABI_DIR" >> $config_target_mak
7960 if [ "$HOST_VARIANT_DIR" != "" ]; then
7961     echo "HOST_VARIANT_DIR=$HOST_VARIANT_DIR" >> $config_target_mak
7962 fi
7963 if [ "$TARGET_SYSTBL_ABI" != "" ]; then
7964     echo "TARGET_SYSTBL_ABI=$TARGET_SYSTBL_ABI" >> $config_target_mak
7965 fi
7966 
7967 if supported_xen_target $target; then
7968     echo "CONFIG_XEN=y" >> $config_target_mak
7969     echo "$target/config-devices.mak: CONFIG_XEN=y" >> $config_host_mak
7970     if test "$xen_pci_passthrough" = yes; then
7971         echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak"
7972     fi
7973 else
7974     echo "$target/config-devices.mak: CONFIG_XEN=n" >> $config_host_mak
7975 fi
7976 if supported_kvm_target $target; then
7977     echo "CONFIG_KVM=y" >> $config_target_mak
7978     echo "$target/config-devices.mak: CONFIG_KVM=y" >> $config_host_mak
7979 else
7980     echo "$target/config-devices.mak: CONFIG_KVM=n" >> $config_host_mak
7981 fi
7982 if supported_hax_target $target; then
7983     echo "CONFIG_HAX=y" >> $config_target_mak
7984 fi
7985 if supported_hvf_target $target; then
7986     echo "CONFIG_HVF=y" >> $config_target_mak
7987 fi
7988 if supported_whpx_target $target; then
7989     echo "CONFIG_WHPX=y" >> $config_target_mak
7990 fi
7991 if test "$target_aligned_only" = "yes" ; then
7992   echo "TARGET_ALIGNED_ONLY=y" >> $config_target_mak
7993 fi
7994 if test "$target_bigendian" = "yes" ; then
7995   echo "TARGET_WORDS_BIGENDIAN=y" >> $config_target_mak
7996 fi
7997 if test "$target_softmmu" = "yes" ; then
7998   echo "CONFIG_SOFTMMU=y" >> $config_target_mak
7999   if test "$mttcg" = "yes" ; then
8000     echo "TARGET_SUPPORTS_MTTCG=y" >> $config_target_mak
8001   fi
8002 fi
8003 if test "$target_user_only" = "yes" ; then
8004   echo "CONFIG_USER_ONLY=y" >> $config_target_mak
8005   echo "CONFIG_QEMU_INTERP_PREFIX=\"$interp_prefix1\"" >> $config_target_mak
8006 fi
8007 if test "$target_linux_user" = "yes" ; then
8008   echo "CONFIG_LINUX_USER=y" >> $config_target_mak
8009 fi
8010 list=""
8011 if test ! -z "$gdb_xml_files" ; then
8012   for x in $gdb_xml_files; do
8013     list="$list $source_path/gdb-xml/$x"
8014   done
8015   echo "TARGET_XML_FILES=$list" >> $config_target_mak
8016 fi
8017 
8018 if test "$target_user_only" = "yes" && test "$bflt" = "yes"; then
8019   echo "TARGET_HAS_BFLT=y" >> $config_target_mak
8020 fi
8021 if test "$target_bsd_user" = "yes" ; then
8022   echo "CONFIG_BSD_USER=y" >> $config_target_mak
8023 fi
8024 
8025 
8026 # generate QEMU_CFLAGS/QEMU_LDFLAGS for targets
8027 
8028 cflags=""
8029 ldflags=""
8030 
8031 disas_config() {
8032   echo "CONFIG_${1}_DIS=y" >> $config_target_mak
8033   echo "CONFIG_${1}_DIS=y" >> config-all-disas.mak
8034 }
8035 
8036 for i in $ARCH $TARGET_BASE_ARCH ; do
8037   case "$i" in
8038   alpha)
8039     disas_config "ALPHA"
8040   ;;
8041   aarch64)
8042     if test -n "${cxx}"; then
8043       disas_config "ARM_A64"
8044     fi
8045   ;;
8046   arm)
8047     disas_config "ARM"
8048     if test -n "${cxx}"; then
8049       disas_config "ARM_A64"
8050     fi
8051   ;;
8052   cris)
8053     disas_config "CRIS"
8054   ;;
8055   hppa)
8056     disas_config "HPPA"
8057   ;;
8058   i386|x86_64|x32)
8059     disas_config "I386"
8060   ;;
8061   lm32)
8062     disas_config "LM32"
8063   ;;
8064   m68k)
8065     disas_config "M68K"
8066   ;;
8067   microblaze*)
8068     disas_config "MICROBLAZE"
8069   ;;
8070   mips*)
8071     disas_config "MIPS"
8072     if test -n "${cxx}"; then
8073       disas_config "NANOMIPS"
8074     fi
8075   ;;
8076   moxie*)
8077     disas_config "MOXIE"
8078   ;;
8079   nios2)
8080     disas_config "NIOS2"
8081   ;;
8082   or1k)
8083     disas_config "OPENRISC"
8084   ;;
8085   ppc*)
8086     disas_config "PPC"
8087   ;;
8088   riscv*)
8089     disas_config "RISCV"
8090   ;;
8091   rx)
8092     disas_config "RX"
8093   ;;
8094   s390*)
8095     disas_config "S390"
8096   ;;
8097   sh4)
8098     disas_config "SH4"
8099   ;;
8100   sparc*)
8101     disas_config "SPARC"
8102   ;;
8103   xtensa*)
8104     disas_config "XTENSA"
8105   ;;
8106   esac
8107 done
8108 if test "$tcg_interpreter" = "yes" ; then
8109   disas_config "TCI"
8110 fi
8111 
8112 case "$ARCH" in
8113 alpha)
8114   # Ensure there's only a single GP
8115   cflags="-msmall-data $cflags"
8116 ;;
8117 esac
8118 
8119 if test "$gprof" = "yes" ; then
8120   if test "$target_linux_user" = "yes" ; then
8121     cflags="-p $cflags"
8122     ldflags="-p $ldflags"
8123   fi
8124   if test "$target_softmmu" = "yes" ; then
8125     ldflags="-p $ldflags"
8126     echo "GPROF_CFLAGS=-p" >> $config_target_mak
8127   fi
8128 fi
8129 
8130 # Newer kernels on s390 check for an S390_PGSTE program header and
8131 # enable the pgste page table extensions in that case. This makes
8132 # the vm.allocate_pgste sysctl unnecessary. We enable this program
8133 # header if
8134 #  - we build on s390x
8135 #  - we build the system emulation for s390x (qemu-system-s390x)
8136 #  - KVM is enabled
8137 #  - the linker supports --s390-pgste
8138 if test "$TARGET_ARCH" = "s390x" && test "$target_softmmu" = "yes" && \
8139         test "$ARCH" = "s390x" && test "$kvm" = "yes"; then
8140     if ld_has --s390-pgste ; then
8141         ldflags="-Wl,--s390-pgste $ldflags"
8142     fi
8143 fi
8144 
8145 echo "QEMU_LDFLAGS+=$ldflags" >> $config_target_mak
8146 echo "QEMU_CFLAGS+=$cflags" >> $config_target_mak
8147 
8148 done # for target in $targets
8149 
8150 echo "PIXMAN_CFLAGS=$pixman_cflags" >> $config_host_mak
8151 echo "PIXMAN_LIBS=$pixman_libs" >> $config_host_mak
8152 
8153 if [ "$fdt" = "git" ]; then
8154   echo "config-host.h: dtc/all" >> $config_host_mak
8155 fi
8156 if [ "$capstone" = "git" -o "$capstone" = "internal" ]; then
8157   echo "config-host.h: capstone/all" >> $config_host_mak
8158 fi
8159 if test -n "$LIBCAPSTONE"; then
8160   echo "LIBCAPSTONE=$LIBCAPSTONE" >> $config_host_mak
8161 fi
8162 
8163 if test "$numa" = "yes"; then
8164   echo "CONFIG_NUMA=y" >> $config_host_mak
8165 fi
8166 
8167 if test "$ccache_cpp2" = "yes"; then
8168   echo "export CCACHE_CPP2=y" >> $config_host_mak
8169 fi
8170 
8171 # If we're using a separate build tree, set it up now.
8172 # DIRS are directories which we simply mkdir in the build tree;
8173 # LINKS are things to symlink back into the source tree
8174 # (these can be both files and directories).
8175 # Caution: do not add files or directories here using wildcards. This
8176 # will result in problems later if a new file matching the wildcard is
8177 # added to the source tree -- nothing will cause configure to be rerun
8178 # so the build tree will be missing the link back to the new file, and
8179 # tests might fail. Prefer to keep the relevant files in their own
8180 # directory and symlink the directory instead.
8181 DIRS="tests tests/tcg tests/tcg/lm32 tests/qapi-schema tests/qtest/libqos"
8182 DIRS="$DIRS tests/qtest tests/qemu-iotests tests/vm tests/fp tests/qgraph"
8183 DIRS="$DIRS docs docs/interop fsdev scsi"
8184 DIRS="$DIRS pc-bios/optionrom pc-bios/s390-ccw"
8185 DIRS="$DIRS roms/seabios roms/vgabios"
8186 LINKS="Makefile"
8187 LINKS="$LINKS tests/tcg/lm32/Makefile po/Makefile"
8188 LINKS="$LINKS tests/tcg/Makefile.target tests/fp/Makefile"
8189 LINKS="$LINKS tests/plugin/Makefile"
8190 LINKS="$LINKS pc-bios/optionrom/Makefile pc-bios/keymaps"
8191 LINKS="$LINKS pc-bios/s390-ccw/Makefile"
8192 LINKS="$LINKS roms/seabios/Makefile roms/vgabios/Makefile"
8193 LINKS="$LINKS pc-bios/qemu-icon.bmp"
8194 LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
8195 LINKS="$LINKS tests/acceptance tests/data"
8196 LINKS="$LINKS tests/qemu-iotests/check"
8197 LINKS="$LINKS python"
8198 for bios_file in \
8199     $source_path/pc-bios/*.bin \
8200     $source_path/pc-bios/*.lid \
8201     $source_path/pc-bios/*.rom \
8202     $source_path/pc-bios/*.dtb \
8203     $source_path/pc-bios/*.img \
8204     $source_path/pc-bios/openbios-* \
8205     $source_path/pc-bios/u-boot.* \
8206     $source_path/pc-bios/edk2-*.fd.bz2 \
8207     $source_path/pc-bios/palcode-*
8208 do
8209     LINKS="$LINKS pc-bios/$(basename $bios_file)"
8210 done
8211 mkdir -p $DIRS
8212 for f in $LINKS ; do
8213     if [ -e "$source_path/$f" ] && [ "$pwd_is_source_path" != "y" ]; then
8214         symlink "$source_path/$f" "$f"
8215     fi
8216 done
8217 
8218 (for i in $cross_cc_vars; do
8219   export $i
8220 done
8221 export target_list source_path use_containers
8222 $source_path/tests/tcg/configure.sh)
8223 
8224 # temporary config to build submodules
8225 for rom in seabios vgabios ; do
8226     config_mak=roms/$rom/config.mak
8227     echo "# Automatically generated by configure - do not modify" > $config_mak
8228     echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
8229     echo "AS=$as" >> $config_mak
8230     echo "CCAS=$ccas" >> $config_mak
8231     echo "CC=$cc" >> $config_mak
8232     echo "BCC=bcc" >> $config_mak
8233     echo "CPP=$cpp" >> $config_mak
8234     echo "OBJCOPY=objcopy" >> $config_mak
8235     echo "IASL=$iasl" >> $config_mak
8236     echo "LD=$ld" >> $config_mak
8237     echo "RANLIB=$ranlib" >> $config_mak
8238 done
8239 
8240 # set up qemu-iotests in this build directory
8241 iotests_common_env="tests/qemu-iotests/common.env"
8242 
8243 echo "# Automatically generated by configure - do not modify" > "$iotests_common_env"
8244 echo >> "$iotests_common_env"
8245 echo "export PYTHON='$python'" >> "$iotests_common_env"
8246 
8247 # Save the configure command line for later reuse.
8248 cat <<EOD >config.status
8249 #!/bin/sh
8250 # Generated by configure.
8251 # Run this file to recreate the current configuration.
8252 # Compiler output produced by configure, useful for debugging
8253 # configure, is in config.log if it exists.
8254 EOD
8255 
8256 preserve_env() {
8257     envname=$1
8258 
8259     eval envval=\$$envname
8260 
8261     if test -n "$envval"
8262     then
8263 	echo "$envname='$envval'" >> config.status
8264 	echo "export $envname" >> config.status
8265     else
8266 	echo "unset $envname" >> config.status
8267     fi
8268 }
8269 
8270 # Preserve various env variables that influence what
8271 # features/build target configure will detect
8272 preserve_env AR
8273 preserve_env AS
8274 preserve_env CC
8275 preserve_env CPP
8276 preserve_env CXX
8277 preserve_env INSTALL
8278 preserve_env LD
8279 preserve_env LD_LIBRARY_PATH
8280 preserve_env LIBTOOL
8281 preserve_env MAKE
8282 preserve_env NM
8283 preserve_env OBJCOPY
8284 preserve_env PATH
8285 preserve_env PKG_CONFIG
8286 preserve_env PKG_CONFIG_LIBDIR
8287 preserve_env PKG_CONFIG_PATH
8288 preserve_env PYTHON
8289 preserve_env SDL2_CONFIG
8290 preserve_env SMBD
8291 preserve_env STRIP
8292 preserve_env WINDRES
8293 
8294 printf "exec" >>config.status
8295 printf " '%s'" "$0" "$@" >>config.status
8296 echo ' "$@"' >>config.status
8297 chmod +x config.status
8298 
8299 rm -r "$TMPDIR1"
8300