xref: /openbmc/qemu/configure (revision d9d3aaea)
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.
8CLICOLOR_FORCE= GREP_OPTIONS=
9unset CLICOLOR_FORCE GREP_OPTIONS
10
11# Don't allow CCACHE, if present, to use cached results of compile tests!
12export 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.)
19TMPDIR1="config-temp"
20rm -rf "${TMPDIR1}"
21mkdir -p "${TMPDIR1}"
22if [ $? -ne 0 ]; then
23    echo "ERROR: failed to create temporary directory"
24    exit 1
25fi
26
27TMPB="qemu-conf"
28TMPC="${TMPDIR1}/${TMPB}.c"
29TMPO="${TMPDIR1}/${TMPB}.o"
30TMPCXX="${TMPDIR1}/${TMPB}.cxx"
31TMPL="${TMPDIR1}/${TMPB}.lo"
32TMPA="${TMPDIR1}/lib${TMPB}.la"
33TMPE="${TMPDIR1}/${TMPB}.exe"
34
35rm -f config.log
36
37# Print a helpful header at the top of config.log
38echo "# QEMU configure log $(date)" >> config.log
39printf "# Configured with:" >> config.log
40printf " '%s'" "$0" "$@" >> config.log
41echo >> config.log
42echo "#" >> config.log
43
44error_exit() {
45    echo
46    echo "ERROR: $1"
47    while test -n "$2"; do
48        echo "       $2"
49        shift
50    done
51    echo
52    exit 1
53}
54
55do_compiler() {
56    # Run the compiler, capturing its output to the log. First argument
57    # is compiler binary to execute.
58    local compiler="$1"
59    shift
60    echo $compiler "$@" >> config.log
61    $compiler "$@" >> config.log 2>&1 || return $?
62    # Test passed. If this is an --enable-werror build, rerun
63    # the test with -Werror and bail out if it fails. This
64    # makes warning-generating-errors in configure test code
65    # obvious to developers.
66    if test "$werror" != "yes"; then
67        return 0
68    fi
69    # Don't bother rerunning the compile if we were already using -Werror
70    case "$*" in
71        *-Werror*)
72           return 0
73        ;;
74    esac
75    echo $compiler -Werror "$@" >> config.log
76    $compiler -Werror "$@" >> config.log 2>&1 && return $?
77    error_exit "configure test passed without -Werror but failed with -Werror." \
78        "This is probably a bug in the configure script. The failing command" \
79        "will be at the bottom of config.log." \
80        "You can run configure with --disable-werror to bypass this check."
81}
82
83do_cc() {
84    do_compiler "$cc" "$@"
85}
86
87do_cxx() {
88    do_compiler "$cxx" "$@"
89}
90
91update_cxxflags() {
92    # Set QEMU_CXXFLAGS from QEMU_CFLAGS by filtering out those
93    # options which some versions of GCC's C++ compiler complain about
94    # because they only make sense for C programs.
95    QEMU_CXXFLAGS=
96    for arg in $QEMU_CFLAGS; do
97        case $arg in
98            -Wstrict-prototypes|-Wmissing-prototypes|-Wnested-externs|\
99            -Wold-style-declaration|-Wold-style-definition|-Wredundant-decls)
100                ;;
101            *)
102                QEMU_CXXFLAGS=${QEMU_CXXFLAGS:+$QEMU_CXXFLAGS }$arg
103                ;;
104        esac
105    done
106}
107
108compile_object() {
109  local_cflags="$1"
110  do_cc $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
111}
112
113compile_prog() {
114  local_cflags="$1"
115  local_ldflags="$2"
116  do_cc $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC $LDFLAGS $local_ldflags
117}
118
119# symbolically link $1 to $2.  Portable version of "ln -sf".
120symlink() {
121  rm -rf "$2"
122  mkdir -p "$(dirname "$2")"
123  ln -s "$1" "$2"
124}
125
126# check whether a command is available to this shell (may be either an
127# executable or a builtin)
128has() {
129    type "$1" >/dev/null 2>&1
130}
131
132# search for an executable in PATH
133path_of() {
134    local_command="$1"
135    local_ifs="$IFS"
136    local_dir=""
137
138    # pathname has a dir component?
139    if [ "${local_command#*/}" != "$local_command" ]; then
140        if [ -x "$local_command" ] && [ ! -d "$local_command" ]; then
141            echo "$local_command"
142            return 0
143        fi
144    fi
145    if [ -z "$local_command" ]; then
146        return 1
147    fi
148
149    IFS=:
150    for local_dir in $PATH; do
151        if [ -x "$local_dir/$local_command" ] && [ ! -d "$local_dir/$local_command" ]; then
152            echo "$local_dir/$local_command"
153            IFS="${local_ifs:-$(printf ' \t\n')}"
154            return 0
155        fi
156    done
157    # not found
158    IFS="${local_ifs:-$(printf ' \t\n')}"
159    return 1
160}
161
162have_backend () {
163    echo "$trace_backends" | grep "$1" >/dev/null
164}
165
166# default parameters
167source_path=`dirname "$0"`
168cpu=""
169iasl="iasl"
170interp_prefix="/usr/gnemul/qemu-%M"
171static="no"
172cross_prefix=""
173audio_drv_list=""
174block_drv_rw_whitelist=""
175block_drv_ro_whitelist=""
176host_cc="cc"
177libs_softmmu=""
178libs_tools=""
179audio_pt_int=""
180audio_win_int=""
181cc_i386=i386-pc-linux-gnu-gcc
182libs_qga=""
183debug_info="yes"
184stack_protector=""
185
186# Don't accept a target_list environment variable.
187unset target_list
188
189# Default value for a variable defining feature "foo".
190#  * foo="no"  feature will only be used if --enable-foo arg is given
191#  * foo=""    feature will be searched for, and if found, will be used
192#              unless --disable-foo is given
193#  * foo="yes" this value will only be set by --enable-foo flag.
194#              feature will searched for,
195#              if not found, configure exits with error
196#
197# Always add --enable-foo and --disable-foo command line args.
198# Distributions want to ensure that several features are compiled in, and it
199# is impossible without a --enable-foo that exits if a feature is not found.
200
201bluez=""
202brlapi=""
203curl=""
204curses=""
205docs=""
206fdt=""
207netmap="no"
208pixman=""
209sdl=""
210sdlabi="1.2"
211virtfs=""
212vnc="yes"
213sparse="no"
214uuid=""
215vde=""
216vnc_sasl=""
217vnc_jpeg=""
218vnc_png=""
219xen=""
220xen_ctrl_version=""
221xen_pv_domain_build="no"
222xen_pci_passthrough=""
223linux_aio=""
224cap_ng=""
225attr=""
226libattr=""
227xfs=""
228
229vhost_net="no"
230vhost_scsi="no"
231kvm="no"
232rdma=""
233gprof="no"
234debug_tcg="no"
235debug="no"
236fortify_source=""
237strip_opt="yes"
238tcg_interpreter="no"
239bigendian="no"
240mingw32="no"
241gcov="no"
242gcov_tool="gcov"
243EXESUF=""
244DSOSUF=".so"
245LDFLAGS_SHARED="-shared"
246modules="no"
247prefix="/usr/local"
248mandir="\${prefix}/share/man"
249datadir="\${prefix}/share"
250qemu_docdir="\${prefix}/share/doc/qemu"
251bindir="\${prefix}/bin"
252libdir="\${prefix}/lib"
253libexecdir="\${prefix}/libexec"
254includedir="\${prefix}/include"
255sysconfdir="\${prefix}/etc"
256local_statedir="\${prefix}/var"
257confsuffix="/qemu"
258slirp="yes"
259oss_lib=""
260bsd="no"
261linux="no"
262solaris="no"
263profiler="no"
264cocoa="no"
265softmmu="yes"
266linux_user="no"
267bsd_user="no"
268aix="no"
269blobs="yes"
270pkgversion=""
271pie=""
272zero_malloc=""
273qom_cast_debug="yes"
274trace_backends="log"
275trace_file="trace"
276spice=""
277rbd=""
278smartcard=""
279libusb=""
280usb_redir=""
281opengl=""
282opengl_dmabuf="no"
283avx2_opt="no"
284zlib="yes"
285lzo=""
286snappy=""
287bzip2=""
288guest_agent=""
289guest_agent_with_vss="no"
290guest_agent_ntddscsi="no"
291guest_agent_msi=""
292vss_win32_sdk=""
293win_sdk="no"
294want_tools="yes"
295libiscsi=""
296libnfs=""
297coroutine=""
298coroutine_pool=""
299seccomp=""
300glusterfs=""
301glusterfs_xlator_opt="no"
302glusterfs_discard="no"
303glusterfs_zerofill="no"
304archipelago="no"
305gtk=""
306gtkabi=""
307gtk_gl="no"
308gnutls=""
309gnutls_hash=""
310gnutls_rnd=""
311nettle=""
312nettle_kdf="no"
313gcrypt=""
314gcrypt_kdf="no"
315vte=""
316virglrenderer=""
317tpm="yes"
318libssh2=""
319vhdx=""
320numa=""
321tcmalloc="no"
322jemalloc="no"
323
324# parse CC options first
325for opt do
326  optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'`
327  case "$opt" in
328  --cross-prefix=*) cross_prefix="$optarg"
329  ;;
330  --cc=*) CC="$optarg"
331  ;;
332  --cxx=*) CXX="$optarg"
333  ;;
334  --source-path=*) source_path="$optarg"
335  ;;
336  --cpu=*) cpu="$optarg"
337  ;;
338  --extra-cflags=*) QEMU_CFLAGS="$QEMU_CFLAGS $optarg"
339                    EXTRA_CFLAGS="$optarg"
340  ;;
341  --extra-ldflags=*) LDFLAGS="$LDFLAGS $optarg"
342                     EXTRA_LDFLAGS="$optarg"
343  ;;
344  --enable-debug-info) debug_info="yes"
345  ;;
346  --disable-debug-info) debug_info="no"
347  ;;
348  esac
349done
350# OS specific
351# Using uname is really, really broken.  Once we have the right set of checks
352# we can eliminate its usage altogether.
353
354# Preferred compiler:
355#  ${CC} (if set)
356#  ${cross_prefix}gcc (if cross-prefix specified)
357#  system compiler
358if test -z "${CC}${cross_prefix}"; then
359  cc="$host_cc"
360else
361  cc="${CC-${cross_prefix}gcc}"
362fi
363
364if test -z "${CXX}${cross_prefix}"; then
365  cxx="c++"
366else
367  cxx="${CXX-${cross_prefix}g++}"
368fi
369
370ar="${AR-${cross_prefix}ar}"
371as="${AS-${cross_prefix}as}"
372cpp="${CPP-$cc -E}"
373objcopy="${OBJCOPY-${cross_prefix}objcopy}"
374ld="${LD-${cross_prefix}ld}"
375nm="${NM-${cross_prefix}nm}"
376strip="${STRIP-${cross_prefix}strip}"
377windres="${WINDRES-${cross_prefix}windres}"
378pkg_config_exe="${PKG_CONFIG-${cross_prefix}pkg-config}"
379query_pkg_config() {
380    "${pkg_config_exe}" ${QEMU_PKG_CONFIG_FLAGS} "$@"
381}
382pkg_config=query_pkg_config
383sdl_config="${SDL_CONFIG-${cross_prefix}sdl-config}"
384sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
385
386# If the user hasn't specified ARFLAGS, default to 'rv', just as make does.
387ARFLAGS="${ARFLAGS-rv}"
388
389# default flags for all hosts
390QEMU_CFLAGS="-fno-strict-aliasing -fno-common $QEMU_CFLAGS"
391QEMU_CFLAGS="-Wall -Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS"
392QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS"
393QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
394QEMU_INCLUDES="-I. -I\$(SRC_PATH) -I\$(SRC_PATH)/include"
395if test "$debug_info" = "yes"; then
396    CFLAGS="-g $CFLAGS"
397    LDFLAGS="-g $LDFLAGS"
398fi
399
400# make source path absolute
401source_path=`cd "$source_path"; pwd`
402
403# running configure in the source tree?
404# we know that's the case if configure is there.
405if test -f "./configure"; then
406    pwd_is_source_path="y"
407else
408    pwd_is_source_path="n"
409fi
410
411check_define() {
412cat > $TMPC <<EOF
413#if !defined($1)
414#error $1 not defined
415#endif
416int main(void) { return 0; }
417EOF
418  compile_object
419}
420
421check_include() {
422cat > $TMPC <<EOF
423#include <$1>
424int main(void) { return 0; }
425EOF
426  compile_object
427}
428
429write_c_skeleton() {
430    cat > $TMPC <<EOF
431int main(void) { return 0; }
432EOF
433}
434
435if check_define __linux__ ; then
436  targetos="Linux"
437elif check_define _WIN32 ; then
438  targetos='MINGW32'
439elif check_define __OpenBSD__ ; then
440  targetos='OpenBSD'
441elif check_define __sun__ ; then
442  targetos='SunOS'
443elif check_define __HAIKU__ ; then
444  targetos='Haiku'
445else
446  targetos=`uname -s`
447fi
448
449# Some host OSes need non-standard checks for which CPU to use.
450# Note that these checks are broken for cross-compilation: if you're
451# cross-compiling to one of these OSes then you'll need to specify
452# the correct CPU with the --cpu option.
453case $targetos in
454Darwin)
455  # on Leopard most of the system is 32-bit, so we have to ask the kernel if we can
456  # run 64-bit userspace code.
457  # If the user didn't specify a CPU explicitly and the kernel says this is
458  # 64 bit hw, then assume x86_64. Otherwise fall through to the usual detection code.
459  if test -z "$cpu" && test "$(sysctl -n hw.optional.x86_64)" = "1"; then
460    cpu="x86_64"
461  fi
462  ;;
463SunOS)
464  # `uname -m` returns i86pc even on an x86_64 box, so default based on isainfo
465  if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then
466    cpu="x86_64"
467  fi
468esac
469
470if test ! -z "$cpu" ; then
471  # command line argument
472  :
473elif check_define __i386__ ; then
474  cpu="i386"
475elif check_define __x86_64__ ; then
476  if check_define __ILP32__ ; then
477    cpu="x32"
478  else
479    cpu="x86_64"
480  fi
481elif check_define __sparc__ ; then
482  if check_define __arch64__ ; then
483    cpu="sparc64"
484  else
485    cpu="sparc"
486  fi
487elif check_define _ARCH_PPC ; then
488  if check_define _ARCH_PPC64 ; then
489    cpu="ppc64"
490  else
491    cpu="ppc"
492  fi
493elif check_define __mips__ ; then
494  cpu="mips"
495elif check_define __ia64__ ; then
496  cpu="ia64"
497elif check_define __s390__ ; then
498  if check_define __s390x__ ; then
499    cpu="s390x"
500  else
501    cpu="s390"
502  fi
503elif check_define __arm__ ; then
504  cpu="arm"
505elif check_define __aarch64__ ; then
506  cpu="aarch64"
507elif check_define __hppa__ ; then
508  cpu="hppa"
509else
510  cpu=`uname -m`
511fi
512
513ARCH=
514# Normalise host CPU name and set ARCH.
515# Note that this case should only have supported host CPUs, not guests.
516case "$cpu" in
517  ia64|ppc|ppc64|s390|s390x|sparc64|x32)
518    cpu="$cpu"
519  ;;
520  i386|i486|i586|i686|i86pc|BePC)
521    cpu="i386"
522  ;;
523  x86_64|amd64)
524    cpu="x86_64"
525  ;;
526  armv*b|armv*l|arm)
527    cpu="arm"
528  ;;
529  aarch64)
530    cpu="aarch64"
531  ;;
532  mips*)
533    cpu="mips"
534  ;;
535  sparc|sun4[cdmuv])
536    cpu="sparc"
537  ;;
538  *)
539    # This will result in either an error or falling back to TCI later
540    ARCH=unknown
541  ;;
542esac
543if test -z "$ARCH"; then
544  ARCH="$cpu"
545fi
546
547# OS specific
548
549# host *BSD for user mode
550HOST_VARIANT_DIR=""
551
552case $targetos in
553CYGWIN*)
554  mingw32="yes"
555  QEMU_CFLAGS="-mno-cygwin $QEMU_CFLAGS"
556  audio_possible_drivers="sdl"
557  audio_drv_list="sdl"
558;;
559MINGW32*)
560  mingw32="yes"
561  audio_possible_drivers="dsound sdl"
562  if check_include dsound.h; then
563    audio_drv_list="dsound"
564  else
565    audio_drv_list=""
566  fi
567;;
568GNU/kFreeBSD)
569  bsd="yes"
570  audio_drv_list="oss"
571  audio_possible_drivers="oss sdl pa"
572;;
573FreeBSD)
574  bsd="yes"
575  make="${MAKE-gmake}"
576  audio_drv_list="oss"
577  audio_possible_drivers="oss sdl pa"
578  # needed for kinfo_getvmmap(3) in libutil.h
579  LIBS="-lutil $LIBS"
580  netmap=""  # enable netmap autodetect
581  HOST_VARIANT_DIR="freebsd"
582;;
583DragonFly)
584  bsd="yes"
585  make="${MAKE-gmake}"
586  audio_drv_list="oss"
587  audio_possible_drivers="oss sdl pa"
588  HOST_VARIANT_DIR="dragonfly"
589;;
590NetBSD)
591  bsd="yes"
592  make="${MAKE-gmake}"
593  audio_drv_list="oss"
594  audio_possible_drivers="oss sdl"
595  oss_lib="-lossaudio"
596  HOST_VARIANT_DIR="netbsd"
597;;
598OpenBSD)
599  bsd="yes"
600  make="${MAKE-gmake}"
601  audio_drv_list="sdl"
602  audio_possible_drivers="sdl"
603  HOST_VARIANT_DIR="openbsd"
604;;
605Darwin)
606  bsd="yes"
607  darwin="yes"
608  LDFLAGS_SHARED="-bundle -undefined dynamic_lookup"
609  if [ "$cpu" = "x86_64" ] ; then
610    QEMU_CFLAGS="-arch x86_64 $QEMU_CFLAGS"
611    LDFLAGS="-arch x86_64 $LDFLAGS"
612  fi
613  cocoa="yes"
614  audio_drv_list="coreaudio"
615  audio_possible_drivers="coreaudio sdl"
616  LDFLAGS="-framework CoreFoundation -framework IOKit $LDFLAGS"
617  libs_softmmu="-F/System/Library/Frameworks -framework Cocoa -framework IOKit $libs_softmmu"
618  # Disable attempts to use ObjectiveC features in os/object.h since they
619  # won't work when we're compiling with gcc as a C compiler.
620  QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS"
621  HOST_VARIANT_DIR="darwin"
622;;
623SunOS)
624  solaris="yes"
625  make="${MAKE-gmake}"
626  install="${INSTALL-ginstall}"
627  ld="gld"
628  smbd="${SMBD-/usr/sfw/sbin/smbd}"
629  needs_libsunmath="no"
630  solarisrev=`uname -r | cut -f2 -d.`
631  if [ "$cpu" = "i386" -o "$cpu" = "x86_64" ] ; then
632    if test "$solarisrev" -le 9 ; then
633      if test -f /opt/SUNWspro/prod/lib/libsunmath.so.1; then
634        needs_libsunmath="yes"
635        QEMU_CFLAGS="-I/opt/SUNWspro/prod/include/cc $QEMU_CFLAGS"
636        LDFLAGS="-L/opt/SUNWspro/prod/lib -R/opt/SUNWspro/prod/lib $LDFLAGS"
637        LIBS="-lsunmath $LIBS"
638      else
639        error_exit "QEMU will not link correctly on Solaris 8/X86 or 9/x86 without" \
640            "libsunmath from the Sun Studio compilers tools, due to a lack of" \
641            "C99 math features in libm.so in Solaris 8/x86 and Solaris 9/x86" \
642            "Studio 11 can be downloaded from www.sun.com."
643      fi
644    fi
645  fi
646  if test -f /usr/include/sys/soundcard.h ; then
647    audio_drv_list="oss"
648  fi
649  audio_possible_drivers="oss sdl"
650# needed for CMSG_ macros in sys/socket.h
651  QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS"
652# needed for TIOCWIN* defines in termios.h
653  QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
654  QEMU_CFLAGS="-std=gnu99 $QEMU_CFLAGS"
655  solarisnetlibs="-lsocket -lnsl -lresolv"
656  LIBS="$solarisnetlibs $LIBS"
657  libs_qga="$solarisnetlibs $libs_qga"
658;;
659AIX)
660  aix="yes"
661  make="${MAKE-gmake}"
662;;
663Haiku)
664  haiku="yes"
665  QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS $QEMU_CFLAGS"
666  LIBS="-lposix_error_mapper -lnetwork $LIBS"
667;;
668*)
669  audio_drv_list="oss"
670  audio_possible_drivers="oss alsa sdl pa"
671  linux="yes"
672  linux_user="yes"
673  kvm="yes"
674  vhost_net="yes"
675  vhost_scsi="yes"
676  QEMU_INCLUDES="-I\$(SRC_PATH)/linux-headers -I$(pwd)/linux-headers $QEMU_INCLUDES"
677;;
678esac
679
680if [ "$bsd" = "yes" ] ; then
681  if [ "$darwin" != "yes" ] ; then
682    bsd_user="yes"
683  fi
684fi
685
686: ${make=${MAKE-make}}
687: ${install=${INSTALL-install}}
688: ${python=${PYTHON-python}}
689: ${smbd=${SMBD-/usr/sbin/smbd}}
690
691# Default objcc to clang if available, otherwise use CC
692if has clang; then
693  objcc=clang
694else
695  objcc="$cc"
696fi
697
698if test "$mingw32" = "yes" ; then
699  EXESUF=".exe"
700  DSOSUF=".dll"
701  QEMU_CFLAGS="-DWIN32_LEAN_AND_MEAN -DWINVER=0x501 $QEMU_CFLAGS"
702  # enable C99/POSIX format strings (needs mingw32-runtime 3.15 or later)
703  QEMU_CFLAGS="-D__USE_MINGW_ANSI_STDIO=1 $QEMU_CFLAGS"
704  # MinGW needs -mthreads for TLS and macro _MT.
705  QEMU_CFLAGS="-mthreads $QEMU_CFLAGS"
706  LIBS="-lwinmm -lws2_32 -liphlpapi $LIBS"
707  write_c_skeleton;
708  if compile_prog "" "-liberty" ; then
709    LIBS="-liberty $LIBS"
710  fi
711  prefix="c:/Program Files/QEMU"
712  mandir="\${prefix}"
713  datadir="\${prefix}"
714  qemu_docdir="\${prefix}"
715  bindir="\${prefix}"
716  sysconfdir="\${prefix}"
717  local_statedir=
718  confsuffix=""
719  libs_qga="-lws2_32 -lwinmm -lpowrprof -liphlpapi -lnetapi32 $libs_qga"
720fi
721
722werror=""
723
724for opt do
725  optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'`
726  case "$opt" in
727  --help|-h) show_help=yes
728  ;;
729  --version|-V) exec cat $source_path/VERSION
730  ;;
731  --prefix=*) prefix="$optarg"
732  ;;
733  --interp-prefix=*) interp_prefix="$optarg"
734  ;;
735  --source-path=*)
736  ;;
737  --cross-prefix=*)
738  ;;
739  --cc=*)
740  ;;
741  --host-cc=*) host_cc="$optarg"
742  ;;
743  --cxx=*)
744  ;;
745  --iasl=*) iasl="$optarg"
746  ;;
747  --objcc=*) objcc="$optarg"
748  ;;
749  --make=*) make="$optarg"
750  ;;
751  --install=*) install="$optarg"
752  ;;
753  --python=*) python="$optarg"
754  ;;
755  --gcov=*) gcov_tool="$optarg"
756  ;;
757  --smbd=*) smbd="$optarg"
758  ;;
759  --extra-cflags=*)
760  ;;
761  --extra-ldflags=*)
762  ;;
763  --enable-debug-info)
764  ;;
765  --disable-debug-info)
766  ;;
767  --enable-modules)
768      modules="yes"
769  ;;
770  --disable-modules)
771      modules="no"
772  ;;
773  --cpu=*)
774  ;;
775  --target-list=*) target_list="$optarg"
776  ;;
777  --enable-trace-backends=*) trace_backends="$optarg"
778  ;;
779  # XXX: backwards compatibility
780  --enable-trace-backend=*) trace_backends="$optarg"
781  ;;
782  --with-trace-file=*) trace_file="$optarg"
783  ;;
784  --enable-gprof) gprof="yes"
785  ;;
786  --enable-gcov) gcov="yes"
787  ;;
788  --static)
789    static="yes"
790    LDFLAGS="-static $LDFLAGS"
791    QEMU_PKG_CONFIG_FLAGS="--static $QEMU_PKG_CONFIG_FLAGS"
792  ;;
793  --mandir=*) mandir="$optarg"
794  ;;
795  --bindir=*) bindir="$optarg"
796  ;;
797  --libdir=*) libdir="$optarg"
798  ;;
799  --libexecdir=*) libexecdir="$optarg"
800  ;;
801  --includedir=*) includedir="$optarg"
802  ;;
803  --datadir=*) datadir="$optarg"
804  ;;
805  --with-confsuffix=*) confsuffix="$optarg"
806  ;;
807  --docdir=*) qemu_docdir="$optarg"
808  ;;
809  --sysconfdir=*) sysconfdir="$optarg"
810  ;;
811  --localstatedir=*) local_statedir="$optarg"
812  ;;
813  --sbindir=*|--sharedstatedir=*|\
814  --oldincludedir=*|--datarootdir=*|--infodir=*|--localedir=*|\
815  --htmldir=*|--dvidir=*|--pdfdir=*|--psdir=*)
816    # These switches are silently ignored, for compatibility with
817    # autoconf-generated configure scripts. This allows QEMU's
818    # configure to be used by RPM and similar macros that set
819    # lots of directory switches by default.
820  ;;
821  --with-system-pixman) pixman="system"
822  ;;
823  --without-system-pixman) pixman="internal"
824  ;;
825  --without-pixman) pixman="none"
826  ;;
827  --disable-sdl) sdl="no"
828  ;;
829  --enable-sdl) sdl="yes"
830  ;;
831  --with-sdlabi=*) sdlabi="$optarg"
832  ;;
833  --disable-qom-cast-debug) qom_cast_debug="no"
834  ;;
835  --enable-qom-cast-debug) qom_cast_debug="yes"
836  ;;
837  --disable-virtfs) virtfs="no"
838  ;;
839  --enable-virtfs) virtfs="yes"
840  ;;
841  --disable-vnc) vnc="no"
842  ;;
843  --enable-vnc) vnc="yes"
844  ;;
845  --oss-lib=*) oss_lib="$optarg"
846  ;;
847  --audio-drv-list=*) audio_drv_list="$optarg"
848  ;;
849  --block-drv-rw-whitelist=*|--block-drv-whitelist=*) block_drv_rw_whitelist=`echo "$optarg" | sed -e 's/,/ /g'`
850  ;;
851  --block-drv-ro-whitelist=*) block_drv_ro_whitelist=`echo "$optarg" | sed -e 's/,/ /g'`
852  ;;
853  --enable-debug-tcg) debug_tcg="yes"
854  ;;
855  --disable-debug-tcg) debug_tcg="no"
856  ;;
857  --enable-debug)
858      # Enable debugging options that aren't excessively noisy
859      debug_tcg="yes"
860      debug="yes"
861      strip_opt="no"
862      fortify_source="no"
863  ;;
864  --enable-sparse) sparse="yes"
865  ;;
866  --disable-sparse) sparse="no"
867  ;;
868  --disable-strip) strip_opt="no"
869  ;;
870  --disable-vnc-sasl) vnc_sasl="no"
871  ;;
872  --enable-vnc-sasl) vnc_sasl="yes"
873  ;;
874  --disable-vnc-jpeg) vnc_jpeg="no"
875  ;;
876  --enable-vnc-jpeg) vnc_jpeg="yes"
877  ;;
878  --disable-vnc-png) vnc_png="no"
879  ;;
880  --enable-vnc-png) vnc_png="yes"
881  ;;
882  --disable-slirp) slirp="no"
883  ;;
884  --disable-uuid) uuid="no"
885  ;;
886  --enable-uuid) uuid="yes"
887  ;;
888  --disable-vde) vde="no"
889  ;;
890  --enable-vde) vde="yes"
891  ;;
892  --disable-netmap) netmap="no"
893  ;;
894  --enable-netmap) netmap="yes"
895  ;;
896  --disable-xen) xen="no"
897  ;;
898  --enable-xen) xen="yes"
899  ;;
900  --disable-xen-pci-passthrough) xen_pci_passthrough="no"
901  ;;
902  --enable-xen-pci-passthrough) xen_pci_passthrough="yes"
903  ;;
904  --disable-xen-pv-domain-build) xen_pv_domain_build="no"
905  ;;
906  --enable-xen-pv-domain-build) xen_pv_domain_build="yes"
907  ;;
908  --disable-brlapi) brlapi="no"
909  ;;
910  --enable-brlapi) brlapi="yes"
911  ;;
912  --disable-bluez) bluez="no"
913  ;;
914  --enable-bluez) bluez="yes"
915  ;;
916  --disable-kvm) kvm="no"
917  ;;
918  --enable-kvm) kvm="yes"
919  ;;
920  --disable-tcg-interpreter) tcg_interpreter="no"
921  ;;
922  --enable-tcg-interpreter) tcg_interpreter="yes"
923  ;;
924  --disable-cap-ng)  cap_ng="no"
925  ;;
926  --enable-cap-ng) cap_ng="yes"
927  ;;
928  --disable-spice) spice="no"
929  ;;
930  --enable-spice) spice="yes"
931  ;;
932  --disable-libiscsi) libiscsi="no"
933  ;;
934  --enable-libiscsi) libiscsi="yes"
935  ;;
936  --disable-libnfs) libnfs="no"
937  ;;
938  --enable-libnfs) libnfs="yes"
939  ;;
940  --enable-profiler) profiler="yes"
941  ;;
942  --disable-cocoa) cocoa="no"
943  ;;
944  --enable-cocoa)
945      cocoa="yes" ;
946      audio_drv_list="coreaudio `echo $audio_drv_list | sed s,coreaudio,,g`"
947  ;;
948  --disable-system) softmmu="no"
949  ;;
950  --enable-system) softmmu="yes"
951  ;;
952  --disable-user)
953      linux_user="no" ;
954      bsd_user="no" ;
955  ;;
956  --enable-user) ;;
957  --disable-linux-user) linux_user="no"
958  ;;
959  --enable-linux-user) linux_user="yes"
960  ;;
961  --disable-bsd-user) bsd_user="no"
962  ;;
963  --enable-bsd-user) bsd_user="yes"
964  ;;
965  --enable-pie) pie="yes"
966  ;;
967  --disable-pie) pie="no"
968  ;;
969  --enable-werror) werror="yes"
970  ;;
971  --disable-werror) werror="no"
972  ;;
973  --enable-stack-protector) stack_protector="yes"
974  ;;
975  --disable-stack-protector) stack_protector="no"
976  ;;
977  --disable-curses) curses="no"
978  ;;
979  --enable-curses) curses="yes"
980  ;;
981  --disable-curl) curl="no"
982  ;;
983  --enable-curl) curl="yes"
984  ;;
985  --disable-fdt) fdt="no"
986  ;;
987  --enable-fdt) fdt="yes"
988  ;;
989  --disable-linux-aio) linux_aio="no"
990  ;;
991  --enable-linux-aio) linux_aio="yes"
992  ;;
993  --disable-attr) attr="no"
994  ;;
995  --enable-attr) attr="yes"
996  ;;
997  --disable-blobs) blobs="no"
998  ;;
999  --with-pkgversion=*) pkgversion=" ($optarg)"
1000  ;;
1001  --with-coroutine=*) coroutine="$optarg"
1002  ;;
1003  --disable-coroutine-pool) coroutine_pool="no"
1004  ;;
1005  --enable-coroutine-pool) coroutine_pool="yes"
1006  ;;
1007  --disable-docs) docs="no"
1008  ;;
1009  --enable-docs) docs="yes"
1010  ;;
1011  --disable-vhost-net) vhost_net="no"
1012  ;;
1013  --enable-vhost-net) vhost_net="yes"
1014  ;;
1015  --disable-vhost-scsi) vhost_scsi="no"
1016  ;;
1017  --enable-vhost-scsi) vhost_scsi="yes"
1018  ;;
1019  --disable-opengl) opengl="no"
1020  ;;
1021  --enable-opengl) opengl="yes"
1022  ;;
1023  --disable-rbd) rbd="no"
1024  ;;
1025  --enable-rbd) rbd="yes"
1026  ;;
1027  --disable-xfsctl) xfs="no"
1028  ;;
1029  --enable-xfsctl) xfs="yes"
1030  ;;
1031  --disable-smartcard) smartcard="no"
1032  ;;
1033  --enable-smartcard) smartcard="yes"
1034  ;;
1035  --disable-libusb) libusb="no"
1036  ;;
1037  --enable-libusb) libusb="yes"
1038  ;;
1039  --disable-usb-redir) usb_redir="no"
1040  ;;
1041  --enable-usb-redir) usb_redir="yes"
1042  ;;
1043  --disable-zlib-test) zlib="no"
1044  ;;
1045  --disable-lzo) lzo="no"
1046  ;;
1047  --enable-lzo) lzo="yes"
1048  ;;
1049  --disable-snappy) snappy="no"
1050  ;;
1051  --enable-snappy) snappy="yes"
1052  ;;
1053  --disable-bzip2) bzip2="no"
1054  ;;
1055  --enable-bzip2) bzip2="yes"
1056  ;;
1057  --enable-guest-agent) guest_agent="yes"
1058  ;;
1059  --disable-guest-agent) guest_agent="no"
1060  ;;
1061  --enable-guest-agent-msi) guest_agent_msi="yes"
1062  ;;
1063  --disable-guest-agent-msi) guest_agent_msi="no"
1064  ;;
1065  --with-vss-sdk) vss_win32_sdk=""
1066  ;;
1067  --with-vss-sdk=*) vss_win32_sdk="$optarg"
1068  ;;
1069  --without-vss-sdk) vss_win32_sdk="no"
1070  ;;
1071  --with-win-sdk) win_sdk=""
1072  ;;
1073  --with-win-sdk=*) win_sdk="$optarg"
1074  ;;
1075  --without-win-sdk) win_sdk="no"
1076  ;;
1077  --enable-tools) want_tools="yes"
1078  ;;
1079  --disable-tools) want_tools="no"
1080  ;;
1081  --enable-seccomp) seccomp="yes"
1082  ;;
1083  --disable-seccomp) seccomp="no"
1084  ;;
1085  --disable-glusterfs) glusterfs="no"
1086  ;;
1087  --enable-glusterfs) glusterfs="yes"
1088  ;;
1089  --disable-archipelago) archipelago="no"
1090  ;;
1091  --enable-archipelago) archipelago="yes"
1092  ;;
1093  --disable-virtio-blk-data-plane|--enable-virtio-blk-data-plane)
1094      echo "$0: $opt is obsolete, virtio-blk data-plane is always on" >&2
1095  ;;
1096  --disable-gtk) gtk="no"
1097  ;;
1098  --enable-gtk) gtk="yes"
1099  ;;
1100  --disable-gnutls) gnutls="no"
1101  ;;
1102  --enable-gnutls) gnutls="yes"
1103  ;;
1104  --disable-nettle) nettle="no"
1105  ;;
1106  --enable-nettle) nettle="yes"
1107  ;;
1108  --disable-gcrypt) gcrypt="no"
1109  ;;
1110  --enable-gcrypt) gcrypt="yes"
1111  ;;
1112  --enable-rdma) rdma="yes"
1113  ;;
1114  --disable-rdma) rdma="no"
1115  ;;
1116  --with-gtkabi=*) gtkabi="$optarg"
1117  ;;
1118  --disable-vte) vte="no"
1119  ;;
1120  --enable-vte) vte="yes"
1121  ;;
1122  --disable-virglrenderer) virglrenderer="no"
1123  ;;
1124  --enable-virglrenderer) virglrenderer="yes"
1125  ;;
1126  --disable-tpm) tpm="no"
1127  ;;
1128  --enable-tpm) tpm="yes"
1129  ;;
1130  --disable-libssh2) libssh2="no"
1131  ;;
1132  --enable-libssh2) libssh2="yes"
1133  ;;
1134  --enable-vhdx) vhdx="yes"
1135  ;;
1136  --disable-vhdx) vhdx="no"
1137  ;;
1138  --disable-numa) numa="no"
1139  ;;
1140  --enable-numa) numa="yes"
1141  ;;
1142  --disable-tcmalloc) tcmalloc="no"
1143  ;;
1144  --enable-tcmalloc) tcmalloc="yes"
1145  ;;
1146  --disable-jemalloc) jemalloc="no"
1147  ;;
1148  --enable-jemalloc) jemalloc="yes"
1149  ;;
1150  *)
1151      echo "ERROR: unknown option $opt"
1152      echo "Try '$0 --help' for more information"
1153      exit 1
1154  ;;
1155  esac
1156done
1157
1158if ! has $python; then
1159  error_exit "Python not found. Use --python=/path/to/python"
1160fi
1161
1162# Note that if the Python conditional here evaluates True we will exit
1163# with status 1 which is a shell 'false' value.
1164if ! $python -c 'import sys; sys.exit(sys.version_info < (2,6) or sys.version_info >= (3,))'; then
1165  error_exit "Cannot use '$python', Python 2.6 or later is required." \
1166      "Note that Python 3 or later is not yet supported." \
1167      "Use --python=/path/to/python to specify a supported Python."
1168fi
1169
1170# Suppress writing compiled files
1171python="$python -B"
1172
1173case "$cpu" in
1174    ppc)
1175           CPU_CFLAGS="-m32"
1176           LDFLAGS="-m32 $LDFLAGS"
1177           ;;
1178    ppc64)
1179           CPU_CFLAGS="-m64"
1180           LDFLAGS="-m64 $LDFLAGS"
1181           ;;
1182    sparc)
1183           LDFLAGS="-m32 $LDFLAGS"
1184           CPU_CFLAGS="-m32 -mcpu=ultrasparc"
1185           ;;
1186    sparc64)
1187           LDFLAGS="-m64 $LDFLAGS"
1188           CPU_CFLAGS="-m64 -mcpu=ultrasparc"
1189           ;;
1190    s390)
1191           CPU_CFLAGS="-m31"
1192           LDFLAGS="-m31 $LDFLAGS"
1193           ;;
1194    s390x)
1195           CPU_CFLAGS="-m64"
1196           LDFLAGS="-m64 $LDFLAGS"
1197           ;;
1198    i386)
1199           CPU_CFLAGS="-m32"
1200           LDFLAGS="-m32 $LDFLAGS"
1201           cc_i386='$(CC) -m32'
1202           ;;
1203    x86_64)
1204           CPU_CFLAGS="-m64"
1205           LDFLAGS="-m64 $LDFLAGS"
1206           cc_i386='$(CC) -m32'
1207           ;;
1208    x32)
1209           CPU_CFLAGS="-mx32"
1210           LDFLAGS="-mx32 $LDFLAGS"
1211           cc_i386='$(CC) -m32'
1212           ;;
1213    # No special flags required for other host CPUs
1214esac
1215
1216QEMU_CFLAGS="$CPU_CFLAGS $QEMU_CFLAGS"
1217EXTRA_CFLAGS="$CPU_CFLAGS $EXTRA_CFLAGS"
1218
1219default_target_list=""
1220
1221mak_wilds=""
1222
1223if [ "$softmmu" = "yes" ]; then
1224    mak_wilds="${mak_wilds} $source_path/default-configs/*-softmmu.mak"
1225fi
1226if [ "$linux_user" = "yes" ]; then
1227    mak_wilds="${mak_wilds} $source_path/default-configs/*-linux-user.mak"
1228fi
1229if [ "$bsd_user" = "yes" ]; then
1230    mak_wilds="${mak_wilds} $source_path/default-configs/*-bsd-user.mak"
1231fi
1232
1233for config in $mak_wilds; do
1234    default_target_list="${default_target_list} $(basename "$config" .mak)"
1235done
1236
1237if test x"$show_help" = x"yes" ; then
1238cat << EOF
1239
1240Usage: configure [options]
1241Options: [defaults in brackets after descriptions]
1242
1243Standard options:
1244  --help                   print this message
1245  --prefix=PREFIX          install in PREFIX [$prefix]
1246  --interp-prefix=PREFIX   where to find shared libraries, etc.
1247                           use %M for cpu name [$interp_prefix]
1248  --target-list=LIST       set target list (default: build everything)
1249$(echo Available targets: $default_target_list | \
1250  fold -s -w 53 | sed -e 's/^/                           /')
1251
1252Advanced options (experts only):
1253  --source-path=PATH       path of source code [$source_path]
1254  --cross-prefix=PREFIX    use PREFIX for compile tools [$cross_prefix]
1255  --cc=CC                  use C compiler CC [$cc]
1256  --iasl=IASL              use ACPI compiler IASL [$iasl]
1257  --host-cc=CC             use C compiler CC [$host_cc] for code run at
1258                           build time
1259  --cxx=CXX                use C++ compiler CXX [$cxx]
1260  --objcc=OBJCC            use Objective-C compiler OBJCC [$objcc]
1261  --extra-cflags=CFLAGS    append extra C compiler flags QEMU_CFLAGS
1262  --extra-ldflags=LDFLAGS  append extra linker flags LDFLAGS
1263  --make=MAKE              use specified make [$make]
1264  --install=INSTALL        use specified install [$install]
1265  --python=PYTHON          use specified python [$python]
1266  --smbd=SMBD              use specified smbd [$smbd]
1267  --static                 enable static build [$static]
1268  --mandir=PATH            install man pages in PATH
1269  --datadir=PATH           install firmware in PATH$confsuffix
1270  --docdir=PATH            install documentation in PATH$confsuffix
1271  --bindir=PATH            install binaries in PATH
1272  --libdir=PATH            install libraries in PATH
1273  --sysconfdir=PATH        install config in PATH$confsuffix
1274  --localstatedir=PATH     install local state in PATH (set at runtime on win32)
1275  --with-confsuffix=SUFFIX suffix for QEMU data inside datadir/libdir/sysconfdir [$confsuffix]
1276  --enable-debug           enable common debug build options
1277  --disable-strip          disable stripping binaries
1278  --disable-werror         disable compilation abort on warning
1279  --disable-stack-protector disable compiler-provided stack protection
1280  --audio-drv-list=LIST    set audio drivers list:
1281                           Available drivers: $audio_possible_drivers
1282  --block-drv-whitelist=L  Same as --block-drv-rw-whitelist=L
1283  --block-drv-rw-whitelist=L
1284                           set block driver read-write whitelist
1285                           (affects only QEMU, not qemu-img)
1286  --block-drv-ro-whitelist=L
1287                           set block driver read-only whitelist
1288                           (affects only QEMU, not qemu-img)
1289  --enable-trace-backends=B Set trace backend
1290                           Available backends: $($python $source_path/scripts/tracetool.py --list-backends)
1291  --with-trace-file=NAME   Full PATH,NAME of file to store traces
1292                           Default:trace-<pid>
1293  --disable-slirp          disable SLIRP userspace network connectivity
1294  --enable-tcg-interpreter enable TCG with bytecode interpreter (TCI)
1295  --oss-lib                path to OSS library
1296  --cpu=CPU                Build for host CPU [$cpu]
1297  --with-coroutine=BACKEND coroutine backend. Supported options:
1298                           gthread, ucontext, sigaltstack, windows
1299  --enable-gcov            enable test coverage analysis with gcov
1300  --gcov=GCOV              use specified gcov [$gcov_tool]
1301  --disable-blobs          disable installing provided firmware blobs
1302  --with-vss-sdk=SDK-path  enable Windows VSS support in QEMU Guest Agent
1303  --with-win-sdk=SDK-path  path to Windows Platform SDK (to build VSS .tlb)
1304
1305Optional features, enabled with --enable-FEATURE and
1306disabled with --disable-FEATURE, default is enabled if available:
1307
1308  system          all system emulation targets
1309  user            supported user emulation targets
1310  linux-user      all linux usermode emulation targets
1311  bsd-user        all BSD usermode emulation targets
1312  docs            build documentation
1313  guest-agent     build the QEMU Guest Agent
1314  guest-agent-msi build guest agent Windows MSI installation package
1315  pie             Position Independent Executables
1316  modules         modules support
1317  debug-tcg       TCG debugging (default is disabled)
1318  debug-info      debugging information
1319  sparse          sparse checker
1320
1321  gnutls          GNUTLS cryptography support
1322  nettle          nettle cryptography support
1323  gcrypt          libgcrypt cryptography support
1324  sdl             SDL UI
1325  --with-sdlabi     select preferred SDL ABI 1.2 or 2.0
1326  gtk             gtk UI
1327  --with-gtkabi     select preferred GTK ABI 2.0 or 3.0
1328  vte             vte support for the gtk UI
1329  curses          curses UI
1330  vnc             VNC UI support
1331  vnc-sasl        SASL encryption for VNC server
1332  vnc-jpeg        JPEG lossy compression for VNC server
1333  vnc-png         PNG compression for VNC server
1334  cocoa           Cocoa UI (Mac OS X only)
1335  virtfs          VirtFS
1336  xen             xen backend driver support
1337  xen-pci-passthrough
1338  brlapi          BrlAPI (Braile)
1339  curl            curl connectivity
1340  fdt             fdt device tree
1341  bluez           bluez stack connectivity
1342  kvm             KVM acceleration support
1343  rdma            RDMA-based migration support
1344  uuid            uuid support
1345  vde             support for vde network
1346  netmap          support for netmap network
1347  linux-aio       Linux AIO support
1348  cap-ng          libcap-ng support
1349  attr            attr and xattr support
1350  vhost-net       vhost-net acceleration support
1351  spice           spice
1352  rbd             rados block device (rbd)
1353  libiscsi        iscsi support
1354  libnfs          nfs support
1355  smartcard       smartcard support (libcacard)
1356  libusb          libusb (for usb passthrough)
1357  usb-redir       usb network redirection support
1358  lzo             support of lzo compression library
1359  snappy          support of snappy compression library
1360  bzip2           support of bzip2 compression library
1361                  (for reading bzip2-compressed dmg images)
1362  seccomp         seccomp support
1363  coroutine-pool  coroutine freelist (better performance)
1364  glusterfs       GlusterFS backend
1365  archipelago     Archipelago backend
1366  tpm             TPM support
1367  libssh2         ssh block device support
1368  vhdx            support for the Microsoft VHDX image format
1369  numa            libnuma support
1370  tcmalloc        tcmalloc support
1371  jemalloc        jemalloc support
1372
1373NOTE: The object files are built at the place where configure is launched
1374EOF
1375exit 0
1376fi
1377
1378# Now we have handled --enable-tcg-interpreter and know we're not just
1379# printing the help message, bail out if the host CPU isn't supported.
1380if test "$ARCH" = "unknown"; then
1381    if test "$tcg_interpreter" = "yes" ; then
1382        echo "Unsupported CPU = $cpu, will use TCG with TCI (experimental)"
1383        ARCH=tci
1384    else
1385        error_exit "Unsupported CPU = $cpu, try --enable-tcg-interpreter"
1386    fi
1387fi
1388
1389# Consult white-list to determine whether to enable werror
1390# by default.  Only enable by default for git builds
1391z_version=`cut -f3 -d. $source_path/VERSION`
1392
1393if test -z "$werror" ; then
1394    if test -d "$source_path/.git" -a \
1395        "$linux" = "yes" ; then
1396        werror="yes"
1397    else
1398        werror="no"
1399    fi
1400fi
1401
1402# check that the C compiler works.
1403write_c_skeleton;
1404if compile_object ; then
1405  : C compiler works ok
1406else
1407    error_exit "\"$cc\" either does not exist or does not work"
1408fi
1409if ! compile_prog ; then
1410    error_exit "\"$cc\" cannot build an executable (is your linker broken?)"
1411fi
1412
1413# Check that the C++ compiler exists and works with the C compiler
1414if has $cxx; then
1415    cat > $TMPC <<EOF
1416int c_function(void);
1417int main(void) { return c_function(); }
1418EOF
1419
1420    compile_object
1421
1422    cat > $TMPCXX <<EOF
1423extern "C" {
1424   int c_function(void);
1425}
1426int c_function(void) { return 42; }
1427EOF
1428
1429    update_cxxflags
1430
1431    if do_cxx $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $LDFLAGS; then
1432        # C++ compiler $cxx works ok with C compiler $cc
1433        :
1434    else
1435        echo "C++ compiler $cxx does not work with C compiler $cc"
1436        echo "Disabling C++ specific optional code"
1437        cxx=
1438    fi
1439else
1440    echo "No C++ compiler available; disabling C++ specific optional code"
1441    cxx=
1442fi
1443
1444gcc_flags="-Wold-style-declaration -Wold-style-definition -Wtype-limits"
1445gcc_flags="-Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers $gcc_flags"
1446gcc_flags="-Wmissing-include-dirs -Wempty-body -Wnested-externs $gcc_flags"
1447gcc_flags="-Wendif-labels $gcc_flags"
1448gcc_flags="-Wno-initializer-overrides $gcc_flags"
1449gcc_flags="-Wno-string-plus-int $gcc_flags"
1450# Note that we do not add -Werror to gcc_flags here, because that would
1451# enable it for all configure tests. If a configure test failed due
1452# to -Werror this would just silently disable some features,
1453# so it's too error prone.
1454
1455cc_has_warning_flag() {
1456    write_c_skeleton;
1457
1458    # Use the positive sense of the flag when testing for -Wno-wombat
1459    # support (gcc will happily accept the -Wno- form of unknown
1460    # warning options).
1461    optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
1462    compile_prog "-Werror $optflag" ""
1463}
1464
1465for flag in $gcc_flags; do
1466    if cc_has_warning_flag $flag ; then
1467        QEMU_CFLAGS="$QEMU_CFLAGS $flag"
1468    fi
1469done
1470
1471if test "$stack_protector" != "no"; then
1472  cat > $TMPC << EOF
1473int main(int argc, char *argv[])
1474{
1475    char arr[64], *p = arr, *c = argv[0];
1476    while (*c) {
1477        *p++ = *c++;
1478    }
1479    return 0;
1480}
1481EOF
1482  gcc_flags="-fstack-protector-strong -fstack-protector-all"
1483  sp_on=0
1484  for flag in $gcc_flags; do
1485    # We need to check both a compile and a link, since some compiler
1486    # setups fail only on a .c->.o compile and some only at link time
1487    if do_cc $QEMU_CFLAGS -Werror $flag -c -o $TMPO $TMPC &&
1488       compile_prog "-Werror $flag" ""; then
1489      QEMU_CFLAGS="$QEMU_CFLAGS $flag"
1490      sp_on=1
1491      break
1492    fi
1493  done
1494  if test "$stack_protector" = yes; then
1495    if test $sp_on = 0; then
1496      error_exit "Stack protector not supported"
1497    fi
1498  fi
1499fi
1500
1501# Workaround for http://gcc.gnu.org/PR55489.  Happens with -fPIE/-fPIC and
1502# large functions that use global variables.  The bug is in all releases of
1503# GCC, but it became particularly acute in 4.6.x and 4.7.x.  It is fixed in
1504# 4.7.3 and 4.8.0.  We should be able to delete this at the end of 2013.
1505cat > $TMPC << EOF
1506#if __GNUC__ == 4 && (__GNUC_MINOR__ == 6 || (__GNUC_MINOR__ == 7 && __GNUC_PATCHLEVEL__ <= 2))
1507int main(void) { return 0; }
1508#else
1509#error No bug in this compiler.
1510#endif
1511EOF
1512if compile_prog "-Werror -fno-gcse" "" ; then
1513  TRANSLATE_OPT_CFLAGS=-fno-gcse
1514fi
1515
1516if test "$static" = "yes" ; then
1517  if test "$modules" = "yes" ; then
1518    error_exit "static and modules are mutually incompatible"
1519  fi
1520  if test "$pie" = "yes" ; then
1521    error_exit "static and pie are mutually incompatible"
1522  else
1523    pie="no"
1524  fi
1525fi
1526
1527# Unconditional check for compiler __thread support
1528  cat > $TMPC << EOF
1529static __thread int tls_var;
1530int main(void) { return tls_var; }
1531EOF
1532
1533if ! compile_prog "-Werror" "" ; then
1534    error_exit "Your compiler does not support the __thread specifier for " \
1535	"Thread-Local Storage (TLS). Please upgrade to a version that does."
1536fi
1537
1538if test "$pie" = ""; then
1539  case "$cpu-$targetos" in
1540    i386-Linux|x86_64-Linux|x32-Linux|i386-OpenBSD|x86_64-OpenBSD)
1541      ;;
1542    *)
1543      pie="no"
1544      ;;
1545  esac
1546fi
1547
1548if test "$pie" != "no" ; then
1549  cat > $TMPC << EOF
1550
1551#ifdef __linux__
1552#  define THREAD __thread
1553#else
1554#  define THREAD
1555#endif
1556
1557static THREAD int tls_var;
1558
1559int main(void) { return tls_var; }
1560
1561EOF
1562  if compile_prog "-fPIE -DPIE" "-pie"; then
1563    QEMU_CFLAGS="-fPIE -DPIE $QEMU_CFLAGS"
1564    LDFLAGS="-pie $LDFLAGS"
1565    pie="yes"
1566    if compile_prog "" "-Wl,-z,relro -Wl,-z,now" ; then
1567      LDFLAGS="-Wl,-z,relro -Wl,-z,now $LDFLAGS"
1568    fi
1569  else
1570    if test "$pie" = "yes"; then
1571      error_exit "PIE not available due to missing toolchain support"
1572    else
1573      echo "Disabling PIE due to missing toolchain support"
1574      pie="no"
1575    fi
1576  fi
1577
1578  if compile_prog "-Werror -fno-pie" "-nopie"; then
1579    CFLAGS_NOPIE="-fno-pie"
1580    LDFLAGS_NOPIE="-nopie"
1581  fi
1582fi
1583
1584##########################################
1585# __sync_fetch_and_and requires at least -march=i486. Many toolchains
1586# use i686 as default anyway, but for those that don't, an explicit
1587# specification is necessary
1588
1589if test "$cpu" = "i386"; then
1590  cat > $TMPC << EOF
1591static int sfaa(int *ptr)
1592{
1593  return __sync_fetch_and_and(ptr, 0);
1594}
1595
1596int main(void)
1597{
1598  int val = 42;
1599  val = __sync_val_compare_and_swap(&val, 0, 1);
1600  sfaa(&val);
1601  return val;
1602}
1603EOF
1604  if ! compile_prog "" "" ; then
1605    QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS"
1606  fi
1607fi
1608
1609#########################################
1610# Solaris specific configure tool chain decisions
1611
1612if test "$solaris" = "yes" ; then
1613  if has $install; then
1614    :
1615  else
1616    error_exit "Solaris install program not found. Use --install=/usr/ucb/install or" \
1617        "install fileutils from www.blastwave.org using pkg-get -i fileutils" \
1618        "to get ginstall which is used by default (which lives in /opt/csw/bin)"
1619  fi
1620  if test "`path_of $install`" = "/usr/sbin/install" ; then
1621    error_exit "Solaris /usr/sbin/install is not an appropriate install program." \
1622        "try ginstall from the GNU fileutils available from www.blastwave.org" \
1623        "using pkg-get -i fileutils, or use --install=/usr/ucb/install"
1624  fi
1625  if has ar; then
1626    :
1627  else
1628    if test -f /usr/ccs/bin/ar ; then
1629      error_exit "No path includes ar" \
1630          "Add /usr/ccs/bin to your path and rerun configure"
1631    fi
1632    error_exit "No path includes ar"
1633  fi
1634fi
1635
1636if test -z "${target_list+xxx}" ; then
1637    target_list="$default_target_list"
1638else
1639    target_list=`echo "$target_list" | sed -e 's/,/ /g'`
1640fi
1641
1642# Check that we recognised the target name; this allows a more
1643# friendly error message than if we let it fall through.
1644for target in $target_list; do
1645    case " $default_target_list " in
1646        *" $target "*)
1647            ;;
1648        *)
1649            error_exit "Unknown target name '$target'"
1650            ;;
1651    esac
1652done
1653
1654# see if system emulation was really requested
1655case " $target_list " in
1656  *"-softmmu "*) softmmu=yes
1657  ;;
1658  *) softmmu=no
1659  ;;
1660esac
1661
1662feature_not_found() {
1663  feature=$1
1664  remedy=$2
1665
1666  error_exit "User requested feature $feature" \
1667      "configure was not able to find it." \
1668      "$remedy"
1669}
1670
1671# ---
1672# big/little endian test
1673cat > $TMPC << EOF
1674short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, };
1675short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, };
1676extern int foo(short *, short *);
1677int main(int argc, char *argv[]) {
1678    return foo(big_endian, little_endian);
1679}
1680EOF
1681
1682if compile_object ; then
1683    if grep -q BiGeNdIaN $TMPO ; then
1684        bigendian="yes"
1685    elif grep -q LiTtLeEnDiAn $TMPO ; then
1686        bigendian="no"
1687    else
1688        echo big/little test failed
1689    fi
1690else
1691    echo big/little test failed
1692fi
1693
1694##########################################
1695# cocoa implies not SDL or GTK
1696# (the cocoa UI code currently assumes it is always the active UI
1697# and doesn't interact well with other UI frontend code)
1698if test "$cocoa" = "yes"; then
1699    if test "$sdl" = "yes"; then
1700        error_exit "Cocoa and SDL UIs cannot both be enabled at once"
1701    fi
1702    if test "$gtk" = "yes"; then
1703        error_exit "Cocoa and GTK UIs cannot both be enabled at once"
1704    fi
1705    gtk=no
1706    sdl=no
1707fi
1708
1709##########################################
1710# L2TPV3 probe
1711
1712cat > $TMPC <<EOF
1713#include <sys/socket.h>
1714#include <linux/ip.h>
1715int main(void) { return sizeof(struct mmsghdr); }
1716EOF
1717if compile_prog "" "" ; then
1718  l2tpv3=yes
1719else
1720  l2tpv3=no
1721fi
1722
1723##########################################
1724# MinGW / Mingw-w64 localtime_r/gmtime_r check
1725
1726if test "$mingw32" = "yes"; then
1727    # Some versions of MinGW / Mingw-w64 lack localtime_r
1728    # and gmtime_r entirely.
1729    #
1730    # Some versions of Mingw-w64 define a macro for
1731    # localtime_r/gmtime_r.
1732    #
1733    # Some versions of Mingw-w64 will define functions
1734    # for localtime_r/gmtime_r, but only if you have
1735    # _POSIX_THREAD_SAFE_FUNCTIONS defined. For fun
1736    # though, unistd.h and pthread.h both define
1737    # that for you.
1738    #
1739    # So this #undef localtime_r and #include <unistd.h>
1740    # are not in fact redundant.
1741cat > $TMPC << EOF
1742#include <unistd.h>
1743#include <time.h>
1744#undef localtime_r
1745int main(void) { localtime_r(NULL, NULL); return 0; }
1746EOF
1747    if compile_prog "" "" ; then
1748        localtime_r="yes"
1749    else
1750        localtime_r="no"
1751    fi
1752fi
1753
1754##########################################
1755# pkg-config probe
1756
1757if ! has "$pkg_config_exe"; then
1758  error_exit "pkg-config binary '$pkg_config_exe' not found"
1759fi
1760
1761##########################################
1762# NPTL probe
1763
1764if test "$linux_user" = "yes"; then
1765  cat > $TMPC <<EOF
1766#include <sched.h>
1767#include <linux/futex.h>
1768int main(void) {
1769#if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
1770#error bork
1771#endif
1772  return 0;
1773}
1774EOF
1775  if ! compile_object ; then
1776    feature_not_found "nptl" "Install glibc and linux kernel headers."
1777  fi
1778fi
1779
1780##########################################
1781# avx2 optimization requirement check
1782
1783cat > $TMPC << EOF
1784static void bar(void) {}
1785static void *bar_ifunc(void) {return (void*) bar;}
1786static void foo(void) __attribute__((ifunc("bar_ifunc")));
1787int main(void) { foo(); return 0; }
1788EOF
1789if compile_prog "-mavx2" "" ; then
1790    if readelf --syms $TMPE |grep "IFUNC.*foo" >/dev/null 2>&1; then
1791        avx2_opt="yes"
1792    fi
1793fi
1794
1795#########################################
1796# zlib check
1797
1798if test "$zlib" != "no" ; then
1799    cat > $TMPC << EOF
1800#include <zlib.h>
1801int main(void) { zlibVersion(); return 0; }
1802EOF
1803    if compile_prog "" "-lz" ; then
1804        :
1805    else
1806        error_exit "zlib check failed" \
1807            "Make sure to have the zlib libs and headers installed."
1808    fi
1809fi
1810LIBS="$LIBS -lz"
1811
1812##########################################
1813# lzo check
1814
1815if test "$lzo" != "no" ; then
1816    cat > $TMPC << EOF
1817#include <lzo/lzo1x.h>
1818int main(void) { lzo_version(); return 0; }
1819EOF
1820    if compile_prog "" "-llzo2" ; then
1821        libs_softmmu="$libs_softmmu -llzo2"
1822        lzo="yes"
1823    else
1824        if test "$lzo" = "yes"; then
1825            feature_not_found "liblzo2" "Install liblzo2 devel"
1826        fi
1827        lzo="no"
1828    fi
1829fi
1830
1831##########################################
1832# snappy check
1833
1834if test "$snappy" != "no" ; then
1835    cat > $TMPC << EOF
1836#include <snappy-c.h>
1837int main(void) { snappy_max_compressed_length(4096); return 0; }
1838EOF
1839    if compile_prog "" "-lsnappy" ; then
1840        libs_softmmu="$libs_softmmu -lsnappy"
1841        snappy="yes"
1842    else
1843        if test "$snappy" = "yes"; then
1844            feature_not_found "libsnappy" "Install libsnappy devel"
1845        fi
1846        snappy="no"
1847    fi
1848fi
1849
1850##########################################
1851# bzip2 check
1852
1853if test "$bzip2" != "no" ; then
1854    cat > $TMPC << EOF
1855#include <bzlib.h>
1856int main(void) { BZ2_bzlibVersion(); return 0; }
1857EOF
1858    if compile_prog "" "-lbz2" ; then
1859        bzip2="yes"
1860    else
1861        if test "$bzip2" = "yes"; then
1862            feature_not_found "libbzip2" "Install libbzip2 devel"
1863        fi
1864        bzip2="no"
1865    fi
1866fi
1867
1868##########################################
1869# libseccomp check
1870
1871if test "$seccomp" != "no" ; then
1872    case "$cpu" in
1873    i386|x86_64)
1874        libseccomp_minver="2.1.0"
1875        ;;
1876    mips)
1877        libseccomp_minver="2.2.0"
1878        ;;
1879    arm|aarch64)
1880        libseccomp_minver="2.2.3"
1881        ;;
1882    *)
1883        libseccomp_minver=""
1884        ;;
1885    esac
1886
1887    if test "$libseccomp_minver" != "" &&
1888       $pkg_config --atleast-version=$libseccomp_minver libseccomp ; then
1889        libs_softmmu="$libs_softmmu `$pkg_config --libs libseccomp`"
1890        QEMU_CFLAGS="$QEMU_CFLAGS `$pkg_config --cflags libseccomp`"
1891        seccomp="yes"
1892    else
1893        if test "$seccomp" = "yes" ; then
1894            if test "$libseccomp_minver" != "" ; then
1895                feature_not_found "libseccomp" \
1896                    "Install libseccomp devel >= $libseccomp_minver"
1897            else
1898                feature_not_found "libseccomp" \
1899                    "libseccomp is not supported for host cpu $cpu"
1900            fi
1901        fi
1902        seccomp="no"
1903    fi
1904fi
1905##########################################
1906# xen probe
1907
1908if test "$xen" != "no" ; then
1909  xen_libs="-lxenstore -lxenctrl -lxenguest"
1910  xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
1911
1912  # First we test whether Xen headers and libraries are available.
1913  # If no, we are done and there is no Xen support.
1914  # If yes, more tests are run to detect the Xen version.
1915
1916  # Xen (any)
1917  cat > $TMPC <<EOF
1918#include <xenctrl.h>
1919int main(void) {
1920  return 0;
1921}
1922EOF
1923  if ! compile_prog "" "$xen_libs" ; then
1924    # Xen not found
1925    if test "$xen" = "yes" ; then
1926      feature_not_found "xen" "Install xen devel"
1927    fi
1928    xen=no
1929
1930  # Xen unstable
1931  elif
1932      cat > $TMPC <<EOF &&
1933/*
1934 * If we have stable libs the we don't want the libxc compat
1935 * layers, regardless of what CFLAGS we may have been given.
1936 */
1937#undef XC_WANT_COMPAT_EVTCHN_API
1938#undef XC_WANT_COMPAT_GNTTAB_API
1939#undef XC_WANT_COMPAT_MAP_FOREIGN_API
1940#include <xenctrl.h>
1941#include <xenstore.h>
1942#include <xenevtchn.h>
1943#include <xengnttab.h>
1944#include <xenforeignmemory.h>
1945#include <stdint.h>
1946#include <xen/hvm/hvm_info_table.h>
1947#if !defined(HVM_MAX_VCPUS)
1948# error HVM_MAX_VCPUS not defined
1949#endif
1950int main(void) {
1951  xc_interface *xc = NULL;
1952  xenforeignmemory_handle *xfmem;
1953  xenevtchn_handle *xe;
1954  xengnttab_handle *xg;
1955  xen_domain_handle_t handle;
1956
1957  xs_daemon_open();
1958
1959  xc = xc_interface_open(0, 0, 0);
1960  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
1961  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
1962  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
1963  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
1964  xc_domain_create(xc, 0, handle, 0, NULL, NULL);
1965
1966  xfmem = xenforeignmemory_open(0, 0);
1967  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
1968
1969  xe = xenevtchn_open(0, 0);
1970  xenevtchn_fd(xe);
1971
1972  xg = xengnttab_open(0, 0);
1973  xengnttab_map_grant_ref(xg, 0, 0, 0);
1974
1975  return 0;
1976}
1977EOF
1978      compile_prog "" "$xen_libs $xen_stable_libs"
1979    then
1980    xen_ctrl_version=471
1981    xen=yes
1982  elif
1983      cat > $TMPC <<EOF &&
1984#include <xenctrl.h>
1985#include <stdint.h>
1986int main(void) {
1987  xc_interface *xc = NULL;
1988  xen_domain_handle_t handle;
1989  xc_domain_create(xc, 0, handle, 0, NULL, NULL);
1990  return 0;
1991}
1992EOF
1993      compile_prog "" "$xen_libs"
1994    then
1995    xen_ctrl_version=470
1996    xen=yes
1997
1998  # Xen 4.6
1999  elif
2000      cat > $TMPC <<EOF &&
2001#include <xenctrl.h>
2002#include <xenstore.h>
2003#include <stdint.h>
2004#include <xen/hvm/hvm_info_table.h>
2005#if !defined(HVM_MAX_VCPUS)
2006# error HVM_MAX_VCPUS not defined
2007#endif
2008int main(void) {
2009  xc_interface *xc;
2010  xs_daemon_open();
2011  xc = xc_interface_open(0, 0, 0);
2012  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2013  xc_gnttab_open(NULL, 0);
2014  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2015  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2016  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2017  xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
2018  return 0;
2019}
2020EOF
2021      compile_prog "" "$xen_libs"
2022    then
2023    xen_ctrl_version=460
2024    xen=yes
2025
2026  # Xen 4.5
2027  elif
2028      cat > $TMPC <<EOF &&
2029#include <xenctrl.h>
2030#include <xenstore.h>
2031#include <stdint.h>
2032#include <xen/hvm/hvm_info_table.h>
2033#if !defined(HVM_MAX_VCPUS)
2034# error HVM_MAX_VCPUS not defined
2035#endif
2036int main(void) {
2037  xc_interface *xc;
2038  xs_daemon_open();
2039  xc = xc_interface_open(0, 0, 0);
2040  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2041  xc_gnttab_open(NULL, 0);
2042  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2043  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2044  xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
2045  return 0;
2046}
2047EOF
2048      compile_prog "" "$xen_libs"
2049    then
2050    xen_ctrl_version=450
2051    xen=yes
2052
2053  elif
2054      cat > $TMPC <<EOF &&
2055#include <xenctrl.h>
2056#include <xenstore.h>
2057#include <stdint.h>
2058#include <xen/hvm/hvm_info_table.h>
2059#if !defined(HVM_MAX_VCPUS)
2060# error HVM_MAX_VCPUS not defined
2061#endif
2062int main(void) {
2063  xc_interface *xc;
2064  xs_daemon_open();
2065  xc = xc_interface_open(0, 0, 0);
2066  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2067  xc_gnttab_open(NULL, 0);
2068  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2069  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2070  return 0;
2071}
2072EOF
2073      compile_prog "" "$xen_libs"
2074    then
2075    xen_ctrl_version=420
2076    xen=yes
2077
2078  else
2079    if test "$xen" = "yes" ; then
2080      feature_not_found "xen (unsupported version)" \
2081                        "Install a supported xen (xen 4.2 or newer)"
2082    fi
2083    xen=no
2084  fi
2085
2086  if test "$xen" = yes; then
2087    if test $xen_ctrl_version -ge 471  ; then
2088      libs_softmmu="$xen_stable_libs $libs_softmmu"
2089    fi
2090    libs_softmmu="$xen_libs $libs_softmmu"
2091  fi
2092fi
2093
2094if test "$xen_pci_passthrough" != "no"; then
2095  if test "$xen" = "yes" && test "$linux" = "yes"; then
2096    xen_pci_passthrough=yes
2097  else
2098    if test "$xen_pci_passthrough" = "yes"; then
2099      error_exit "User requested feature Xen PCI Passthrough" \
2100          " but this feature requires /sys from Linux"
2101    fi
2102    xen_pci_passthrough=no
2103  fi
2104fi
2105
2106if test "$xen_pv_domain_build" = "yes" &&
2107   test "$xen" != "yes"; then
2108    error_exit "User requested Xen PV domain builder support" \
2109	       "which requires Xen support."
2110fi
2111
2112##########################################
2113# Sparse probe
2114if test "$sparse" != "no" ; then
2115  if has cgcc; then
2116    sparse=yes
2117  else
2118    if test "$sparse" = "yes" ; then
2119      feature_not_found "sparse" "Install sparse binary"
2120    fi
2121    sparse=no
2122  fi
2123fi
2124
2125##########################################
2126# X11 probe
2127x11_cflags=
2128x11_libs=-lX11
2129if $pkg_config --exists "x11"; then
2130    x11_cflags=`$pkg_config --cflags x11`
2131    x11_libs=`$pkg_config --libs x11`
2132fi
2133
2134##########################################
2135# GTK probe
2136
2137if test "$gtkabi" = ""; then
2138    # The GTK ABI was not specified explicitly, so try whether 2.0 is available.
2139    # Use 3.0 as a fallback if that is available.
2140    if $pkg_config --exists "gtk+-2.0 >= 2.18.0"; then
2141        gtkabi=2.0
2142    elif $pkg_config --exists "gtk+-3.0 >= 3.0.0"; then
2143        gtkabi=3.0
2144    else
2145        gtkabi=2.0
2146    fi
2147fi
2148
2149if test "$gtk" != "no"; then
2150    gtkpackage="gtk+-$gtkabi"
2151    gtkx11package="gtk+-x11-$gtkabi"
2152    if test "$gtkabi" = "3.0" ; then
2153      gtkversion="3.0.0"
2154    else
2155      gtkversion="2.18.0"
2156    fi
2157    if $pkg_config --exists "$gtkpackage >= $gtkversion"; then
2158        gtk_cflags=`$pkg_config --cflags $gtkpackage`
2159        gtk_libs=`$pkg_config --libs $gtkpackage`
2160        if $pkg_config --exists "$gtkx11package >= $gtkversion"; then
2161            gtk_cflags="$gtk_cflags $x11_cflags"
2162            gtk_libs="$gtk_libs $x11_libs"
2163        fi
2164        libs_softmmu="$gtk_libs $libs_softmmu"
2165        gtk="yes"
2166    elif test "$gtk" = "yes"; then
2167        feature_not_found "gtk" "Install gtk2 or gtk3 devel"
2168    else
2169        gtk="no"
2170    fi
2171fi
2172
2173
2174##########################################
2175# GNUTLS probe
2176
2177gnutls_works() {
2178    # Unfortunately some distros have bad pkg-config information for gnutls
2179    # such that it claims to exist but you get a compiler error if you try
2180    # to use the options returned by --libs. Specifically, Ubuntu for --static
2181    # builds doesn't work:
2182    # https://bugs.launchpad.net/ubuntu/+source/gnutls26/+bug/1478035
2183    #
2184    # So sanity check the cflags/libs before assuming gnutls can be used.
2185    if ! $pkg_config --exists "gnutls"; then
2186        return 1
2187    fi
2188
2189    write_c_skeleton
2190    compile_prog "$($pkg_config --cflags gnutls)" "$($pkg_config --libs gnutls)"
2191}
2192
2193gnutls_gcrypt=no
2194gnutls_nettle=no
2195if test "$gnutls" != "no"; then
2196    if gnutls_works; then
2197        gnutls_cflags=`$pkg_config --cflags gnutls`
2198        gnutls_libs=`$pkg_config --libs gnutls`
2199        libs_softmmu="$gnutls_libs $libs_softmmu"
2200        libs_tools="$gnutls_libs $libs_tools"
2201	QEMU_CFLAGS="$QEMU_CFLAGS $gnutls_cflags"
2202        gnutls="yes"
2203
2204	# gnutls_hash_init requires >= 2.9.10
2205	if $pkg_config --exists "gnutls >= 2.9.10"; then
2206            gnutls_hash="yes"
2207	else
2208	    gnutls_hash="no"
2209	fi
2210
2211	# gnutls_rnd requires >= 2.11.0
2212	if $pkg_config --exists "gnutls >= 2.11.0"; then
2213	    gnutls_rnd="yes"
2214	else
2215	    gnutls_rnd="no"
2216	fi
2217
2218	if $pkg_config --exists 'gnutls >= 3.0'; then
2219	    gnutls_gcrypt=no
2220	    gnutls_nettle=yes
2221	elif $pkg_config --exists 'gnutls >= 2.12'; then
2222	    case `$pkg_config --libs --static gnutls` in
2223		*gcrypt*)
2224		    gnutls_gcrypt=yes
2225		    gnutls_nettle=no
2226		    ;;
2227		*nettle*)
2228		    gnutls_gcrypt=no
2229		    gnutls_nettle=yes
2230		    ;;
2231		*)
2232		    gnutls_gcrypt=yes
2233		    gnutls_nettle=no
2234		    ;;
2235	    esac
2236	else
2237	    gnutls_gcrypt=yes
2238	    gnutls_nettle=no
2239	fi
2240    elif test "$gnutls" = "yes"; then
2241	feature_not_found "gnutls" "Install gnutls devel"
2242    else
2243        gnutls="no"
2244        gnutls_hash="no"
2245        gnutls_rnd="no"
2246    fi
2247else
2248    gnutls_hash="no"
2249    gnutls_rnd="no"
2250fi
2251
2252
2253# If user didn't give a --disable/enable-gcrypt flag,
2254# then mark as disabled if user requested nettle
2255# explicitly, or if gnutls links to nettle
2256if test -z "$gcrypt"
2257then
2258    if test "$nettle" = "yes" || test "$gnutls_nettle" = "yes"
2259    then
2260        gcrypt="no"
2261    fi
2262fi
2263
2264# If user didn't give a --disable/enable-nettle flag,
2265# then mark as disabled if user requested gcrypt
2266# explicitly, or if gnutls links to gcrypt
2267if test -z "$nettle"
2268then
2269    if test "$gcrypt" = "yes" || test "$gnutls_gcrypt" = "yes"
2270    then
2271        nettle="no"
2272    fi
2273fi
2274
2275has_libgcrypt_config() {
2276    if ! has "libgcrypt-config"
2277    then
2278	return 1
2279    fi
2280
2281    if test -n "$cross_prefix"
2282    then
2283	host=`libgcrypt-config --host`
2284	if test "$host-" != $cross_prefix
2285	then
2286	    return 1
2287	fi
2288    fi
2289
2290    return 0
2291}
2292
2293if test "$gcrypt" != "no"; then
2294    if has_libgcrypt_config; then
2295        gcrypt_cflags=`libgcrypt-config --cflags`
2296        gcrypt_libs=`libgcrypt-config --libs`
2297        # Debian has remove -lgpg-error from libgcrypt-config
2298        # as it "spreads unnecessary dependencies" which in
2299        # turn breaks static builds...
2300        if test "$static" = "yes"
2301        then
2302            gcrypt_libs="$gcrypt_libs -lgpg-error"
2303        fi
2304        libs_softmmu="$gcrypt_libs $libs_softmmu"
2305        libs_tools="$gcrypt_libs $libs_tools"
2306        QEMU_CFLAGS="$QEMU_CFLAGS $gcrypt_cflags"
2307        gcrypt="yes"
2308        if test -z "$nettle"; then
2309           nettle="no"
2310        fi
2311
2312        cat > $TMPC << EOF
2313#include <gcrypt.h>
2314int main(void) {
2315  gcry_kdf_derive(NULL, 0, GCRY_KDF_PBKDF2,
2316                  GCRY_MD_SHA256,
2317                  NULL, 0, 0, 0, NULL);
2318 return 0;
2319}
2320EOF
2321        if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
2322            gcrypt_kdf=yes
2323        fi
2324    else
2325        if test "$gcrypt" = "yes"; then
2326            feature_not_found "gcrypt" "Install gcrypt devel"
2327        else
2328            gcrypt="no"
2329        fi
2330    fi
2331fi
2332
2333
2334if test "$nettle" != "no"; then
2335    if $pkg_config --exists "nettle"; then
2336        nettle_cflags=`$pkg_config --cflags nettle`
2337        nettle_libs=`$pkg_config --libs nettle`
2338        nettle_version=`$pkg_config --modversion nettle`
2339        libs_softmmu="$nettle_libs $libs_softmmu"
2340        libs_tools="$nettle_libs $libs_tools"
2341        QEMU_CFLAGS="$QEMU_CFLAGS $nettle_cflags"
2342        nettle="yes"
2343
2344        cat > $TMPC << EOF
2345#include <nettle/pbkdf2.h>
2346int main(void) {
2347     pbkdf2_hmac_sha256(8, NULL, 1000, 8, NULL, 8, NULL);
2348     return 0;
2349}
2350EOF
2351        if compile_prog "$nettle_cflags" "$nettle_libs" ; then
2352            nettle_kdf=yes
2353        fi
2354    else
2355        if test "$nettle" = "yes"; then
2356            feature_not_found "nettle" "Install nettle devel"
2357        else
2358            nettle="no"
2359        fi
2360    fi
2361fi
2362
2363if test "$gcrypt" = "yes" && test "$nettle" = "yes"
2364then
2365    error_exit "Only one of gcrypt & nettle can be enabled"
2366fi
2367
2368##########################################
2369# libtasn1 - only for the TLS creds/session test suite
2370
2371tasn1=yes
2372tasn1_cflags=""
2373tasn1_libs=""
2374if $pkg_config --exists "libtasn1"; then
2375    tasn1_cflags=`$pkg_config --cflags libtasn1`
2376    tasn1_libs=`$pkg_config --libs libtasn1`
2377else
2378    tasn1=no
2379fi
2380
2381
2382##########################################
2383# getifaddrs (for tests/test-io-channel-socket )
2384
2385have_ifaddrs_h=yes
2386if ! check_include "ifaddrs.h" ; then
2387  have_ifaddrs_h=no
2388fi
2389
2390##########################################
2391# VTE probe
2392
2393if test "$vte" != "no"; then
2394    if test "$gtkabi" = "3.0"; then
2395      vtepackage="vte-2.90"
2396      vteversion="0.32.0"
2397    else
2398      vtepackage="vte"
2399      vteversion="0.24.0"
2400    fi
2401    if $pkg_config --exists "$vtepackage >= $vteversion"; then
2402        vte_cflags=`$pkg_config --cflags $vtepackage`
2403        vte_libs=`$pkg_config --libs $vtepackage`
2404        libs_softmmu="$vte_libs $libs_softmmu"
2405        vte="yes"
2406    elif test "$vte" = "yes"; then
2407        if test "$gtkabi" = "3.0"; then
2408            feature_not_found "vte" "Install libvte-2.90 devel"
2409        else
2410            feature_not_found "vte" "Install libvte devel"
2411        fi
2412    else
2413        vte="no"
2414    fi
2415fi
2416
2417##########################################
2418# SDL probe
2419
2420# Look for sdl configuration program (pkg-config or sdl-config).  Try
2421# sdl-config even without cross prefix, and favour pkg-config over sdl-config.
2422
2423if test $sdlabi = "2.0"; then
2424    sdl_config=$sdl2_config
2425    sdlname=sdl2
2426    sdlconfigname=sdl2_config
2427else
2428    sdlname=sdl
2429    sdlconfigname=sdl_config
2430fi
2431
2432if test "`basename $sdl_config`" != $sdlconfigname && ! has ${sdl_config}; then
2433  sdl_config=$sdlconfigname
2434fi
2435
2436if $pkg_config $sdlname --exists; then
2437  sdlconfig="$pkg_config $sdlname"
2438  _sdlversion=`$sdlconfig --modversion 2>/dev/null | sed 's/[^0-9]//g'`
2439elif has ${sdl_config}; then
2440  sdlconfig="$sdl_config"
2441  _sdlversion=`$sdlconfig --version | sed 's/[^0-9]//g'`
2442else
2443  if test "$sdl" = "yes" ; then
2444    feature_not_found "sdl" "Install SDL devel"
2445  fi
2446  sdl=no
2447fi
2448if test -n "$cross_prefix" && test "$(basename "$sdlconfig")" = sdl-config; then
2449  echo warning: using "\"$sdlconfig\"" to detect cross-compiled sdl >&2
2450fi
2451
2452sdl_too_old=no
2453if test "$sdl" != "no" ; then
2454  cat > $TMPC << EOF
2455#include <SDL.h>
2456#undef main /* We don't want SDL to override our main() */
2457int main( void ) { return SDL_Init (SDL_INIT_VIDEO); }
2458EOF
2459  sdl_cflags=`$sdlconfig --cflags 2> /dev/null`
2460  if test "$static" = "yes" ; then
2461    sdl_libs=`$sdlconfig --static-libs 2>/dev/null`
2462  else
2463    sdl_libs=`$sdlconfig --libs 2> /dev/null`
2464  fi
2465  if compile_prog "$sdl_cflags" "$sdl_libs" ; then
2466    if test "$_sdlversion" -lt 121 ; then
2467      sdl_too_old=yes
2468    else
2469      sdl=yes
2470    fi
2471
2472    # static link with sdl ? (note: sdl.pc's --static --libs is broken)
2473    if test "$sdl" = "yes" -a "$static" = "yes" ; then
2474      if test $? = 0 && echo $sdl_libs | grep -- -laa > /dev/null; then
2475         sdl_libs="$sdl_libs `aalib-config --static-libs 2>/dev/null`"
2476         sdl_cflags="$sdl_cflags `aalib-config --cflags 2>/dev/null`"
2477      fi
2478      if compile_prog "$sdl_cflags" "$sdl_libs" ; then
2479	:
2480      else
2481        sdl=no
2482      fi
2483    fi # static link
2484  else # sdl not found
2485    if test "$sdl" = "yes" ; then
2486      feature_not_found "sdl" "Install SDL devel"
2487    fi
2488    sdl=no
2489  fi # sdl compile test
2490fi
2491
2492if test "$sdl" = "yes" ; then
2493  cat > $TMPC <<EOF
2494#include <SDL.h>
2495#if defined(SDL_VIDEO_DRIVER_X11)
2496#include <X11/XKBlib.h>
2497#else
2498#error No x11 support
2499#endif
2500int main(void) { return 0; }
2501EOF
2502  if compile_prog "$sdl_cflags $x11_cflags" "$sdl_libs $x11_libs" ; then
2503    sdl_cflags="$sdl_cflags $x11_cflags"
2504    sdl_libs="$sdl_libs $x11_libs"
2505  fi
2506  libs_softmmu="$sdl_libs $libs_softmmu"
2507fi
2508
2509##########################################
2510# RDMA needs OpenFabrics libraries
2511if test "$rdma" != "no" ; then
2512  cat > $TMPC <<EOF
2513#include <rdma/rdma_cma.h>
2514int main(void) { return 0; }
2515EOF
2516  rdma_libs="-lrdmacm -libverbs"
2517  if compile_prog "" "$rdma_libs" ; then
2518    rdma="yes"
2519    libs_softmmu="$libs_softmmu $rdma_libs"
2520  else
2521    if test "$rdma" = "yes" ; then
2522        error_exit \
2523            " OpenFabrics librdmacm/libibverbs not present." \
2524            " Your options:" \
2525            "  (1) Fast: Install infiniband packages from your distro." \
2526            "  (2) Cleanest: Install libraries from www.openfabrics.org" \
2527            "  (3) Also: Install softiwarp if you don't have RDMA hardware"
2528    fi
2529    rdma="no"
2530  fi
2531fi
2532
2533
2534##########################################
2535# VNC SASL detection
2536if test "$vnc" = "yes" -a "$vnc_sasl" != "no" ; then
2537  cat > $TMPC <<EOF
2538#include <sasl/sasl.h>
2539#include <stdio.h>
2540int main(void) { sasl_server_init(NULL, "qemu"); return 0; }
2541EOF
2542  # Assuming Cyrus-SASL installed in /usr prefix
2543  vnc_sasl_cflags=""
2544  vnc_sasl_libs="-lsasl2"
2545  if compile_prog "$vnc_sasl_cflags" "$vnc_sasl_libs" ; then
2546    vnc_sasl=yes
2547    libs_softmmu="$vnc_sasl_libs $libs_softmmu"
2548    QEMU_CFLAGS="$QEMU_CFLAGS $vnc_sasl_cflags"
2549  else
2550    if test "$vnc_sasl" = "yes" ; then
2551      feature_not_found "vnc-sasl" "Install Cyrus SASL devel"
2552    fi
2553    vnc_sasl=no
2554  fi
2555fi
2556
2557##########################################
2558# VNC JPEG detection
2559if test "$vnc" = "yes" -a "$vnc_jpeg" != "no" ; then
2560cat > $TMPC <<EOF
2561#include <stdio.h>
2562#include <jpeglib.h>
2563int main(void) { struct jpeg_compress_struct s; jpeg_create_compress(&s); return 0; }
2564EOF
2565    vnc_jpeg_cflags=""
2566    vnc_jpeg_libs="-ljpeg"
2567  if compile_prog "$vnc_jpeg_cflags" "$vnc_jpeg_libs" ; then
2568    vnc_jpeg=yes
2569    libs_softmmu="$vnc_jpeg_libs $libs_softmmu"
2570    QEMU_CFLAGS="$QEMU_CFLAGS $vnc_jpeg_cflags"
2571  else
2572    if test "$vnc_jpeg" = "yes" ; then
2573      feature_not_found "vnc-jpeg" "Install libjpeg-turbo devel"
2574    fi
2575    vnc_jpeg=no
2576  fi
2577fi
2578
2579##########################################
2580# VNC PNG detection
2581if test "$vnc" = "yes" -a "$vnc_png" != "no" ; then
2582cat > $TMPC <<EOF
2583//#include <stdio.h>
2584#include <png.h>
2585#include <stddef.h>
2586int main(void) {
2587    png_structp png_ptr;
2588    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
2589    return png_ptr != 0;
2590}
2591EOF
2592  if $pkg_config libpng --exists; then
2593    vnc_png_cflags=`$pkg_config libpng --cflags`
2594    vnc_png_libs=`$pkg_config libpng --libs`
2595  else
2596    vnc_png_cflags=""
2597    vnc_png_libs="-lpng"
2598  fi
2599  if compile_prog "$vnc_png_cflags" "$vnc_png_libs" ; then
2600    vnc_png=yes
2601    libs_softmmu="$vnc_png_libs $libs_softmmu"
2602    QEMU_CFLAGS="$QEMU_CFLAGS $vnc_png_cflags"
2603  else
2604    if test "$vnc_png" = "yes" ; then
2605      feature_not_found "vnc-png" "Install libpng devel"
2606    fi
2607    vnc_png=no
2608  fi
2609fi
2610
2611##########################################
2612# fnmatch() probe, used for ACL routines
2613fnmatch="no"
2614cat > $TMPC << EOF
2615#include <fnmatch.h>
2616int main(void)
2617{
2618    fnmatch("foo", "foo", 0);
2619    return 0;
2620}
2621EOF
2622if compile_prog "" "" ; then
2623   fnmatch="yes"
2624fi
2625
2626##########################################
2627# uuid_generate() probe, used for vdi block driver
2628# Note that on some systems (notably MacOSX) no extra library
2629# need be linked to get the uuid functions.
2630if test "$uuid" != "no" ; then
2631  uuid_libs="-luuid"
2632  cat > $TMPC << EOF
2633#include <uuid/uuid.h>
2634int main(void)
2635{
2636    uuid_t my_uuid;
2637    uuid_generate(my_uuid);
2638    return 0;
2639}
2640EOF
2641  if compile_prog "" "" ; then
2642    uuid="yes"
2643  elif compile_prog "" "$uuid_libs" ; then
2644    uuid="yes"
2645    libs_softmmu="$uuid_libs $libs_softmmu"
2646    libs_tools="$uuid_libs $libs_tools"
2647  else
2648    if test "$uuid" = "yes" ; then
2649      feature_not_found "uuid" "Install libuuid devel"
2650    fi
2651    uuid=no
2652  fi
2653fi
2654
2655if test "$vhdx" = "yes" ; then
2656    if test "$uuid" = "no" ; then
2657        error_exit "uuid required for VHDX support"
2658    fi
2659elif test "$vhdx" != "no" ; then
2660    if test "$uuid" = "yes" ; then
2661        vhdx=yes
2662    else
2663        vhdx=no
2664    fi
2665fi
2666
2667##########################################
2668# xfsctl() probe, used for raw-posix
2669if test "$xfs" != "no" ; then
2670  cat > $TMPC << EOF
2671#include <stddef.h>  /* NULL */
2672#include <xfs/xfs.h>
2673int main(void)
2674{
2675    xfsctl(NULL, 0, 0, NULL);
2676    return 0;
2677}
2678EOF
2679  if compile_prog "" "" ; then
2680    xfs="yes"
2681  else
2682    if test "$xfs" = "yes" ; then
2683      feature_not_found "xfs" "Instal xfsprogs/xfslibs devel"
2684    fi
2685    xfs=no
2686  fi
2687fi
2688
2689##########################################
2690# vde libraries probe
2691if test "$vde" != "no" ; then
2692  vde_libs="-lvdeplug"
2693  cat > $TMPC << EOF
2694#include <libvdeplug.h>
2695int main(void)
2696{
2697    struct vde_open_args a = {0, 0, 0};
2698    char s[] = "";
2699    vde_open(s, s, &a);
2700    return 0;
2701}
2702EOF
2703  if compile_prog "" "$vde_libs" ; then
2704    vde=yes
2705    libs_softmmu="$vde_libs $libs_softmmu"
2706    libs_tools="$vde_libs $libs_tools"
2707  else
2708    if test "$vde" = "yes" ; then
2709      feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
2710    fi
2711    vde=no
2712  fi
2713fi
2714
2715##########################################
2716# netmap support probe
2717# Apart from looking for netmap headers, we make sure that the host API version
2718# supports the netmap backend (>=11). The upper bound (15) is meant to simulate
2719# a minor/major version number. Minor new features will be marked with values up
2720# to 15, and if something happens that requires a change to the backend we will
2721# move above 15, submit the backend fixes and modify this two bounds.
2722if test "$netmap" != "no" ; then
2723  cat > $TMPC << EOF
2724#include <inttypes.h>
2725#include <net/if.h>
2726#include <net/netmap.h>
2727#include <net/netmap_user.h>
2728#if (NETMAP_API < 11) || (NETMAP_API > 15)
2729#error
2730#endif
2731int main(void) { return 0; }
2732EOF
2733  if compile_prog "" "" ; then
2734    netmap=yes
2735  else
2736    if test "$netmap" = "yes" ; then
2737      feature_not_found "netmap"
2738    fi
2739    netmap=no
2740  fi
2741fi
2742
2743##########################################
2744# libcap-ng library probe
2745if test "$cap_ng" != "no" ; then
2746  cap_libs="-lcap-ng"
2747  cat > $TMPC << EOF
2748#include <cap-ng.h>
2749int main(void)
2750{
2751    capng_capability_to_name(CAPNG_EFFECTIVE);
2752    return 0;
2753}
2754EOF
2755  if compile_prog "" "$cap_libs" ; then
2756    cap_ng=yes
2757    libs_tools="$cap_libs $libs_tools"
2758  else
2759    if test "$cap_ng" = "yes" ; then
2760      feature_not_found "cap_ng" "Install libcap-ng devel"
2761    fi
2762    cap_ng=no
2763  fi
2764fi
2765
2766##########################################
2767# Sound support libraries probe
2768
2769audio_drv_probe()
2770{
2771    drv=$1
2772    hdr=$2
2773    lib=$3
2774    exp=$4
2775    cfl=$5
2776        cat > $TMPC << EOF
2777#include <$hdr>
2778int main(void) { $exp }
2779EOF
2780    if compile_prog "$cfl" "$lib" ; then
2781        :
2782    else
2783        error_exit "$drv check failed" \
2784            "Make sure to have the $drv libs and headers installed."
2785    fi
2786}
2787
2788audio_drv_list=`echo "$audio_drv_list" | sed -e 's/,/ /g'`
2789for drv in $audio_drv_list; do
2790    case $drv in
2791    alsa)
2792    audio_drv_probe $drv alsa/asoundlib.h -lasound \
2793        "return snd_pcm_close((snd_pcm_t *)0);"
2794    libs_softmmu="-lasound $libs_softmmu"
2795    ;;
2796
2797    pa)
2798    audio_drv_probe $drv pulse/mainloop.h "-lpulse" \
2799        "pa_mainloop *m = 0; pa_mainloop_free (m); return 0;"
2800    libs_softmmu="-lpulse $libs_softmmu"
2801    audio_pt_int="yes"
2802    ;;
2803
2804    coreaudio)
2805      libs_softmmu="-framework CoreAudio $libs_softmmu"
2806    ;;
2807
2808    dsound)
2809      libs_softmmu="-lole32 -ldxguid $libs_softmmu"
2810      audio_win_int="yes"
2811    ;;
2812
2813    oss)
2814      libs_softmmu="$oss_lib $libs_softmmu"
2815    ;;
2816
2817    sdl|wav)
2818    # XXX: Probes for CoreAudio, DirectSound, SDL(?)
2819    ;;
2820
2821    *)
2822    echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
2823        error_exit "Unknown driver '$drv' selected" \
2824            "Possible drivers are: $audio_possible_drivers"
2825    }
2826    ;;
2827    esac
2828done
2829
2830##########################################
2831# BrlAPI probe
2832
2833if test "$brlapi" != "no" ; then
2834  brlapi_libs="-lbrlapi"
2835  cat > $TMPC << EOF
2836#include <brlapi.h>
2837#include <stddef.h>
2838int main( void ) { return brlapi__openConnection (NULL, NULL, NULL); }
2839EOF
2840  if compile_prog "" "$brlapi_libs" ; then
2841    brlapi=yes
2842    libs_softmmu="$brlapi_libs $libs_softmmu"
2843  else
2844    if test "$brlapi" = "yes" ; then
2845      feature_not_found "brlapi" "Install brlapi devel"
2846    fi
2847    brlapi=no
2848  fi
2849fi
2850
2851##########################################
2852# curses probe
2853if test "$curses" != "no" ; then
2854  if test "$mingw32" = "yes" ; then
2855    curses_list="$($pkg_config --libs ncurses 2>/dev/null):-lpdcurses"
2856  else
2857    curses_list="$($pkg_config --libs ncurses 2>/dev/null):-lncurses:-lcurses"
2858  fi
2859  curses_found=no
2860  cat > $TMPC << EOF
2861#include <curses.h>
2862int main(void) {
2863  const char *s = curses_version();
2864  resize_term(0, 0);
2865  return s != 0;
2866}
2867EOF
2868  IFS=:
2869  for curses_lib in $curses_list; do
2870    unset IFS
2871    if compile_prog "" "$curses_lib" ; then
2872      curses_found=yes
2873      libs_softmmu="$curses_lib $libs_softmmu"
2874      break
2875    fi
2876  done
2877  unset IFS
2878  if test "$curses_found" = "yes" ; then
2879    curses=yes
2880  else
2881    if test "$curses" = "yes" ; then
2882      feature_not_found "curses" "Install ncurses devel"
2883    fi
2884    curses=no
2885  fi
2886fi
2887
2888##########################################
2889# curl probe
2890if test "$curl" != "no" ; then
2891  if $pkg_config libcurl --exists; then
2892    curlconfig="$pkg_config libcurl"
2893  else
2894    curlconfig=curl-config
2895  fi
2896  cat > $TMPC << EOF
2897#include <curl/curl.h>
2898int main(void) { curl_easy_init(); curl_multi_setopt(0, 0, 0); return 0; }
2899EOF
2900  curl_cflags=`$curlconfig --cflags 2>/dev/null`
2901  curl_libs=`$curlconfig --libs 2>/dev/null`
2902  if compile_prog "$curl_cflags" "$curl_libs" ; then
2903    curl=yes
2904  else
2905    if test "$curl" = "yes" ; then
2906      feature_not_found "curl" "Install libcurl devel"
2907    fi
2908    curl=no
2909  fi
2910fi # test "$curl"
2911
2912##########################################
2913# bluez support probe
2914if test "$bluez" != "no" ; then
2915  cat > $TMPC << EOF
2916#include <bluetooth/bluetooth.h>
2917int main(void) { return bt_error(0); }
2918EOF
2919  bluez_cflags=`$pkg_config --cflags bluez 2> /dev/null`
2920  bluez_libs=`$pkg_config --libs bluez 2> /dev/null`
2921  if compile_prog "$bluez_cflags" "$bluez_libs" ; then
2922    bluez=yes
2923    libs_softmmu="$bluez_libs $libs_softmmu"
2924  else
2925    if test "$bluez" = "yes" ; then
2926      feature_not_found "bluez" "Install bluez-libs/libbluetooth devel"
2927    fi
2928    bluez="no"
2929  fi
2930fi
2931
2932##########################################
2933# glib support probe
2934
2935glib_req_ver=2.22
2936glib_modules=gthread-2.0
2937if test "$modules" = yes; then
2938    glib_modules="$glib_modules gmodule-2.0"
2939fi
2940
2941for i in $glib_modules; do
2942    if $pkg_config --atleast-version=$glib_req_ver $i; then
2943        glib_cflags=`$pkg_config --cflags $i`
2944        glib_libs=`$pkg_config --libs $i`
2945        CFLAGS="$glib_cflags $CFLAGS"
2946        LIBS="$glib_libs $LIBS"
2947        libs_qga="$glib_libs $libs_qga"
2948    else
2949        error_exit "glib-$glib_req_ver $i is required to compile QEMU"
2950    fi
2951done
2952
2953# Sanity check that the current size_t matches the
2954# size that glib thinks it should be. This catches
2955# problems on multi-arch where people try to build
2956# 32-bit QEMU while pointing at 64-bit glib headers
2957cat > $TMPC <<EOF
2958#include <glib.h>
2959#include <unistd.h>
2960
2961#define QEMU_BUILD_BUG_ON(x) \
2962  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
2963
2964int main(void) {
2965   QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
2966   return 0;
2967}
2968EOF
2969
2970if ! compile_prog "-Werror $CFLAGS" "$LIBS" ; then
2971    error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
2972               "You probably need to set PKG_CONFIG_LIBDIR"\
2973	       "to point to the right pkg-config files for your"\
2974	       "build target"
2975fi
2976
2977# g_test_trap_subprocess added in 2.38. Used by some tests.
2978glib_subprocess=yes
2979if ! $pkg_config --atleast-version=2.38 glib-2.0; then
2980    glib_subprocess=no
2981fi
2982
2983# Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
2984cat > $TMPC << EOF
2985#include <glib.h>
2986int main(void) { return 0; }
2987EOF
2988if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
2989    if cc_has_warning_flag "-Wno-unknown-attributes"; then
2990        glib_cflags="-Wno-unknown-attributes $glib_cflags"
2991        CFLAGS="-Wno-unknown-attributes $CFLAGS"
2992    fi
2993fi
2994
2995##########################################
2996# SHA command probe for modules
2997if test "$modules" = yes; then
2998    shacmd_probe="sha1sum sha1 shasum"
2999    for c in $shacmd_probe; do
3000        if has $c; then
3001            shacmd="$c"
3002            break
3003        fi
3004    done
3005    if test "$shacmd" = ""; then
3006        error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
3007    fi
3008fi
3009
3010##########################################
3011# pixman support probe
3012
3013if test "$pixman" = ""; then
3014  if test "$want_tools" = "no" -a "$softmmu" = "no"; then
3015    pixman="none"
3016  elif $pkg_config --atleast-version=0.21.8 pixman-1 > /dev/null 2>&1; then
3017    pixman="system"
3018  else
3019    pixman="internal"
3020  fi
3021fi
3022if test "$pixman" = "none"; then
3023  if test "$want_tools" != "no" -o "$softmmu" != "no"; then
3024    error_exit "pixman disabled but system emulation or tools build" \
3025        "enabled.  You can turn off pixman only if you also" \
3026        "disable all system emulation targets and the tools" \
3027        "build with '--disable-tools --disable-system'."
3028  fi
3029  pixman_cflags=
3030  pixman_libs=
3031elif test "$pixman" = "system"; then
3032  # pixman version has been checked above
3033  pixman_cflags=`$pkg_config --cflags pixman-1`
3034  pixman_libs=`$pkg_config --libs pixman-1`
3035else
3036  if test ! -d ${source_path}/pixman/pixman; then
3037    error_exit "pixman >= 0.21.8 not present. Your options:" \
3038        "  (1) Preferred: Install the pixman devel package (any recent" \
3039        "      distro should have packages as Xorg needs pixman too)." \
3040        "  (2) Fetch the pixman submodule, using:" \
3041        "      git submodule update --init pixman"
3042  fi
3043  mkdir -p pixman/pixman
3044  pixman_cflags="-I\$(SRC_PATH)/pixman/pixman -I\$(BUILD_DIR)/pixman/pixman"
3045  pixman_libs="-L\$(BUILD_DIR)/pixman/pixman/.libs -lpixman-1"
3046fi
3047
3048##########################################
3049# libcap probe
3050
3051if test "$cap" != "no" ; then
3052  cat > $TMPC <<EOF
3053#include <stdio.h>
3054#include <sys/capability.h>
3055int main(void) { cap_t caps; caps = cap_init(); return caps != NULL; }
3056EOF
3057  if compile_prog "" "-lcap" ; then
3058    cap=yes
3059  else
3060    cap=no
3061  fi
3062fi
3063
3064##########################################
3065# pthread probe
3066PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
3067
3068pthread=no
3069cat > $TMPC << EOF
3070#include <pthread.h>
3071static void *f(void *p) { return NULL; }
3072int main(void) {
3073  pthread_t thread;
3074  pthread_create(&thread, 0, f, 0);
3075  return 0;
3076}
3077EOF
3078if compile_prog "" "" ; then
3079  pthread=yes
3080else
3081  for pthread_lib in $PTHREADLIBS_LIST; do
3082    if compile_prog "" "$pthread_lib" ; then
3083      pthread=yes
3084      found=no
3085      for lib_entry in $LIBS; do
3086        if test "$lib_entry" = "$pthread_lib"; then
3087          found=yes
3088          break
3089        fi
3090      done
3091      if test "$found" = "no"; then
3092        LIBS="$pthread_lib $LIBS"
3093      fi
3094      break
3095    fi
3096  done
3097fi
3098
3099if test "$mingw32" != yes -a "$pthread" = no; then
3100  error_exit "pthread check failed" \
3101      "Make sure to have the pthread libs and headers installed."
3102fi
3103
3104# check for pthread_setname_np
3105pthread_setname_np=no
3106cat > $TMPC << EOF
3107#include <pthread.h>
3108
3109static void *f(void *p) { return NULL; }
3110int main(void)
3111{
3112    pthread_t thread;
3113    pthread_create(&thread, 0, f, 0);
3114    pthread_setname_np(thread, "QEMU");
3115    return 0;
3116}
3117EOF
3118if compile_prog "" "$pthread_lib" ; then
3119  pthread_setname_np=yes
3120fi
3121
3122##########################################
3123# rbd probe
3124if test "$rbd" != "no" ; then
3125  cat > $TMPC <<EOF
3126#include <stdio.h>
3127#include <rbd/librbd.h>
3128int main(void) {
3129    rados_t cluster;
3130    rados_create(&cluster, NULL);
3131    return 0;
3132}
3133EOF
3134  rbd_libs="-lrbd -lrados"
3135  if compile_prog "" "$rbd_libs" ; then
3136    rbd=yes
3137  else
3138    if test "$rbd" = "yes" ; then
3139      feature_not_found "rados block device" "Install librbd/ceph devel"
3140    fi
3141    rbd=no
3142  fi
3143fi
3144
3145##########################################
3146# libssh2 probe
3147min_libssh2_version=1.2.8
3148if test "$libssh2" != "no" ; then
3149  if $pkg_config --atleast-version=$min_libssh2_version libssh2; then
3150    libssh2_cflags=`$pkg_config libssh2 --cflags`
3151    libssh2_libs=`$pkg_config libssh2 --libs`
3152    libssh2=yes
3153  else
3154    if test "$libssh2" = "yes" ; then
3155      error_exit "libssh2 >= $min_libssh2_version required for --enable-libssh2"
3156    fi
3157    libssh2=no
3158  fi
3159fi
3160
3161##########################################
3162# libssh2_sftp_fsync probe
3163
3164if test "$libssh2" = "yes"; then
3165  cat > $TMPC <<EOF
3166#include <stdio.h>
3167#include <libssh2.h>
3168#include <libssh2_sftp.h>
3169int main(void) {
3170    LIBSSH2_SESSION *session;
3171    LIBSSH2_SFTP *sftp;
3172    LIBSSH2_SFTP_HANDLE *sftp_handle;
3173    session = libssh2_session_init ();
3174    sftp = libssh2_sftp_init (session);
3175    sftp_handle = libssh2_sftp_open (sftp, "/", 0, 0);
3176    libssh2_sftp_fsync (sftp_handle);
3177    return 0;
3178}
3179EOF
3180  # libssh2_cflags/libssh2_libs defined in previous test.
3181  if compile_prog "$libssh2_cflags" "$libssh2_libs" ; then
3182    QEMU_CFLAGS="-DHAS_LIBSSH2_SFTP_FSYNC $QEMU_CFLAGS"
3183  fi
3184fi
3185
3186##########################################
3187# linux-aio probe
3188
3189if test "$linux_aio" != "no" ; then
3190  cat > $TMPC <<EOF
3191#include <libaio.h>
3192#include <sys/eventfd.h>
3193#include <stddef.h>
3194int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
3195EOF
3196  if compile_prog "" "-laio" ; then
3197    linux_aio=yes
3198  else
3199    if test "$linux_aio" = "yes" ; then
3200      feature_not_found "linux AIO" "Install libaio devel"
3201    fi
3202    linux_aio=no
3203  fi
3204fi
3205
3206##########################################
3207# TPM passthrough is only on x86 Linux
3208
3209if test "$targetos" = Linux && test "$cpu" = i386 -o "$cpu" = x86_64; then
3210  tpm_passthrough=$tpm
3211else
3212  tpm_passthrough=no
3213fi
3214
3215##########################################
3216# attr probe
3217
3218if test "$attr" != "no" ; then
3219  cat > $TMPC <<EOF
3220#include <stdio.h>
3221#include <sys/types.h>
3222#ifdef CONFIG_LIBATTR
3223#include <attr/xattr.h>
3224#else
3225#include <sys/xattr.h>
3226#endif
3227int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }
3228EOF
3229  if compile_prog "" "" ; then
3230    attr=yes
3231  # Older distros have <attr/xattr.h>, and need -lattr:
3232  elif compile_prog "-DCONFIG_LIBATTR" "-lattr" ; then
3233    attr=yes
3234    LIBS="-lattr $LIBS"
3235    libattr=yes
3236  else
3237    if test "$attr" = "yes" ; then
3238      feature_not_found "ATTR" "Install libc6 or libattr devel"
3239    fi
3240    attr=no
3241  fi
3242fi
3243
3244##########################################
3245# iovec probe
3246cat > $TMPC <<EOF
3247#include <sys/types.h>
3248#include <sys/uio.h>
3249#include <unistd.h>
3250int main(void) { return sizeof(struct iovec); }
3251EOF
3252iovec=no
3253if compile_prog "" "" ; then
3254  iovec=yes
3255fi
3256
3257##########################################
3258# preadv probe
3259cat > $TMPC <<EOF
3260#include <sys/types.h>
3261#include <sys/uio.h>
3262#include <unistd.h>
3263int main(void) { return preadv(0, 0, 0, 0); }
3264EOF
3265preadv=no
3266if compile_prog "" "" ; then
3267  preadv=yes
3268fi
3269
3270##########################################
3271# fdt probe
3272# fdt support is mandatory for at least some target architectures,
3273# so insist on it if we're building those system emulators.
3274fdt_required=no
3275for target in $target_list; do
3276  case $target in
3277    aarch64*-softmmu|arm*-softmmu|ppc*-softmmu|microblaze*-softmmu)
3278      fdt_required=yes
3279    ;;
3280  esac
3281done
3282
3283if test "$fdt_required" = "yes"; then
3284  if test "$fdt" = "no"; then
3285    error_exit "fdt disabled but some requested targets require it." \
3286      "You can turn off fdt only if you also disable all the system emulation" \
3287      "targets which need it (by specifying a cut down --target-list)."
3288  fi
3289  fdt=yes
3290fi
3291
3292if test "$fdt" != "no" ; then
3293  fdt_libs="-lfdt"
3294  # explicitly check for libfdt_env.h as it is missing in some stable installs
3295  # and test for required functions to make sure we are on a version >= 1.4.0
3296  cat > $TMPC << EOF
3297#include <libfdt.h>
3298#include <libfdt_env.h>
3299int main(void) { fdt_get_property_by_offset(0, 0, 0); return 0; }
3300EOF
3301  if compile_prog "" "$fdt_libs" ; then
3302    # system DTC is good - use it
3303    fdt=yes
3304  elif test -d ${source_path}/dtc/libfdt ; then
3305    # have submodule DTC - use it
3306    fdt=yes
3307    dtc_internal="yes"
3308    mkdir -p dtc
3309    if [ "$pwd_is_source_path" != "y" ] ; then
3310       symlink "$source_path/dtc/Makefile" "dtc/Makefile"
3311       symlink "$source_path/dtc/scripts" "dtc/scripts"
3312    fi
3313    fdt_cflags="-I\$(SRC_PATH)/dtc/libfdt"
3314    fdt_libs="-L\$(BUILD_DIR)/dtc/libfdt $fdt_libs"
3315  elif test "$fdt" = "yes" ; then
3316    # have neither and want - prompt for system/submodule install
3317    error_exit "DTC (libfdt) version >= 1.4.0 not present. Your options:" \
3318        "  (1) Preferred: Install the DTC (libfdt) devel package" \
3319        "  (2) Fetch the DTC submodule, using:" \
3320        "      git submodule update --init dtc"
3321  else
3322    # don't have and don't want
3323    fdt_libs=
3324    fdt=no
3325  fi
3326fi
3327
3328libs_softmmu="$libs_softmmu $fdt_libs"
3329
3330##########################################
3331# opengl probe (for sdl2, gtk, milkymist-tmu2)
3332
3333if test "$opengl" != "no" ; then
3334  opengl_pkgs="epoxy libdrm gbm"
3335  if $pkg_config $opengl_pkgs x11; then
3336    opengl_cflags="$($pkg_config --cflags $opengl_pkgs) $x11_cflags"
3337    opengl_libs="$($pkg_config --libs $opengl_pkgs) $x11_libs"
3338    opengl=yes
3339    if test "$gtk" = "yes" && $pkg_config --exists "$gtkpackage >= 3.16"; then
3340        gtk_gl="yes"
3341    fi
3342  else
3343    if test "$opengl" = "yes" ; then
3344      feature_not_found "opengl" "Please install opengl (mesa) devel pkgs: $opengl_pkgs"
3345    fi
3346    opengl_cflags=""
3347    opengl_libs=""
3348    opengl=no
3349  fi
3350fi
3351
3352if test "$opengl" = "yes"; then
3353  cat > $TMPC << EOF
3354#include <epoxy/egl.h>
3355#ifndef EGL_MESA_image_dma_buf_export
3356# error mesa/epoxy lacks support for dmabufs (mesa 10.6+)
3357#endif
3358int main(void) { return 0; }
3359EOF
3360  if compile_prog "" "" ; then
3361    opengl_dmabuf=yes
3362  fi
3363fi
3364
3365##########################################
3366# archipelago probe
3367if test "$archipelago" != "no" ; then
3368    cat > $TMPC <<EOF
3369#include <stdio.h>
3370#include <xseg/xseg.h>
3371#include <xseg/protocol.h>
3372int main(void) {
3373    xseg_initialize();
3374    return 0;
3375}
3376EOF
3377    archipelago_libs=-lxseg
3378    if compile_prog "" "$archipelago_libs"; then
3379        archipelago="yes"
3380        libs_tools="$archipelago_libs $libs_tools"
3381        libs_softmmu="$archipelago_libs $libs_softmmu"
3382
3383	echo "WARNING: Please check the licenses of QEMU and libxseg carefully."
3384	echo "GPLv3 versions of libxseg may not be compatible with QEMU's"
3385	echo "license and therefore prevent redistribution."
3386	echo
3387	echo "To disable Archipelago, use --disable-archipelago"
3388    else
3389      if test "$archipelago" = "yes" ; then
3390        feature_not_found "Archipelago backend support" "Install libxseg devel"
3391      fi
3392      archipelago="no"
3393    fi
3394fi
3395
3396
3397##########################################
3398# glusterfs probe
3399if test "$glusterfs" != "no" ; then
3400  if $pkg_config --atleast-version=3 glusterfs-api; then
3401    glusterfs="yes"
3402    glusterfs_cflags=`$pkg_config --cflags glusterfs-api`
3403    glusterfs_libs=`$pkg_config --libs glusterfs-api`
3404    if $pkg_config --atleast-version=4 glusterfs-api; then
3405      glusterfs_xlator_opt="yes"
3406    fi
3407    if $pkg_config --atleast-version=5 glusterfs-api; then
3408      glusterfs_discard="yes"
3409    fi
3410    if $pkg_config --atleast-version=6 glusterfs-api; then
3411      glusterfs_zerofill="yes"
3412    fi
3413  else
3414    if test "$glusterfs" = "yes" ; then
3415      feature_not_found "GlusterFS backend support" \
3416          "Install glusterfs-api devel >= 3"
3417    fi
3418    glusterfs="no"
3419  fi
3420fi
3421
3422# Check for inotify functions when we are building linux-user
3423# emulator.  This is done because older glibc versions don't
3424# have syscall stubs for these implemented.  In that case we
3425# don't provide them even if kernel supports them.
3426#
3427inotify=no
3428cat > $TMPC << EOF
3429#include <sys/inotify.h>
3430
3431int
3432main(void)
3433{
3434	/* try to start inotify */
3435	return inotify_init();
3436}
3437EOF
3438if compile_prog "" "" ; then
3439  inotify=yes
3440fi
3441
3442inotify1=no
3443cat > $TMPC << EOF
3444#include <sys/inotify.h>
3445
3446int
3447main(void)
3448{
3449    /* try to start inotify */
3450    return inotify_init1(0);
3451}
3452EOF
3453if compile_prog "" "" ; then
3454  inotify1=yes
3455fi
3456
3457# check if utimensat and futimens are supported
3458utimens=no
3459cat > $TMPC << EOF
3460#define _ATFILE_SOURCE
3461#include <stddef.h>
3462#include <fcntl.h>
3463#include <sys/stat.h>
3464
3465int main(void)
3466{
3467    utimensat(AT_FDCWD, "foo", NULL, 0);
3468    futimens(0, NULL);
3469    return 0;
3470}
3471EOF
3472if compile_prog "" "" ; then
3473  utimens=yes
3474fi
3475
3476# check if pipe2 is there
3477pipe2=no
3478cat > $TMPC << EOF
3479#include <unistd.h>
3480#include <fcntl.h>
3481
3482int main(void)
3483{
3484    int pipefd[2];
3485    return pipe2(pipefd, O_CLOEXEC);
3486}
3487EOF
3488if compile_prog "" "" ; then
3489  pipe2=yes
3490fi
3491
3492# check if accept4 is there
3493accept4=no
3494cat > $TMPC << EOF
3495#include <sys/socket.h>
3496#include <stddef.h>
3497
3498int main(void)
3499{
3500    accept4(0, NULL, NULL, SOCK_CLOEXEC);
3501    return 0;
3502}
3503EOF
3504if compile_prog "" "" ; then
3505  accept4=yes
3506fi
3507
3508# check if tee/splice is there. vmsplice was added same time.
3509splice=no
3510cat > $TMPC << EOF
3511#include <unistd.h>
3512#include <fcntl.h>
3513#include <limits.h>
3514
3515int main(void)
3516{
3517    int len, fd = 0;
3518    len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
3519    splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
3520    return 0;
3521}
3522EOF
3523if compile_prog "" "" ; then
3524  splice=yes
3525fi
3526
3527##########################################
3528# libnuma probe
3529
3530if test "$numa" != "no" ; then
3531  cat > $TMPC << EOF
3532#include <numa.h>
3533int main(void) { return numa_available(); }
3534EOF
3535
3536  if compile_prog "" "-lnuma" ; then
3537    numa=yes
3538    libs_softmmu="-lnuma $libs_softmmu"
3539  else
3540    if test "$numa" = "yes" ; then
3541      feature_not_found "numa" "install numactl devel"
3542    fi
3543    numa=no
3544  fi
3545fi
3546
3547if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
3548    echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
3549    exit 1
3550fi
3551
3552##########################################
3553# tcmalloc probe
3554
3555if test "$tcmalloc" = "yes" ; then
3556  cat > $TMPC << EOF
3557#include <stdlib.h>
3558int main(void) { malloc(1); return 0; }
3559EOF
3560
3561  if compile_prog "" "-ltcmalloc" ; then
3562    LIBS="-ltcmalloc $LIBS"
3563  else
3564    feature_not_found "tcmalloc" "install gperftools devel"
3565  fi
3566fi
3567
3568##########################################
3569# jemalloc probe
3570
3571if test "$jemalloc" = "yes" ; then
3572  cat > $TMPC << EOF
3573#include <stdlib.h>
3574int main(void) { malloc(1); return 0; }
3575EOF
3576
3577  if compile_prog "" "-ljemalloc" ; then
3578    LIBS="-ljemalloc $LIBS"
3579  else
3580    feature_not_found "jemalloc" "install jemalloc devel"
3581  fi
3582fi
3583
3584##########################################
3585# signalfd probe
3586signalfd="no"
3587cat > $TMPC << EOF
3588#include <unistd.h>
3589#include <sys/syscall.h>
3590#include <signal.h>
3591int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }
3592EOF
3593
3594if compile_prog "" "" ; then
3595  signalfd=yes
3596fi
3597
3598# check if eventfd is supported
3599eventfd=no
3600cat > $TMPC << EOF
3601#include <sys/eventfd.h>
3602
3603int main(void)
3604{
3605    return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
3606}
3607EOF
3608if compile_prog "" "" ; then
3609  eventfd=yes
3610fi
3611
3612# check if memfd is supported
3613memfd=no
3614cat > $TMPC << EOF
3615#include <sys/memfd.h>
3616
3617int main(void)
3618{
3619    return memfd_create("foo", MFD_ALLOW_SEALING);
3620}
3621EOF
3622if compile_prog "" "" ; then
3623  memfd=yes
3624fi
3625
3626
3627
3628# check for fallocate
3629fallocate=no
3630cat > $TMPC << EOF
3631#include <fcntl.h>
3632
3633int main(void)
3634{
3635    fallocate(0, 0, 0, 0);
3636    return 0;
3637}
3638EOF
3639if compile_prog "" "" ; then
3640  fallocate=yes
3641fi
3642
3643# check for fallocate hole punching
3644fallocate_punch_hole=no
3645cat > $TMPC << EOF
3646#include <fcntl.h>
3647#include <linux/falloc.h>
3648
3649int main(void)
3650{
3651    fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
3652    return 0;
3653}
3654EOF
3655if compile_prog "" "" ; then
3656  fallocate_punch_hole=yes
3657fi
3658
3659# check that fallocate supports range zeroing inside the file
3660fallocate_zero_range=no
3661cat > $TMPC << EOF
3662#include <fcntl.h>
3663#include <linux/falloc.h>
3664
3665int main(void)
3666{
3667    fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0);
3668    return 0;
3669}
3670EOF
3671if compile_prog "" "" ; then
3672  fallocate_zero_range=yes
3673fi
3674
3675# check for posix_fallocate
3676posix_fallocate=no
3677cat > $TMPC << EOF
3678#include <fcntl.h>
3679
3680int main(void)
3681{
3682    posix_fallocate(0, 0, 0);
3683    return 0;
3684}
3685EOF
3686if compile_prog "" "" ; then
3687    posix_fallocate=yes
3688fi
3689
3690# check for sync_file_range
3691sync_file_range=no
3692cat > $TMPC << EOF
3693#include <fcntl.h>
3694
3695int main(void)
3696{
3697    sync_file_range(0, 0, 0, 0);
3698    return 0;
3699}
3700EOF
3701if compile_prog "" "" ; then
3702  sync_file_range=yes
3703fi
3704
3705# check for linux/fiemap.h and FS_IOC_FIEMAP
3706fiemap=no
3707cat > $TMPC << EOF
3708#include <sys/ioctl.h>
3709#include <linux/fs.h>
3710#include <linux/fiemap.h>
3711
3712int main(void)
3713{
3714    ioctl(0, FS_IOC_FIEMAP, 0);
3715    return 0;
3716}
3717EOF
3718if compile_prog "" "" ; then
3719  fiemap=yes
3720fi
3721
3722# check for dup3
3723dup3=no
3724cat > $TMPC << EOF
3725#include <unistd.h>
3726
3727int main(void)
3728{
3729    dup3(0, 0, 0);
3730    return 0;
3731}
3732EOF
3733if compile_prog "" "" ; then
3734  dup3=yes
3735fi
3736
3737# check for ppoll support
3738ppoll=no
3739cat > $TMPC << EOF
3740#include <poll.h>
3741
3742int main(void)
3743{
3744    struct pollfd pfd = { .fd = 0, .events = 0, .revents = 0 };
3745    ppoll(&pfd, 1, 0, 0);
3746    return 0;
3747}
3748EOF
3749if compile_prog "" "" ; then
3750  ppoll=yes
3751fi
3752
3753# check for prctl(PR_SET_TIMERSLACK , ... ) support
3754prctl_pr_set_timerslack=no
3755cat > $TMPC << EOF
3756#include <sys/prctl.h>
3757
3758int main(void)
3759{
3760    prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0);
3761    return 0;
3762}
3763EOF
3764if compile_prog "" "" ; then
3765  prctl_pr_set_timerslack=yes
3766fi
3767
3768# check for epoll support
3769epoll=no
3770cat > $TMPC << EOF
3771#include <sys/epoll.h>
3772
3773int main(void)
3774{
3775    epoll_create(0);
3776    return 0;
3777}
3778EOF
3779if compile_prog "" "" ; then
3780  epoll=yes
3781fi
3782
3783# epoll_create1 and epoll_pwait are later additions
3784# so we must check separately for their presence
3785epoll_create1=no
3786cat > $TMPC << EOF
3787#include <sys/epoll.h>
3788
3789int main(void)
3790{
3791    /* Note that we use epoll_create1 as a value, not as
3792     * a function being called. This is necessary so that on
3793     * old SPARC glibc versions where the function was present in
3794     * the library but not declared in the header file we will
3795     * fail the configure check. (Otherwise we will get a compiler
3796     * warning but not an error, and will proceed to fail the
3797     * qemu compile where we compile with -Werror.)
3798     */
3799    return (int)(uintptr_t)&epoll_create1;
3800}
3801EOF
3802if compile_prog "" "" ; then
3803  epoll_create1=yes
3804fi
3805
3806epoll_pwait=no
3807cat > $TMPC << EOF
3808#include <sys/epoll.h>
3809
3810int main(void)
3811{
3812    epoll_pwait(0, 0, 0, 0, 0);
3813    return 0;
3814}
3815EOF
3816if compile_prog "" "" ; then
3817  epoll_pwait=yes
3818fi
3819
3820# check for sendfile support
3821sendfile=no
3822cat > $TMPC << EOF
3823#include <sys/sendfile.h>
3824
3825int main(void)
3826{
3827    return sendfile(0, 0, 0, 0);
3828}
3829EOF
3830if compile_prog "" "" ; then
3831  sendfile=yes
3832fi
3833
3834# check for timerfd support (glibc 2.8 and newer)
3835timerfd=no
3836cat > $TMPC << EOF
3837#include <sys/timerfd.h>
3838
3839int main(void)
3840{
3841    return(timerfd_create(CLOCK_REALTIME, 0));
3842}
3843EOF
3844if compile_prog "" "" ; then
3845  timerfd=yes
3846fi
3847
3848# check for setns and unshare support
3849setns=no
3850cat > $TMPC << EOF
3851#include <sched.h>
3852
3853int main(void)
3854{
3855    int ret;
3856    ret = setns(0, 0);
3857    ret = unshare(0);
3858    return ret;
3859}
3860EOF
3861if compile_prog "" "" ; then
3862  setns=yes
3863fi
3864
3865# Check if tools are available to build documentation.
3866if test "$docs" != "no" ; then
3867  if has makeinfo && has pod2man; then
3868    docs=yes
3869  else
3870    if test "$docs" = "yes" ; then
3871      feature_not_found "docs" "Install texinfo and Perl/perl-podlators"
3872    fi
3873    docs=no
3874  fi
3875fi
3876
3877# Search for bswap_32 function
3878byteswap_h=no
3879cat > $TMPC << EOF
3880#include <byteswap.h>
3881int main(void) { return bswap_32(0); }
3882EOF
3883if compile_prog "" "" ; then
3884  byteswap_h=yes
3885fi
3886
3887# Search for bswap32 function
3888bswap_h=no
3889cat > $TMPC << EOF
3890#include <sys/endian.h>
3891#include <sys/types.h>
3892#include <machine/bswap.h>
3893int main(void) { return bswap32(0); }
3894EOF
3895if compile_prog "" "" ; then
3896  bswap_h=yes
3897fi
3898
3899##########################################
3900# Do we have libiscsi >= 1.9.0
3901if test "$libiscsi" != "no" ; then
3902  if $pkg_config --atleast-version=1.9.0 libiscsi; then
3903    libiscsi="yes"
3904    libiscsi_cflags=$($pkg_config --cflags libiscsi)
3905    libiscsi_libs=$($pkg_config --libs libiscsi)
3906  else
3907    if test "$libiscsi" = "yes" ; then
3908      feature_not_found "libiscsi" "Install libiscsi >= 1.9.0"
3909    fi
3910    libiscsi="no"
3911  fi
3912fi
3913
3914##########################################
3915# Do we need libm
3916cat > $TMPC << EOF
3917#include <math.h>
3918int main(int argc, char **argv) { return isnan(sin((double)argc)); }
3919EOF
3920if compile_prog "" "" ; then
3921  :
3922elif compile_prog "" "-lm" ; then
3923  LIBS="-lm $LIBS"
3924  libs_qga="-lm $libs_qga"
3925else
3926  error_exit "libm check failed"
3927fi
3928
3929##########################################
3930# Do we need librt
3931# uClibc provides 2 versions of clock_gettime(), one with realtime
3932# support and one without. This means that the clock_gettime() don't
3933# need -lrt. We still need it for timer_create() so we check for this
3934# function in addition.
3935cat > $TMPC <<EOF
3936#include <signal.h>
3937#include <time.h>
3938int main(void) {
3939  timer_create(CLOCK_REALTIME, NULL, NULL);
3940  return clock_gettime(CLOCK_REALTIME, NULL);
3941}
3942EOF
3943
3944if compile_prog "" "" ; then
3945  :
3946# we need pthread for static linking. use previous pthread test result
3947elif compile_prog "" "$pthread_lib -lrt" ; then
3948  LIBS="$LIBS -lrt"
3949  libs_qga="$libs_qga -lrt"
3950fi
3951
3952if test "$darwin" != "yes" -a "$mingw32" != "yes" -a "$solaris" != yes -a \
3953        "$aix" != "yes" -a "$haiku" != "yes" ; then
3954    libs_softmmu="-lutil $libs_softmmu"
3955fi
3956
3957##########################################
3958# spice probe
3959if test "$spice" != "no" ; then
3960  cat > $TMPC << EOF
3961#include <spice.h>
3962int main(void) { spice_server_new(); return 0; }
3963EOF
3964  spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
3965  spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
3966  if $pkg_config --atleast-version=0.12.0 spice-server && \
3967     $pkg_config --atleast-version=0.12.3 spice-protocol && \
3968     compile_prog "$spice_cflags" "$spice_libs" ; then
3969    spice="yes"
3970    libs_softmmu="$libs_softmmu $spice_libs"
3971    QEMU_CFLAGS="$QEMU_CFLAGS $spice_cflags"
3972    spice_protocol_version=$($pkg_config --modversion spice-protocol)
3973    spice_server_version=$($pkg_config --modversion spice-server)
3974  else
3975    if test "$spice" = "yes" ; then
3976      feature_not_found "spice" \
3977          "Install spice-server(>=0.12.0) and spice-protocol(>=0.12.3) devel"
3978    fi
3979    spice="no"
3980  fi
3981fi
3982
3983# check for smartcard support
3984smartcard_cflags=""
3985if test "$smartcard" != "no"; then
3986    if $pkg_config libcacard; then
3987        libcacard_cflags=$($pkg_config --cflags libcacard)
3988        libcacard_libs=$($pkg_config --libs libcacard)
3989        QEMU_CFLAGS="$QEMU_CFLAGS $libcacard_cflags"
3990        libs_softmmu="$libs_softmmu $libcacard_libs"
3991        smartcard="yes"
3992    else
3993        if test "$smartcard" = "yes"; then
3994            feature_not_found "smartcard" "Install libcacard devel"
3995        fi
3996        smartcard="no"
3997    fi
3998fi
3999
4000# check for libusb
4001if test "$libusb" != "no" ; then
4002    if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
4003        libusb="yes"
4004        libusb_cflags=$($pkg_config --cflags libusb-1.0)
4005        libusb_libs=$($pkg_config --libs libusb-1.0)
4006        QEMU_CFLAGS="$QEMU_CFLAGS $libusb_cflags"
4007        libs_softmmu="$libs_softmmu $libusb_libs"
4008    else
4009        if test "$libusb" = "yes"; then
4010            feature_not_found "libusb" "Install libusb devel >= 1.0.13"
4011        fi
4012        libusb="no"
4013    fi
4014fi
4015
4016# check for usbredirparser for usb network redirection support
4017if test "$usb_redir" != "no" ; then
4018    if $pkg_config --atleast-version=0.6 libusbredirparser-0.5; then
4019        usb_redir="yes"
4020        usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5)
4021        usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5)
4022        QEMU_CFLAGS="$QEMU_CFLAGS $usb_redir_cflags"
4023        libs_softmmu="$libs_softmmu $usb_redir_libs"
4024    else
4025        if test "$usb_redir" = "yes"; then
4026            feature_not_found "usb-redir" "Install usbredir devel"
4027        fi
4028        usb_redir="no"
4029    fi
4030fi
4031
4032##########################################
4033# check if we have VSS SDK headers for win
4034
4035if test "$mingw32" = "yes" -a "$guest_agent" != "no" -a "$vss_win32_sdk" != "no" ; then
4036  case "$vss_win32_sdk" in
4037    "")   vss_win32_include="-I$source_path" ;;
4038    *\ *) # The SDK is installed in "Program Files" by default, but we cannot
4039          # handle path with spaces. So we symlink the headers into ".sdk/vss".
4040          vss_win32_include="-I$source_path/.sdk/vss"
4041	  symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
4042	  ;;
4043    *)    vss_win32_include="-I$vss_win32_sdk"
4044  esac
4045  cat > $TMPC << EOF
4046#define __MIDL_user_allocate_free_DEFINED__
4047#include <inc/win2003/vss.h>
4048int main(void) { return VSS_CTX_BACKUP; }
4049EOF
4050  if compile_prog "$vss_win32_include" "" ; then
4051    guest_agent_with_vss="yes"
4052    QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
4053    libs_qga="-lole32 -loleaut32 -lshlwapi -luuid -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
4054    qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
4055  else
4056    if test "$vss_win32_sdk" != "" ; then
4057      echo "ERROR: Please download and install Microsoft VSS SDK:"
4058      echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
4059      echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
4060      echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
4061      echo "ERROR: The headers are extracted in the directory \`inc'."
4062      feature_not_found "VSS support"
4063    fi
4064    guest_agent_with_vss="no"
4065  fi
4066fi
4067
4068##########################################
4069# lookup Windows platform SDK (if not specified)
4070# The SDK is needed only to build .tlb (type library) file of guest agent
4071# VSS provider from the source. It is usually unnecessary because the
4072# pre-compiled .tlb file is included.
4073
4074if test "$mingw32" = "yes" -a "$guest_agent" != "no" -a "$guest_agent_with_vss" = "yes" ; then
4075  if test -z "$win_sdk"; then
4076    programfiles="$PROGRAMFILES"
4077    test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
4078    if test -n "$programfiles"; then
4079      win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
4080    else
4081      feature_not_found "Windows SDK"
4082    fi
4083  elif test "$win_sdk" = "no"; then
4084    win_sdk=""
4085  fi
4086fi
4087
4088##########################################
4089# check if mingw environment provides a recent ntddscsi.h
4090if test "$mingw32" = "yes" -a "$guest_agent" != "no"; then
4091  cat > $TMPC << EOF
4092#include <windows.h>
4093#include <ntddscsi.h>
4094int main(void) {
4095#if !defined(IOCTL_SCSI_GET_ADDRESS)
4096#error Missing required ioctl definitions
4097#endif
4098  SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
4099  return addr.Lun;
4100}
4101EOF
4102  if compile_prog "" "" ; then
4103    guest_agent_ntddscsi=yes
4104    libs_qga="-lsetupapi $libs_qga"
4105  fi
4106fi
4107
4108##########################################
4109# virgl renderer probe
4110
4111if test "$virglrenderer" != "no" ; then
4112  cat > $TMPC << EOF
4113#include <virglrenderer.h>
4114int main(void) { virgl_renderer_poll(); return 0; }
4115EOF
4116  virgl_cflags=$($pkg_config --cflags virglrenderer 2>/dev/null)
4117  virgl_libs=$($pkg_config --libs virglrenderer 2>/dev/null)
4118  if $pkg_config virglrenderer >/dev/null 2>&1 && \
4119     compile_prog "$virgl_cflags" "$virgl_libs" ; then
4120    virglrenderer="yes"
4121  else
4122    if test "$virglrenderer" = "yes" ; then
4123      feature_not_found "virglrenderer"
4124    fi
4125    virglrenderer="no"
4126  fi
4127fi
4128
4129##########################################
4130# check if we have fdatasync
4131
4132fdatasync=no
4133cat > $TMPC << EOF
4134#include <unistd.h>
4135int main(void) {
4136#if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
4137return fdatasync(0);
4138#else
4139#error Not supported
4140#endif
4141}
4142EOF
4143if compile_prog "" "" ; then
4144    fdatasync=yes
4145fi
4146
4147##########################################
4148# check if we have madvise
4149
4150madvise=no
4151cat > $TMPC << EOF
4152#include <sys/types.h>
4153#include <sys/mman.h>
4154#include <stddef.h>
4155int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }
4156EOF
4157if compile_prog "" "" ; then
4158    madvise=yes
4159fi
4160
4161##########################################
4162# check if we have posix_madvise
4163
4164posix_madvise=no
4165cat > $TMPC << EOF
4166#include <sys/mman.h>
4167#include <stddef.h>
4168int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }
4169EOF
4170if compile_prog "" "" ; then
4171    posix_madvise=yes
4172fi
4173
4174##########################################
4175# check if we have usable SIGEV_THREAD_ID
4176
4177sigev_thread_id=no
4178cat > $TMPC << EOF
4179#include <signal.h>
4180int main(void) {
4181  struct sigevent ev;
4182  ev.sigev_notify = SIGEV_THREAD_ID;
4183  ev._sigev_un._tid = 0;
4184  asm volatile("" : : "g"(&ev));
4185  return 0;
4186}
4187EOF
4188if compile_prog "" "" ; then
4189    sigev_thread_id=yes
4190fi
4191
4192##########################################
4193# check if trace backend exists
4194
4195$python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
4196if test "$?" -ne 0 ; then
4197  error_exit "invalid trace backends" \
4198      "Please choose supported trace backends."
4199fi
4200
4201##########################################
4202# For 'ust' backend, test if ust headers are present
4203if have_backend "ust"; then
4204  cat > $TMPC << EOF
4205#include <lttng/tracepoint.h>
4206int main(void) { return 0; }
4207EOF
4208  if compile_prog "" "" ; then
4209    if $pkg_config lttng-ust --exists; then
4210      lttng_ust_libs=`$pkg_config --libs lttng-ust`
4211    else
4212      lttng_ust_libs="-llttng-ust"
4213    fi
4214    if $pkg_config liburcu-bp --exists; then
4215      urcu_bp_libs=`$pkg_config --libs liburcu-bp`
4216    else
4217      urcu_bp_libs="-lurcu-bp"
4218    fi
4219
4220    LIBS="$lttng_ust_libs $urcu_bp_libs $LIBS"
4221    libs_qga="$lttng_ust_libs $urcu_bp_libs $libs_qga"
4222  else
4223    error_exit "Trace backend 'ust' missing lttng-ust header files"
4224  fi
4225fi
4226
4227##########################################
4228# For 'dtrace' backend, test if 'dtrace' command is present
4229if have_backend "dtrace"; then
4230  if ! has 'dtrace' ; then
4231    error_exit "dtrace command is not found in PATH $PATH"
4232  fi
4233  trace_backend_stap="no"
4234  if has 'stap' ; then
4235    trace_backend_stap="yes"
4236  fi
4237fi
4238
4239##########################################
4240# check and set a backend for coroutine
4241
4242# We prefer ucontext, but it's not always possible. The fallback
4243# is sigcontext. gthread is not selectable except explicitly, because
4244# it is not functional enough to run QEMU proper. (It is occasionally
4245# useful for debugging purposes.)  On Windows the only valid backend
4246# is the Windows-specific one.
4247
4248ucontext_works=no
4249if test "$darwin" != "yes"; then
4250  cat > $TMPC << EOF
4251#include <ucontext.h>
4252#ifdef __stub_makecontext
4253#error Ignoring glibc stub makecontext which will always fail
4254#endif
4255int main(void) { makecontext(0, 0, 0); return 0; }
4256EOF
4257  if compile_prog "" "" ; then
4258    ucontext_works=yes
4259  fi
4260fi
4261
4262if test "$coroutine" = ""; then
4263  if test "$mingw32" = "yes"; then
4264    coroutine=win32
4265  elif test "$ucontext_works" = "yes"; then
4266    coroutine=ucontext
4267  else
4268    coroutine=sigaltstack
4269  fi
4270else
4271  case $coroutine in
4272  windows)
4273    if test "$mingw32" != "yes"; then
4274      error_exit "'windows' coroutine backend only valid for Windows"
4275    fi
4276    # Unfortunately the user visible backend name doesn't match the
4277    # coroutine-*.c filename for this case, so we have to adjust it here.
4278    coroutine=win32
4279    ;;
4280  ucontext)
4281    if test "$ucontext_works" != "yes"; then
4282      feature_not_found "ucontext"
4283    fi
4284    ;;
4285  gthread|sigaltstack)
4286    if test "$mingw32" = "yes"; then
4287      error_exit "only the 'windows' coroutine backend is valid for Windows"
4288    fi
4289    ;;
4290  *)
4291    error_exit "unknown coroutine backend $coroutine"
4292    ;;
4293  esac
4294fi
4295
4296if test "$coroutine_pool" = ""; then
4297  if test "$coroutine" = "gthread"; then
4298    coroutine_pool=no
4299  else
4300    coroutine_pool=yes
4301  fi
4302fi
4303if test "$coroutine" = "gthread" -a "$coroutine_pool" = "yes"; then
4304  error_exit "'gthread' coroutine backend does not support pool (use --disable-coroutine-pool)"
4305fi
4306
4307##########################################
4308# check if we have open_by_handle_at
4309
4310open_by_handle_at=no
4311cat > $TMPC << EOF
4312#include <fcntl.h>
4313#if !defined(AT_EMPTY_PATH)
4314# error missing definition
4315#else
4316int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
4317#endif
4318EOF
4319if compile_prog "" "" ; then
4320    open_by_handle_at=yes
4321fi
4322
4323########################################
4324# check if we have linux/magic.h
4325
4326linux_magic_h=no
4327cat > $TMPC << EOF
4328#include <linux/magic.h>
4329int main(void) {
4330  return 0;
4331}
4332EOF
4333if compile_prog "" "" ; then
4334    linux_magic_h=yes
4335fi
4336
4337########################################
4338# check whether we can disable warning option with a pragma (this is needed
4339# to silence warnings in the headers of some versions of external libraries).
4340# This test has to be compiled with -Werror as otherwise an unknown pragma is
4341# only a warning.
4342#
4343# If we can't selectively disable warning in the code, disable -Werror so that
4344# the build doesn't fail anyway.
4345
4346pragma_disable_unused_but_set=no
4347cat > $TMPC << EOF
4348#pragma GCC diagnostic push
4349#pragma GCC diagnostic ignored "-Wunused-but-set-variable"
4350#pragma GCC diagnostic ignored "-Wstrict-prototypes"
4351#pragma GCC diagnostic pop
4352
4353int main(void) {
4354    return 0;
4355}
4356EOF
4357if compile_prog "-Werror" "" ; then
4358    pragma_diagnostic_available=yes
4359else
4360    werror=no
4361fi
4362
4363########################################
4364# check if we have valgrind/valgrind.h
4365
4366valgrind_h=no
4367cat > $TMPC << EOF
4368#include <valgrind/valgrind.h>
4369int main(void) {
4370  return 0;
4371}
4372EOF
4373if compile_prog "" "" ; then
4374    valgrind_h=yes
4375fi
4376
4377########################################
4378# check if environ is declared
4379
4380has_environ=no
4381cat > $TMPC << EOF
4382#include <unistd.h>
4383int main(void) {
4384    environ = 0;
4385    return 0;
4386}
4387EOF
4388if compile_prog "" "" ; then
4389    has_environ=yes
4390fi
4391
4392########################################
4393# check if cpuid.h is usable.
4394
4395cpuid_h=no
4396cat > $TMPC << EOF
4397#include <cpuid.h>
4398int main(void) {
4399    unsigned a, b, c, d;
4400    int max = __get_cpuid_max(0, 0);
4401
4402    if (max >= 1) {
4403        __cpuid(1, a, b, c, d);
4404    }
4405
4406    if (max >= 7) {
4407        __cpuid_count(7, 0, a, b, c, d);
4408    }
4409
4410    return 0;
4411}
4412EOF
4413if compile_prog "" "" ; then
4414    cpuid_h=yes
4415fi
4416
4417########################################
4418# check if __[u]int128_t is usable.
4419
4420int128=no
4421cat > $TMPC << EOF
4422#if defined(__clang_major__) && defined(__clang_minor__)
4423# if ((__clang_major__ < 3) || (__clang_major__ == 3) && (__clang_minor__ < 2))
4424#  error __int128_t does not work in CLANG before 3.2
4425# endif
4426#endif
4427__int128_t a;
4428__uint128_t b;
4429int main (void) {
4430  a = a + b;
4431  b = a * b;
4432  a = a * a;
4433  return 0;
4434}
4435EOF
4436if compile_prog "" "" ; then
4437    int128=yes
4438fi
4439
4440########################################
4441# check if getauxval is available.
4442
4443getauxval=no
4444cat > $TMPC << EOF
4445#include <sys/auxv.h>
4446int main(void) {
4447  return getauxval(AT_HWCAP) == 0;
4448}
4449EOF
4450if compile_prog "" "" ; then
4451    getauxval=yes
4452fi
4453
4454########################################
4455# check if ccache is interfering with
4456# semantic analysis of macros
4457
4458unset CCACHE_CPP2
4459ccache_cpp2=no
4460cat > $TMPC << EOF
4461static const int Z = 1;
4462#define fn() ({ Z; })
4463#define TAUT(X) ((X) == Z)
4464#define PAREN(X, Y) (X == Y)
4465#define ID(X) (X)
4466int main(int argc, char *argv[])
4467{
4468    int x = 0, y = 0;
4469    x = ID(x);
4470    x = fn();
4471    fn();
4472    if (PAREN(x, y)) return 0;
4473    if (TAUT(Z)) return 0;
4474    return 0;
4475}
4476EOF
4477
4478if ! compile_object "-Werror"; then
4479    ccache_cpp2=yes
4480fi
4481
4482#################################################
4483# clang does not support glibc + FORTIFY_SOURCE.
4484
4485if test "$fortify_source" != "no"; then
4486  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
4487    fortify_source="no";
4488  elif test -n "$cxx" &&
4489       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
4490    fortify_source="no";
4491  else
4492    fortify_source="yes"
4493  fi
4494fi
4495
4496##########################################
4497# End of CC checks
4498# After here, no more $cc or $ld runs
4499
4500if test "$gcov" = "yes" ; then
4501  CFLAGS="-fprofile-arcs -ftest-coverage -g $CFLAGS"
4502  LDFLAGS="-fprofile-arcs -ftest-coverage $LDFLAGS"
4503elif test "$fortify_source" = "yes" ; then
4504  CFLAGS="-O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $CFLAGS"
4505elif test "$debug" = "no"; then
4506  CFLAGS="-O2 $CFLAGS"
4507fi
4508
4509##########################################
4510# Do we have libnfs
4511if test "$libnfs" != "no" ; then
4512  if $pkg_config --atleast-version=1.9.3 libnfs; then
4513    libnfs="yes"
4514    libnfs_libs=$($pkg_config --libs libnfs)
4515    LIBS="$LIBS $libnfs_libs"
4516  else
4517    if test "$libnfs" = "yes" ; then
4518      feature_not_found "libnfs" "Install libnfs devel >= 1.9.3"
4519    fi
4520    libnfs="no"
4521  fi
4522fi
4523
4524# Disable zero malloc errors for official releases unless explicitly told to
4525# enable/disable
4526if test -z "$zero_malloc" ; then
4527    if test "$z_version" = "50" ; then
4528	zero_malloc="no"
4529    else
4530	zero_malloc="yes"
4531    fi
4532fi
4533
4534# Now we've finished running tests it's OK to add -Werror to the compiler flags
4535if test "$werror" = "yes"; then
4536    QEMU_CFLAGS="-Werror $QEMU_CFLAGS"
4537fi
4538
4539if test "$solaris" = "no" ; then
4540    if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
4541        LDFLAGS="-Wl,--warn-common $LDFLAGS"
4542    fi
4543fi
4544
4545# test if pod2man has --utf8 option
4546if pod2man --help | grep -q utf8; then
4547    POD2MAN="pod2man --utf8"
4548else
4549    POD2MAN="pod2man"
4550fi
4551
4552# Use ASLR, no-SEH and DEP if available
4553if test "$mingw32" = "yes" ; then
4554    for flag in --dynamicbase --no-seh --nxcompat; do
4555        if $ld --help 2>/dev/null | grep ".$flag" >/dev/null 2>/dev/null ; then
4556            LDFLAGS="-Wl,$flag $LDFLAGS"
4557        fi
4558    done
4559fi
4560
4561qemu_confdir=$sysconfdir$confsuffix
4562qemu_moddir=$libdir$confsuffix
4563qemu_datadir=$datadir$confsuffix
4564qemu_localedir="$datadir/locale"
4565
4566tools=""
4567if test "$want_tools" = "yes" ; then
4568  tools="qemu-img\$(EXESUF) qemu-io\$(EXESUF) $tools"
4569  if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" ] ; then
4570    tools="qemu-nbd\$(EXESUF) $tools"
4571    tools="ivshmem-client\$(EXESUF) ivshmem-server\$(EXESUF) $tools"
4572  fi
4573fi
4574if test "$softmmu" = yes ; then
4575  if test "$virtfs" != no ; then
4576    if test "$cap" = yes && test "$linux" = yes && test "$attr" = yes ; then
4577      virtfs=yes
4578      tools="$tools fsdev/virtfs-proxy-helper\$(EXESUF)"
4579    else
4580      if test "$virtfs" = yes; then
4581        error_exit "VirtFS is supported only on Linux and requires libcap-devel and libattr-devel"
4582      fi
4583      virtfs=no
4584    fi
4585  fi
4586fi
4587
4588# Probe for guest agent support/options
4589
4590if [ "$guest_agent" != "no" ]; then
4591  if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
4592      tools="qemu-ga $tools"
4593      guest_agent=yes
4594  elif [ "$guest_agent" != yes ]; then
4595      guest_agent=no
4596  else
4597      error_exit "Guest agent is not supported on this platform"
4598  fi
4599fi
4600
4601# Guest agent Window MSI  package
4602
4603if test "$guest_agent" != yes; then
4604  if test "$guest_agent_msi" = yes; then
4605    error_exit "MSI guest agent package requires guest agent enabled"
4606  fi
4607  guest_agent_msi=no
4608elif test "$mingw32" != "yes"; then
4609  if test "$guest_agent_msi" = "yes"; then
4610    error_exit "MSI guest agent package is available only for MinGW Windows cross-compilation"
4611  fi
4612  guest_agent_msi=no
4613elif ! has wixl; then
4614  if test "$guest_agent_msi" = "yes"; then
4615    error_exit "MSI guest agent package requires wixl tool installed ( usually from msitools package )"
4616  fi
4617  guest_agent_msi=no
4618else
4619  # we support qemu-ga, mingw32, and wixl: default to MSI enabled if it wasn't
4620  # disabled explicitly
4621  if test "$guest_agent_msi" != "no"; then
4622    guest_agent_msi=yes
4623  fi
4624fi
4625
4626if test "$guest_agent_msi" = "yes"; then
4627  if test "$guest_agent_with_vss" = "yes"; then
4628    QEMU_GA_MSI_WITH_VSS="-D InstallVss"
4629  fi
4630
4631  if test "$QEMU_GA_MANUFACTURER" = ""; then
4632    QEMU_GA_MANUFACTURER=QEMU
4633  fi
4634
4635  if test "$QEMU_GA_DISTRO" = ""; then
4636    QEMU_GA_DISTRO=Linux
4637  fi
4638
4639  if test "$QEMU_GA_VERSION" = ""; then
4640      QEMU_GA_VERSION=`cat $source_path/VERSION`
4641  fi
4642
4643  QEMU_GA_MSI_MINGW_DLL_PATH="-D Mingw_dlls=`$pkg_config --variable=prefix glib-2.0`/bin"
4644
4645  case "$cpu" in
4646  x86_64)
4647    QEMU_GA_MSI_ARCH="-a x64 -D Arch=64"
4648    ;;
4649  i386)
4650    QEMU_GA_MSI_ARCH="-D Arch=32"
4651    ;;
4652  *)
4653    error_exit "CPU $cpu not supported for building installation package"
4654    ;;
4655  esac
4656fi
4657
4658# Mac OS X ships with a broken assembler
4659roms=
4660if test \( "$cpu" = "i386" -o "$cpu" = "x86_64" \) -a \
4661        "$targetos" != "Darwin" -a "$targetos" != "SunOS" -a \
4662        "$softmmu" = yes ; then
4663  roms="optionrom"
4664fi
4665if test "$cpu" = "ppc64" -a "$targetos" != "Darwin" ; then
4666  roms="$roms spapr-rtas"
4667fi
4668
4669if test "$cpu" = "s390x" ; then
4670  roms="$roms s390-ccw"
4671fi
4672
4673# Probe for the need for relocating the user-only binary.
4674if test "$pie" = "no" ; then
4675  textseg_addr=
4676  case "$cpu" in
4677    arm | i386 | ppc* | s390* | sparc* | x86_64 | x32)
4678      # ??? Rationale for choosing this address
4679      textseg_addr=0x60000000
4680      ;;
4681    mips)
4682      # A 256M aligned address, high in the address space, with enough
4683      # room for the code_gen_buffer above it before the stack.
4684      textseg_addr=0x60000000
4685      ;;
4686  esac
4687  if [ -n "$textseg_addr" ]; then
4688    cat > $TMPC <<EOF
4689    int main(void) { return 0; }
4690EOF
4691    textseg_ldflags="-Wl,-Ttext-segment=$textseg_addr"
4692    if ! compile_prog "" "$textseg_ldflags"; then
4693      # In case ld does not support -Ttext-segment, edit the default linker
4694      # script via sed to set the .text start addr.  This is needed on FreeBSD
4695      # at least.
4696      $ld --verbose | sed \
4697        -e '1,/==================================================/d' \
4698        -e '/==================================================/,$d' \
4699        -e "s/[.] = [0-9a-fx]* [+] SIZEOF_HEADERS/. = $textseg_addr + SIZEOF_HEADERS/" \
4700        -e "s/__executable_start = [0-9a-fx]*/__executable_start = $textseg_addr/" > config-host.ld
4701      textseg_ldflags="-Wl,-T../config-host.ld"
4702    fi
4703  fi
4704fi
4705
4706# prepend pixman and ftd flags after all config tests are done
4707QEMU_CFLAGS="$pixman_cflags $fdt_cflags $QEMU_CFLAGS"
4708libs_softmmu="$pixman_libs $libs_softmmu"
4709
4710echo "Install prefix    $prefix"
4711echo "BIOS directory    `eval echo $qemu_datadir`"
4712echo "binary directory  `eval echo $bindir`"
4713echo "library directory `eval echo $libdir`"
4714echo "module directory  `eval echo $qemu_moddir`"
4715echo "libexec directory `eval echo $libexecdir`"
4716echo "include directory `eval echo $includedir`"
4717echo "config directory  `eval echo $sysconfdir`"
4718if test "$mingw32" = "no" ; then
4719echo "local state directory   `eval echo $local_statedir`"
4720echo "Manual directory  `eval echo $mandir`"
4721echo "ELF interp prefix $interp_prefix"
4722else
4723echo "local state directory   queried at runtime"
4724echo "Windows SDK       $win_sdk"
4725fi
4726echo "Source path       $source_path"
4727echo "C compiler        $cc"
4728echo "Host C compiler   $host_cc"
4729echo "C++ compiler      $cxx"
4730echo "Objective-C compiler $objcc"
4731echo "ARFLAGS           $ARFLAGS"
4732echo "CFLAGS            $CFLAGS"
4733echo "QEMU_CFLAGS       $QEMU_CFLAGS"
4734echo "LDFLAGS           $LDFLAGS"
4735echo "make              $make"
4736echo "install           $install"
4737echo "python            $python"
4738if test "$slirp" = "yes" ; then
4739    echo "smbd              $smbd"
4740fi
4741echo "module support    $modules"
4742echo "host CPU          $cpu"
4743echo "host big endian   $bigendian"
4744echo "target list       $target_list"
4745echo "tcg debug enabled $debug_tcg"
4746echo "gprof enabled     $gprof"
4747echo "sparse enabled    $sparse"
4748echo "strip binaries    $strip_opt"
4749echo "profiler          $profiler"
4750echo "static build      $static"
4751if test "$darwin" = "yes" ; then
4752    echo "Cocoa support     $cocoa"
4753fi
4754echo "pixman            $pixman"
4755echo "SDL support       $sdl"
4756echo "GTK support       $gtk"
4757echo "GTK GL support    $gtk_gl"
4758echo "GNUTLS support    $gnutls"
4759echo "GNUTLS hash       $gnutls_hash"
4760echo "GNUTLS rnd        $gnutls_rnd"
4761echo "libgcrypt         $gcrypt"
4762echo "libgcrypt kdf     $gcrypt_kdf"
4763if test "$nettle" = "yes"; then
4764    echo "nettle            $nettle ($nettle_version)"
4765else
4766    echo "nettle            $nettle"
4767fi
4768echo "nettle kdf        $nettle_kdf"
4769echo "libtasn1          $tasn1"
4770echo "VTE support       $vte"
4771echo "curses support    $curses"
4772echo "virgl support     $virglrenderer"
4773echo "curl support      $curl"
4774echo "mingw32 support   $mingw32"
4775echo "Audio drivers     $audio_drv_list"
4776echo "Block whitelist (rw) $block_drv_rw_whitelist"
4777echo "Block whitelist (ro) $block_drv_ro_whitelist"
4778echo "VirtFS support    $virtfs"
4779echo "VNC support       $vnc"
4780if test "$vnc" = "yes" ; then
4781    echo "VNC SASL support  $vnc_sasl"
4782    echo "VNC JPEG support  $vnc_jpeg"
4783    echo "VNC PNG support   $vnc_png"
4784fi
4785if test -n "$sparc_cpu"; then
4786    echo "Target Sparc Arch $sparc_cpu"
4787fi
4788echo "xen support       $xen"
4789if test "$xen" = "yes" ; then
4790  echo "xen ctrl version  $xen_ctrl_version"
4791  echo "pv dom build      $xen_pv_domain_build"
4792fi
4793echo "brlapi support    $brlapi"
4794echo "bluez  support    $bluez"
4795echo "Documentation     $docs"
4796echo "PIE               $pie"
4797echo "vde support       $vde"
4798echo "netmap support    $netmap"
4799echo "Linux AIO support $linux_aio"
4800echo "ATTR/XATTR support $attr"
4801echo "Install blobs     $blobs"
4802echo "KVM support       $kvm"
4803echo "RDMA support      $rdma"
4804echo "TCG interpreter   $tcg_interpreter"
4805echo "fdt support       $fdt"
4806echo "preadv support    $preadv"
4807echo "fdatasync         $fdatasync"
4808echo "madvise           $madvise"
4809echo "posix_madvise     $posix_madvise"
4810echo "sigev_thread_id   $sigev_thread_id"
4811echo "uuid support      $uuid"
4812echo "libcap-ng support $cap_ng"
4813echo "vhost-net support $vhost_net"
4814echo "vhost-scsi support $vhost_scsi"
4815echo "Trace backends    $trace_backends"
4816if have_backend "simple"; then
4817echo "Trace output file $trace_file-<pid>"
4818fi
4819if test "$spice" = "yes"; then
4820echo "spice support     $spice ($spice_protocol_version/$spice_server_version)"
4821else
4822echo "spice support     $spice"
4823fi
4824echo "rbd support       $rbd"
4825echo "xfsctl support    $xfs"
4826echo "smartcard support $smartcard"
4827echo "libusb            $libusb"
4828echo "usb net redir     $usb_redir"
4829echo "OpenGL support    $opengl"
4830echo "OpenGL dmabufs    $opengl_dmabuf"
4831echo "libiscsi support  $libiscsi"
4832echo "libnfs support    $libnfs"
4833echo "build guest agent $guest_agent"
4834echo "QGA VSS support   $guest_agent_with_vss"
4835echo "QGA w32 disk info $guest_agent_ntddscsi"
4836echo "QGA MSI support   $guest_agent_msi"
4837echo "seccomp support   $seccomp"
4838echo "coroutine backend $coroutine"
4839echo "coroutine pool    $coroutine_pool"
4840echo "GlusterFS support $glusterfs"
4841echo "Archipelago support $archipelago"
4842echo "gcov              $gcov_tool"
4843echo "gcov enabled      $gcov"
4844echo "TPM support       $tpm"
4845echo "libssh2 support   $libssh2"
4846echo "TPM passthrough   $tpm_passthrough"
4847echo "QOM debugging     $qom_cast_debug"
4848echo "vhdx              $vhdx"
4849echo "lzo support       $lzo"
4850echo "snappy support    $snappy"
4851echo "bzip2 support     $bzip2"
4852echo "NUMA host support $numa"
4853echo "tcmalloc support  $tcmalloc"
4854echo "jemalloc support  $jemalloc"
4855echo "avx2 optimization $avx2_opt"
4856
4857if test "$sdl_too_old" = "yes"; then
4858echo "-> Your SDL version is too old - please upgrade to have SDL support"
4859fi
4860
4861config_host_mak="config-host.mak"
4862
4863echo "# Automatically generated by configure - do not modify" >config-all-disas.mak
4864
4865echo "# Automatically generated by configure - do not modify" > $config_host_mak
4866echo >> $config_host_mak
4867
4868echo all: >> $config_host_mak
4869echo "prefix=$prefix" >> $config_host_mak
4870echo "bindir=$bindir" >> $config_host_mak
4871echo "libdir=$libdir" >> $config_host_mak
4872echo "libexecdir=$libexecdir" >> $config_host_mak
4873echo "includedir=$includedir" >> $config_host_mak
4874echo "mandir=$mandir" >> $config_host_mak
4875echo "sysconfdir=$sysconfdir" >> $config_host_mak
4876echo "qemu_confdir=$qemu_confdir" >> $config_host_mak
4877echo "qemu_datadir=$qemu_datadir" >> $config_host_mak
4878echo "qemu_docdir=$qemu_docdir" >> $config_host_mak
4879echo "qemu_moddir=$qemu_moddir" >> $config_host_mak
4880if test "$mingw32" = "no" ; then
4881  echo "qemu_localstatedir=$local_statedir" >> $config_host_mak
4882fi
4883echo "qemu_helperdir=$libexecdir" >> $config_host_mak
4884echo "extra_cflags=$EXTRA_CFLAGS" >> $config_host_mak
4885echo "extra_ldflags=$EXTRA_LDFLAGS" >> $config_host_mak
4886echo "qemu_localedir=$qemu_localedir" >> $config_host_mak
4887echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
4888
4889echo "ARCH=$ARCH" >> $config_host_mak
4890
4891if test "$debug_tcg" = "yes" ; then
4892  echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
4893fi
4894if test "$strip_opt" = "yes" ; then
4895  echo "STRIP=${strip}" >> $config_host_mak
4896fi
4897if test "$bigendian" = "yes" ; then
4898  echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
4899fi
4900if test "$mingw32" = "yes" ; then
4901  echo "CONFIG_WIN32=y" >> $config_host_mak
4902  rc_version=`cat $source_path/VERSION`
4903  version_major=${rc_version%%.*}
4904  rc_version=${rc_version#*.}
4905  version_minor=${rc_version%%.*}
4906  rc_version=${rc_version#*.}
4907  version_subminor=${rc_version%%.*}
4908  version_micro=0
4909  echo "CONFIG_FILEVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
4910  echo "CONFIG_PRODUCTVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
4911  if test "$guest_agent_with_vss" = "yes" ; then
4912    echo "CONFIG_QGA_VSS=y" >> $config_host_mak
4913    echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
4914    echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
4915  fi
4916  if test "$guest_agent_ntddscsi" = "yes" ; then
4917    echo "CONFIG_QGA_NTDDDISK=y" >> $config_host_mak
4918  fi
4919  if test "$guest_agent_msi" = "yes"; then
4920    echo "QEMU_GA_MSI_ENABLED=yes" >> $config_host_mak
4921    echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
4922    echo "QEMU_GA_MSI_WITH_VSS=${QEMU_GA_MSI_WITH_VSS}" >> $config_host_mak
4923    echo "QEMU_GA_MSI_ARCH=${QEMU_GA_MSI_ARCH}" >> $config_host_mak
4924    echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
4925    echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
4926    echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
4927  fi
4928else
4929  echo "CONFIG_POSIX=y" >> $config_host_mak
4930fi
4931
4932if test "$linux" = "yes" ; then
4933  echo "CONFIG_LINUX=y" >> $config_host_mak
4934fi
4935
4936if test "$darwin" = "yes" ; then
4937  echo "CONFIG_DARWIN=y" >> $config_host_mak
4938fi
4939
4940if test "$aix" = "yes" ; then
4941  echo "CONFIG_AIX=y" >> $config_host_mak
4942fi
4943
4944if test "$solaris" = "yes" ; then
4945  echo "CONFIG_SOLARIS=y" >> $config_host_mak
4946  echo "CONFIG_SOLARIS_VERSION=$solarisrev" >> $config_host_mak
4947  if test "$needs_libsunmath" = "yes" ; then
4948    echo "CONFIG_NEEDS_LIBSUNMATH=y" >> $config_host_mak
4949  fi
4950fi
4951if test "$haiku" = "yes" ; then
4952  echo "CONFIG_HAIKU=y" >> $config_host_mak
4953fi
4954if test "$static" = "yes" ; then
4955  echo "CONFIG_STATIC=y" >> $config_host_mak
4956fi
4957if test "$profiler" = "yes" ; then
4958  echo "CONFIG_PROFILER=y" >> $config_host_mak
4959fi
4960if test "$slirp" = "yes" ; then
4961  echo "CONFIG_SLIRP=y" >> $config_host_mak
4962  echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
4963fi
4964if test "$vde" = "yes" ; then
4965  echo "CONFIG_VDE=y" >> $config_host_mak
4966fi
4967if test "$netmap" = "yes" ; then
4968  echo "CONFIG_NETMAP=y" >> $config_host_mak
4969fi
4970if test "$l2tpv3" = "yes" ; then
4971  echo "CONFIG_L2TPV3=y" >> $config_host_mak
4972fi
4973if test "$cap_ng" = "yes" ; then
4974  echo "CONFIG_LIBCAP=y" >> $config_host_mak
4975fi
4976echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
4977for drv in $audio_drv_list; do
4978    def=CONFIG_`echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]'`
4979    echo "$def=y" >> $config_host_mak
4980done
4981if test "$audio_pt_int" = "yes" ; then
4982  echo "CONFIG_AUDIO_PT_INT=y" >> $config_host_mak
4983fi
4984if test "$audio_win_int" = "yes" ; then
4985  echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
4986fi
4987echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
4988echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
4989if test "$vnc" = "yes" ; then
4990  echo "CONFIG_VNC=y" >> $config_host_mak
4991fi
4992if test "$vnc_sasl" = "yes" ; then
4993  echo "CONFIG_VNC_SASL=y" >> $config_host_mak
4994fi
4995if test "$vnc_jpeg" = "yes" ; then
4996  echo "CONFIG_VNC_JPEG=y" >> $config_host_mak
4997fi
4998if test "$vnc_png" = "yes" ; then
4999  echo "CONFIG_VNC_PNG=y" >> $config_host_mak
5000fi
5001if test "$fnmatch" = "yes" ; then
5002  echo "CONFIG_FNMATCH=y" >> $config_host_mak
5003fi
5004if test "$uuid" = "yes" ; then
5005  echo "CONFIG_UUID=y" >> $config_host_mak
5006fi
5007if test "$xfs" = "yes" ; then
5008  echo "CONFIG_XFS=y" >> $config_host_mak
5009fi
5010qemu_version=`head $source_path/VERSION`
5011echo "VERSION=$qemu_version" >>$config_host_mak
5012echo "PKGVERSION=$pkgversion" >>$config_host_mak
5013echo "SRC_PATH=$source_path" >> $config_host_mak
5014echo "TARGET_DIRS=$target_list" >> $config_host_mak
5015if [ "$docs" = "yes" ] ; then
5016  echo "BUILD_DOCS=yes" >> $config_host_mak
5017fi
5018if test "$modules" = "yes"; then
5019  # $shacmd can generate a hash started with digit, which the compiler doesn't
5020  # like as an symbol. So prefix it with an underscore
5021  echo "CONFIG_STAMP=_`(echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ `" >> $config_host_mak
5022  echo "CONFIG_MODULES=y" >> $config_host_mak
5023fi
5024if test "$sdl" = "yes" ; then
5025  echo "CONFIG_SDL=y" >> $config_host_mak
5026  echo "CONFIG_SDLABI=$sdlabi" >> $config_host_mak
5027  echo "SDL_CFLAGS=$sdl_cflags" >> $config_host_mak
5028fi
5029if test "$cocoa" = "yes" ; then
5030  echo "CONFIG_COCOA=y" >> $config_host_mak
5031fi
5032if test "$curses" = "yes" ; then
5033  echo "CONFIG_CURSES=y" >> $config_host_mak
5034fi
5035if test "$utimens" = "yes" ; then
5036  echo "CONFIG_UTIMENSAT=y" >> $config_host_mak
5037fi
5038if test "$pipe2" = "yes" ; then
5039  echo "CONFIG_PIPE2=y" >> $config_host_mak
5040fi
5041if test "$accept4" = "yes" ; then
5042  echo "CONFIG_ACCEPT4=y" >> $config_host_mak
5043fi
5044if test "$splice" = "yes" ; then
5045  echo "CONFIG_SPLICE=y" >> $config_host_mak
5046fi
5047if test "$eventfd" = "yes" ; then
5048  echo "CONFIG_EVENTFD=y" >> $config_host_mak
5049fi
5050if test "$memfd" = "yes" ; then
5051  echo "CONFIG_MEMFD=y" >> $config_host_mak
5052fi
5053if test "$fallocate" = "yes" ; then
5054  echo "CONFIG_FALLOCATE=y" >> $config_host_mak
5055fi
5056if test "$fallocate_punch_hole" = "yes" ; then
5057  echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
5058fi
5059if test "$fallocate_zero_range" = "yes" ; then
5060  echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak
5061fi
5062if test "$posix_fallocate" = "yes" ; then
5063  echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
5064fi
5065if test "$sync_file_range" = "yes" ; then
5066  echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
5067fi
5068if test "$fiemap" = "yes" ; then
5069  echo "CONFIG_FIEMAP=y" >> $config_host_mak
5070fi
5071if test "$dup3" = "yes" ; then
5072  echo "CONFIG_DUP3=y" >> $config_host_mak
5073fi
5074if test "$ppoll" = "yes" ; then
5075  echo "CONFIG_PPOLL=y" >> $config_host_mak
5076fi
5077if test "$prctl_pr_set_timerslack" = "yes" ; then
5078  echo "CONFIG_PRCTL_PR_SET_TIMERSLACK=y" >> $config_host_mak
5079fi
5080if test "$epoll" = "yes" ; then
5081  echo "CONFIG_EPOLL=y" >> $config_host_mak
5082fi
5083if test "$epoll_create1" = "yes" ; then
5084  echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
5085fi
5086if test "$epoll_pwait" = "yes" ; then
5087  echo "CONFIG_EPOLL_PWAIT=y" >> $config_host_mak
5088fi
5089if test "$sendfile" = "yes" ; then
5090  echo "CONFIG_SENDFILE=y" >> $config_host_mak
5091fi
5092if test "$timerfd" = "yes" ; then
5093  echo "CONFIG_TIMERFD=y" >> $config_host_mak
5094fi
5095if test "$setns" = "yes" ; then
5096  echo "CONFIG_SETNS=y" >> $config_host_mak
5097fi
5098if test "$inotify" = "yes" ; then
5099  echo "CONFIG_INOTIFY=y" >> $config_host_mak
5100fi
5101if test "$inotify1" = "yes" ; then
5102  echo "CONFIG_INOTIFY1=y" >> $config_host_mak
5103fi
5104if test "$byteswap_h" = "yes" ; then
5105  echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
5106fi
5107if test "$bswap_h" = "yes" ; then
5108  echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
5109fi
5110if test "$curl" = "yes" ; then
5111  echo "CONFIG_CURL=m" >> $config_host_mak
5112  echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak
5113  echo "CURL_LIBS=$curl_libs" >> $config_host_mak
5114fi
5115if test "$brlapi" = "yes" ; then
5116  echo "CONFIG_BRLAPI=y" >> $config_host_mak
5117fi
5118if test "$bluez" = "yes" ; then
5119  echo "CONFIG_BLUEZ=y" >> $config_host_mak
5120  echo "BLUEZ_CFLAGS=$bluez_cflags" >> $config_host_mak
5121fi
5122if test "$glib_subprocess" = "yes" ; then
5123  echo "CONFIG_HAS_GLIB_SUBPROCESS_TESTS=y" >> $config_host_mak
5124fi
5125echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
5126if test "$gtk" = "yes" ; then
5127  echo "CONFIG_GTK=y" >> $config_host_mak
5128  echo "CONFIG_GTKABI=$gtkabi" >> $config_host_mak
5129  echo "GTK_CFLAGS=$gtk_cflags" >> $config_host_mak
5130  echo "GTK_LIBS=$gtk_libs" >> $config_host_mak
5131  if test "$gtk_gl" = "yes" ; then
5132    echo "CONFIG_GTK_GL=y" >> $config_host_mak
5133  fi
5134fi
5135if test "$gnutls" = "yes" ; then
5136  echo "CONFIG_GNUTLS=y" >> $config_host_mak
5137fi
5138if test "$gnutls_hash" = "yes" ; then
5139  echo "CONFIG_GNUTLS_HASH=y" >> $config_host_mak
5140fi
5141if test "$gnutls_rnd" = "yes" ; then
5142  echo "CONFIG_GNUTLS_RND=y" >> $config_host_mak
5143fi
5144if test "$gcrypt" = "yes" ; then
5145  echo "CONFIG_GCRYPT=y" >> $config_host_mak
5146  if test "$gcrypt_kdf" = "yes" ; then
5147    echo "CONFIG_GCRYPT_KDF=y" >> $config_host_mak
5148  fi
5149fi
5150if test "$nettle" = "yes" ; then
5151  echo "CONFIG_NETTLE=y" >> $config_host_mak
5152  echo "CONFIG_NETTLE_VERSION_MAJOR=${nettle_version%%.*}" >> $config_host_mak
5153  if test "$nettle_kdf" = "yes" ; then
5154    echo "CONFIG_NETTLE_KDF=y" >> $config_host_mak
5155  fi
5156fi
5157if test "$tasn1" = "yes" ; then
5158  echo "CONFIG_TASN1=y" >> $config_host_mak
5159fi
5160if test "$have_ifaddrs_h" = "yes" ; then
5161    echo "HAVE_IFADDRS_H=y" >> $config_host_mak
5162fi
5163if test "$vte" = "yes" ; then
5164  echo "CONFIG_VTE=y" >> $config_host_mak
5165  echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak
5166fi
5167if test "$virglrenderer" = "yes" ; then
5168  echo "CONFIG_VIRGL=y" >> $config_host_mak
5169  echo "VIRGL_CFLAGS=$virgl_cflags" >> $config_host_mak
5170  echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak
5171fi
5172if test "$xen" = "yes" ; then
5173  echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
5174  echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
5175  if test "$xen_pv_domain_build" = "yes" ; then
5176    echo "CONFIG_XEN_PV_DOMAIN_BUILD=y" >> $config_host_mak
5177  fi
5178fi
5179if test "$linux_aio" = "yes" ; then
5180  echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
5181fi
5182if test "$attr" = "yes" ; then
5183  echo "CONFIG_ATTR=y" >> $config_host_mak
5184fi
5185if test "$libattr" = "yes" ; then
5186  echo "CONFIG_LIBATTR=y" >> $config_host_mak
5187fi
5188if test "$virtfs" = "yes" ; then
5189  echo "CONFIG_VIRTFS=y" >> $config_host_mak
5190fi
5191if test "$vhost_scsi" = "yes" ; then
5192  echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
5193fi
5194if test "$vhost_net" = "yes" ; then
5195  echo "CONFIG_VHOST_NET_USED=y" >> $config_host_mak
5196fi
5197if test "$blobs" = "yes" ; then
5198  echo "INSTALL_BLOBS=yes" >> $config_host_mak
5199fi
5200if test "$iovec" = "yes" ; then
5201  echo "CONFIG_IOVEC=y" >> $config_host_mak
5202fi
5203if test "$preadv" = "yes" ; then
5204  echo "CONFIG_PREADV=y" >> $config_host_mak
5205fi
5206if test "$fdt" = "yes" ; then
5207  echo "CONFIG_FDT=y" >> $config_host_mak
5208fi
5209if test "$signalfd" = "yes" ; then
5210  echo "CONFIG_SIGNALFD=y" >> $config_host_mak
5211fi
5212if test "$tcg_interpreter" = "yes" ; then
5213  echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
5214fi
5215if test "$fdatasync" = "yes" ; then
5216  echo "CONFIG_FDATASYNC=y" >> $config_host_mak
5217fi
5218if test "$madvise" = "yes" ; then
5219  echo "CONFIG_MADVISE=y" >> $config_host_mak
5220fi
5221if test "$posix_madvise" = "yes" ; then
5222  echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak
5223fi
5224if test "$sigev_thread_id" = "yes" ; then
5225  echo "CONFIG_SIGEV_THREAD_ID=y" >> $config_host_mak
5226fi
5227
5228if test "$spice" = "yes" ; then
5229  echo "CONFIG_SPICE=y" >> $config_host_mak
5230fi
5231
5232if test "$smartcard" = "yes" ; then
5233  echo "CONFIG_SMARTCARD=y" >> $config_host_mak
5234fi
5235
5236if test "$libusb" = "yes" ; then
5237  echo "CONFIG_USB_LIBUSB=y" >> $config_host_mak
5238fi
5239
5240if test "$usb_redir" = "yes" ; then
5241  echo "CONFIG_USB_REDIR=y" >> $config_host_mak
5242fi
5243
5244if test "$opengl" = "yes" ; then
5245  echo "CONFIG_OPENGL=y" >> $config_host_mak
5246  echo "OPENGL_CFLAGS=$opengl_cflags" >> $config_host_mak
5247  echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
5248  if test "$opengl_dmabuf" = "yes" ; then
5249    echo "CONFIG_OPENGL_DMABUF=y" >> $config_host_mak
5250  fi
5251fi
5252
5253if test "$avx2_opt" = "yes" ; then
5254  echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
5255fi
5256
5257if test "$lzo" = "yes" ; then
5258  echo "CONFIG_LZO=y" >> $config_host_mak
5259fi
5260
5261if test "$snappy" = "yes" ; then
5262  echo "CONFIG_SNAPPY=y" >> $config_host_mak
5263fi
5264
5265if test "$bzip2" = "yes" ; then
5266  echo "CONFIG_BZIP2=y" >> $config_host_mak
5267  echo "BZIP2_LIBS=-lbz2" >> $config_host_mak
5268fi
5269
5270if test "$libiscsi" = "yes" ; then
5271  echo "CONFIG_LIBISCSI=m" >> $config_host_mak
5272  echo "LIBISCSI_CFLAGS=$libiscsi_cflags" >> $config_host_mak
5273  echo "LIBISCSI_LIBS=$libiscsi_libs" >> $config_host_mak
5274fi
5275
5276if test "$libnfs" = "yes" ; then
5277  echo "CONFIG_LIBNFS=y" >> $config_host_mak
5278fi
5279
5280if test "$seccomp" = "yes"; then
5281  echo "CONFIG_SECCOMP=y" >> $config_host_mak
5282fi
5283
5284# XXX: suppress that
5285if [ "$bsd" = "yes" ] ; then
5286  echo "CONFIG_BSD=y" >> $config_host_mak
5287fi
5288
5289if test "$zero_malloc" = "yes" ; then
5290  echo "CONFIG_ZERO_MALLOC=y" >> $config_host_mak
5291fi
5292if test "$localtime_r" = "yes" ; then
5293  echo "CONFIG_LOCALTIME_R=y" >> $config_host_mak
5294fi
5295if test "$qom_cast_debug" = "yes" ; then
5296  echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
5297fi
5298if test "$rbd" = "yes" ; then
5299  echo "CONFIG_RBD=m" >> $config_host_mak
5300  echo "RBD_CFLAGS=$rbd_cflags" >> $config_host_mak
5301  echo "RBD_LIBS=$rbd_libs" >> $config_host_mak
5302fi
5303
5304echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
5305if test "$coroutine_pool" = "yes" ; then
5306  echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
5307else
5308  echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
5309fi
5310
5311if test "$open_by_handle_at" = "yes" ; then
5312  echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
5313fi
5314
5315if test "$linux_magic_h" = "yes" ; then
5316  echo "CONFIG_LINUX_MAGIC_H=y" >> $config_host_mak
5317fi
5318
5319if test "$pragma_diagnostic_available" = "yes" ; then
5320  echo "CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE=y" >> $config_host_mak
5321fi
5322
5323if test "$valgrind_h" = "yes" ; then
5324  echo "CONFIG_VALGRIND_H=y" >> $config_host_mak
5325fi
5326
5327if test "$has_environ" = "yes" ; then
5328  echo "CONFIG_HAS_ENVIRON=y" >> $config_host_mak
5329fi
5330
5331if test "$cpuid_h" = "yes" ; then
5332  echo "CONFIG_CPUID_H=y" >> $config_host_mak
5333fi
5334
5335if test "$int128" = "yes" ; then
5336  echo "CONFIG_INT128=y" >> $config_host_mak
5337fi
5338
5339if test "$getauxval" = "yes" ; then
5340  echo "CONFIG_GETAUXVAL=y" >> $config_host_mak
5341fi
5342
5343if test "$glusterfs" = "yes" ; then
5344  echo "CONFIG_GLUSTERFS=m" >> $config_host_mak
5345  echo "GLUSTERFS_CFLAGS=$glusterfs_cflags" >> $config_host_mak
5346  echo "GLUSTERFS_LIBS=$glusterfs_libs" >> $config_host_mak
5347fi
5348
5349if test "$glusterfs_xlator_opt" = "yes" ; then
5350  echo "CONFIG_GLUSTERFS_XLATOR_OPT=y" >> $config_host_mak
5351fi
5352
5353if test "$glusterfs_discard" = "yes" ; then
5354  echo "CONFIG_GLUSTERFS_DISCARD=y" >> $config_host_mak
5355fi
5356
5357if test "$glusterfs_zerofill" = "yes" ; then
5358  echo "CONFIG_GLUSTERFS_ZEROFILL=y" >> $config_host_mak
5359fi
5360
5361if test "$archipelago" = "yes" ; then
5362  echo "CONFIG_ARCHIPELAGO=m" >> $config_host_mak
5363  echo "ARCHIPELAGO_LIBS=$archipelago_libs" >> $config_host_mak
5364fi
5365
5366if test "$libssh2" = "yes" ; then
5367  echo "CONFIG_LIBSSH2=m" >> $config_host_mak
5368  echo "LIBSSH2_CFLAGS=$libssh2_cflags" >> $config_host_mak
5369  echo "LIBSSH2_LIBS=$libssh2_libs" >> $config_host_mak
5370fi
5371
5372if test "$vhdx" = "yes" ; then
5373  echo "CONFIG_VHDX=y" >> $config_host_mak
5374fi
5375
5376# USB host support
5377if test "$libusb" = "yes"; then
5378  echo "HOST_USB=libusb legacy" >> $config_host_mak
5379else
5380  echo "HOST_USB=stub" >> $config_host_mak
5381fi
5382
5383# TPM passthrough support?
5384if test "$tpm" = "yes"; then
5385  echo 'CONFIG_TPM=$(CONFIG_SOFTMMU)' >> $config_host_mak
5386  if test "$tpm_passthrough" = "yes"; then
5387    echo "CONFIG_TPM_PASSTHROUGH=y" >> $config_host_mak
5388  fi
5389fi
5390
5391echo "TRACE_BACKENDS=$trace_backends" >> $config_host_mak
5392if have_backend "nop"; then
5393  echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
5394fi
5395if have_backend "simple"; then
5396  echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
5397  # Set the appropriate trace file.
5398  trace_file="\"$trace_file-\" FMT_pid"
5399fi
5400if have_backend "log"; then
5401  echo "CONFIG_TRACE_LOG=y" >> $config_host_mak
5402fi
5403if have_backend "ust"; then
5404  echo "CONFIG_TRACE_UST=y" >> $config_host_mak
5405fi
5406if have_backend "dtrace"; then
5407  echo "CONFIG_TRACE_DTRACE=y" >> $config_host_mak
5408  if test "$trace_backend_stap" = "yes" ; then
5409    echo "CONFIG_TRACE_SYSTEMTAP=y" >> $config_host_mak
5410  fi
5411fi
5412if have_backend "ftrace"; then
5413  if test "$linux" = "yes" ; then
5414    echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak
5415  else
5416    feature_not_found "ftrace(trace backend)" "ftrace requires Linux"
5417  fi
5418fi
5419echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
5420
5421if test "$rdma" = "yes" ; then
5422  echo "CONFIG_RDMA=y" >> $config_host_mak
5423fi
5424
5425# Hold two types of flag:
5426#   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
5427#                                     a thread we have a handle to
5428#   CONFIG_PTHREAD_SETNAME_NP       - A way of doing it on a particular
5429#                                     platform
5430if test "$pthread_setname_np" = "yes" ; then
5431  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
5432  echo "CONFIG_PTHREAD_SETNAME_NP=y" >> $config_host_mak
5433fi
5434
5435if test "$tcg_interpreter" = "yes"; then
5436  QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/tci $QEMU_INCLUDES"
5437elif test "$ARCH" = "sparc64" ; then
5438  QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/sparc $QEMU_INCLUDES"
5439elif test "$ARCH" = "s390x" ; then
5440  QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/s390 $QEMU_INCLUDES"
5441elif test "$ARCH" = "x86_64" -o "$ARCH" = "x32" ; then
5442  QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/i386 $QEMU_INCLUDES"
5443elif test "$ARCH" = "ppc64" ; then
5444  QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/ppc $QEMU_INCLUDES"
5445else
5446  QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/\$(ARCH) $QEMU_INCLUDES"
5447fi
5448QEMU_INCLUDES="-I\$(SRC_PATH)/tcg $QEMU_INCLUDES"
5449
5450echo "TOOLS=$tools" >> $config_host_mak
5451echo "ROMS=$roms" >> $config_host_mak
5452echo "MAKE=$make" >> $config_host_mak
5453echo "INSTALL=$install" >> $config_host_mak
5454echo "INSTALL_DIR=$install -d -m 0755" >> $config_host_mak
5455echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
5456echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
5457echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
5458echo "PYTHON=$python" >> $config_host_mak
5459echo "CC=$cc" >> $config_host_mak
5460if $iasl -h > /dev/null 2>&1; then
5461  echo "IASL=$iasl" >> $config_host_mak
5462fi
5463echo "CC_I386=$cc_i386" >> $config_host_mak
5464echo "HOST_CC=$host_cc" >> $config_host_mak
5465echo "CXX=$cxx" >> $config_host_mak
5466echo "OBJCC=$objcc" >> $config_host_mak
5467echo "AR=$ar" >> $config_host_mak
5468echo "ARFLAGS=$ARFLAGS" >> $config_host_mak
5469echo "AS=$as" >> $config_host_mak
5470echo "CPP=$cpp" >> $config_host_mak
5471echo "OBJCOPY=$objcopy" >> $config_host_mak
5472echo "LD=$ld" >> $config_host_mak
5473echo "NM=$nm" >> $config_host_mak
5474echo "WINDRES=$windres" >> $config_host_mak
5475echo "CFLAGS=$CFLAGS" >> $config_host_mak
5476echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
5477echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
5478echo "QEMU_INCLUDES=$QEMU_INCLUDES" >> $config_host_mak
5479if test "$sparse" = "yes" ; then
5480  echo "CC           := REAL_CC=\"\$(CC)\" cgcc"       >> $config_host_mak
5481  echo "CPP          := REAL_CC=\"\$(CPP)\" cgcc"      >> $config_host_mak
5482  echo "CXX          := REAL_CC=\"\$(CXX)\" cgcc"      >> $config_host_mak
5483  echo "HOST_CC      := REAL_CC=\"\$(HOST_CC)\" cgcc"  >> $config_host_mak
5484  echo "QEMU_CFLAGS  += -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-non-pointer-null" >> $config_host_mak
5485fi
5486if test "$cross_prefix" != ""; then
5487  echo "AUTOCONF_HOST := --host=${cross_prefix%-}"     >> $config_host_mak
5488else
5489  echo "AUTOCONF_HOST := "                             >> $config_host_mak
5490fi
5491echo "LDFLAGS=$LDFLAGS" >> $config_host_mak
5492echo "LDFLAGS_NOPIE=$LDFLAGS_NOPIE" >> $config_host_mak
5493echo "LIBS+=$LIBS" >> $config_host_mak
5494echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak
5495echo "EXESUF=$EXESUF" >> $config_host_mak
5496echo "DSOSUF=$DSOSUF" >> $config_host_mak
5497echo "LDFLAGS_SHARED=$LDFLAGS_SHARED" >> $config_host_mak
5498echo "LIBS_QGA+=$libs_qga" >> $config_host_mak
5499echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak
5500echo "TASN1_CFLAGS=$tasn1_cflags" >> $config_host_mak
5501echo "POD2MAN=$POD2MAN" >> $config_host_mak
5502echo "TRANSLATE_OPT_CFLAGS=$TRANSLATE_OPT_CFLAGS" >> $config_host_mak
5503if test "$gcov" = "yes" ; then
5504  echo "CONFIG_GCOV=y" >> $config_host_mak
5505  echo "GCOV=$gcov_tool" >> $config_host_mak
5506fi
5507
5508# use included Linux headers
5509if test "$linux" = "yes" ; then
5510  mkdir -p linux-headers
5511  case "$cpu" in
5512  i386|x86_64|x32)
5513    linux_arch=x86
5514    ;;
5515  ppcemb|ppc|ppc64)
5516    linux_arch=powerpc
5517    ;;
5518  s390x)
5519    linux_arch=s390
5520    ;;
5521  aarch64)
5522    linux_arch=arm64
5523    ;;
5524  mips64)
5525    linux_arch=mips
5526    ;;
5527  *)
5528    # For most CPUs the kernel architecture name and QEMU CPU name match.
5529    linux_arch="$cpu"
5530    ;;
5531  esac
5532    # For non-KVM architectures we will not have asm headers
5533    if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
5534      symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
5535    fi
5536fi
5537
5538for target in $target_list; do
5539target_dir="$target"
5540config_target_mak=$target_dir/config-target.mak
5541target_name=`echo $target | cut -d '-' -f 1`
5542target_bigendian="no"
5543
5544case "$target_name" in
5545  armeb|lm32|m68k|microblaze|mips|mipsn32|mips64|moxie|or32|ppc|ppcemb|ppc64|ppc64abi32|s390x|sh4eb|sparc|sparc64|sparc32plus|xtensaeb)
5546  target_bigendian=yes
5547  ;;
5548esac
5549target_softmmu="no"
5550target_user_only="no"
5551target_linux_user="no"
5552target_bsd_user="no"
5553case "$target" in
5554  ${target_name}-softmmu)
5555    target_softmmu="yes"
5556    ;;
5557  ${target_name}-linux-user)
5558    if test "$linux" != "yes" ; then
5559      error_exit "Target '$target' is only available on a Linux host"
5560    fi
5561    target_user_only="yes"
5562    target_linux_user="yes"
5563    ;;
5564  ${target_name}-bsd-user)
5565    if test "$bsd" != "yes" ; then
5566      error_exit "Target '$target' is only available on a BSD host"
5567    fi
5568    target_user_only="yes"
5569    target_bsd_user="yes"
5570    ;;
5571  *)
5572    error_exit "Target '$target' not recognised"
5573    exit 1
5574    ;;
5575esac
5576
5577mkdir -p $target_dir
5578echo "# Automatically generated by configure - do not modify" > $config_target_mak
5579
5580bflt="no"
5581interp_prefix1=`echo "$interp_prefix" | sed "s/%M/$target_name/g"`
5582gdb_xml_files=""
5583
5584TARGET_ARCH="$target_name"
5585TARGET_BASE_ARCH=""
5586TARGET_ABI_DIR=""
5587
5588case "$target_name" in
5589  i386)
5590  ;;
5591  x86_64)
5592    TARGET_BASE_ARCH=i386
5593  ;;
5594  alpha)
5595  ;;
5596  arm|armeb)
5597    TARGET_ARCH=arm
5598    bflt="yes"
5599    gdb_xml_files="arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"
5600  ;;
5601  aarch64)
5602    TARGET_BASE_ARCH=arm
5603    bflt="yes"
5604    gdb_xml_files="aarch64-core.xml aarch64-fpu.xml arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"
5605  ;;
5606  cris)
5607  ;;
5608  lm32)
5609  ;;
5610  m68k)
5611    bflt="yes"
5612    gdb_xml_files="cf-core.xml cf-fp.xml"
5613  ;;
5614  microblaze|microblazeel)
5615    TARGET_ARCH=microblaze
5616    bflt="yes"
5617  ;;
5618  mips|mipsel)
5619    TARGET_ARCH=mips
5620    echo "TARGET_ABI_MIPSO32=y" >> $config_target_mak
5621  ;;
5622  mipsn32|mipsn32el)
5623    TARGET_ARCH=mips64
5624    TARGET_BASE_ARCH=mips
5625    echo "TARGET_ABI_MIPSN32=y" >> $config_target_mak
5626    echo "TARGET_ABI32=y" >> $config_target_mak
5627  ;;
5628  mips64|mips64el)
5629    TARGET_ARCH=mips64
5630    TARGET_BASE_ARCH=mips
5631    echo "TARGET_ABI_MIPSN64=y" >> $config_target_mak
5632  ;;
5633  moxie)
5634  ;;
5635  or32)
5636    TARGET_ARCH=openrisc
5637    TARGET_BASE_ARCH=openrisc
5638  ;;
5639  ppc)
5640    gdb_xml_files="power-core.xml power-fpu.xml power-altivec.xml power-spe.xml"
5641  ;;
5642  ppcemb)
5643    TARGET_BASE_ARCH=ppc
5644    TARGET_ABI_DIR=ppc
5645    gdb_xml_files="power-core.xml power-fpu.xml power-altivec.xml power-spe.xml"
5646  ;;
5647  ppc64)
5648    TARGET_BASE_ARCH=ppc
5649    TARGET_ABI_DIR=ppc
5650    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
5651  ;;
5652  ppc64le)
5653    TARGET_ARCH=ppc64
5654    TARGET_BASE_ARCH=ppc
5655    TARGET_ABI_DIR=ppc
5656    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
5657  ;;
5658  ppc64abi32)
5659    TARGET_ARCH=ppc64
5660    TARGET_BASE_ARCH=ppc
5661    TARGET_ABI_DIR=ppc
5662    echo "TARGET_ABI32=y" >> $config_target_mak
5663    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
5664  ;;
5665  sh4|sh4eb)
5666    TARGET_ARCH=sh4
5667    bflt="yes"
5668  ;;
5669  sparc)
5670  ;;
5671  sparc64)
5672    TARGET_BASE_ARCH=sparc
5673  ;;
5674  sparc32plus)
5675    TARGET_ARCH=sparc64
5676    TARGET_BASE_ARCH=sparc
5677    TARGET_ABI_DIR=sparc
5678    echo "TARGET_ABI32=y" >> $config_target_mak
5679  ;;
5680  s390x)
5681    gdb_xml_files="s390x-core64.xml s390-acr.xml s390-fpr.xml s390-vx.xml s390-cr.xml s390-virt.xml"
5682  ;;
5683  tilegx)
5684  ;;
5685  tricore)
5686  ;;
5687  unicore32)
5688  ;;
5689  xtensa|xtensaeb)
5690    TARGET_ARCH=xtensa
5691  ;;
5692  *)
5693    error_exit "Unsupported target CPU"
5694  ;;
5695esac
5696# TARGET_BASE_ARCH needs to be defined after TARGET_ARCH
5697if [ "$TARGET_BASE_ARCH" = "" ]; then
5698  TARGET_BASE_ARCH=$TARGET_ARCH
5699fi
5700
5701symlink "$source_path/Makefile.target" "$target_dir/Makefile"
5702
5703upper() {
5704    echo "$@"| LC_ALL=C tr '[a-z]' '[A-Z]'
5705}
5706
5707target_arch_name="`upper $TARGET_ARCH`"
5708echo "TARGET_$target_arch_name=y" >> $config_target_mak
5709echo "TARGET_NAME=$target_name" >> $config_target_mak
5710echo "TARGET_BASE_ARCH=$TARGET_BASE_ARCH" >> $config_target_mak
5711if [ "$TARGET_ABI_DIR" = "" ]; then
5712  TARGET_ABI_DIR=$TARGET_ARCH
5713fi
5714echo "TARGET_ABI_DIR=$TARGET_ABI_DIR" >> $config_target_mak
5715if [ "$HOST_VARIANT_DIR" != "" ]; then
5716    echo "HOST_VARIANT_DIR=$HOST_VARIANT_DIR" >> $config_target_mak
5717fi
5718case "$target_name" in
5719  i386|x86_64)
5720    if test "$xen" = "yes" -a "$target_softmmu" = "yes" ; then
5721      echo "CONFIG_XEN=y" >> $config_target_mak
5722      if test "$xen_pci_passthrough" = yes; then
5723        echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak"
5724      fi
5725    fi
5726    ;;
5727  *)
5728esac
5729case "$target_name" in
5730  aarch64|arm|i386|x86_64|ppcemb|ppc|ppc64|s390x|mipsel|mips)
5731    # Make sure the target and host cpus are compatible
5732    if test "$kvm" = "yes" -a "$target_softmmu" = "yes" -a \
5733      \( "$target_name" = "$cpu" -o \
5734      \( "$target_name" = "ppcemb" -a "$cpu" = "ppc" \) -o \
5735      \( "$target_name" = "ppc64"  -a "$cpu" = "ppc" \) -o \
5736      \( "$target_name" = "ppc"    -a "$cpu" = "ppc64" \) -o \
5737      \( "$target_name" = "ppcemb" -a "$cpu" = "ppc64" \) -o \
5738      \( "$target_name" = "mipsel" -a "$cpu" = "mips" \) -o \
5739      \( "$target_name" = "x86_64" -a "$cpu" = "i386"   \) -o \
5740      \( "$target_name" = "i386"   -a "$cpu" = "x86_64" \) -o \
5741      \( "$target_name" = "x86_64" -a "$cpu" = "x32"   \) -o \
5742      \( "$target_name" = "i386"   -a "$cpu" = "x32" \) \) ; then
5743      echo "CONFIG_KVM=y" >> $config_target_mak
5744      if test "$vhost_net" = "yes" ; then
5745        echo "CONFIG_VHOST_NET=y" >> $config_target_mak
5746        echo "CONFIG_VHOST_NET_TEST_$target_name=y" >> $config_host_mak
5747      fi
5748    fi
5749esac
5750if test "$target_bigendian" = "yes" ; then
5751  echo "TARGET_WORDS_BIGENDIAN=y" >> $config_target_mak
5752fi
5753if test "$target_softmmu" = "yes" ; then
5754  echo "CONFIG_SOFTMMU=y" >> $config_target_mak
5755fi
5756if test "$target_user_only" = "yes" ; then
5757  echo "CONFIG_USER_ONLY=y" >> $config_target_mak
5758  echo "CONFIG_QEMU_INTERP_PREFIX=\"$interp_prefix1\"" >> $config_target_mak
5759fi
5760if test "$target_linux_user" = "yes" ; then
5761  echo "CONFIG_LINUX_USER=y" >> $config_target_mak
5762fi
5763list=""
5764if test ! -z "$gdb_xml_files" ; then
5765  for x in $gdb_xml_files; do
5766    list="$list $source_path/gdb-xml/$x"
5767  done
5768  echo "TARGET_XML_FILES=$list" >> $config_target_mak
5769fi
5770
5771if test "$target_user_only" = "yes" -a "$bflt" = "yes"; then
5772  echo "TARGET_HAS_BFLT=y" >> $config_target_mak
5773fi
5774if test "$target_bsd_user" = "yes" ; then
5775  echo "CONFIG_BSD_USER=y" >> $config_target_mak
5776fi
5777
5778# generate QEMU_CFLAGS/LDFLAGS for targets
5779
5780cflags=""
5781ldflags=""
5782
5783disas_config() {
5784  echo "CONFIG_${1}_DIS=y" >> $config_target_mak
5785  echo "CONFIG_${1}_DIS=y" >> config-all-disas.mak
5786}
5787
5788for i in $ARCH $TARGET_BASE_ARCH ; do
5789  case "$i" in
5790  alpha)
5791    disas_config "ALPHA"
5792  ;;
5793  aarch64)
5794    if test -n "${cxx}"; then
5795      disas_config "ARM_A64"
5796    fi
5797  ;;
5798  arm)
5799    disas_config "ARM"
5800    if test -n "${cxx}"; then
5801      disas_config "ARM_A64"
5802    fi
5803  ;;
5804  cris)
5805    disas_config "CRIS"
5806  ;;
5807  hppa)
5808    disas_config "HPPA"
5809  ;;
5810  i386|x86_64|x32)
5811    disas_config "I386"
5812  ;;
5813  ia64*)
5814    disas_config "IA64"
5815  ;;
5816  lm32)
5817    disas_config "LM32"
5818  ;;
5819  m68k)
5820    disas_config "M68K"
5821  ;;
5822  microblaze*)
5823    disas_config "MICROBLAZE"
5824  ;;
5825  mips*)
5826    disas_config "MIPS"
5827  ;;
5828  moxie*)
5829    disas_config "MOXIE"
5830  ;;
5831  or32)
5832    disas_config "OPENRISC"
5833  ;;
5834  ppc*)
5835    disas_config "PPC"
5836  ;;
5837  s390*)
5838    disas_config "S390"
5839  ;;
5840  sh4)
5841    disas_config "SH4"
5842  ;;
5843  sparc*)
5844    disas_config "SPARC"
5845  ;;
5846  xtensa*)
5847    disas_config "XTENSA"
5848  ;;
5849  esac
5850done
5851if test "$tcg_interpreter" = "yes" ; then
5852  disas_config "TCI"
5853fi
5854
5855case "$ARCH" in
5856alpha)
5857  # Ensure there's only a single GP
5858  cflags="-msmall-data $cflags"
5859;;
5860esac
5861
5862if test "$gprof" = "yes" ; then
5863  echo "TARGET_GPROF=yes" >> $config_target_mak
5864  if test "$target_linux_user" = "yes" ; then
5865    cflags="-p $cflags"
5866    ldflags="-p $ldflags"
5867  fi
5868  if test "$target_softmmu" = "yes" ; then
5869    ldflags="-p $ldflags"
5870    echo "GPROF_CFLAGS=-p" >> $config_target_mak
5871  fi
5872fi
5873
5874if test "$target_linux_user" = "yes" -o "$target_bsd_user" = "yes" ; then
5875  ldflags="$ldflags $textseg_ldflags"
5876fi
5877
5878echo "LDFLAGS+=$ldflags" >> $config_target_mak
5879echo "QEMU_CFLAGS+=$cflags" >> $config_target_mak
5880
5881done # for target in $targets
5882
5883if [ "$pixman" = "internal" ]; then
5884  echo "config-host.h: subdir-pixman" >> $config_host_mak
5885fi
5886
5887if [ "$dtc_internal" = "yes" ]; then
5888  echo "config-host.h: subdir-dtc" >> $config_host_mak
5889fi
5890
5891if test "$numa" = "yes"; then
5892  echo "CONFIG_NUMA=y" >> $config_host_mak
5893fi
5894
5895if test "$ccache_cpp2" = "yes"; then
5896  echo "export CCACHE_CPP2=y" >> $config_host_mak
5897fi
5898
5899# build tree in object directory in case the source is not in the current directory
5900DIRS="tests tests/tcg tests/tcg/cris tests/tcg/lm32 tests/libqos tests/qapi-schema tests/tcg/xtensa tests/qemu-iotests"
5901DIRS="$DIRS fsdev"
5902DIRS="$DIRS pc-bios/optionrom pc-bios/spapr-rtas pc-bios/s390-ccw"
5903DIRS="$DIRS roms/seabios roms/vgabios"
5904DIRS="$DIRS qapi-generated"
5905FILES="Makefile tests/tcg/Makefile qdict-test-data.txt"
5906FILES="$FILES tests/tcg/cris/Makefile tests/tcg/cris/.gdbinit"
5907FILES="$FILES tests/tcg/lm32/Makefile tests/tcg/xtensa/Makefile po/Makefile"
5908FILES="$FILES pc-bios/optionrom/Makefile pc-bios/keymaps"
5909FILES="$FILES pc-bios/spapr-rtas/Makefile"
5910FILES="$FILES pc-bios/s390-ccw/Makefile"
5911FILES="$FILES roms/seabios/Makefile roms/vgabios/Makefile"
5912FILES="$FILES pc-bios/qemu-icon.bmp"
5913for bios_file in \
5914    $source_path/pc-bios/*.bin \
5915    $source_path/pc-bios/*.aml \
5916    $source_path/pc-bios/*.rom \
5917    $source_path/pc-bios/*.dtb \
5918    $source_path/pc-bios/*.img \
5919    $source_path/pc-bios/openbios-* \
5920    $source_path/pc-bios/u-boot.* \
5921    $source_path/pc-bios/palcode-*
5922do
5923    FILES="$FILES pc-bios/`basename $bios_file`"
5924done
5925for test_file in `find $source_path/tests/acpi-test-data -type f`
5926do
5927    FILES="$FILES tests/acpi-test-data`echo $test_file | sed -e 's/.*acpi-test-data//'`"
5928done
5929mkdir -p $DIRS
5930for f in $FILES ; do
5931    if [ -e "$source_path/$f" ] && [ "$pwd_is_source_path" != "y" ]; then
5932        symlink "$source_path/$f" "$f"
5933    fi
5934done
5935
5936# temporary config to build submodules
5937for rom in seabios vgabios ; do
5938    config_mak=roms/$rom/config.mak
5939    echo "# Automatically generated by configure - do not modify" > $config_mak
5940    echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
5941    echo "AS=$as" >> $config_mak
5942    echo "CC=$cc" >> $config_mak
5943    echo "BCC=bcc" >> $config_mak
5944    echo "CPP=$cpp" >> $config_mak
5945    echo "OBJCOPY=objcopy" >> $config_mak
5946    echo "IASL=$iasl" >> $config_mak
5947    echo "LD=$ld" >> $config_mak
5948done
5949
5950# set up qemu-iotests in this build directory
5951iotests_common_env="tests/qemu-iotests/common.env"
5952iotests_check="tests/qemu-iotests/check"
5953
5954echo "# Automatically generated by configure - do not modify" > "$iotests_common_env"
5955echo >> "$iotests_common_env"
5956echo "export PYTHON='$python'" >> "$iotests_common_env"
5957
5958if [ ! -e "$iotests_check" ]; then
5959    symlink "$source_path/$iotests_check" "$iotests_check"
5960fi
5961
5962# Save the configure command line for later reuse.
5963cat <<EOD >config.status
5964#!/bin/sh
5965# Generated by configure.
5966# Run this file to recreate the current configuration.
5967# Compiler output produced by configure, useful for debugging
5968# configure, is in config.log if it exists.
5969EOD
5970printf "exec" >>config.status
5971printf " '%s'" "$0" "$@" >>config.status
5972echo ' "$@"' >>config.status
5973chmod +x config.status
5974
5975rm -r "$TMPDIR1"
5976