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