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