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