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