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