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