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