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