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