xref: /openbmc/qemu/configure (revision d436d4e7a50a7c4fddc0569c2107fe5eaf0e1fbc)
1#!/bin/sh
2#
3# qemu configure script (c) 2003 Fabrice Bellard
4#
5
6# Unset some variables known to interfere with behavior of common tools,
7# just as autoconf does.
8CLICOLOR_FORCE= GREP_OPTIONS=
9unset CLICOLOR_FORCE GREP_OPTIONS
10
11# Don't allow CCACHE, if present, to use cached results of compile tests!
12export CCACHE_RECACHE=yes
13
14# Temporary directory used for files created while
15# configure runs. Since it is in the build directory
16# we can safely blow away any previous version of it
17# (and we need not jump through hoops to try to delete
18# it when configure exits.)
19TMPDIR1="config-temp"
20rm -rf "${TMPDIR1}"
21mkdir -p "${TMPDIR1}"
22if [ $? -ne 0 ]; then
23    echo "ERROR: failed to create temporary directory"
24    exit 1
25fi
26
27TMPB="qemu-conf"
28TMPC="${TMPDIR1}/${TMPB}.c"
29TMPO="${TMPDIR1}/${TMPB}.o"
30TMPCXX="${TMPDIR1}/${TMPB}.cxx"
31TMPE="${TMPDIR1}/${TMPB}.exe"
32TMPMO="${TMPDIR1}/${TMPB}.mo"
33
34rm -f config.log
35
36# Print a helpful header at the top of config.log
37echo "# QEMU configure log $(date)" >> config.log
38printf "# Configured with:" >> config.log
39printf " '%s'" "$0" "$@" >> config.log
40echo >> config.log
41echo "#" >> config.log
42
43print_error() {
44    (echo
45    echo "ERROR: $1"
46    while test -n "$2"; do
47        echo "       $2"
48        shift
49    done
50    echo) >&2
51}
52
53error_exit() {
54    print_error "$@"
55    exit 1
56}
57
58do_compiler() {
59    # Run the compiler, capturing its output to the log. First argument
60    # is compiler binary to execute.
61    local compiler="$1"
62    shift
63    if test -n "$BASH_VERSION"; then eval '
64        echo >>config.log "
65funcs: ${FUNCNAME[*]}
66lines: ${BASH_LINENO[*]}"
67    '; fi
68    echo $compiler "$@" >> config.log
69    $compiler "$@" >> config.log 2>&1 || return $?
70    # Test passed. If this is an --enable-werror build, rerun
71    # the test with -Werror and bail out if it fails. This
72    # makes warning-generating-errors in configure test code
73    # obvious to developers.
74    if test "$werror" != "yes"; then
75        return 0
76    fi
77    # Don't bother rerunning the compile if we were already using -Werror
78    case "$*" in
79        *-Werror*)
80           return 0
81        ;;
82    esac
83    echo $compiler -Werror "$@" >> config.log
84    $compiler -Werror "$@" >> config.log 2>&1 && return $?
85    error_exit "configure test passed without -Werror but failed with -Werror." \
86        "This is probably a bug in the configure script. The failing command" \
87        "will be at the bottom of config.log." \
88        "You can run configure with --disable-werror to bypass this check."
89}
90
91do_cc() {
92    do_compiler "$cc" "$@"
93}
94
95do_cxx() {
96    do_compiler "$cxx" "$@"
97}
98
99update_cxxflags() {
100    # Set QEMU_CXXFLAGS from QEMU_CFLAGS by filtering out those
101    # options which some versions of GCC's C++ compiler complain about
102    # because they only make sense for C programs.
103    QEMU_CXXFLAGS="$QEMU_CXXFLAGS -D__STDC_LIMIT_MACROS"
104
105    for arg in $QEMU_CFLAGS; do
106        case $arg in
107            -Wstrict-prototypes|-Wmissing-prototypes|-Wnested-externs|\
108            -Wold-style-declaration|-Wold-style-definition|-Wredundant-decls)
109                ;;
110            *)
111                QEMU_CXXFLAGS=${QEMU_CXXFLAGS:+$QEMU_CXXFLAGS }$arg
112                ;;
113        esac
114    done
115}
116
117compile_object() {
118  local_cflags="$1"
119  do_cc $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
120}
121
122compile_prog() {
123  local_cflags="$1"
124  local_ldflags="$2"
125  do_cc $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC $LDFLAGS $local_ldflags
126}
127
128# symbolically link $1 to $2.  Portable version of "ln -sf".
129symlink() {
130  rm -rf "$2"
131  mkdir -p "$(dirname "$2")"
132  ln -s "$1" "$2"
133}
134
135# check whether a command is available to this shell (may be either an
136# executable or a builtin)
137has() {
138    type "$1" >/dev/null 2>&1
139}
140
141# search for an executable in PATH
142path_of() {
143    local_command="$1"
144    local_ifs="$IFS"
145    local_dir=""
146
147    # pathname has a dir component?
148    if [ "${local_command#*/}" != "$local_command" ]; then
149        if [ -x "$local_command" ] && [ ! -d "$local_command" ]; then
150            echo "$local_command"
151            return 0
152        fi
153    fi
154    if [ -z "$local_command" ]; then
155        return 1
156    fi
157
158    IFS=:
159    for local_dir in $PATH; do
160        if [ -x "$local_dir/$local_command" ] && [ ! -d "$local_dir/$local_command" ]; then
161            echo "$local_dir/$local_command"
162            IFS="${local_ifs:-$(printf ' \t\n')}"
163            return 0
164        fi
165    done
166    # not found
167    IFS="${local_ifs:-$(printf ' \t\n')}"
168    return 1
169}
170
171have_backend () {
172    echo "$trace_backends" | grep "$1" >/dev/null
173}
174
175glob() {
176    eval test -z '"${1#'"$2"'}"'
177}
178
179supported_hax_target() {
180    test "$hax" = "yes" || return 1
181    glob "$1" "*-softmmu" || return 1
182    case "${1%-softmmu}" in
183        i386|x86_64)
184            return 0
185        ;;
186    esac
187    return 1
188}
189
190supported_kvm_target() {
191    test "$kvm" = "yes" || return 1
192    glob "$1" "*-softmmu" || return 1
193    case "${1%-softmmu}:$cpu" in
194        arm:arm | aarch64:aarch64 | \
195        i386:i386 | i386:x86_64 | i386:x32 | \
196        x86_64:i386 | x86_64:x86_64 | x86_64:x32 | \
197        mips:mips | mipsel:mips | \
198        ppc:ppc | ppc64:ppc | ppc:ppc64 | ppc64:ppc64 | \
199        s390x:s390x)
200            return 0
201        ;;
202    esac
203    return 1
204}
205
206supported_xen_target() {
207    test "$xen" = "yes" || return 1
208    glob "$1" "*-softmmu" || return 1
209    # Only i386 and x86_64 provide the xenpv machine.
210    case "${1%-softmmu}" in
211        i386|x86_64)
212            return 0
213        ;;
214    esac
215    return 1
216}
217
218supported_hvf_target() {
219    test "$hvf" = "yes" || return 1
220    glob "$1" "*-softmmu" || return 1
221    case "${1%-softmmu}" in
222        x86_64)
223            return 0
224        ;;
225    esac
226    return 1
227}
228
229supported_whpx_target() {
230    test "$whpx" = "yes" || return 1
231    glob "$1" "*-softmmu" || return 1
232    case "${1%-softmmu}" in
233        i386|x86_64)
234            return 0
235        ;;
236    esac
237    return 1
238}
239
240supported_target() {
241    case "$1" in
242        *-softmmu)
243            ;;
244        *-linux-user)
245            if test "$linux" != "yes"; then
246                print_error "Target '$target' is only available on a Linux host"
247                return 1
248            fi
249            ;;
250        *-bsd-user)
251            if test "$bsd" != "yes"; then
252                print_error "Target '$target' is only available on a BSD host"
253                return 1
254            fi
255            ;;
256        *)
257            print_error "Invalid target name '$target'"
258            return 1
259            ;;
260    esac
261    test "$tcg" = "yes" && return 0
262    supported_kvm_target "$1" && return 0
263    supported_xen_target "$1" && return 0
264    supported_hax_target "$1" && return 0
265    supported_hvf_target "$1" && return 0
266    supported_whpx_target "$1" && return 0
267    print_error "TCG disabled, but hardware accelerator not available for '$target'"
268    return 1
269}
270
271
272ld_has() {
273    $ld --help 2>/dev/null | grep ".$1" >/dev/null 2>&1
274}
275
276# default parameters
277source_path=$(dirname "$0")
278cpu=""
279iasl="iasl"
280interp_prefix="/usr/gnemul/qemu-%M"
281static="no"
282cross_prefix=""
283audio_drv_list=""
284block_drv_rw_whitelist=""
285block_drv_ro_whitelist=""
286host_cc="cc"
287libs_softmmu=""
288libs_tools=""
289audio_pt_int=""
290audio_win_int=""
291libs_qga=""
292debug_info="yes"
293stack_protector=""
294
295if test -e "$source_path/.git"
296then
297    git_update=yes
298    git_submodules="ui/keycodemapdb"
299    git_submodules="$git_submodules tests/fp/berkeley-testfloat-3"
300    git_submodules="$git_submodules tests/fp/berkeley-softfloat-3"
301else
302    git_update=no
303    git_submodules=""
304
305    if ! test -f "$source_path/ui/keycodemapdb/README"
306    then
307        echo
308        echo "ERROR: missing file $source_path/ui/keycodemapdb/README"
309        echo
310        echo "This is not a GIT checkout but module content appears to"
311        echo "be missing. Do not use 'git archive' or GitHub download links"
312        echo "to acquire QEMU source archives. Non-GIT builds are only"
313        echo "supported with source archives linked from:"
314        echo
315        echo "  https://www.qemu.org/download/"
316        echo
317        echo "Developers working with GIT can use scripts/archive-source.sh"
318        echo "if they need to create valid source archives."
319        echo
320        exit 1
321    fi
322fi
323git="git"
324
325# Don't accept a target_list environment variable.
326unset target_list
327
328# Default value for a variable defining feature "foo".
329#  * foo="no"  feature will only be used if --enable-foo arg is given
330#  * foo=""    feature will be searched for, and if found, will be used
331#              unless --disable-foo is given
332#  * foo="yes" this value will only be set by --enable-foo flag.
333#              feature will searched for,
334#              if not found, configure exits with error
335#
336# Always add --enable-foo and --disable-foo command line args.
337# Distributions want to ensure that several features are compiled in, and it
338# is impossible without a --enable-foo that exits if a feature is not found.
339
340bluez=""
341brlapi=""
342curl=""
343curses=""
344docs=""
345fdt=""
346netmap="no"
347sdl=""
348sdlabi=""
349virtfs=""
350mpath=""
351vnc="yes"
352sparse="no"
353vde=""
354vnc_sasl=""
355vnc_jpeg=""
356vnc_png=""
357xkbcommon=""
358xen=""
359xen_ctrl_version=""
360xen_pv_domain_build="no"
361xen_pci_passthrough=""
362linux_aio=""
363cap_ng=""
364attr=""
365libattr=""
366xfs=""
367tcg="yes"
368membarrier=""
369vhost_net="no"
370vhost_crypto="no"
371vhost_scsi="no"
372vhost_vsock="no"
373vhost_user=""
374kvm="no"
375hax="no"
376hvf="no"
377whpx="no"
378rdma=""
379pvrdma=""
380gprof="no"
381debug_tcg="no"
382debug="no"
383sanitizers="no"
384fortify_source=""
385strip_opt="yes"
386tcg_interpreter="no"
387bigendian="no"
388mingw32="no"
389gcov="no"
390gcov_tool="gcov"
391EXESUF=""
392DSOSUF=".so"
393LDFLAGS_SHARED="-shared"
394modules="no"
395prefix="/usr/local"
396mandir="\${prefix}/share/man"
397datadir="\${prefix}/share"
398firmwarepath="\${prefix}/share/qemu-firmware"
399qemu_docdir="\${prefix}/share/doc/qemu"
400bindir="\${prefix}/bin"
401libdir="\${prefix}/lib"
402libexecdir="\${prefix}/libexec"
403includedir="\${prefix}/include"
404sysconfdir="\${prefix}/etc"
405local_statedir="\${prefix}/var"
406confsuffix="/qemu"
407slirp="yes"
408oss_lib=""
409bsd="no"
410linux="no"
411solaris="no"
412profiler="no"
413cocoa="no"
414softmmu="yes"
415linux_user="no"
416bsd_user="no"
417blobs="yes"
418pkgversion=""
419pie=""
420qom_cast_debug="yes"
421trace_backends="log"
422trace_file="trace"
423spice=""
424rbd=""
425smartcard=""
426libusb=""
427usb_redir=""
428opengl=""
429opengl_dmabuf="no"
430cpuid_h="no"
431avx2_opt=""
432zlib="yes"
433capstone=""
434lzo=""
435snappy=""
436bzip2=""
437guest_agent=""
438guest_agent_with_vss="no"
439guest_agent_ntddscsi="no"
440guest_agent_msi=""
441vss_win32_sdk=""
442win_sdk="no"
443want_tools="yes"
444libiscsi=""
445libnfs=""
446coroutine=""
447coroutine_pool=""
448debug_stack_usage="no"
449crypto_afalg="no"
450seccomp=""
451glusterfs=""
452glusterfs_xlator_opt="no"
453glusterfs_discard="no"
454glusterfs_fallocate="no"
455glusterfs_zerofill="no"
456gtk=""
457gtk_gl="no"
458tls_priority="NORMAL"
459gnutls=""
460nettle=""
461gcrypt=""
462gcrypt_hmac="no"
463vte=""
464virglrenderer=""
465tpm="yes"
466libssh2=""
467live_block_migration="yes"
468numa=""
469tcmalloc="no"
470jemalloc="no"
471replication="yes"
472vxhs=""
473libxml2=""
474docker="no"
475debug_mutex="no"
476libpmem=""
477
478# cross compilers defaults, can be overridden with --cross-cc-ARCH
479cross_cc_aarch64="aarch64-linux-gnu-gcc"
480cross_cc_aarch64_be="$cross_cc_aarch64"
481cross_cc_cflags_aarch64_be="-mbig-endian"
482cross_cc_arm="arm-linux-gnueabihf-gcc"
483cross_cc_cflags_armeb="-mbig-endian"
484cross_cc_i386="i386-pc-linux-gnu-gcc"
485cross_cc_cflags_i386=""
486cross_cc_powerpc="powerpc-linux-gnu-gcc"
487cross_cc_powerpc="powerpc-linux-gnu-gcc"
488
489enabled_cross_compilers=""
490
491supported_cpu="no"
492supported_os="no"
493bogus_os="no"
494malloc_trim=""
495
496# parse CC options first
497for opt do
498  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
499  case "$opt" in
500  --cross-prefix=*) cross_prefix="$optarg"
501  ;;
502  --cc=*) CC="$optarg"
503  ;;
504  --cxx=*) CXX="$optarg"
505  ;;
506  --source-path=*) source_path="$optarg"
507  ;;
508  --cpu=*) cpu="$optarg"
509  ;;
510  --extra-cflags=*) QEMU_CFLAGS="$QEMU_CFLAGS $optarg"
511  ;;
512  --extra-cxxflags=*) QEMU_CXXFLAGS="$QEMU_CXXFLAGS $optarg"
513  ;;
514  --extra-ldflags=*) LDFLAGS="$LDFLAGS $optarg"
515                     EXTRA_LDFLAGS="$optarg"
516  ;;
517  --enable-debug-info) debug_info="yes"
518  ;;
519  --disable-debug-info) debug_info="no"
520  ;;
521  --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"
522  ;;
523  --cross-cc-cflags-*) cc_arch=${opt#--cross-cc-flags-}; cc_arch=${cc_arch%%=*}
524                      eval "cross_cc_cflags_${cc_arch}=\$optarg"
525  ;;
526  --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}
527                eval "cross_cc_${cc_arch}=\$optarg"
528  ;;
529  esac
530done
531# OS specific
532# Using uname is really, really broken.  Once we have the right set of checks
533# we can eliminate its usage altogether.
534
535# Preferred compiler:
536#  ${CC} (if set)
537#  ${cross_prefix}gcc (if cross-prefix specified)
538#  system compiler
539if test -z "${CC}${cross_prefix}"; then
540  cc="$host_cc"
541else
542  cc="${CC-${cross_prefix}gcc}"
543fi
544
545if test -z "${CXX}${cross_prefix}"; then
546  cxx="c++"
547else
548  cxx="${CXX-${cross_prefix}g++}"
549fi
550
551ar="${AR-${cross_prefix}ar}"
552as="${AS-${cross_prefix}as}"
553ccas="${CCAS-$cc}"
554cpp="${CPP-$cc -E}"
555objcopy="${OBJCOPY-${cross_prefix}objcopy}"
556ld="${LD-${cross_prefix}ld}"
557ranlib="${RANLIB-${cross_prefix}ranlib}"
558nm="${NM-${cross_prefix}nm}"
559strip="${STRIP-${cross_prefix}strip}"
560windres="${WINDRES-${cross_prefix}windres}"
561pkg_config_exe="${PKG_CONFIG-${cross_prefix}pkg-config}"
562query_pkg_config() {
563    "${pkg_config_exe}" ${QEMU_PKG_CONFIG_FLAGS} "$@"
564}
565pkg_config=query_pkg_config
566sdl_config="${SDL_CONFIG-${cross_prefix}sdl-config}"
567sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
568
569# If the user hasn't specified ARFLAGS, default to 'rv', just as make does.
570ARFLAGS="${ARFLAGS-rv}"
571
572# default flags for all hosts
573# We use -fwrapv to tell the compiler that we require a C dialect where
574# left shift of signed integers is well defined and has the expected
575# 2s-complement style results. (Both clang and gcc agree that it
576# provides these semantics.)
577QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv $QEMU_CFLAGS"
578QEMU_CFLAGS="-Wall -Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS"
579QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS"
580QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
581QEMU_INCLUDES="-iquote . -iquote \$(SRC_PATH) -iquote \$(SRC_PATH)/accel/tcg -iquote \$(SRC_PATH)/include"
582if test "$debug_info" = "yes"; then
583    CFLAGS="-g $CFLAGS"
584    LDFLAGS="-g $LDFLAGS"
585fi
586
587# make source path absolute
588source_path=$(cd "$source_path"; pwd)
589
590# running configure in the source tree?
591# we know that's the case if configure is there.
592if test -f "./configure"; then
593    pwd_is_source_path="y"
594else
595    pwd_is_source_path="n"
596fi
597
598check_define() {
599cat > $TMPC <<EOF
600#if !defined($1)
601#error $1 not defined
602#endif
603int main(void) { return 0; }
604EOF
605  compile_object
606}
607
608check_include() {
609cat > $TMPC <<EOF
610#include <$1>
611int main(void) { return 0; }
612EOF
613  compile_object
614}
615
616write_c_skeleton() {
617    cat > $TMPC <<EOF
618int main(void) { return 0; }
619EOF
620}
621
622if check_define __linux__ ; then
623  targetos="Linux"
624elif check_define _WIN32 ; then
625  targetos='MINGW32'
626elif check_define __OpenBSD__ ; then
627  targetos='OpenBSD'
628elif check_define __sun__ ; then
629  targetos='SunOS'
630elif check_define __HAIKU__ ; then
631  targetos='Haiku'
632elif check_define __FreeBSD__ ; then
633  targetos='FreeBSD'
634elif check_define __FreeBSD_kernel__ && check_define __GLIBC__; then
635  targetos='GNU/kFreeBSD'
636elif check_define __DragonFly__ ; then
637  targetos='DragonFly'
638elif check_define __NetBSD__; then
639  targetos='NetBSD'
640elif check_define __APPLE__; then
641  targetos='Darwin'
642else
643  # This is a fatal error, but don't report it yet, because we
644  # might be going to just print the --help text, or it might
645  # be the result of a missing compiler.
646  targetos='bogus'
647  bogus_os='yes'
648fi
649
650# Some host OSes need non-standard checks for which CPU to use.
651# Note that these checks are broken for cross-compilation: if you're
652# cross-compiling to one of these OSes then you'll need to specify
653# the correct CPU with the --cpu option.
654case $targetos in
655Darwin)
656  # on Leopard most of the system is 32-bit, so we have to ask the kernel if we can
657  # run 64-bit userspace code.
658  # If the user didn't specify a CPU explicitly and the kernel says this is
659  # 64 bit hw, then assume x86_64. Otherwise fall through to the usual detection code.
660  if test -z "$cpu" && test "$(sysctl -n hw.optional.x86_64)" = "1"; then
661    cpu="x86_64"
662  fi
663  ;;
664SunOS)
665  # $(uname -m) returns i86pc even on an x86_64 box, so default based on isainfo
666  if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then
667    cpu="x86_64"
668  fi
669esac
670
671if test ! -z "$cpu" ; then
672  # command line argument
673  :
674elif check_define __i386__ ; then
675  cpu="i386"
676elif check_define __x86_64__ ; then
677  if check_define __ILP32__ ; then
678    cpu="x32"
679  else
680    cpu="x86_64"
681  fi
682elif check_define __sparc__ ; then
683  if check_define __arch64__ ; then
684    cpu="sparc64"
685  else
686    cpu="sparc"
687  fi
688elif check_define _ARCH_PPC ; then
689  if check_define _ARCH_PPC64 ; then
690    cpu="ppc64"
691  else
692    cpu="ppc"
693  fi
694elif check_define __mips__ ; then
695  cpu="mips"
696elif check_define __s390__ ; then
697  if check_define __s390x__ ; then
698    cpu="s390x"
699  else
700    cpu="s390"
701  fi
702elif check_define __arm__ ; then
703  cpu="arm"
704elif check_define __aarch64__ ; then
705  cpu="aarch64"
706else
707  cpu=$(uname -m)
708fi
709
710ARCH=
711# Normalise host CPU name and set ARCH.
712# Note that this case should only have supported host CPUs, not guests.
713case "$cpu" in
714  ppc|ppc64|s390|s390x|sparc64|x32)
715    cpu="$cpu"
716    supported_cpu="yes"
717    eval "cross_cc_${cpu}=\$host_cc"
718  ;;
719  i386|i486|i586|i686|i86pc|BePC)
720    cpu="i386"
721    supported_cpu="yes"
722    cross_cc_i386=$host_cc
723  ;;
724  x86_64|amd64)
725    cpu="x86_64"
726    supported_cpu="yes"
727    cross_cc_x86_64=$host_cc
728  ;;
729  armv*b|armv*l|arm)
730    cpu="arm"
731    supported_cpu="yes"
732    cross_cc_arm=$host_cc
733  ;;
734  aarch64)
735    cpu="aarch64"
736    supported_cpu="yes"
737    cross_cc_aarch64=$host_cc
738  ;;
739  mips*)
740    cpu="mips"
741    supported_cpu="yes"
742    cross_cc_mips=$host_cc
743  ;;
744  sparc|sun4[cdmuv])
745    cpu="sparc"
746    supported_cpu="yes"
747    cross_cc_sparc=$host_cc
748  ;;
749  *)
750    # This will result in either an error or falling back to TCI later
751    ARCH=unknown
752  ;;
753esac
754if test -z "$ARCH"; then
755  ARCH="$cpu"
756fi
757
758# OS specific
759
760# host *BSD for user mode
761HOST_VARIANT_DIR=""
762
763case $targetos in
764MINGW32*)
765  mingw32="yes"
766  hax="yes"
767  audio_possible_drivers="dsound sdl"
768  if check_include dsound.h; then
769    audio_drv_list="dsound"
770  else
771    audio_drv_list=""
772  fi
773  supported_os="yes"
774;;
775GNU/kFreeBSD)
776  bsd="yes"
777  audio_drv_list="oss"
778  audio_possible_drivers="oss sdl pa"
779;;
780FreeBSD)
781  bsd="yes"
782  make="${MAKE-gmake}"
783  audio_drv_list="oss"
784  audio_possible_drivers="oss sdl pa"
785  # needed for kinfo_getvmmap(3) in libutil.h
786  LIBS="-lutil $LIBS"
787  # needed for kinfo_getproc
788  libs_qga="-lutil $libs_qga"
789  netmap=""  # enable netmap autodetect
790  HOST_VARIANT_DIR="freebsd"
791  supported_os="yes"
792;;
793DragonFly)
794  bsd="yes"
795  make="${MAKE-gmake}"
796  audio_drv_list="oss"
797  audio_possible_drivers="oss sdl pa"
798  HOST_VARIANT_DIR="dragonfly"
799;;
800NetBSD)
801  bsd="yes"
802  make="${MAKE-gmake}"
803  audio_drv_list="oss"
804  audio_possible_drivers="oss sdl"
805  oss_lib="-lossaudio"
806  HOST_VARIANT_DIR="netbsd"
807  supported_os="yes"
808;;
809OpenBSD)
810  bsd="yes"
811  make="${MAKE-gmake}"
812  audio_drv_list="sdl"
813  audio_possible_drivers="sdl"
814  HOST_VARIANT_DIR="openbsd"
815  supported_os="yes"
816;;
817Darwin)
818  bsd="yes"
819  darwin="yes"
820  hax="yes"
821  hvf="yes"
822  LDFLAGS_SHARED="-bundle -undefined dynamic_lookup"
823  if [ "$cpu" = "x86_64" ] ; then
824    QEMU_CFLAGS="-arch x86_64 $QEMU_CFLAGS"
825    LDFLAGS="-arch x86_64 $LDFLAGS"
826  fi
827  cocoa="yes"
828  audio_drv_list="coreaudio"
829  audio_possible_drivers="coreaudio sdl"
830  LDFLAGS="-framework CoreFoundation -framework IOKit $LDFLAGS"
831  libs_softmmu="-F/System/Library/Frameworks -framework Cocoa -framework IOKit $libs_softmmu"
832  # Disable attempts to use ObjectiveC features in os/object.h since they
833  # won't work when we're compiling with gcc as a C compiler.
834  QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS"
835  HOST_VARIANT_DIR="darwin"
836  supported_os="yes"
837;;
838SunOS)
839  solaris="yes"
840  make="${MAKE-gmake}"
841  install="${INSTALL-ginstall}"
842  smbd="${SMBD-/usr/sfw/sbin/smbd}"
843  if test -f /usr/include/sys/soundcard.h ; then
844    audio_drv_list="oss"
845  fi
846  audio_possible_drivers="oss sdl"
847# needed for CMSG_ macros in sys/socket.h
848  QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS"
849# needed for TIOCWIN* defines in termios.h
850  QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
851  QEMU_CFLAGS="-std=gnu99 $QEMU_CFLAGS"
852  solarisnetlibs="-lsocket -lnsl -lresolv"
853  LIBS="$solarisnetlibs $LIBS"
854  libs_qga="$solarisnetlibs $libs_qga"
855;;
856Haiku)
857  haiku="yes"
858  QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS $QEMU_CFLAGS"
859  LIBS="-lposix_error_mapper -lnetwork $LIBS"
860;;
861Linux)
862  audio_drv_list="oss"
863  audio_possible_drivers="oss alsa sdl pa"
864  linux="yes"
865  linux_user="yes"
866  kvm="yes"
867  vhost_net="yes"
868  vhost_crypto="yes"
869  vhost_scsi="yes"
870  vhost_vsock="yes"
871  QEMU_INCLUDES="-I\$(SRC_PATH)/linux-headers -I$(pwd)/linux-headers $QEMU_INCLUDES"
872  supported_os="yes"
873;;
874esac
875
876if [ "$bsd" = "yes" ] ; then
877  if [ "$darwin" != "yes" ] ; then
878    bsd_user="yes"
879  fi
880fi
881
882: ${make=${MAKE-make}}
883: ${install=${INSTALL-install}}
884: ${python=${PYTHON-python}}
885: ${smbd=${SMBD-/usr/sbin/smbd}}
886
887# Default objcc to clang if available, otherwise use CC
888if has clang; then
889  objcc=clang
890else
891  objcc="$cc"
892fi
893
894if test "$mingw32" = "yes" ; then
895  EXESUF=".exe"
896  DSOSUF=".dll"
897  QEMU_CFLAGS="-DWIN32_LEAN_AND_MEAN -DWINVER=0x501 $QEMU_CFLAGS"
898  # enable C99/POSIX format strings (needs mingw32-runtime 3.15 or later)
899  QEMU_CFLAGS="-D__USE_MINGW_ANSI_STDIO=1 $QEMU_CFLAGS"
900  # MinGW needs -mthreads for TLS and macro _MT.
901  QEMU_CFLAGS="-mthreads $QEMU_CFLAGS"
902  LIBS="-lwinmm -lws2_32 -liphlpapi $LIBS"
903  write_c_skeleton;
904  if compile_prog "" "-liberty" ; then
905    LIBS="-liberty $LIBS"
906  fi
907  prefix="c:/Program Files/QEMU"
908  mandir="\${prefix}"
909  datadir="\${prefix}"
910  qemu_docdir="\${prefix}"
911  bindir="\${prefix}"
912  sysconfdir="\${prefix}"
913  local_statedir=
914  confsuffix=""
915  libs_qga="-lws2_32 -lwinmm -lpowrprof -lwtsapi32 -lwininet -liphlpapi -lnetapi32 $libs_qga"
916fi
917
918werror=""
919
920for opt do
921  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
922  case "$opt" in
923  --help|-h) show_help=yes
924  ;;
925  --version|-V) exec cat $source_path/VERSION
926  ;;
927  --prefix=*) prefix="$optarg"
928  ;;
929  --interp-prefix=*) interp_prefix="$optarg"
930  ;;
931  --source-path=*)
932  ;;
933  --cross-prefix=*)
934  ;;
935  --cc=*)
936  ;;
937  --host-cc=*) host_cc="$optarg"
938  ;;
939  --cxx=*)
940  ;;
941  --iasl=*) iasl="$optarg"
942  ;;
943  --objcc=*) objcc="$optarg"
944  ;;
945  --make=*) make="$optarg"
946  ;;
947  --install=*) install="$optarg"
948  ;;
949  --python=*) python="$optarg"
950  ;;
951  --gcov=*) gcov_tool="$optarg"
952  ;;
953  --smbd=*) smbd="$optarg"
954  ;;
955  --extra-cflags=*)
956  ;;
957  --extra-cxxflags=*)
958  ;;
959  --extra-ldflags=*)
960  ;;
961  --enable-debug-info)
962  ;;
963  --disable-debug-info)
964  ;;
965  --cross-cc-*)
966  ;;
967  --enable-modules)
968      modules="yes"
969  ;;
970  --disable-modules)
971      modules="no"
972  ;;
973  --cpu=*)
974  ;;
975  --target-list=*) target_list="$optarg"
976  ;;
977  --enable-trace-backends=*) trace_backends="$optarg"
978  ;;
979  # XXX: backwards compatibility
980  --enable-trace-backend=*) trace_backends="$optarg"
981  ;;
982  --with-trace-file=*) trace_file="$optarg"
983  ;;
984  --enable-gprof) gprof="yes"
985  ;;
986  --enable-gcov) gcov="yes"
987  ;;
988  --static)
989    static="yes"
990    LDFLAGS="-static $LDFLAGS"
991    QEMU_PKG_CONFIG_FLAGS="--static $QEMU_PKG_CONFIG_FLAGS"
992  ;;
993  --mandir=*) mandir="$optarg"
994  ;;
995  --bindir=*) bindir="$optarg"
996  ;;
997  --libdir=*) libdir="$optarg"
998  ;;
999  --libexecdir=*) libexecdir="$optarg"
1000  ;;
1001  --includedir=*) includedir="$optarg"
1002  ;;
1003  --datadir=*) datadir="$optarg"
1004  ;;
1005  --with-confsuffix=*) confsuffix="$optarg"
1006  ;;
1007  --docdir=*) qemu_docdir="$optarg"
1008  ;;
1009  --sysconfdir=*) sysconfdir="$optarg"
1010  ;;
1011  --localstatedir=*) local_statedir="$optarg"
1012  ;;
1013  --firmwarepath=*) firmwarepath="$optarg"
1014  ;;
1015  --host=*|--build=*|\
1016  --disable-dependency-tracking|\
1017  --sbindir=*|--sharedstatedir=*|\
1018  --oldincludedir=*|--datarootdir=*|--infodir=*|--localedir=*|\
1019  --htmldir=*|--dvidir=*|--pdfdir=*|--psdir=*)
1020    # These switches are silently ignored, for compatibility with
1021    # autoconf-generated configure scripts. This allows QEMU's
1022    # configure to be used by RPM and similar macros that set
1023    # lots of directory switches by default.
1024  ;;
1025  --disable-sdl) sdl="no"
1026  ;;
1027  --enable-sdl) sdl="yes"
1028  ;;
1029  --with-sdlabi=*) sdlabi="$optarg"
1030  ;;
1031  --disable-qom-cast-debug) qom_cast_debug="no"
1032  ;;
1033  --enable-qom-cast-debug) qom_cast_debug="yes"
1034  ;;
1035  --disable-virtfs) virtfs="no"
1036  ;;
1037  --enable-virtfs) virtfs="yes"
1038  ;;
1039  --disable-mpath) mpath="no"
1040  ;;
1041  --enable-mpath) mpath="yes"
1042  ;;
1043  --disable-vnc) vnc="no"
1044  ;;
1045  --enable-vnc) vnc="yes"
1046  ;;
1047  --oss-lib=*) oss_lib="$optarg"
1048  ;;
1049  --audio-drv-list=*) audio_drv_list="$optarg"
1050  ;;
1051  --block-drv-rw-whitelist=*|--block-drv-whitelist=*) block_drv_rw_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
1052  ;;
1053  --block-drv-ro-whitelist=*) block_drv_ro_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
1054  ;;
1055  --enable-debug-tcg) debug_tcg="yes"
1056  ;;
1057  --disable-debug-tcg) debug_tcg="no"
1058  ;;
1059  --enable-debug)
1060      # Enable debugging options that aren't excessively noisy
1061      debug_tcg="yes"
1062      debug_mutex="yes"
1063      debug="yes"
1064      strip_opt="no"
1065      fortify_source="no"
1066  ;;
1067  --enable-sanitizers) sanitizers="yes"
1068  ;;
1069  --disable-sanitizers) sanitizers="no"
1070  ;;
1071  --enable-sparse) sparse="yes"
1072  ;;
1073  --disable-sparse) sparse="no"
1074  ;;
1075  --disable-strip) strip_opt="no"
1076  ;;
1077  --disable-vnc-sasl) vnc_sasl="no"
1078  ;;
1079  --enable-vnc-sasl) vnc_sasl="yes"
1080  ;;
1081  --disable-vnc-jpeg) vnc_jpeg="no"
1082  ;;
1083  --enable-vnc-jpeg) vnc_jpeg="yes"
1084  ;;
1085  --disable-vnc-png) vnc_png="no"
1086  ;;
1087  --enable-vnc-png) vnc_png="yes"
1088  ;;
1089  --disable-slirp) slirp="no"
1090  ;;
1091  --disable-vde) vde="no"
1092  ;;
1093  --enable-vde) vde="yes"
1094  ;;
1095  --disable-netmap) netmap="no"
1096  ;;
1097  --enable-netmap) netmap="yes"
1098  ;;
1099  --disable-xen) xen="no"
1100  ;;
1101  --enable-xen) xen="yes"
1102  ;;
1103  --disable-xen-pci-passthrough) xen_pci_passthrough="no"
1104  ;;
1105  --enable-xen-pci-passthrough) xen_pci_passthrough="yes"
1106  ;;
1107  --disable-xen-pv-domain-build) xen_pv_domain_build="no"
1108  ;;
1109  --enable-xen-pv-domain-build) xen_pv_domain_build="yes"
1110  ;;
1111  --disable-brlapi) brlapi="no"
1112  ;;
1113  --enable-brlapi) brlapi="yes"
1114  ;;
1115  --disable-bluez) bluez="no"
1116  ;;
1117  --enable-bluez) bluez="yes"
1118  ;;
1119  --disable-kvm) kvm="no"
1120  ;;
1121  --enable-kvm) kvm="yes"
1122  ;;
1123  --disable-hax) hax="no"
1124  ;;
1125  --enable-hax) hax="yes"
1126  ;;
1127  --disable-hvf) hvf="no"
1128  ;;
1129  --enable-hvf) hvf="yes"
1130  ;;
1131  --disable-whpx) whpx="no"
1132  ;;
1133  --enable-whpx) whpx="yes"
1134  ;;
1135  --disable-tcg-interpreter) tcg_interpreter="no"
1136  ;;
1137  --enable-tcg-interpreter) tcg_interpreter="yes"
1138  ;;
1139  --disable-cap-ng)  cap_ng="no"
1140  ;;
1141  --enable-cap-ng) cap_ng="yes"
1142  ;;
1143  --disable-tcg) tcg="no"
1144  ;;
1145  --enable-tcg) tcg="yes"
1146  ;;
1147  --disable-malloc-trim) malloc_trim="no"
1148  ;;
1149  --enable-malloc-trim) malloc_trim="yes"
1150  ;;
1151  --disable-spice) spice="no"
1152  ;;
1153  --enable-spice) spice="yes"
1154  ;;
1155  --disable-libiscsi) libiscsi="no"
1156  ;;
1157  --enable-libiscsi) libiscsi="yes"
1158  ;;
1159  --disable-libnfs) libnfs="no"
1160  ;;
1161  --enable-libnfs) libnfs="yes"
1162  ;;
1163  --enable-profiler) profiler="yes"
1164  ;;
1165  --disable-cocoa) cocoa="no"
1166  ;;
1167  --enable-cocoa)
1168      cocoa="yes" ;
1169      audio_drv_list="coreaudio $(echo $audio_drv_list | sed s,coreaudio,,g)"
1170  ;;
1171  --disable-system) softmmu="no"
1172  ;;
1173  --enable-system) softmmu="yes"
1174  ;;
1175  --disable-user)
1176      linux_user="no" ;
1177      bsd_user="no" ;
1178  ;;
1179  --enable-user) ;;
1180  --disable-linux-user) linux_user="no"
1181  ;;
1182  --enable-linux-user) linux_user="yes"
1183  ;;
1184  --disable-bsd-user) bsd_user="no"
1185  ;;
1186  --enable-bsd-user) bsd_user="yes"
1187  ;;
1188  --enable-pie) pie="yes"
1189  ;;
1190  --disable-pie) pie="no"
1191  ;;
1192  --enable-werror) werror="yes"
1193  ;;
1194  --disable-werror) werror="no"
1195  ;;
1196  --enable-stack-protector) stack_protector="yes"
1197  ;;
1198  --disable-stack-protector) stack_protector="no"
1199  ;;
1200  --disable-curses) curses="no"
1201  ;;
1202  --enable-curses) curses="yes"
1203  ;;
1204  --disable-curl) curl="no"
1205  ;;
1206  --enable-curl) curl="yes"
1207  ;;
1208  --disable-fdt) fdt="no"
1209  ;;
1210  --enable-fdt) fdt="yes"
1211  ;;
1212  --disable-linux-aio) linux_aio="no"
1213  ;;
1214  --enable-linux-aio) linux_aio="yes"
1215  ;;
1216  --disable-attr) attr="no"
1217  ;;
1218  --enable-attr) attr="yes"
1219  ;;
1220  --disable-membarrier) membarrier="no"
1221  ;;
1222  --enable-membarrier) membarrier="yes"
1223  ;;
1224  --disable-blobs) blobs="no"
1225  ;;
1226  --with-pkgversion=*) pkgversion="$optarg"
1227  ;;
1228  --with-coroutine=*) coroutine="$optarg"
1229  ;;
1230  --disable-coroutine-pool) coroutine_pool="no"
1231  ;;
1232  --enable-coroutine-pool) coroutine_pool="yes"
1233  ;;
1234  --enable-debug-stack-usage) debug_stack_usage="yes"
1235  ;;
1236  --enable-crypto-afalg) crypto_afalg="yes"
1237  ;;
1238  --disable-crypto-afalg) crypto_afalg="no"
1239  ;;
1240  --disable-docs) docs="no"
1241  ;;
1242  --enable-docs) docs="yes"
1243  ;;
1244  --disable-vhost-net) vhost_net="no"
1245  ;;
1246  --enable-vhost-net) vhost_net="yes"
1247  ;;
1248  --disable-vhost-crypto) vhost_crypto="no"
1249  ;;
1250  --enable-vhost-crypto)
1251      vhost_crypto="yes"
1252      if test "$mingw32" = "yes"; then
1253          error_exit "vhost-crypto isn't available on win32"
1254      fi
1255  ;;
1256  --disable-vhost-scsi) vhost_scsi="no"
1257  ;;
1258  --enable-vhost-scsi) vhost_scsi="yes"
1259  ;;
1260  --disable-vhost-vsock) vhost_vsock="no"
1261  ;;
1262  --enable-vhost-vsock) vhost_vsock="yes"
1263  ;;
1264  --disable-opengl) opengl="no"
1265  ;;
1266  --enable-opengl) opengl="yes"
1267  ;;
1268  --disable-rbd) rbd="no"
1269  ;;
1270  --enable-rbd) rbd="yes"
1271  ;;
1272  --disable-xfsctl) xfs="no"
1273  ;;
1274  --enable-xfsctl) xfs="yes"
1275  ;;
1276  --disable-smartcard) smartcard="no"
1277  ;;
1278  --enable-smartcard) smartcard="yes"
1279  ;;
1280  --disable-libusb) libusb="no"
1281  ;;
1282  --enable-libusb) libusb="yes"
1283  ;;
1284  --disable-usb-redir) usb_redir="no"
1285  ;;
1286  --enable-usb-redir) usb_redir="yes"
1287  ;;
1288  --disable-zlib-test) zlib="no"
1289  ;;
1290  --disable-lzo) lzo="no"
1291  ;;
1292  --enable-lzo) lzo="yes"
1293  ;;
1294  --disable-snappy) snappy="no"
1295  ;;
1296  --enable-snappy) snappy="yes"
1297  ;;
1298  --disable-bzip2) bzip2="no"
1299  ;;
1300  --enable-bzip2) bzip2="yes"
1301  ;;
1302  --enable-guest-agent) guest_agent="yes"
1303  ;;
1304  --disable-guest-agent) guest_agent="no"
1305  ;;
1306  --enable-guest-agent-msi) guest_agent_msi="yes"
1307  ;;
1308  --disable-guest-agent-msi) guest_agent_msi="no"
1309  ;;
1310  --with-vss-sdk) vss_win32_sdk=""
1311  ;;
1312  --with-vss-sdk=*) vss_win32_sdk="$optarg"
1313  ;;
1314  --without-vss-sdk) vss_win32_sdk="no"
1315  ;;
1316  --with-win-sdk) win_sdk=""
1317  ;;
1318  --with-win-sdk=*) win_sdk="$optarg"
1319  ;;
1320  --without-win-sdk) win_sdk="no"
1321  ;;
1322  --enable-tools) want_tools="yes"
1323  ;;
1324  --disable-tools) want_tools="no"
1325  ;;
1326  --enable-seccomp) seccomp="yes"
1327  ;;
1328  --disable-seccomp) seccomp="no"
1329  ;;
1330  --disable-glusterfs) glusterfs="no"
1331  ;;
1332  --disable-avx2) avx2_opt="no"
1333  ;;
1334  --enable-avx2) avx2_opt="yes"
1335  ;;
1336  --enable-glusterfs) glusterfs="yes"
1337  ;;
1338  --disable-virtio-blk-data-plane|--enable-virtio-blk-data-plane)
1339      echo "$0: $opt is obsolete, virtio-blk data-plane is always on" >&2
1340  ;;
1341  --enable-vhdx|--disable-vhdx)
1342      echo "$0: $opt is obsolete, VHDX driver is always built" >&2
1343  ;;
1344  --enable-uuid|--disable-uuid)
1345      echo "$0: $opt is obsolete, UUID support is always built" >&2
1346  ;;
1347  --disable-gtk) gtk="no"
1348  ;;
1349  --enable-gtk) gtk="yes"
1350  ;;
1351  --tls-priority=*) tls_priority="$optarg"
1352  ;;
1353  --disable-gnutls) gnutls="no"
1354  ;;
1355  --enable-gnutls) gnutls="yes"
1356  ;;
1357  --disable-nettle) nettle="no"
1358  ;;
1359  --enable-nettle) nettle="yes"
1360  ;;
1361  --disable-gcrypt) gcrypt="no"
1362  ;;
1363  --enable-gcrypt) gcrypt="yes"
1364  ;;
1365  --enable-rdma) rdma="yes"
1366  ;;
1367  --disable-rdma) rdma="no"
1368  ;;
1369  --enable-pvrdma) pvrdma="yes"
1370  ;;
1371  --disable-pvrdma) pvrdma="no"
1372  ;;
1373  --disable-vte) vte="no"
1374  ;;
1375  --enable-vte) vte="yes"
1376  ;;
1377  --disable-virglrenderer) virglrenderer="no"
1378  ;;
1379  --enable-virglrenderer) virglrenderer="yes"
1380  ;;
1381  --disable-tpm) tpm="no"
1382  ;;
1383  --enable-tpm) tpm="yes"
1384  ;;
1385  --disable-libssh2) libssh2="no"
1386  ;;
1387  --enable-libssh2) libssh2="yes"
1388  ;;
1389  --disable-live-block-migration) live_block_migration="no"
1390  ;;
1391  --enable-live-block-migration) live_block_migration="yes"
1392  ;;
1393  --disable-numa) numa="no"
1394  ;;
1395  --enable-numa) numa="yes"
1396  ;;
1397  --disable-libxml2) libxml2="no"
1398  ;;
1399  --enable-libxml2) libxml2="yes"
1400  ;;
1401  --disable-tcmalloc) tcmalloc="no"
1402  ;;
1403  --enable-tcmalloc) tcmalloc="yes"
1404  ;;
1405  --disable-jemalloc) jemalloc="no"
1406  ;;
1407  --enable-jemalloc) jemalloc="yes"
1408  ;;
1409  --disable-replication) replication="no"
1410  ;;
1411  --enable-replication) replication="yes"
1412  ;;
1413  --disable-vxhs) vxhs="no"
1414  ;;
1415  --enable-vxhs) vxhs="yes"
1416  ;;
1417  --disable-vhost-user) vhost_user="no"
1418  ;;
1419  --enable-vhost-user)
1420      vhost_user="yes"
1421      if test "$mingw32" = "yes"; then
1422          error_exit "vhost-user isn't available on win32"
1423      fi
1424  ;;
1425  --disable-capstone) capstone="no"
1426  ;;
1427  --enable-capstone) capstone="yes"
1428  ;;
1429  --enable-capstone=git) capstone="git"
1430  ;;
1431  --enable-capstone=system) capstone="system"
1432  ;;
1433  --with-git=*) git="$optarg"
1434  ;;
1435  --enable-git-update) git_update=yes
1436  ;;
1437  --disable-git-update) git_update=no
1438  ;;
1439  --enable-debug-mutex) debug_mutex=yes
1440  ;;
1441  --disable-debug-mutex) debug_mutex=no
1442  ;;
1443  --enable-libpmem) libpmem=yes
1444  ;;
1445  --disable-libpmem) libpmem=no
1446  ;;
1447  *)
1448      echo "ERROR: unknown option $opt"
1449      echo "Try '$0 --help' for more information"
1450      exit 1
1451  ;;
1452  esac
1453done
1454
1455if test "$vhost_user" = ""; then
1456    if test "$mingw32" = "yes"; then
1457        vhost_user="no"
1458    else
1459        vhost_user="yes"
1460    fi
1461fi
1462
1463case "$cpu" in
1464    ppc)
1465           CPU_CFLAGS="-m32"
1466           LDFLAGS="-m32 $LDFLAGS"
1467           cross_cc_powerpc=$cc
1468           cross_cc_cflags_powerpc=$CPU_CFLAGS
1469           ;;
1470    ppc64)
1471           CPU_CFLAGS="-m64"
1472           LDFLAGS="-m64 $LDFLAGS"
1473           cross_cc_ppc64=$cc
1474           cross_cc_cflags_ppc64=$CPU_CFLAGS
1475           ;;
1476    sparc)
1477           CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc"
1478           LDFLAGS="-m32 -mv8plus $LDFLAGS"
1479           cross_cc_sparc=$cc
1480           cross_cc_cflags_sparc=$CPU_CFLAGS
1481           ;;
1482    sparc64)
1483           CPU_CFLAGS="-m64 -mcpu=ultrasparc"
1484           LDFLAGS="-m64 $LDFLAGS"
1485           cross_cc_sparc64=$cc
1486           cross_cc_cflags_sparc64=$CPU_CFLAGS
1487           ;;
1488    s390)
1489           CPU_CFLAGS="-m31"
1490           LDFLAGS="-m31 $LDFLAGS"
1491           cross_cc_s390=$cc
1492           cross_cc_cflags_s390=$CPU_CFLAGS
1493           ;;
1494    s390x)
1495           CPU_CFLAGS="-m64"
1496           LDFLAGS="-m64 $LDFLAGS"
1497           cross_cc_s390x=$cc
1498           cross_cc_cflags_s390x=$CPU_CFLAGS
1499           ;;
1500    i386)
1501           CPU_CFLAGS="-m32"
1502           LDFLAGS="-m32 $LDFLAGS"
1503           cross_cc_i386=$cc
1504           cross_cc_cflags_i386=$CPU_CFLAGS
1505           ;;
1506    x86_64)
1507           # ??? Only extremely old AMD cpus do not have cmpxchg16b.
1508           # If we truly care, we should simply detect this case at
1509           # runtime and generate the fallback to serial emulation.
1510           CPU_CFLAGS="-m64 -mcx16"
1511           LDFLAGS="-m64 $LDFLAGS"
1512           cross_cc_x86_64=$cc
1513           cross_cc_cflags_x86_64=$CPU_CFLAGS
1514           ;;
1515    x32)
1516           CPU_CFLAGS="-mx32"
1517           LDFLAGS="-mx32 $LDFLAGS"
1518           cross_cc_i386=$cc
1519           cross_cc_cflags_i386=$CPU_CFLAGS
1520           ;;
1521    # No special flags required for other host CPUs
1522esac
1523
1524QEMU_CFLAGS="$CPU_CFLAGS $QEMU_CFLAGS"
1525
1526# For user-mode emulation the host arch has to be one we explicitly
1527# support, even if we're using TCI.
1528if [ "$ARCH" = "unknown" ]; then
1529  bsd_user="no"
1530  linux_user="no"
1531fi
1532
1533default_target_list=""
1534
1535mak_wilds=""
1536
1537if [ "$softmmu" = "yes" ]; then
1538    mak_wilds="${mak_wilds} $source_path/default-configs/*-softmmu.mak"
1539fi
1540if [ "$linux_user" = "yes" ]; then
1541    mak_wilds="${mak_wilds} $source_path/default-configs/*-linux-user.mak"
1542fi
1543if [ "$bsd_user" = "yes" ]; then
1544    mak_wilds="${mak_wilds} $source_path/default-configs/*-bsd-user.mak"
1545fi
1546
1547for config in $mak_wilds; do
1548    default_target_list="${default_target_list} $(basename "$config" .mak)"
1549done
1550
1551# Enumerate public trace backends for --help output
1552trace_backend_list=$(echo $(grep -le '^PUBLIC = True$' "$source_path"/scripts/tracetool/backend/*.py | sed -e 's/^.*\/\(.*\)\.py$/\1/'))
1553
1554if test x"$show_help" = x"yes" ; then
1555cat << EOF
1556
1557Usage: configure [options]
1558Options: [defaults in brackets after descriptions]
1559
1560Standard options:
1561  --help                   print this message
1562  --prefix=PREFIX          install in PREFIX [$prefix]
1563  --interp-prefix=PREFIX   where to find shared libraries, etc.
1564                           use %M for cpu name [$interp_prefix]
1565  --target-list=LIST       set target list (default: build everything)
1566$(echo Available targets: $default_target_list | \
1567  fold -s -w 53 | sed -e 's/^/                           /')
1568
1569Advanced options (experts only):
1570  --source-path=PATH       path of source code [$source_path]
1571  --cross-prefix=PREFIX    use PREFIX for compile tools [$cross_prefix]
1572  --cc=CC                  use C compiler CC [$cc]
1573  --iasl=IASL              use ACPI compiler IASL [$iasl]
1574  --host-cc=CC             use C compiler CC [$host_cc] for code run at
1575                           build time
1576  --cxx=CXX                use C++ compiler CXX [$cxx]
1577  --objcc=OBJCC            use Objective-C compiler OBJCC [$objcc]
1578  --extra-cflags=CFLAGS    append extra C compiler flags QEMU_CFLAGS
1579  --extra-cxxflags=CXXFLAGS append extra C++ compiler flags QEMU_CXXFLAGS
1580  --extra-ldflags=LDFLAGS  append extra linker flags LDFLAGS
1581  --cross-cc-ARCH=CC       use compiler when building ARCH guest test cases
1582  --cross-cc-flags-ARCH=   use compiler flags when building ARCH guest tests
1583  --make=MAKE              use specified make [$make]
1584  --install=INSTALL        use specified install [$install]
1585  --python=PYTHON          use specified python [$python]
1586  --smbd=SMBD              use specified smbd [$smbd]
1587  --with-git=GIT           use specified git [$git]
1588  --static                 enable static build [$static]
1589  --mandir=PATH            install man pages in PATH
1590  --datadir=PATH           install firmware in PATH$confsuffix
1591  --docdir=PATH            install documentation in PATH$confsuffix
1592  --bindir=PATH            install binaries in PATH
1593  --libdir=PATH            install libraries in PATH
1594  --libexecdir=PATH        install helper binaries in PATH
1595  --sysconfdir=PATH        install config in PATH$confsuffix
1596  --localstatedir=PATH     install local state in PATH (set at runtime on win32)
1597  --firmwarepath=PATH      search PATH for firmware files
1598  --with-confsuffix=SUFFIX suffix for QEMU data inside datadir/libdir/sysconfdir [$confsuffix]
1599  --with-pkgversion=VERS   use specified string as sub-version of the package
1600  --enable-debug           enable common debug build options
1601  --enable-sanitizers      enable default sanitizers
1602  --disable-strip          disable stripping binaries
1603  --disable-werror         disable compilation abort on warning
1604  --disable-stack-protector disable compiler-provided stack protection
1605  --audio-drv-list=LIST    set audio drivers list:
1606                           Available drivers: $audio_possible_drivers
1607  --block-drv-whitelist=L  Same as --block-drv-rw-whitelist=L
1608  --block-drv-rw-whitelist=L
1609                           set block driver read-write whitelist
1610                           (affects only QEMU, not qemu-img)
1611  --block-drv-ro-whitelist=L
1612                           set block driver read-only whitelist
1613                           (affects only QEMU, not qemu-img)
1614  --enable-trace-backends=B Set trace backend
1615                           Available backends: $trace_backend_list
1616  --with-trace-file=NAME   Full PATH,NAME of file to store traces
1617                           Default:trace-<pid>
1618  --disable-slirp          disable SLIRP userspace network connectivity
1619  --enable-tcg-interpreter enable TCG with bytecode interpreter (TCI)
1620  --enable-malloc-trim     enable libc malloc_trim() for memory optimization
1621  --oss-lib                path to OSS library
1622  --cpu=CPU                Build for host CPU [$cpu]
1623  --with-coroutine=BACKEND coroutine backend. Supported options:
1624                           ucontext, sigaltstack, windows
1625  --enable-gcov            enable test coverage analysis with gcov
1626  --gcov=GCOV              use specified gcov [$gcov_tool]
1627  --disable-blobs          disable installing provided firmware blobs
1628  --with-vss-sdk=SDK-path  enable Windows VSS support in QEMU Guest Agent
1629  --with-win-sdk=SDK-path  path to Windows Platform SDK (to build VSS .tlb)
1630  --tls-priority           default TLS protocol/cipher priority string
1631  --enable-gprof           QEMU profiling with gprof
1632  --enable-profiler        profiler support
1633  --enable-xen-pv-domain-build
1634                           xen pv domain builder
1635  --enable-debug-stack-usage
1636                           track the maximum stack usage of stacks created by qemu_alloc_stack
1637
1638Optional features, enabled with --enable-FEATURE and
1639disabled with --disable-FEATURE, default is enabled if available:
1640
1641  system          all system emulation targets
1642  user            supported user emulation targets
1643  linux-user      all linux usermode emulation targets
1644  bsd-user        all BSD usermode emulation targets
1645  docs            build documentation
1646  guest-agent     build the QEMU Guest Agent
1647  guest-agent-msi build guest agent Windows MSI installation package
1648  pie             Position Independent Executables
1649  modules         modules support
1650  debug-tcg       TCG debugging (default is disabled)
1651  debug-info      debugging information
1652  sparse          sparse checker
1653
1654  gnutls          GNUTLS cryptography support
1655  nettle          nettle cryptography support
1656  gcrypt          libgcrypt cryptography support
1657  sdl             SDL UI
1658  --with-sdlabi     select preferred SDL ABI 1.2 or 2.0
1659  gtk             gtk UI
1660  vte             vte support for the gtk UI
1661  curses          curses UI
1662  vnc             VNC UI support
1663  vnc-sasl        SASL encryption for VNC server
1664  vnc-jpeg        JPEG lossy compression for VNC server
1665  vnc-png         PNG compression for VNC server
1666  cocoa           Cocoa UI (Mac OS X only)
1667  virtfs          VirtFS
1668  mpath           Multipath persistent reservation passthrough
1669  xen             xen backend driver support
1670  xen-pci-passthrough    PCI passthrough support for Xen
1671  brlapi          BrlAPI (Braile)
1672  curl            curl connectivity
1673  membarrier      membarrier system call (for Linux 4.14+ or Windows)
1674  fdt             fdt device tree
1675  bluez           bluez stack connectivity
1676  kvm             KVM acceleration support
1677  hax             HAX acceleration support
1678  hvf             Hypervisor.framework acceleration support
1679  whpx            Windows Hypervisor Platform acceleration support
1680  rdma            Enable RDMA-based migration
1681  pvrdma          Enable PVRDMA support
1682  vde             support for vde network
1683  netmap          support for netmap network
1684  linux-aio       Linux AIO support
1685  cap-ng          libcap-ng support
1686  attr            attr and xattr support
1687  vhost-net       vhost-net acceleration support
1688  vhost-crypto    vhost-crypto acceleration support
1689  spice           spice
1690  rbd             rados block device (rbd)
1691  libiscsi        iscsi support
1692  libnfs          nfs support
1693  smartcard       smartcard support (libcacard)
1694  libusb          libusb (for usb passthrough)
1695  live-block-migration   Block migration in the main migration stream
1696  usb-redir       usb network redirection support
1697  lzo             support of lzo compression library
1698  snappy          support of snappy compression library
1699  bzip2           support of bzip2 compression library
1700                  (for reading bzip2-compressed dmg images)
1701  seccomp         seccomp support
1702  coroutine-pool  coroutine freelist (better performance)
1703  glusterfs       GlusterFS backend
1704  tpm             TPM support
1705  libssh2         ssh block device support
1706  numa            libnuma support
1707  libxml2         for Parallels image format
1708  tcmalloc        tcmalloc support
1709  jemalloc        jemalloc support
1710  avx2            AVX2 optimization support
1711  replication     replication support
1712  vhost-vsock     virtio sockets device support
1713  opengl          opengl support
1714  virglrenderer   virgl rendering support
1715  xfsctl          xfsctl support
1716  qom-cast-debug  cast debugging support
1717  tools           build qemu-io, qemu-nbd and qemu-image tools
1718  vxhs            Veritas HyperScale vDisk backend support
1719  crypto-afalg    Linux AF_ALG crypto backend driver
1720  vhost-user      vhost-user support
1721  capstone        capstone disassembler support
1722  debug-mutex     mutex debugging support
1723  libpmem         libpmem support
1724
1725NOTE: The object files are built at the place where configure is launched
1726EOF
1727exit 0
1728fi
1729
1730if ! has $python; then
1731  error_exit "Python not found. Use --python=/path/to/python"
1732fi
1733
1734# Note that if the Python conditional here evaluates True we will exit
1735# with status 1 which is a shell 'false' value.
1736if ! $python -c 'import sys; sys.exit(sys.version_info < (2,7))'; then
1737  error_exit "Cannot use '$python', Python 2 >= 2.7 or Python 3 is required." \
1738      "Use --python=/path/to/python to specify a supported Python."
1739fi
1740
1741# Suppress writing compiled files
1742python="$python -B"
1743
1744# Check that the C compiler works. Doing this here before testing
1745# the host CPU ensures that we had a valid CC to autodetect the
1746# $cpu var (and we should bail right here if that's not the case).
1747# It also allows the help message to be printed without a CC.
1748write_c_skeleton;
1749if compile_object ; then
1750  : C compiler works ok
1751else
1752    error_exit "\"$cc\" either does not exist or does not work"
1753fi
1754if ! compile_prog ; then
1755    error_exit "\"$cc\" cannot build an executable (is your linker broken?)"
1756fi
1757
1758# Now we have handled --enable-tcg-interpreter and know we're not just
1759# printing the help message, bail out if the host CPU isn't supported.
1760if test "$ARCH" = "unknown"; then
1761    if test "$tcg_interpreter" = "yes" ; then
1762        echo "Unsupported CPU = $cpu, will use TCG with TCI (experimental)"
1763    else
1764        error_exit "Unsupported CPU = $cpu, try --enable-tcg-interpreter"
1765    fi
1766fi
1767
1768# Consult white-list to determine whether to enable werror
1769# by default.  Only enable by default for git builds
1770if test -z "$werror" ; then
1771    if test -d "$source_path/.git" -a \
1772        \( "$linux" = "yes" -o "$mingw32" = "yes" \) ; then
1773        werror="yes"
1774    else
1775        werror="no"
1776    fi
1777fi
1778
1779if test "$bogus_os" = "yes"; then
1780    # Now that we know that we're not printing the help and that
1781    # the compiler works (so the results of the check_defines we used
1782    # to identify the OS are reliable), if we didn't recognize the
1783    # host OS we should stop now.
1784    error_exit "Unrecognized host OS (uname -s reports '$(uname -s)')"
1785fi
1786
1787gcc_flags="-Wold-style-declaration -Wold-style-definition -Wtype-limits"
1788gcc_flags="-Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers $gcc_flags"
1789gcc_flags="-Wno-missing-include-dirs -Wempty-body -Wnested-externs $gcc_flags"
1790gcc_flags="-Wendif-labels -Wno-shift-negative-value $gcc_flags"
1791gcc_flags="-Wno-initializer-overrides -Wexpansion-to-defined $gcc_flags"
1792gcc_flags="-Wno-string-plus-int $gcc_flags"
1793gcc_flags="-Wno-error=address-of-packed-member $gcc_flags"
1794# Note that we do not add -Werror to gcc_flags here, because that would
1795# enable it for all configure tests. If a configure test failed due
1796# to -Werror this would just silently disable some features,
1797# so it's too error prone.
1798
1799cc_has_warning_flag() {
1800    write_c_skeleton;
1801
1802    # Use the positive sense of the flag when testing for -Wno-wombat
1803    # support (gcc will happily accept the -Wno- form of unknown
1804    # warning options).
1805    optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
1806    compile_prog "-Werror $optflag" ""
1807}
1808
1809for flag in $gcc_flags; do
1810    if cc_has_warning_flag $flag ; then
1811        QEMU_CFLAGS="$QEMU_CFLAGS $flag"
1812    fi
1813done
1814
1815if test "$stack_protector" != "no"; then
1816  cat > $TMPC << EOF
1817int main(int argc, char *argv[])
1818{
1819    char arr[64], *p = arr, *c = argv[0];
1820    while (*c) {
1821        *p++ = *c++;
1822    }
1823    return 0;
1824}
1825EOF
1826  gcc_flags="-fstack-protector-strong -fstack-protector-all"
1827  sp_on=0
1828  for flag in $gcc_flags; do
1829    # We need to check both a compile and a link, since some compiler
1830    # setups fail only on a .c->.o compile and some only at link time
1831    if do_cc $QEMU_CFLAGS -Werror $flag -c -o $TMPO $TMPC &&
1832       compile_prog "-Werror $flag" ""; then
1833      QEMU_CFLAGS="$QEMU_CFLAGS $flag"
1834      sp_on=1
1835      break
1836    fi
1837  done
1838  if test "$stack_protector" = yes; then
1839    if test $sp_on = 0; then
1840      error_exit "Stack protector not supported"
1841    fi
1842  fi
1843fi
1844
1845# Disable -Wmissing-braces on older compilers that warn even for
1846# the "universal" C zero initializer {0}.
1847cat > $TMPC << EOF
1848struct {
1849  int a[2];
1850} x = {0};
1851EOF
1852if compile_object "-Werror" "" ; then
1853  :
1854else
1855  QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces"
1856fi
1857
1858# Workaround for http://gcc.gnu.org/PR55489.  Happens with -fPIE/-fPIC and
1859# large functions that use global variables.  The bug is in all releases of
1860# GCC, but it became particularly acute in 4.6.x and 4.7.x.  It is fixed in
1861# 4.7.3 and 4.8.0.  We should be able to delete this at the end of 2013.
1862cat > $TMPC << EOF
1863#if __GNUC__ == 4 && (__GNUC_MINOR__ == 6 || (__GNUC_MINOR__ == 7 && __GNUC_PATCHLEVEL__ <= 2))
1864int main(void) { return 0; }
1865#else
1866#error No bug in this compiler.
1867#endif
1868EOF
1869if compile_prog "-Werror -fno-gcse" "" ; then
1870  TRANSLATE_OPT_CFLAGS=-fno-gcse
1871fi
1872
1873if test "$static" = "yes" ; then
1874  if test "$modules" = "yes" ; then
1875    error_exit "static and modules are mutually incompatible"
1876  fi
1877  if test "$pie" = "yes" ; then
1878    error_exit "static and pie are mutually incompatible"
1879  else
1880    pie="no"
1881  fi
1882fi
1883
1884# Unconditional check for compiler __thread support
1885  cat > $TMPC << EOF
1886static __thread int tls_var;
1887int main(void) { return tls_var; }
1888EOF
1889
1890if ! compile_prog "-Werror" "" ; then
1891    error_exit "Your compiler does not support the __thread specifier for " \
1892	"Thread-Local Storage (TLS). Please upgrade to a version that does."
1893fi
1894
1895if test "$pie" = ""; then
1896  case "$cpu-$targetos" in
1897    i386-Linux|x86_64-Linux|x32-Linux|i386-OpenBSD|x86_64-OpenBSD)
1898      ;;
1899    *)
1900      pie="no"
1901      ;;
1902  esac
1903fi
1904
1905if test "$pie" != "no" ; then
1906  cat > $TMPC << EOF
1907
1908#ifdef __linux__
1909#  define THREAD __thread
1910#else
1911#  define THREAD
1912#endif
1913
1914static THREAD int tls_var;
1915
1916int main(void) { return tls_var; }
1917
1918EOF
1919  if compile_prog "-fPIE -DPIE" "-pie"; then
1920    QEMU_CFLAGS="-fPIE -DPIE $QEMU_CFLAGS"
1921    LDFLAGS="-pie $LDFLAGS"
1922    pie="yes"
1923    if compile_prog "" "-Wl,-z,relro -Wl,-z,now" ; then
1924      LDFLAGS="-Wl,-z,relro -Wl,-z,now $LDFLAGS"
1925    fi
1926  else
1927    if test "$pie" = "yes"; then
1928      error_exit "PIE not available due to missing toolchain support"
1929    else
1930      echo "Disabling PIE due to missing toolchain support"
1931      pie="no"
1932    fi
1933  fi
1934
1935  if compile_prog "-Werror -fno-pie" "-nopie"; then
1936    CFLAGS_NOPIE="-fno-pie"
1937    LDFLAGS_NOPIE="-nopie"
1938  fi
1939fi
1940
1941##########################################
1942# __sync_fetch_and_and requires at least -march=i486. Many toolchains
1943# use i686 as default anyway, but for those that don't, an explicit
1944# specification is necessary
1945
1946if test "$cpu" = "i386"; then
1947  cat > $TMPC << EOF
1948static int sfaa(int *ptr)
1949{
1950  return __sync_fetch_and_and(ptr, 0);
1951}
1952
1953int main(void)
1954{
1955  int val = 42;
1956  val = __sync_val_compare_and_swap(&val, 0, 1);
1957  sfaa(&val);
1958  return val;
1959}
1960EOF
1961  if ! compile_prog "" "" ; then
1962    QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS"
1963  fi
1964fi
1965
1966#########################################
1967# Solaris specific configure tool chain decisions
1968
1969if test "$solaris" = "yes" ; then
1970  if has $install; then
1971    :
1972  else
1973    error_exit "Solaris install program not found. Use --install=/usr/ucb/install or" \
1974        "install fileutils from www.blastwave.org using pkg-get -i fileutils" \
1975        "to get ginstall which is used by default (which lives in /opt/csw/bin)"
1976  fi
1977  if test "$(path_of $install)" = "/usr/sbin/install" ; then
1978    error_exit "Solaris /usr/sbin/install is not an appropriate install program." \
1979        "try ginstall from the GNU fileutils available from www.blastwave.org" \
1980        "using pkg-get -i fileutils, or use --install=/usr/ucb/install"
1981  fi
1982  if has ar; then
1983    :
1984  else
1985    if test -f /usr/ccs/bin/ar ; then
1986      error_exit "No path includes ar" \
1987          "Add /usr/ccs/bin to your path and rerun configure"
1988    fi
1989    error_exit "No path includes ar"
1990  fi
1991fi
1992
1993if test -z "${target_list+xxx}" ; then
1994    for target in $default_target_list; do
1995        supported_target $target 2>/dev/null && \
1996            target_list="$target_list $target"
1997    done
1998    target_list="${target_list# }"
1999else
2000    target_list=$(echo "$target_list" | sed -e 's/,/ /g')
2001    for target in $target_list; do
2002        # Check that we recognised the target name; this allows a more
2003        # friendly error message than if we let it fall through.
2004        case " $default_target_list " in
2005            *" $target "*)
2006                ;;
2007            *)
2008                error_exit "Unknown target name '$target'"
2009                ;;
2010        esac
2011        supported_target $target || exit 1
2012    done
2013fi
2014
2015# see if system emulation was really requested
2016case " $target_list " in
2017  *"-softmmu "*) softmmu=yes
2018  ;;
2019  *) softmmu=no
2020  ;;
2021esac
2022
2023feature_not_found() {
2024  feature=$1
2025  remedy=$2
2026
2027  error_exit "User requested feature $feature" \
2028      "configure was not able to find it." \
2029      "$remedy"
2030}
2031
2032# ---
2033# big/little endian test
2034cat > $TMPC << EOF
2035short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, };
2036short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, };
2037extern int foo(short *, short *);
2038int main(int argc, char *argv[]) {
2039    return foo(big_endian, little_endian);
2040}
2041EOF
2042
2043if compile_object ; then
2044    if strings -a $TMPO | grep -q BiGeNdIaN ; then
2045        bigendian="yes"
2046    elif strings -a $TMPO | grep -q LiTtLeEnDiAn ; then
2047        bigendian="no"
2048    else
2049        echo big/little test failed
2050    fi
2051else
2052    echo big/little test failed
2053fi
2054
2055##########################################
2056# cocoa implies not SDL or GTK
2057# (the cocoa UI code currently assumes it is always the active UI
2058# and doesn't interact well with other UI frontend code)
2059if test "$cocoa" = "yes"; then
2060    if test "$sdl" = "yes"; then
2061        error_exit "Cocoa and SDL UIs cannot both be enabled at once"
2062    fi
2063    if test "$gtk" = "yes"; then
2064        error_exit "Cocoa and GTK UIs cannot both be enabled at once"
2065    fi
2066    gtk=no
2067    sdl=no
2068fi
2069
2070# Some versions of Mac OS X incorrectly define SIZE_MAX
2071cat > $TMPC << EOF
2072#include <stdint.h>
2073#include <stdio.h>
2074int main(int argc, char *argv[]) {
2075    return printf("%zu", SIZE_MAX);
2076}
2077EOF
2078have_broken_size_max=no
2079if ! compile_object -Werror ; then
2080    have_broken_size_max=yes
2081fi
2082
2083##########################################
2084# L2TPV3 probe
2085
2086cat > $TMPC <<EOF
2087#include <sys/socket.h>
2088#include <linux/ip.h>
2089int main(void) { return sizeof(struct mmsghdr); }
2090EOF
2091if compile_prog "" "" ; then
2092  l2tpv3=yes
2093else
2094  l2tpv3=no
2095fi
2096
2097##########################################
2098# MinGW / Mingw-w64 localtime_r/gmtime_r check
2099
2100if test "$mingw32" = "yes"; then
2101    # Some versions of MinGW / Mingw-w64 lack localtime_r
2102    # and gmtime_r entirely.
2103    #
2104    # Some versions of Mingw-w64 define a macro for
2105    # localtime_r/gmtime_r.
2106    #
2107    # Some versions of Mingw-w64 will define functions
2108    # for localtime_r/gmtime_r, but only if you have
2109    # _POSIX_THREAD_SAFE_FUNCTIONS defined. For fun
2110    # though, unistd.h and pthread.h both define
2111    # that for you.
2112    #
2113    # So this #undef localtime_r and #include <unistd.h>
2114    # are not in fact redundant.
2115cat > $TMPC << EOF
2116#include <unistd.h>
2117#include <time.h>
2118#undef localtime_r
2119int main(void) { localtime_r(NULL, NULL); return 0; }
2120EOF
2121    if compile_prog "" "" ; then
2122        localtime_r="yes"
2123    else
2124        localtime_r="no"
2125    fi
2126fi
2127
2128##########################################
2129# pkg-config probe
2130
2131if ! has "$pkg_config_exe"; then
2132  error_exit "pkg-config binary '$pkg_config_exe' not found"
2133fi
2134
2135##########################################
2136# NPTL probe
2137
2138if test "$linux_user" = "yes"; then
2139  cat > $TMPC <<EOF
2140#include <sched.h>
2141#include <linux/futex.h>
2142int main(void) {
2143#if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
2144#error bork
2145#endif
2146  return 0;
2147}
2148EOF
2149  if ! compile_object ; then
2150    feature_not_found "nptl" "Install glibc and linux kernel headers."
2151  fi
2152fi
2153
2154#########################################
2155# zlib check
2156
2157if test "$zlib" != "no" ; then
2158    cat > $TMPC << EOF
2159#include <zlib.h>
2160int main(void) { zlibVersion(); return 0; }
2161EOF
2162    if compile_prog "" "-lz" ; then
2163        :
2164    else
2165        error_exit "zlib check failed" \
2166            "Make sure to have the zlib libs and headers installed."
2167    fi
2168fi
2169LIBS="$LIBS -lz"
2170
2171##########################################
2172# lzo check
2173
2174if test "$lzo" != "no" ; then
2175    cat > $TMPC << EOF
2176#include <lzo/lzo1x.h>
2177int main(void) { lzo_version(); return 0; }
2178EOF
2179    if compile_prog "" "-llzo2" ; then
2180        libs_softmmu="$libs_softmmu -llzo2"
2181        lzo="yes"
2182    else
2183        if test "$lzo" = "yes"; then
2184            feature_not_found "liblzo2" "Install liblzo2 devel"
2185        fi
2186        lzo="no"
2187    fi
2188fi
2189
2190##########################################
2191# snappy check
2192
2193if test "$snappy" != "no" ; then
2194    cat > $TMPC << EOF
2195#include <snappy-c.h>
2196int main(void) { snappy_max_compressed_length(4096); return 0; }
2197EOF
2198    if compile_prog "" "-lsnappy" ; then
2199        libs_softmmu="$libs_softmmu -lsnappy"
2200        snappy="yes"
2201    else
2202        if test "$snappy" = "yes"; then
2203            feature_not_found "libsnappy" "Install libsnappy devel"
2204        fi
2205        snappy="no"
2206    fi
2207fi
2208
2209##########################################
2210# bzip2 check
2211
2212if test "$bzip2" != "no" ; then
2213    cat > $TMPC << EOF
2214#include <bzlib.h>
2215int main(void) { BZ2_bzlibVersion(); return 0; }
2216EOF
2217    if compile_prog "" "-lbz2" ; then
2218        bzip2="yes"
2219    else
2220        if test "$bzip2" = "yes"; then
2221            feature_not_found "libbzip2" "Install libbzip2 devel"
2222        fi
2223        bzip2="no"
2224    fi
2225fi
2226
2227##########################################
2228# libseccomp check
2229
2230libseccomp_minver="2.2.0"
2231if test "$seccomp" != "no" ; then
2232    case "$cpu" in
2233    i386|x86_64|mips)
2234        ;;
2235    arm|aarch64)
2236        libseccomp_minver="2.2.3"
2237        ;;
2238    ppc|ppc64|s390x)
2239        libseccomp_minver="2.3.0"
2240        ;;
2241    *)
2242        libseccomp_minver=""
2243        ;;
2244    esac
2245
2246    if test "$libseccomp_minver" != "" &&
2247       $pkg_config --atleast-version=$libseccomp_minver libseccomp ; then
2248        seccomp_cflags="$($pkg_config --cflags libseccomp)"
2249        seccomp_libs="$($pkg_config --libs libseccomp)"
2250        seccomp="yes"
2251    else
2252        if test "$seccomp" = "yes" ; then
2253            if test "$libseccomp_minver" != "" ; then
2254                feature_not_found "libseccomp" \
2255                    "Install libseccomp devel >= $libseccomp_minver"
2256            else
2257                feature_not_found "libseccomp" \
2258                    "libseccomp is not supported for host cpu $cpu"
2259            fi
2260        fi
2261        seccomp="no"
2262    fi
2263fi
2264##########################################
2265# xen probe
2266
2267if test "$xen" != "no" ; then
2268  # Check whether Xen library path is specified via --extra-ldflags to avoid
2269  # overriding this setting with pkg-config output. If not, try pkg-config
2270  # to obtain all needed flags.
2271
2272  if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
2273     $pkg_config --exists xencontrol ; then
2274    xen_ctrl_version="$(printf '%d%02d%02d' \
2275      $($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
2276    xen=yes
2277    xen_pc="xencontrol xenstore xenguest xenforeignmemory xengnttab"
2278    xen_pc="$xen_pc xenevtchn xendevicemodel"
2279    if $pkg_config --exists xentoolcore; then
2280      xen_pc="$xen_pc xentoolcore"
2281    fi
2282    QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags $xen_pc)"
2283    libs_softmmu="$($pkg_config --libs $xen_pc) $libs_softmmu"
2284    LDFLAGS="$($pkg_config --libs $xen_pc) $LDFLAGS"
2285  else
2286
2287    xen_libs="-lxenstore -lxenctrl -lxenguest"
2288    xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
2289
2290    # First we test whether Xen headers and libraries are available.
2291    # If no, we are done and there is no Xen support.
2292    # If yes, more tests are run to detect the Xen version.
2293
2294    # Xen (any)
2295    cat > $TMPC <<EOF
2296#include <xenctrl.h>
2297int main(void) {
2298  return 0;
2299}
2300EOF
2301    if ! compile_prog "" "$xen_libs" ; then
2302      # Xen not found
2303      if test "$xen" = "yes" ; then
2304        feature_not_found "xen" "Install xen devel"
2305      fi
2306      xen=no
2307
2308    # Xen unstable
2309    elif
2310        cat > $TMPC <<EOF &&
2311#undef XC_WANT_COMPAT_DEVICEMODEL_API
2312#define __XEN_TOOLS__
2313#include <xendevicemodel.h>
2314#include <xenforeignmemory.h>
2315int main(void) {
2316  xendevicemodel_handle *xd;
2317  xenforeignmemory_handle *xfmem;
2318
2319  xd = xendevicemodel_open(0, 0);
2320  xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
2321
2322  xfmem = xenforeignmemory_open(0, 0);
2323  xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
2324
2325  return 0;
2326}
2327EOF
2328        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2329      then
2330      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2331      xen_ctrl_version=41100
2332      xen=yes
2333    elif
2334        cat > $TMPC <<EOF &&
2335#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2336#include <xenforeignmemory.h>
2337#include <xentoolcore.h>
2338int main(void) {
2339  xenforeignmemory_handle *xfmem;
2340
2341  xfmem = xenforeignmemory_open(0, 0);
2342  xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
2343  xentoolcore_restrict_all(0);
2344
2345  return 0;
2346}
2347EOF
2348        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2349      then
2350      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2351      xen_ctrl_version=41000
2352      xen=yes
2353    elif
2354        cat > $TMPC <<EOF &&
2355#undef XC_WANT_COMPAT_DEVICEMODEL_API
2356#define __XEN_TOOLS__
2357#include <xendevicemodel.h>
2358int main(void) {
2359  xendevicemodel_handle *xd;
2360
2361  xd = xendevicemodel_open(0, 0);
2362  xendevicemodel_close(xd);
2363
2364  return 0;
2365}
2366EOF
2367        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
2368      then
2369      xen_stable_libs="-lxendevicemodel $xen_stable_libs"
2370      xen_ctrl_version=40900
2371      xen=yes
2372    elif
2373        cat > $TMPC <<EOF &&
2374/*
2375 * If we have stable libs the we don't want the libxc compat
2376 * layers, regardless of what CFLAGS we may have been given.
2377 *
2378 * Also, check if xengnttab_grant_copy_segment_t is defined and
2379 * grant copy operation is implemented.
2380 */
2381#undef XC_WANT_COMPAT_EVTCHN_API
2382#undef XC_WANT_COMPAT_GNTTAB_API
2383#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2384#include <xenctrl.h>
2385#include <xenstore.h>
2386#include <xenevtchn.h>
2387#include <xengnttab.h>
2388#include <xenforeignmemory.h>
2389#include <stdint.h>
2390#include <xen/hvm/hvm_info_table.h>
2391#if !defined(HVM_MAX_VCPUS)
2392# error HVM_MAX_VCPUS not defined
2393#endif
2394int main(void) {
2395  xc_interface *xc = NULL;
2396  xenforeignmemory_handle *xfmem;
2397  xenevtchn_handle *xe;
2398  xengnttab_handle *xg;
2399  xen_domain_handle_t handle;
2400  xengnttab_grant_copy_segment_t* seg = NULL;
2401
2402  xs_daemon_open();
2403
2404  xc = xc_interface_open(0, 0, 0);
2405  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2406  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2407  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2408  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2409  xc_domain_create(xc, 0, handle, 0, NULL, NULL);
2410
2411  xfmem = xenforeignmemory_open(0, 0);
2412  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2413
2414  xe = xenevtchn_open(0, 0);
2415  xenevtchn_fd(xe);
2416
2417  xg = xengnttab_open(0, 0);
2418  xengnttab_grant_copy(xg, 0, seg);
2419
2420  return 0;
2421}
2422EOF
2423        compile_prog "" "$xen_libs $xen_stable_libs"
2424      then
2425      xen_ctrl_version=40800
2426      xen=yes
2427    elif
2428        cat > $TMPC <<EOF &&
2429/*
2430 * If we have stable libs the we don't want the libxc compat
2431 * layers, regardless of what CFLAGS we may have been given.
2432 */
2433#undef XC_WANT_COMPAT_EVTCHN_API
2434#undef XC_WANT_COMPAT_GNTTAB_API
2435#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2436#include <xenctrl.h>
2437#include <xenstore.h>
2438#include <xenevtchn.h>
2439#include <xengnttab.h>
2440#include <xenforeignmemory.h>
2441#include <stdint.h>
2442#include <xen/hvm/hvm_info_table.h>
2443#if !defined(HVM_MAX_VCPUS)
2444# error HVM_MAX_VCPUS not defined
2445#endif
2446int main(void) {
2447  xc_interface *xc = NULL;
2448  xenforeignmemory_handle *xfmem;
2449  xenevtchn_handle *xe;
2450  xengnttab_handle *xg;
2451  xen_domain_handle_t handle;
2452
2453  xs_daemon_open();
2454
2455  xc = xc_interface_open(0, 0, 0);
2456  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2457  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2458  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2459  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2460  xc_domain_create(xc, 0, handle, 0, NULL, NULL);
2461
2462  xfmem = xenforeignmemory_open(0, 0);
2463  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2464
2465  xe = xenevtchn_open(0, 0);
2466  xenevtchn_fd(xe);
2467
2468  xg = xengnttab_open(0, 0);
2469  xengnttab_map_grant_ref(xg, 0, 0, 0);
2470
2471  return 0;
2472}
2473EOF
2474        compile_prog "" "$xen_libs $xen_stable_libs"
2475      then
2476      xen_ctrl_version=40701
2477      xen=yes
2478    elif
2479        cat > $TMPC <<EOF &&
2480#include <xenctrl.h>
2481#include <stdint.h>
2482int main(void) {
2483  xc_interface *xc = NULL;
2484  xen_domain_handle_t handle;
2485  xc_domain_create(xc, 0, handle, 0, NULL, NULL);
2486  return 0;
2487}
2488EOF
2489        compile_prog "" "$xen_libs"
2490      then
2491      xen_ctrl_version=40700
2492      xen=yes
2493
2494    # Xen 4.6
2495    elif
2496        cat > $TMPC <<EOF &&
2497#include <xenctrl.h>
2498#include <xenstore.h>
2499#include <stdint.h>
2500#include <xen/hvm/hvm_info_table.h>
2501#if !defined(HVM_MAX_VCPUS)
2502# error HVM_MAX_VCPUS not defined
2503#endif
2504int main(void) {
2505  xc_interface *xc;
2506  xs_daemon_open();
2507  xc = xc_interface_open(0, 0, 0);
2508  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2509  xc_gnttab_open(NULL, 0);
2510  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2511  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2512  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2513  xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
2514  return 0;
2515}
2516EOF
2517        compile_prog "" "$xen_libs"
2518      then
2519      xen_ctrl_version=40600
2520      xen=yes
2521
2522    # Xen 4.5
2523    elif
2524        cat > $TMPC <<EOF &&
2525#include <xenctrl.h>
2526#include <xenstore.h>
2527#include <stdint.h>
2528#include <xen/hvm/hvm_info_table.h>
2529#if !defined(HVM_MAX_VCPUS)
2530# error HVM_MAX_VCPUS not defined
2531#endif
2532int main(void) {
2533  xc_interface *xc;
2534  xs_daemon_open();
2535  xc = xc_interface_open(0, 0, 0);
2536  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2537  xc_gnttab_open(NULL, 0);
2538  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2539  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2540  xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
2541  return 0;
2542}
2543EOF
2544        compile_prog "" "$xen_libs"
2545      then
2546      xen_ctrl_version=40500
2547      xen=yes
2548
2549    elif
2550        cat > $TMPC <<EOF &&
2551#include <xenctrl.h>
2552#include <xenstore.h>
2553#include <stdint.h>
2554#include <xen/hvm/hvm_info_table.h>
2555#if !defined(HVM_MAX_VCPUS)
2556# error HVM_MAX_VCPUS not defined
2557#endif
2558int main(void) {
2559  xc_interface *xc;
2560  xs_daemon_open();
2561  xc = xc_interface_open(0, 0, 0);
2562  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2563  xc_gnttab_open(NULL, 0);
2564  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2565  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2566  return 0;
2567}
2568EOF
2569        compile_prog "" "$xen_libs"
2570      then
2571      xen_ctrl_version=40200
2572      xen=yes
2573
2574    else
2575      if test "$xen" = "yes" ; then
2576        feature_not_found "xen (unsupported version)" \
2577                          "Install a supported xen (xen 4.2 or newer)"
2578      fi
2579      xen=no
2580    fi
2581
2582    if test "$xen" = yes; then
2583      if test $xen_ctrl_version -ge 40701  ; then
2584        libs_softmmu="$xen_stable_libs $libs_softmmu"
2585      fi
2586      libs_softmmu="$xen_libs $libs_softmmu"
2587    fi
2588  fi
2589fi
2590
2591if test "$xen_pci_passthrough" != "no"; then
2592  if test "$xen" = "yes" && test "$linux" = "yes"; then
2593    xen_pci_passthrough=yes
2594  else
2595    if test "$xen_pci_passthrough" = "yes"; then
2596      error_exit "User requested feature Xen PCI Passthrough" \
2597          " but this feature requires /sys from Linux"
2598    fi
2599    xen_pci_passthrough=no
2600  fi
2601fi
2602
2603if test "$xen_pv_domain_build" = "yes" &&
2604   test "$xen" != "yes"; then
2605    error_exit "User requested Xen PV domain builder support" \
2606	       "which requires Xen support."
2607fi
2608
2609##########################################
2610# Windows Hypervisor Platform accelerator (WHPX) check
2611if test "$whpx" != "no" ; then
2612    if check_include "WinHvPlatform.h" && check_include "WinHvEmulation.h"; then
2613        whpx="yes"
2614    else
2615        if test "$whpx" = "yes"; then
2616            feature_not_found "WinHvPlatform" "WinHvEmulation is not installed"
2617        fi
2618        whpx="no"
2619    fi
2620fi
2621
2622##########################################
2623# Sparse probe
2624if test "$sparse" != "no" ; then
2625  if has cgcc; then
2626    sparse=yes
2627  else
2628    if test "$sparse" = "yes" ; then
2629      feature_not_found "sparse" "Install sparse binary"
2630    fi
2631    sparse=no
2632  fi
2633fi
2634
2635##########################################
2636# X11 probe
2637if $pkg_config --exists "x11"; then
2638    have_x11=yes
2639    x11_cflags=$($pkg_config --cflags x11)
2640    x11_libs=$($pkg_config --libs x11)
2641fi
2642
2643##########################################
2644# GTK probe
2645
2646if test "$gtk" != "no"; then
2647    gtkpackage="gtk+-3.0"
2648    gtkx11package="gtk+-x11-3.0"
2649    gtkversion="3.14.0"
2650    if $pkg_config --exists "$gtkpackage >= $gtkversion"; then
2651        gtk_cflags=$($pkg_config --cflags $gtkpackage)
2652        gtk_libs=$($pkg_config --libs $gtkpackage)
2653        gtk_version=$($pkg_config --modversion $gtkpackage)
2654        if $pkg_config --exists "$gtkx11package >= $gtkversion"; then
2655            need_x11=yes
2656            gtk_cflags="$gtk_cflags $x11_cflags"
2657            gtk_libs="$gtk_libs $x11_libs"
2658        fi
2659        gtk="yes"
2660    elif test "$gtk" = "yes"; then
2661        feature_not_found "gtk" "Install gtk3-devel"
2662    else
2663        gtk="no"
2664    fi
2665fi
2666
2667
2668##########################################
2669# GNUTLS probe
2670
2671if test "$gnutls" != "no"; then
2672    if $pkg_config --exists "gnutls >= 3.1.18"; then
2673        gnutls_cflags=$($pkg_config --cflags gnutls)
2674        gnutls_libs=$($pkg_config --libs gnutls)
2675        libs_softmmu="$gnutls_libs $libs_softmmu"
2676        libs_tools="$gnutls_libs $libs_tools"
2677	QEMU_CFLAGS="$QEMU_CFLAGS $gnutls_cflags"
2678        gnutls="yes"
2679    elif test "$gnutls" = "yes"; then
2680	feature_not_found "gnutls" "Install gnutls devel >= 3.1.18"
2681    else
2682        gnutls="no"
2683    fi
2684fi
2685
2686
2687# If user didn't give a --disable/enable-gcrypt flag,
2688# then mark as disabled if user requested nettle
2689# explicitly
2690if test -z "$gcrypt"
2691then
2692    if test "$nettle" = "yes"
2693    then
2694        gcrypt="no"
2695    fi
2696fi
2697
2698# If user didn't give a --disable/enable-nettle flag,
2699# then mark as disabled if user requested gcrypt
2700# explicitly
2701if test -z "$nettle"
2702then
2703    if test "$gcrypt" = "yes"
2704    then
2705        nettle="no"
2706    fi
2707fi
2708
2709has_libgcrypt() {
2710    if ! has "libgcrypt-config"
2711    then
2712	return 1
2713    fi
2714
2715    if test -n "$cross_prefix"
2716    then
2717	host=$(libgcrypt-config --host)
2718	if test "$host-" != $cross_prefix
2719	then
2720	    return 1
2721	fi
2722    fi
2723
2724    maj=`libgcrypt-config --version | awk -F . '{print $1}'`
2725    min=`libgcrypt-config --version | awk -F . '{print $2}'`
2726
2727    if test $maj != 1 || test $min -lt 5
2728    then
2729       return 1
2730    fi
2731
2732    return 0
2733}
2734
2735
2736if test "$nettle" != "no"; then
2737    if $pkg_config --exists "nettle >= 2.7.1"; then
2738        nettle_cflags=$($pkg_config --cflags nettle)
2739        nettle_libs=$($pkg_config --libs nettle)
2740        nettle_version=$($pkg_config --modversion nettle)
2741        libs_softmmu="$nettle_libs $libs_softmmu"
2742        libs_tools="$nettle_libs $libs_tools"
2743        QEMU_CFLAGS="$QEMU_CFLAGS $nettle_cflags"
2744        nettle="yes"
2745
2746        if test -z "$gcrypt"; then
2747           gcrypt="no"
2748        fi
2749    else
2750        if test "$nettle" = "yes"; then
2751            feature_not_found "nettle" "Install nettle devel >= 2.7.1"
2752        else
2753            nettle="no"
2754        fi
2755    fi
2756fi
2757
2758if test "$gcrypt" != "no"; then
2759    if has_libgcrypt; then
2760        gcrypt_cflags=$(libgcrypt-config --cflags)
2761        gcrypt_libs=$(libgcrypt-config --libs)
2762        # Debian has remove -lgpg-error from libgcrypt-config
2763        # as it "spreads unnecessary dependencies" which in
2764        # turn breaks static builds...
2765        if test "$static" = "yes"
2766        then
2767            gcrypt_libs="$gcrypt_libs -lgpg-error"
2768        fi
2769        libs_softmmu="$gcrypt_libs $libs_softmmu"
2770        libs_tools="$gcrypt_libs $libs_tools"
2771        QEMU_CFLAGS="$QEMU_CFLAGS $gcrypt_cflags"
2772        gcrypt="yes"
2773
2774        cat > $TMPC << EOF
2775#include <gcrypt.h>
2776int main(void) {
2777  gcry_mac_hd_t handle;
2778  gcry_mac_open(&handle, GCRY_MAC_HMAC_MD5,
2779                GCRY_MAC_FLAG_SECURE, NULL);
2780  return 0;
2781}
2782EOF
2783        if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
2784            gcrypt_hmac=yes
2785        fi
2786    else
2787        if test "$gcrypt" = "yes"; then
2788            feature_not_found "gcrypt" "Install gcrypt devel >= 1.5.0"
2789        else
2790            gcrypt="no"
2791        fi
2792    fi
2793fi
2794
2795
2796if test "$gcrypt" = "yes" && test "$nettle" = "yes"
2797then
2798    error_exit "Only one of gcrypt & nettle can be enabled"
2799fi
2800
2801##########################################
2802# libtasn1 - only for the TLS creds/session test suite
2803
2804tasn1=yes
2805tasn1_cflags=""
2806tasn1_libs=""
2807if $pkg_config --exists "libtasn1"; then
2808    tasn1_cflags=$($pkg_config --cflags libtasn1)
2809    tasn1_libs=$($pkg_config --libs libtasn1)
2810else
2811    tasn1=no
2812fi
2813
2814
2815##########################################
2816# getifaddrs (for tests/test-io-channel-socket )
2817
2818have_ifaddrs_h=yes
2819if ! check_include "ifaddrs.h" ; then
2820  have_ifaddrs_h=no
2821fi
2822
2823##########################################
2824# VTE probe
2825
2826if test "$vte" != "no"; then
2827    vteminversion="0.32.0"
2828    if $pkg_config --exists "vte-2.91"; then
2829      vtepackage="vte-2.91"
2830    else
2831      vtepackage="vte-2.90"
2832    fi
2833    if $pkg_config --exists "$vtepackage >= $vteminversion"; then
2834        vte_cflags=$($pkg_config --cflags $vtepackage)
2835        vte_libs=$($pkg_config --libs $vtepackage)
2836        vteversion=$($pkg_config --modversion $vtepackage)
2837        vte="yes"
2838    elif test "$vte" = "yes"; then
2839        feature_not_found "vte" "Install libvte-2.90/2.91 devel"
2840    else
2841        vte="no"
2842    fi
2843fi
2844
2845##########################################
2846# SDL probe
2847
2848# Look for sdl configuration program (pkg-config or sdl-config).  Try
2849# sdl-config even without cross prefix, and favour pkg-config over sdl-config.
2850
2851sdl_probe ()
2852{
2853  sdl_too_old=no
2854  if test "$sdlabi" = ""; then
2855      if $pkg_config --exists "sdl2"; then
2856          sdlabi=2.0
2857      elif $pkg_config --exists "sdl"; then
2858          sdlabi=1.2
2859      else
2860          sdlabi=2.0
2861      fi
2862  fi
2863
2864  if test $sdlabi = "2.0"; then
2865      sdl_config=$sdl2_config
2866      sdlname=sdl2
2867      sdlconfigname=sdl2_config
2868  elif test $sdlabi = "1.2"; then
2869      sdlname=sdl
2870      sdlconfigname=sdl_config
2871  else
2872      error_exit "Unknown sdlabi $sdlabi, must be 1.2 or 2.0"
2873  fi
2874
2875  if test "$(basename $sdl_config)" != $sdlconfigname && ! has ${sdl_config}; then
2876    sdl_config=$sdlconfigname
2877  fi
2878
2879  if $pkg_config $sdlname --exists; then
2880    sdlconfig="$pkg_config $sdlname"
2881    sdlversion=$($sdlconfig --modversion 2>/dev/null)
2882  elif has ${sdl_config}; then
2883    sdlconfig="$sdl_config"
2884    sdlversion=$($sdlconfig --version)
2885  else
2886    if test "$sdl" = "yes" ; then
2887      feature_not_found "sdl" "Install SDL2-devel"
2888    fi
2889    sdl=no
2890    # no need to do the rest
2891    return
2892  fi
2893  if test -n "$cross_prefix" && test "$(basename "$sdlconfig")" = sdl-config; then
2894    echo warning: using "\"$sdlconfig\"" to detect cross-compiled sdl >&2
2895  fi
2896
2897  cat > $TMPC << EOF
2898#include <SDL.h>
2899#undef main /* We don't want SDL to override our main() */
2900int main( void ) { return SDL_Init (SDL_INIT_VIDEO); }
2901EOF
2902  sdl_cflags=$($sdlconfig --cflags 2>/dev/null)
2903  sdl_cflags="$sdl_cflags -Wno-undef"  # workaround 2.0.8 bug
2904  if test "$static" = "yes" ; then
2905    if $pkg_config $sdlname --exists; then
2906      sdl_libs=$($pkg_config $sdlname --static --libs 2>/dev/null)
2907    else
2908      sdl_libs=$($sdlconfig --static-libs 2>/dev/null)
2909    fi
2910  else
2911    sdl_libs=$($sdlconfig --libs 2>/dev/null)
2912  fi
2913  if compile_prog "$sdl_cflags" "$sdl_libs" ; then
2914    if test $(echo $sdlversion | sed 's/[^0-9]//g') -lt 121 ; then
2915      sdl_too_old=yes
2916    else
2917      sdl=yes
2918    fi
2919
2920    # static link with sdl ? (note: sdl.pc's --static --libs is broken)
2921    if test "$sdl" = "yes" -a "$static" = "yes" ; then
2922      if test $? = 0 && echo $sdl_libs | grep -- -laa > /dev/null; then
2923         sdl_libs="$sdl_libs $(aalib-config --static-libs 2>/dev/null)"
2924         sdl_cflags="$sdl_cflags $(aalib-config --cflags 2>/dev/null)"
2925      fi
2926      if compile_prog "$sdl_cflags" "$sdl_libs" ; then
2927	:
2928      else
2929        sdl=no
2930      fi
2931    fi # static link
2932  else # sdl not found
2933    if test "$sdl" = "yes" ; then
2934      feature_not_found "sdl" "Install SDL devel"
2935    fi
2936    sdl=no
2937  fi # sdl compile test
2938}
2939
2940if test "$sdl" != "no" ; then
2941  sdl_probe
2942fi
2943
2944if test "$sdl" = "yes" ; then
2945  cat > $TMPC <<EOF
2946#include <SDL.h>
2947#if defined(SDL_VIDEO_DRIVER_X11)
2948#include <X11/XKBlib.h>
2949#else
2950#error No x11 support
2951#endif
2952int main(void) { return 0; }
2953EOF
2954  if compile_prog "$sdl_cflags $x11_cflags" "$sdl_libs $x11_libs" ; then
2955    need_x11=yes
2956    sdl_cflags="$sdl_cflags $x11_cflags"
2957    sdl_libs="$sdl_libs $x11_libs"
2958  fi
2959fi
2960
2961##########################################
2962# RDMA needs OpenFabrics libraries
2963if test "$rdma" != "no" ; then
2964  cat > $TMPC <<EOF
2965#include <rdma/rdma_cma.h>
2966int main(void) { return 0; }
2967EOF
2968  rdma_libs="-lrdmacm -libverbs -libumad"
2969  if compile_prog "" "$rdma_libs" ; then
2970    rdma="yes"
2971    libs_softmmu="$libs_softmmu $rdma_libs"
2972  else
2973    if test "$rdma" = "yes" ; then
2974        error_exit \
2975            " OpenFabrics librdmacm/libibverbs/libibumad not present." \
2976            " Your options:" \
2977            "  (1) Fast: Install infiniband packages (devel) from your distro." \
2978            "  (2) Cleanest: Install libraries from www.openfabrics.org" \
2979            "  (3) Also: Install softiwarp if you don't have RDMA hardware"
2980    fi
2981    rdma="no"
2982  fi
2983fi
2984
2985##########################################
2986# PVRDMA detection
2987
2988cat > $TMPC <<EOF &&
2989#include <sys/mman.h>
2990
2991int
2992main(void)
2993{
2994    char buf = 0;
2995    void *addr = &buf;
2996    addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
2997
2998    return 0;
2999}
3000EOF
3001
3002if test "$rdma" = "yes" ; then
3003    case "$pvrdma" in
3004    "")
3005        if compile_prog "" ""; then
3006            pvrdma="yes"
3007        else
3008            pvrdma="no"
3009        fi
3010        ;;
3011    "yes")
3012        if ! compile_prog "" ""; then
3013            error_exit "PVRDMA is not supported since mremap is not implemented"
3014        fi
3015        pvrdma="yes"
3016        ;;
3017    "no")
3018        pvrdma="no"
3019        ;;
3020    esac
3021else
3022    if test "$pvrdma" = "yes" ; then
3023        error_exit "PVRDMA requires rdma suppport"
3024    fi
3025    pvrdma="no"
3026fi
3027
3028##########################################
3029# VNC SASL detection
3030if test "$vnc" = "yes" -a "$vnc_sasl" != "no" ; then
3031  cat > $TMPC <<EOF
3032#include <sasl/sasl.h>
3033#include <stdio.h>
3034int main(void) { sasl_server_init(NULL, "qemu"); return 0; }
3035EOF
3036  # Assuming Cyrus-SASL installed in /usr prefix
3037  vnc_sasl_cflags=""
3038  vnc_sasl_libs="-lsasl2"
3039  if compile_prog "$vnc_sasl_cflags" "$vnc_sasl_libs" ; then
3040    vnc_sasl=yes
3041    libs_softmmu="$vnc_sasl_libs $libs_softmmu"
3042    QEMU_CFLAGS="$QEMU_CFLAGS $vnc_sasl_cflags"
3043  else
3044    if test "$vnc_sasl" = "yes" ; then
3045      feature_not_found "vnc-sasl" "Install Cyrus SASL devel"
3046    fi
3047    vnc_sasl=no
3048  fi
3049fi
3050
3051##########################################
3052# VNC JPEG detection
3053if test "$vnc" = "yes" -a "$vnc_jpeg" != "no" ; then
3054cat > $TMPC <<EOF
3055#include <stdio.h>
3056#include <jpeglib.h>
3057int main(void) { struct jpeg_compress_struct s; jpeg_create_compress(&s); return 0; }
3058EOF
3059    vnc_jpeg_cflags=""
3060    vnc_jpeg_libs="-ljpeg"
3061  if compile_prog "$vnc_jpeg_cflags" "$vnc_jpeg_libs" ; then
3062    vnc_jpeg=yes
3063    libs_softmmu="$vnc_jpeg_libs $libs_softmmu"
3064    QEMU_CFLAGS="$QEMU_CFLAGS $vnc_jpeg_cflags"
3065  else
3066    if test "$vnc_jpeg" = "yes" ; then
3067      feature_not_found "vnc-jpeg" "Install libjpeg-turbo devel"
3068    fi
3069    vnc_jpeg=no
3070  fi
3071fi
3072
3073##########################################
3074# VNC PNG detection
3075if test "$vnc" = "yes" -a "$vnc_png" != "no" ; then
3076cat > $TMPC <<EOF
3077//#include <stdio.h>
3078#include <png.h>
3079#include <stddef.h>
3080int main(void) {
3081    png_structp png_ptr;
3082    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
3083    return png_ptr != 0;
3084}
3085EOF
3086  if $pkg_config libpng --exists; then
3087    vnc_png_cflags=$($pkg_config libpng --cflags)
3088    vnc_png_libs=$($pkg_config libpng --libs)
3089  else
3090    vnc_png_cflags=""
3091    vnc_png_libs="-lpng"
3092  fi
3093  if compile_prog "$vnc_png_cflags" "$vnc_png_libs" ; then
3094    vnc_png=yes
3095    libs_softmmu="$vnc_png_libs $libs_softmmu"
3096    QEMU_CFLAGS="$QEMU_CFLAGS $vnc_png_cflags"
3097  else
3098    if test "$vnc_png" = "yes" ; then
3099      feature_not_found "vnc-png" "Install libpng devel"
3100    fi
3101    vnc_png=no
3102  fi
3103fi
3104
3105##########################################
3106# xkbcommon probe
3107if test "$xkbcommon" != "no" ; then
3108  if $pkg_config xkbcommon --exists; then
3109    xkbcommon_cflags=$($pkg_config xkbcommon --cflags)
3110    xkbcommon_libs=$($pkg_config xkbcommon --libs)
3111    xkbcommon=yes
3112  else
3113    if test "$xkbcommon" = "yes" ; then
3114      feature_not_found "xkbcommon" "Install libxkbcommon-devel"
3115    fi
3116    xkbcommon=no
3117  fi
3118fi
3119
3120##########################################
3121# fnmatch() probe, used for ACL routines
3122fnmatch="no"
3123cat > $TMPC << EOF
3124#include <fnmatch.h>
3125int main(void)
3126{
3127    fnmatch("foo", "foo", 0);
3128    return 0;
3129}
3130EOF
3131if compile_prog "" "" ; then
3132   fnmatch="yes"
3133fi
3134
3135##########################################
3136# xfsctl() probe, used for file-posix.c
3137if test "$xfs" != "no" ; then
3138  cat > $TMPC << EOF
3139#include <stddef.h>  /* NULL */
3140#include <xfs/xfs.h>
3141int main(void)
3142{
3143    xfsctl(NULL, 0, 0, NULL);
3144    return 0;
3145}
3146EOF
3147  if compile_prog "" "" ; then
3148    xfs="yes"
3149  else
3150    if test "$xfs" = "yes" ; then
3151      feature_not_found "xfs" "Instal xfsprogs/xfslibs devel"
3152    fi
3153    xfs=no
3154  fi
3155fi
3156
3157##########################################
3158# vde libraries probe
3159if test "$vde" != "no" ; then
3160  vde_libs="-lvdeplug"
3161  cat > $TMPC << EOF
3162#include <libvdeplug.h>
3163int main(void)
3164{
3165    struct vde_open_args a = {0, 0, 0};
3166    char s[] = "";
3167    vde_open(s, s, &a);
3168    return 0;
3169}
3170EOF
3171  if compile_prog "" "$vde_libs" ; then
3172    vde=yes
3173  else
3174    if test "$vde" = "yes" ; then
3175      feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
3176    fi
3177    vde=no
3178  fi
3179fi
3180
3181##########################################
3182# netmap support probe
3183# Apart from looking for netmap headers, we make sure that the host API version
3184# supports the netmap backend (>=11). The upper bound (15) is meant to simulate
3185# a minor/major version number. Minor new features will be marked with values up
3186# to 15, and if something happens that requires a change to the backend we will
3187# move above 15, submit the backend fixes and modify this two bounds.
3188if test "$netmap" != "no" ; then
3189  cat > $TMPC << EOF
3190#include <inttypes.h>
3191#include <net/if.h>
3192#include <net/netmap.h>
3193#include <net/netmap_user.h>
3194#if (NETMAP_API < 11) || (NETMAP_API > 15)
3195#error
3196#endif
3197int main(void) { return 0; }
3198EOF
3199  if compile_prog "" "" ; then
3200    netmap=yes
3201  else
3202    if test "$netmap" = "yes" ; then
3203      feature_not_found "netmap"
3204    fi
3205    netmap=no
3206  fi
3207fi
3208
3209##########################################
3210# libcap-ng library probe
3211if test "$cap_ng" != "no" ; then
3212  cap_libs="-lcap-ng"
3213  cat > $TMPC << EOF
3214#include <cap-ng.h>
3215int main(void)
3216{
3217    capng_capability_to_name(CAPNG_EFFECTIVE);
3218    return 0;
3219}
3220EOF
3221  if compile_prog "" "$cap_libs" ; then
3222    cap_ng=yes
3223    libs_tools="$cap_libs $libs_tools"
3224  else
3225    if test "$cap_ng" = "yes" ; then
3226      feature_not_found "cap_ng" "Install libcap-ng devel"
3227    fi
3228    cap_ng=no
3229  fi
3230fi
3231
3232##########################################
3233# Sound support libraries probe
3234
3235audio_drv_probe()
3236{
3237    drv=$1
3238    hdr=$2
3239    lib=$3
3240    exp=$4
3241    cfl=$5
3242        cat > $TMPC << EOF
3243#include <$hdr>
3244int main(void) { $exp }
3245EOF
3246    if compile_prog "$cfl" "$lib" ; then
3247        :
3248    else
3249        error_exit "$drv check failed" \
3250            "Make sure to have the $drv libs and headers installed."
3251    fi
3252}
3253
3254audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
3255for drv in $audio_drv_list; do
3256    case $drv in
3257    alsa)
3258    audio_drv_probe $drv alsa/asoundlib.h -lasound \
3259        "return snd_pcm_close((snd_pcm_t *)0);"
3260    alsa_libs="-lasound"
3261    ;;
3262
3263    pa)
3264    audio_drv_probe $drv pulse/pulseaudio.h "-lpulse" \
3265        "pa_context_set_source_output_volume(NULL, 0, NULL, NULL, NULL); return 0;"
3266    pulse_libs="-lpulse"
3267    audio_pt_int="yes"
3268    ;;
3269
3270    sdl)
3271    if test "$sdl" = "no"; then
3272        error_exit "sdl not found or disabled, can not use sdl audio driver"
3273    fi
3274    ;;
3275
3276    coreaudio)
3277      coreaudio_libs="-framework CoreAudio"
3278    ;;
3279
3280    dsound)
3281      dsound_libs="-lole32 -ldxguid"
3282      audio_win_int="yes"
3283    ;;
3284
3285    oss)
3286      oss_libs="$oss_lib"
3287    ;;
3288
3289    wav)
3290    # XXX: Probes for CoreAudio, DirectSound
3291    ;;
3292
3293    *)
3294    echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
3295        error_exit "Unknown driver '$drv' selected" \
3296            "Possible drivers are: $audio_possible_drivers"
3297    }
3298    ;;
3299    esac
3300done
3301
3302##########################################
3303# BrlAPI probe
3304
3305if test "$brlapi" != "no" ; then
3306  brlapi_libs="-lbrlapi"
3307  cat > $TMPC << EOF
3308#include <brlapi.h>
3309#include <stddef.h>
3310int main( void ) { return brlapi__openConnection (NULL, NULL, NULL); }
3311EOF
3312  if compile_prog "" "$brlapi_libs" ; then
3313    brlapi=yes
3314  else
3315    if test "$brlapi" = "yes" ; then
3316      feature_not_found "brlapi" "Install brlapi devel"
3317    fi
3318    brlapi=no
3319  fi
3320fi
3321
3322##########################################
3323# curses probe
3324if test "$curses" != "no" ; then
3325  if test "$mingw32" = "yes" ; then
3326    curses_inc_list="$($pkg_config --cflags ncurses 2>/dev/null):"
3327    curses_lib_list="$($pkg_config --libs ncurses 2>/dev/null):-lpdcurses"
3328  else
3329    curses_inc_list="$($pkg_config --cflags ncursesw 2>/dev/null):-I/usr/include/ncursesw:"
3330    curses_lib_list="$($pkg_config --libs ncursesw 2>/dev/null):-lncursesw:-lcursesw"
3331  fi
3332  curses_found=no
3333  cat > $TMPC << EOF
3334#include <locale.h>
3335#include <curses.h>
3336#include <wchar.h>
3337int main(void) {
3338  wchar_t wch = L'w';
3339  setlocale(LC_ALL, "");
3340  resize_term(0, 0);
3341  addwstr(L"wide chars\n");
3342  addnwstr(&wch, 1);
3343  add_wch(WACS_DEGREE);
3344  return 0;
3345}
3346EOF
3347  IFS=:
3348  for curses_inc in $curses_inc_list; do
3349    # Make sure we get the wide character prototypes
3350    curses_inc="-DNCURSES_WIDECHAR $curses_inc"
3351    IFS=:
3352    for curses_lib in $curses_lib_list; do
3353      unset IFS
3354      if compile_prog "$curses_inc" "$curses_lib" ; then
3355        curses_found=yes
3356        break
3357      fi
3358    done
3359    if test "$curses_found" = yes ; then
3360      break
3361    fi
3362  done
3363  unset IFS
3364  if test "$curses_found" = "yes" ; then
3365    curses=yes
3366  else
3367    if test "$curses" = "yes" ; then
3368      feature_not_found "curses" "Install ncurses devel"
3369    fi
3370    curses=no
3371  fi
3372fi
3373
3374##########################################
3375# curl probe
3376if test "$curl" != "no" ; then
3377  if $pkg_config libcurl --exists; then
3378    curlconfig="$pkg_config libcurl"
3379  else
3380    curlconfig=curl-config
3381  fi
3382  cat > $TMPC << EOF
3383#include <curl/curl.h>
3384int main(void) { curl_easy_init(); curl_multi_setopt(0, 0, 0); return 0; }
3385EOF
3386  curl_cflags=$($curlconfig --cflags 2>/dev/null)
3387  curl_libs=$($curlconfig --libs 2>/dev/null)
3388  if compile_prog "$curl_cflags" "$curl_libs" ; then
3389    curl=yes
3390  else
3391    if test "$curl" = "yes" ; then
3392      feature_not_found "curl" "Install libcurl devel"
3393    fi
3394    curl=no
3395  fi
3396fi # test "$curl"
3397
3398##########################################
3399# bluez support probe
3400if test "$bluez" != "no" ; then
3401  cat > $TMPC << EOF
3402#include <bluetooth/bluetooth.h>
3403int main(void) { return bt_error(0); }
3404EOF
3405  bluez_cflags=$($pkg_config --cflags bluez 2>/dev/null)
3406  bluez_libs=$($pkg_config --libs bluez 2>/dev/null)
3407  if compile_prog "$bluez_cflags" "$bluez_libs" ; then
3408    bluez=yes
3409    libs_softmmu="$bluez_libs $libs_softmmu"
3410  else
3411    if test "$bluez" = "yes" ; then
3412      feature_not_found "bluez" "Install bluez-libs/libbluetooth devel"
3413    fi
3414    bluez="no"
3415  fi
3416fi
3417
3418##########################################
3419# glib support probe
3420
3421glib_req_ver=2.40
3422glib_modules=gthread-2.0
3423if test "$modules" = yes; then
3424    glib_modules="$glib_modules gmodule-export-2.0"
3425fi
3426
3427# This workaround is required due to a bug in pkg-config file for glib as it
3428# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
3429
3430if test "$static" = yes -a "$mingw32" = yes; then
3431    QEMU_CFLAGS="-DGLIB_STATIC_COMPILATION $QEMU_CFLAGS"
3432fi
3433
3434for i in $glib_modules; do
3435    if $pkg_config --atleast-version=$glib_req_ver $i; then
3436        glib_cflags=$($pkg_config --cflags $i)
3437        glib_libs=$($pkg_config --libs $i)
3438        QEMU_CFLAGS="$glib_cflags $QEMU_CFLAGS"
3439        LIBS="$glib_libs $LIBS"
3440        libs_qga="$glib_libs $libs_qga"
3441    else
3442        error_exit "glib-$glib_req_ver $i is required to compile QEMU"
3443    fi
3444done
3445
3446# Sanity check that the current size_t matches the
3447# size that glib thinks it should be. This catches
3448# problems on multi-arch where people try to build
3449# 32-bit QEMU while pointing at 64-bit glib headers
3450cat > $TMPC <<EOF
3451#include <glib.h>
3452#include <unistd.h>
3453
3454#define QEMU_BUILD_BUG_ON(x) \
3455  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
3456
3457int main(void) {
3458   QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
3459   return 0;
3460}
3461EOF
3462
3463if ! compile_prog "$CFLAGS" "$LIBS" ; then
3464    error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
3465               "You probably need to set PKG_CONFIG_LIBDIR"\
3466	       "to point to the right pkg-config files for your"\
3467	       "build target"
3468fi
3469
3470# Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
3471cat > $TMPC << EOF
3472#include <glib.h>
3473int main(void) { return 0; }
3474EOF
3475if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3476    if cc_has_warning_flag "-Wno-unknown-attributes"; then
3477        glib_cflags="-Wno-unknown-attributes $glib_cflags"
3478        CFLAGS="-Wno-unknown-attributes $CFLAGS"
3479    fi
3480fi
3481
3482##########################################
3483# SHA command probe for modules
3484if test "$modules" = yes; then
3485    shacmd_probe="sha1sum sha1 shasum"
3486    for c in $shacmd_probe; do
3487        if has $c; then
3488            shacmd="$c"
3489            break
3490        fi
3491    done
3492    if test "$shacmd" = ""; then
3493        error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
3494    fi
3495fi
3496
3497##########################################
3498# pixman support probe
3499
3500if test "$want_tools" = "no" -a "$softmmu" = "no"; then
3501  pixman_cflags=
3502  pixman_libs=
3503elif $pkg_config --atleast-version=0.21.8 pixman-1 > /dev/null 2>&1; then
3504  pixman_cflags=$($pkg_config --cflags pixman-1)
3505  pixman_libs=$($pkg_config --libs pixman-1)
3506else
3507  error_exit "pixman >= 0.21.8 not present." \
3508      "Please install the pixman devel package."
3509fi
3510
3511##########################################
3512# libmpathpersist probe
3513
3514if test "$mpath" != "no" ; then
3515  # probe for the new API
3516  cat > $TMPC <<EOF
3517#include <libudev.h>
3518#include <mpath_persist.h>
3519unsigned mpath_mx_alloc_len = 1024;
3520int logsink;
3521static struct config *multipath_conf;
3522extern struct udev *udev;
3523extern struct config *get_multipath_config(void);
3524extern void put_multipath_config(struct config *conf);
3525struct udev *udev;
3526struct config *get_multipath_config(void) { return multipath_conf; }
3527void put_multipath_config(struct config *conf) { }
3528
3529int main(void) {
3530    udev = udev_new();
3531    multipath_conf = mpath_lib_init();
3532    return 0;
3533}
3534EOF
3535  if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
3536    mpathpersist=yes
3537    mpathpersist_new_api=yes
3538  else
3539    # probe for the old API
3540    cat > $TMPC <<EOF
3541#include <libudev.h>
3542#include <mpath_persist.h>
3543unsigned mpath_mx_alloc_len = 1024;
3544int logsink;
3545int main(void) {
3546    struct udev *udev = udev_new();
3547    mpath_lib_init(udev);
3548    return 0;
3549}
3550EOF
3551    if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
3552      mpathpersist=yes
3553      mpathpersist_new_api=no
3554    else
3555      mpathpersist=no
3556    fi
3557  fi
3558else
3559  mpathpersist=no
3560fi
3561
3562##########################################
3563# libcap probe
3564
3565if test "$cap" != "no" ; then
3566  cat > $TMPC <<EOF
3567#include <stdio.h>
3568#include <sys/capability.h>
3569int main(void) { cap_t caps; caps = cap_init(); return caps != NULL; }
3570EOF
3571  if compile_prog "" "-lcap" ; then
3572    cap=yes
3573  else
3574    cap=no
3575  fi
3576fi
3577
3578##########################################
3579# pthread probe
3580PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
3581
3582pthread=no
3583cat > $TMPC << EOF
3584#include <pthread.h>
3585static void *f(void *p) { return NULL; }
3586int main(void) {
3587  pthread_t thread;
3588  pthread_create(&thread, 0, f, 0);
3589  return 0;
3590}
3591EOF
3592if compile_prog "" "" ; then
3593  pthread=yes
3594else
3595  for pthread_lib in $PTHREADLIBS_LIST; do
3596    if compile_prog "" "$pthread_lib" ; then
3597      pthread=yes
3598      found=no
3599      for lib_entry in $LIBS; do
3600        if test "$lib_entry" = "$pthread_lib"; then
3601          found=yes
3602          break
3603        fi
3604      done
3605      if test "$found" = "no"; then
3606        LIBS="$pthread_lib $LIBS"
3607        libs_qga="$pthread_lib $libs_qga"
3608      fi
3609      PTHREAD_LIB="$pthread_lib"
3610      break
3611    fi
3612  done
3613fi
3614
3615if test "$mingw32" != yes -a "$pthread" = no; then
3616  error_exit "pthread check failed" \
3617      "Make sure to have the pthread libs and headers installed."
3618fi
3619
3620# check for pthread_setname_np
3621pthread_setname_np=no
3622cat > $TMPC << EOF
3623#include <pthread.h>
3624
3625static void *f(void *p) { return NULL; }
3626int main(void)
3627{
3628    pthread_t thread;
3629    pthread_create(&thread, 0, f, 0);
3630    pthread_setname_np(thread, "QEMU");
3631    return 0;
3632}
3633EOF
3634if compile_prog "" "$pthread_lib" ; then
3635  pthread_setname_np=yes
3636fi
3637
3638##########################################
3639# rbd probe
3640if test "$rbd" != "no" ; then
3641  cat > $TMPC <<EOF
3642#include <stdio.h>
3643#include <rbd/librbd.h>
3644int main(void) {
3645    rados_t cluster;
3646    rados_create(&cluster, NULL);
3647    return 0;
3648}
3649EOF
3650  rbd_libs="-lrbd -lrados"
3651  if compile_prog "" "$rbd_libs" ; then
3652    rbd=yes
3653  else
3654    if test "$rbd" = "yes" ; then
3655      feature_not_found "rados block device" "Install librbd/ceph devel"
3656    fi
3657    rbd=no
3658  fi
3659fi
3660
3661##########################################
3662# libssh2 probe
3663min_libssh2_version=1.2.8
3664if test "$libssh2" != "no" ; then
3665  if $pkg_config --atleast-version=$min_libssh2_version libssh2; then
3666    libssh2_cflags=$($pkg_config libssh2 --cflags)
3667    libssh2_libs=$($pkg_config libssh2 --libs)
3668    libssh2=yes
3669  else
3670    if test "$libssh2" = "yes" ; then
3671      error_exit "libssh2 >= $min_libssh2_version required for --enable-libssh2"
3672    fi
3673    libssh2=no
3674  fi
3675fi
3676
3677##########################################
3678# libssh2_sftp_fsync probe
3679
3680if test "$libssh2" = "yes"; then
3681  cat > $TMPC <<EOF
3682#include <stdio.h>
3683#include <libssh2.h>
3684#include <libssh2_sftp.h>
3685int main(void) {
3686    LIBSSH2_SESSION *session;
3687    LIBSSH2_SFTP *sftp;
3688    LIBSSH2_SFTP_HANDLE *sftp_handle;
3689    session = libssh2_session_init ();
3690    sftp = libssh2_sftp_init (session);
3691    sftp_handle = libssh2_sftp_open (sftp, "/", 0, 0);
3692    libssh2_sftp_fsync (sftp_handle);
3693    return 0;
3694}
3695EOF
3696  # libssh2_cflags/libssh2_libs defined in previous test.
3697  if compile_prog "$libssh2_cflags" "$libssh2_libs" ; then
3698    QEMU_CFLAGS="-DHAS_LIBSSH2_SFTP_FSYNC $QEMU_CFLAGS"
3699  fi
3700fi
3701
3702##########################################
3703# linux-aio probe
3704
3705if test "$linux_aio" != "no" ; then
3706  cat > $TMPC <<EOF
3707#include <libaio.h>
3708#include <sys/eventfd.h>
3709#include <stddef.h>
3710int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
3711EOF
3712  if compile_prog "" "-laio" ; then
3713    linux_aio=yes
3714  else
3715    if test "$linux_aio" = "yes" ; then
3716      feature_not_found "linux AIO" "Install libaio devel"
3717    fi
3718    linux_aio=no
3719  fi
3720fi
3721
3722##########################################
3723# TPM passthrough is only on x86 Linux
3724
3725if test "$targetos" = Linux && test "$cpu" = i386 -o "$cpu" = x86_64; then
3726  tpm_passthrough=$tpm
3727else
3728  tpm_passthrough=no
3729fi
3730
3731# TPM emulator is for all posix systems
3732if test "$mingw32" != "yes"; then
3733  tpm_emulator=$tpm
3734else
3735  tpm_emulator=no
3736fi
3737##########################################
3738# attr probe
3739
3740if test "$attr" != "no" ; then
3741  cat > $TMPC <<EOF
3742#include <stdio.h>
3743#include <sys/types.h>
3744#ifdef CONFIG_LIBATTR
3745#include <attr/xattr.h>
3746#else
3747#include <sys/xattr.h>
3748#endif
3749int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }
3750EOF
3751  if compile_prog "" "" ; then
3752    attr=yes
3753  # Older distros have <attr/xattr.h>, and need -lattr:
3754  elif compile_prog "-DCONFIG_LIBATTR" "-lattr" ; then
3755    attr=yes
3756    LIBS="-lattr $LIBS"
3757    libattr=yes
3758  else
3759    if test "$attr" = "yes" ; then
3760      feature_not_found "ATTR" "Install libc6 or libattr devel"
3761    fi
3762    attr=no
3763  fi
3764fi
3765
3766##########################################
3767# iovec probe
3768cat > $TMPC <<EOF
3769#include <sys/types.h>
3770#include <sys/uio.h>
3771#include <unistd.h>
3772int main(void) { return sizeof(struct iovec); }
3773EOF
3774iovec=no
3775if compile_prog "" "" ; then
3776  iovec=yes
3777fi
3778
3779##########################################
3780# preadv probe
3781cat > $TMPC <<EOF
3782#include <sys/types.h>
3783#include <sys/uio.h>
3784#include <unistd.h>
3785int main(void) { return preadv(0, 0, 0, 0); }
3786EOF
3787preadv=no
3788if compile_prog "" "" ; then
3789  preadv=yes
3790fi
3791
3792##########################################
3793# fdt probe
3794# fdt support is mandatory for at least some target architectures,
3795# so insist on it if we're building those system emulators.
3796fdt_required=no
3797for target in $target_list; do
3798  case $target in
3799    aarch64*-softmmu|arm*-softmmu|ppc*-softmmu|microblaze*-softmmu|mips64el-softmmu|riscv*-softmmu)
3800      fdt_required=yes
3801    ;;
3802  esac
3803done
3804
3805if test "$fdt_required" = "yes"; then
3806  if test "$fdt" = "no"; then
3807    error_exit "fdt disabled but some requested targets require it." \
3808      "You can turn off fdt only if you also disable all the system emulation" \
3809      "targets which need it (by specifying a cut down --target-list)."
3810  fi
3811  fdt=yes
3812fi
3813
3814if test "$fdt" != "no" ; then
3815  fdt_libs="-lfdt"
3816  # explicitly check for libfdt_env.h as it is missing in some stable installs
3817  # and test for required functions to make sure we are on a version >= 1.4.2
3818  cat > $TMPC << EOF
3819#include <libfdt.h>
3820#include <libfdt_env.h>
3821int main(void) { fdt_first_subnode(0, 0); return 0; }
3822EOF
3823  if compile_prog "" "$fdt_libs" ; then
3824    # system DTC is good - use it
3825    fdt=system
3826  else
3827      # have GIT checkout, so activate dtc submodule
3828      if test -e "${source_path}/.git" ; then
3829          git_submodules="${git_submodules} dtc"
3830      fi
3831      if test -d "${source_path}/dtc/libfdt" || test -e "${source_path}/.git" ; then
3832          fdt=git
3833          mkdir -p dtc
3834          if [ "$pwd_is_source_path" != "y" ] ; then
3835              symlink "$source_path/dtc/Makefile" "dtc/Makefile"
3836              symlink "$source_path/dtc/scripts" "dtc/scripts"
3837          fi
3838          fdt_cflags="-I\$(SRC_PATH)/dtc/libfdt"
3839          fdt_ldflags="-L\$(BUILD_DIR)/dtc/libfdt"
3840          fdt_libs="$fdt_libs"
3841      elif test "$fdt" = "yes" ; then
3842          # Not a git build & no libfdt found, prompt for system install
3843          error_exit "DTC (libfdt) version >= 1.4.2 not present." \
3844                     "Please install the DTC (libfdt) devel package"
3845      else
3846          # don't have and don't want
3847          fdt_libs=
3848          fdt=no
3849      fi
3850  fi
3851fi
3852
3853libs_softmmu="$libs_softmmu $fdt_libs"
3854
3855##########################################
3856# opengl probe (for sdl2, gtk, milkymist-tmu2)
3857
3858if test "$opengl" != "no" ; then
3859  opengl_pkgs="epoxy gbm"
3860  if $pkg_config $opengl_pkgs; then
3861    opengl_cflags="$($pkg_config --cflags $opengl_pkgs)"
3862    opengl_libs="$($pkg_config --libs $opengl_pkgs)"
3863    opengl=yes
3864    if test "$gtk" = "yes" && $pkg_config --exists "$gtkpackage >= 3.16"; then
3865        gtk_gl="yes"
3866    fi
3867    QEMU_CFLAGS="$QEMU_CFLAGS $opengl_cflags"
3868  else
3869    if test "$opengl" = "yes" ; then
3870      feature_not_found "opengl" "Please install opengl (mesa) devel pkgs: $opengl_pkgs"
3871    fi
3872    opengl_cflags=""
3873    opengl_libs=""
3874    opengl=no
3875  fi
3876fi
3877
3878if test "$opengl" = "yes"; then
3879  cat > $TMPC << EOF
3880#include <epoxy/egl.h>
3881#ifndef EGL_MESA_image_dma_buf_export
3882# error mesa/epoxy lacks support for dmabufs (mesa 10.6+)
3883#endif
3884int main(void) { return 0; }
3885EOF
3886  if compile_prog "" "" ; then
3887    opengl_dmabuf=yes
3888  fi
3889fi
3890
3891##########################################
3892# libxml2 probe
3893if test "$libxml2" != "no" ; then
3894    if $pkg_config --exists libxml-2.0; then
3895        libxml2="yes"
3896        libxml2_cflags=$($pkg_config --cflags libxml-2.0)
3897        libxml2_libs=$($pkg_config --libs libxml-2.0)
3898    else
3899        if test "$libxml2" = "yes"; then
3900            feature_not_found "libxml2" "Install libxml2 devel"
3901        fi
3902        libxml2="no"
3903    fi
3904fi
3905
3906##########################################
3907# glusterfs probe
3908if test "$glusterfs" != "no" ; then
3909  if $pkg_config --atleast-version=3 glusterfs-api; then
3910    glusterfs="yes"
3911    glusterfs_cflags=$($pkg_config --cflags glusterfs-api)
3912    glusterfs_libs=$($pkg_config --libs glusterfs-api)
3913    if $pkg_config --atleast-version=4 glusterfs-api; then
3914      glusterfs_xlator_opt="yes"
3915    fi
3916    if $pkg_config --atleast-version=5 glusterfs-api; then
3917      glusterfs_discard="yes"
3918    fi
3919    if $pkg_config --atleast-version=6 glusterfs-api; then
3920      glusterfs_fallocate="yes"
3921      glusterfs_zerofill="yes"
3922    fi
3923  else
3924    if test "$glusterfs" = "yes" ; then
3925      feature_not_found "GlusterFS backend support" \
3926          "Install glusterfs-api devel >= 3"
3927    fi
3928    glusterfs="no"
3929  fi
3930fi
3931
3932# Check for inotify functions when we are building linux-user
3933# emulator.  This is done because older glibc versions don't
3934# have syscall stubs for these implemented.  In that case we
3935# don't provide them even if kernel supports them.
3936#
3937inotify=no
3938cat > $TMPC << EOF
3939#include <sys/inotify.h>
3940
3941int
3942main(void)
3943{
3944	/* try to start inotify */
3945	return inotify_init();
3946}
3947EOF
3948if compile_prog "" "" ; then
3949  inotify=yes
3950fi
3951
3952inotify1=no
3953cat > $TMPC << EOF
3954#include <sys/inotify.h>
3955
3956int
3957main(void)
3958{
3959    /* try to start inotify */
3960    return inotify_init1(0);
3961}
3962EOF
3963if compile_prog "" "" ; then
3964  inotify1=yes
3965fi
3966
3967# check if pipe2 is there
3968pipe2=no
3969cat > $TMPC << EOF
3970#include <unistd.h>
3971#include <fcntl.h>
3972
3973int main(void)
3974{
3975    int pipefd[2];
3976    return pipe2(pipefd, O_CLOEXEC);
3977}
3978EOF
3979if compile_prog "" "" ; then
3980  pipe2=yes
3981fi
3982
3983# check if accept4 is there
3984accept4=no
3985cat > $TMPC << EOF
3986#include <sys/socket.h>
3987#include <stddef.h>
3988
3989int main(void)
3990{
3991    accept4(0, NULL, NULL, SOCK_CLOEXEC);
3992    return 0;
3993}
3994EOF
3995if compile_prog "" "" ; then
3996  accept4=yes
3997fi
3998
3999# check if tee/splice is there. vmsplice was added same time.
4000splice=no
4001cat > $TMPC << EOF
4002#include <unistd.h>
4003#include <fcntl.h>
4004#include <limits.h>
4005
4006int main(void)
4007{
4008    int len, fd = 0;
4009    len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
4010    splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
4011    return 0;
4012}
4013EOF
4014if compile_prog "" "" ; then
4015  splice=yes
4016fi
4017
4018##########################################
4019# libnuma probe
4020
4021if test "$numa" != "no" ; then
4022  cat > $TMPC << EOF
4023#include <numa.h>
4024int main(void) { return numa_available(); }
4025EOF
4026
4027  if compile_prog "" "-lnuma" ; then
4028    numa=yes
4029    libs_softmmu="-lnuma $libs_softmmu"
4030  else
4031    if test "$numa" = "yes" ; then
4032      feature_not_found "numa" "install numactl devel"
4033    fi
4034    numa=no
4035  fi
4036fi
4037
4038if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
4039    echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
4040    exit 1
4041fi
4042
4043# Even if malloc_trim() is available, these non-libc memory allocators
4044# do not support it.
4045if test "$tcmalloc" = "yes" || test "$jemalloc" = "yes" ; then
4046    if test "$malloc_trim" = "yes" ; then
4047        echo "Disabling malloc_trim with non-libc memory allocator"
4048    fi
4049    malloc_trim="no"
4050fi
4051
4052#######################################
4053# malloc_trim
4054
4055if test "$malloc_trim" != "no" ; then
4056    cat > $TMPC << EOF
4057#include <malloc.h>
4058int main(void) { malloc_trim(0); return 0; }
4059EOF
4060    if compile_prog "" "" ; then
4061        malloc_trim="yes"
4062    else
4063        malloc_trim="no"
4064    fi
4065fi
4066
4067##########################################
4068# tcmalloc probe
4069
4070if test "$tcmalloc" = "yes" ; then
4071  cat > $TMPC << EOF
4072#include <stdlib.h>
4073int main(void) { malloc(1); return 0; }
4074EOF
4075
4076  if compile_prog "" "-ltcmalloc" ; then
4077    LIBS="-ltcmalloc $LIBS"
4078  else
4079    feature_not_found "tcmalloc" "install gperftools devel"
4080  fi
4081fi
4082
4083##########################################
4084# jemalloc probe
4085
4086if test "$jemalloc" = "yes" ; then
4087  cat > $TMPC << EOF
4088#include <stdlib.h>
4089int main(void) { malloc(1); return 0; }
4090EOF
4091
4092  if compile_prog "" "-ljemalloc" ; then
4093    LIBS="-ljemalloc $LIBS"
4094  else
4095    feature_not_found "jemalloc" "install jemalloc devel"
4096  fi
4097fi
4098
4099##########################################
4100# signalfd probe
4101signalfd="no"
4102cat > $TMPC << EOF
4103#include <unistd.h>
4104#include <sys/syscall.h>
4105#include <signal.h>
4106int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }
4107EOF
4108
4109if compile_prog "" "" ; then
4110  signalfd=yes
4111fi
4112
4113# check if eventfd is supported
4114eventfd=no
4115cat > $TMPC << EOF
4116#include <sys/eventfd.h>
4117
4118int main(void)
4119{
4120    return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
4121}
4122EOF
4123if compile_prog "" "" ; then
4124  eventfd=yes
4125fi
4126
4127# check if memfd is supported
4128memfd=no
4129cat > $TMPC << EOF
4130#include <sys/mman.h>
4131
4132int main(void)
4133{
4134    return memfd_create("foo", MFD_ALLOW_SEALING);
4135}
4136EOF
4137if compile_prog "" "" ; then
4138  memfd=yes
4139fi
4140
4141# check for usbfs
4142have_usbfs=no
4143if test "$linux_user" = "yes"; then
4144  if check_include linux/usbdevice_fs.h; then
4145    have_usbfs=yes
4146  fi
4147  have_usbfs=yes
4148fi
4149
4150# check for fallocate
4151fallocate=no
4152cat > $TMPC << EOF
4153#include <fcntl.h>
4154
4155int main(void)
4156{
4157    fallocate(0, 0, 0, 0);
4158    return 0;
4159}
4160EOF
4161if compile_prog "" "" ; then
4162  fallocate=yes
4163fi
4164
4165# check for fallocate hole punching
4166fallocate_punch_hole=no
4167cat > $TMPC << EOF
4168#include <fcntl.h>
4169#include <linux/falloc.h>
4170
4171int main(void)
4172{
4173    fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
4174    return 0;
4175}
4176EOF
4177if compile_prog "" "" ; then
4178  fallocate_punch_hole=yes
4179fi
4180
4181# check that fallocate supports range zeroing inside the file
4182fallocate_zero_range=no
4183cat > $TMPC << EOF
4184#include <fcntl.h>
4185#include <linux/falloc.h>
4186
4187int main(void)
4188{
4189    fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0);
4190    return 0;
4191}
4192EOF
4193if compile_prog "" "" ; then
4194  fallocate_zero_range=yes
4195fi
4196
4197# check for posix_fallocate
4198posix_fallocate=no
4199cat > $TMPC << EOF
4200#include <fcntl.h>
4201
4202int main(void)
4203{
4204    posix_fallocate(0, 0, 0);
4205    return 0;
4206}
4207EOF
4208if compile_prog "" "" ; then
4209    posix_fallocate=yes
4210fi
4211
4212# check for sync_file_range
4213sync_file_range=no
4214cat > $TMPC << EOF
4215#include <fcntl.h>
4216
4217int main(void)
4218{
4219    sync_file_range(0, 0, 0, 0);
4220    return 0;
4221}
4222EOF
4223if compile_prog "" "" ; then
4224  sync_file_range=yes
4225fi
4226
4227# check for linux/fiemap.h and FS_IOC_FIEMAP
4228fiemap=no
4229cat > $TMPC << EOF
4230#include <sys/ioctl.h>
4231#include <linux/fs.h>
4232#include <linux/fiemap.h>
4233
4234int main(void)
4235{
4236    ioctl(0, FS_IOC_FIEMAP, 0);
4237    return 0;
4238}
4239EOF
4240if compile_prog "" "" ; then
4241  fiemap=yes
4242fi
4243
4244# check for dup3
4245dup3=no
4246cat > $TMPC << EOF
4247#include <unistd.h>
4248
4249int main(void)
4250{
4251    dup3(0, 0, 0);
4252    return 0;
4253}
4254EOF
4255if compile_prog "" "" ; then
4256  dup3=yes
4257fi
4258
4259# check for ppoll support
4260ppoll=no
4261cat > $TMPC << EOF
4262#include <poll.h>
4263
4264int main(void)
4265{
4266    struct pollfd pfd = { .fd = 0, .events = 0, .revents = 0 };
4267    ppoll(&pfd, 1, 0, 0);
4268    return 0;
4269}
4270EOF
4271if compile_prog "" "" ; then
4272  ppoll=yes
4273fi
4274
4275# check for prctl(PR_SET_TIMERSLACK , ... ) support
4276prctl_pr_set_timerslack=no
4277cat > $TMPC << EOF
4278#include <sys/prctl.h>
4279
4280int main(void)
4281{
4282    prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0);
4283    return 0;
4284}
4285EOF
4286if compile_prog "" "" ; then
4287  prctl_pr_set_timerslack=yes
4288fi
4289
4290# check for epoll support
4291epoll=no
4292cat > $TMPC << EOF
4293#include <sys/epoll.h>
4294
4295int main(void)
4296{
4297    epoll_create(0);
4298    return 0;
4299}
4300EOF
4301if compile_prog "" "" ; then
4302  epoll=yes
4303fi
4304
4305# epoll_create1 is a later addition
4306# so we must check separately for its presence
4307epoll_create1=no
4308cat > $TMPC << EOF
4309#include <sys/epoll.h>
4310
4311int main(void)
4312{
4313    /* Note that we use epoll_create1 as a value, not as
4314     * a function being called. This is necessary so that on
4315     * old SPARC glibc versions where the function was present in
4316     * the library but not declared in the header file we will
4317     * fail the configure check. (Otherwise we will get a compiler
4318     * warning but not an error, and will proceed to fail the
4319     * qemu compile where we compile with -Werror.)
4320     */
4321    return (int)(uintptr_t)&epoll_create1;
4322}
4323EOF
4324if compile_prog "" "" ; then
4325  epoll_create1=yes
4326fi
4327
4328# check for sendfile support
4329sendfile=no
4330cat > $TMPC << EOF
4331#include <sys/sendfile.h>
4332
4333int main(void)
4334{
4335    return sendfile(0, 0, 0, 0);
4336}
4337EOF
4338if compile_prog "" "" ; then
4339  sendfile=yes
4340fi
4341
4342# check for timerfd support (glibc 2.8 and newer)
4343timerfd=no
4344cat > $TMPC << EOF
4345#include <sys/timerfd.h>
4346
4347int main(void)
4348{
4349    return(timerfd_create(CLOCK_REALTIME, 0));
4350}
4351EOF
4352if compile_prog "" "" ; then
4353  timerfd=yes
4354fi
4355
4356# check for setns and unshare support
4357setns=no
4358cat > $TMPC << EOF
4359#include <sched.h>
4360
4361int main(void)
4362{
4363    int ret;
4364    ret = setns(0, 0);
4365    ret = unshare(0);
4366    return ret;
4367}
4368EOF
4369if compile_prog "" "" ; then
4370  setns=yes
4371fi
4372
4373# clock_adjtime probe
4374clock_adjtime=no
4375cat > $TMPC <<EOF
4376#include <time.h>
4377
4378int main(void)
4379{
4380    return clock_adjtime(0, 0);
4381}
4382EOF
4383clock_adjtime=no
4384if compile_prog "" "" ; then
4385  clock_adjtime=yes
4386fi
4387
4388# syncfs probe
4389syncfs=no
4390cat > $TMPC <<EOF
4391#include <unistd.h>
4392
4393int main(void)
4394{
4395    return syncfs(0);
4396}
4397EOF
4398syncfs=no
4399if compile_prog "" "" ; then
4400  syncfs=yes
4401fi
4402
4403# Check if tools are available to build documentation.
4404if test "$docs" != "no" ; then
4405  if has makeinfo && has pod2man; then
4406    docs=yes
4407  else
4408    if test "$docs" = "yes" ; then
4409      feature_not_found "docs" "Install texinfo and Perl/perl-podlators"
4410    fi
4411    docs=no
4412  fi
4413fi
4414
4415# Search for bswap_32 function
4416byteswap_h=no
4417cat > $TMPC << EOF
4418#include <byteswap.h>
4419int main(void) { return bswap_32(0); }
4420EOF
4421if compile_prog "" "" ; then
4422  byteswap_h=yes
4423fi
4424
4425# Search for bswap32 function
4426bswap_h=no
4427cat > $TMPC << EOF
4428#include <sys/endian.h>
4429#include <sys/types.h>
4430#include <machine/bswap.h>
4431int main(void) { return bswap32(0); }
4432EOF
4433if compile_prog "" "" ; then
4434  bswap_h=yes
4435fi
4436
4437##########################################
4438# Do we have libiscsi >= 1.9.0
4439if test "$libiscsi" != "no" ; then
4440  if $pkg_config --atleast-version=1.9.0 libiscsi; then
4441    libiscsi="yes"
4442    libiscsi_cflags=$($pkg_config --cflags libiscsi)
4443    libiscsi_libs=$($pkg_config --libs libiscsi)
4444  else
4445    if test "$libiscsi" = "yes" ; then
4446      feature_not_found "libiscsi" "Install libiscsi >= 1.9.0"
4447    fi
4448    libiscsi="no"
4449  fi
4450fi
4451
4452##########################################
4453# Do we need libm
4454cat > $TMPC << EOF
4455#include <math.h>
4456int main(int argc, char **argv) { return isnan(sin((double)argc)); }
4457EOF
4458if compile_prog "" "" ; then
4459  :
4460elif compile_prog "" "-lm" ; then
4461  LIBS="-lm $LIBS"
4462  libs_qga="-lm $libs_qga"
4463else
4464  error_exit "libm check failed"
4465fi
4466
4467##########################################
4468# Do we need librt
4469# uClibc provides 2 versions of clock_gettime(), one with realtime
4470# support and one without. This means that the clock_gettime() don't
4471# need -lrt. We still need it for timer_create() so we check for this
4472# function in addition.
4473cat > $TMPC <<EOF
4474#include <signal.h>
4475#include <time.h>
4476int main(void) {
4477  timer_create(CLOCK_REALTIME, NULL, NULL);
4478  return clock_gettime(CLOCK_REALTIME, NULL);
4479}
4480EOF
4481
4482if compile_prog "" "" ; then
4483  :
4484# we need pthread for static linking. use previous pthread test result
4485elif compile_prog "" "$pthread_lib -lrt" ; then
4486  LIBS="$LIBS -lrt"
4487  libs_qga="$libs_qga -lrt"
4488fi
4489
4490if test "$darwin" != "yes" -a "$mingw32" != "yes" -a "$solaris" != yes -a \
4491        "$haiku" != "yes" ; then
4492    libs_softmmu="-lutil $libs_softmmu"
4493fi
4494
4495##########################################
4496# spice probe
4497if test "$spice" != "no" ; then
4498  cat > $TMPC << EOF
4499#include <spice.h>
4500int main(void) { spice_server_new(); return 0; }
4501EOF
4502  spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
4503  spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
4504  if $pkg_config --atleast-version=0.12.0 spice-server && \
4505     $pkg_config --atleast-version=0.12.3 spice-protocol && \
4506     compile_prog "$spice_cflags" "$spice_libs" ; then
4507    spice="yes"
4508    libs_softmmu="$libs_softmmu $spice_libs"
4509    QEMU_CFLAGS="$QEMU_CFLAGS $spice_cflags"
4510    spice_protocol_version=$($pkg_config --modversion spice-protocol)
4511    spice_server_version=$($pkg_config --modversion spice-server)
4512  else
4513    if test "$spice" = "yes" ; then
4514      feature_not_found "spice" \
4515          "Install spice-server(>=0.12.0) and spice-protocol(>=0.12.3) devel"
4516    fi
4517    spice="no"
4518  fi
4519fi
4520
4521# check for smartcard support
4522if test "$smartcard" != "no"; then
4523    if $pkg_config --atleast-version=2.5.1 libcacard; then
4524        libcacard_cflags=$($pkg_config --cflags libcacard)
4525        libcacard_libs=$($pkg_config --libs libcacard)
4526        smartcard="yes"
4527    else
4528        if test "$smartcard" = "yes"; then
4529            feature_not_found "smartcard" "Install libcacard devel"
4530        fi
4531        smartcard="no"
4532    fi
4533fi
4534
4535# check for libusb
4536if test "$libusb" != "no" ; then
4537    if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
4538        libusb="yes"
4539        libusb_cflags=$($pkg_config --cflags libusb-1.0)
4540        libusb_libs=$($pkg_config --libs libusb-1.0)
4541    else
4542        if test "$libusb" = "yes"; then
4543            feature_not_found "libusb" "Install libusb devel >= 1.0.13"
4544        fi
4545        libusb="no"
4546    fi
4547fi
4548
4549# check for usbredirparser for usb network redirection support
4550if test "$usb_redir" != "no" ; then
4551    if $pkg_config --atleast-version=0.6 libusbredirparser-0.5; then
4552        usb_redir="yes"
4553        usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5)
4554        usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5)
4555    else
4556        if test "$usb_redir" = "yes"; then
4557            feature_not_found "usb-redir" "Install usbredir devel"
4558        fi
4559        usb_redir="no"
4560    fi
4561fi
4562
4563##########################################
4564# check if we have VSS SDK headers for win
4565
4566if test "$mingw32" = "yes" -a "$guest_agent" != "no" -a "$vss_win32_sdk" != "no" ; then
4567  case "$vss_win32_sdk" in
4568    "")   vss_win32_include="-isystem $source_path" ;;
4569    *\ *) # The SDK is installed in "Program Files" by default, but we cannot
4570          # handle path with spaces. So we symlink the headers into ".sdk/vss".
4571          vss_win32_include="-isystem $source_path/.sdk/vss"
4572	  symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
4573	  ;;
4574    *)    vss_win32_include="-isystem $vss_win32_sdk"
4575  esac
4576  cat > $TMPC << EOF
4577#define __MIDL_user_allocate_free_DEFINED__
4578#include <inc/win2003/vss.h>
4579int main(void) { return VSS_CTX_BACKUP; }
4580EOF
4581  if compile_prog "$vss_win32_include" "" ; then
4582    guest_agent_with_vss="yes"
4583    QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
4584    libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
4585    qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
4586  else
4587    if test "$vss_win32_sdk" != "" ; then
4588      echo "ERROR: Please download and install Microsoft VSS SDK:"
4589      echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
4590      echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
4591      echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
4592      echo "ERROR: The headers are extracted in the directory \`inc'."
4593      feature_not_found "VSS support"
4594    fi
4595    guest_agent_with_vss="no"
4596  fi
4597fi
4598
4599##########################################
4600# lookup Windows platform SDK (if not specified)
4601# The SDK is needed only to build .tlb (type library) file of guest agent
4602# VSS provider from the source. It is usually unnecessary because the
4603# pre-compiled .tlb file is included.
4604
4605if test "$mingw32" = "yes" -a "$guest_agent" != "no" -a "$guest_agent_with_vss" = "yes" ; then
4606  if test -z "$win_sdk"; then
4607    programfiles="$PROGRAMFILES"
4608    test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
4609    if test -n "$programfiles"; then
4610      win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
4611    else
4612      feature_not_found "Windows SDK"
4613    fi
4614  elif test "$win_sdk" = "no"; then
4615    win_sdk=""
4616  fi
4617fi
4618
4619##########################################
4620# check if mingw environment provides a recent ntddscsi.h
4621if test "$mingw32" = "yes" -a "$guest_agent" != "no"; then
4622  cat > $TMPC << EOF
4623#include <windows.h>
4624#include <ntddscsi.h>
4625int main(void) {
4626#if !defined(IOCTL_SCSI_GET_ADDRESS)
4627#error Missing required ioctl definitions
4628#endif
4629  SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
4630  return addr.Lun;
4631}
4632EOF
4633  if compile_prog "" "" ; then
4634    guest_agent_ntddscsi=yes
4635    libs_qga="-lsetupapi $libs_qga"
4636  fi
4637fi
4638
4639##########################################
4640# virgl renderer probe
4641
4642if test "$virglrenderer" != "no" ; then
4643  cat > $TMPC << EOF
4644#include <virglrenderer.h>
4645int main(void) { virgl_renderer_poll(); return 0; }
4646EOF
4647  virgl_cflags=$($pkg_config --cflags virglrenderer 2>/dev/null)
4648  virgl_libs=$($pkg_config --libs virglrenderer 2>/dev/null)
4649  virgl_version=$($pkg_config --modversion virglrenderer 2>/dev/null)
4650  if $pkg_config virglrenderer >/dev/null 2>&1 && \
4651     compile_prog "$virgl_cflags" "$virgl_libs" ; then
4652    virglrenderer="yes"
4653  else
4654    if test "$virglrenderer" = "yes" ; then
4655      feature_not_found "virglrenderer"
4656    fi
4657    virglrenderer="no"
4658  fi
4659fi
4660
4661##########################################
4662# capstone
4663
4664case "$capstone" in
4665  "" | yes)
4666    if $pkg_config capstone; then
4667      capstone=system
4668    elif test -e "${source_path}/.git" -a $git_update = 'yes' ; then
4669      capstone=git
4670    elif test -e "${source_path}/capstone/Makefile" ; then
4671      capstone=internal
4672    elif test -z "$capstone" ; then
4673      capstone=no
4674    else
4675      feature_not_found "capstone" "Install capstone devel or git submodule"
4676    fi
4677    ;;
4678
4679  system)
4680    if ! $pkg_config capstone; then
4681      feature_not_found "capstone" "Install capstone devel"
4682    fi
4683    ;;
4684esac
4685
4686case "$capstone" in
4687  git | internal)
4688    if test "$capstone" = git; then
4689      git_submodules="${git_submodules} capstone"
4690    fi
4691    mkdir -p capstone
4692    QEMU_CFLAGS="$QEMU_CFLAGS -I\$(SRC_PATH)/capstone/include"
4693    if test "$mingw32" = "yes"; then
4694      LIBCAPSTONE=capstone.lib
4695    else
4696      LIBCAPSTONE=libcapstone.a
4697    fi
4698    LIBS="-L\$(BUILD_DIR)/capstone -lcapstone $LIBS"
4699    ;;
4700
4701  system)
4702    QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags capstone)"
4703    LIBS="$($pkg_config --libs capstone) $LIBS"
4704    ;;
4705
4706  no)
4707    ;;
4708  *)
4709    error_exit "Unknown state for capstone: $capstone"
4710    ;;
4711esac
4712
4713##########################################
4714# check if we have fdatasync
4715
4716fdatasync=no
4717cat > $TMPC << EOF
4718#include <unistd.h>
4719int main(void) {
4720#if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
4721return fdatasync(0);
4722#else
4723#error Not supported
4724#endif
4725}
4726EOF
4727if compile_prog "" "" ; then
4728    fdatasync=yes
4729fi
4730
4731##########################################
4732# check if we have madvise
4733
4734madvise=no
4735cat > $TMPC << EOF
4736#include <sys/types.h>
4737#include <sys/mman.h>
4738#include <stddef.h>
4739int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }
4740EOF
4741if compile_prog "" "" ; then
4742    madvise=yes
4743fi
4744
4745##########################################
4746# check if we have posix_madvise
4747
4748posix_madvise=no
4749cat > $TMPC << EOF
4750#include <sys/mman.h>
4751#include <stddef.h>
4752int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }
4753EOF
4754if compile_prog "" "" ; then
4755    posix_madvise=yes
4756fi
4757
4758##########################################
4759# check if we have posix_memalign()
4760
4761posix_memalign=no
4762cat > $TMPC << EOF
4763#include <stdlib.h>
4764int main(void) {
4765    void *p;
4766    return posix_memalign(&p, 8, 8);
4767}
4768EOF
4769if compile_prog "" "" ; then
4770    posix_memalign=yes
4771fi
4772
4773##########################################
4774# check if we have posix_syslog
4775
4776posix_syslog=no
4777cat > $TMPC << EOF
4778#include <syslog.h>
4779int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; }
4780EOF
4781if compile_prog "" "" ; then
4782    posix_syslog=yes
4783fi
4784
4785##########################################
4786# check if we have sem_timedwait
4787
4788sem_timedwait=no
4789cat > $TMPC << EOF
4790#include <semaphore.h>
4791int main(void) { return sem_timedwait(0, 0); }
4792EOF
4793if compile_prog "" "" ; then
4794    sem_timedwait=yes
4795fi
4796
4797##########################################
4798# check if we have strchrnul
4799
4800strchrnul=no
4801cat > $TMPC << EOF
4802#include <string.h>
4803int main(void);
4804// Use a haystack that the compiler shouldn't be able to constant fold
4805char *haystack = (char*)&main;
4806int main(void) { return strchrnul(haystack, 'x') != &haystack[6]; }
4807EOF
4808if compile_prog "" "" ; then
4809    strchrnul=yes
4810fi
4811
4812##########################################
4813# check if trace backend exists
4814
4815$python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
4816if test "$?" -ne 0 ; then
4817  error_exit "invalid trace backends" \
4818      "Please choose supported trace backends."
4819fi
4820
4821##########################################
4822# For 'ust' backend, test if ust headers are present
4823if have_backend "ust"; then
4824  cat > $TMPC << EOF
4825#include <lttng/tracepoint.h>
4826int main(void) { return 0; }
4827EOF
4828  if compile_prog "" "-Wl,--no-as-needed -ldl" ; then
4829    if $pkg_config lttng-ust --exists; then
4830      lttng_ust_libs=$($pkg_config --libs lttng-ust)
4831    else
4832      lttng_ust_libs="-llttng-ust -ldl"
4833    fi
4834    if $pkg_config liburcu-bp --exists; then
4835      urcu_bp_libs=$($pkg_config --libs liburcu-bp)
4836    else
4837      urcu_bp_libs="-lurcu-bp"
4838    fi
4839
4840    LIBS="$lttng_ust_libs $urcu_bp_libs $LIBS"
4841    libs_qga="$lttng_ust_libs $urcu_bp_libs $libs_qga"
4842  else
4843    error_exit "Trace backend 'ust' missing lttng-ust header files"
4844  fi
4845fi
4846
4847##########################################
4848# For 'dtrace' backend, test if 'dtrace' command is present
4849if have_backend "dtrace"; then
4850  if ! has 'dtrace' ; then
4851    error_exit "dtrace command is not found in PATH $PATH"
4852  fi
4853  trace_backend_stap="no"
4854  if has 'stap' ; then
4855    trace_backend_stap="yes"
4856  fi
4857fi
4858
4859##########################################
4860# check and set a backend for coroutine
4861
4862# We prefer ucontext, but it's not always possible. The fallback
4863# is sigcontext. On Windows the only valid backend is the Windows
4864# specific one.
4865
4866ucontext_works=no
4867if test "$darwin" != "yes"; then
4868  cat > $TMPC << EOF
4869#include <ucontext.h>
4870#ifdef __stub_makecontext
4871#error Ignoring glibc stub makecontext which will always fail
4872#endif
4873int main(void) { makecontext(0, 0, 0); return 0; }
4874EOF
4875  if compile_prog "" "" ; then
4876    ucontext_works=yes
4877  fi
4878fi
4879
4880if test "$coroutine" = ""; then
4881  if test "$mingw32" = "yes"; then
4882    coroutine=win32
4883  elif test "$ucontext_works" = "yes"; then
4884    coroutine=ucontext
4885  else
4886    coroutine=sigaltstack
4887  fi
4888else
4889  case $coroutine in
4890  windows)
4891    if test "$mingw32" != "yes"; then
4892      error_exit "'windows' coroutine backend only valid for Windows"
4893    fi
4894    # Unfortunately the user visible backend name doesn't match the
4895    # coroutine-*.c filename for this case, so we have to adjust it here.
4896    coroutine=win32
4897    ;;
4898  ucontext)
4899    if test "$ucontext_works" != "yes"; then
4900      feature_not_found "ucontext"
4901    fi
4902    ;;
4903  sigaltstack)
4904    if test "$mingw32" = "yes"; then
4905      error_exit "only the 'windows' coroutine backend is valid for Windows"
4906    fi
4907    ;;
4908  *)
4909    error_exit "unknown coroutine backend $coroutine"
4910    ;;
4911  esac
4912fi
4913
4914if test "$coroutine_pool" = ""; then
4915  coroutine_pool=yes
4916fi
4917
4918if test "$debug_stack_usage" = "yes"; then
4919  if test "$coroutine_pool" = "yes"; then
4920    echo "WARN: disabling coroutine pool for stack usage debugging"
4921    coroutine_pool=no
4922  fi
4923fi
4924
4925
4926##########################################
4927# check if we have open_by_handle_at
4928
4929open_by_handle_at=no
4930cat > $TMPC << EOF
4931#include <fcntl.h>
4932#if !defined(AT_EMPTY_PATH)
4933# error missing definition
4934#else
4935int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
4936#endif
4937EOF
4938if compile_prog "" "" ; then
4939    open_by_handle_at=yes
4940fi
4941
4942########################################
4943# check if we have linux/magic.h
4944
4945linux_magic_h=no
4946cat > $TMPC << EOF
4947#include <linux/magic.h>
4948int main(void) {
4949  return 0;
4950}
4951EOF
4952if compile_prog "" "" ; then
4953    linux_magic_h=yes
4954fi
4955
4956########################################
4957# check whether we can disable warning option with a pragma (this is needed
4958# to silence warnings in the headers of some versions of external libraries).
4959# This test has to be compiled with -Werror as otherwise an unknown pragma is
4960# only a warning.
4961#
4962# If we can't selectively disable warning in the code, disable -Werror so that
4963# the build doesn't fail anyway.
4964
4965pragma_disable_unused_but_set=no
4966cat > $TMPC << EOF
4967#pragma GCC diagnostic push
4968#pragma GCC diagnostic ignored "-Wstrict-prototypes"
4969#pragma GCC diagnostic pop
4970
4971int main(void) {
4972    return 0;
4973}
4974EOF
4975if compile_prog "-Werror" "" ; then
4976    pragma_diagnostic_available=yes
4977else
4978    werror=no
4979fi
4980
4981########################################
4982# check if we have valgrind/valgrind.h
4983
4984valgrind_h=no
4985cat > $TMPC << EOF
4986#include <valgrind/valgrind.h>
4987int main(void) {
4988  return 0;
4989}
4990EOF
4991if compile_prog "" "" ; then
4992    valgrind_h=yes
4993fi
4994
4995########################################
4996# check if environ is declared
4997
4998has_environ=no
4999cat > $TMPC << EOF
5000#include <unistd.h>
5001int main(void) {
5002    environ = 0;
5003    return 0;
5004}
5005EOF
5006if compile_prog "" "" ; then
5007    has_environ=yes
5008fi
5009
5010########################################
5011# check if cpuid.h is usable.
5012
5013cat > $TMPC << EOF
5014#include <cpuid.h>
5015int main(void) {
5016    unsigned a, b, c, d;
5017    int max = __get_cpuid_max(0, 0);
5018
5019    if (max >= 1) {
5020        __cpuid(1, a, b, c, d);
5021    }
5022
5023    if (max >= 7) {
5024        __cpuid_count(7, 0, a, b, c, d);
5025    }
5026
5027    return 0;
5028}
5029EOF
5030if compile_prog "" "" ; then
5031    cpuid_h=yes
5032fi
5033
5034##########################################
5035# avx2 optimization requirement check
5036#
5037# There is no point enabling this if cpuid.h is not usable,
5038# since we won't be able to select the new routines.
5039
5040if test "$cpuid_h" = "yes" -a "$avx2_opt" != "no"; then
5041  cat > $TMPC << EOF
5042#pragma GCC push_options
5043#pragma GCC target("avx2")
5044#include <cpuid.h>
5045#include <immintrin.h>
5046static int bar(void *a) {
5047    __m256i x = *(__m256i *)a;
5048    return _mm256_testz_si256(x, x);
5049}
5050int main(int argc, char *argv[]) { return bar(argv[0]); }
5051EOF
5052  if compile_object "" ; then
5053    avx2_opt="yes"
5054  else
5055    avx2_opt="no"
5056  fi
5057fi
5058
5059########################################
5060# check if __[u]int128_t is usable.
5061
5062int128=no
5063cat > $TMPC << EOF
5064#if defined(__clang_major__) && defined(__clang_minor__)
5065# if ((__clang_major__ < 3) || (__clang_major__ == 3) && (__clang_minor__ < 2))
5066#  error __int128_t does not work in CLANG before 3.2
5067# endif
5068#endif
5069__int128_t a;
5070__uint128_t b;
5071int main (void) {
5072  a = a + b;
5073  b = a * b;
5074  a = a * a;
5075  return 0;
5076}
5077EOF
5078if compile_prog "" "" ; then
5079    int128=yes
5080fi
5081
5082#########################################
5083# See if 128-bit atomic operations are supported.
5084
5085atomic128=no
5086if test "$int128" = "yes"; then
5087  cat > $TMPC << EOF
5088int main(void)
5089{
5090  unsigned __int128 x = 0, y = 0;
5091  y = __atomic_load_16(&x, 0);
5092  __atomic_store_16(&x, y, 0);
5093  __atomic_compare_exchange_16(&x, &y, x, 0, 0, 0);
5094  return 0;
5095}
5096EOF
5097  if compile_prog "" "" ; then
5098    atomic128=yes
5099  fi
5100fi
5101
5102cmpxchg128=no
5103if test "$int128" = yes -a "$atomic128" = no; then
5104  cat > $TMPC << EOF
5105int main(void)
5106{
5107  unsigned __int128 x = 0, y = 0;
5108  __sync_val_compare_and_swap_16(&x, y, x);
5109  return 0;
5110}
5111EOF
5112  if compile_prog "" "" ; then
5113    cmpxchg128=yes
5114  fi
5115fi
5116
5117#########################################
5118# See if 64-bit atomic operations are supported.
5119# Note that without __atomic builtins, we can only
5120# assume atomic loads/stores max at pointer size.
5121
5122cat > $TMPC << EOF
5123#include <stdint.h>
5124int main(void)
5125{
5126  uint64_t x = 0, y = 0;
5127#ifdef __ATOMIC_RELAXED
5128  y = __atomic_load_8(&x, 0);
5129  __atomic_store_8(&x, y, 0);
5130  __atomic_compare_exchange_8(&x, &y, x, 0, 0, 0);
5131  __atomic_exchange_8(&x, y, 0);
5132  __atomic_fetch_add_8(&x, y, 0);
5133#else
5134  typedef char is_host64[sizeof(void *) >= sizeof(uint64_t) ? 1 : -1];
5135  __sync_lock_test_and_set(&x, y);
5136  __sync_val_compare_and_swap(&x, y, 0);
5137  __sync_fetch_and_add(&x, y);
5138#endif
5139  return 0;
5140}
5141EOF
5142if compile_prog "" "" ; then
5143  atomic64=yes
5144fi
5145
5146########################################
5147# See if 16-byte vector operations are supported.
5148# Even without a vector unit the compiler may expand these.
5149# There is a bug in old GCC for PPC that crashes here.
5150# Unfortunately it's the system compiler for Centos 7.
5151
5152cat > $TMPC << EOF
5153typedef unsigned char U1 __attribute__((vector_size(16)));
5154typedef unsigned short U2 __attribute__((vector_size(16)));
5155typedef unsigned int U4 __attribute__((vector_size(16)));
5156typedef unsigned long long U8 __attribute__((vector_size(16)));
5157typedef signed char S1 __attribute__((vector_size(16)));
5158typedef signed short S2 __attribute__((vector_size(16)));
5159typedef signed int S4 __attribute__((vector_size(16)));
5160typedef signed long long S8 __attribute__((vector_size(16)));
5161static U1 a1, b1;
5162static U2 a2, b2;
5163static U4 a4, b4;
5164static U8 a8, b8;
5165static S1 c1;
5166static S2 c2;
5167static S4 c4;
5168static S8 c8;
5169static int i;
5170void helper(void *d, void *a, int shift, int i);
5171void helper(void *d, void *a, int shift, int i)
5172{
5173  *(U1 *)(d + i) = *(U1 *)(a + i) << shift;
5174  *(U2 *)(d + i) = *(U2 *)(a + i) << shift;
5175  *(U4 *)(d + i) = *(U4 *)(a + i) << shift;
5176  *(U8 *)(d + i) = *(U8 *)(a + i) << shift;
5177}
5178int main(void)
5179{
5180  a1 += b1; a2 += b2; a4 += b4; a8 += b8;
5181  a1 -= b1; a2 -= b2; a4 -= b4; a8 -= b8;
5182  a1 *= b1; a2 *= b2; a4 *= b4; a8 *= b8;
5183  a1 &= b1; a2 &= b2; a4 &= b4; a8 &= b8;
5184  a1 |= b1; a2 |= b2; a4 |= b4; a8 |= b8;
5185  a1 ^= b1; a2 ^= b2; a4 ^= b4; a8 ^= b8;
5186  a1 <<= i; a2 <<= i; a4 <<= i; a8 <<= i;
5187  a1 >>= i; a2 >>= i; a4 >>= i; a8 >>= i;
5188  c1 >>= i; c2 >>= i; c4 >>= i; c8 >>= i;
5189  return 0;
5190}
5191EOF
5192
5193vector16=no
5194if compile_prog "" "" ; then
5195  vector16=yes
5196fi
5197
5198########################################
5199# check if getauxval is available.
5200
5201getauxval=no
5202cat > $TMPC << EOF
5203#include <sys/auxv.h>
5204int main(void) {
5205  return getauxval(AT_HWCAP) == 0;
5206}
5207EOF
5208if compile_prog "" "" ; then
5209    getauxval=yes
5210fi
5211
5212########################################
5213# check if ccache is interfering with
5214# semantic analysis of macros
5215
5216unset CCACHE_CPP2
5217ccache_cpp2=no
5218cat > $TMPC << EOF
5219static const int Z = 1;
5220#define fn() ({ Z; })
5221#define TAUT(X) ((X) == Z)
5222#define PAREN(X, Y) (X == Y)
5223#define ID(X) (X)
5224int main(int argc, char *argv[])
5225{
5226    int x = 0, y = 0;
5227    x = ID(x);
5228    x = fn();
5229    fn();
5230    if (PAREN(x, y)) return 0;
5231    if (TAUT(Z)) return 0;
5232    return 0;
5233}
5234EOF
5235
5236if ! compile_object "-Werror"; then
5237    ccache_cpp2=yes
5238fi
5239
5240#################################################
5241# clang does not support glibc + FORTIFY_SOURCE.
5242
5243if test "$fortify_source" != "no"; then
5244  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
5245    fortify_source="no";
5246  elif test -n "$cxx" && has $cxx &&
5247       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
5248    fortify_source="no";
5249  else
5250    fortify_source="yes"
5251  fi
5252fi
5253
5254###############################################
5255# Check if copy_file_range is provided by glibc
5256have_copy_file_range=no
5257cat > $TMPC << EOF
5258#include <unistd.h>
5259int main(void) {
5260  copy_file_range(0, NULL, 0, NULL, 0, 0);
5261  return 0;
5262}
5263EOF
5264if compile_prog "" "" ; then
5265    have_copy_file_range=yes
5266fi
5267
5268##########################################
5269# check if struct fsxattr is available via linux/fs.h
5270
5271have_fsxattr=no
5272cat > $TMPC << EOF
5273#include <linux/fs.h>
5274struct fsxattr foo;
5275int main(void) {
5276  return 0;
5277}
5278EOF
5279if compile_prog "" "" ; then
5280    have_fsxattr=yes
5281fi
5282
5283##########################################
5284# check for usable membarrier system call
5285if test "$membarrier" = "yes"; then
5286    have_membarrier=no
5287    if test "$mingw32" = "yes" ; then
5288        have_membarrier=yes
5289    elif test "$linux" = "yes" ; then
5290        cat > $TMPC << EOF
5291    #include <linux/membarrier.h>
5292    #include <sys/syscall.h>
5293    #include <unistd.h>
5294    #include <stdlib.h>
5295    int main(void) {
5296        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
5297        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
5298	exit(0);
5299    }
5300EOF
5301        if compile_prog "" "" ; then
5302            have_membarrier=yes
5303        fi
5304    fi
5305    if test "$have_membarrier" = "no"; then
5306      feature_not_found "membarrier" "membarrier system call not available"
5307    fi
5308else
5309    # Do not enable it by default even for Mingw32, because it doesn't
5310    # work on Wine.
5311    membarrier=no
5312fi
5313
5314##########################################
5315# check if rtnetlink.h exists and is useful
5316have_rtnetlink=no
5317cat > $TMPC << EOF
5318#include <linux/rtnetlink.h>
5319int main(void) {
5320  return IFLA_PROTO_DOWN;
5321}
5322EOF
5323if compile_prog "" "" ; then
5324    have_rtnetlink=yes
5325fi
5326
5327##########################################
5328# check for usable AF_VSOCK environment
5329have_af_vsock=no
5330cat > $TMPC << EOF
5331#include <errno.h>
5332#include <sys/types.h>
5333#include <sys/socket.h>
5334#if !defined(AF_VSOCK)
5335# error missing AF_VSOCK flag
5336#endif
5337#include <linux/vm_sockets.h>
5338int main(void) {
5339    int sock, ret;
5340    struct sockaddr_vm svm;
5341    socklen_t len = sizeof(svm);
5342    sock = socket(AF_VSOCK, SOCK_STREAM, 0);
5343    ret = getpeername(sock, (struct sockaddr *)&svm, &len);
5344    if ((ret == -1) && (errno == ENOTCONN)) {
5345        return 0;
5346    }
5347    return -1;
5348}
5349EOF
5350if compile_prog "" "" ; then
5351    have_af_vsock=yes
5352fi
5353
5354##########################################
5355# check for usable AF_ALG environment
5356hava_afalg=no
5357cat > $TMPC << EOF
5358#include <errno.h>
5359#include <sys/types.h>
5360#include <sys/socket.h>
5361#include <linux/if_alg.h>
5362int main(void) {
5363    int sock;
5364    sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
5365    return sock;
5366}
5367EOF
5368if compile_prog "" "" ; then
5369    have_afalg=yes
5370fi
5371if test "$crypto_afalg" = "yes"
5372then
5373    if test "$have_afalg" != "yes"
5374    then
5375	error_exit "AF_ALG requested but could not be detected"
5376    fi
5377fi
5378
5379
5380#################################################
5381# Check to see if we have the Hypervisor framework
5382if [ "$darwin" = "yes" ] ; then
5383  cat > $TMPC << EOF
5384#include <Hypervisor/hv.h>
5385int main() { return 0;}
5386EOF
5387  if ! compile_object ""; then
5388    hvf='no'
5389  else
5390    hvf='yes'
5391    LDFLAGS="-framework Hypervisor $LDFLAGS"
5392  fi
5393fi
5394
5395#################################################
5396# Sparc implicitly links with --relax, which is
5397# incompatible with -r, so --no-relax should be
5398# given. It does no harm to give it on other
5399# platforms too.
5400
5401# Note: the prototype is needed since QEMU_CFLAGS
5402#       contains -Wmissing-prototypes
5403cat > $TMPC << EOF
5404extern int foo(void);
5405int foo(void) { return 0; }
5406EOF
5407if ! compile_object ""; then
5408  error_exit "Failed to compile object file for LD_REL_FLAGS test"
5409fi
5410for i in '-Wl,-r -Wl,--no-relax' -Wl,-r -r; do
5411  if do_cc -nostdlib $i -o $TMPMO $TMPO; then
5412    LD_REL_FLAGS=$i
5413    break
5414  fi
5415done
5416if test "$modules" = "yes" && test "$LD_REL_FLAGS" = ""; then
5417  feature_not_found "modules" "Cannot find how to build relocatable objects"
5418fi
5419
5420##########################################
5421# check for sysmacros.h
5422
5423have_sysmacros=no
5424cat > $TMPC << EOF
5425#include <sys/sysmacros.h>
5426int main(void) {
5427    return makedev(0, 0);
5428}
5429EOF
5430if compile_prog "" "" ; then
5431    have_sysmacros=yes
5432fi
5433
5434##########################################
5435# Veritas HyperScale block driver VxHS
5436# Check if libvxhs is installed
5437
5438if test "$vxhs" != "no" ; then
5439  cat > $TMPC <<EOF
5440#include <stdint.h>
5441#include <qnio/qnio_api.h>
5442
5443void *vxhs_callback;
5444
5445int main(void) {
5446    iio_init(QNIO_VERSION, vxhs_callback);
5447    return 0;
5448}
5449EOF
5450  vxhs_libs="-lvxhs -lssl"
5451  if compile_prog "" "$vxhs_libs" ; then
5452    vxhs=yes
5453  else
5454    if test "$vxhs" = "yes" ; then
5455      feature_not_found "vxhs block device" "Install libvxhs See github"
5456    fi
5457    vxhs=no
5458  fi
5459fi
5460
5461##########################################
5462# check for _Static_assert()
5463
5464have_static_assert=no
5465cat > $TMPC << EOF
5466_Static_assert(1, "success");
5467int main(void) {
5468    return 0;
5469}
5470EOF
5471if compile_prog "" "" ; then
5472    have_static_assert=yes
5473fi
5474
5475##########################################
5476# check for utmpx.h, it is missing e.g. on OpenBSD
5477
5478have_utmpx=no
5479cat > $TMPC << EOF
5480#include <utmpx.h>
5481struct utmpx user_info;
5482int main(void) {
5483    return 0;
5484}
5485EOF
5486if compile_prog "" "" ; then
5487    have_utmpx=yes
5488fi
5489
5490##########################################
5491# checks for sanitizers
5492
5493have_asan=no
5494have_ubsan=no
5495have_asan_iface_h=no
5496have_asan_iface_fiber=no
5497
5498if test "$sanitizers" = "yes" ; then
5499  write_c_skeleton
5500  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
5501      have_asan=yes
5502  fi
5503
5504  # we could use a simple skeleton for flags checks, but this also
5505  # detect the static linking issue of ubsan, see also:
5506  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
5507  cat > $TMPC << EOF
5508#include <stdlib.h>
5509int main(void) {
5510    void *tmp = malloc(10);
5511    return *(int *)(tmp + 2);
5512}
5513EOF
5514  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
5515      have_ubsan=yes
5516  fi
5517
5518  if check_include "sanitizer/asan_interface.h" ; then
5519      have_asan_iface_h=yes
5520  fi
5521
5522  cat > $TMPC << EOF
5523#include <sanitizer/asan_interface.h>
5524int main(void) {
5525  __sanitizer_start_switch_fiber(0, 0, 0);
5526  return 0;
5527}
5528EOF
5529  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
5530      have_asan_iface_fiber=yes
5531  fi
5532fi
5533
5534##########################################
5535# Docker and cross-compiler support
5536#
5537# This is specifically for building test
5538# cases for foreign architectures, not
5539# cross-compiling QEMU itself.
5540
5541if has "docker"; then
5542    docker=$($python $source_path/tests/docker/docker.py probe)
5543fi
5544
5545##########################################
5546# check for libpmem
5547
5548if test "$libpmem" != "no"; then
5549	if $pkg_config --exists "libpmem"; then
5550		libpmem="yes"
5551		libpmem_libs=$($pkg_config --libs libpmem)
5552		libpmem_cflags=$($pkg_config --cflags libpmem)
5553		libs_softmmu="$libs_softmmu $libpmem_libs"
5554		QEMU_CFLAGS="$QEMU_CFLAGS $libpmem_cflags"
5555	else
5556		if test "$libpmem" = "yes" ; then
5557			feature_not_found "libpmem" "Install nvml or pmdk"
5558		fi
5559		libpmem="no"
5560	fi
5561fi
5562
5563##########################################
5564# End of CC checks
5565# After here, no more $cc or $ld runs
5566
5567write_c_skeleton
5568
5569if test "$gcov" = "yes" ; then
5570  CFLAGS="-fprofile-arcs -ftest-coverage -g $CFLAGS"
5571  LDFLAGS="-fprofile-arcs -ftest-coverage $LDFLAGS"
5572elif test "$fortify_source" = "yes" ; then
5573  CFLAGS="-O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $CFLAGS"
5574elif test "$debug" = "no"; then
5575  CFLAGS="-O2 $CFLAGS"
5576fi
5577
5578if test "$have_asan" = "yes"; then
5579  CFLAGS="-fsanitize=address $CFLAGS"
5580  if test "$have_asan_iface_h" = "no" ; then
5581      echo "ASAN build enabled, but ASAN header missing." \
5582           "Without code annotation, the report may be inferior."
5583  elif test "$have_asan_iface_fiber" = "no" ; then
5584      echo "ASAN build enabled, but ASAN header is too old." \
5585           "Without code annotation, the report may be inferior."
5586  fi
5587fi
5588if test "$have_ubsan" = "yes"; then
5589  CFLAGS="-fsanitize=undefined $CFLAGS"
5590fi
5591
5592##########################################
5593# Do we have libnfs
5594if test "$libnfs" != "no" ; then
5595  if $pkg_config --atleast-version=1.9.3 libnfs; then
5596    libnfs="yes"
5597    libnfs_libs=$($pkg_config --libs libnfs)
5598  else
5599    if test "$libnfs" = "yes" ; then
5600      feature_not_found "libnfs" "Install libnfs devel >= 1.9.3"
5601    fi
5602    libnfs="no"
5603  fi
5604fi
5605
5606# Now we've finished running tests it's OK to add -Werror to the compiler flags
5607if test "$werror" = "yes"; then
5608    QEMU_CFLAGS="-Werror $QEMU_CFLAGS"
5609fi
5610
5611if test "$solaris" = "no" ; then
5612    if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
5613        LDFLAGS="-Wl,--warn-common $LDFLAGS"
5614    fi
5615fi
5616
5617# test if pod2man has --utf8 option
5618if pod2man --help | grep -q utf8; then
5619    POD2MAN="pod2man --utf8"
5620else
5621    POD2MAN="pod2man"
5622fi
5623
5624# Use ASLR, no-SEH and DEP if available
5625if test "$mingw32" = "yes" ; then
5626    for flag in --dynamicbase --no-seh --nxcompat; do
5627        if ld_has $flag ; then
5628            LDFLAGS="-Wl,$flag $LDFLAGS"
5629        fi
5630    done
5631fi
5632
5633qemu_confdir=$sysconfdir$confsuffix
5634qemu_moddir=$libdir$confsuffix
5635qemu_datadir=$datadir$confsuffix
5636qemu_localedir="$datadir/locale"
5637
5638# We can only support ivshmem if we have eventfd
5639if [ "$eventfd" = "yes" ]; then
5640  ivshmem=yes
5641fi
5642
5643tools=""
5644if test "$want_tools" = "yes" ; then
5645  tools="qemu-img\$(EXESUF) qemu-io\$(EXESUF) qemu-edid\$(EXESUF) $tools"
5646  if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" ] ; then
5647    tools="qemu-nbd\$(EXESUF) $tools"
5648  fi
5649  if [ "$ivshmem" = "yes" ]; then
5650    tools="ivshmem-client\$(EXESUF) ivshmem-server\$(EXESUF) $tools"
5651  fi
5652  if [ "$posix" = "yes" ] && [ "$curl" = "yes" ]; then
5653    tools="elf2dmp $tools"
5654  fi
5655fi
5656if test "$softmmu" = yes ; then
5657  if test "$linux" = yes; then
5658    if test "$virtfs" != no && test "$cap" = yes && test "$attr" = yes ; then
5659      virtfs=yes
5660      tools="$tools fsdev/virtfs-proxy-helper\$(EXESUF)"
5661    else
5662      if test "$virtfs" = yes; then
5663        error_exit "VirtFS requires libcap devel and libattr devel"
5664      fi
5665      virtfs=no
5666    fi
5667    if test "$mpath" != no && test "$mpathpersist" = yes ; then
5668      mpath=yes
5669    else
5670      if test "$mpath" = yes; then
5671        error_exit "Multipath requires libmpathpersist devel"
5672      fi
5673      mpath=no
5674    fi
5675    tools="$tools scsi/qemu-pr-helper\$(EXESUF)"
5676  else
5677    if test "$virtfs" = yes; then
5678      error_exit "VirtFS is supported only on Linux"
5679    fi
5680    virtfs=no
5681    if test "$mpath" = yes; then
5682      error_exit "Multipath is supported only on Linux"
5683    fi
5684    mpath=no
5685  fi
5686  if test "$xkbcommon" = "yes"; then
5687    tools="qemu-keymap\$(EXESUF) $tools"
5688  fi
5689fi
5690
5691# Probe for guest agent support/options
5692
5693if [ "$guest_agent" != "no" ]; then
5694  if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
5695      tools="qemu-ga $tools"
5696      guest_agent=yes
5697  elif [ "$guest_agent" != yes ]; then
5698      guest_agent=no
5699  else
5700      error_exit "Guest agent is not supported on this platform"
5701  fi
5702fi
5703
5704# Guest agent Window MSI  package
5705
5706if test "$guest_agent" != yes; then
5707  if test "$guest_agent_msi" = yes; then
5708    error_exit "MSI guest agent package requires guest agent enabled"
5709  fi
5710  guest_agent_msi=no
5711elif test "$mingw32" != "yes"; then
5712  if test "$guest_agent_msi" = "yes"; then
5713    error_exit "MSI guest agent package is available only for MinGW Windows cross-compilation"
5714  fi
5715  guest_agent_msi=no
5716elif ! has wixl; then
5717  if test "$guest_agent_msi" = "yes"; then
5718    error_exit "MSI guest agent package requires wixl tool installed ( usually from msitools package )"
5719  fi
5720  guest_agent_msi=no
5721else
5722  # we support qemu-ga, mingw32, and wixl: default to MSI enabled if it wasn't
5723  # disabled explicitly
5724  if test "$guest_agent_msi" != "no"; then
5725    guest_agent_msi=yes
5726  fi
5727fi
5728
5729if test "$guest_agent_msi" = "yes"; then
5730  if test "$guest_agent_with_vss" = "yes"; then
5731    QEMU_GA_MSI_WITH_VSS="-D InstallVss"
5732  fi
5733
5734  if test "$QEMU_GA_MANUFACTURER" = ""; then
5735    QEMU_GA_MANUFACTURER=QEMU
5736  fi
5737
5738  if test "$QEMU_GA_DISTRO" = ""; then
5739    QEMU_GA_DISTRO=Linux
5740  fi
5741
5742  if test "$QEMU_GA_VERSION" = ""; then
5743      QEMU_GA_VERSION=$(cat $source_path/VERSION)
5744  fi
5745
5746  QEMU_GA_MSI_MINGW_DLL_PATH="-D Mingw_dlls=$($pkg_config --variable=prefix glib-2.0)/bin"
5747
5748  case "$cpu" in
5749  x86_64)
5750    QEMU_GA_MSI_ARCH="-a x64 -D Arch=64"
5751    ;;
5752  i386)
5753    QEMU_GA_MSI_ARCH="-D Arch=32"
5754    ;;
5755  *)
5756    error_exit "CPU $cpu not supported for building installation package"
5757    ;;
5758  esac
5759fi
5760
5761# Mac OS X ships with a broken assembler
5762roms=
5763if test \( "$cpu" = "i386" -o "$cpu" = "x86_64" \) -a \
5764        "$targetos" != "Darwin" -a "$targetos" != "SunOS" -a \
5765        "$softmmu" = yes ; then
5766    # Different host OS linkers have different ideas about the name of the ELF
5767    # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
5768    # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
5769    for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
5770        if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
5771            ld_i386_emulation="$emu"
5772            roms="optionrom"
5773            break
5774        fi
5775    done
5776fi
5777if test "$cpu" = "ppc64" -a "$targetos" != "Darwin" ; then
5778  roms="$roms spapr-rtas"
5779fi
5780
5781if test "$cpu" = "s390x" ; then
5782  roms="$roms s390-ccw"
5783fi
5784
5785# Probe for the need for relocating the user-only binary.
5786if ( [ "$linux_user" = yes ] || [ "$bsd_user" = yes ] ) && [ "$pie" = no ]; then
5787  textseg_addr=
5788  case "$cpu" in
5789    arm | i386 | ppc* | s390* | sparc* | x86_64 | x32)
5790      # ??? Rationale for choosing this address
5791      textseg_addr=0x60000000
5792      ;;
5793    mips)
5794      # A 256M aligned address, high in the address space, with enough
5795      # room for the code_gen_buffer above it before the stack.
5796      textseg_addr=0x60000000
5797      ;;
5798  esac
5799  if [ -n "$textseg_addr" ]; then
5800    cat > $TMPC <<EOF
5801    int main(void) { return 0; }
5802EOF
5803    textseg_ldflags="-Wl,-Ttext-segment=$textseg_addr"
5804    if ! compile_prog "" "$textseg_ldflags"; then
5805      # In case ld does not support -Ttext-segment, edit the default linker
5806      # script via sed to set the .text start addr.  This is needed on FreeBSD
5807      # at least.
5808      if ! $ld --verbose >/dev/null 2>&1; then
5809        error_exit \
5810            "We need to link the QEMU user mode binaries at a" \
5811            "specific text address. Unfortunately your linker" \
5812            "doesn't support either the -Ttext-segment option or" \
5813            "printing the default linker script with --verbose." \
5814            "If you don't want the user mode binaries, pass the" \
5815            "--disable-user option to configure."
5816      fi
5817
5818      $ld --verbose | sed \
5819        -e '1,/==================================================/d' \
5820        -e '/==================================================/,$d' \
5821        -e "s/[.] = [0-9a-fx]* [+] SIZEOF_HEADERS/. = $textseg_addr + SIZEOF_HEADERS/" \
5822        -e "s/__executable_start = [0-9a-fx]*/__executable_start = $textseg_addr/" > config-host.ld
5823      textseg_ldflags="-Wl,-T../config-host.ld"
5824    fi
5825  fi
5826fi
5827
5828# Check that the C++ compiler exists and works with the C compiler.
5829# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
5830if has $cxx; then
5831    cat > $TMPC <<EOF
5832int c_function(void);
5833int main(void) { return c_function(); }
5834EOF
5835
5836    compile_object
5837
5838    cat > $TMPCXX <<EOF
5839extern "C" {
5840   int c_function(void);
5841}
5842int c_function(void) { return 42; }
5843EOF
5844
5845    update_cxxflags
5846
5847    if do_cxx $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $LDFLAGS; then
5848        # C++ compiler $cxx works ok with C compiler $cc
5849        :
5850    else
5851        echo "C++ compiler $cxx does not work with C compiler $cc"
5852        echo "Disabling C++ specific optional code"
5853        cxx=
5854    fi
5855else
5856    echo "No C++ compiler available; disabling C++ specific optional code"
5857    cxx=
5858fi
5859
5860echo_version() {
5861    if test "$1" = "yes" ; then
5862        echo "($2)"
5863    fi
5864}
5865
5866# prepend pixman and ftd flags after all config tests are done
5867QEMU_CFLAGS="$pixman_cflags $fdt_cflags $QEMU_CFLAGS"
5868QEMU_LDFLAGS="$fdt_ldflags $QEMU_LDFLAGS"
5869libs_softmmu="$pixman_libs $libs_softmmu"
5870
5871echo "Install prefix    $prefix"
5872echo "BIOS directory    $(eval echo $qemu_datadir)"
5873echo "firmware path     $(eval echo $firmwarepath)"
5874echo "binary directory  $(eval echo $bindir)"
5875echo "library directory $(eval echo $libdir)"
5876echo "module directory  $(eval echo $qemu_moddir)"
5877echo "libexec directory $(eval echo $libexecdir)"
5878echo "include directory $(eval echo $includedir)"
5879echo "config directory  $(eval echo $sysconfdir)"
5880if test "$mingw32" = "no" ; then
5881echo "local state directory   $(eval echo $local_statedir)"
5882echo "Manual directory  $(eval echo $mandir)"
5883echo "ELF interp prefix $interp_prefix"
5884else
5885echo "local state directory   queried at runtime"
5886echo "Windows SDK       $win_sdk"
5887fi
5888echo "Source path       $source_path"
5889echo "GIT binary        $git"
5890echo "GIT submodules    $git_submodules"
5891echo "C compiler        $cc"
5892echo "Host C compiler   $host_cc"
5893echo "C++ compiler      $cxx"
5894echo "Objective-C compiler $objcc"
5895echo "ARFLAGS           $ARFLAGS"
5896echo "CFLAGS            $CFLAGS"
5897echo "QEMU_CFLAGS       $QEMU_CFLAGS"
5898echo "LDFLAGS           $LDFLAGS"
5899echo "QEMU_LDFLAGS      $QEMU_LDFLAGS"
5900echo "make              $make"
5901echo "install           $install"
5902echo "python            $python"
5903if test "$slirp" = "yes" ; then
5904    echo "smbd              $smbd"
5905fi
5906echo "module support    $modules"
5907echo "host CPU          $cpu"
5908echo "host big endian   $bigendian"
5909echo "target list       $target_list"
5910echo "gprof enabled     $gprof"
5911echo "sparse enabled    $sparse"
5912echo "strip binaries    $strip_opt"
5913echo "profiler          $profiler"
5914echo "static build      $static"
5915if test "$darwin" = "yes" ; then
5916    echo "Cocoa support     $cocoa"
5917fi
5918echo "SDL support       $sdl $(echo_version $sdl $sdlversion)"
5919echo "GTK support       $gtk $(echo_version $gtk $gtk_version)"
5920echo "GTK GL support    $gtk_gl"
5921echo "VTE support       $vte $(echo_version $vte $vteversion)"
5922echo "TLS priority      $tls_priority"
5923echo "GNUTLS support    $gnutls"
5924echo "libgcrypt         $gcrypt"
5925echo "nettle            $nettle $(echo_version $nettle $nettle_version)"
5926echo "libtasn1          $tasn1"
5927echo "curses support    $curses"
5928echo "virgl support     $virglrenderer $(echo_version $virglrenderer $virgl_version)"
5929echo "curl support      $curl"
5930echo "mingw32 support   $mingw32"
5931echo "Audio drivers     $audio_drv_list"
5932echo "Block whitelist (rw) $block_drv_rw_whitelist"
5933echo "Block whitelist (ro) $block_drv_ro_whitelist"
5934echo "VirtFS support    $virtfs"
5935echo "Multipath support $mpath"
5936echo "VNC support       $vnc"
5937if test "$vnc" = "yes" ; then
5938    echo "VNC SASL support  $vnc_sasl"
5939    echo "VNC JPEG support  $vnc_jpeg"
5940    echo "VNC PNG support   $vnc_png"
5941fi
5942if test -n "$sparc_cpu"; then
5943    echo "Target Sparc Arch $sparc_cpu"
5944fi
5945echo "xen support       $xen"
5946if test "$xen" = "yes" ; then
5947  echo "xen ctrl version  $xen_ctrl_version"
5948  echo "pv dom build      $xen_pv_domain_build"
5949fi
5950echo "brlapi support    $brlapi"
5951echo "bluez  support    $bluez"
5952echo "Documentation     $docs"
5953echo "PIE               $pie"
5954echo "vde support       $vde"
5955echo "netmap support    $netmap"
5956echo "Linux AIO support $linux_aio"
5957echo "ATTR/XATTR support $attr"
5958echo "Install blobs     $blobs"
5959echo "KVM support       $kvm"
5960echo "HAX support       $hax"
5961echo "HVF support       $hvf"
5962echo "WHPX support      $whpx"
5963echo "TCG support       $tcg"
5964if test "$tcg" = "yes" ; then
5965    echo "TCG debug enabled $debug_tcg"
5966    echo "TCG interpreter   $tcg_interpreter"
5967fi
5968echo "malloc trim support $malloc_trim"
5969echo "RDMA support      $rdma"
5970echo "PVRDMA support    $pvrdma"
5971echo "fdt support       $fdt"
5972echo "membarrier        $membarrier"
5973echo "preadv support    $preadv"
5974echo "fdatasync         $fdatasync"
5975echo "madvise           $madvise"
5976echo "posix_madvise     $posix_madvise"
5977echo "posix_memalign    $posix_memalign"
5978echo "libcap-ng support $cap_ng"
5979echo "vhost-net support $vhost_net"
5980echo "vhost-crypto support $vhost_crypto"
5981echo "vhost-scsi support $vhost_scsi"
5982echo "vhost-vsock support $vhost_vsock"
5983echo "vhost-user support $vhost_user"
5984echo "Trace backends    $trace_backends"
5985if have_backend "simple"; then
5986echo "Trace output file $trace_file-<pid>"
5987fi
5988echo "spice support     $spice $(echo_version $spice $spice_protocol_version/$spice_server_version)"
5989echo "rbd support       $rbd"
5990echo "xfsctl support    $xfs"
5991echo "smartcard support $smartcard"
5992echo "libusb            $libusb"
5993echo "usb net redir     $usb_redir"
5994echo "OpenGL support    $opengl"
5995echo "OpenGL dmabufs    $opengl_dmabuf"
5996echo "libiscsi support  $libiscsi"
5997echo "libnfs support    $libnfs"
5998echo "build guest agent $guest_agent"
5999echo "QGA VSS support   $guest_agent_with_vss"
6000echo "QGA w32 disk info $guest_agent_ntddscsi"
6001echo "QGA MSI support   $guest_agent_msi"
6002echo "seccomp support   $seccomp"
6003echo "coroutine backend $coroutine"
6004echo "coroutine pool    $coroutine_pool"
6005echo "debug stack usage $debug_stack_usage"
6006echo "mutex debugging   $debug_mutex"
6007echo "crypto afalg      $crypto_afalg"
6008echo "GlusterFS support $glusterfs"
6009echo "gcov              $gcov_tool"
6010echo "gcov enabled      $gcov"
6011echo "TPM support       $tpm"
6012echo "libssh2 support   $libssh2"
6013echo "TPM passthrough   $tpm_passthrough"
6014echo "TPM emulator      $tpm_emulator"
6015echo "QOM debugging     $qom_cast_debug"
6016echo "Live block migration $live_block_migration"
6017echo "lzo support       $lzo"
6018echo "snappy support    $snappy"
6019echo "bzip2 support     $bzip2"
6020echo "NUMA host support $numa"
6021echo "libxml2           $libxml2"
6022echo "tcmalloc support  $tcmalloc"
6023echo "jemalloc support  $jemalloc"
6024echo "avx2 optimization $avx2_opt"
6025echo "replication support $replication"
6026echo "VxHS block device $vxhs"
6027echo "capstone          $capstone"
6028echo "docker            $docker"
6029echo "libpmem support   $libpmem"
6030
6031if test "$sdl_too_old" = "yes"; then
6032echo "-> Your SDL version is too old - please upgrade to have SDL support"
6033fi
6034
6035if test "$sdlabi" = "1.2"; then
6036    echo
6037    echo "WARNING: Use of SDL 1.2 is deprecated and will be removed in"
6038    echo "WARNING: future releases. Please switch to using SDL 2.0"
6039fi
6040
6041if test "$supported_cpu" = "no"; then
6042    echo
6043    echo "WARNING: SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!"
6044    echo
6045    echo "CPU host architecture $cpu support is not currently maintained."
6046    echo "The QEMU project intends to remove support for this host CPU in"
6047    echo "a future release if nobody volunteers to maintain it and to"
6048    echo "provide a build host for our continuous integration setup."
6049    echo "configure has succeeded and you can continue to build, but"
6050    echo "if you care about QEMU on this platform you should contact"
6051    echo "us upstream at qemu-devel@nongnu.org."
6052fi
6053
6054if test "$supported_os" = "no"; then
6055    echo
6056    echo "WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!"
6057    echo
6058    echo "Host OS $targetos support is not currently maintained."
6059    echo "The QEMU project intends to remove support for this host OS in"
6060    echo "a future release if nobody volunteers to maintain it and to"
6061    echo "provide a build host for our continuous integration setup."
6062    echo "configure has succeeded and you can continue to build, but"
6063    echo "if you care about QEMU on this platform you should contact"
6064    echo "us upstream at qemu-devel@nongnu.org."
6065fi
6066
6067config_host_mak="config-host.mak"
6068
6069echo "# Automatically generated by configure - do not modify" >config-all-disas.mak
6070
6071echo "# Automatically generated by configure - do not modify" > $config_host_mak
6072echo >> $config_host_mak
6073
6074echo all: >> $config_host_mak
6075echo "prefix=$prefix" >> $config_host_mak
6076echo "bindir=$bindir" >> $config_host_mak
6077echo "libdir=$libdir" >> $config_host_mak
6078echo "libexecdir=$libexecdir" >> $config_host_mak
6079echo "includedir=$includedir" >> $config_host_mak
6080echo "mandir=$mandir" >> $config_host_mak
6081echo "sysconfdir=$sysconfdir" >> $config_host_mak
6082echo "qemu_confdir=$qemu_confdir" >> $config_host_mak
6083echo "qemu_datadir=$qemu_datadir" >> $config_host_mak
6084echo "qemu_firmwarepath=$firmwarepath" >> $config_host_mak
6085echo "qemu_docdir=$qemu_docdir" >> $config_host_mak
6086echo "qemu_moddir=$qemu_moddir" >> $config_host_mak
6087if test "$mingw32" = "no" ; then
6088  echo "qemu_localstatedir=$local_statedir" >> $config_host_mak
6089fi
6090echo "qemu_helperdir=$libexecdir" >> $config_host_mak
6091echo "qemu_localedir=$qemu_localedir" >> $config_host_mak
6092echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
6093echo "GIT=$git" >> $config_host_mak
6094echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
6095echo "GIT_UPDATE=$git_update" >> $config_host_mak
6096
6097echo "ARCH=$ARCH" >> $config_host_mak
6098
6099if test "$debug_tcg" = "yes" ; then
6100  echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
6101fi
6102if test "$strip_opt" = "yes" ; then
6103  echo "STRIP=${strip}" >> $config_host_mak
6104fi
6105if test "$bigendian" = "yes" ; then
6106  echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
6107fi
6108if test "$mingw32" = "yes" ; then
6109  echo "CONFIG_WIN32=y" >> $config_host_mak
6110  rc_version=$(cat $source_path/VERSION)
6111  version_major=${rc_version%%.*}
6112  rc_version=${rc_version#*.}
6113  version_minor=${rc_version%%.*}
6114  rc_version=${rc_version#*.}
6115  version_subminor=${rc_version%%.*}
6116  version_micro=0
6117  echo "CONFIG_FILEVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
6118  echo "CONFIG_PRODUCTVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
6119  if test "$guest_agent_with_vss" = "yes" ; then
6120    echo "CONFIG_QGA_VSS=y" >> $config_host_mak
6121    echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
6122    echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
6123  fi
6124  if test "$guest_agent_ntddscsi" = "yes" ; then
6125    echo "CONFIG_QGA_NTDDDISK=y" >> $config_host_mak
6126  fi
6127  if test "$guest_agent_msi" = "yes"; then
6128    echo "QEMU_GA_MSI_ENABLED=yes" >> $config_host_mak
6129    echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
6130    echo "QEMU_GA_MSI_WITH_VSS=${QEMU_GA_MSI_WITH_VSS}" >> $config_host_mak
6131    echo "QEMU_GA_MSI_ARCH=${QEMU_GA_MSI_ARCH}" >> $config_host_mak
6132    echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
6133    echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
6134    echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
6135  fi
6136else
6137  echo "CONFIG_POSIX=y" >> $config_host_mak
6138fi
6139
6140if test "$linux" = "yes" ; then
6141  echo "CONFIG_LINUX=y" >> $config_host_mak
6142fi
6143
6144if test "$darwin" = "yes" ; then
6145  echo "CONFIG_DARWIN=y" >> $config_host_mak
6146fi
6147
6148if test "$solaris" = "yes" ; then
6149  echo "CONFIG_SOLARIS=y" >> $config_host_mak
6150fi
6151if test "$haiku" = "yes" ; then
6152  echo "CONFIG_HAIKU=y" >> $config_host_mak
6153fi
6154if test "$static" = "yes" ; then
6155  echo "CONFIG_STATIC=y" >> $config_host_mak
6156fi
6157if test "$profiler" = "yes" ; then
6158  echo "CONFIG_PROFILER=y" >> $config_host_mak
6159fi
6160if test "$slirp" = "yes" ; then
6161  echo "CONFIG_SLIRP=y" >> $config_host_mak
6162  echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
6163fi
6164if test "$vde" = "yes" ; then
6165  echo "CONFIG_VDE=y" >> $config_host_mak
6166  echo "VDE_LIBS=$vde_libs" >> $config_host_mak
6167fi
6168if test "$netmap" = "yes" ; then
6169  echo "CONFIG_NETMAP=y" >> $config_host_mak
6170fi
6171if test "$l2tpv3" = "yes" ; then
6172  echo "CONFIG_L2TPV3=y" >> $config_host_mak
6173fi
6174if test "$cap_ng" = "yes" ; then
6175  echo "CONFIG_LIBCAP=y" >> $config_host_mak
6176fi
6177echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
6178for drv in $audio_drv_list; do
6179    def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
6180    case "$drv" in
6181	alsa | oss | pa | sdl)
6182	    echo "$def=m" >> $config_host_mak ;;
6183	*)
6184	    echo "$def=y" >> $config_host_mak ;;
6185    esac
6186done
6187echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak
6188echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
6189echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak
6190echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak
6191echo "OSS_LIBS=$oss_libs" >> $config_host_mak
6192if test "$audio_pt_int" = "yes" ; then
6193  echo "CONFIG_AUDIO_PT_INT=y" >> $config_host_mak
6194fi
6195if test "$audio_win_int" = "yes" ; then
6196  echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
6197fi
6198echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
6199echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
6200if test "$vnc" = "yes" ; then
6201  echo "CONFIG_VNC=y" >> $config_host_mak
6202fi
6203if test "$vnc_sasl" = "yes" ; then
6204  echo "CONFIG_VNC_SASL=y" >> $config_host_mak
6205fi
6206if test "$vnc_jpeg" = "yes" ; then
6207  echo "CONFIG_VNC_JPEG=y" >> $config_host_mak
6208fi
6209if test "$vnc_png" = "yes" ; then
6210  echo "CONFIG_VNC_PNG=y" >> $config_host_mak
6211fi
6212if test "$xkbcommon" = "yes" ; then
6213  echo "XKBCOMMON_CFLAGS=$xkbcommon_cflags" >> $config_host_mak
6214  echo "XKBCOMMON_LIBS=$xkbcommon_libs" >> $config_host_mak
6215fi
6216if test "$fnmatch" = "yes" ; then
6217  echo "CONFIG_FNMATCH=y" >> $config_host_mak
6218fi
6219if test "$xfs" = "yes" ; then
6220  echo "CONFIG_XFS=y" >> $config_host_mak
6221fi
6222qemu_version=$(head $source_path/VERSION)
6223echo "VERSION=$qemu_version" >>$config_host_mak
6224echo "PKGVERSION=$pkgversion" >>$config_host_mak
6225echo "SRC_PATH=$source_path" >> $config_host_mak
6226echo "TARGET_DIRS=$target_list" >> $config_host_mak
6227if [ "$docs" = "yes" ] ; then
6228  echo "BUILD_DOCS=yes" >> $config_host_mak
6229fi
6230if test "$modules" = "yes"; then
6231  # $shacmd can generate a hash started with digit, which the compiler doesn't
6232  # like as an symbol. So prefix it with an underscore
6233  echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
6234  echo "CONFIG_MODULES=y" >> $config_host_mak
6235fi
6236if test "$have_x11" = "yes" -a "$need_x11" = "yes"; then
6237  echo "CONFIG_X11=y" >> $config_host_mak
6238  echo "X11_CFLAGS=$x11_cflags" >> $config_host_mak
6239  echo "X11_LIBS=$x11_libs" >> $config_host_mak
6240fi
6241if test "$sdl" = "yes" ; then
6242  echo "CONFIG_SDL=m" >> $config_host_mak
6243  echo "CONFIG_SDLABI=$sdlabi" >> $config_host_mak
6244  echo "SDL_CFLAGS=$sdl_cflags" >> $config_host_mak
6245  echo "SDL_LIBS=$sdl_libs" >> $config_host_mak
6246fi
6247if test "$cocoa" = "yes" ; then
6248  echo "CONFIG_COCOA=y" >> $config_host_mak
6249fi
6250if test "$curses" = "yes" ; then
6251  echo "CONFIG_CURSES=m" >> $config_host_mak
6252  echo "CURSES_CFLAGS=$curses_inc" >> $config_host_mak
6253  echo "CURSES_LIBS=$curses_lib" >> $config_host_mak
6254fi
6255if test "$pipe2" = "yes" ; then
6256  echo "CONFIG_PIPE2=y" >> $config_host_mak
6257fi
6258if test "$accept4" = "yes" ; then
6259  echo "CONFIG_ACCEPT4=y" >> $config_host_mak
6260fi
6261if test "$splice" = "yes" ; then
6262  echo "CONFIG_SPLICE=y" >> $config_host_mak
6263fi
6264if test "$eventfd" = "yes" ; then
6265  echo "CONFIG_EVENTFD=y" >> $config_host_mak
6266fi
6267if test "$memfd" = "yes" ; then
6268  echo "CONFIG_MEMFD=y" >> $config_host_mak
6269fi
6270if test "$have_usbfs" = "yes" ; then
6271  echo "CONFIG_USBFS=y" >> $config_host_mak
6272fi
6273if test "$fallocate" = "yes" ; then
6274  echo "CONFIG_FALLOCATE=y" >> $config_host_mak
6275fi
6276if test "$fallocate_punch_hole" = "yes" ; then
6277  echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
6278fi
6279if test "$fallocate_zero_range" = "yes" ; then
6280  echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak
6281fi
6282if test "$posix_fallocate" = "yes" ; then
6283  echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
6284fi
6285if test "$sync_file_range" = "yes" ; then
6286  echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
6287fi
6288if test "$fiemap" = "yes" ; then
6289  echo "CONFIG_FIEMAP=y" >> $config_host_mak
6290fi
6291if test "$dup3" = "yes" ; then
6292  echo "CONFIG_DUP3=y" >> $config_host_mak
6293fi
6294if test "$ppoll" = "yes" ; then
6295  echo "CONFIG_PPOLL=y" >> $config_host_mak
6296fi
6297if test "$prctl_pr_set_timerslack" = "yes" ; then
6298  echo "CONFIG_PRCTL_PR_SET_TIMERSLACK=y" >> $config_host_mak
6299fi
6300if test "$epoll" = "yes" ; then
6301  echo "CONFIG_EPOLL=y" >> $config_host_mak
6302fi
6303if test "$epoll_create1" = "yes" ; then
6304  echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
6305fi
6306if test "$sendfile" = "yes" ; then
6307  echo "CONFIG_SENDFILE=y" >> $config_host_mak
6308fi
6309if test "$timerfd" = "yes" ; then
6310  echo "CONFIG_TIMERFD=y" >> $config_host_mak
6311fi
6312if test "$setns" = "yes" ; then
6313  echo "CONFIG_SETNS=y" >> $config_host_mak
6314fi
6315if test "$clock_adjtime" = "yes" ; then
6316  echo "CONFIG_CLOCK_ADJTIME=y" >> $config_host_mak
6317fi
6318if test "$syncfs" = "yes" ; then
6319  echo "CONFIG_SYNCFS=y" >> $config_host_mak
6320fi
6321if test "$inotify" = "yes" ; then
6322  echo "CONFIG_INOTIFY=y" >> $config_host_mak
6323fi
6324if test "$inotify1" = "yes" ; then
6325  echo "CONFIG_INOTIFY1=y" >> $config_host_mak
6326fi
6327if test "$sem_timedwait" = "yes" ; then
6328  echo "CONFIG_SEM_TIMEDWAIT=y" >> $config_host_mak
6329fi
6330if test "$strchrnul" = "yes" ; then
6331  echo "HAVE_STRCHRNUL=y" >> $config_host_mak
6332fi
6333if test "$byteswap_h" = "yes" ; then
6334  echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
6335fi
6336if test "$bswap_h" = "yes" ; then
6337  echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
6338fi
6339if test "$curl" = "yes" ; then
6340  echo "CONFIG_CURL=m" >> $config_host_mak
6341  echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak
6342  echo "CURL_LIBS=$curl_libs" >> $config_host_mak
6343fi
6344if test "$brlapi" = "yes" ; then
6345  echo "CONFIG_BRLAPI=y" >> $config_host_mak
6346  echo "BRLAPI_LIBS=$brlapi_libs" >> $config_host_mak
6347fi
6348if test "$bluez" = "yes" ; then
6349  echo "CONFIG_BLUEZ=y" >> $config_host_mak
6350  echo "BLUEZ_CFLAGS=$bluez_cflags" >> $config_host_mak
6351fi
6352if test "$gtk" = "yes" ; then
6353  echo "CONFIG_GTK=m" >> $config_host_mak
6354  echo "GTK_CFLAGS=$gtk_cflags" >> $config_host_mak
6355  echo "GTK_LIBS=$gtk_libs" >> $config_host_mak
6356  if test "$gtk_gl" = "yes" ; then
6357    echo "CONFIG_GTK_GL=y" >> $config_host_mak
6358  fi
6359fi
6360echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
6361if test "$gnutls" = "yes" ; then
6362  echo "CONFIG_GNUTLS=y" >> $config_host_mak
6363fi
6364if test "$gcrypt" = "yes" ; then
6365  echo "CONFIG_GCRYPT=y" >> $config_host_mak
6366  if test "$gcrypt_hmac" = "yes" ; then
6367    echo "CONFIG_GCRYPT_HMAC=y" >> $config_host_mak
6368  fi
6369fi
6370if test "$nettle" = "yes" ; then
6371  echo "CONFIG_NETTLE=y" >> $config_host_mak
6372  echo "CONFIG_NETTLE_VERSION_MAJOR=${nettle_version%%.*}" >> $config_host_mak
6373fi
6374if test "$tasn1" = "yes" ; then
6375  echo "CONFIG_TASN1=y" >> $config_host_mak
6376fi
6377if test "$have_ifaddrs_h" = "yes" ; then
6378    echo "HAVE_IFADDRS_H=y" >> $config_host_mak
6379fi
6380if test "$have_broken_size_max" = "yes" ; then
6381    echo "HAVE_BROKEN_SIZE_MAX=y" >> $config_host_mak
6382fi
6383
6384# Work around a system header bug with some kernel/XFS header
6385# versions where they both try to define 'struct fsxattr':
6386# xfs headers will not try to redefine structs from linux headers
6387# if this macro is set.
6388if test "$have_fsxattr" = "yes" ; then
6389    echo "HAVE_FSXATTR=y" >> $config_host_mak
6390fi
6391if test "$have_copy_file_range" = "yes" ; then
6392    echo "HAVE_COPY_FILE_RANGE=y" >> $config_host_mak
6393fi
6394if test "$vte" = "yes" ; then
6395  echo "CONFIG_VTE=y" >> $config_host_mak
6396  echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak
6397  echo "VTE_LIBS=$vte_libs" >> $config_host_mak
6398fi
6399if test "$virglrenderer" = "yes" ; then
6400  echo "CONFIG_VIRGL=y" >> $config_host_mak
6401  echo "VIRGL_CFLAGS=$virgl_cflags" >> $config_host_mak
6402  echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak
6403fi
6404if test "$xen" = "yes" ; then
6405  echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
6406  echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
6407  if test "$xen_pv_domain_build" = "yes" ; then
6408    echo "CONFIG_XEN_PV_DOMAIN_BUILD=y" >> $config_host_mak
6409  fi
6410fi
6411if test "$linux_aio" = "yes" ; then
6412  echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
6413fi
6414if test "$attr" = "yes" ; then
6415  echo "CONFIG_ATTR=y" >> $config_host_mak
6416fi
6417if test "$libattr" = "yes" ; then
6418  echo "CONFIG_LIBATTR=y" >> $config_host_mak
6419fi
6420if test "$virtfs" = "yes" ; then
6421  echo "CONFIG_VIRTFS=y" >> $config_host_mak
6422fi
6423if test "$mpath" = "yes" ; then
6424  echo "CONFIG_MPATH=y" >> $config_host_mak
6425  if test "$mpathpersist_new_api" = "yes"; then
6426    echo "CONFIG_MPATH_NEW_API=y" >> $config_host_mak
6427  fi
6428fi
6429if test "$vhost_scsi" = "yes" ; then
6430  echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
6431fi
6432if test "$vhost_net" = "yes" -a "$vhost_user" = "yes"; then
6433  echo "CONFIG_VHOST_NET_USED=y" >> $config_host_mak
6434fi
6435if test "$vhost_crypto" = "yes" ; then
6436  echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
6437fi
6438if test "$vhost_vsock" = "yes" ; then
6439  echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
6440fi
6441if test "$vhost_user" = "yes" ; then
6442  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
6443fi
6444if test "$blobs" = "yes" ; then
6445  echo "INSTALL_BLOBS=yes" >> $config_host_mak
6446fi
6447if test "$iovec" = "yes" ; then
6448  echo "CONFIG_IOVEC=y" >> $config_host_mak
6449fi
6450if test "$preadv" = "yes" ; then
6451  echo "CONFIG_PREADV=y" >> $config_host_mak
6452fi
6453if test "$fdt" != "no" ; then
6454  echo "CONFIG_FDT=y" >> $config_host_mak
6455fi
6456if test "$membarrier" = "yes" ; then
6457  echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
6458fi
6459if test "$signalfd" = "yes" ; then
6460  echo "CONFIG_SIGNALFD=y" >> $config_host_mak
6461fi
6462if test "$tcg" = "yes"; then
6463  echo "CONFIG_TCG=y" >> $config_host_mak
6464  if test "$tcg_interpreter" = "yes" ; then
6465    echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
6466  fi
6467fi
6468if test "$fdatasync" = "yes" ; then
6469  echo "CONFIG_FDATASYNC=y" >> $config_host_mak
6470fi
6471if test "$madvise" = "yes" ; then
6472  echo "CONFIG_MADVISE=y" >> $config_host_mak
6473fi
6474if test "$posix_madvise" = "yes" ; then
6475  echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak
6476fi
6477if test "$posix_memalign" = "yes" ; then
6478  echo "CONFIG_POSIX_MEMALIGN=y" >> $config_host_mak
6479fi
6480
6481if test "$spice" = "yes" ; then
6482  echo "CONFIG_SPICE=y" >> $config_host_mak
6483fi
6484
6485if test "$smartcard" = "yes" ; then
6486  echo "CONFIG_SMARTCARD=y" >> $config_host_mak
6487  echo "SMARTCARD_CFLAGS=$libcacard_cflags" >> $config_host_mak
6488  echo "SMARTCARD_LIBS=$libcacard_libs" >> $config_host_mak
6489fi
6490
6491if test "$libusb" = "yes" ; then
6492  echo "CONFIG_USB_LIBUSB=y" >> $config_host_mak
6493  echo "LIBUSB_CFLAGS=$libusb_cflags" >> $config_host_mak
6494  echo "LIBUSB_LIBS=$libusb_libs" >> $config_host_mak
6495fi
6496
6497if test "$usb_redir" = "yes" ; then
6498  echo "CONFIG_USB_REDIR=y" >> $config_host_mak
6499  echo "USB_REDIR_CFLAGS=$usb_redir_cflags" >> $config_host_mak
6500  echo "USB_REDIR_LIBS=$usb_redir_libs" >> $config_host_mak
6501fi
6502
6503if test "$opengl" = "yes" ; then
6504  echo "CONFIG_OPENGL=y" >> $config_host_mak
6505  echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
6506  if test "$opengl_dmabuf" = "yes" ; then
6507    echo "CONFIG_OPENGL_DMABUF=y" >> $config_host_mak
6508  fi
6509fi
6510
6511if test "$malloc_trim" = "yes" ; then
6512  echo "CONFIG_MALLOC_TRIM=y" >> $config_host_mak
6513fi
6514
6515if test "$avx2_opt" = "yes" ; then
6516  echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
6517fi
6518
6519if test "$lzo" = "yes" ; then
6520  echo "CONFIG_LZO=y" >> $config_host_mak
6521fi
6522
6523if test "$snappy" = "yes" ; then
6524  echo "CONFIG_SNAPPY=y" >> $config_host_mak
6525fi
6526
6527if test "$bzip2" = "yes" ; then
6528  echo "CONFIG_BZIP2=y" >> $config_host_mak
6529  echo "BZIP2_LIBS=-lbz2" >> $config_host_mak
6530fi
6531
6532if test "$libiscsi" = "yes" ; then
6533  echo "CONFIG_LIBISCSI=m" >> $config_host_mak
6534  echo "LIBISCSI_CFLAGS=$libiscsi_cflags" >> $config_host_mak
6535  echo "LIBISCSI_LIBS=$libiscsi_libs" >> $config_host_mak
6536fi
6537
6538if test "$libnfs" = "yes" ; then
6539  echo "CONFIG_LIBNFS=m" >> $config_host_mak
6540  echo "LIBNFS_LIBS=$libnfs_libs" >> $config_host_mak
6541fi
6542
6543if test "$seccomp" = "yes"; then
6544  echo "CONFIG_SECCOMP=y" >> $config_host_mak
6545  echo "SECCOMP_CFLAGS=$seccomp_cflags" >> $config_host_mak
6546  echo "SECCOMP_LIBS=$seccomp_libs" >> $config_host_mak
6547fi
6548
6549# XXX: suppress that
6550if [ "$bsd" = "yes" ] ; then
6551  echo "CONFIG_BSD=y" >> $config_host_mak
6552fi
6553
6554if test "$localtime_r" = "yes" ; then
6555  echo "CONFIG_LOCALTIME_R=y" >> $config_host_mak
6556fi
6557if test "$qom_cast_debug" = "yes" ; then
6558  echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
6559fi
6560if test "$rbd" = "yes" ; then
6561  echo "CONFIG_RBD=m" >> $config_host_mak
6562  echo "RBD_CFLAGS=$rbd_cflags" >> $config_host_mak
6563  echo "RBD_LIBS=$rbd_libs" >> $config_host_mak
6564fi
6565
6566echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
6567if test "$coroutine_pool" = "yes" ; then
6568  echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
6569else
6570  echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
6571fi
6572
6573if test "$debug_stack_usage" = "yes" ; then
6574  echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
6575fi
6576
6577if test "$crypto_afalg" = "yes" ; then
6578  echo "CONFIG_AF_ALG=y" >> $config_host_mak
6579fi
6580
6581if test "$open_by_handle_at" = "yes" ; then
6582  echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
6583fi
6584
6585if test "$linux_magic_h" = "yes" ; then
6586  echo "CONFIG_LINUX_MAGIC_H=y" >> $config_host_mak
6587fi
6588
6589if test "$pragma_diagnostic_available" = "yes" ; then
6590  echo "CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE=y" >> $config_host_mak
6591fi
6592
6593if test "$valgrind_h" = "yes" ; then
6594  echo "CONFIG_VALGRIND_H=y" >> $config_host_mak
6595fi
6596
6597if test "$have_asan_iface_fiber" = "yes" ; then
6598    echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
6599fi
6600
6601if test "$has_environ" = "yes" ; then
6602  echo "CONFIG_HAS_ENVIRON=y" >> $config_host_mak
6603fi
6604
6605if test "$cpuid_h" = "yes" ; then
6606  echo "CONFIG_CPUID_H=y" >> $config_host_mak
6607fi
6608
6609if test "$int128" = "yes" ; then
6610  echo "CONFIG_INT128=y" >> $config_host_mak
6611fi
6612
6613if test "$atomic128" = "yes" ; then
6614  echo "CONFIG_ATOMIC128=y" >> $config_host_mak
6615fi
6616
6617if test "$cmpxchg128" = "yes" ; then
6618  echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
6619fi
6620
6621if test "$atomic64" = "yes" ; then
6622  echo "CONFIG_ATOMIC64=y" >> $config_host_mak
6623fi
6624
6625if test "$vector16" = "yes" ; then
6626  echo "CONFIG_VECTOR16=y" >> $config_host_mak
6627fi
6628
6629if test "$getauxval" = "yes" ; then
6630  echo "CONFIG_GETAUXVAL=y" >> $config_host_mak
6631fi
6632
6633if test "$glusterfs" = "yes" ; then
6634  echo "CONFIG_GLUSTERFS=m" >> $config_host_mak
6635  echo "GLUSTERFS_CFLAGS=$glusterfs_cflags" >> $config_host_mak
6636  echo "GLUSTERFS_LIBS=$glusterfs_libs" >> $config_host_mak
6637fi
6638
6639if test "$glusterfs_xlator_opt" = "yes" ; then
6640  echo "CONFIG_GLUSTERFS_XLATOR_OPT=y" >> $config_host_mak
6641fi
6642
6643if test "$glusterfs_discard" = "yes" ; then
6644  echo "CONFIG_GLUSTERFS_DISCARD=y" >> $config_host_mak
6645fi
6646
6647if test "$glusterfs_fallocate" = "yes" ; then
6648  echo "CONFIG_GLUSTERFS_FALLOCATE=y" >> $config_host_mak
6649fi
6650
6651if test "$glusterfs_zerofill" = "yes" ; then
6652  echo "CONFIG_GLUSTERFS_ZEROFILL=y" >> $config_host_mak
6653fi
6654
6655if test "$libssh2" = "yes" ; then
6656  echo "CONFIG_LIBSSH2=m" >> $config_host_mak
6657  echo "LIBSSH2_CFLAGS=$libssh2_cflags" >> $config_host_mak
6658  echo "LIBSSH2_LIBS=$libssh2_libs" >> $config_host_mak
6659fi
6660
6661if test "$live_block_migration" = "yes" ; then
6662  echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
6663fi
6664
6665if test "$tpm" = "yes"; then
6666  echo 'CONFIG_TPM=$(CONFIG_SOFTMMU)' >> $config_host_mak
6667  # TPM passthrough support?
6668  if test "$tpm_passthrough" = "yes"; then
6669    echo "CONFIG_TPM_PASSTHROUGH=y" >> $config_host_mak
6670  fi
6671  # TPM emulator support?
6672  if test "$tpm_emulator" = "yes"; then
6673    echo "CONFIG_TPM_EMULATOR=y" >> $config_host_mak
6674  fi
6675fi
6676
6677echo "TRACE_BACKENDS=$trace_backends" >> $config_host_mak
6678if have_backend "nop"; then
6679  echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
6680fi
6681if have_backend "simple"; then
6682  echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
6683  # Set the appropriate trace file.
6684  trace_file="\"$trace_file-\" FMT_pid"
6685fi
6686if have_backend "log"; then
6687  echo "CONFIG_TRACE_LOG=y" >> $config_host_mak
6688fi
6689if have_backend "ust"; then
6690  echo "CONFIG_TRACE_UST=y" >> $config_host_mak
6691fi
6692if have_backend "dtrace"; then
6693  echo "CONFIG_TRACE_DTRACE=y" >> $config_host_mak
6694  if test "$trace_backend_stap" = "yes" ; then
6695    echo "CONFIG_TRACE_SYSTEMTAP=y" >> $config_host_mak
6696  fi
6697fi
6698if have_backend "ftrace"; then
6699  if test "$linux" = "yes" ; then
6700    echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak
6701  else
6702    feature_not_found "ftrace(trace backend)" "ftrace requires Linux"
6703  fi
6704fi
6705if have_backend "syslog"; then
6706  if test "$posix_syslog" = "yes" ; then
6707    echo "CONFIG_TRACE_SYSLOG=y" >> $config_host_mak
6708  else
6709    feature_not_found "syslog(trace backend)" "syslog not available"
6710  fi
6711fi
6712echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
6713
6714if test "$rdma" = "yes" ; then
6715  echo "CONFIG_RDMA=y" >> $config_host_mak
6716  echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
6717fi
6718
6719if test "$pvrdma" = "yes" ; then
6720  echo "CONFIG_PVRDMA=y" >> $config_host_mak
6721fi
6722
6723if test "$have_rtnetlink" = "yes" ; then
6724  echo "CONFIG_RTNETLINK=y" >> $config_host_mak
6725fi
6726
6727if test "$libxml2" = "yes" ; then
6728  echo "CONFIG_LIBXML2=y" >> $config_host_mak
6729  echo "LIBXML2_CFLAGS=$libxml2_cflags" >> $config_host_mak
6730  echo "LIBXML2_LIBS=$libxml2_libs" >> $config_host_mak
6731fi
6732
6733if test "$replication" = "yes" ; then
6734  echo "CONFIG_REPLICATION=y" >> $config_host_mak
6735fi
6736
6737if test "$have_af_vsock" = "yes" ; then
6738  echo "CONFIG_AF_VSOCK=y" >> $config_host_mak
6739fi
6740
6741if test "$have_sysmacros" = "yes" ; then
6742  echo "CONFIG_SYSMACROS=y" >> $config_host_mak
6743fi
6744
6745if test "$have_static_assert" = "yes" ; then
6746  echo "CONFIG_STATIC_ASSERT=y" >> $config_host_mak
6747fi
6748
6749if test "$have_utmpx" = "yes" ; then
6750  echo "HAVE_UTMPX=y" >> $config_host_mak
6751fi
6752
6753if test "$ivshmem" = "yes" ; then
6754  echo "CONFIG_IVSHMEM=y" >> $config_host_mak
6755fi
6756if test "$capstone" != "no" ; then
6757  echo "CONFIG_CAPSTONE=y" >> $config_host_mak
6758fi
6759if test "$debug_mutex" = "yes" ; then
6760  echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
6761fi
6762
6763# Hold two types of flag:
6764#   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
6765#                                     a thread we have a handle to
6766#   CONFIG_PTHREAD_SETNAME_NP       - A way of doing it on a particular
6767#                                     platform
6768if test "$pthread_setname_np" = "yes" ; then
6769  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
6770  echo "CONFIG_PTHREAD_SETNAME_NP=y" >> $config_host_mak
6771fi
6772
6773if test "$vxhs" = "yes" ; then
6774  echo "CONFIG_VXHS=y" >> $config_host_mak
6775  echo "VXHS_LIBS=$vxhs_libs" >> $config_host_mak
6776fi
6777
6778if test "$libpmem" = "yes" ; then
6779  echo "CONFIG_LIBPMEM=y" >> $config_host_mak
6780fi
6781
6782if test "$tcg_interpreter" = "yes"; then
6783  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/tci $QEMU_INCLUDES"
6784elif test "$ARCH" = "sparc64" ; then
6785  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/sparc $QEMU_INCLUDES"
6786elif test "$ARCH" = "s390x" ; then
6787  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/s390 $QEMU_INCLUDES"
6788elif test "$ARCH" = "x86_64" -o "$ARCH" = "x32" ; then
6789  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/i386 $QEMU_INCLUDES"
6790elif test "$ARCH" = "ppc64" ; then
6791  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/ppc $QEMU_INCLUDES"
6792else
6793  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/\$(ARCH) $QEMU_INCLUDES"
6794fi
6795QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg $QEMU_INCLUDES"
6796
6797echo "TOOLS=$tools" >> $config_host_mak
6798echo "ROMS=$roms" >> $config_host_mak
6799echo "MAKE=$make" >> $config_host_mak
6800echo "INSTALL=$install" >> $config_host_mak
6801echo "INSTALL_DIR=$install -d -m 0755" >> $config_host_mak
6802echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
6803echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
6804echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
6805echo "PYTHON=$python" >> $config_host_mak
6806echo "CC=$cc" >> $config_host_mak
6807if $iasl -h > /dev/null 2>&1; then
6808  echo "IASL=$iasl" >> $config_host_mak
6809fi
6810echo "HOST_CC=$host_cc" >> $config_host_mak
6811echo "CXX=$cxx" >> $config_host_mak
6812echo "OBJCC=$objcc" >> $config_host_mak
6813echo "AR=$ar" >> $config_host_mak
6814echo "ARFLAGS=$ARFLAGS" >> $config_host_mak
6815echo "AS=$as" >> $config_host_mak
6816echo "CCAS=$ccas" >> $config_host_mak
6817echo "CPP=$cpp" >> $config_host_mak
6818echo "OBJCOPY=$objcopy" >> $config_host_mak
6819echo "LD=$ld" >> $config_host_mak
6820echo "RANLIB=$ranlib" >> $config_host_mak
6821echo "NM=$nm" >> $config_host_mak
6822echo "WINDRES=$windres" >> $config_host_mak
6823echo "CFLAGS=$CFLAGS" >> $config_host_mak
6824echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
6825echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
6826echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
6827echo "QEMU_INCLUDES=$QEMU_INCLUDES" >> $config_host_mak
6828if test "$sparse" = "yes" ; then
6829  echo "CC           := REAL_CC=\"\$(CC)\" cgcc"       >> $config_host_mak
6830  echo "CPP          := REAL_CC=\"\$(CPP)\" cgcc"      >> $config_host_mak
6831  echo "CXX          := REAL_CC=\"\$(CXX)\" cgcc"      >> $config_host_mak
6832  echo "HOST_CC      := REAL_CC=\"\$(HOST_CC)\" cgcc"  >> $config_host_mak
6833  echo "QEMU_CFLAGS  += -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-non-pointer-null" >> $config_host_mak
6834fi
6835if test "$cross_prefix" != ""; then
6836  echo "AUTOCONF_HOST := --host=${cross_prefix%-}"     >> $config_host_mak
6837else
6838  echo "AUTOCONF_HOST := "                             >> $config_host_mak
6839fi
6840echo "LDFLAGS=$LDFLAGS" >> $config_host_mak
6841echo "LDFLAGS_NOPIE=$LDFLAGS_NOPIE" >> $config_host_mak
6842echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
6843echo "LD_REL_FLAGS=$LD_REL_FLAGS" >> $config_host_mak
6844echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
6845echo "LIBS+=$LIBS" >> $config_host_mak
6846echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak
6847echo "PTHREAD_LIB=$PTHREAD_LIB" >> $config_host_mak
6848echo "EXESUF=$EXESUF" >> $config_host_mak
6849echo "DSOSUF=$DSOSUF" >> $config_host_mak
6850echo "LDFLAGS_SHARED=$LDFLAGS_SHARED" >> $config_host_mak
6851echo "LIBS_QGA+=$libs_qga" >> $config_host_mak
6852echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak
6853echo "TASN1_CFLAGS=$tasn1_cflags" >> $config_host_mak
6854echo "POD2MAN=$POD2MAN" >> $config_host_mak
6855echo "TRANSLATE_OPT_CFLAGS=$TRANSLATE_OPT_CFLAGS" >> $config_host_mak
6856if test "$gcov" = "yes" ; then
6857  echo "CONFIG_GCOV=y" >> $config_host_mak
6858  echo "GCOV=$gcov_tool" >> $config_host_mak
6859fi
6860
6861if test "$docker" != "no"; then
6862    echo "HAVE_USER_DOCKER=y" >> $config_host_mak
6863fi
6864
6865# use included Linux headers
6866if test "$linux" = "yes" ; then
6867  mkdir -p linux-headers
6868  case "$cpu" in
6869  i386|x86_64|x32)
6870    linux_arch=x86
6871    ;;
6872  ppc|ppc64)
6873    linux_arch=powerpc
6874    ;;
6875  s390x)
6876    linux_arch=s390
6877    ;;
6878  aarch64)
6879    linux_arch=arm64
6880    ;;
6881  mips64)
6882    linux_arch=mips
6883    ;;
6884  *)
6885    # For most CPUs the kernel architecture name and QEMU CPU name match.
6886    linux_arch="$cpu"
6887    ;;
6888  esac
6889    # For non-KVM architectures we will not have asm headers
6890    if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
6891      symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
6892    fi
6893fi
6894
6895for target in $target_list; do
6896target_dir="$target"
6897config_target_mak=$target_dir/config-target.mak
6898target_name=$(echo $target | cut -d '-' -f 1)
6899target_bigendian="no"
6900
6901case "$target_name" in
6902  armeb|aarch64_be|hppa|lm32|m68k|microblaze|mips|mipsn32|mips64|moxie|or1k|ppc|ppc64|ppc64abi32|s390x|sh4eb|sparc|sparc64|sparc32plus|xtensaeb)
6903  target_bigendian=yes
6904  ;;
6905esac
6906target_softmmu="no"
6907target_user_only="no"
6908target_linux_user="no"
6909target_bsd_user="no"
6910case "$target" in
6911  ${target_name}-softmmu)
6912    target_softmmu="yes"
6913    ;;
6914  ${target_name}-linux-user)
6915    target_user_only="yes"
6916    target_linux_user="yes"
6917    ;;
6918  ${target_name}-bsd-user)
6919    target_user_only="yes"
6920    target_bsd_user="yes"
6921    ;;
6922  *)
6923    error_exit "Target '$target' not recognised"
6924    exit 1
6925    ;;
6926esac
6927
6928target_compiler=""
6929target_compiler_static=""
6930target_compiler_cflags=""
6931
6932mkdir -p $target_dir
6933echo "# Automatically generated by configure - do not modify" > $config_target_mak
6934
6935bflt="no"
6936mttcg="no"
6937interp_prefix1=$(echo "$interp_prefix" | sed "s/%M/$target_name/g")
6938gdb_xml_files=""
6939
6940TARGET_ARCH="$target_name"
6941TARGET_BASE_ARCH=""
6942TARGET_ABI_DIR=""
6943
6944case "$target_name" in
6945  i386)
6946    mttcg="yes"
6947    gdb_xml_files="i386-32bit.xml i386-32bit-core.xml i386-32bit-sse.xml"
6948    target_compiler=$cross_cc_i386
6949    target_compiler_cflags=$cross_cc_ccflags_i386
6950  ;;
6951  x86_64)
6952    TARGET_BASE_ARCH=i386
6953    mttcg="yes"
6954    gdb_xml_files="i386-64bit.xml i386-64bit-core.xml i386-64bit-sse.xml"
6955    target_compiler=$cross_cc_x86_64
6956  ;;
6957  alpha)
6958    mttcg="yes"
6959    target_compiler=$cross_cc_alpha
6960  ;;
6961  arm|armeb)
6962    TARGET_ARCH=arm
6963    bflt="yes"
6964    mttcg="yes"
6965    gdb_xml_files="arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"
6966    target_compiler=$cross_cc_arm
6967    eval "target_compiler_cflags=\$cross_cc_cflags_${target_name}"
6968  ;;
6969  aarch64|aarch64_be)
6970    TARGET_ARCH=aarch64
6971    TARGET_BASE_ARCH=arm
6972    bflt="yes"
6973    mttcg="yes"
6974    gdb_xml_files="aarch64-core.xml aarch64-fpu.xml arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"
6975    target_compiler=$cross_cc_aarch64
6976    eval "target_compiler_cflags=\$cross_cc_cflags_${target_name}"
6977  ;;
6978  cris)
6979    target_compiler=$cross_cc_cris
6980  ;;
6981  hppa)
6982    mttcg="yes"
6983    target_compiler=$cross_cc_hppa
6984  ;;
6985  lm32)
6986    target_compiler=$cross_cc_lm32
6987  ;;
6988  m68k)
6989    bflt="yes"
6990    gdb_xml_files="cf-core.xml cf-fp.xml m68k-fp.xml"
6991    target_compiler=$cross_cc_m68k
6992  ;;
6993  microblaze|microblazeel)
6994    TARGET_ARCH=microblaze
6995    bflt="yes"
6996    echo "TARGET_ABI32=y" >> $config_target_mak
6997    target_compiler=$cross_cc_microblaze
6998  ;;
6999  mips|mipsel)
7000    TARGET_ARCH=mips
7001    target_compiler=$cross_cc_mips
7002    echo "TARGET_ABI_MIPSO32=y" >> $config_target_mak
7003  ;;
7004  mipsn32|mipsn32el)
7005    TARGET_ARCH=mips64
7006    TARGET_BASE_ARCH=mips
7007    target_compiler=$cross_cc_mipsn32
7008    echo "TARGET_ABI_MIPSN32=y" >> $config_target_mak
7009    echo "TARGET_ABI32=y" >> $config_target_mak
7010  ;;
7011  mips64|mips64el)
7012    TARGET_ARCH=mips64
7013    TARGET_BASE_ARCH=mips
7014    target_compiler=$cross_cc_mips64
7015    echo "TARGET_ABI_MIPSN64=y" >> $config_target_mak
7016  ;;
7017  moxie)
7018    target_compiler=$cross_cc_moxie
7019  ;;
7020  nios2)
7021    target_compiler=$cross_cc_nios2
7022  ;;
7023  or1k)
7024    target_compiler=$cross_cc_or1k
7025    TARGET_ARCH=openrisc
7026    TARGET_BASE_ARCH=openrisc
7027  ;;
7028  ppc)
7029    gdb_xml_files="power-core.xml power-fpu.xml power-altivec.xml power-spe.xml"
7030    target_compiler=$cross_cc_powerpc
7031  ;;
7032  ppc64)
7033    TARGET_BASE_ARCH=ppc
7034    TARGET_ABI_DIR=ppc
7035    mttcg=yes
7036    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
7037    target_compiler=$cross_cc_ppc64
7038  ;;
7039  ppc64le)
7040    TARGET_ARCH=ppc64
7041    TARGET_BASE_ARCH=ppc
7042    TARGET_ABI_DIR=ppc
7043    mttcg=yes
7044    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
7045    target_compiler=$cross_cc_ppc64le
7046  ;;
7047  ppc64abi32)
7048    TARGET_ARCH=ppc64
7049    TARGET_BASE_ARCH=ppc
7050    TARGET_ABI_DIR=ppc
7051    echo "TARGET_ABI32=y" >> $config_target_mak
7052    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
7053    target_compiler=$cross_cc_ppc64abi32
7054  ;;
7055  riscv32)
7056    TARGET_BASE_ARCH=riscv
7057    TARGET_ABI_DIR=riscv
7058    mttcg=yes
7059    target_compiler=$cross_cc_riscv32
7060  ;;
7061  riscv64)
7062    TARGET_BASE_ARCH=riscv
7063    TARGET_ABI_DIR=riscv
7064    mttcg=yes
7065    target_compiler=$cross_cc_riscv64
7066  ;;
7067  sh4|sh4eb)
7068    TARGET_ARCH=sh4
7069    bflt="yes"
7070    target_compiler=$cross_cc_sh4
7071  ;;
7072  sparc)
7073    target_compiler=$cross_cc_sparc
7074  ;;
7075  sparc64)
7076    TARGET_BASE_ARCH=sparc
7077    target_compiler=$cross_cc_sparc64
7078  ;;
7079  sparc32plus)
7080    TARGET_ARCH=sparc64
7081    TARGET_BASE_ARCH=sparc
7082    TARGET_ABI_DIR=sparc
7083    target_compiler=$cross_cc_sparc32plus
7084    echo "TARGET_ABI32=y" >> $config_target_mak
7085  ;;
7086  s390x)
7087    mttcg=yes
7088    gdb_xml_files="s390x-core64.xml s390-acr.xml s390-fpr.xml s390-vx.xml s390-cr.xml s390-virt.xml s390-gs.xml"
7089    target_compiler=$cross_cc_s390x
7090  ;;
7091  tilegx)
7092    target_compiler=$cross_cc_tilegx
7093  ;;
7094  tricore)
7095    target_compiler=$cross_cc_tricore
7096  ;;
7097  unicore32)
7098    target_compiler=$cross_cc_unicore32
7099  ;;
7100  xtensa|xtensaeb)
7101    TARGET_ARCH=xtensa
7102    mttcg="yes"
7103    target_compiler=$cross_cc_xtensa
7104  ;;
7105  *)
7106    error_exit "Unsupported target CPU"
7107  ;;
7108esac
7109# TARGET_BASE_ARCH needs to be defined after TARGET_ARCH
7110if [ "$TARGET_BASE_ARCH" = "" ]; then
7111  TARGET_BASE_ARCH=$TARGET_ARCH
7112fi
7113
7114# Do we have a cross compiler for this target?
7115if has $target_compiler; then
7116
7117    write_c_skeleton
7118
7119    if ! do_compiler "$target_compiler" $target_compiler_cflags -o $TMPE $TMPC -static ; then
7120        # For host systems we might get away with building without -static
7121        if ! do_compiler "$target_compiler" $target_compiler_cflags -o $TMPE $TMPC ; then
7122            target_compiler=""
7123        else
7124            enabled_cross_compilers="${enabled_cross_compilers} '${target_compiler}'"
7125            target_compiler_static="n"
7126        fi
7127    else
7128        enabled_cross_compilers="${enabled_cross_compilers} '${target_compiler}'"
7129        target_compiler_static="y"
7130    fi
7131else
7132    target_compiler=""
7133fi
7134
7135symlink "$source_path/Makefile.target" "$target_dir/Makefile"
7136
7137upper() {
7138    echo "$@"| LC_ALL=C tr '[a-z]' '[A-Z]'
7139}
7140
7141target_arch_name="$(upper $TARGET_ARCH)"
7142echo "TARGET_$target_arch_name=y" >> $config_target_mak
7143echo "TARGET_NAME=$target_name" >> $config_target_mak
7144echo "TARGET_BASE_ARCH=$TARGET_BASE_ARCH" >> $config_target_mak
7145if [ "$TARGET_ABI_DIR" = "" ]; then
7146  TARGET_ABI_DIR=$TARGET_ARCH
7147fi
7148echo "TARGET_ABI_DIR=$TARGET_ABI_DIR" >> $config_target_mak
7149if [ "$HOST_VARIANT_DIR" != "" ]; then
7150    echo "HOST_VARIANT_DIR=$HOST_VARIANT_DIR" >> $config_target_mak
7151fi
7152
7153if supported_xen_target $target; then
7154    echo "CONFIG_XEN=y" >> $config_target_mak
7155    if test "$xen_pci_passthrough" = yes; then
7156        echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak"
7157    fi
7158fi
7159if supported_kvm_target $target; then
7160    echo "CONFIG_KVM=y" >> $config_target_mak
7161    if test "$vhost_net" = "yes" ; then
7162        echo "CONFIG_VHOST_NET=y" >> $config_target_mak
7163        if test "$vhost_user" = "yes" ; then
7164            echo "CONFIG_VHOST_USER_NET_TEST_$target_name=y" >> $config_host_mak
7165        fi
7166    fi
7167fi
7168if supported_hax_target $target; then
7169    echo "CONFIG_HAX=y" >> $config_target_mak
7170fi
7171if supported_hvf_target $target; then
7172    echo "CONFIG_HVF=y" >> $config_target_mak
7173fi
7174if supported_whpx_target $target; then
7175    echo "CONFIG_WHPX=y" >> $config_target_mak
7176fi
7177if test "$target_bigendian" = "yes" ; then
7178  echo "TARGET_WORDS_BIGENDIAN=y" >> $config_target_mak
7179fi
7180if test "$target_softmmu" = "yes" ; then
7181  echo "CONFIG_SOFTMMU=y" >> $config_target_mak
7182  if test "$mttcg" = "yes" ; then
7183    echo "TARGET_SUPPORTS_MTTCG=y" >> $config_target_mak
7184  fi
7185fi
7186if test "$target_user_only" = "yes" ; then
7187  echo "CONFIG_USER_ONLY=y" >> $config_target_mak
7188  echo "CONFIG_QEMU_INTERP_PREFIX=\"$interp_prefix1\"" >> $config_target_mak
7189fi
7190if test "$target_linux_user" = "yes" ; then
7191  echo "CONFIG_LINUX_USER=y" >> $config_target_mak
7192fi
7193list=""
7194if test ! -z "$gdb_xml_files" ; then
7195  for x in $gdb_xml_files; do
7196    list="$list $source_path/gdb-xml/$x"
7197  done
7198  echo "TARGET_XML_FILES=$list" >> $config_target_mak
7199fi
7200
7201if test "$target_user_only" = "yes" -a "$bflt" = "yes"; then
7202  echo "TARGET_HAS_BFLT=y" >> $config_target_mak
7203fi
7204if test "$target_bsd_user" = "yes" ; then
7205  echo "CONFIG_BSD_USER=y" >> $config_target_mak
7206fi
7207
7208if test -n "$target_compiler"; then
7209  echo "CROSS_CC_GUEST=\"$target_compiler\"" >> $config_target_mak
7210
7211  if test -n "$target_compiler_static"; then
7212      echo "CROSS_CC_GUEST_STATIC=$target_compiler_static" >> $config_target_mak
7213  fi
7214
7215  if test -n "$target_compiler_cflags"; then
7216      echo "CROSS_CC_GUEST_CFLAGS=$target_compiler_cflags" >> $config_target_mak
7217  fi
7218fi
7219
7220
7221# generate QEMU_CFLAGS/LDFLAGS for targets
7222
7223cflags=""
7224ldflags=""
7225
7226disas_config() {
7227  echo "CONFIG_${1}_DIS=y" >> $config_target_mak
7228  echo "CONFIG_${1}_DIS=y" >> config-all-disas.mak
7229}
7230
7231for i in $ARCH $TARGET_BASE_ARCH ; do
7232  case "$i" in
7233  alpha)
7234    disas_config "ALPHA"
7235  ;;
7236  aarch64)
7237    if test -n "${cxx}"; then
7238      disas_config "ARM_A64"
7239    fi
7240  ;;
7241  arm)
7242    disas_config "ARM"
7243    if test -n "${cxx}"; then
7244      disas_config "ARM_A64"
7245    fi
7246  ;;
7247  cris)
7248    disas_config "CRIS"
7249  ;;
7250  hppa)
7251    disas_config "HPPA"
7252  ;;
7253  i386|x86_64|x32)
7254    disas_config "I386"
7255  ;;
7256  lm32)
7257    disas_config "LM32"
7258  ;;
7259  m68k)
7260    disas_config "M68K"
7261  ;;
7262  microblaze*)
7263    disas_config "MICROBLAZE"
7264  ;;
7265  mips*)
7266    disas_config "MIPS"
7267    if test -n "${cxx}"; then
7268      disas_config "NANOMIPS"
7269    fi
7270  ;;
7271  moxie*)
7272    disas_config "MOXIE"
7273  ;;
7274  nios2)
7275    disas_config "NIOS2"
7276  ;;
7277  or1k)
7278    disas_config "OPENRISC"
7279  ;;
7280  ppc*)
7281    disas_config "PPC"
7282  ;;
7283  riscv)
7284    disas_config "RISCV"
7285  ;;
7286  s390*)
7287    disas_config "S390"
7288  ;;
7289  sh4)
7290    disas_config "SH4"
7291  ;;
7292  sparc*)
7293    disas_config "SPARC"
7294  ;;
7295  xtensa*)
7296    disas_config "XTENSA"
7297  ;;
7298  esac
7299done
7300if test "$tcg_interpreter" = "yes" ; then
7301  disas_config "TCI"
7302fi
7303
7304case "$ARCH" in
7305alpha)
7306  # Ensure there's only a single GP
7307  cflags="-msmall-data $cflags"
7308;;
7309esac
7310
7311if test "$gprof" = "yes" ; then
7312  echo "TARGET_GPROF=yes" >> $config_target_mak
7313  if test "$target_linux_user" = "yes" ; then
7314    cflags="-p $cflags"
7315    ldflags="-p $ldflags"
7316  fi
7317  if test "$target_softmmu" = "yes" ; then
7318    ldflags="-p $ldflags"
7319    echo "GPROF_CFLAGS=-p" >> $config_target_mak
7320  fi
7321fi
7322
7323if test "$target_linux_user" = "yes" -o "$target_bsd_user" = "yes" ; then
7324  ldflags="$ldflags $textseg_ldflags"
7325fi
7326
7327# Newer kernels on s390 check for an S390_PGSTE program header and
7328# enable the pgste page table extensions in that case. This makes
7329# the vm.allocate_pgste sysctl unnecessary. We enable this program
7330# header if
7331#  - we build on s390x
7332#  - we build the system emulation for s390x (qemu-system-s390x)
7333#  - KVM is enabled
7334#  - the linker supports --s390-pgste
7335if test "$TARGET_ARCH" = "s390x" -a "$target_softmmu" = "yes"  -a "$ARCH" = "s390x" -a "$kvm" = "yes"; then
7336    if ld_has --s390-pgste ; then
7337        ldflags="-Wl,--s390-pgste $ldflags"
7338    fi
7339fi
7340
7341echo "LDFLAGS+=$ldflags" >> $config_target_mak
7342echo "QEMU_CFLAGS+=$cflags" >> $config_target_mak
7343
7344done # for target in $targets
7345
7346if test -n "$enabled_cross_compilers"; then
7347    echo
7348    echo "NOTE: cross-compilers enabled: $enabled_cross_compilers"
7349fi
7350
7351if [ "$fdt" = "git" ]; then
7352  echo "config-host.h: subdir-dtc" >> $config_host_mak
7353fi
7354if [ "$capstone" = "git" -o "$capstone" = "internal" ]; then
7355  echo "config-host.h: subdir-capstone" >> $config_host_mak
7356fi
7357if test -n "$LIBCAPSTONE"; then
7358  echo "LIBCAPSTONE=$LIBCAPSTONE" >> $config_host_mak
7359fi
7360
7361if test "$numa" = "yes"; then
7362  echo "CONFIG_NUMA=y" >> $config_host_mak
7363fi
7364
7365if test "$ccache_cpp2" = "yes"; then
7366  echo "export CCACHE_CPP2=y" >> $config_host_mak
7367fi
7368
7369# build tree in object directory in case the source is not in the current directory
7370DIRS="tests tests/tcg tests/tcg/cris tests/tcg/lm32 tests/libqos tests/qapi-schema tests/tcg/xtensa tests/qemu-iotests tests/vm"
7371DIRS="$DIRS tests/fp"
7372DIRS="$DIRS docs docs/interop fsdev scsi"
7373DIRS="$DIRS pc-bios/optionrom pc-bios/spapr-rtas pc-bios/s390-ccw"
7374DIRS="$DIRS roms/seabios roms/vgabios"
7375FILES="Makefile tests/tcg/Makefile qdict-test-data.txt"
7376FILES="$FILES tests/tcg/cris/Makefile tests/tcg/cris/.gdbinit"
7377FILES="$FILES tests/tcg/lm32/Makefile tests/tcg/xtensa/Makefile po/Makefile"
7378FILES="$FILES tests/fp/Makefile"
7379FILES="$FILES pc-bios/optionrom/Makefile pc-bios/keymaps"
7380FILES="$FILES pc-bios/spapr-rtas/Makefile"
7381FILES="$FILES pc-bios/s390-ccw/Makefile"
7382FILES="$FILES roms/seabios/Makefile roms/vgabios/Makefile"
7383FILES="$FILES pc-bios/qemu-icon.bmp"
7384FILES="$FILES .gdbinit scripts" # scripts needed by relative path in .gdbinit
7385for bios_file in \
7386    $source_path/pc-bios/*.bin \
7387    $source_path/pc-bios/*.lid \
7388    $source_path/pc-bios/*.aml \
7389    $source_path/pc-bios/*.rom \
7390    $source_path/pc-bios/*.dtb \
7391    $source_path/pc-bios/*.img \
7392    $source_path/pc-bios/openbios-* \
7393    $source_path/pc-bios/u-boot.* \
7394    $source_path/pc-bios/palcode-*
7395do
7396    FILES="$FILES pc-bios/$(basename $bios_file)"
7397done
7398for test_file in $(find $source_path/tests/acpi-test-data -type f)
7399do
7400    FILES="$FILES tests/acpi-test-data$(echo $test_file | sed -e 's/.*acpi-test-data//')"
7401done
7402for test_file in $(find $source_path/tests/hex-loader-check-data -type f)
7403do
7404    FILES="$FILES tests/hex-loader-check-data$(echo $test_file | sed -e 's/.*hex-loader-check-data//')"
7405done
7406mkdir -p $DIRS
7407for f in $FILES ; do
7408    if [ -e "$source_path/$f" ] && [ "$pwd_is_source_path" != "y" ]; then
7409        symlink "$source_path/$f" "$f"
7410    fi
7411done
7412
7413# temporary config to build submodules
7414for rom in seabios vgabios ; do
7415    config_mak=roms/$rom/config.mak
7416    echo "# Automatically generated by configure - do not modify" > $config_mak
7417    echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
7418    echo "AS=$as" >> $config_mak
7419    echo "CCAS=$ccas" >> $config_mak
7420    echo "CC=$cc" >> $config_mak
7421    echo "BCC=bcc" >> $config_mak
7422    echo "CPP=$cpp" >> $config_mak
7423    echo "OBJCOPY=objcopy" >> $config_mak
7424    echo "IASL=$iasl" >> $config_mak
7425    echo "LD=$ld" >> $config_mak
7426    echo "RANLIB=$ranlib" >> $config_mak
7427done
7428
7429# set up tests data directory
7430for tests_subdir in acceptance data; do
7431    if [ ! -e tests/$tests_subdir ]; then
7432        symlink "$source_path/tests/$tests_subdir" tests/$tests_subdir
7433    fi
7434done
7435
7436# set up qemu-iotests in this build directory
7437iotests_common_env="tests/qemu-iotests/common.env"
7438iotests_check="tests/qemu-iotests/check"
7439
7440echo "# Automatically generated by configure - do not modify" > "$iotests_common_env"
7441echo >> "$iotests_common_env"
7442echo "export PYTHON='$python'" >> "$iotests_common_env"
7443
7444if [ ! -e "$iotests_check" ]; then
7445    symlink "$source_path/$iotests_check" "$iotests_check"
7446fi
7447
7448# Save the configure command line for later reuse.
7449cat <<EOD >config.status
7450#!/bin/sh
7451# Generated by configure.
7452# Run this file to recreate the current configuration.
7453# Compiler output produced by configure, useful for debugging
7454# configure, is in config.log if it exists.
7455EOD
7456
7457preserve_env() {
7458    envname=$1
7459
7460    eval envval=\$$envname
7461
7462    if test -n "$envval"
7463    then
7464	echo "$envname='$envval'" >> config.status
7465	echo "export $envname" >> config.status
7466    else
7467	echo "unset $envname" >> config.status
7468    fi
7469}
7470
7471# Preserve various env variables that influence what
7472# features/build target configure will detect
7473preserve_env AR
7474preserve_env AS
7475preserve_env CC
7476preserve_env CPP
7477preserve_env CXX
7478preserve_env INSTALL
7479preserve_env LD
7480preserve_env LD_LIBRARY_PATH
7481preserve_env LIBTOOL
7482preserve_env MAKE
7483preserve_env NM
7484preserve_env OBJCOPY
7485preserve_env PATH
7486preserve_env PKG_CONFIG
7487preserve_env PKG_CONFIG_LIBDIR
7488preserve_env PKG_CONFIG_PATH
7489preserve_env PYTHON
7490preserve_env SDL_CONFIG
7491preserve_env SDL2_CONFIG
7492preserve_env SMBD
7493preserve_env STRIP
7494preserve_env WINDRES
7495
7496printf "exec" >>config.status
7497printf " '%s'" "$0" "$@" >>config.status
7498echo ' "$@"' >>config.status
7499chmod +x config.status
7500
7501rm -r "$TMPDIR1"
7502