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