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