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