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