qemu-img: add support for rate limit in qemu-img commit
[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="auto"
301 fdt="auto"
302 netmap="no"
303 sdl="auto"
304 sdl_image="auto"
305 virtfs=""
306 libudev="auto"
307 mpath="auto"
308 vnc="enabled"
309 sparse="auto"
310 vde=""
311 vnc_sasl="auto"
312 vnc_jpeg="auto"
313 vnc_png="auto"
314 xkbcommon="auto"
315 xen=""
316 xen_ctrl_version=""
317 xen_pci_passthrough="auto"
318 linux_aio=""
319 linux_io_uring=""
320 cap_ng=""
321 attr=""
322 libattr=""
323 xfs=""
324 tcg="enabled"
325 membarrier=""
326 vhost_net=""
327 vhost_crypto=""
328 vhost_scsi=""
329 vhost_vsock=""
330 vhost_user=""
331 vhost_user_fs=""
332 kvm="auto"
333 hax="auto"
334 hvf="auto"
335 whpx="auto"
336 rdma=""
337 pvrdma=""
338 gprof="no"
339 debug_tcg="no"
340 debug="no"
341 sanitizers="no"
342 tsan="no"
343 fortify_source=""
344 strip_opt="yes"
345 tcg_interpreter="no"
346 bigendian="no"
347 mingw32="no"
348 gcov="no"
349 EXESUF=""
350 HOST_DSOSUF=".so"
351 modules="no"
352 module_upgrades="no"
353 prefix="/usr/local"
354 qemu_suffix="qemu"
355 slirp="auto"
356 oss_lib=""
357 bsd="no"
358 linux="no"
359 solaris="no"
360 profiler="no"
361 cocoa="auto"
362 softmmu="yes"
363 linux_user="no"
364 bsd_user="no"
365 blobs="true"
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="no"
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
823 # Check for ancillary tools used in testing
824 genisoimage=
825 for binary in genisoimage mkisofs
826 do
827     if has $binary
828     then
829         genisoimage=$(command -v "$binary")
830         break
831     fi
832 done
833
834 : ${smbd=${SMBD-/usr/sbin/smbd}}
835
836 # Default objcc to clang if available, otherwise use CC
837 if has clang; then
838   objcc=clang
839 else
840   objcc="$cc"
841 fi
842
843 if test "$mingw32" = "yes" ; then
844   EXESUF=".exe"
845   HOST_DSOSUF=".dll"
846   # MinGW needs -mthreads for TLS and macro _MT.
847   CONFIGURE_CFLAGS="-mthreads $CONFIGURE_CFLAGS"
848   write_c_skeleton;
849   prefix="/qemu"
850   qemu_suffix=""
851   libs_qga="-lws2_32 -lwinmm -lpowrprof -lwtsapi32 -lwininet -liphlpapi -lnetapi32 $libs_qga"
852 fi
853
854 werror=""
855
856 for opt do
857   optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
858   case "$opt" in
859   --help|-h) show_help=yes
860   ;;
861   --version|-V) exec cat $source_path/VERSION
862   ;;
863   --prefix=*) prefix="$optarg"
864   ;;
865   --interp-prefix=*) interp_prefix="$optarg"
866   ;;
867   --cross-prefix=*)
868   ;;
869   --cc=*)
870   ;;
871   --host-cc=*) host_cc="$optarg"
872   ;;
873   --cxx=*)
874   ;;
875   --iasl=*) iasl="$optarg"
876   ;;
877   --objcc=*) objcc="$optarg"
878   ;;
879   --make=*) make="$optarg"
880   ;;
881   --install=*)
882   ;;
883   --python=*) python="$optarg" ; explicit_python=yes
884   ;;
885   --sphinx-build=*) sphinx_build="$optarg"
886   ;;
887   --skip-meson) skip_meson=yes
888   ;;
889   --meson=*) meson="$optarg"
890   ;;
891   --ninja=*) ninja="$optarg"
892   ;;
893   --smbd=*) smbd="$optarg"
894   ;;
895   --extra-cflags=*)
896   ;;
897   --extra-cxxflags=*)
898   ;;
899   --extra-ldflags=*)
900   ;;
901   --enable-debug-info)
902   ;;
903   --disable-debug-info)
904   ;;
905   --cross-cc-*)
906   ;;
907   --enable-modules)
908       modules="yes"
909   ;;
910   --disable-modules)
911       modules="no"
912   ;;
913   --disable-module-upgrades) module_upgrades="no"
914   ;;
915   --enable-module-upgrades) module_upgrades="yes"
916   ;;
917   --cpu=*)
918   ;;
919   --target-list=*) target_list="$optarg"
920                    if test "$target_list_exclude"; then
921                        error_exit "Can't mix --target-list with --target-list-exclude"
922                    fi
923   ;;
924   --target-list-exclude=*) target_list_exclude="$optarg"
925                    if test "$target_list"; then
926                        error_exit "Can't mix --target-list-exclude with --target-list"
927                    fi
928   ;;
929   --enable-trace-backends=*) trace_backends="$optarg"
930   ;;
931   # XXX: backwards compatibility
932   --enable-trace-backend=*) trace_backends="$optarg"
933   ;;
934   --with-trace-file=*) trace_file="$optarg"
935   ;;
936   --with-default-devices) default_devices="yes"
937   ;;
938   --without-default-devices) default_devices="no"
939   ;;
940   --enable-gprof) gprof="yes"
941   ;;
942   --enable-gcov) gcov="yes"
943   ;;
944   --static)
945     static="yes"
946     QEMU_PKG_CONFIG_FLAGS="--static $QEMU_PKG_CONFIG_FLAGS"
947   ;;
948   --mandir=*) mandir="$optarg"
949   ;;
950   --bindir=*) bindir="$optarg"
951   ;;
952   --libdir=*) libdir="$optarg"
953   ;;
954   --libexecdir=*) libexecdir="$optarg"
955   ;;
956   --includedir=*) includedir="$optarg"
957   ;;
958   --datadir=*) datadir="$optarg"
959   ;;
960   --with-suffix=*) qemu_suffix="$optarg"
961   ;;
962   --docdir=*) docdir="$optarg"
963   ;;
964   --localedir=*) localedir="$optarg"
965   ;;
966   --sysconfdir=*) sysconfdir="$optarg"
967   ;;
968   --localstatedir=*) local_statedir="$optarg"
969   ;;
970   --firmwarepath=*) firmwarepath="$optarg"
971   ;;
972   --host=*|--build=*|\
973   --disable-dependency-tracking|\
974   --sbindir=*|--sharedstatedir=*|\
975   --oldincludedir=*|--datarootdir=*|--infodir=*|\
976   --htmldir=*|--dvidir=*|--pdfdir=*|--psdir=*)
977     # These switches are silently ignored, for compatibility with
978     # autoconf-generated configure scripts. This allows QEMU's
979     # configure to be used by RPM and similar macros that set
980     # lots of directory switches by default.
981   ;;
982   --disable-sdl) sdl="disabled"
983   ;;
984   --enable-sdl) sdl="enabled"
985   ;;
986   --disable-sdl-image) sdl_image="disabled"
987   ;;
988   --enable-sdl-image) sdl_image="enabled"
989   ;;
990   --disable-qom-cast-debug) qom_cast_debug="no"
991   ;;
992   --enable-qom-cast-debug) qom_cast_debug="yes"
993   ;;
994   --disable-virtfs) virtfs="no"
995   ;;
996   --enable-virtfs) virtfs="yes"
997   ;;
998   --disable-libudev) libudev="disabled"
999   ;;
1000   --enable-libudev) libudev="enabled"
1001   ;;
1002   --disable-mpath) mpath="disabled"
1003   ;;
1004   --enable-mpath) mpath="enabled"
1005   ;;
1006   --disable-vnc) vnc="disabled"
1007   ;;
1008   --enable-vnc) vnc="enabled"
1009   ;;
1010   --disable-gettext) gettext="false"
1011   ;;
1012   --enable-gettext) gettext="true"
1013   ;;
1014   --oss-lib=*) oss_lib="$optarg"
1015   ;;
1016   --audio-drv-list=*) audio_drv_list="$optarg"
1017   ;;
1018   --block-drv-rw-whitelist=*|--block-drv-whitelist=*) block_drv_rw_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
1019   ;;
1020   --block-drv-ro-whitelist=*) block_drv_ro_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
1021   ;;
1022   --enable-debug-tcg) debug_tcg="yes"
1023   ;;
1024   --disable-debug-tcg) debug_tcg="no"
1025   ;;
1026   --enable-debug)
1027       # Enable debugging options that aren't excessively noisy
1028       debug_tcg="yes"
1029       debug_mutex="yes"
1030       debug="yes"
1031       strip_opt="no"
1032       fortify_source="no"
1033   ;;
1034   --enable-sanitizers) sanitizers="yes"
1035   ;;
1036   --disable-sanitizers) sanitizers="no"
1037   ;;
1038   --enable-tsan) tsan="yes"
1039   ;;
1040   --disable-tsan) tsan="no"
1041   ;;
1042   --enable-sparse) sparse="enabled"
1043   ;;
1044   --disable-sparse) sparse="disabled"
1045   ;;
1046   --disable-strip) strip_opt="no"
1047   ;;
1048   --disable-vnc-sasl) vnc_sasl="disabled"
1049   ;;
1050   --enable-vnc-sasl) vnc_sasl="enabled"
1051   ;;
1052   --disable-vnc-jpeg) vnc_jpeg="disabled"
1053   ;;
1054   --enable-vnc-jpeg) vnc_jpeg="enabled"
1055   ;;
1056   --disable-vnc-png) vnc_png="disabled"
1057   ;;
1058   --enable-vnc-png) vnc_png="enabled"
1059   ;;
1060   --disable-slirp) slirp="disabled"
1061   ;;
1062   --enable-slirp=git) slirp="internal"
1063   ;;
1064   --enable-slirp=system) slirp="system"
1065   ;;
1066   --disable-vde) vde="no"
1067   ;;
1068   --enable-vde) vde="yes"
1069   ;;
1070   --disable-netmap) netmap="no"
1071   ;;
1072   --enable-netmap) netmap="yes"
1073   ;;
1074   --disable-xen) xen="disabled"
1075   ;;
1076   --enable-xen) xen="enabled"
1077   ;;
1078   --disable-xen-pci-passthrough) xen_pci_passthrough="disabled"
1079   ;;
1080   --enable-xen-pci-passthrough) xen_pci_passthrough="enabled"
1081   ;;
1082   --disable-brlapi) brlapi="no"
1083   ;;
1084   --enable-brlapi) brlapi="yes"
1085   ;;
1086   --disable-kvm) kvm="disabled"
1087   ;;
1088   --enable-kvm) kvm="enabled"
1089   ;;
1090   --disable-hax) hax="disabled"
1091   ;;
1092   --enable-hax) hax="enabled"
1093   ;;
1094   --disable-hvf) hvf="disabled"
1095   ;;
1096   --enable-hvf) hvf="enabled"
1097   ;;
1098   --disable-whpx) whpx="disabled"
1099   ;;
1100   --enable-whpx) whpx="enabled"
1101   ;;
1102   --disable-tcg-interpreter) tcg_interpreter="no"
1103   ;;
1104   --enable-tcg-interpreter) tcg_interpreter="yes"
1105   ;;
1106   --disable-cap-ng)  cap_ng="no"
1107   ;;
1108   --enable-cap-ng) cap_ng="yes"
1109   ;;
1110   --disable-tcg) tcg="disabled"
1111   ;;
1112   --enable-tcg) tcg="enabled"
1113   ;;
1114   --disable-malloc-trim) malloc_trim="disabled"
1115   ;;
1116   --enable-malloc-trim) malloc_trim="enabled"
1117   ;;
1118   --disable-spice) spice="no"
1119   ;;
1120   --enable-spice) spice="yes"
1121   ;;
1122   --disable-libiscsi) libiscsi="no"
1123   ;;
1124   --enable-libiscsi) libiscsi="yes"
1125   ;;
1126   --disable-libnfs) libnfs="no"
1127   ;;
1128   --enable-libnfs) libnfs="yes"
1129   ;;
1130   --enable-profiler) profiler="yes"
1131   ;;
1132   --disable-cocoa) cocoa="disabled"
1133   ;;
1134   --enable-cocoa)
1135       cocoa="enabled" ;
1136       audio_drv_list="coreaudio $(echo $audio_drv_list | sed s,coreaudio,,g)"
1137   ;;
1138   --disable-system) softmmu="no"
1139   ;;
1140   --enable-system) softmmu="yes"
1141   ;;
1142   --disable-user)
1143       linux_user="no" ;
1144       bsd_user="no" ;
1145   ;;
1146   --enable-user) ;;
1147   --disable-linux-user) linux_user="no"
1148   ;;
1149   --enable-linux-user) linux_user="yes"
1150   ;;
1151   --disable-bsd-user) bsd_user="no"
1152   ;;
1153   --enable-bsd-user) bsd_user="yes"
1154   ;;
1155   --enable-pie) pie="yes"
1156   ;;
1157   --disable-pie) pie="no"
1158   ;;
1159   --enable-werror) werror="yes"
1160   ;;
1161   --disable-werror) werror="no"
1162   ;;
1163   --enable-stack-protector) stack_protector="yes"
1164   ;;
1165   --disable-stack-protector) stack_protector="no"
1166   ;;
1167   --enable-safe-stack) safe_stack="yes"
1168   ;;
1169   --disable-safe-stack) safe_stack="no"
1170   ;;
1171   --disable-curses) curses="disabled"
1172   ;;
1173   --enable-curses) curses="enabled"
1174   ;;
1175   --disable-iconv) iconv="disabled"
1176   ;;
1177   --enable-iconv) iconv="enabled"
1178   ;;
1179   --disable-curl) curl="no"
1180   ;;
1181   --enable-curl) curl="yes"
1182   ;;
1183   --disable-fdt) fdt="disabled"
1184   ;;
1185   --enable-fdt) fdt="enabled"
1186   ;;
1187   --enable-fdt=git) fdt="internal"
1188   ;;
1189   --enable-fdt=system) fdt="system"
1190   ;;
1191   --disable-linux-aio) linux_aio="no"
1192   ;;
1193   --enable-linux-aio) linux_aio="yes"
1194   ;;
1195   --disable-linux-io-uring) linux_io_uring="no"
1196   ;;
1197   --enable-linux-io-uring) linux_io_uring="yes"
1198   ;;
1199   --disable-attr) attr="no"
1200   ;;
1201   --enable-attr) attr="yes"
1202   ;;
1203   --disable-membarrier) membarrier="no"
1204   ;;
1205   --enable-membarrier) membarrier="yes"
1206   ;;
1207   --disable-blobs) blobs="false"
1208   ;;
1209   --with-pkgversion=*) pkgversion="$optarg"
1210   ;;
1211   --with-coroutine=*) coroutine="$optarg"
1212   ;;
1213   --disable-coroutine-pool) coroutine_pool="no"
1214   ;;
1215   --enable-coroutine-pool) coroutine_pool="yes"
1216   ;;
1217   --enable-debug-stack-usage) debug_stack_usage="yes"
1218   ;;
1219   --enable-crypto-afalg) crypto_afalg="yes"
1220   ;;
1221   --disable-crypto-afalg) crypto_afalg="no"
1222   ;;
1223   --disable-docs) docs="disabled"
1224   ;;
1225   --enable-docs) docs="enabled"
1226   ;;
1227   --disable-vhost-net) vhost_net="no"
1228   ;;
1229   --enable-vhost-net) vhost_net="yes"
1230   ;;
1231   --disable-vhost-crypto) vhost_crypto="no"
1232   ;;
1233   --enable-vhost-crypto) vhost_crypto="yes"
1234   ;;
1235   --disable-vhost-scsi) vhost_scsi="no"
1236   ;;
1237   --enable-vhost-scsi) vhost_scsi="yes"
1238   ;;
1239   --disable-vhost-vsock) vhost_vsock="no"
1240   ;;
1241   --enable-vhost-vsock) vhost_vsock="yes"
1242   ;;
1243   --disable-vhost-user-fs) vhost_user_fs="no"
1244   ;;
1245   --enable-vhost-user-fs) vhost_user_fs="yes"
1246   ;;
1247   --disable-opengl) opengl="no"
1248   ;;
1249   --enable-opengl) opengl="yes"
1250   ;;
1251   --disable-rbd) rbd="no"
1252   ;;
1253   --enable-rbd) rbd="yes"
1254   ;;
1255   --disable-xfsctl) xfs="no"
1256   ;;
1257   --enable-xfsctl) xfs="yes"
1258   ;;
1259   --disable-smartcard) smartcard="no"
1260   ;;
1261   --enable-smartcard) smartcard="yes"
1262   ;;
1263   --disable-u2f) u2f="disabled"
1264   ;;
1265   --enable-u2f) u2f="enabled"
1266   ;;
1267   --disable-libusb) libusb="no"
1268   ;;
1269   --enable-libusb) libusb="yes"
1270   ;;
1271   --disable-usb-redir) usb_redir="no"
1272   ;;
1273   --enable-usb-redir) usb_redir="yes"
1274   ;;
1275   --disable-zlib-test)
1276   ;;
1277   --disable-lzo) lzo="no"
1278   ;;
1279   --enable-lzo) lzo="yes"
1280   ;;
1281   --disable-snappy) snappy="no"
1282   ;;
1283   --enable-snappy) snappy="yes"
1284   ;;
1285   --disable-bzip2) bzip2="no"
1286   ;;
1287   --enable-bzip2) bzip2="yes"
1288   ;;
1289   --enable-lzfse) lzfse="yes"
1290   ;;
1291   --disable-lzfse) lzfse="no"
1292   ;;
1293   --disable-zstd) zstd="no"
1294   ;;
1295   --enable-zstd) zstd="yes"
1296   ;;
1297   --enable-guest-agent) guest_agent="yes"
1298   ;;
1299   --disable-guest-agent) guest_agent="no"
1300   ;;
1301   --enable-guest-agent-msi) guest_agent_msi="yes"
1302   ;;
1303   --disable-guest-agent-msi) guest_agent_msi="no"
1304   ;;
1305   --with-vss-sdk) vss_win32_sdk=""
1306   ;;
1307   --with-vss-sdk=*) vss_win32_sdk="$optarg"
1308   ;;
1309   --without-vss-sdk) vss_win32_sdk="no"
1310   ;;
1311   --with-win-sdk) win_sdk=""
1312   ;;
1313   --with-win-sdk=*) win_sdk="$optarg"
1314   ;;
1315   --without-win-sdk) win_sdk="no"
1316   ;;
1317   --enable-tools) want_tools="yes"
1318   ;;
1319   --disable-tools) want_tools="no"
1320   ;;
1321   --enable-seccomp) seccomp="yes"
1322   ;;
1323   --disable-seccomp) seccomp="no"
1324   ;;
1325   --disable-glusterfs) glusterfs="no"
1326   ;;
1327   --disable-avx2) avx2_opt="no"
1328   ;;
1329   --enable-avx2) avx2_opt="yes"
1330   ;;
1331   --disable-avx512f) avx512f_opt="no"
1332   ;;
1333   --enable-avx512f) avx512f_opt="yes"
1334   ;;
1335
1336   --enable-glusterfs) glusterfs="yes"
1337   ;;
1338   --disable-virtio-blk-data-plane|--enable-virtio-blk-data-plane)
1339       echo "$0: $opt is obsolete, virtio-blk data-plane is always on" >&2
1340   ;;
1341   --enable-vhdx|--disable-vhdx)
1342       echo "$0: $opt is obsolete, VHDX driver is always built" >&2
1343   ;;
1344   --enable-uuid|--disable-uuid)
1345       echo "$0: $opt is obsolete, UUID support is always built" >&2
1346   ;;
1347   --disable-gtk) gtk="no"
1348   ;;
1349   --enable-gtk) gtk="yes"
1350   ;;
1351   --tls-priority=*) tls_priority="$optarg"
1352   ;;
1353   --disable-gnutls) gnutls="no"
1354   ;;
1355   --enable-gnutls) gnutls="yes"
1356   ;;
1357   --disable-nettle) nettle="no"
1358   ;;
1359   --enable-nettle) nettle="yes"
1360   ;;
1361   --disable-gcrypt) gcrypt="no"
1362   ;;
1363   --enable-gcrypt) gcrypt="yes"
1364   ;;
1365   --disable-auth-pam) auth_pam="no"
1366   ;;
1367   --enable-auth-pam) auth_pam="yes"
1368   ;;
1369   --enable-rdma) rdma="yes"
1370   ;;
1371   --disable-rdma) rdma="no"
1372   ;;
1373   --enable-pvrdma) pvrdma="yes"
1374   ;;
1375   --disable-pvrdma) pvrdma="no"
1376   ;;
1377   --disable-vte) vte="no"
1378   ;;
1379   --enable-vte) vte="yes"
1380   ;;
1381   --disable-virglrenderer) virglrenderer="no"
1382   ;;
1383   --enable-virglrenderer) virglrenderer="yes"
1384   ;;
1385   --disable-tpm) tpm="no"
1386   ;;
1387   --enable-tpm) tpm="yes"
1388   ;;
1389   --disable-libssh) libssh="no"
1390   ;;
1391   --enable-libssh) libssh="yes"
1392   ;;
1393   --disable-live-block-migration) live_block_migration="no"
1394   ;;
1395   --enable-live-block-migration) live_block_migration="yes"
1396   ;;
1397   --disable-numa) numa="no"
1398   ;;
1399   --enable-numa) numa="yes"
1400   ;;
1401   --disable-libxml2) libxml2="no"
1402   ;;
1403   --enable-libxml2) libxml2="yes"
1404   ;;
1405   --disable-tcmalloc) tcmalloc="no"
1406   ;;
1407   --enable-tcmalloc) tcmalloc="yes"
1408   ;;
1409   --disable-jemalloc) jemalloc="no"
1410   ;;
1411   --enable-jemalloc) jemalloc="yes"
1412   ;;
1413   --disable-replication) replication="no"
1414   ;;
1415   --enable-replication) replication="yes"
1416   ;;
1417   --disable-bochs) bochs="no"
1418   ;;
1419   --enable-bochs) bochs="yes"
1420   ;;
1421   --disable-cloop) cloop="no"
1422   ;;
1423   --enable-cloop) cloop="yes"
1424   ;;
1425   --disable-dmg) dmg="no"
1426   ;;
1427   --enable-dmg) dmg="yes"
1428   ;;
1429   --disable-qcow1) qcow1="no"
1430   ;;
1431   --enable-qcow1) qcow1="yes"
1432   ;;
1433   --disable-vdi) vdi="no"
1434   ;;
1435   --enable-vdi) vdi="yes"
1436   ;;
1437   --disable-vvfat) vvfat="no"
1438   ;;
1439   --enable-vvfat) vvfat="yes"
1440   ;;
1441   --disable-qed) qed="no"
1442   ;;
1443   --enable-qed) qed="yes"
1444   ;;
1445   --disable-parallels) parallels="no"
1446   ;;
1447   --enable-parallels) parallels="yes"
1448   ;;
1449   --disable-sheepdog) sheepdog="no"
1450   ;;
1451   --enable-sheepdog) sheepdog="yes"
1452   ;;
1453   --disable-vhost-user) vhost_user="no"
1454   ;;
1455   --enable-vhost-user) vhost_user="yes"
1456   ;;
1457   --disable-vhost-vdpa) vhost_vdpa="no"
1458   ;;
1459   --enable-vhost-vdpa) vhost_vdpa="yes"
1460   ;;
1461   --disable-vhost-kernel) vhost_kernel="no"
1462   ;;
1463   --enable-vhost-kernel) vhost_kernel="yes"
1464   ;;
1465   --disable-capstone) capstone="disabled"
1466   ;;
1467   --enable-capstone) capstone="enabled"
1468   ;;
1469   --enable-capstone=git) capstone="internal"
1470   ;;
1471   --enable-capstone=system) capstone="system"
1472   ;;
1473   --with-git=*) git="$optarg"
1474   ;;
1475   --enable-git-update) git_update=yes
1476   ;;
1477   --disable-git-update) git_update=no
1478   ;;
1479   --enable-debug-mutex) debug_mutex=yes
1480   ;;
1481   --disable-debug-mutex) debug_mutex=no
1482   ;;
1483   --enable-libpmem) libpmem=yes
1484   ;;
1485   --disable-libpmem) libpmem=no
1486   ;;
1487   --enable-xkbcommon) xkbcommon="enabled"
1488   ;;
1489   --disable-xkbcommon) xkbcommon="disabled"
1490   ;;
1491   --enable-plugins) plugins="yes"
1492   ;;
1493   --disable-plugins) plugins="no"
1494   ;;
1495   --enable-containers) use_containers="yes"
1496   ;;
1497   --disable-containers) use_containers="no"
1498   ;;
1499   --enable-fuzzing) fuzzing=yes
1500   ;;
1501   --disable-fuzzing) fuzzing=no
1502   ;;
1503   --gdb=*) gdb_bin="$optarg"
1504   ;;
1505   --enable-rng-none) rng_none=yes
1506   ;;
1507   --disable-rng-none) rng_none=no
1508   ;;
1509   --enable-keyring) secret_keyring="yes"
1510   ;;
1511   --disable-keyring) secret_keyring="no"
1512   ;;
1513   --enable-libdaxctl) libdaxctl=yes
1514   ;;
1515   --disable-libdaxctl) libdaxctl=no
1516   ;;
1517   *)
1518       echo "ERROR: unknown option $opt"
1519       echo "Try '$0 --help' for more information"
1520       exit 1
1521   ;;
1522   esac
1523 done
1524
1525 libdir="${libdir:-$prefix/lib}"
1526 libexecdir="${libexecdir:-$prefix/libexec}"
1527 includedir="${includedir:-$prefix/include}"
1528
1529 if test "$mingw32" = "yes" ; then
1530     mandir="$prefix"
1531     datadir="$prefix"
1532     docdir="$prefix"
1533     bindir="$prefix"
1534     sysconfdir="$prefix"
1535     local_statedir="$prefix"
1536 else
1537     mandir="${mandir:-$prefix/share/man}"
1538     datadir="${datadir:-$prefix/share}"
1539     docdir="${docdir:-$prefix/share/doc}"
1540     bindir="${bindir:-$prefix/bin}"
1541     sysconfdir="${sysconfdir:-$prefix/etc}"
1542     local_statedir="${local_statedir:-$prefix/var}"
1543 fi
1544 firmwarepath="${firmwarepath:-$datadir/qemu-firmware}"
1545 localedir="${localedir:-$datadir/locale}"
1546
1547 case "$cpu" in
1548     ppc)
1549            CPU_CFLAGS="-m32"
1550            QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS"
1551            ;;
1552     ppc64)
1553            CPU_CFLAGS="-m64"
1554            QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1555            ;;
1556     sparc)
1557            CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc"
1558            QEMU_LDFLAGS="-m32 -mv8plus $QEMU_LDFLAGS"
1559            ;;
1560     sparc64)
1561            CPU_CFLAGS="-m64 -mcpu=ultrasparc"
1562            QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1563            ;;
1564     s390)
1565            CPU_CFLAGS="-m31"
1566            QEMU_LDFLAGS="-m31 $QEMU_LDFLAGS"
1567            ;;
1568     s390x)
1569            CPU_CFLAGS="-m64"
1570            QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1571            ;;
1572     i386)
1573            CPU_CFLAGS="-m32"
1574            QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS"
1575            ;;
1576     x86_64)
1577            # ??? Only extremely old AMD cpus do not have cmpxchg16b.
1578            # If we truly care, we should simply detect this case at
1579            # runtime and generate the fallback to serial emulation.
1580            CPU_CFLAGS="-m64 -mcx16"
1581            QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1582            ;;
1583     x32)
1584            CPU_CFLAGS="-mx32"
1585            QEMU_LDFLAGS="-mx32 $QEMU_LDFLAGS"
1586            ;;
1587     # No special flags required for other host CPUs
1588 esac
1589
1590 eval "cross_cc_${cpu}=\$host_cc"
1591 cross_cc_vars="$cross_cc_vars cross_cc_${cpu}"
1592 QEMU_CFLAGS="$CPU_CFLAGS $QEMU_CFLAGS"
1593
1594 # For user-mode emulation the host arch has to be one we explicitly
1595 # support, even if we're using TCI.
1596 if [ "$ARCH" = "unknown" ]; then
1597   bsd_user="no"
1598   linux_user="no"
1599 fi
1600
1601 default_target_list=""
1602 deprecated_targets_list=ppc64abi32-linux-user,tilegx-linux-user,lm32-softmmu,unicore32-softmmu
1603 deprecated_features=""
1604 mak_wilds=""
1605
1606 if [ "$softmmu" = "yes" ]; then
1607     mak_wilds="${mak_wilds} $source_path/default-configs/targets/*-softmmu.mak"
1608 fi
1609 if [ "$linux_user" = "yes" ]; then
1610     mak_wilds="${mak_wilds} $source_path/default-configs/targets/*-linux-user.mak"
1611 fi
1612 if [ "$bsd_user" = "yes" ]; then
1613     mak_wilds="${mak_wilds} $source_path/default-configs/targets/*-bsd-user.mak"
1614 fi
1615
1616 # If the user doesn't explicitly specify a deprecated target we will
1617 # skip it.
1618 if test -z "$target_list"; then
1619     if test -z "$target_list_exclude"; then
1620         target_list_exclude="$deprecated_targets_list"
1621     else
1622         target_list_exclude="$target_list_exclude,$deprecated_targets_list"
1623     fi
1624 fi
1625
1626 for config in $mak_wilds; do
1627     target="$(basename "$config" .mak)"
1628     if echo "$target_list_exclude" | grep -vq "$target"; then
1629         default_target_list="${default_target_list} $target"
1630     fi
1631 done
1632
1633 # Enumerate public trace backends for --help output
1634 trace_backend_list=$(echo $(grep -le '^PUBLIC = True$' "$source_path"/scripts/tracetool/backend/*.py | sed -e 's/^.*\/\(.*\)\.py$/\1/'))
1635
1636 if test x"$show_help" = x"yes" ; then
1637 cat << EOF
1638
1639 Usage: configure [options]
1640 Options: [defaults in brackets after descriptions]
1641
1642 Standard options:
1643   --help                   print this message
1644   --prefix=PREFIX          install in PREFIX [$prefix]
1645   --interp-prefix=PREFIX   where to find shared libraries, etc.
1646                            use %M for cpu name [$interp_prefix]
1647   --target-list=LIST       set target list (default: build everything)
1648 $(echo Available targets: $default_target_list | \
1649   fold -s -w 53 | sed -e 's/^/                           /')
1650   --target-list-exclude=LIST exclude a set of targets from the default target-list
1651
1652 Advanced options (experts only):
1653   --cross-prefix=PREFIX    use PREFIX for compile tools [$cross_prefix]
1654   --cc=CC                  use C compiler CC [$cc]
1655   --iasl=IASL              use ACPI compiler IASL [$iasl]
1656   --host-cc=CC             use C compiler CC [$host_cc] for code run at
1657                            build time
1658   --cxx=CXX                use C++ compiler CXX [$cxx]
1659   --objcc=OBJCC            use Objective-C compiler OBJCC [$objcc]
1660   --extra-cflags=CFLAGS    append extra C compiler flags QEMU_CFLAGS
1661   --extra-cxxflags=CXXFLAGS append extra C++ compiler flags QEMU_CXXFLAGS
1662   --extra-ldflags=LDFLAGS  append extra linker flags LDFLAGS
1663   --cross-cc-ARCH=CC       use compiler when building ARCH guest test cases
1664   --cross-cc-flags-ARCH=   use compiler flags when building ARCH guest tests
1665   --make=MAKE              use specified make [$make]
1666   --python=PYTHON          use specified python [$python]
1667   --sphinx-build=SPHINX    use specified sphinx-build [$sphinx_build]
1668   --meson=MESON            use specified meson [$meson]
1669   --ninja=NINJA            use specified ninja [$ninja]
1670   --smbd=SMBD              use specified smbd [$smbd]
1671   --with-git=GIT           use specified git [$git]
1672   --static                 enable static build [$static]
1673   --mandir=PATH            install man pages in PATH
1674   --datadir=PATH           install firmware in PATH/$qemu_suffix
1675   --localedir=PATH         install translation in PATH/$qemu_suffix
1676   --docdir=PATH            install documentation in PATH/$qemu_suffix
1677   --bindir=PATH            install binaries in PATH
1678   --libdir=PATH            install libraries in PATH
1679   --libexecdir=PATH        install helper binaries in PATH
1680   --sysconfdir=PATH        install config in PATH/$qemu_suffix
1681   --localstatedir=PATH     install local state in PATH (set at runtime on win32)
1682   --firmwarepath=PATH      search PATH for firmware files
1683   --efi-aarch64=PATH       PATH of efi file to use for aarch64 VMs.
1684   --with-suffix=SUFFIX     suffix for QEMU data inside datadir/libdir/sysconfdir/docdir [$qemu_suffix]
1685   --with-pkgversion=VERS   use specified string as sub-version of the package
1686   --enable-debug           enable common debug build options
1687   --enable-sanitizers      enable default sanitizers
1688   --enable-tsan            enable thread sanitizer
1689   --disable-strip          disable stripping binaries
1690   --disable-werror         disable compilation abort on warning
1691   --disable-stack-protector disable compiler-provided stack protection
1692   --audio-drv-list=LIST    set audio drivers list:
1693                            Available drivers: $audio_possible_drivers
1694   --block-drv-whitelist=L  Same as --block-drv-rw-whitelist=L
1695   --block-drv-rw-whitelist=L
1696                            set block driver read-write whitelist
1697                            (affects only QEMU, not qemu-img)
1698   --block-drv-ro-whitelist=L
1699                            set block driver read-only whitelist
1700                            (affects only QEMU, not qemu-img)
1701   --enable-trace-backends=B Set trace backend
1702                            Available backends: $trace_backend_list
1703   --with-trace-file=NAME   Full PATH,NAME of file to store traces
1704                            Default:trace-<pid>
1705   --disable-slirp          disable SLIRP userspace network connectivity
1706   --enable-tcg-interpreter enable TCG with bytecode interpreter (TCI)
1707   --enable-malloc-trim     enable libc malloc_trim() for memory optimization
1708   --oss-lib                path to OSS library
1709   --cpu=CPU                Build for host CPU [$cpu]
1710   --with-coroutine=BACKEND coroutine backend. Supported options:
1711                            ucontext, sigaltstack, windows
1712   --enable-gcov            enable test coverage analysis with gcov
1713   --disable-blobs          disable installing provided firmware blobs
1714   --with-vss-sdk=SDK-path  enable Windows VSS support in QEMU Guest Agent
1715   --with-win-sdk=SDK-path  path to Windows Platform SDK (to build VSS .tlb)
1716   --tls-priority           default TLS protocol/cipher priority string
1717   --enable-gprof           QEMU profiling with gprof
1718   --enable-profiler        profiler support
1719   --enable-debug-stack-usage
1720                            track the maximum stack usage of stacks created by qemu_alloc_stack
1721   --enable-plugins
1722                            enable plugins via shared library loading
1723   --disable-containers     don't use containers for cross-building
1724   --gdb=GDB-path           gdb to use for gdbstub tests [$gdb_bin]
1725
1726 Optional features, enabled with --enable-FEATURE and
1727 disabled with --disable-FEATURE, default is enabled if available:
1728
1729   system          all system emulation targets
1730   user            supported user emulation targets
1731   linux-user      all linux usermode emulation targets
1732   bsd-user        all BSD usermode emulation targets
1733   docs            build documentation
1734   guest-agent     build the QEMU Guest Agent
1735   guest-agent-msi build guest agent Windows MSI installation package
1736   pie             Position Independent Executables
1737   modules         modules support (non-Windows)
1738   module-upgrades try to load modules from alternate paths for upgrades
1739   debug-tcg       TCG debugging (default is disabled)
1740   debug-info      debugging information
1741   sparse          sparse checker
1742   safe-stack      SafeStack Stack Smash Protection. Depends on
1743                   clang/llvm >= 3.7 and requires coroutine backend ucontext.
1744
1745   gnutls          GNUTLS cryptography support
1746   nettle          nettle cryptography support
1747   gcrypt          libgcrypt cryptography support
1748   auth-pam        PAM access control
1749   sdl             SDL UI
1750   sdl-image       SDL Image support for icons
1751   gtk             gtk UI
1752   vte             vte support for the gtk UI
1753   curses          curses UI
1754   iconv           font glyph conversion support
1755   vnc             VNC UI support
1756   vnc-sasl        SASL encryption for VNC server
1757   vnc-jpeg        JPEG lossy compression for VNC server
1758   vnc-png         PNG compression for VNC server
1759   cocoa           Cocoa UI (Mac OS X only)
1760   virtfs          VirtFS
1761   libudev         Use libudev to enumerate host devices
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 (deprecated)
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 feature_not_found() {
2224   feature=$1
2225   remedy=$2
2226
2227   error_exit "User requested feature $feature" \
2228       "configure was not able to find it." \
2229       "$remedy"
2230 }
2231
2232 # ---
2233 # big/little endian test
2234 cat > $TMPC << EOF
2235 short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, };
2236 short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, };
2237 extern int foo(short *, short *);
2238 int main(int argc, char *argv[]) {
2239     return foo(big_endian, little_endian);
2240 }
2241 EOF
2242
2243 if compile_object ; then
2244     if strings -a $TMPO | grep -q BiGeNdIaN ; then
2245         bigendian="yes"
2246     elif strings -a $TMPO | grep -q LiTtLeEnDiAn ; then
2247         bigendian="no"
2248     else
2249         echo big/little test failed
2250     fi
2251 else
2252     echo big/little test failed
2253 fi
2254
2255 ##########################################
2256 # system tools
2257 if test -z "$want_tools"; then
2258     if test "$softmmu" = "no"; then
2259         want_tools=no
2260     else
2261         want_tools=yes
2262     fi
2263 fi
2264
2265 ##########################################
2266 # cocoa implies not SDL or GTK
2267 # (the cocoa UI code currently assumes it is always the active UI
2268 # and doesn't interact well with other UI frontend code)
2269 if test "$cocoa" = "enabled"; then
2270     if test "$sdl" = "enabled"; then
2271         error_exit "Cocoa and SDL UIs cannot both be enabled at once"
2272     fi
2273     if test "$gtk" = "yes"; then
2274         error_exit "Cocoa and GTK UIs cannot both be enabled at once"
2275     fi
2276     gtk=no
2277     sdl=disabled
2278 fi
2279
2280 # Some versions of Mac OS X incorrectly define SIZE_MAX
2281 cat > $TMPC << EOF
2282 #include <stdint.h>
2283 #include <stdio.h>
2284 int main(int argc, char *argv[]) {
2285     return printf("%zu", SIZE_MAX);
2286 }
2287 EOF
2288 have_broken_size_max=no
2289 if ! compile_object -Werror ; then
2290     have_broken_size_max=yes
2291 fi
2292
2293 ##########################################
2294 # L2TPV3 probe
2295
2296 cat > $TMPC <<EOF
2297 #include <sys/socket.h>
2298 #include <linux/ip.h>
2299 int main(void) { return sizeof(struct mmsghdr); }
2300 EOF
2301 if compile_prog "" "" ; then
2302   l2tpv3=yes
2303 else
2304   l2tpv3=no
2305 fi
2306
2307 if check_include "pty.h" ; then
2308   pty_h=yes
2309 else
2310   pty_h=no
2311 fi
2312
2313 cat > $TMPC <<EOF
2314 #include <sys/mman.h>
2315 int main(int argc, char *argv[]) {
2316     return mlockall(MCL_FUTURE);
2317 }
2318 EOF
2319 if compile_prog "" "" ; then
2320   have_mlockall=yes
2321 else
2322   have_mlockall=no
2323 fi
2324
2325 #########################################
2326 # vhost interdependencies and host support
2327
2328 # vhost backends
2329 test "$vhost_user" = "" && vhost_user=yes
2330 if test "$vhost_user" = "yes" && test "$mingw32" = "yes"; then
2331   error_exit "vhost-user isn't available on win32"
2332 fi
2333 test "$vhost_vdpa" = "" && vhost_vdpa=$linux
2334 if test "$vhost_vdpa" = "yes" && test "$linux" != "yes"; then
2335   error_exit "vhost-vdpa is only available on Linux"
2336 fi
2337 test "$vhost_kernel" = "" && vhost_kernel=$linux
2338 if test "$vhost_kernel" = "yes" && test "$linux" != "yes"; then
2339   error_exit "vhost-kernel is only available on Linux"
2340 fi
2341
2342 # vhost-kernel devices
2343 test "$vhost_scsi" = "" && vhost_scsi=$vhost_kernel
2344 if test "$vhost_scsi" = "yes" && test "$vhost_kernel" != "yes"; then
2345   error_exit "--enable-vhost-scsi requires --enable-vhost-kernel"
2346 fi
2347 test "$vhost_vsock" = "" && vhost_vsock=$vhost_kernel
2348 if test "$vhost_vsock" = "yes" && test "$vhost_kernel" != "yes"; then
2349   error_exit "--enable-vhost-vsock requires --enable-vhost-kernel"
2350 fi
2351
2352 # vhost-user backends
2353 test "$vhost_net_user" = "" && vhost_net_user=$vhost_user
2354 if test "$vhost_net_user" = "yes" && test "$vhost_user" = "no"; then
2355   error_exit "--enable-vhost-net-user requires --enable-vhost-user"
2356 fi
2357 test "$vhost_crypto" = "" && vhost_crypto=$vhost_user
2358 if test "$vhost_crypto" = "yes" && test "$vhost_user" = "no"; then
2359   error_exit "--enable-vhost-crypto requires --enable-vhost-user"
2360 fi
2361 test "$vhost_user_fs" = "" && vhost_user_fs=$vhost_user
2362 if test "$vhost_user_fs" = "yes" && test "$vhost_user" = "no"; then
2363   error_exit "--enable-vhost-user-fs requires --enable-vhost-user"
2364 fi
2365 #vhost-vdpa backends
2366 test "$vhost_net_vdpa" = "" && vhost_net_vdpa=$vhost_vdpa
2367 if test "$vhost_net_vdpa" = "yes" && test "$vhost_vdpa" = "no"; then
2368   error_exit "--enable-vhost-net-vdpa requires --enable-vhost-vdpa"
2369 fi
2370
2371 # OR the vhost-kernel, vhost-vdpa and vhost-user values for simplicity
2372 if test "$vhost_net" = ""; then
2373   test "$vhost_net_user" = "yes" && vhost_net=yes
2374   test "$vhost_net_vdpa" = "yes" && vhost_net=yes
2375   test "$vhost_kernel" = "yes" && vhost_net=yes
2376 fi
2377
2378 ##########################################
2379 # pkg-config probe
2380
2381 if ! has "$pkg_config_exe"; then
2382   error_exit "pkg-config binary '$pkg_config_exe' not found"
2383 fi
2384
2385 ##########################################
2386 # NPTL probe
2387
2388 if test "$linux_user" = "yes"; then
2389   cat > $TMPC <<EOF
2390 #include <sched.h>
2391 #include <linux/futex.h>
2392 int main(void) {
2393 #if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
2394 #error bork
2395 #endif
2396   return 0;
2397 }
2398 EOF
2399   if ! compile_object ; then
2400     feature_not_found "nptl" "Install glibc and linux kernel headers."
2401   fi
2402 fi
2403
2404 ##########################################
2405 # lzo check
2406
2407 if test "$lzo" != "no" ; then
2408     cat > $TMPC << EOF
2409 #include <lzo/lzo1x.h>
2410 int main(void) { lzo_version(); return 0; }
2411 EOF
2412     if compile_prog "" "-llzo2" ; then
2413         lzo_libs="-llzo2"
2414         lzo="yes"
2415     else
2416         if test "$lzo" = "yes"; then
2417             feature_not_found "liblzo2" "Install liblzo2 devel"
2418         fi
2419         lzo="no"
2420     fi
2421 fi
2422
2423 ##########################################
2424 # snappy check
2425
2426 if test "$snappy" != "no" ; then
2427     cat > $TMPC << EOF
2428 #include <snappy-c.h>
2429 int main(void) { snappy_max_compressed_length(4096); return 0; }
2430 EOF
2431     if compile_prog "" "-lsnappy" ; then
2432         snappy_libs='-lsnappy'
2433         snappy="yes"
2434     else
2435         if test "$snappy" = "yes"; then
2436             feature_not_found "libsnappy" "Install libsnappy devel"
2437         fi
2438         snappy="no"
2439     fi
2440 fi
2441
2442 ##########################################
2443 # bzip2 check
2444
2445 if test "$bzip2" != "no" ; then
2446     cat > $TMPC << EOF
2447 #include <bzlib.h>
2448 int main(void) { BZ2_bzlibVersion(); return 0; }
2449 EOF
2450     if compile_prog "" "-lbz2" ; then
2451         bzip2="yes"
2452     else
2453         if test "$bzip2" = "yes"; then
2454             feature_not_found "libbzip2" "Install libbzip2 devel"
2455         fi
2456         bzip2="no"
2457     fi
2458 fi
2459
2460 ##########################################
2461 # lzfse check
2462
2463 if test "$lzfse" != "no" ; then
2464     cat > $TMPC << EOF
2465 #include <lzfse.h>
2466 int main(void) { lzfse_decode_scratch_size(); return 0; }
2467 EOF
2468     if compile_prog "" "-llzfse" ; then
2469         lzfse="yes"
2470     else
2471         if test "$lzfse" = "yes"; then
2472             feature_not_found "lzfse" "Install lzfse devel"
2473         fi
2474         lzfse="no"
2475     fi
2476 fi
2477
2478 ##########################################
2479 # zstd check
2480
2481 if test "$zstd" != "no" ; then
2482     libzstd_minver="1.4.0"
2483     if $pkg_config --atleast-version=$libzstd_minver libzstd ; then
2484         zstd_cflags="$($pkg_config --cflags libzstd)"
2485         zstd_libs="$($pkg_config --libs libzstd)"
2486         zstd="yes"
2487     else
2488         if test "$zstd" = "yes" ; then
2489             feature_not_found "libzstd" "Install libzstd devel"
2490         fi
2491         zstd="no"
2492     fi
2493 fi
2494
2495 ##########################################
2496 # libseccomp check
2497
2498 if test "$seccomp" != "no" ; then
2499     libseccomp_minver="2.3.0"
2500     if $pkg_config --atleast-version=$libseccomp_minver libseccomp ; then
2501         seccomp_cflags="$($pkg_config --cflags libseccomp)"
2502         seccomp_libs="$($pkg_config --libs libseccomp)"
2503         seccomp="yes"
2504     else
2505         if test "$seccomp" = "yes" ; then
2506             feature_not_found "libseccomp" \
2507                  "Install libseccomp devel >= $libseccomp_minver"
2508         fi
2509         seccomp="no"
2510     fi
2511 fi
2512
2513 ##########################################
2514 # xen probe
2515
2516 if test "$xen" != "disabled" ; then
2517   # Check whether Xen library path is specified via --extra-ldflags to avoid
2518   # overriding this setting with pkg-config output. If not, try pkg-config
2519   # to obtain all needed flags.
2520
2521   if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
2522      $pkg_config --exists xencontrol ; then
2523     xen_ctrl_version="$(printf '%d%02d%02d' \
2524       $($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
2525     xen=enabled
2526     xen_pc="xencontrol xenstore xenforeignmemory xengnttab"
2527     xen_pc="$xen_pc xenevtchn xendevicemodel"
2528     if $pkg_config --exists xentoolcore; then
2529       xen_pc="$xen_pc xentoolcore"
2530     fi
2531     xen_cflags="$($pkg_config --cflags $xen_pc)"
2532     xen_libs="$($pkg_config --libs $xen_pc)"
2533   else
2534
2535     xen_libs="-lxenstore -lxenctrl"
2536     xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
2537
2538     # First we test whether Xen headers and libraries are available.
2539     # If no, we are done and there is no Xen support.
2540     # If yes, more tests are run to detect the Xen version.
2541
2542     # Xen (any)
2543     cat > $TMPC <<EOF
2544 #include <xenctrl.h>
2545 int main(void) {
2546   return 0;
2547 }
2548 EOF
2549     if ! compile_prog "" "$xen_libs" ; then
2550       # Xen not found
2551       if test "$xen" = "enabled" ; then
2552         feature_not_found "xen" "Install xen devel"
2553       fi
2554       xen=disabled
2555
2556     # Xen unstable
2557     elif
2558         cat > $TMPC <<EOF &&
2559 #undef XC_WANT_COMPAT_DEVICEMODEL_API
2560 #define __XEN_TOOLS__
2561 #include <xendevicemodel.h>
2562 #include <xenforeignmemory.h>
2563 int main(void) {
2564   xendevicemodel_handle *xd;
2565   xenforeignmemory_handle *xfmem;
2566
2567   xd = xendevicemodel_open(0, 0);
2568   xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
2569
2570   xfmem = xenforeignmemory_open(0, 0);
2571   xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
2572
2573   return 0;
2574 }
2575 EOF
2576         compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2577       then
2578       xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2579       xen_ctrl_version=41100
2580       xen=enabled
2581     elif
2582         cat > $TMPC <<EOF &&
2583 #undef XC_WANT_COMPAT_MAP_FOREIGN_API
2584 #include <xenforeignmemory.h>
2585 #include <xentoolcore.h>
2586 int main(void) {
2587   xenforeignmemory_handle *xfmem;
2588
2589   xfmem = xenforeignmemory_open(0, 0);
2590   xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
2591   xentoolcore_restrict_all(0);
2592
2593   return 0;
2594 }
2595 EOF
2596         compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2597       then
2598       xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2599       xen_ctrl_version=41000
2600       xen=enabled
2601     elif
2602         cat > $TMPC <<EOF &&
2603 #undef XC_WANT_COMPAT_DEVICEMODEL_API
2604 #define __XEN_TOOLS__
2605 #include <xendevicemodel.h>
2606 int main(void) {
2607   xendevicemodel_handle *xd;
2608
2609   xd = xendevicemodel_open(0, 0);
2610   xendevicemodel_close(xd);
2611
2612   return 0;
2613 }
2614 EOF
2615         compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
2616       then
2617       xen_stable_libs="-lxendevicemodel $xen_stable_libs"
2618       xen_ctrl_version=40900
2619       xen=enabled
2620     elif
2621         cat > $TMPC <<EOF &&
2622 /*
2623  * If we have stable libs the we don't want the libxc compat
2624  * layers, regardless of what CFLAGS we may have been given.
2625  *
2626  * Also, check if xengnttab_grant_copy_segment_t is defined and
2627  * grant copy operation is implemented.
2628  */
2629 #undef XC_WANT_COMPAT_EVTCHN_API
2630 #undef XC_WANT_COMPAT_GNTTAB_API
2631 #undef XC_WANT_COMPAT_MAP_FOREIGN_API
2632 #include <xenctrl.h>
2633 #include <xenstore.h>
2634 #include <xenevtchn.h>
2635 #include <xengnttab.h>
2636 #include <xenforeignmemory.h>
2637 #include <stdint.h>
2638 #include <xen/hvm/hvm_info_table.h>
2639 #if !defined(HVM_MAX_VCPUS)
2640 # error HVM_MAX_VCPUS not defined
2641 #endif
2642 int main(void) {
2643   xc_interface *xc = NULL;
2644   xenforeignmemory_handle *xfmem;
2645   xenevtchn_handle *xe;
2646   xengnttab_handle *xg;
2647   xengnttab_grant_copy_segment_t* seg = NULL;
2648
2649   xs_daemon_open();
2650
2651   xc = xc_interface_open(0, 0, 0);
2652   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2653   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2654   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2655   xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2656
2657   xfmem = xenforeignmemory_open(0, 0);
2658   xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2659
2660   xe = xenevtchn_open(0, 0);
2661   xenevtchn_fd(xe);
2662
2663   xg = xengnttab_open(0, 0);
2664   xengnttab_grant_copy(xg, 0, seg);
2665
2666   return 0;
2667 }
2668 EOF
2669         compile_prog "" "$xen_libs $xen_stable_libs"
2670       then
2671       xen_ctrl_version=40800
2672       xen=enabled
2673     elif
2674         cat > $TMPC <<EOF &&
2675 /*
2676  * If we have stable libs the we don't want the libxc compat
2677  * layers, regardless of what CFLAGS we may have been given.
2678  */
2679 #undef XC_WANT_COMPAT_EVTCHN_API
2680 #undef XC_WANT_COMPAT_GNTTAB_API
2681 #undef XC_WANT_COMPAT_MAP_FOREIGN_API
2682 #include <xenctrl.h>
2683 #include <xenstore.h>
2684 #include <xenevtchn.h>
2685 #include <xengnttab.h>
2686 #include <xenforeignmemory.h>
2687 #include <stdint.h>
2688 #include <xen/hvm/hvm_info_table.h>
2689 #if !defined(HVM_MAX_VCPUS)
2690 # error HVM_MAX_VCPUS not defined
2691 #endif
2692 int main(void) {
2693   xc_interface *xc = NULL;
2694   xenforeignmemory_handle *xfmem;
2695   xenevtchn_handle *xe;
2696   xengnttab_handle *xg;
2697
2698   xs_daemon_open();
2699
2700   xc = xc_interface_open(0, 0, 0);
2701   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2702   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2703   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2704   xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2705
2706   xfmem = xenforeignmemory_open(0, 0);
2707   xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2708
2709   xe = xenevtchn_open(0, 0);
2710   xenevtchn_fd(xe);
2711
2712   xg = xengnttab_open(0, 0);
2713   xengnttab_map_grant_ref(xg, 0, 0, 0);
2714
2715   return 0;
2716 }
2717 EOF
2718         compile_prog "" "$xen_libs $xen_stable_libs"
2719       then
2720       xen_ctrl_version=40701
2721       xen=enabled
2722
2723     # Xen 4.6
2724     elif
2725         cat > $TMPC <<EOF &&
2726 #include <xenctrl.h>
2727 #include <xenstore.h>
2728 #include <stdint.h>
2729 #include <xen/hvm/hvm_info_table.h>
2730 #if !defined(HVM_MAX_VCPUS)
2731 # error HVM_MAX_VCPUS not defined
2732 #endif
2733 int main(void) {
2734   xc_interface *xc;
2735   xs_daemon_open();
2736   xc = xc_interface_open(0, 0, 0);
2737   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2738   xc_gnttab_open(NULL, 0);
2739   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2740   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2741   xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2742   xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
2743   return 0;
2744 }
2745 EOF
2746         compile_prog "" "$xen_libs"
2747       then
2748       xen_ctrl_version=40600
2749       xen=enabled
2750
2751     # Xen 4.5
2752     elif
2753         cat > $TMPC <<EOF &&
2754 #include <xenctrl.h>
2755 #include <xenstore.h>
2756 #include <stdint.h>
2757 #include <xen/hvm/hvm_info_table.h>
2758 #if !defined(HVM_MAX_VCPUS)
2759 # error HVM_MAX_VCPUS not defined
2760 #endif
2761 int main(void) {
2762   xc_interface *xc;
2763   xs_daemon_open();
2764   xc = xc_interface_open(0, 0, 0);
2765   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2766   xc_gnttab_open(NULL, 0);
2767   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2768   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2769   xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
2770   return 0;
2771 }
2772 EOF
2773         compile_prog "" "$xen_libs"
2774       then
2775       xen_ctrl_version=40500
2776       xen=enabled
2777
2778     elif
2779         cat > $TMPC <<EOF &&
2780 #include <xenctrl.h>
2781 #include <xenstore.h>
2782 #include <stdint.h>
2783 #include <xen/hvm/hvm_info_table.h>
2784 #if !defined(HVM_MAX_VCPUS)
2785 # error HVM_MAX_VCPUS not defined
2786 #endif
2787 int main(void) {
2788   xc_interface *xc;
2789   xs_daemon_open();
2790   xc = xc_interface_open(0, 0, 0);
2791   xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2792   xc_gnttab_open(NULL, 0);
2793   xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2794   xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2795   return 0;
2796 }
2797 EOF
2798         compile_prog "" "$xen_libs"
2799       then
2800       xen_ctrl_version=40200
2801       xen=enabled
2802
2803     else
2804       if test "$xen" = "enabled" ; then
2805         feature_not_found "xen (unsupported version)" \
2806                           "Install a supported xen (xen 4.2 or newer)"
2807       fi
2808       xen=disabled
2809     fi
2810
2811     if test "$xen" = enabled; then
2812       if test $xen_ctrl_version -ge 40701  ; then
2813         xen_libs="$xen_libs $xen_stable_libs "
2814       fi
2815     fi
2816   fi
2817 fi
2818
2819 if test "$xen_pci_passthrough" != "disabled"; then
2820   if test "$xen" = "enabled" && test "$linux" = "yes"; then
2821     xen_pci_passthrough=enabled
2822   else
2823     if test "$xen_pci_passthrough" = "enabled"; then
2824       error_exit "User requested feature Xen PCI Passthrough" \
2825           " but this feature requires /sys from Linux"
2826     fi
2827     xen_pci_passthrough=disabled
2828   fi
2829 fi
2830
2831 ##########################################
2832 # gettext probe
2833 if test "$gettext" != "false" ; then
2834   if has xgettext; then
2835     gettext=true
2836   else
2837     if test "$gettext" = "true" ; then
2838       feature_not_found "gettext" "Install xgettext binary"
2839     fi
2840     gettext=false
2841   fi
2842 fi
2843
2844 ##########################################
2845 # X11 probe
2846 if $pkg_config --exists "x11"; then
2847     have_x11=yes
2848     x11_cflags=$($pkg_config --cflags x11)
2849     x11_libs=$($pkg_config --libs x11)
2850 fi
2851
2852 ##########################################
2853 # GTK probe
2854
2855 if test "$gtk" != "no"; then
2856     gtkpackage="gtk+-3.0"
2857     gtkx11package="gtk+-x11-3.0"
2858     gtkversion="3.22.0"
2859     if $pkg_config --exists "$gtkpackage >= $gtkversion"; then
2860         gtk_cflags=$($pkg_config --cflags $gtkpackage)
2861         gtk_libs=$($pkg_config --libs $gtkpackage)
2862         gtk_version=$($pkg_config --modversion $gtkpackage)
2863         if $pkg_config --exists "$gtkx11package >= $gtkversion"; then
2864             need_x11=yes
2865             gtk_cflags="$gtk_cflags $x11_cflags"
2866             gtk_libs="$gtk_libs $x11_libs"
2867         fi
2868         gtk="yes"
2869     elif test "$gtk" = "yes"; then
2870         feature_not_found "gtk" "Install gtk3-devel"
2871     else
2872         gtk="no"
2873     fi
2874 fi
2875
2876
2877 ##########################################
2878 # GNUTLS probe
2879
2880 if test "$gnutls" != "no"; then
2881     pass="no"
2882     if $pkg_config --exists "gnutls >= 3.1.18"; then
2883         gnutls_cflags=$($pkg_config --cflags gnutls)
2884         gnutls_libs=$($pkg_config --libs gnutls)
2885         # Packaging for the static libraries is not always correct.
2886         # At least ubuntu 18.04 ships only shared libraries.
2887         write_c_skeleton
2888         if compile_prog "" "$gnutls_libs" ; then
2889             pass="yes"
2890         fi
2891     fi
2892     if test "$pass" = "no" && test "$gnutls" = "yes"; then
2893         feature_not_found "gnutls" "Install gnutls devel >= 3.1.18"
2894     else
2895         gnutls="$pass"
2896     fi
2897 fi
2898
2899
2900 # If user didn't give a --disable/enable-gcrypt flag,
2901 # then mark as disabled if user requested nettle
2902 # explicitly
2903 if test -z "$gcrypt"
2904 then
2905     if test "$nettle" = "yes"
2906     then
2907         gcrypt="no"
2908     fi
2909 fi
2910
2911 # If user didn't give a --disable/enable-nettle flag,
2912 # then mark as disabled if user requested gcrypt
2913 # explicitly
2914 if test -z "$nettle"
2915 then
2916     if test "$gcrypt" = "yes"
2917     then
2918         nettle="no"
2919     fi
2920 fi
2921
2922 has_libgcrypt() {
2923     if ! has "libgcrypt-config"
2924     then
2925         return 1
2926     fi
2927
2928     if test -n "$cross_prefix"
2929     then
2930         host=$(libgcrypt-config --host)
2931         if test "$host-" != $cross_prefix
2932         then
2933             return 1
2934         fi
2935     fi
2936
2937     maj=`libgcrypt-config --version | awk -F . '{print $1}'`
2938     min=`libgcrypt-config --version | awk -F . '{print $2}'`
2939
2940     if test $maj != 1 || test $min -lt 5
2941     then
2942        return 1
2943     fi
2944
2945     return 0
2946 }
2947
2948
2949 if test "$nettle" != "no"; then
2950     pass="no"
2951     if $pkg_config --exists "nettle >= 2.7.1"; then
2952         nettle_cflags=$($pkg_config --cflags nettle)
2953         nettle_libs=$($pkg_config --libs nettle)
2954         nettle_version=$($pkg_config --modversion nettle)
2955         # Link test to make sure the given libraries work (e.g for static).
2956         write_c_skeleton
2957         if compile_prog "" "$nettle_libs" ; then
2958             if test -z "$gcrypt"; then
2959                gcrypt="no"
2960             fi
2961             pass="yes"
2962         fi
2963     fi
2964     if test "$pass" = "yes"
2965     then
2966         cat > $TMPC << EOF
2967 #include <nettle/xts.h>
2968 int main(void) {
2969   return 0;
2970 }
2971 EOF
2972         if compile_prog "$nettle_cflags" "$nettle_libs" ; then
2973             nettle_xts=yes
2974             qemu_private_xts=no
2975         fi
2976     fi
2977     if test "$pass" = "no" && test "$nettle" = "yes"; then
2978         feature_not_found "nettle" "Install nettle devel >= 2.7.1"
2979     else
2980         nettle="$pass"
2981     fi
2982 fi
2983
2984 if test "$gcrypt" != "no"; then
2985     pass="no"
2986     if has_libgcrypt; then
2987         gcrypt_cflags=$(libgcrypt-config --cflags)
2988         gcrypt_libs=$(libgcrypt-config --libs)
2989         # Debian has removed -lgpg-error from libgcrypt-config
2990         # as it "spreads unnecessary dependencies" which in
2991         # turn breaks static builds...
2992         if test "$static" = "yes"
2993         then
2994             gcrypt_libs="$gcrypt_libs -lgpg-error"
2995         fi
2996
2997         # Link test to make sure the given libraries work (e.g for static).
2998         write_c_skeleton
2999         if compile_prog "" "$gcrypt_libs" ; then
3000             pass="yes"
3001         fi
3002     fi
3003     if test "$pass" = "yes"; then
3004         gcrypt="yes"
3005         cat > $TMPC << EOF
3006 #include <gcrypt.h>
3007 int main(void) {
3008   gcry_mac_hd_t handle;
3009   gcry_mac_open(&handle, GCRY_MAC_HMAC_MD5,
3010                 GCRY_MAC_FLAG_SECURE, NULL);
3011   return 0;
3012 }
3013 EOF
3014         if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
3015             gcrypt_hmac=yes
3016         fi
3017         cat > $TMPC << EOF
3018 #include <gcrypt.h>
3019 int main(void) {
3020   gcry_cipher_hd_t handle;
3021   gcry_cipher_open(&handle, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_XTS, 0);
3022   return 0;
3023 }
3024 EOF
3025         if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
3026             gcrypt_xts=yes
3027             qemu_private_xts=no
3028         fi
3029     elif test "$gcrypt" = "yes"; then
3030         feature_not_found "gcrypt" "Install gcrypt devel >= 1.5.0"
3031     else
3032         gcrypt="no"
3033     fi
3034 fi
3035
3036
3037 if test "$gcrypt" = "yes" && test "$nettle" = "yes"
3038 then
3039     error_exit "Only one of gcrypt & nettle can be enabled"
3040 fi
3041
3042 ##########################################
3043 # libtasn1 - only for the TLS creds/session test suite
3044
3045 tasn1=yes
3046 tasn1_cflags=""
3047 tasn1_libs=""
3048 if $pkg_config --exists "libtasn1"; then
3049     tasn1_cflags=$($pkg_config --cflags libtasn1)
3050     tasn1_libs=$($pkg_config --libs libtasn1)
3051 else
3052     tasn1=no
3053 fi
3054
3055
3056 ##########################################
3057 # PAM probe
3058
3059 if test "$auth_pam" != "no"; then
3060     cat > $TMPC <<EOF
3061 #include <security/pam_appl.h>
3062 #include <stdio.h>
3063 int main(void) {
3064    const char *service_name = "qemu";
3065    const char *user = "frank";
3066    const struct pam_conv pam_conv = { 0 };
3067    pam_handle_t *pamh = NULL;
3068    pam_start(service_name, user, &pam_conv, &pamh);
3069    return 0;
3070 }
3071 EOF
3072     if compile_prog "" "-lpam" ; then
3073         auth_pam=yes
3074     else
3075         if test "$auth_pam" = "yes"; then
3076             feature_not_found "PAM" "Install PAM development package"
3077         else
3078             auth_pam=no
3079         fi
3080     fi
3081 fi
3082
3083 ##########################################
3084 # getifaddrs (for tests/test-io-channel-socket )
3085
3086 have_ifaddrs_h=yes
3087 if ! check_include "ifaddrs.h" ; then
3088   have_ifaddrs_h=no
3089 fi
3090
3091 #########################################
3092 # libdrm check
3093 have_drm_h=no
3094 if check_include "libdrm/drm.h" ; then
3095     have_drm_h=yes
3096 fi
3097
3098 #########################################
3099 # sys/signal.h check
3100 have_sys_signal_h=no
3101 if check_include "sys/signal.h" ; then
3102   have_sys_signal_h=yes
3103 fi
3104
3105 ##########################################
3106 # VTE probe
3107
3108 if test "$vte" != "no"; then
3109     vteminversion="0.32.0"
3110     if $pkg_config --exists "vte-2.91"; then
3111       vtepackage="vte-2.91"
3112     else
3113       vtepackage="vte-2.90"
3114     fi
3115     if $pkg_config --exists "$vtepackage >= $vteminversion"; then
3116         vte_cflags=$($pkg_config --cflags $vtepackage)
3117         vte_libs=$($pkg_config --libs $vtepackage)
3118         vteversion=$($pkg_config --modversion $vtepackage)
3119         vte="yes"
3120     elif test "$vte" = "yes"; then
3121         feature_not_found "vte" "Install libvte-2.90/2.91 devel"
3122     else
3123         vte="no"
3124     fi
3125 fi
3126
3127 ##########################################
3128 # RDMA needs OpenFabrics libraries
3129 if test "$rdma" != "no" ; then
3130   cat > $TMPC <<EOF
3131 #include <rdma/rdma_cma.h>
3132 int main(void) { return 0; }
3133 EOF
3134   rdma_libs="-lrdmacm -libverbs -libumad"
3135   if compile_prog "" "$rdma_libs" ; then
3136     rdma="yes"
3137   else
3138     if test "$rdma" = "yes" ; then
3139         error_exit \
3140             " OpenFabrics librdmacm/libibverbs/libibumad not present." \
3141             " Your options:" \
3142             "  (1) Fast: Install infiniband packages (devel) from your distro." \
3143             "  (2) Cleanest: Install libraries from www.openfabrics.org" \
3144             "  (3) Also: Install softiwarp if you don't have RDMA hardware"
3145     fi
3146     rdma="no"
3147   fi
3148 fi
3149
3150 ##########################################
3151 # PVRDMA detection
3152
3153 cat > $TMPC <<EOF &&
3154 #include <sys/mman.h>
3155
3156 int
3157 main(void)
3158 {
3159     char buf = 0;
3160     void *addr = &buf;
3161     addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
3162
3163     return 0;
3164 }
3165 EOF
3166
3167 if test "$rdma" = "yes" ; then
3168     case "$pvrdma" in
3169     "")
3170         if compile_prog "" ""; then
3171             pvrdma="yes"
3172         else
3173             pvrdma="no"
3174         fi
3175         ;;
3176     "yes")
3177         if ! compile_prog "" ""; then
3178             error_exit "PVRDMA is not supported since mremap is not implemented"
3179         fi
3180         pvrdma="yes"
3181         ;;
3182     "no")
3183         pvrdma="no"
3184         ;;
3185     esac
3186 else
3187     if test "$pvrdma" = "yes" ; then
3188         error_exit "PVRDMA requires rdma suppport"
3189     fi
3190     pvrdma="no"
3191 fi
3192
3193 # Let's see if enhanced reg_mr is supported
3194 if test "$pvrdma" = "yes" ; then
3195
3196 cat > $TMPC <<EOF &&
3197 #include <infiniband/verbs.h>
3198
3199 int
3200 main(void)
3201 {
3202     struct ibv_mr *mr;
3203     struct ibv_pd *pd = NULL;
3204     size_t length = 10;
3205     uint64_t iova = 0;
3206     int access = 0;
3207     void *addr = NULL;
3208
3209     mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
3210
3211     ibv_dereg_mr(mr);
3212
3213     return 0;
3214 }
3215 EOF
3216     if ! compile_prog "" "-libverbs"; then
3217         QEMU_CFLAGS="$QEMU_CFLAGS -DLEGACY_RDMA_REG_MR"
3218     fi
3219 fi
3220
3221 ##########################################
3222 # xfsctl() probe, used for file-posix.c
3223 if test "$xfs" != "no" ; then
3224   cat > $TMPC << EOF
3225 #include <stddef.h>  /* NULL */
3226 #include <xfs/xfs.h>
3227 int main(void)
3228 {
3229     xfsctl(NULL, 0, 0, NULL);
3230     return 0;
3231 }
3232 EOF
3233   if compile_prog "" "" ; then
3234     xfs="yes"
3235   else
3236     if test "$xfs" = "yes" ; then
3237       feature_not_found "xfs" "Install xfsprogs/xfslibs devel"
3238     fi
3239     xfs=no
3240   fi
3241 fi
3242
3243 ##########################################
3244 # vde libraries probe
3245 if test "$vde" != "no" ; then
3246   vde_libs="-lvdeplug"
3247   cat > $TMPC << EOF
3248 #include <libvdeplug.h>
3249 int main(void)
3250 {
3251     struct vde_open_args a = {0, 0, 0};
3252     char s[] = "";
3253     vde_open(s, s, &a);
3254     return 0;
3255 }
3256 EOF
3257   if compile_prog "" "$vde_libs" ; then
3258     vde=yes
3259   else
3260     if test "$vde" = "yes" ; then
3261       feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
3262     fi
3263     vde=no
3264   fi
3265 fi
3266
3267 ##########################################
3268 # netmap support probe
3269 # Apart from looking for netmap headers, we make sure that the host API version
3270 # supports the netmap backend (>=11). The upper bound (15) is meant to simulate
3271 # a minor/major version number. Minor new features will be marked with values up
3272 # to 15, and if something happens that requires a change to the backend we will
3273 # move above 15, submit the backend fixes and modify this two bounds.
3274 if test "$netmap" != "no" ; then
3275   cat > $TMPC << EOF
3276 #include <inttypes.h>
3277 #include <net/if.h>
3278 #include <net/netmap.h>
3279 #include <net/netmap_user.h>
3280 #if (NETMAP_API < 11) || (NETMAP_API > 15)
3281 #error
3282 #endif
3283 int main(void) { return 0; }
3284 EOF
3285   if compile_prog "" "" ; then
3286     netmap=yes
3287   else
3288     if test "$netmap" = "yes" ; then
3289       feature_not_found "netmap"
3290     fi
3291     netmap=no
3292   fi
3293 fi
3294
3295 ##########################################
3296 # libcap-ng library probe
3297 if test "$cap_ng" != "no" ; then
3298   cap_libs="-lcap-ng"
3299   cat > $TMPC << EOF
3300 #include <cap-ng.h>
3301 int main(void)
3302 {
3303     capng_capability_to_name(CAPNG_EFFECTIVE);
3304     return 0;
3305 }
3306 EOF
3307   if compile_prog "" "$cap_libs" ; then
3308     cap_ng=yes
3309   else
3310     if test "$cap_ng" = "yes" ; then
3311       feature_not_found "cap_ng" "Install libcap-ng devel"
3312     fi
3313     cap_ng=no
3314   fi
3315 fi
3316
3317 ##########################################
3318 # Sound support libraries probe
3319
3320 audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
3321 for drv in $audio_drv_list; do
3322     case $drv in
3323     alsa | try-alsa)
3324     if $pkg_config alsa --exists; then
3325         alsa_libs=$($pkg_config alsa --libs)
3326         alsa_cflags=$($pkg_config alsa --cflags)
3327         alsa=yes
3328         if test "$drv" = "try-alsa"; then
3329             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa/alsa/')
3330         fi
3331     else
3332         if test "$drv" = "try-alsa"; then
3333             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa//')
3334         else
3335             error_exit "$drv check failed" \
3336                 "Make sure to have the $drv libs and headers installed."
3337         fi
3338     fi
3339     ;;
3340
3341     pa | try-pa)
3342     if $pkg_config libpulse --exists; then
3343         libpulse=yes
3344         pulse_libs=$($pkg_config libpulse --libs)
3345         pulse_cflags=$($pkg_config libpulse --cflags)
3346         if test "$drv" = "try-pa"; then
3347             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa/pa/')
3348         fi
3349     else
3350         if test "$drv" = "try-pa"; then
3351             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa//')
3352         else
3353             error_exit "$drv check failed" \
3354                 "Make sure to have the $drv libs and headers installed."
3355         fi
3356     fi
3357     ;;
3358
3359     sdl)
3360     if test "$sdl" = "no"; then
3361         error_exit "sdl not found or disabled, can not use sdl audio driver"
3362     fi
3363     ;;
3364
3365     try-sdl)
3366     if test "$sdl" = "no"; then
3367         audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl//')
3368     else
3369         audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl/sdl/')
3370     fi
3371     ;;
3372
3373     coreaudio)
3374       coreaudio_libs="-framework CoreAudio"
3375     ;;
3376
3377     dsound)
3378       dsound_libs="-lole32 -ldxguid"
3379       audio_win_int="yes"
3380     ;;
3381
3382     oss)
3383       oss_libs="$oss_lib"
3384     ;;
3385
3386     jack | try-jack)
3387     if $pkg_config jack --exists; then
3388         libjack=yes
3389         jack_libs=$($pkg_config jack --libs)
3390         if test "$drv" = "try-jack"; then
3391             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack/jack/')
3392         fi
3393     else
3394         if test "$drv" = "try-jack"; then
3395             audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack//')
3396         else
3397             error_exit "$drv check failed" \
3398                 "Make sure to have the $drv libs and headers installed."
3399         fi
3400     fi
3401     ;;
3402
3403     *)
3404     echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
3405         error_exit "Unknown driver '$drv' selected" \
3406             "Possible drivers are: $audio_possible_drivers"
3407     }
3408     ;;
3409     esac
3410 done
3411
3412 ##########################################
3413 # BrlAPI probe
3414
3415 if test "$brlapi" != "no" ; then
3416   brlapi_libs="-lbrlapi"
3417   cat > $TMPC << EOF
3418 #include <brlapi.h>
3419 #include <stddef.h>
3420 int main( void ) { return brlapi__openConnection (NULL, NULL, NULL); }
3421 EOF
3422   if compile_prog "" "$brlapi_libs" ; then
3423     brlapi=yes
3424   else
3425     if test "$brlapi" = "yes" ; then
3426       feature_not_found "brlapi" "Install brlapi devel"
3427     fi
3428     brlapi=no
3429   fi
3430 fi
3431
3432 ##########################################
3433 # curl probe
3434 if test "$curl" != "no" ; then
3435   if $pkg_config libcurl --exists; then
3436     curlconfig="$pkg_config libcurl"
3437   else
3438     curlconfig=curl-config
3439   fi
3440   cat > $TMPC << EOF
3441 #include <curl/curl.h>
3442 int main(void) { curl_easy_init(); curl_multi_setopt(0, 0, 0); return 0; }
3443 EOF
3444   curl_cflags=$($curlconfig --cflags 2>/dev/null)
3445   curl_libs=$($curlconfig --libs 2>/dev/null)
3446   if compile_prog "$curl_cflags" "$curl_libs" ; then
3447     curl=yes
3448   else
3449     if test "$curl" = "yes" ; then
3450       feature_not_found "curl" "Install libcurl devel"
3451     fi
3452     curl=no
3453   fi
3454 fi # test "$curl"
3455
3456 ##########################################
3457 # glib support probe
3458
3459 glib_req_ver=2.48
3460 glib_modules=gthread-2.0
3461 if test "$modules" = yes; then
3462     glib_modules="$glib_modules gmodule-export-2.0"
3463 fi
3464 if test "$plugins" = yes; then
3465     glib_modules="$glib_modules gmodule-2.0"
3466 fi
3467
3468 for i in $glib_modules; do
3469     if $pkg_config --atleast-version=$glib_req_ver $i; then
3470         glib_cflags=$($pkg_config --cflags $i)
3471         glib_libs=$($pkg_config --libs $i)
3472     else
3473         error_exit "glib-$glib_req_ver $i is required to compile QEMU"
3474     fi
3475 done
3476
3477 # This workaround is required due to a bug in pkg-config file for glib as it
3478 # doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
3479
3480 if test "$static" = yes && test "$mingw32" = yes; then
3481     glib_cflags="-DGLIB_STATIC_COMPILATION $glib_cflags"
3482 fi
3483
3484 if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
3485     gio=yes
3486     gio_cflags=$($pkg_config --cflags gio-2.0)
3487     gio_libs=$($pkg_config --libs gio-2.0)
3488     gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
3489     if [ ! -x "$gdbus_codegen" ]; then
3490         gdbus_codegen=
3491     fi
3492 else
3493     gio=no
3494 fi
3495
3496 if $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
3497     gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
3498     gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
3499 fi
3500
3501 # Sanity check that the current size_t matches the
3502 # size that glib thinks it should be. This catches
3503 # problems on multi-arch where people try to build
3504 # 32-bit QEMU while pointing at 64-bit glib headers
3505 cat > $TMPC <<EOF
3506 #include <glib.h>
3507 #include <unistd.h>
3508
3509 #define QEMU_BUILD_BUG_ON(x) \
3510   typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
3511
3512 int main(void) {
3513    QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
3514    return 0;
3515 }
3516 EOF
3517
3518 if ! compile_prog "$glib_cflags" "$glib_libs" ; then
3519     error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
3520                "You probably need to set PKG_CONFIG_LIBDIR"\
3521                "to point to the right pkg-config files for your"\
3522                "build target"
3523 fi
3524
3525 # Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
3526 cat > $TMPC << EOF
3527 #include <glib.h>
3528 int main(void) { return 0; }
3529 EOF
3530 if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3531     if cc_has_warning_flag "-Wno-unknown-attributes"; then
3532         glib_cflags="-Wno-unknown-attributes $glib_cflags"
3533         CONFIGURE_CFLAGS="-Wno-unknown-attributes $CONFIGURE_CFLAGS"
3534     fi
3535 fi
3536
3537 # Silence clang warnings triggered by glib < 2.57.2
3538 cat > $TMPC << EOF
3539 #include <glib.h>
3540 typedef struct Foo {
3541     int i;
3542 } Foo;
3543 static void foo_free(Foo *f)
3544 {
3545     g_free(f);
3546 }
3547 G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free);
3548 int main(void) { return 0; }
3549 EOF
3550 if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3551     if cc_has_warning_flag "-Wno-unused-function"; then
3552         glib_cflags="$glib_cflags -Wno-unused-function"
3553         CONFIGURE_CFLAGS="$CONFIGURE_CFLAGS -Wno-unused-function"
3554     fi
3555 fi
3556
3557 ##########################################
3558 # SHA command probe for modules
3559 if test "$modules" = yes; then
3560     shacmd_probe="sha1sum sha1 shasum"
3561     for c in $shacmd_probe; do
3562         if has $c; then
3563             shacmd="$c"
3564             break
3565         fi
3566     done
3567     if test "$shacmd" = ""; then
3568         error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
3569     fi
3570 fi
3571
3572 ##########################################
3573 # pthread probe
3574 PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
3575
3576 pthread=no
3577 cat > $TMPC << EOF
3578 #include <pthread.h>
3579 static void *f(void *p) { return NULL; }
3580 int main(void) {
3581   pthread_t thread;
3582   pthread_create(&thread, 0, f, 0);
3583   return 0;
3584 }
3585 EOF
3586 if compile_prog "" "" ; then
3587   pthread=yes
3588 else
3589   for pthread_lib in $PTHREADLIBS_LIST; do
3590     if compile_prog "" "$pthread_lib" ; then
3591       pthread=yes
3592       found=no
3593       for lib_entry in $LIBS; do
3594         if test "$lib_entry" = "$pthread_lib"; then
3595           found=yes
3596           break
3597         fi
3598       done
3599       if test "$found" = "no"; then
3600         LIBS="$pthread_lib $LIBS"
3601       fi
3602       break
3603     fi
3604   done
3605 fi
3606
3607 if test "$mingw32" != yes && test "$pthread" = no; then
3608   error_exit "pthread check failed" \
3609       "Make sure to have the pthread libs and headers installed."
3610 fi
3611
3612 # check for pthread_setname_np with thread id
3613 pthread_setname_np_w_tid=no
3614 cat > $TMPC << EOF
3615 #include <pthread.h>
3616
3617 static void *f(void *p) { return NULL; }
3618 int main(void)
3619 {
3620     pthread_t thread;
3621     pthread_create(&thread, 0, f, 0);
3622     pthread_setname_np(thread, "QEMU");
3623     return 0;
3624 }
3625 EOF
3626 if compile_prog "" "$pthread_lib" ; then
3627   pthread_setname_np_w_tid=yes
3628 fi
3629
3630 # check for pthread_setname_np without thread id
3631 pthread_setname_np_wo_tid=no
3632 cat > $TMPC << EOF
3633 #include <pthread.h>
3634
3635 static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
3636 int main(void)
3637 {
3638     pthread_t thread;
3639     pthread_create(&thread, 0, f, 0);
3640     return 0;
3641 }
3642 EOF
3643 if compile_prog "" "$pthread_lib" ; then
3644   pthread_setname_np_wo_tid=yes
3645 fi
3646
3647 ##########################################
3648 # rbd probe
3649 if test "$rbd" != "no" ; then
3650   cat > $TMPC <<EOF
3651 #include <stdio.h>
3652 #include <rbd/librbd.h>
3653 int main(void) {
3654     rados_t cluster;
3655     rados_create(&cluster, NULL);
3656     return 0;
3657 }
3658 EOF
3659   rbd_libs="-lrbd -lrados"
3660   if compile_prog "" "$rbd_libs" ; then
3661     rbd=yes
3662   else
3663     if test "$rbd" = "yes" ; then
3664       feature_not_found "rados block device" "Install librbd/ceph devel"
3665     fi
3666     rbd=no
3667   fi
3668 fi
3669
3670 ##########################################
3671 # libssh probe
3672 if test "$libssh" != "no" ; then
3673   if $pkg_config --exists libssh; then
3674     libssh_cflags=$($pkg_config libssh --cflags)
3675     libssh_libs=$($pkg_config libssh --libs)
3676     libssh=yes
3677   else
3678     if test "$libssh" = "yes" ; then
3679       error_exit "libssh required for --enable-libssh"
3680     fi
3681     libssh=no
3682   fi
3683 fi
3684
3685 ##########################################
3686 # Check for libssh 0.8
3687 # This is done like this instead of using the LIBSSH_VERSION_* and
3688 # SSH_VERSION_* macros because some distributions in the past shipped
3689 # snapshots of the future 0.8 from Git, and those snapshots did not
3690 # have updated version numbers (still referring to 0.7.0).
3691
3692 if test "$libssh" = "yes"; then
3693   cat > $TMPC <<EOF
3694 #include <libssh/libssh.h>
3695 int main(void) { return ssh_get_server_publickey(NULL, NULL); }
3696 EOF
3697   if compile_prog "$libssh_cflags" "$libssh_libs"; then
3698     libssh_cflags="-DHAVE_LIBSSH_0_8 $libssh_cflags"
3699   fi
3700 fi
3701
3702 ##########################################
3703 # linux-aio probe
3704
3705 if test "$linux_aio" != "no" ; then
3706   cat > $TMPC <<EOF
3707 #include <libaio.h>
3708 #include <sys/eventfd.h>
3709 #include <stddef.h>
3710 int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
3711 EOF
3712   if compile_prog "" "-laio" ; then
3713     linux_aio=yes
3714   else
3715     if test "$linux_aio" = "yes" ; then
3716       feature_not_found "linux AIO" "Install libaio devel"
3717     fi
3718     linux_aio=no
3719   fi
3720 fi
3721 ##########################################
3722 # linux-io-uring probe
3723
3724 if test "$linux_io_uring" != "no" ; then
3725   if $pkg_config liburing; then
3726     linux_io_uring_cflags=$($pkg_config --cflags liburing)
3727     linux_io_uring_libs=$($pkg_config --libs liburing)
3728     linux_io_uring=yes
3729   else
3730     if test "$linux_io_uring" = "yes" ; then
3731       feature_not_found "linux io_uring" "Install liburing devel"
3732     fi
3733     linux_io_uring=no
3734   fi
3735 fi
3736
3737 ##########################################
3738 # TPM emulation is only on POSIX
3739
3740 if test "$tpm" = ""; then
3741   if test "$mingw32" = "yes"; then
3742     tpm=no
3743   else
3744     tpm=yes
3745   fi
3746 elif test "$tpm" = "yes"; then
3747   if test "$mingw32" = "yes" ; then
3748     error_exit "TPM emulation only available on POSIX systems"
3749   fi
3750 fi
3751
3752 ##########################################
3753 # attr probe
3754
3755 libattr_libs=
3756 if test "$attr" != "no" ; then
3757   cat > $TMPC <<EOF
3758 #include <stdio.h>
3759 #include <sys/types.h>
3760 #ifdef CONFIG_LIBATTR
3761 #include <attr/xattr.h>
3762 #else
3763 #include <sys/xattr.h>
3764 #endif
3765 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }
3766 EOF
3767   if compile_prog "" "" ; then
3768     attr=yes
3769   # Older distros have <attr/xattr.h>, and need -lattr:
3770   elif compile_prog "-DCONFIG_LIBATTR" "-lattr" ; then
3771     attr=yes
3772     libattr_libs="-lattr"
3773     libattr=yes
3774   else
3775     if test "$attr" = "yes" ; then
3776       feature_not_found "ATTR" "Install libc6 or libattr devel"
3777     fi
3778     attr=no
3779   fi
3780 fi
3781
3782 ##########################################
3783 # iovec probe
3784 cat > $TMPC <<EOF
3785 #include <sys/types.h>
3786 #include <sys/uio.h>
3787 #include <unistd.h>
3788 int main(void) { return sizeof(struct iovec); }
3789 EOF
3790 iovec=no
3791 if compile_prog "" "" ; then
3792   iovec=yes
3793 fi
3794
3795 ##########################################
3796 # preadv probe
3797 cat > $TMPC <<EOF
3798 #include <sys/types.h>
3799 #include <sys/uio.h>
3800 #include <unistd.h>
3801 int main(void) { return preadv(0, 0, 0, 0); }
3802 EOF
3803 preadv=no
3804 if compile_prog "" "" ; then
3805   preadv=yes
3806 fi
3807
3808 ##########################################
3809 # fdt probe
3810
3811 case "$fdt" in
3812   auto | enabled | internal)
3813     # Simpler to always update submodule, even if not needed.
3814     if test -e "${source_path}/.git" && test $git_update = 'yes' ; then
3815       git_submodules="${git_submodules} dtc"
3816     fi
3817     ;;
3818 esac
3819
3820 ##########################################
3821 # opengl probe (for sdl2, gtk, milkymist-tmu2)
3822
3823 gbm="no"
3824 if $pkg_config gbm; then
3825     gbm_cflags="$($pkg_config --cflags gbm)"
3826     gbm_libs="$($pkg_config --libs gbm)"
3827     gbm="yes"
3828 fi
3829
3830 if test "$opengl" != "no" ; then
3831   opengl_pkgs="epoxy gbm"
3832   if $pkg_config $opengl_pkgs; then
3833     opengl_cflags="$($pkg_config --cflags $opengl_pkgs)"
3834     opengl_libs="$($pkg_config --libs $opengl_pkgs)"
3835     opengl=yes
3836     if test "$gtk" = "yes" && $pkg_config --exists "$gtkpackage >= 3.16"; then
3837         gtk_gl="yes"
3838     fi
3839   else
3840     if test "$opengl" = "yes" ; then
3841       feature_not_found "opengl" "Please install opengl (mesa) devel pkgs: $opengl_pkgs"
3842     fi
3843     opengl_cflags=""
3844     opengl_libs=""
3845     opengl=no
3846   fi
3847 fi
3848
3849 if test "$opengl" = "yes"; then
3850   cat > $TMPC << EOF
3851 #include <epoxy/egl.h>
3852 #ifndef EGL_MESA_image_dma_buf_export
3853 # error mesa/epoxy lacks support for dmabufs (mesa 10.6+)
3854 #endif
3855 int main(void) { return 0; }
3856 EOF
3857   if compile_prog "" "" ; then
3858     opengl_dmabuf=yes
3859   fi
3860 fi
3861
3862 if test "$opengl" = "yes" && test "$have_x11" = "yes"; then
3863   for target in $target_list; do
3864     case $target in
3865       lm32-softmmu) # milkymist-tmu2 requires X11 and OpenGL
3866         need_x11=yes
3867       ;;
3868     esac
3869   done
3870 fi
3871
3872 ##########################################
3873 # libxml2 probe
3874 if test "$libxml2" != "no" ; then
3875     if $pkg_config --exists libxml-2.0; then
3876         libxml2="yes"
3877         libxml2_cflags=$($pkg_config --cflags libxml-2.0)
3878         libxml2_libs=$($pkg_config --libs libxml-2.0)
3879     else
3880         if test "$libxml2" = "yes"; then
3881             feature_not_found "libxml2" "Install libxml2 devel"
3882         fi
3883         libxml2="no"
3884     fi
3885 fi
3886
3887 ##########################################
3888 # glusterfs probe
3889 if test "$glusterfs" != "no" ; then
3890   if $pkg_config --atleast-version=3 glusterfs-api; then
3891     glusterfs="yes"
3892     glusterfs_cflags=$($pkg_config --cflags glusterfs-api)
3893     glusterfs_libs=$($pkg_config --libs glusterfs-api)
3894     if $pkg_config --atleast-version=4 glusterfs-api; then
3895       glusterfs_xlator_opt="yes"
3896     fi
3897     if $pkg_config --atleast-version=5 glusterfs-api; then
3898       glusterfs_discard="yes"
3899     fi
3900     if $pkg_config --atleast-version=6 glusterfs-api; then
3901       glusterfs_fallocate="yes"
3902       glusterfs_zerofill="yes"
3903     fi
3904     cat > $TMPC << EOF
3905 #include <glusterfs/api/glfs.h>
3906
3907 int
3908 main(void)
3909 {
3910         /* new glfs_ftruncate() passes two additional args */
3911         return glfs_ftruncate(NULL, 0, NULL, NULL);
3912 }
3913 EOF
3914     if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
3915       glusterfs_ftruncate_has_stat="yes"
3916     fi
3917     cat > $TMPC << EOF
3918 #include <glusterfs/api/glfs.h>
3919
3920 /* new glfs_io_cbk() passes two additional glfs_stat structs */
3921 static void
3922 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
3923 {}
3924
3925 int
3926 main(void)
3927 {
3928         glfs_io_cbk iocb = &glusterfs_iocb;
3929         iocb(NULL, 0 , NULL, NULL, NULL);
3930         return 0;
3931 }
3932 EOF
3933     if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
3934       glusterfs_iocb_has_stat="yes"
3935     fi
3936   else
3937     if test "$glusterfs" = "yes" ; then
3938       feature_not_found "GlusterFS backend support" \
3939           "Install glusterfs-api devel >= 3"
3940     fi
3941     glusterfs="no"
3942   fi
3943 fi
3944
3945 # Check for inotify functions when we are building linux-user
3946 # emulator.  This is done because older glibc versions don't
3947 # have syscall stubs for these implemented.  In that case we
3948 # don't provide them even if kernel supports them.
3949 #
3950 inotify=no
3951 cat > $TMPC << EOF
3952 #include <sys/inotify.h>
3953
3954 int
3955 main(void)
3956 {
3957         /* try to start inotify */
3958         return inotify_init();
3959 }
3960 EOF
3961 if compile_prog "" "" ; then
3962   inotify=yes
3963 fi
3964
3965 inotify1=no
3966 cat > $TMPC << EOF
3967 #include <sys/inotify.h>
3968
3969 int
3970 main(void)
3971 {
3972     /* try to start inotify */
3973     return inotify_init1(0);
3974 }
3975 EOF
3976 if compile_prog "" "" ; then
3977   inotify1=yes
3978 fi
3979
3980 # check if pipe2 is there
3981 pipe2=no
3982 cat > $TMPC << EOF
3983 #include <unistd.h>
3984 #include <fcntl.h>
3985
3986 int main(void)
3987 {
3988     int pipefd[2];
3989     return pipe2(pipefd, O_CLOEXEC);
3990 }
3991 EOF
3992 if compile_prog "" "" ; then
3993   pipe2=yes
3994 fi
3995
3996 # check if accept4 is there
3997 accept4=no
3998 cat > $TMPC << EOF
3999 #include <sys/socket.h>
4000 #include <stddef.h>
4001
4002 int main(void)
4003 {
4004     accept4(0, NULL, NULL, SOCK_CLOEXEC);
4005     return 0;
4006 }
4007 EOF
4008 if compile_prog "" "" ; then
4009   accept4=yes
4010 fi
4011
4012 # check if tee/splice is there. vmsplice was added same time.
4013 splice=no
4014 cat > $TMPC << EOF
4015 #include <unistd.h>
4016 #include <fcntl.h>
4017 #include <limits.h>
4018
4019 int main(void)
4020 {
4021     int len, fd = 0;
4022     len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
4023     splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
4024     return 0;
4025 }
4026 EOF
4027 if compile_prog "" "" ; then
4028   splice=yes
4029 fi
4030
4031 ##########################################
4032 # libnuma probe
4033
4034 if test "$numa" != "no" ; then
4035   cat > $TMPC << EOF
4036 #include <numa.h>
4037 int main(void) { return numa_available(); }
4038 EOF
4039
4040   if compile_prog "" "-lnuma" ; then
4041     numa=yes
4042     numa_libs="-lnuma"
4043   else
4044     if test "$numa" = "yes" ; then
4045       feature_not_found "numa" "install numactl devel"
4046     fi
4047     numa=no
4048   fi
4049 fi
4050
4051 malloc=system
4052 if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
4053     echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
4054     exit 1
4055 elif test "$tcmalloc" = "yes" ; then
4056     malloc=tcmalloc
4057 elif test "$jemalloc" = "yes" ; then
4058     malloc=jemalloc
4059 fi
4060
4061 ##########################################
4062 # signalfd probe
4063 signalfd="no"
4064 cat > $TMPC << EOF
4065 #include <unistd.h>
4066 #include <sys/syscall.h>
4067 #include <signal.h>
4068 int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }
4069 EOF
4070
4071 if compile_prog "" "" ; then
4072   signalfd=yes
4073 fi
4074
4075 # check if optreset global is declared by <getopt.h>
4076 optreset="no"
4077 cat > $TMPC << EOF
4078 #include <getopt.h>
4079 int main(void) { return optreset; }
4080 EOF
4081
4082 if compile_prog "" "" ; then
4083   optreset=yes
4084 fi
4085
4086 # check if eventfd is supported
4087 eventfd=no
4088 cat > $TMPC << EOF
4089 #include <sys/eventfd.h>
4090
4091 int main(void)
4092 {
4093     return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
4094 }
4095 EOF
4096 if compile_prog "" "" ; then
4097   eventfd=yes
4098 fi
4099
4100 # check if memfd is supported
4101 memfd=no
4102 cat > $TMPC << EOF
4103 #include <sys/mman.h>
4104
4105 int main(void)
4106 {
4107     return memfd_create("foo", MFD_ALLOW_SEALING);
4108 }
4109 EOF
4110 if compile_prog "" "" ; then
4111   memfd=yes
4112 fi
4113
4114 # check for usbfs
4115 have_usbfs=no
4116 if test "$linux_user" = "yes"; then
4117   cat > $TMPC << EOF
4118 #include <linux/usbdevice_fs.h>
4119
4120 #ifndef USBDEVFS_GET_CAPABILITIES
4121 #error "USBDEVFS_GET_CAPABILITIES undefined"
4122 #endif
4123
4124 #ifndef USBDEVFS_DISCONNECT_CLAIM
4125 #error "USBDEVFS_DISCONNECT_CLAIM undefined"
4126 #endif
4127
4128 int main(void)
4129 {
4130     return 0;
4131 }
4132 EOF
4133   if compile_prog "" ""; then
4134     have_usbfs=yes
4135   fi
4136 fi
4137
4138 # check for fallocate
4139 fallocate=no
4140 cat > $TMPC << EOF
4141 #include <fcntl.h>
4142
4143 int main(void)
4144 {
4145     fallocate(0, 0, 0, 0);
4146     return 0;
4147 }
4148 EOF
4149 if compile_prog "" "" ; then
4150   fallocate=yes
4151 fi
4152
4153 # check for fallocate hole punching
4154 fallocate_punch_hole=no
4155 cat > $TMPC << EOF
4156 #include <fcntl.h>
4157 #include <linux/falloc.h>
4158
4159 int main(void)
4160 {
4161     fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
4162     return 0;
4163 }
4164 EOF
4165 if compile_prog "" "" ; then
4166   fallocate_punch_hole=yes
4167 fi
4168
4169 # check that fallocate supports range zeroing inside the file
4170 fallocate_zero_range=no
4171 cat > $TMPC << EOF
4172 #include <fcntl.h>
4173 #include <linux/falloc.h>
4174
4175 int main(void)
4176 {
4177     fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0);
4178     return 0;
4179 }
4180 EOF
4181 if compile_prog "" "" ; then
4182   fallocate_zero_range=yes
4183 fi
4184
4185 # check for posix_fallocate
4186 posix_fallocate=no
4187 cat > $TMPC << EOF
4188 #include <fcntl.h>
4189
4190 int main(void)
4191 {
4192     posix_fallocate(0, 0, 0);
4193     return 0;
4194 }
4195 EOF
4196 if compile_prog "" "" ; then
4197     posix_fallocate=yes
4198 fi
4199
4200 # check for sync_file_range
4201 sync_file_range=no
4202 cat > $TMPC << EOF
4203 #include <fcntl.h>
4204
4205 int main(void)
4206 {
4207     sync_file_range(0, 0, 0, 0);
4208     return 0;
4209 }
4210 EOF
4211 if compile_prog "" "" ; then
4212   sync_file_range=yes
4213 fi
4214
4215 # check for linux/fiemap.h and FS_IOC_FIEMAP
4216 fiemap=no
4217 cat > $TMPC << EOF
4218 #include <sys/ioctl.h>
4219 #include <linux/fs.h>
4220 #include <linux/fiemap.h>
4221
4222 int main(void)
4223 {
4224     ioctl(0, FS_IOC_FIEMAP, 0);
4225     return 0;
4226 }
4227 EOF
4228 if compile_prog "" "" ; then
4229   fiemap=yes
4230 fi
4231
4232 # check for dup3
4233 dup3=no
4234 cat > $TMPC << EOF
4235 #include <unistd.h>
4236
4237 int main(void)
4238 {
4239     dup3(0, 0, 0);
4240     return 0;
4241 }
4242 EOF
4243 if compile_prog "" "" ; then
4244   dup3=yes
4245 fi
4246
4247 # check for ppoll support
4248 ppoll=no
4249 cat > $TMPC << EOF
4250 #include <poll.h>
4251
4252 int main(void)
4253 {
4254     struct pollfd pfd = { .fd = 0, .events = 0, .revents = 0 };
4255     ppoll(&pfd, 1, 0, 0);
4256     return 0;
4257 }
4258 EOF
4259 if compile_prog "" "" ; then
4260   ppoll=yes
4261 fi
4262
4263 # check for prctl(PR_SET_TIMERSLACK , ... ) support
4264 prctl_pr_set_timerslack=no
4265 cat > $TMPC << EOF
4266 #include <sys/prctl.h>