xref: /openbmc/qemu/configure (revision 4b9fa0b4)
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
3619if test "$plugins" = yes; then
3620    glib_modules="$glib_modules gmodule-2.0"
3621fi
3622
3623# This workaround is required due to a bug in pkg-config file for glib as it
3624# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
3625
3626if test "$static" = yes && test "$mingw32" = yes; then
3627    QEMU_CFLAGS="-DGLIB_STATIC_COMPILATION $QEMU_CFLAGS"
3628fi
3629
3630for i in $glib_modules; do
3631    if $pkg_config --atleast-version=$glib_req_ver $i; then
3632        glib_cflags=$($pkg_config --cflags $i)
3633        glib_libs=$($pkg_config --libs $i)
3634        QEMU_CFLAGS="$glib_cflags $QEMU_CFLAGS"
3635        LIBS="$glib_libs $LIBS"
3636        libs_qga="$glib_libs $libs_qga"
3637    else
3638        error_exit "glib-$glib_req_ver $i is required to compile QEMU"
3639    fi
3640done
3641
3642if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
3643    gio=yes
3644    gio_cflags=$($pkg_config --cflags gio-2.0)
3645    gio_libs=$($pkg_config --libs gio-2.0)
3646else
3647    gio=no
3648fi
3649
3650# Sanity check that the current size_t matches the
3651# size that glib thinks it should be. This catches
3652# problems on multi-arch where people try to build
3653# 32-bit QEMU while pointing at 64-bit glib headers
3654cat > $TMPC <<EOF
3655#include <glib.h>
3656#include <unistd.h>
3657
3658#define QEMU_BUILD_BUG_ON(x) \
3659  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
3660
3661int main(void) {
3662   QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
3663   return 0;
3664}
3665EOF
3666
3667if ! compile_prog "$CFLAGS" "$LIBS" ; then
3668    error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
3669               "You probably need to set PKG_CONFIG_LIBDIR"\
3670	       "to point to the right pkg-config files for your"\
3671	       "build target"
3672fi
3673
3674# Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
3675cat > $TMPC << EOF
3676#include <glib.h>
3677int main(void) { return 0; }
3678EOF
3679if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3680    if cc_has_warning_flag "-Wno-unknown-attributes"; then
3681        glib_cflags="-Wno-unknown-attributes $glib_cflags"
3682        CFLAGS="-Wno-unknown-attributes $CFLAGS"
3683    fi
3684fi
3685
3686#########################################
3687# zlib check
3688
3689if test "$zlib" != "no" ; then
3690    if $pkg_config --exists zlib; then
3691        zlib_cflags=$($pkg_config --cflags zlib)
3692        zlib_libs=$($pkg_config --libs zlib)
3693        QEMU_CFLAGS="$zlib_cflags $QEMU_CFLAGS"
3694        LIBS="$zlib_libs $LIBS"
3695    else
3696        cat > $TMPC << EOF
3697#include <zlib.h>
3698int main(void) { zlibVersion(); return 0; }
3699EOF
3700        if compile_prog "" "-lz" ; then
3701            LIBS="$LIBS -lz"
3702        else
3703            error_exit "zlib check failed" \
3704                "Make sure to have the zlib libs and headers installed."
3705        fi
3706    fi
3707fi
3708
3709##########################################
3710# SHA command probe for modules
3711if test "$modules" = yes; then
3712    shacmd_probe="sha1sum sha1 shasum"
3713    for c in $shacmd_probe; do
3714        if has $c; then
3715            shacmd="$c"
3716            break
3717        fi
3718    done
3719    if test "$shacmd" = ""; then
3720        error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
3721    fi
3722fi
3723
3724##########################################
3725# pixman support probe
3726
3727if test "$want_tools" = "no" && test "$softmmu" = "no"; then
3728  pixman_cflags=
3729  pixman_libs=
3730elif $pkg_config --atleast-version=0.21.8 pixman-1 > /dev/null 2>&1; then
3731  pixman_cflags=$($pkg_config --cflags pixman-1)
3732  pixman_libs=$($pkg_config --libs pixman-1)
3733else
3734  error_exit "pixman >= 0.21.8 not present." \
3735      "Please install the pixman devel package."
3736fi
3737
3738##########################################
3739# libmpathpersist probe
3740
3741if test "$mpath" != "no" ; then
3742  # probe for the new API
3743  cat > $TMPC <<EOF
3744#include <libudev.h>
3745#include <mpath_persist.h>
3746unsigned mpath_mx_alloc_len = 1024;
3747int logsink;
3748static struct config *multipath_conf;
3749extern struct udev *udev;
3750extern struct config *get_multipath_config(void);
3751extern void put_multipath_config(struct config *conf);
3752struct udev *udev;
3753struct config *get_multipath_config(void) { return multipath_conf; }
3754void put_multipath_config(struct config *conf) { }
3755
3756int main(void) {
3757    udev = udev_new();
3758    multipath_conf = mpath_lib_init();
3759    return 0;
3760}
3761EOF
3762  if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
3763    mpathpersist=yes
3764    mpathpersist_new_api=yes
3765  else
3766    # probe for the old API
3767    cat > $TMPC <<EOF
3768#include <libudev.h>
3769#include <mpath_persist.h>
3770unsigned mpath_mx_alloc_len = 1024;
3771int logsink;
3772int main(void) {
3773    struct udev *udev = udev_new();
3774    mpath_lib_init(udev);
3775    return 0;
3776}
3777EOF
3778    if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
3779      mpathpersist=yes
3780      mpathpersist_new_api=no
3781    else
3782      mpathpersist=no
3783    fi
3784  fi
3785else
3786  mpathpersist=no
3787fi
3788
3789##########################################
3790# libcap probe
3791
3792if test "$cap" != "no" ; then
3793  cat > $TMPC <<EOF
3794#include <stdio.h>
3795#include <sys/capability.h>
3796int main(void) { cap_t caps; caps = cap_init(); return caps != NULL; }
3797EOF
3798  if compile_prog "" "-lcap" ; then
3799    cap=yes
3800  else
3801    cap=no
3802  fi
3803fi
3804
3805##########################################
3806# pthread probe
3807PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
3808
3809pthread=no
3810cat > $TMPC << EOF
3811#include <pthread.h>
3812static void *f(void *p) { return NULL; }
3813int main(void) {
3814  pthread_t thread;
3815  pthread_create(&thread, 0, f, 0);
3816  return 0;
3817}
3818EOF
3819if compile_prog "" "" ; then
3820  pthread=yes
3821else
3822  for pthread_lib in $PTHREADLIBS_LIST; do
3823    if compile_prog "" "$pthread_lib" ; then
3824      pthread=yes
3825      found=no
3826      for lib_entry in $LIBS; do
3827        if test "$lib_entry" = "$pthread_lib"; then
3828          found=yes
3829          break
3830        fi
3831      done
3832      if test "$found" = "no"; then
3833        LIBS="$pthread_lib $LIBS"
3834        libs_qga="$pthread_lib $libs_qga"
3835      fi
3836      PTHREAD_LIB="$pthread_lib"
3837      break
3838    fi
3839  done
3840fi
3841
3842if test "$mingw32" != yes && test "$pthread" = no; then
3843  error_exit "pthread check failed" \
3844      "Make sure to have the pthread libs and headers installed."
3845fi
3846
3847# check for pthread_setname_np with thread id
3848pthread_setname_np_w_tid=no
3849cat > $TMPC << EOF
3850#include <pthread.h>
3851
3852static void *f(void *p) { return NULL; }
3853int main(void)
3854{
3855    pthread_t thread;
3856    pthread_create(&thread, 0, f, 0);
3857    pthread_setname_np(thread, "QEMU");
3858    return 0;
3859}
3860EOF
3861if compile_prog "" "$pthread_lib" ; then
3862  pthread_setname_np_w_tid=yes
3863fi
3864
3865# check for pthread_setname_np without thread id
3866pthread_setname_np_wo_tid=no
3867cat > $TMPC << EOF
3868#include <pthread.h>
3869
3870static void *f(void *p) { pthread_setname_np("QEMU"); }
3871int main(void)
3872{
3873    pthread_t thread;
3874    pthread_create(&thread, 0, f, 0);
3875    return 0;
3876}
3877EOF
3878if compile_prog "" "$pthread_lib" ; then
3879  pthread_setname_np_wo_tid=yes
3880fi
3881
3882##########################################
3883# rbd probe
3884if test "$rbd" != "no" ; then
3885  cat > $TMPC <<EOF
3886#include <stdio.h>
3887#include <rbd/librbd.h>
3888int main(void) {
3889    rados_t cluster;
3890    rados_create(&cluster, NULL);
3891    return 0;
3892}
3893EOF
3894  rbd_libs="-lrbd -lrados"
3895  if compile_prog "" "$rbd_libs" ; then
3896    rbd=yes
3897  else
3898    if test "$rbd" = "yes" ; then
3899      feature_not_found "rados block device" "Install librbd/ceph devel"
3900    fi
3901    rbd=no
3902  fi
3903fi
3904
3905##########################################
3906# libssh probe
3907if test "$libssh" != "no" ; then
3908  if $pkg_config --exists libssh; then
3909    libssh_cflags=$($pkg_config libssh --cflags)
3910    libssh_libs=$($pkg_config libssh --libs)
3911    libssh=yes
3912  else
3913    if test "$libssh" = "yes" ; then
3914      error_exit "libssh required for --enable-libssh"
3915    fi
3916    libssh=no
3917  fi
3918fi
3919
3920##########################################
3921# Check for libssh 0.8
3922# This is done like this instead of using the LIBSSH_VERSION_* and
3923# SSH_VERSION_* macros because some distributions in the past shipped
3924# snapshots of the future 0.8 from Git, and those snapshots did not
3925# have updated version numbers (still referring to 0.7.0).
3926
3927if test "$libssh" = "yes"; then
3928  cat > $TMPC <<EOF
3929#include <libssh/libssh.h>
3930int main(void) { return ssh_get_server_publickey(NULL, NULL); }
3931EOF
3932  if compile_prog "$libssh_cflags" "$libssh_libs"; then
3933    libssh_cflags="-DHAVE_LIBSSH_0_8 $libssh_cflags"
3934  fi
3935fi
3936
3937##########################################
3938# linux-aio probe
3939
3940if test "$linux_aio" != "no" ; then
3941  cat > $TMPC <<EOF
3942#include <libaio.h>
3943#include <sys/eventfd.h>
3944#include <stddef.h>
3945int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
3946EOF
3947  if compile_prog "" "-laio" ; then
3948    linux_aio=yes
3949  else
3950    if test "$linux_aio" = "yes" ; then
3951      feature_not_found "linux AIO" "Install libaio devel"
3952    fi
3953    linux_aio=no
3954  fi
3955fi
3956
3957##########################################
3958# TPM emulation is only on POSIX
3959
3960if test "$tpm" = ""; then
3961  if test "$mingw32" = "yes"; then
3962    tpm=no
3963  else
3964    tpm=yes
3965  fi
3966elif test "$tpm" = "yes"; then
3967  if test "$mingw32" = "yes" ; then
3968    error_exit "TPM emulation only available on POSIX systems"
3969  fi
3970fi
3971
3972##########################################
3973# attr probe
3974
3975if test "$attr" != "no" ; then
3976  cat > $TMPC <<EOF
3977#include <stdio.h>
3978#include <sys/types.h>
3979#ifdef CONFIG_LIBATTR
3980#include <attr/xattr.h>
3981#else
3982#include <sys/xattr.h>
3983#endif
3984int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }
3985EOF
3986  if compile_prog "" "" ; then
3987    attr=yes
3988  # Older distros have <attr/xattr.h>, and need -lattr:
3989  elif compile_prog "-DCONFIG_LIBATTR" "-lattr" ; then
3990    attr=yes
3991    LIBS="-lattr $LIBS"
3992    libattr=yes
3993  else
3994    if test "$attr" = "yes" ; then
3995      feature_not_found "ATTR" "Install libc6 or libattr devel"
3996    fi
3997    attr=no
3998  fi
3999fi
4000
4001##########################################
4002# iovec probe
4003cat > $TMPC <<EOF
4004#include <sys/types.h>
4005#include <sys/uio.h>
4006#include <unistd.h>
4007int main(void) { return sizeof(struct iovec); }
4008EOF
4009iovec=no
4010if compile_prog "" "" ; then
4011  iovec=yes
4012fi
4013
4014##########################################
4015# preadv probe
4016cat > $TMPC <<EOF
4017#include <sys/types.h>
4018#include <sys/uio.h>
4019#include <unistd.h>
4020int main(void) { return preadv(0, 0, 0, 0); }
4021EOF
4022preadv=no
4023if compile_prog "" "" ; then
4024  preadv=yes
4025fi
4026
4027##########################################
4028# fdt probe
4029# fdt support is mandatory for at least some target architectures,
4030# so insist on it if we're building those system emulators.
4031fdt_required=no
4032for target in $target_list; do
4033  case $target in
4034    aarch64*-softmmu|arm*-softmmu|ppc*-softmmu|microblaze*-softmmu|mips64el-softmmu|riscv*-softmmu)
4035      fdt_required=yes
4036    ;;
4037  esac
4038done
4039
4040if test "$fdt_required" = "yes"; then
4041  if test "$fdt" = "no"; then
4042    error_exit "fdt disabled but some requested targets require it." \
4043      "You can turn off fdt only if you also disable all the system emulation" \
4044      "targets which need it (by specifying a cut down --target-list)."
4045  fi
4046  fdt=yes
4047fi
4048
4049if test "$fdt" != "no" ; then
4050  fdt_libs="-lfdt"
4051  # explicitly check for libfdt_env.h as it is missing in some stable installs
4052  # and test for required functions to make sure we are on a version >= 1.4.2
4053  cat > $TMPC << EOF
4054#include <libfdt.h>
4055#include <libfdt_env.h>
4056int main(void) { fdt_check_full(NULL, 0); return 0; }
4057EOF
4058  if compile_prog "" "$fdt_libs" ; then
4059    # system DTC is good - use it
4060    fdt=system
4061  else
4062      # have GIT checkout, so activate dtc submodule
4063      if test -e "${source_path}/.git" ; then
4064          git_submodules="${git_submodules} dtc"
4065      fi
4066      if test -d "${source_path}/dtc/libfdt" || test -e "${source_path}/.git" ; then
4067          fdt=git
4068          mkdir -p dtc
4069          if [ "$pwd_is_source_path" != "y" ] ; then
4070              symlink "$source_path/dtc/Makefile" "dtc/Makefile"
4071              symlink "$source_path/dtc/scripts" "dtc/scripts"
4072          fi
4073          fdt_cflags="-I\$(SRC_PATH)/dtc/libfdt"
4074          fdt_ldflags="-L\$(BUILD_DIR)/dtc/libfdt"
4075          fdt_libs="$fdt_libs"
4076      elif test "$fdt" = "yes" ; then
4077          # Not a git build & no libfdt found, prompt for system install
4078          error_exit "DTC (libfdt) version >= 1.4.2 not present." \
4079                     "Please install the DTC (libfdt) devel package"
4080      else
4081          # don't have and don't want
4082          fdt_libs=
4083          fdt=no
4084      fi
4085  fi
4086fi
4087
4088libs_softmmu="$libs_softmmu $fdt_libs"
4089
4090##########################################
4091# opengl probe (for sdl2, gtk, milkymist-tmu2)
4092
4093gbm="no"
4094if $pkg_config gbm; then
4095    gbm_cflags="$($pkg_config --cflags gbm)"
4096    gbm_libs="$($pkg_config --libs gbm)"
4097    gbm="yes"
4098fi
4099
4100if test "$opengl" != "no" ; then
4101  opengl_pkgs="epoxy gbm"
4102  if $pkg_config $opengl_pkgs; then
4103    opengl_cflags="$($pkg_config --cflags $opengl_pkgs)"
4104    opengl_libs="$($pkg_config --libs $opengl_pkgs)"
4105    opengl=yes
4106    if test "$gtk" = "yes" && $pkg_config --exists "$gtkpackage >= 3.16"; then
4107        gtk_gl="yes"
4108    fi
4109    QEMU_CFLAGS="$QEMU_CFLAGS $opengl_cflags"
4110  else
4111    if test "$opengl" = "yes" ; then
4112      feature_not_found "opengl" "Please install opengl (mesa) devel pkgs: $opengl_pkgs"
4113    fi
4114    opengl_cflags=""
4115    opengl_libs=""
4116    opengl=no
4117  fi
4118fi
4119
4120if test "$opengl" = "yes"; then
4121  cat > $TMPC << EOF
4122#include <epoxy/egl.h>
4123#ifndef EGL_MESA_image_dma_buf_export
4124# error mesa/epoxy lacks support for dmabufs (mesa 10.6+)
4125#endif
4126int main(void) { return 0; }
4127EOF
4128  if compile_prog "" "" ; then
4129    opengl_dmabuf=yes
4130  fi
4131fi
4132
4133if test "$opengl" = "yes" && test "$have_x11" = "yes"; then
4134  for target in $target_list; do
4135    case $target in
4136      lm32-softmmu) # milkymist-tmu2 requires X11 and OpenGL
4137        need_x11=yes
4138      ;;
4139    esac
4140  done
4141fi
4142
4143##########################################
4144# libxml2 probe
4145if test "$libxml2" != "no" ; then
4146    if $pkg_config --exists libxml-2.0; then
4147        libxml2="yes"
4148        libxml2_cflags=$($pkg_config --cflags libxml-2.0)
4149        libxml2_libs=$($pkg_config --libs libxml-2.0)
4150    else
4151        if test "$libxml2" = "yes"; then
4152            feature_not_found "libxml2" "Install libxml2 devel"
4153        fi
4154        libxml2="no"
4155    fi
4156fi
4157
4158##########################################
4159# glusterfs probe
4160if test "$glusterfs" != "no" ; then
4161  if $pkg_config --atleast-version=3 glusterfs-api; then
4162    glusterfs="yes"
4163    glusterfs_cflags=$($pkg_config --cflags glusterfs-api)
4164    glusterfs_libs=$($pkg_config --libs glusterfs-api)
4165    if $pkg_config --atleast-version=4 glusterfs-api; then
4166      glusterfs_xlator_opt="yes"
4167    fi
4168    if $pkg_config --atleast-version=5 glusterfs-api; then
4169      glusterfs_discard="yes"
4170    fi
4171    if $pkg_config --atleast-version=6 glusterfs-api; then
4172      glusterfs_fallocate="yes"
4173      glusterfs_zerofill="yes"
4174    fi
4175    cat > $TMPC << EOF
4176#include <glusterfs/api/glfs.h>
4177
4178int
4179main(void)
4180{
4181	/* new glfs_ftruncate() passes two additional args */
4182	return glfs_ftruncate(NULL, 0, NULL, NULL);
4183}
4184EOF
4185    if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
4186      glusterfs_ftruncate_has_stat="yes"
4187    fi
4188    cat > $TMPC << EOF
4189#include <glusterfs/api/glfs.h>
4190
4191/* new glfs_io_cbk() passes two additional glfs_stat structs */
4192static void
4193glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
4194{}
4195
4196int
4197main(void)
4198{
4199	glfs_io_cbk iocb = &glusterfs_iocb;
4200	iocb(NULL, 0 , NULL, NULL, NULL);
4201	return 0;
4202}
4203EOF
4204    if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
4205      glusterfs_iocb_has_stat="yes"
4206    fi
4207  else
4208    if test "$glusterfs" = "yes" ; then
4209      feature_not_found "GlusterFS backend support" \
4210          "Install glusterfs-api devel >= 3"
4211    fi
4212    glusterfs="no"
4213  fi
4214fi
4215
4216# Check for inotify functions when we are building linux-user
4217# emulator.  This is done because older glibc versions don't
4218# have syscall stubs for these implemented.  In that case we
4219# don't provide them even if kernel supports them.
4220#
4221inotify=no
4222cat > $TMPC << EOF
4223#include <sys/inotify.h>
4224
4225int
4226main(void)
4227{
4228	/* try to start inotify */
4229	return inotify_init();
4230}
4231EOF
4232if compile_prog "" "" ; then
4233  inotify=yes
4234fi
4235
4236inotify1=no
4237cat > $TMPC << EOF
4238#include <sys/inotify.h>
4239
4240int
4241main(void)
4242{
4243    /* try to start inotify */
4244    return inotify_init1(0);
4245}
4246EOF
4247if compile_prog "" "" ; then
4248  inotify1=yes
4249fi
4250
4251# check if pipe2 is there
4252pipe2=no
4253cat > $TMPC << EOF
4254#include <unistd.h>
4255#include <fcntl.h>
4256
4257int main(void)
4258{
4259    int pipefd[2];
4260    return pipe2(pipefd, O_CLOEXEC);
4261}
4262EOF
4263if compile_prog "" "" ; then
4264  pipe2=yes
4265fi
4266
4267# check if accept4 is there
4268accept4=no
4269cat > $TMPC << EOF
4270#include <sys/socket.h>
4271#include <stddef.h>
4272
4273int main(void)
4274{
4275    accept4(0, NULL, NULL, SOCK_CLOEXEC);
4276    return 0;
4277}
4278EOF
4279if compile_prog "" "" ; then
4280  accept4=yes
4281fi
4282
4283# check if tee/splice is there. vmsplice was added same time.
4284splice=no
4285cat > $TMPC << EOF
4286#include <unistd.h>
4287#include <fcntl.h>
4288#include <limits.h>
4289
4290int main(void)
4291{
4292    int len, fd = 0;
4293    len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
4294    splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
4295    return 0;
4296}
4297EOF
4298if compile_prog "" "" ; then
4299  splice=yes
4300fi
4301
4302##########################################
4303# libnuma probe
4304
4305if test "$numa" != "no" ; then
4306  cat > $TMPC << EOF
4307#include <numa.h>
4308int main(void) { return numa_available(); }
4309EOF
4310
4311  if compile_prog "" "-lnuma" ; then
4312    numa=yes
4313    libs_softmmu="-lnuma $libs_softmmu"
4314  else
4315    if test "$numa" = "yes" ; then
4316      feature_not_found "numa" "install numactl devel"
4317    fi
4318    numa=no
4319  fi
4320fi
4321
4322if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
4323    echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
4324    exit 1
4325fi
4326
4327# Even if malloc_trim() is available, these non-libc memory allocators
4328# do not support it.
4329if test "$tcmalloc" = "yes" || test "$jemalloc" = "yes" ; then
4330    if test "$malloc_trim" = "yes" ; then
4331        echo "Disabling malloc_trim with non-libc memory allocator"
4332    fi
4333    malloc_trim="no"
4334fi
4335
4336#######################################
4337# malloc_trim
4338
4339if test "$malloc_trim" != "no" ; then
4340    cat > $TMPC << EOF
4341#include <malloc.h>
4342int main(void) { malloc_trim(0); return 0; }
4343EOF
4344    if compile_prog "" "" ; then
4345        malloc_trim="yes"
4346    else
4347        malloc_trim="no"
4348    fi
4349fi
4350
4351##########################################
4352# tcmalloc probe
4353
4354if test "$tcmalloc" = "yes" ; then
4355  cat > $TMPC << EOF
4356#include <stdlib.h>
4357int main(void) { malloc(1); return 0; }
4358EOF
4359
4360  if compile_prog "" "-ltcmalloc" ; then
4361    LIBS="-ltcmalloc $LIBS"
4362  else
4363    feature_not_found "tcmalloc" "install gperftools devel"
4364  fi
4365fi
4366
4367##########################################
4368# jemalloc probe
4369
4370if test "$jemalloc" = "yes" ; then
4371  cat > $TMPC << EOF
4372#include <stdlib.h>
4373int main(void) { malloc(1); return 0; }
4374EOF
4375
4376  if compile_prog "" "-ljemalloc" ; then
4377    LIBS="-ljemalloc $LIBS"
4378  else
4379    feature_not_found "jemalloc" "install jemalloc devel"
4380  fi
4381fi
4382
4383##########################################
4384# signalfd probe
4385signalfd="no"
4386cat > $TMPC << EOF
4387#include <unistd.h>
4388#include <sys/syscall.h>
4389#include <signal.h>
4390int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }
4391EOF
4392
4393if compile_prog "" "" ; then
4394  signalfd=yes
4395fi
4396
4397# check if optreset global is declared by <getopt.h>
4398optreset="no"
4399cat > $TMPC << EOF
4400#include <getopt.h>
4401int main(void) { return optreset; }
4402EOF
4403
4404if compile_prog "" "" ; then
4405  optreset=yes
4406fi
4407
4408# check if eventfd is supported
4409eventfd=no
4410cat > $TMPC << EOF
4411#include <sys/eventfd.h>
4412
4413int main(void)
4414{
4415    return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
4416}
4417EOF
4418if compile_prog "" "" ; then
4419  eventfd=yes
4420fi
4421
4422# check if memfd is supported
4423memfd=no
4424cat > $TMPC << EOF
4425#include <sys/mman.h>
4426
4427int main(void)
4428{
4429    return memfd_create("foo", MFD_ALLOW_SEALING);
4430}
4431EOF
4432if compile_prog "" "" ; then
4433  memfd=yes
4434fi
4435
4436# check for usbfs
4437have_usbfs=no
4438if test "$linux_user" = "yes"; then
4439  cat > $TMPC << EOF
4440#include <linux/usbdevice_fs.h>
4441
4442#ifndef USBDEVFS_GET_CAPABILITIES
4443#error "USBDEVFS_GET_CAPABILITIES undefined"
4444#endif
4445
4446#ifndef USBDEVFS_DISCONNECT_CLAIM
4447#error "USBDEVFS_DISCONNECT_CLAIM undefined"
4448#endif
4449
4450int main(void)
4451{
4452    return 0;
4453}
4454EOF
4455  if compile_prog "" ""; then
4456    have_usbfs=yes
4457  fi
4458fi
4459
4460# check for fallocate
4461fallocate=no
4462cat > $TMPC << EOF
4463#include <fcntl.h>
4464
4465int main(void)
4466{
4467    fallocate(0, 0, 0, 0);
4468    return 0;
4469}
4470EOF
4471if compile_prog "" "" ; then
4472  fallocate=yes
4473fi
4474
4475# check for fallocate hole punching
4476fallocate_punch_hole=no
4477cat > $TMPC << EOF
4478#include <fcntl.h>
4479#include <linux/falloc.h>
4480
4481int main(void)
4482{
4483    fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
4484    return 0;
4485}
4486EOF
4487if compile_prog "" "" ; then
4488  fallocate_punch_hole=yes
4489fi
4490
4491# check that fallocate supports range zeroing inside the file
4492fallocate_zero_range=no
4493cat > $TMPC << EOF
4494#include <fcntl.h>
4495#include <linux/falloc.h>
4496
4497int main(void)
4498{
4499    fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0);
4500    return 0;
4501}
4502EOF
4503if compile_prog "" "" ; then
4504  fallocate_zero_range=yes
4505fi
4506
4507# check for posix_fallocate
4508posix_fallocate=no
4509cat > $TMPC << EOF
4510#include <fcntl.h>
4511
4512int main(void)
4513{
4514    posix_fallocate(0, 0, 0);
4515    return 0;
4516}
4517EOF
4518if compile_prog "" "" ; then
4519    posix_fallocate=yes
4520fi
4521
4522# check for sync_file_range
4523sync_file_range=no
4524cat > $TMPC << EOF
4525#include <fcntl.h>
4526
4527int main(void)
4528{
4529    sync_file_range(0, 0, 0, 0);
4530    return 0;
4531}
4532EOF
4533if compile_prog "" "" ; then
4534  sync_file_range=yes
4535fi
4536
4537# check for linux/fiemap.h and FS_IOC_FIEMAP
4538fiemap=no
4539cat > $TMPC << EOF
4540#include <sys/ioctl.h>
4541#include <linux/fs.h>
4542#include <linux/fiemap.h>
4543
4544int main(void)
4545{
4546    ioctl(0, FS_IOC_FIEMAP, 0);
4547    return 0;
4548}
4549EOF
4550if compile_prog "" "" ; then
4551  fiemap=yes
4552fi
4553
4554# check for dup3
4555dup3=no
4556cat > $TMPC << EOF
4557#include <unistd.h>
4558
4559int main(void)
4560{
4561    dup3(0, 0, 0);
4562    return 0;
4563}
4564EOF
4565if compile_prog "" "" ; then
4566  dup3=yes
4567fi
4568
4569# check for ppoll support
4570ppoll=no
4571cat > $TMPC << EOF
4572#include <poll.h>
4573
4574int main(void)
4575{
4576    struct pollfd pfd = { .fd = 0, .events = 0, .revents = 0 };
4577    ppoll(&pfd, 1, 0, 0);
4578    return 0;
4579}
4580EOF
4581if compile_prog "" "" ; then
4582  ppoll=yes
4583fi
4584
4585# check for prctl(PR_SET_TIMERSLACK , ... ) support
4586prctl_pr_set_timerslack=no
4587cat > $TMPC << EOF
4588#include <sys/prctl.h>
4589
4590int main(void)
4591{
4592    prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0);
4593    return 0;
4594}
4595EOF
4596if compile_prog "" "" ; then
4597  prctl_pr_set_timerslack=yes
4598fi
4599
4600# check for epoll support
4601epoll=no
4602cat > $TMPC << EOF
4603#include <sys/epoll.h>
4604
4605int main(void)
4606{
4607    epoll_create(0);
4608    return 0;
4609}
4610EOF
4611if compile_prog "" "" ; then
4612  epoll=yes
4613fi
4614
4615# epoll_create1 is a later addition
4616# so we must check separately for its presence
4617epoll_create1=no
4618cat > $TMPC << EOF
4619#include <sys/epoll.h>
4620
4621int main(void)
4622{
4623    /* Note that we use epoll_create1 as a value, not as
4624     * a function being called. This is necessary so that on
4625     * old SPARC glibc versions where the function was present in
4626     * the library but not declared in the header file we will
4627     * fail the configure check. (Otherwise we will get a compiler
4628     * warning but not an error, and will proceed to fail the
4629     * qemu compile where we compile with -Werror.)
4630     */
4631    return (int)(uintptr_t)&epoll_create1;
4632}
4633EOF
4634if compile_prog "" "" ; then
4635  epoll_create1=yes
4636fi
4637
4638# check for sendfile support
4639sendfile=no
4640cat > $TMPC << EOF
4641#include <sys/sendfile.h>
4642
4643int main(void)
4644{
4645    return sendfile(0, 0, 0, 0);
4646}
4647EOF
4648if compile_prog "" "" ; then
4649  sendfile=yes
4650fi
4651
4652# check for timerfd support (glibc 2.8 and newer)
4653timerfd=no
4654cat > $TMPC << EOF
4655#include <sys/timerfd.h>
4656
4657int main(void)
4658{
4659    return(timerfd_create(CLOCK_REALTIME, 0));
4660}
4661EOF
4662if compile_prog "" "" ; then
4663  timerfd=yes
4664fi
4665
4666# check for setns and unshare support
4667setns=no
4668cat > $TMPC << EOF
4669#include <sched.h>
4670
4671int main(void)
4672{
4673    int ret;
4674    ret = setns(0, 0);
4675    ret = unshare(0);
4676    return ret;
4677}
4678EOF
4679if compile_prog "" "" ; then
4680  setns=yes
4681fi
4682
4683# clock_adjtime probe
4684clock_adjtime=no
4685cat > $TMPC <<EOF
4686#include <time.h>
4687
4688int main(void)
4689{
4690    return clock_adjtime(0, 0);
4691}
4692EOF
4693clock_adjtime=no
4694if compile_prog "" "" ; then
4695  clock_adjtime=yes
4696fi
4697
4698# syncfs probe
4699syncfs=no
4700cat > $TMPC <<EOF
4701#include <unistd.h>
4702
4703int main(void)
4704{
4705    return syncfs(0);
4706}
4707EOF
4708syncfs=no
4709if compile_prog "" "" ; then
4710  syncfs=yes
4711fi
4712
4713# Check we have a new enough version of sphinx-build
4714has_sphinx_build() {
4715    # This is a bit awkward but works: create a trivial document and
4716    # try to run it with our configuration file (which enforces a
4717    # version requirement). This will fail if either
4718    # sphinx-build doesn't exist at all or if it is too old.
4719    mkdir -p "$TMPDIR1/sphinx"
4720    touch "$TMPDIR1/sphinx/index.rst"
4721    sphinx-build -c "$source_path/docs" -b html "$TMPDIR1/sphinx" "$TMPDIR1/sphinx/out" >/dev/null 2>&1
4722}
4723
4724# Check if tools are available to build documentation.
4725if test "$docs" != "no" ; then
4726  if has makeinfo && has pod2man && has_sphinx_build; then
4727    docs=yes
4728  else
4729    if test "$docs" = "yes" ; then
4730      feature_not_found "docs" "Install texinfo, Perl/perl-podlators and python-sphinx"
4731    fi
4732    docs=no
4733  fi
4734fi
4735
4736# Search for bswap_32 function
4737byteswap_h=no
4738cat > $TMPC << EOF
4739#include <byteswap.h>
4740int main(void) { return bswap_32(0); }
4741EOF
4742if compile_prog "" "" ; then
4743  byteswap_h=yes
4744fi
4745
4746# Search for bswap32 function
4747bswap_h=no
4748cat > $TMPC << EOF
4749#include <sys/endian.h>
4750#include <sys/types.h>
4751#include <machine/bswap.h>
4752int main(void) { return bswap32(0); }
4753EOF
4754if compile_prog "" "" ; then
4755  bswap_h=yes
4756fi
4757
4758##########################################
4759# Do we have libiscsi >= 1.9.0
4760if test "$libiscsi" != "no" ; then
4761  if $pkg_config --atleast-version=1.9.0 libiscsi; then
4762    libiscsi="yes"
4763    libiscsi_cflags=$($pkg_config --cflags libiscsi)
4764    libiscsi_libs=$($pkg_config --libs libiscsi)
4765  else
4766    if test "$libiscsi" = "yes" ; then
4767      feature_not_found "libiscsi" "Install libiscsi >= 1.9.0"
4768    fi
4769    libiscsi="no"
4770  fi
4771fi
4772
4773##########################################
4774# Do we need libm
4775cat > $TMPC << EOF
4776#include <math.h>
4777int main(int argc, char **argv) { return isnan(sin((double)argc)); }
4778EOF
4779if compile_prog "" "" ; then
4780  :
4781elif compile_prog "" "-lm" ; then
4782  LIBS="-lm $LIBS"
4783  libs_qga="-lm $libs_qga"
4784else
4785  error_exit "libm check failed"
4786fi
4787
4788##########################################
4789# Do we need librt
4790# uClibc provides 2 versions of clock_gettime(), one with realtime
4791# support and one without. This means that the clock_gettime() don't
4792# need -lrt. We still need it for timer_create() so we check for this
4793# function in addition.
4794cat > $TMPC <<EOF
4795#include <signal.h>
4796#include <time.h>
4797int main(void) {
4798  timer_create(CLOCK_REALTIME, NULL, NULL);
4799  return clock_gettime(CLOCK_REALTIME, NULL);
4800}
4801EOF
4802
4803if compile_prog "" "" ; then
4804  :
4805# we need pthread for static linking. use previous pthread test result
4806elif compile_prog "" "$pthread_lib -lrt" ; then
4807  LIBS="$LIBS -lrt"
4808  libs_qga="$libs_qga -lrt"
4809fi
4810
4811# Check whether we need to link libutil for openpty()
4812cat > $TMPC << EOF
4813extern int openpty(int *am, int *as, char *name, void *termp, void *winp);
4814int main(void) { return openpty(0, 0, 0, 0, 0); }
4815EOF
4816
4817if ! compile_prog "" "" ; then
4818  if compile_prog "" "-lutil" ; then
4819    libs_softmmu="-lutil $libs_softmmu"
4820    libs_tools="-lutil $libs_tools"
4821  fi
4822fi
4823
4824##########################################
4825# spice probe
4826if test "$spice" != "no" ; then
4827  cat > $TMPC << EOF
4828#include <spice.h>
4829int main(void) { spice_server_new(); return 0; }
4830EOF
4831  spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
4832  spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
4833  if $pkg_config --atleast-version=0.12.5 spice-server && \
4834     $pkg_config --atleast-version=0.12.3 spice-protocol && \
4835     compile_prog "$spice_cflags" "$spice_libs" ; then
4836    spice="yes"
4837    libs_softmmu="$libs_softmmu $spice_libs"
4838    QEMU_CFLAGS="$QEMU_CFLAGS $spice_cflags"
4839    spice_protocol_version=$($pkg_config --modversion spice-protocol)
4840    spice_server_version=$($pkg_config --modversion spice-server)
4841  else
4842    if test "$spice" = "yes" ; then
4843      feature_not_found "spice" \
4844          "Install spice-server(>=0.12.5) and spice-protocol(>=0.12.3) devel"
4845    fi
4846    spice="no"
4847  fi
4848fi
4849
4850# check for smartcard support
4851if test "$smartcard" != "no"; then
4852    if $pkg_config --atleast-version=2.5.1 libcacard; then
4853        libcacard_cflags=$($pkg_config --cflags libcacard)
4854        libcacard_libs=$($pkg_config --libs libcacard)
4855        smartcard="yes"
4856    else
4857        if test "$smartcard" = "yes"; then
4858            feature_not_found "smartcard" "Install libcacard devel"
4859        fi
4860        smartcard="no"
4861    fi
4862fi
4863
4864# check for libusb
4865if test "$libusb" != "no" ; then
4866    if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
4867        libusb="yes"
4868        libusb_cflags=$($pkg_config --cflags libusb-1.0)
4869        libusb_libs=$($pkg_config --libs libusb-1.0)
4870    else
4871        if test "$libusb" = "yes"; then
4872            feature_not_found "libusb" "Install libusb devel >= 1.0.13"
4873        fi
4874        libusb="no"
4875    fi
4876fi
4877
4878# check for usbredirparser for usb network redirection support
4879if test "$usb_redir" != "no" ; then
4880    if $pkg_config --atleast-version=0.6 libusbredirparser-0.5; then
4881        usb_redir="yes"
4882        usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5)
4883        usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5)
4884    else
4885        if test "$usb_redir" = "yes"; then
4886            feature_not_found "usb-redir" "Install usbredir devel"
4887        fi
4888        usb_redir="no"
4889    fi
4890fi
4891
4892##########################################
4893# check if we have VSS SDK headers for win
4894
4895if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
4896        test "$vss_win32_sdk" != "no" ; then
4897  case "$vss_win32_sdk" in
4898    "")   vss_win32_include="-isystem $source_path" ;;
4899    *\ *) # The SDK is installed in "Program Files" by default, but we cannot
4900          # handle path with spaces. So we symlink the headers into ".sdk/vss".
4901          vss_win32_include="-isystem $source_path/.sdk/vss"
4902	  symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
4903	  ;;
4904    *)    vss_win32_include="-isystem $vss_win32_sdk"
4905  esac
4906  cat > $TMPC << EOF
4907#define __MIDL_user_allocate_free_DEFINED__
4908#include <inc/win2003/vss.h>
4909int main(void) { return VSS_CTX_BACKUP; }
4910EOF
4911  if compile_prog "$vss_win32_include" "" ; then
4912    guest_agent_with_vss="yes"
4913    QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
4914    libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
4915    qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
4916  else
4917    if test "$vss_win32_sdk" != "" ; then
4918      echo "ERROR: Please download and install Microsoft VSS SDK:"
4919      echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
4920      echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
4921      echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
4922      echo "ERROR: The headers are extracted in the directory \`inc'."
4923      feature_not_found "VSS support"
4924    fi
4925    guest_agent_with_vss="no"
4926  fi
4927fi
4928
4929##########################################
4930# lookup Windows platform SDK (if not specified)
4931# The SDK is needed only to build .tlb (type library) file of guest agent
4932# VSS provider from the source. It is usually unnecessary because the
4933# pre-compiled .tlb file is included.
4934
4935if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
4936        test "$guest_agent_with_vss" = "yes" ; then
4937  if test -z "$win_sdk"; then
4938    programfiles="$PROGRAMFILES"
4939    test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
4940    if test -n "$programfiles"; then
4941      win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
4942    else
4943      feature_not_found "Windows SDK"
4944    fi
4945  elif test "$win_sdk" = "no"; then
4946    win_sdk=""
4947  fi
4948fi
4949
4950##########################################
4951# check if mingw environment provides a recent ntddscsi.h
4952if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
4953  cat > $TMPC << EOF
4954#include <windows.h>
4955#include <ntddscsi.h>
4956int main(void) {
4957#if !defined(IOCTL_SCSI_GET_ADDRESS)
4958#error Missing required ioctl definitions
4959#endif
4960  SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
4961  return addr.Lun;
4962}
4963EOF
4964  if compile_prog "" "" ; then
4965    guest_agent_ntddscsi=yes
4966    libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
4967  fi
4968fi
4969
4970##########################################
4971# virgl renderer probe
4972
4973if test "$virglrenderer" != "no" ; then
4974  cat > $TMPC << EOF
4975#include <virglrenderer.h>
4976int main(void) { virgl_renderer_poll(); return 0; }
4977EOF
4978  virgl_cflags=$($pkg_config --cflags virglrenderer 2>/dev/null)
4979  virgl_libs=$($pkg_config --libs virglrenderer 2>/dev/null)
4980  virgl_version=$($pkg_config --modversion virglrenderer 2>/dev/null)
4981  if $pkg_config virglrenderer >/dev/null 2>&1 && \
4982     compile_prog "$virgl_cflags" "$virgl_libs" ; then
4983    virglrenderer="yes"
4984  else
4985    if test "$virglrenderer" = "yes" ; then
4986      feature_not_found "virglrenderer"
4987    fi
4988    virglrenderer="no"
4989  fi
4990fi
4991
4992##########################################
4993# capstone
4994
4995case "$capstone" in
4996  "" | yes)
4997    if $pkg_config capstone; then
4998      capstone=system
4999    elif test -e "${source_path}/.git" && test $git_update = 'yes' ; then
5000      capstone=git
5001    elif test -e "${source_path}/capstone/Makefile" ; then
5002      capstone=internal
5003    elif test -z "$capstone" ; then
5004      capstone=no
5005    else
5006      feature_not_found "capstone" "Install capstone devel or git submodule"
5007    fi
5008    ;;
5009
5010  system)
5011    if ! $pkg_config capstone; then
5012      feature_not_found "capstone" "Install capstone devel"
5013    fi
5014    ;;
5015esac
5016
5017case "$capstone" in
5018  git | internal)
5019    if test "$capstone" = git; then
5020      git_submodules="${git_submodules} capstone"
5021    fi
5022    mkdir -p capstone
5023    QEMU_CFLAGS="$QEMU_CFLAGS -I\$(SRC_PATH)/capstone/include"
5024    if test "$mingw32" = "yes"; then
5025      LIBCAPSTONE=capstone.lib
5026    else
5027      LIBCAPSTONE=libcapstone.a
5028    fi
5029    libs_cpu="-L\$(BUILD_DIR)/capstone -lcapstone $libs_cpu"
5030    ;;
5031
5032  system)
5033    QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags capstone)"
5034    libs_cpu="$($pkg_config --libs capstone) $libs_cpu"
5035    ;;
5036
5037  no)
5038    ;;
5039  *)
5040    error_exit "Unknown state for capstone: $capstone"
5041    ;;
5042esac
5043
5044##########################################
5045# check if we have fdatasync
5046
5047fdatasync=no
5048cat > $TMPC << EOF
5049#include <unistd.h>
5050int main(void) {
5051#if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
5052return fdatasync(0);
5053#else
5054#error Not supported
5055#endif
5056}
5057EOF
5058if compile_prog "" "" ; then
5059    fdatasync=yes
5060fi
5061
5062##########################################
5063# check if we have madvise
5064
5065madvise=no
5066cat > $TMPC << EOF
5067#include <sys/types.h>
5068#include <sys/mman.h>
5069#include <stddef.h>
5070int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }
5071EOF
5072if compile_prog "" "" ; then
5073    madvise=yes
5074fi
5075
5076##########################################
5077# check if we have posix_madvise
5078
5079posix_madvise=no
5080cat > $TMPC << EOF
5081#include <sys/mman.h>
5082#include <stddef.h>
5083int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }
5084EOF
5085if compile_prog "" "" ; then
5086    posix_madvise=yes
5087fi
5088
5089##########################################
5090# check if we have posix_memalign()
5091
5092posix_memalign=no
5093cat > $TMPC << EOF
5094#include <stdlib.h>
5095int main(void) {
5096    void *p;
5097    return posix_memalign(&p, 8, 8);
5098}
5099EOF
5100if compile_prog "" "" ; then
5101    posix_memalign=yes
5102fi
5103
5104##########################################
5105# check if we have posix_syslog
5106
5107posix_syslog=no
5108cat > $TMPC << EOF
5109#include <syslog.h>
5110int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; }
5111EOF
5112if compile_prog "" "" ; then
5113    posix_syslog=yes
5114fi
5115
5116##########################################
5117# check if we have sem_timedwait
5118
5119sem_timedwait=no
5120cat > $TMPC << EOF
5121#include <semaphore.h>
5122int main(void) { sem_t s; struct timespec t = {0}; return sem_timedwait(&s, &t); }
5123EOF
5124if compile_prog "" "" ; then
5125    sem_timedwait=yes
5126fi
5127
5128##########################################
5129# check if we have strchrnul
5130
5131strchrnul=no
5132cat > $TMPC << EOF
5133#include <string.h>
5134int main(void);
5135// Use a haystack that the compiler shouldn't be able to constant fold
5136char *haystack = (char*)&main;
5137int main(void) { return strchrnul(haystack, 'x') != &haystack[6]; }
5138EOF
5139if compile_prog "" "" ; then
5140    strchrnul=yes
5141fi
5142
5143##########################################
5144# check if trace backend exists
5145
5146$python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
5147if test "$?" -ne 0 ; then
5148  error_exit "invalid trace backends" \
5149      "Please choose supported trace backends."
5150fi
5151
5152##########################################
5153# For 'ust' backend, test if ust headers are present
5154if have_backend "ust"; then
5155  cat > $TMPC << EOF
5156#include <lttng/tracepoint.h>
5157int main(void) { return 0; }
5158EOF
5159  if compile_prog "" "-Wl,--no-as-needed -ldl" ; then
5160    if $pkg_config lttng-ust --exists; then
5161      lttng_ust_libs=$($pkg_config --libs lttng-ust)
5162    else
5163      lttng_ust_libs="-llttng-ust -ldl"
5164    fi
5165    if $pkg_config liburcu-bp --exists; then
5166      urcu_bp_libs=$($pkg_config --libs liburcu-bp)
5167    else
5168      urcu_bp_libs="-lurcu-bp"
5169    fi
5170
5171    LIBS="$lttng_ust_libs $urcu_bp_libs $LIBS"
5172    libs_qga="$lttng_ust_libs $urcu_bp_libs $libs_qga"
5173  else
5174    error_exit "Trace backend 'ust' missing lttng-ust header files"
5175  fi
5176fi
5177
5178##########################################
5179# For 'dtrace' backend, test if 'dtrace' command is present
5180if have_backend "dtrace"; then
5181  if ! has 'dtrace' ; then
5182    error_exit "dtrace command is not found in PATH $PATH"
5183  fi
5184  trace_backend_stap="no"
5185  if has 'stap' ; then
5186    trace_backend_stap="yes"
5187  fi
5188fi
5189
5190##########################################
5191# check and set a backend for coroutine
5192
5193# We prefer ucontext, but it's not always possible. The fallback
5194# is sigcontext. On Windows the only valid backend is the Windows
5195# specific one.
5196
5197ucontext_works=no
5198if test "$darwin" != "yes"; then
5199  cat > $TMPC << EOF
5200#include <ucontext.h>
5201#ifdef __stub_makecontext
5202#error Ignoring glibc stub makecontext which will always fail
5203#endif
5204int main(void) { makecontext(0, 0, 0); return 0; }
5205EOF
5206  if compile_prog "" "" ; then
5207    ucontext_works=yes
5208  fi
5209fi
5210
5211if test "$coroutine" = ""; then
5212  if test "$mingw32" = "yes"; then
5213    coroutine=win32
5214  elif test "$ucontext_works" = "yes"; then
5215    coroutine=ucontext
5216  else
5217    coroutine=sigaltstack
5218  fi
5219else
5220  case $coroutine in
5221  windows)
5222    if test "$mingw32" != "yes"; then
5223      error_exit "'windows' coroutine backend only valid for Windows"
5224    fi
5225    # Unfortunately the user visible backend name doesn't match the
5226    # coroutine-*.c filename for this case, so we have to adjust it here.
5227    coroutine=win32
5228    ;;
5229  ucontext)
5230    if test "$ucontext_works" != "yes"; then
5231      feature_not_found "ucontext"
5232    fi
5233    ;;
5234  sigaltstack)
5235    if test "$mingw32" = "yes"; then
5236      error_exit "only the 'windows' coroutine backend is valid for Windows"
5237    fi
5238    ;;
5239  *)
5240    error_exit "unknown coroutine backend $coroutine"
5241    ;;
5242  esac
5243fi
5244
5245if test "$coroutine_pool" = ""; then
5246  coroutine_pool=yes
5247fi
5248
5249if test "$debug_stack_usage" = "yes"; then
5250  if test "$coroutine_pool" = "yes"; then
5251    echo "WARN: disabling coroutine pool for stack usage debugging"
5252    coroutine_pool=no
5253  fi
5254fi
5255
5256
5257##########################################
5258# check if we have open_by_handle_at
5259
5260open_by_handle_at=no
5261cat > $TMPC << EOF
5262#include <fcntl.h>
5263#if !defined(AT_EMPTY_PATH)
5264# error missing definition
5265#else
5266int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
5267#endif
5268EOF
5269if compile_prog "" "" ; then
5270    open_by_handle_at=yes
5271fi
5272
5273########################################
5274# check if we have linux/magic.h
5275
5276linux_magic_h=no
5277cat > $TMPC << EOF
5278#include <linux/magic.h>
5279int main(void) {
5280  return 0;
5281}
5282EOF
5283if compile_prog "" "" ; then
5284    linux_magic_h=yes
5285fi
5286
5287########################################
5288# check whether we can disable warning option with a pragma (this is needed
5289# to silence warnings in the headers of some versions of external libraries).
5290# This test has to be compiled with -Werror as otherwise an unknown pragma is
5291# only a warning.
5292#
5293# If we can't selectively disable warning in the code, disable -Werror so that
5294# the build doesn't fail anyway.
5295
5296pragma_disable_unused_but_set=no
5297cat > $TMPC << EOF
5298#pragma GCC diagnostic push
5299#pragma GCC diagnostic ignored "-Wstrict-prototypes"
5300#pragma GCC diagnostic pop
5301
5302int main(void) {
5303    return 0;
5304}
5305EOF
5306if compile_prog "-Werror" "" ; then
5307    pragma_diagnostic_available=yes
5308else
5309    werror=no
5310fi
5311
5312########################################
5313# check if we have valgrind/valgrind.h
5314
5315valgrind_h=no
5316cat > $TMPC << EOF
5317#include <valgrind/valgrind.h>
5318int main(void) {
5319  return 0;
5320}
5321EOF
5322if compile_prog "" "" ; then
5323    valgrind_h=yes
5324fi
5325
5326########################################
5327# check if environ is declared
5328
5329has_environ=no
5330cat > $TMPC << EOF
5331#include <unistd.h>
5332int main(void) {
5333    environ = 0;
5334    return 0;
5335}
5336EOF
5337if compile_prog "" "" ; then
5338    has_environ=yes
5339fi
5340
5341########################################
5342# check if cpuid.h is usable.
5343
5344cat > $TMPC << EOF
5345#include <cpuid.h>
5346int main(void) {
5347    unsigned a, b, c, d;
5348    int max = __get_cpuid_max(0, 0);
5349
5350    if (max >= 1) {
5351        __cpuid(1, a, b, c, d);
5352    }
5353
5354    if (max >= 7) {
5355        __cpuid_count(7, 0, a, b, c, d);
5356    }
5357
5358    return 0;
5359}
5360EOF
5361if compile_prog "" "" ; then
5362    cpuid_h=yes
5363fi
5364
5365##########################################
5366# avx2 optimization requirement check
5367#
5368# There is no point enabling this if cpuid.h is not usable,
5369# since we won't be able to select the new routines.
5370
5371if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
5372  cat > $TMPC << EOF
5373#pragma GCC push_options
5374#pragma GCC target("avx2")
5375#include <cpuid.h>
5376#include <immintrin.h>
5377static int bar(void *a) {
5378    __m256i x = *(__m256i *)a;
5379    return _mm256_testz_si256(x, x);
5380}
5381int main(int argc, char *argv[]) { return bar(argv[0]); }
5382EOF
5383  if compile_object "" ; then
5384    avx2_opt="yes"
5385  else
5386    avx2_opt="no"
5387  fi
5388fi
5389
5390########################################
5391# check if __[u]int128_t is usable.
5392
5393int128=no
5394cat > $TMPC << EOF
5395__int128_t a;
5396__uint128_t b;
5397int main (void) {
5398  a = a + b;
5399  b = a * b;
5400  a = a * a;
5401  return 0;
5402}
5403EOF
5404if compile_prog "" "" ; then
5405    int128=yes
5406fi
5407
5408#########################################
5409# See if 128-bit atomic operations are supported.
5410
5411atomic128=no
5412if test "$int128" = "yes"; then
5413  cat > $TMPC << EOF
5414int main(void)
5415{
5416  unsigned __int128 x = 0, y = 0;
5417  y = __atomic_load_16(&x, 0);
5418  __atomic_store_16(&x, y, 0);
5419  __atomic_compare_exchange_16(&x, &y, x, 0, 0, 0);
5420  return 0;
5421}
5422EOF
5423  if compile_prog "" "" ; then
5424    atomic128=yes
5425  fi
5426fi
5427
5428cmpxchg128=no
5429if test "$int128" = yes && test "$atomic128" = no; then
5430  cat > $TMPC << EOF
5431int main(void)
5432{
5433  unsigned __int128 x = 0, y = 0;
5434  __sync_val_compare_and_swap_16(&x, y, x);
5435  return 0;
5436}
5437EOF
5438  if compile_prog "" "" ; then
5439    cmpxchg128=yes
5440  fi
5441fi
5442
5443#########################################
5444# See if 64-bit atomic operations are supported.
5445# Note that without __atomic builtins, we can only
5446# assume atomic loads/stores max at pointer size.
5447
5448cat > $TMPC << EOF
5449#include <stdint.h>
5450int main(void)
5451{
5452  uint64_t x = 0, y = 0;
5453#ifdef __ATOMIC_RELAXED
5454  y = __atomic_load_8(&x, 0);
5455  __atomic_store_8(&x, y, 0);
5456  __atomic_compare_exchange_8(&x, &y, x, 0, 0, 0);
5457  __atomic_exchange_8(&x, y, 0);
5458  __atomic_fetch_add_8(&x, y, 0);
5459#else
5460  typedef char is_host64[sizeof(void *) >= sizeof(uint64_t) ? 1 : -1];
5461  __sync_lock_test_and_set(&x, y);
5462  __sync_val_compare_and_swap(&x, y, 0);
5463  __sync_fetch_and_add(&x, y);
5464#endif
5465  return 0;
5466}
5467EOF
5468if compile_prog "" "" ; then
5469  atomic64=yes
5470fi
5471
5472########################################
5473# See if 16-byte vector operations are supported.
5474# Even without a vector unit the compiler may expand these.
5475# There is a bug in old GCC for PPC that crashes here.
5476# Unfortunately it's the system compiler for Centos 7.
5477
5478cat > $TMPC << EOF
5479typedef unsigned char U1 __attribute__((vector_size(16)));
5480typedef unsigned short U2 __attribute__((vector_size(16)));
5481typedef unsigned int U4 __attribute__((vector_size(16)));
5482typedef unsigned long long U8 __attribute__((vector_size(16)));
5483typedef signed char S1 __attribute__((vector_size(16)));
5484typedef signed short S2 __attribute__((vector_size(16)));
5485typedef signed int S4 __attribute__((vector_size(16)));
5486typedef signed long long S8 __attribute__((vector_size(16)));
5487static U1 a1, b1;
5488static U2 a2, b2;
5489static U4 a4, b4;
5490static U8 a8, b8;
5491static S1 c1;
5492static S2 c2;
5493static S4 c4;
5494static S8 c8;
5495static int i;
5496void helper(void *d, void *a, int shift, int i);
5497void helper(void *d, void *a, int shift, int i)
5498{
5499  *(U1 *)(d + i) = *(U1 *)(a + i) << shift;
5500  *(U2 *)(d + i) = *(U2 *)(a + i) << shift;
5501  *(U4 *)(d + i) = *(U4 *)(a + i) << shift;
5502  *(U8 *)(d + i) = *(U8 *)(a + i) << shift;
5503}
5504int main(void)
5505{
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 &= b1; a2 &= b2; a4 &= b4; a8 &= b8;
5510  a1 |= b1; a2 |= b2; a4 |= b4; a8 |= b8;
5511  a1 ^= b1; a2 ^= b2; a4 ^= b4; a8 ^= b8;
5512  a1 <<= i; a2 <<= i; a4 <<= i; a8 <<= i;
5513  a1 >>= i; a2 >>= i; a4 >>= i; a8 >>= i;
5514  c1 >>= i; c2 >>= i; c4 >>= i; c8 >>= i;
5515  return 0;
5516}
5517EOF
5518
5519vector16=no
5520if compile_prog "" "" ; then
5521  vector16=yes
5522fi
5523
5524########################################
5525# check if getauxval is available.
5526
5527getauxval=no
5528cat > $TMPC << EOF
5529#include <sys/auxv.h>
5530int main(void) {
5531  return getauxval(AT_HWCAP) == 0;
5532}
5533EOF
5534if compile_prog "" "" ; then
5535    getauxval=yes
5536fi
5537
5538########################################
5539# check if ccache is interfering with
5540# semantic analysis of macros
5541
5542unset CCACHE_CPP2
5543ccache_cpp2=no
5544cat > $TMPC << EOF
5545static const int Z = 1;
5546#define fn() ({ Z; })
5547#define TAUT(X) ((X) == Z)
5548#define PAREN(X, Y) (X == Y)
5549#define ID(X) (X)
5550int main(int argc, char *argv[])
5551{
5552    int x = 0, y = 0;
5553    x = ID(x);
5554    x = fn();
5555    fn();
5556    if (PAREN(x, y)) return 0;
5557    if (TAUT(Z)) return 0;
5558    return 0;
5559}
5560EOF
5561
5562if ! compile_object "-Werror"; then
5563    ccache_cpp2=yes
5564fi
5565
5566#################################################
5567# clang does not support glibc + FORTIFY_SOURCE.
5568
5569if test "$fortify_source" != "no"; then
5570  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
5571    fortify_source="no";
5572  elif test -n "$cxx" && has $cxx &&
5573       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
5574    fortify_source="no";
5575  else
5576    fortify_source="yes"
5577  fi
5578fi
5579
5580###############################################
5581# Check if copy_file_range is provided by glibc
5582have_copy_file_range=no
5583cat > $TMPC << EOF
5584#include <unistd.h>
5585int main(void) {
5586  copy_file_range(0, NULL, 0, NULL, 0, 0);
5587  return 0;
5588}
5589EOF
5590if compile_prog "" "" ; then
5591    have_copy_file_range=yes
5592fi
5593
5594##########################################
5595# check if struct fsxattr is available via linux/fs.h
5596
5597have_fsxattr=no
5598cat > $TMPC << EOF
5599#include <linux/fs.h>
5600struct fsxattr foo;
5601int main(void) {
5602  return 0;
5603}
5604EOF
5605if compile_prog "" "" ; then
5606    have_fsxattr=yes
5607fi
5608
5609##########################################
5610# check for usable membarrier system call
5611if test "$membarrier" = "yes"; then
5612    have_membarrier=no
5613    if test "$mingw32" = "yes" ; then
5614        have_membarrier=yes
5615    elif test "$linux" = "yes" ; then
5616        cat > $TMPC << EOF
5617    #include <linux/membarrier.h>
5618    #include <sys/syscall.h>
5619    #include <unistd.h>
5620    #include <stdlib.h>
5621    int main(void) {
5622        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
5623        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
5624	exit(0);
5625    }
5626EOF
5627        if compile_prog "" "" ; then
5628            have_membarrier=yes
5629        fi
5630    fi
5631    if test "$have_membarrier" = "no"; then
5632      feature_not_found "membarrier" "membarrier system call not available"
5633    fi
5634else
5635    # Do not enable it by default even for Mingw32, because it doesn't
5636    # work on Wine.
5637    membarrier=no
5638fi
5639
5640##########################################
5641# check if rtnetlink.h exists and is useful
5642have_rtnetlink=no
5643cat > $TMPC << EOF
5644#include <linux/rtnetlink.h>
5645int main(void) {
5646  return IFLA_PROTO_DOWN;
5647}
5648EOF
5649if compile_prog "" "" ; then
5650    have_rtnetlink=yes
5651fi
5652
5653##########################################
5654# check for usable AF_VSOCK environment
5655have_af_vsock=no
5656cat > $TMPC << EOF
5657#include <errno.h>
5658#include <sys/types.h>
5659#include <sys/socket.h>
5660#if !defined(AF_VSOCK)
5661# error missing AF_VSOCK flag
5662#endif
5663#include <linux/vm_sockets.h>
5664int main(void) {
5665    int sock, ret;
5666    struct sockaddr_vm svm;
5667    socklen_t len = sizeof(svm);
5668    sock = socket(AF_VSOCK, SOCK_STREAM, 0);
5669    ret = getpeername(sock, (struct sockaddr *)&svm, &len);
5670    if ((ret == -1) && (errno == ENOTCONN)) {
5671        return 0;
5672    }
5673    return -1;
5674}
5675EOF
5676if compile_prog "" "" ; then
5677    have_af_vsock=yes
5678fi
5679
5680##########################################
5681# check for usable AF_ALG environment
5682hava_afalg=no
5683cat > $TMPC << EOF
5684#include <errno.h>
5685#include <sys/types.h>
5686#include <sys/socket.h>
5687#include <linux/if_alg.h>
5688int main(void) {
5689    int sock;
5690    sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
5691    return sock;
5692}
5693EOF
5694if compile_prog "" "" ; then
5695    have_afalg=yes
5696fi
5697if test "$crypto_afalg" = "yes"
5698then
5699    if test "$have_afalg" != "yes"
5700    then
5701	error_exit "AF_ALG requested but could not be detected"
5702    fi
5703fi
5704
5705
5706#################################################
5707# Check to see if we have the Hypervisor framework
5708if [ "$darwin" = "yes" ] ; then
5709  cat > $TMPC << EOF
5710#include <Hypervisor/hv.h>
5711int main() { return 0;}
5712EOF
5713  if ! compile_object ""; then
5714    hvf='no'
5715  else
5716    hvf='yes'
5717    LDFLAGS="-framework Hypervisor $LDFLAGS"
5718  fi
5719fi
5720
5721#################################################
5722# Sparc implicitly links with --relax, which is
5723# incompatible with -r, so --no-relax should be
5724# given. It does no harm to give it on other
5725# platforms too.
5726
5727# Note: the prototype is needed since QEMU_CFLAGS
5728#       contains -Wmissing-prototypes
5729cat > $TMPC << EOF
5730extern int foo(void);
5731int foo(void) { return 0; }
5732EOF
5733if ! compile_object ""; then
5734  error_exit "Failed to compile object file for LD_REL_FLAGS test"
5735fi
5736for i in '-Wl,-r -Wl,--no-relax' -Wl,-r -r; do
5737  if do_cc -nostdlib $i -o $TMPMO $TMPO; then
5738    LD_REL_FLAGS=$i
5739    break
5740  fi
5741done
5742if test "$modules" = "yes" && test "$LD_REL_FLAGS" = ""; then
5743  feature_not_found "modules" "Cannot find how to build relocatable objects"
5744fi
5745
5746##########################################
5747# check for sysmacros.h
5748
5749have_sysmacros=no
5750cat > $TMPC << EOF
5751#include <sys/sysmacros.h>
5752int main(void) {
5753    return makedev(0, 0);
5754}
5755EOF
5756if compile_prog "" "" ; then
5757    have_sysmacros=yes
5758fi
5759
5760##########################################
5761# Veritas HyperScale block driver VxHS
5762# Check if libvxhs is installed
5763
5764if test "$vxhs" != "no" ; then
5765  cat > $TMPC <<EOF
5766#include <stdint.h>
5767#include <qnio/qnio_api.h>
5768
5769void *vxhs_callback;
5770
5771int main(void) {
5772    iio_init(QNIO_VERSION, vxhs_callback);
5773    return 0;
5774}
5775EOF
5776  vxhs_libs="-lvxhs -lssl"
5777  if compile_prog "" "$vxhs_libs" ; then
5778    vxhs=yes
5779  else
5780    if test "$vxhs" = "yes" ; then
5781      feature_not_found "vxhs block device" "Install libvxhs See github"
5782    fi
5783    vxhs=no
5784  fi
5785fi
5786
5787##########################################
5788# check for _Static_assert()
5789
5790have_static_assert=no
5791cat > $TMPC << EOF
5792_Static_assert(1, "success");
5793int main(void) {
5794    return 0;
5795}
5796EOF
5797if compile_prog "" "" ; then
5798    have_static_assert=yes
5799fi
5800
5801##########################################
5802# check for utmpx.h, it is missing e.g. on OpenBSD
5803
5804have_utmpx=no
5805cat > $TMPC << EOF
5806#include <utmpx.h>
5807struct utmpx user_info;
5808int main(void) {
5809    return 0;
5810}
5811EOF
5812if compile_prog "" "" ; then
5813    have_utmpx=yes
5814fi
5815
5816##########################################
5817# check for getrandom()
5818
5819have_getrandom=no
5820cat > $TMPC << EOF
5821#include <sys/random.h>
5822int main(void) {
5823    return getrandom(0, 0, GRND_NONBLOCK);
5824}
5825EOF
5826if compile_prog "" "" ; then
5827    have_getrandom=yes
5828fi
5829
5830##########################################
5831# checks for sanitizers
5832
5833have_asan=no
5834have_ubsan=no
5835have_asan_iface_h=no
5836have_asan_iface_fiber=no
5837
5838if test "$sanitizers" = "yes" ; then
5839  write_c_skeleton
5840  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
5841      have_asan=yes
5842  fi
5843
5844  # we could use a simple skeleton for flags checks, but this also
5845  # detect the static linking issue of ubsan, see also:
5846  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
5847  cat > $TMPC << EOF
5848#include <stdlib.h>
5849int main(void) {
5850    void *tmp = malloc(10);
5851    return *(int *)(tmp + 2);
5852}
5853EOF
5854  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
5855      have_ubsan=yes
5856  fi
5857
5858  if check_include "sanitizer/asan_interface.h" ; then
5859      have_asan_iface_h=yes
5860  fi
5861
5862  cat > $TMPC << EOF
5863#include <sanitizer/asan_interface.h>
5864int main(void) {
5865  __sanitizer_start_switch_fiber(0, 0, 0);
5866  return 0;
5867}
5868EOF
5869  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
5870      have_asan_iface_fiber=yes
5871  fi
5872fi
5873
5874##########################################
5875# check for libpmem
5876
5877if test "$libpmem" != "no"; then
5878	if $pkg_config --exists "libpmem"; then
5879		libpmem="yes"
5880		libpmem_libs=$($pkg_config --libs libpmem)
5881		libpmem_cflags=$($pkg_config --cflags libpmem)
5882		libs_softmmu="$libs_softmmu $libpmem_libs"
5883		QEMU_CFLAGS="$QEMU_CFLAGS $libpmem_cflags"
5884	else
5885		if test "$libpmem" = "yes" ; then
5886			feature_not_found "libpmem" "Install nvml or pmdk"
5887		fi
5888		libpmem="no"
5889	fi
5890fi
5891
5892##########################################
5893# check for slirp
5894
5895case "$slirp" in
5896  "" | yes)
5897    if $pkg_config slirp; then
5898      slirp=system
5899    elif test -e "${source_path}/.git" && test $git_update = 'yes' ; then
5900      slirp=git
5901    elif test -e "${source_path}/slirp/Makefile" ; then
5902      slirp=internal
5903    elif test -z "$slirp" ; then
5904      slirp=no
5905    else
5906      feature_not_found "slirp" "Install slirp devel or git submodule"
5907    fi
5908    ;;
5909
5910  system)
5911    if ! $pkg_config slirp; then
5912      feature_not_found "slirp" "Install slirp devel"
5913    fi
5914    ;;
5915esac
5916
5917case "$slirp" in
5918  git | internal)
5919    if test "$slirp" = git; then
5920      git_submodules="${git_submodules} slirp"
5921    fi
5922    mkdir -p slirp
5923    slirp_cflags="-I\$(SRC_PATH)/slirp/src -I\$(BUILD_DIR)/slirp/src"
5924    slirp_libs="-L\$(BUILD_DIR)/slirp -lslirp"
5925    ;;
5926
5927  system)
5928    slirp_version=$($pkg_config --modversion slirp 2>/dev/null)
5929    slirp_cflags=$($pkg_config --cflags slirp 2>/dev/null)
5930    slirp_libs=$($pkg_config --libs slirp 2>/dev/null)
5931    ;;
5932
5933  no)
5934    ;;
5935  *)
5936    error_exit "Unknown state for slirp: $slirp"
5937    ;;
5938esac
5939
5940
5941##########################################
5942# End of CC checks
5943# After here, no more $cc or $ld runs
5944
5945write_c_skeleton
5946
5947if test "$gcov" = "yes" ; then
5948  CFLAGS="-fprofile-arcs -ftest-coverage -g $CFLAGS"
5949  LDFLAGS="-fprofile-arcs -ftest-coverage $LDFLAGS"
5950elif test "$fortify_source" = "yes" ; then
5951  CFLAGS="-O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $CFLAGS"
5952elif test "$debug" = "no"; then
5953  CFLAGS="-O2 $CFLAGS"
5954fi
5955
5956if test "$have_asan" = "yes"; then
5957  CFLAGS="-fsanitize=address $CFLAGS"
5958  if test "$have_asan_iface_h" = "no" ; then
5959      echo "ASAN build enabled, but ASAN header missing." \
5960           "Without code annotation, the report may be inferior."
5961  elif test "$have_asan_iface_fiber" = "no" ; then
5962      echo "ASAN build enabled, but ASAN header is too old." \
5963           "Without code annotation, the report may be inferior."
5964  fi
5965fi
5966if test "$have_ubsan" = "yes"; then
5967  CFLAGS="-fsanitize=undefined $CFLAGS"
5968fi
5969
5970##########################################
5971# Do we have libnfs
5972if test "$libnfs" != "no" ; then
5973  if $pkg_config --atleast-version=1.9.3 libnfs; then
5974    libnfs="yes"
5975    libnfs_libs=$($pkg_config --libs libnfs)
5976  else
5977    if test "$libnfs" = "yes" ; then
5978      feature_not_found "libnfs" "Install libnfs devel >= 1.9.3"
5979    fi
5980    libnfs="no"
5981  fi
5982fi
5983
5984##########################################
5985# Do we have libudev
5986if test "$libudev" != "no" ; then
5987  if $pkg_config libudev && test "$static" != "yes"; then
5988    libudev="yes"
5989    libudev_libs=$($pkg_config --libs libudev)
5990  else
5991    libudev="no"
5992  fi
5993fi
5994
5995# Now we've finished running tests it's OK to add -Werror to the compiler flags
5996if test "$werror" = "yes"; then
5997    QEMU_CFLAGS="-Werror $QEMU_CFLAGS"
5998fi
5999
6000if test "$solaris" = "no" ; then
6001    if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
6002        LDFLAGS="-Wl,--warn-common $LDFLAGS"
6003    fi
6004fi
6005
6006# test if pod2man has --utf8 option
6007if pod2man --help | grep -q utf8; then
6008    POD2MAN="pod2man --utf8"
6009else
6010    POD2MAN="pod2man"
6011fi
6012
6013# Use ASLR, no-SEH and DEP if available
6014if test "$mingw32" = "yes" ; then
6015    for flag in --dynamicbase --no-seh --nxcompat; do
6016        if ld_has $flag ; then
6017            LDFLAGS="-Wl,$flag $LDFLAGS"
6018        fi
6019    done
6020fi
6021
6022# Disable OpenBSD W^X if available
6023if test "$tcg" = "yes" && test "$targetos" = "OpenBSD"; then
6024    cat > $TMPC <<EOF
6025    int main(void) { return 0; }
6026EOF
6027    wx_ldflags="-Wl,-z,wxneeded"
6028    if compile_prog "" "$wx_ldflags"; then
6029        QEMU_LDFLAGS="$QEMU_LDFLAGS $wx_ldflags"
6030    fi
6031fi
6032
6033qemu_confdir=$sysconfdir$confsuffix
6034qemu_moddir=$libdir$confsuffix
6035qemu_datadir=$datadir$confsuffix
6036qemu_localedir="$datadir/locale"
6037qemu_icondir="$datadir/icons"
6038qemu_desktopdir="$datadir/applications"
6039
6040# We can only support ivshmem if we have eventfd
6041if [ "$eventfd" = "yes" ]; then
6042  ivshmem=yes
6043fi
6044
6045tools=""
6046if test "$want_tools" = "yes" ; then
6047  tools="qemu-img\$(EXESUF) qemu-io\$(EXESUF) qemu-edid\$(EXESUF) $tools"
6048  if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" ] ; then
6049    tools="qemu-nbd\$(EXESUF) $tools"
6050  fi
6051  if [ "$ivshmem" = "yes" ]; then
6052    tools="ivshmem-client\$(EXESUF) ivshmem-server\$(EXESUF) $tools"
6053  fi
6054  if [ "$curl" = "yes" ]; then
6055      tools="elf2dmp\$(EXESUF) $tools"
6056  fi
6057fi
6058if test "$softmmu" = yes ; then
6059  if test "$linux" = yes; then
6060    if test "$virtfs" != no && test "$cap" = yes && test "$attr" = yes ; then
6061      virtfs=yes
6062      tools="$tools fsdev/virtfs-proxy-helper\$(EXESUF)"
6063    else
6064      if test "$virtfs" = yes; then
6065        error_exit "VirtFS requires libcap devel and libattr devel"
6066      fi
6067      virtfs=no
6068    fi
6069    if test "$mpath" != no && test "$mpathpersist" = yes ; then
6070      mpath=yes
6071    else
6072      if test "$mpath" = yes; then
6073        error_exit "Multipath requires libmpathpersist devel"
6074      fi
6075      mpath=no
6076    fi
6077    tools="$tools scsi/qemu-pr-helper\$(EXESUF)"
6078  else
6079    if test "$virtfs" = yes; then
6080      error_exit "VirtFS is supported only on Linux"
6081    fi
6082    virtfs=no
6083    if test "$mpath" = yes; then
6084      error_exit "Multipath is supported only on Linux"
6085    fi
6086    mpath=no
6087  fi
6088  if test "$xkbcommon" = "yes"; then
6089    tools="qemu-keymap\$(EXESUF) $tools"
6090  fi
6091fi
6092
6093# Probe for guest agent support/options
6094
6095if [ "$guest_agent" != "no" ]; then
6096  if [ "$softmmu" = no -a "$want_tools" = no ] ; then
6097      guest_agent=no
6098  elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
6099      tools="qemu-ga\$(EXESUF) $tools"
6100      guest_agent=yes
6101  elif [ "$guest_agent" != yes ]; then
6102      guest_agent=no
6103  else
6104      error_exit "Guest agent is not supported on this platform"
6105  fi
6106fi
6107
6108# Guest agent Window MSI  package
6109
6110if test "$guest_agent" != yes; then
6111  if test "$guest_agent_msi" = yes; then
6112    error_exit "MSI guest agent package requires guest agent enabled"
6113  fi
6114  guest_agent_msi=no
6115elif test "$mingw32" != "yes"; then
6116  if test "$guest_agent_msi" = "yes"; then
6117    error_exit "MSI guest agent package is available only for MinGW Windows cross-compilation"
6118  fi
6119  guest_agent_msi=no
6120elif ! has wixl; then
6121  if test "$guest_agent_msi" = "yes"; then
6122    error_exit "MSI guest agent package requires wixl tool installed ( usually from msitools package )"
6123  fi
6124  guest_agent_msi=no
6125else
6126  # we support qemu-ga, mingw32, and wixl: default to MSI enabled if it wasn't
6127  # disabled explicitly
6128  if test "$guest_agent_msi" != "no"; then
6129    guest_agent_msi=yes
6130  fi
6131fi
6132
6133if test "$guest_agent_msi" = "yes"; then
6134  if test "$guest_agent_with_vss" = "yes"; then
6135    QEMU_GA_MSI_WITH_VSS="-D InstallVss"
6136  fi
6137
6138  if test "$QEMU_GA_MANUFACTURER" = ""; then
6139    QEMU_GA_MANUFACTURER=QEMU
6140  fi
6141
6142  if test "$QEMU_GA_DISTRO" = ""; then
6143    QEMU_GA_DISTRO=Linux
6144  fi
6145
6146  if test "$QEMU_GA_VERSION" = ""; then
6147      QEMU_GA_VERSION=$(cat $source_path/VERSION)
6148  fi
6149
6150  QEMU_GA_MSI_MINGW_DLL_PATH="-D Mingw_dlls=$($pkg_config --variable=prefix glib-2.0)/bin"
6151
6152  case "$cpu" in
6153  x86_64)
6154    QEMU_GA_MSI_ARCH="-a x64 -D Arch=64"
6155    ;;
6156  i386)
6157    QEMU_GA_MSI_ARCH="-D Arch=32"
6158    ;;
6159  *)
6160    error_exit "CPU $cpu not supported for building installation package"
6161    ;;
6162  esac
6163fi
6164
6165# Mac OS X ships with a broken assembler
6166roms=
6167if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
6168        test "$targetos" != "Darwin" && test "$targetos" != "SunOS" && \
6169        test "$softmmu" = yes ; then
6170    # Different host OS linkers have different ideas about the name of the ELF
6171    # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
6172    # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
6173    for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
6174        if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
6175            ld_i386_emulation="$emu"
6176            roms="optionrom"
6177            break
6178        fi
6179    done
6180fi
6181
6182# Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
6183if test "$cpu" = "s390x" ; then
6184  write_c_skeleton
6185  if compile_prog "-march=z900" ""; then
6186    roms="$roms s390-ccw"
6187  fi
6188fi
6189
6190# Probe for the need for relocating the user-only binary.
6191if ( [ "$linux_user" = yes ] || [ "$bsd_user" = yes ] ) && [ "$pie" = no ]; then
6192  textseg_addr=
6193  case "$cpu" in
6194    arm | i386 | ppc* | s390* | sparc* | x86_64 | x32)
6195      # ??? Rationale for choosing this address
6196      textseg_addr=0x60000000
6197      ;;
6198    mips)
6199      # A 256M aligned address, high in the address space, with enough
6200      # room for the code_gen_buffer above it before the stack.
6201      textseg_addr=0x60000000
6202      ;;
6203  esac
6204  if [ -n "$textseg_addr" ]; then
6205    cat > $TMPC <<EOF
6206    int main(void) { return 0; }
6207EOF
6208    textseg_ldflags="-Wl,-Ttext-segment=$textseg_addr"
6209    if ! compile_prog "" "$textseg_ldflags"; then
6210      # In case ld does not support -Ttext-segment, edit the default linker
6211      # script via sed to set the .text start addr.  This is needed on FreeBSD
6212      # at least.
6213      if ! $ld --verbose >/dev/null 2>&1; then
6214        error_exit \
6215            "We need to link the QEMU user mode binaries at a" \
6216            "specific text address. Unfortunately your linker" \
6217            "doesn't support either the -Ttext-segment option or" \
6218            "printing the default linker script with --verbose." \
6219            "If you don't want the user mode binaries, pass the" \
6220            "--disable-user option to configure."
6221      fi
6222
6223      $ld --verbose | sed \
6224        -e '1,/==================================================/d' \
6225        -e '/==================================================/,$d' \
6226        -e "s/[.] = [0-9a-fx]* [+] SIZEOF_HEADERS/. = $textseg_addr + SIZEOF_HEADERS/" \
6227        -e "s/__executable_start = [0-9a-fx]*/__executable_start = $textseg_addr/" > config-host.ld
6228      textseg_ldflags="-Wl,-T../config-host.ld"
6229    fi
6230  fi
6231fi
6232
6233# Check that the C++ compiler exists and works with the C compiler.
6234# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
6235if has $cxx; then
6236    cat > $TMPC <<EOF
6237int c_function(void);
6238int main(void) { return c_function(); }
6239EOF
6240
6241    compile_object
6242
6243    cat > $TMPCXX <<EOF
6244extern "C" {
6245   int c_function(void);
6246}
6247int c_function(void) { return 42; }
6248EOF
6249
6250    update_cxxflags
6251
6252    if do_cxx $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $LDFLAGS; then
6253        # C++ compiler $cxx works ok with C compiler $cc
6254        :
6255    else
6256        echo "C++ compiler $cxx does not work with C compiler $cc"
6257        echo "Disabling C++ specific optional code"
6258        cxx=
6259    fi
6260else
6261    echo "No C++ compiler available; disabling C++ specific optional code"
6262    cxx=
6263fi
6264
6265echo_version() {
6266    if test "$1" = "yes" ; then
6267        echo "($2)"
6268    fi
6269}
6270
6271# prepend pixman and ftd flags after all config tests are done
6272QEMU_CFLAGS="$pixman_cflags $fdt_cflags $QEMU_CFLAGS"
6273QEMU_LDFLAGS="$fdt_ldflags $QEMU_LDFLAGS"
6274libs_softmmu="$pixman_libs $libs_softmmu"
6275
6276echo "Install prefix    $prefix"
6277echo "BIOS directory    $(eval echo $qemu_datadir)"
6278echo "firmware path     $(eval echo $firmwarepath)"
6279echo "binary directory  $(eval echo $bindir)"
6280echo "library directory $(eval echo $libdir)"
6281echo "module directory  $(eval echo $qemu_moddir)"
6282echo "libexec directory $(eval echo $libexecdir)"
6283echo "include directory $(eval echo $includedir)"
6284echo "config directory  $(eval echo $sysconfdir)"
6285if test "$mingw32" = "no" ; then
6286echo "local state directory   $(eval echo $local_statedir)"
6287echo "Manual directory  $(eval echo $mandir)"
6288echo "ELF interp prefix $interp_prefix"
6289else
6290echo "local state directory   queried at runtime"
6291echo "Windows SDK       $win_sdk"
6292fi
6293echo "Source path       $source_path"
6294echo "GIT binary        $git"
6295echo "GIT submodules    $git_submodules"
6296echo "C compiler        $cc"
6297echo "Host C compiler   $host_cc"
6298echo "C++ compiler      $cxx"
6299echo "Objective-C compiler $objcc"
6300echo "ARFLAGS           $ARFLAGS"
6301echo "CFLAGS            $CFLAGS"
6302echo "QEMU_CFLAGS       $QEMU_CFLAGS"
6303echo "LDFLAGS           $LDFLAGS"
6304echo "QEMU_LDFLAGS      $QEMU_LDFLAGS"
6305echo "make              $make"
6306echo "install           $install"
6307echo "python            $python ($python_version)"
6308echo "slirp support     $slirp $(echo_version $slirp $slirp_version)"
6309if test "$slirp" != "no" ; then
6310    echo "smbd              $smbd"
6311fi
6312echo "module support    $modules"
6313echo "host CPU          $cpu"
6314echo "host big endian   $bigendian"
6315echo "target list       $target_list"
6316echo "gprof enabled     $gprof"
6317echo "sparse enabled    $sparse"
6318echo "strip binaries    $strip_opt"
6319echo "profiler          $profiler"
6320echo "static build      $static"
6321if test "$darwin" = "yes" ; then
6322    echo "Cocoa support     $cocoa"
6323fi
6324echo "SDL support       $sdl $(echo_version $sdl $sdlversion)"
6325echo "SDL image support $sdl_image"
6326echo "GTK support       $gtk $(echo_version $gtk $gtk_version)"
6327echo "GTK GL support    $gtk_gl"
6328echo "VTE support       $vte $(echo_version $vte $vteversion)"
6329echo "TLS priority      $tls_priority"
6330echo "GNUTLS support    $gnutls"
6331echo "libgcrypt         $gcrypt"
6332echo "nettle            $nettle $(echo_version $nettle $nettle_version)"
6333echo "libtasn1          $tasn1"
6334echo "PAM               $auth_pam"
6335echo "iconv support     $iconv"
6336echo "curses support    $curses"
6337echo "virgl support     $virglrenderer $(echo_version $virglrenderer $virgl_version)"
6338echo "curl support      $curl"
6339echo "mingw32 support   $mingw32"
6340echo "Audio drivers     $audio_drv_list"
6341echo "Block whitelist (rw) $block_drv_rw_whitelist"
6342echo "Block whitelist (ro) $block_drv_ro_whitelist"
6343echo "VirtFS support    $virtfs"
6344echo "Multipath support $mpath"
6345echo "VNC support       $vnc"
6346if test "$vnc" = "yes" ; then
6347    echo "VNC SASL support  $vnc_sasl"
6348    echo "VNC JPEG support  $vnc_jpeg"
6349    echo "VNC PNG support   $vnc_png"
6350fi
6351echo "xen support       $xen"
6352if test "$xen" = "yes" ; then
6353  echo "xen ctrl version  $xen_ctrl_version"
6354fi
6355echo "brlapi support    $brlapi"
6356echo "bluez  support    $bluez"
6357echo "Documentation     $docs"
6358echo "PIE               $pie"
6359echo "vde support       $vde"
6360echo "netmap support    $netmap"
6361echo "Linux AIO support $linux_aio"
6362echo "ATTR/XATTR support $attr"
6363echo "Install blobs     $blobs"
6364echo "KVM support       $kvm"
6365echo "HAX support       $hax"
6366echo "HVF support       $hvf"
6367echo "WHPX support      $whpx"
6368echo "TCG support       $tcg"
6369if test "$tcg" = "yes" ; then
6370    echo "TCG debug enabled $debug_tcg"
6371    echo "TCG interpreter   $tcg_interpreter"
6372fi
6373echo "malloc trim support $malloc_trim"
6374echo "RDMA support      $rdma"
6375echo "PVRDMA support    $pvrdma"
6376echo "fdt support       $fdt"
6377echo "membarrier        $membarrier"
6378echo "preadv support    $preadv"
6379echo "fdatasync         $fdatasync"
6380echo "madvise           $madvise"
6381echo "posix_madvise     $posix_madvise"
6382echo "posix_memalign    $posix_memalign"
6383echo "libcap-ng support $cap_ng"
6384echo "vhost-net support $vhost_net"
6385echo "vhost-crypto support $vhost_crypto"
6386echo "vhost-scsi support $vhost_scsi"
6387echo "vhost-vsock support $vhost_vsock"
6388echo "vhost-user support $vhost_user"
6389echo "vhost-user-fs support $vhost_user_fs"
6390echo "Trace backends    $trace_backends"
6391if have_backend "simple"; then
6392echo "Trace output file $trace_file-<pid>"
6393fi
6394echo "spice support     $spice $(echo_version $spice $spice_protocol_version/$spice_server_version)"
6395echo "rbd support       $rbd"
6396echo "xfsctl support    $xfs"
6397echo "smartcard support $smartcard"
6398echo "libusb            $libusb"
6399echo "usb net redir     $usb_redir"
6400echo "OpenGL support    $opengl"
6401echo "OpenGL dmabufs    $opengl_dmabuf"
6402echo "libiscsi support  $libiscsi"
6403echo "libnfs support    $libnfs"
6404echo "build guest agent $guest_agent"
6405echo "QGA VSS support   $guest_agent_with_vss"
6406echo "QGA w32 disk info $guest_agent_ntddscsi"
6407echo "QGA MSI support   $guest_agent_msi"
6408echo "seccomp support   $seccomp"
6409echo "coroutine backend $coroutine"
6410echo "coroutine pool    $coroutine_pool"
6411echo "debug stack usage $debug_stack_usage"
6412echo "mutex debugging   $debug_mutex"
6413echo "crypto afalg      $crypto_afalg"
6414echo "GlusterFS support $glusterfs"
6415echo "gcov              $gcov_tool"
6416echo "gcov enabled      $gcov"
6417echo "TPM support       $tpm"
6418echo "libssh support    $libssh"
6419echo "QOM debugging     $qom_cast_debug"
6420echo "Live block migration $live_block_migration"
6421echo "lzo support       $lzo"
6422echo "snappy support    $snappy"
6423echo "bzip2 support     $bzip2"
6424echo "lzfse support     $lzfse"
6425echo "NUMA host support $numa"
6426echo "libxml2           $libxml2"
6427echo "tcmalloc support  $tcmalloc"
6428echo "jemalloc support  $jemalloc"
6429echo "avx2 optimization $avx2_opt"
6430echo "replication support $replication"
6431echo "VxHS block device $vxhs"
6432echo "bochs support     $bochs"
6433echo "cloop support     $cloop"
6434echo "dmg support       $dmg"
6435echo "qcow v1 support   $qcow1"
6436echo "vdi support       $vdi"
6437echo "vvfat support     $vvfat"
6438echo "qed support       $qed"
6439echo "parallels support $parallels"
6440echo "sheepdog support  $sheepdog"
6441echo "capstone          $capstone"
6442echo "libpmem support   $libpmem"
6443echo "libudev           $libudev"
6444echo "default devices   $default_devices"
6445
6446if test "$supported_cpu" = "no"; then
6447    echo
6448    echo "WARNING: SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!"
6449    echo
6450    echo "CPU host architecture $cpu support is not currently maintained."
6451    echo "The QEMU project intends to remove support for this host CPU in"
6452    echo "a future release if nobody volunteers to maintain it and to"
6453    echo "provide a build host for our continuous integration setup."
6454    echo "configure has succeeded and you can continue to build, but"
6455    echo "if you care about QEMU on this platform you should contact"
6456    echo "us upstream at qemu-devel@nongnu.org."
6457fi
6458
6459if test "$supported_os" = "no"; then
6460    echo
6461    echo "WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!"
6462    echo
6463    echo "Host OS $targetos support is not currently maintained."
6464    echo "The QEMU project intends to remove support for this host OS in"
6465    echo "a future release if nobody volunteers to maintain it and to"
6466    echo "provide a build host for our continuous integration setup."
6467    echo "configure has succeeded and you can continue to build, but"
6468    echo "if you care about QEMU on this platform you should contact"
6469    echo "us upstream at qemu-devel@nongnu.org."
6470fi
6471
6472# Note that if the Python conditional here evaluates True we will exit
6473# with status 1 which is a shell 'false' value.
6474if ! $python -c 'import sys; sys.exit(sys.version_info < (3,0))'; then
6475  echo
6476  echo "warning: Python 2 support is deprecated" >&2
6477  echo "warning: Python 3 will be required for building future versions of QEMU" >&2
6478  python2="y"
6479fi
6480
6481config_host_mak="config-host.mak"
6482
6483echo "# Automatically generated by configure - do not modify" >config-all-disas.mak
6484
6485echo "# Automatically generated by configure - do not modify" > $config_host_mak
6486echo >> $config_host_mak
6487
6488echo all: >> $config_host_mak
6489echo "prefix=$prefix" >> $config_host_mak
6490echo "bindir=$bindir" >> $config_host_mak
6491echo "libdir=$libdir" >> $config_host_mak
6492echo "libexecdir=$libexecdir" >> $config_host_mak
6493echo "includedir=$includedir" >> $config_host_mak
6494echo "mandir=$mandir" >> $config_host_mak
6495echo "sysconfdir=$sysconfdir" >> $config_host_mak
6496echo "qemu_confdir=$qemu_confdir" >> $config_host_mak
6497echo "qemu_datadir=$qemu_datadir" >> $config_host_mak
6498echo "qemu_firmwarepath=$firmwarepath" >> $config_host_mak
6499echo "qemu_docdir=$qemu_docdir" >> $config_host_mak
6500echo "qemu_moddir=$qemu_moddir" >> $config_host_mak
6501if test "$mingw32" = "no" ; then
6502  echo "qemu_localstatedir=$local_statedir" >> $config_host_mak
6503fi
6504echo "qemu_helperdir=$libexecdir" >> $config_host_mak
6505echo "qemu_localedir=$qemu_localedir" >> $config_host_mak
6506echo "qemu_icondir=$qemu_icondir" >> $config_host_mak
6507echo "qemu_desktopdir=$qemu_desktopdir" >> $config_host_mak
6508echo "libs_cpu=$libs_cpu" >> $config_host_mak
6509echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
6510echo "GIT=$git" >> $config_host_mak
6511echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
6512echo "GIT_UPDATE=$git_update" >> $config_host_mak
6513
6514echo "ARCH=$ARCH" >> $config_host_mak
6515
6516if test "$default_devices" = "yes" ; then
6517  echo "CONFIG_MINIKCONF_MODE=--defconfig" >> $config_host_mak
6518else
6519  echo "CONFIG_MINIKCONF_MODE=--allnoconfig" >> $config_host_mak
6520fi
6521if test "$debug_tcg" = "yes" ; then
6522  echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
6523fi
6524if test "$strip_opt" = "yes" ; then
6525  echo "STRIP=${strip}" >> $config_host_mak
6526fi
6527if test "$bigendian" = "yes" ; then
6528  echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
6529fi
6530if test "$mingw32" = "yes" ; then
6531  echo "CONFIG_WIN32=y" >> $config_host_mak
6532  rc_version=$(cat $source_path/VERSION)
6533  version_major=${rc_version%%.*}
6534  rc_version=${rc_version#*.}
6535  version_minor=${rc_version%%.*}
6536  rc_version=${rc_version#*.}
6537  version_subminor=${rc_version%%.*}
6538  version_micro=0
6539  echo "CONFIG_FILEVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
6540  echo "CONFIG_PRODUCTVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
6541  if test "$guest_agent_with_vss" = "yes" ; then
6542    echo "CONFIG_QGA_VSS=y" >> $config_host_mak
6543    echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
6544    echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
6545  fi
6546  if test "$guest_agent_ntddscsi" = "yes" ; then
6547    echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
6548  fi
6549  if test "$guest_agent_msi" = "yes"; then
6550    echo "QEMU_GA_MSI_ENABLED=yes" >> $config_host_mak
6551    echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
6552    echo "QEMU_GA_MSI_WITH_VSS=${QEMU_GA_MSI_WITH_VSS}" >> $config_host_mak
6553    echo "QEMU_GA_MSI_ARCH=${QEMU_GA_MSI_ARCH}" >> $config_host_mak
6554    echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
6555    echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
6556    echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
6557  fi
6558else
6559  echo "CONFIG_POSIX=y" >> $config_host_mak
6560fi
6561
6562if test "$linux" = "yes" ; then
6563  echo "CONFIG_LINUX=y" >> $config_host_mak
6564fi
6565
6566if test "$darwin" = "yes" ; then
6567  echo "CONFIG_DARWIN=y" >> $config_host_mak
6568fi
6569
6570if test "$solaris" = "yes" ; then
6571  echo "CONFIG_SOLARIS=y" >> $config_host_mak
6572fi
6573if test "$haiku" = "yes" ; then
6574  echo "CONFIG_HAIKU=y" >> $config_host_mak
6575fi
6576if test "$static" = "yes" ; then
6577  echo "CONFIG_STATIC=y" >> $config_host_mak
6578fi
6579if test "$profiler" = "yes" ; then
6580  echo "CONFIG_PROFILER=y" >> $config_host_mak
6581fi
6582if test "$want_tools" = "yes" ; then
6583  echo "CONFIG_TOOLS=y" >> $config_host_mak
6584fi
6585if test "$slirp" != "no"; then
6586  echo "CONFIG_SLIRP=y" >> $config_host_mak
6587  echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
6588  echo "SLIRP_CFLAGS=$slirp_cflags" >> $config_host_mak
6589  echo "SLIRP_LIBS=$slirp_libs" >> $config_host_mak
6590fi
6591if [ "$slirp" = "git" -o "$slirp" = "internal" ]; then
6592    echo "config-host.h: slirp/all" >> $config_host_mak
6593fi
6594if test "$vde" = "yes" ; then
6595  echo "CONFIG_VDE=y" >> $config_host_mak
6596  echo "VDE_LIBS=$vde_libs" >> $config_host_mak
6597fi
6598if test "$netmap" = "yes" ; then
6599  echo "CONFIG_NETMAP=y" >> $config_host_mak
6600fi
6601if test "$l2tpv3" = "yes" ; then
6602  echo "CONFIG_L2TPV3=y" >> $config_host_mak
6603fi
6604if test "$cap_ng" = "yes" ; then
6605  echo "CONFIG_LIBCAP=y" >> $config_host_mak
6606fi
6607echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
6608for drv in $audio_drv_list; do
6609    def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
6610    case "$drv" in
6611	alsa | oss | pa | sdl)
6612	    echo "$def=m" >> $config_host_mak ;;
6613	*)
6614	    echo "$def=y" >> $config_host_mak ;;
6615    esac
6616done
6617echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak
6618echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
6619echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak
6620echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak
6621echo "OSS_LIBS=$oss_libs" >> $config_host_mak
6622if test "$audio_win_int" = "yes" ; then
6623  echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
6624fi
6625echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
6626echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
6627if test "$vnc" = "yes" ; then
6628  echo "CONFIG_VNC=y" >> $config_host_mak
6629fi
6630if test "$vnc_sasl" = "yes" ; then
6631  echo "CONFIG_VNC_SASL=y" >> $config_host_mak
6632fi
6633if test "$vnc_jpeg" = "yes" ; then
6634  echo "CONFIG_VNC_JPEG=y" >> $config_host_mak
6635fi
6636if test "$vnc_png" = "yes" ; then
6637  echo "CONFIG_VNC_PNG=y" >> $config_host_mak
6638fi
6639if test "$xkbcommon" = "yes" ; then
6640  echo "XKBCOMMON_CFLAGS=$xkbcommon_cflags" >> $config_host_mak
6641  echo "XKBCOMMON_LIBS=$xkbcommon_libs" >> $config_host_mak
6642fi
6643if test "$xfs" = "yes" ; then
6644  echo "CONFIG_XFS=y" >> $config_host_mak
6645fi
6646qemu_version=$(head $source_path/VERSION)
6647echo "VERSION=$qemu_version" >>$config_host_mak
6648echo "PKGVERSION=$pkgversion" >>$config_host_mak
6649echo "SRC_PATH=$source_path" >> $config_host_mak
6650echo "TARGET_DIRS=$target_list" >> $config_host_mak
6651if [ "$docs" = "yes" ] ; then
6652  echo "BUILD_DOCS=yes" >> $config_host_mak
6653fi
6654if test "$modules" = "yes"; then
6655  # $shacmd can generate a hash started with digit, which the compiler doesn't
6656  # like as an symbol. So prefix it with an underscore
6657  echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
6658  echo "CONFIG_MODULES=y" >> $config_host_mak
6659fi
6660if test "$have_x11" = "yes" && test "$need_x11" = "yes"; then
6661  echo "CONFIG_X11=y" >> $config_host_mak
6662  echo "X11_CFLAGS=$x11_cflags" >> $config_host_mak
6663  echo "X11_LIBS=$x11_libs" >> $config_host_mak
6664fi
6665if test "$sdl" = "yes" ; then
6666  echo "CONFIG_SDL=m" >> $config_host_mak
6667  echo "SDL_CFLAGS=$sdl_cflags" >> $config_host_mak
6668  echo "SDL_LIBS=$sdl_libs" >> $config_host_mak
6669  if test "$sdl_image" = "yes" ; then
6670      echo "CONFIG_SDL_IMAGE=y" >> $config_host_mak
6671  fi
6672fi
6673if test "$cocoa" = "yes" ; then
6674  echo "CONFIG_COCOA=y" >> $config_host_mak
6675fi
6676if test "$iconv" = "yes" ; then
6677  echo "CONFIG_ICONV=y" >> $config_host_mak
6678  echo "ICONV_CFLAGS=$iconv_cflags" >> $config_host_mak
6679  echo "ICONV_LIBS=$iconv_lib" >> $config_host_mak
6680fi
6681if test "$curses" = "yes" ; then
6682  echo "CONFIG_CURSES=m" >> $config_host_mak
6683  echo "CURSES_CFLAGS=$curses_inc" >> $config_host_mak
6684  echo "CURSES_LIBS=$curses_lib" >> $config_host_mak
6685fi
6686if test "$pipe2" = "yes" ; then
6687  echo "CONFIG_PIPE2=y" >> $config_host_mak
6688fi
6689if test "$accept4" = "yes" ; then
6690  echo "CONFIG_ACCEPT4=y" >> $config_host_mak
6691fi
6692if test "$splice" = "yes" ; then
6693  echo "CONFIG_SPLICE=y" >> $config_host_mak
6694fi
6695if test "$eventfd" = "yes" ; then
6696  echo "CONFIG_EVENTFD=y" >> $config_host_mak
6697fi
6698if test "$memfd" = "yes" ; then
6699  echo "CONFIG_MEMFD=y" >> $config_host_mak
6700fi
6701if test "$have_usbfs" = "yes" ; then
6702  echo "CONFIG_USBFS=y" >> $config_host_mak
6703fi
6704if test "$fallocate" = "yes" ; then
6705  echo "CONFIG_FALLOCATE=y" >> $config_host_mak
6706fi
6707if test "$fallocate_punch_hole" = "yes" ; then
6708  echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
6709fi
6710if test "$fallocate_zero_range" = "yes" ; then
6711  echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak
6712fi
6713if test "$posix_fallocate" = "yes" ; then
6714  echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
6715fi
6716if test "$sync_file_range" = "yes" ; then
6717  echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
6718fi
6719if test "$fiemap" = "yes" ; then
6720  echo "CONFIG_FIEMAP=y" >> $config_host_mak
6721fi
6722if test "$dup3" = "yes" ; then
6723  echo "CONFIG_DUP3=y" >> $config_host_mak
6724fi
6725if test "$ppoll" = "yes" ; then
6726  echo "CONFIG_PPOLL=y" >> $config_host_mak
6727fi
6728if test "$prctl_pr_set_timerslack" = "yes" ; then
6729  echo "CONFIG_PRCTL_PR_SET_TIMERSLACK=y" >> $config_host_mak
6730fi
6731if test "$epoll" = "yes" ; then
6732  echo "CONFIG_EPOLL=y" >> $config_host_mak
6733fi
6734if test "$epoll_create1" = "yes" ; then
6735  echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
6736fi
6737if test "$sendfile" = "yes" ; then
6738  echo "CONFIG_SENDFILE=y" >> $config_host_mak
6739fi
6740if test "$timerfd" = "yes" ; then
6741  echo "CONFIG_TIMERFD=y" >> $config_host_mak
6742fi
6743if test "$setns" = "yes" ; then
6744  echo "CONFIG_SETNS=y" >> $config_host_mak
6745fi
6746if test "$clock_adjtime" = "yes" ; then
6747  echo "CONFIG_CLOCK_ADJTIME=y" >> $config_host_mak
6748fi
6749if test "$syncfs" = "yes" ; then
6750  echo "CONFIG_SYNCFS=y" >> $config_host_mak
6751fi
6752if test "$inotify" = "yes" ; then
6753  echo "CONFIG_INOTIFY=y" >> $config_host_mak
6754fi
6755if test "$inotify1" = "yes" ; then
6756  echo "CONFIG_INOTIFY1=y" >> $config_host_mak
6757fi
6758if test "$sem_timedwait" = "yes" ; then
6759  echo "CONFIG_SEM_TIMEDWAIT=y" >> $config_host_mak
6760fi
6761if test "$strchrnul" = "yes" ; then
6762  echo "HAVE_STRCHRNUL=y" >> $config_host_mak
6763fi
6764if test "$byteswap_h" = "yes" ; then
6765  echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
6766fi
6767if test "$bswap_h" = "yes" ; then
6768  echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
6769fi
6770if test "$curl" = "yes" ; then
6771  echo "CONFIG_CURL=m" >> $config_host_mak
6772  echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak
6773  echo "CURL_LIBS=$curl_libs" >> $config_host_mak
6774fi
6775if test "$brlapi" = "yes" ; then
6776  echo "CONFIG_BRLAPI=y" >> $config_host_mak
6777  echo "BRLAPI_LIBS=$brlapi_libs" >> $config_host_mak
6778fi
6779if test "$bluez" = "yes" ; then
6780  echo "CONFIG_BLUEZ=y" >> $config_host_mak
6781  echo "BLUEZ_CFLAGS=$bluez_cflags" >> $config_host_mak
6782fi
6783if test "$gtk" = "yes" ; then
6784  echo "CONFIG_GTK=m" >> $config_host_mak
6785  echo "GTK_CFLAGS=$gtk_cflags" >> $config_host_mak
6786  echo "GTK_LIBS=$gtk_libs" >> $config_host_mak
6787  if test "$gtk_gl" = "yes" ; then
6788    echo "CONFIG_GTK_GL=y" >> $config_host_mak
6789  fi
6790fi
6791if test "$gio" = "yes" ; then
6792    echo "CONFIG_GIO=y" >> $config_host_mak
6793    echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
6794    echo "GIO_LIBS=$gio_libs" >> $config_host_mak
6795fi
6796echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
6797if test "$gnutls" = "yes" ; then
6798  echo "CONFIG_GNUTLS=y" >> $config_host_mak
6799fi
6800if test "$gcrypt" = "yes" ; then
6801  echo "CONFIG_GCRYPT=y" >> $config_host_mak
6802  if test "$gcrypt_hmac" = "yes" ; then
6803    echo "CONFIG_GCRYPT_HMAC=y" >> $config_host_mak
6804  fi
6805fi
6806if test "$nettle" = "yes" ; then
6807  echo "CONFIG_NETTLE=y" >> $config_host_mak
6808  echo "CONFIG_NETTLE_VERSION_MAJOR=${nettle_version%%.*}" >> $config_host_mak
6809fi
6810if test "$tasn1" = "yes" ; then
6811  echo "CONFIG_TASN1=y" >> $config_host_mak
6812fi
6813if test "$auth_pam" = "yes" ; then
6814    echo "CONFIG_AUTH_PAM=y" >> $config_host_mak
6815fi
6816if test "$have_ifaddrs_h" = "yes" ; then
6817    echo "HAVE_IFADDRS_H=y" >> $config_host_mak
6818fi
6819if test "$have_broken_size_max" = "yes" ; then
6820    echo "HAVE_BROKEN_SIZE_MAX=y" >> $config_host_mak
6821fi
6822
6823# Work around a system header bug with some kernel/XFS header
6824# versions where they both try to define 'struct fsxattr':
6825# xfs headers will not try to redefine structs from linux headers
6826# if this macro is set.
6827if test "$have_fsxattr" = "yes" ; then
6828    echo "HAVE_FSXATTR=y" >> $config_host_mak
6829fi
6830if test "$have_copy_file_range" = "yes" ; then
6831    echo "HAVE_COPY_FILE_RANGE=y" >> $config_host_mak
6832fi
6833if test "$vte" = "yes" ; then
6834  echo "CONFIG_VTE=y" >> $config_host_mak
6835  echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak
6836  echo "VTE_LIBS=$vte_libs" >> $config_host_mak
6837fi
6838if test "$virglrenderer" = "yes" ; then
6839  echo "CONFIG_VIRGL=y" >> $config_host_mak
6840  echo "VIRGL_CFLAGS=$virgl_cflags" >> $config_host_mak
6841  echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak
6842fi
6843if test "$xen" = "yes" ; then
6844  echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
6845  echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
6846fi
6847if test "$linux_aio" = "yes" ; then
6848  echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
6849fi
6850if test "$attr" = "yes" ; then
6851  echo "CONFIG_ATTR=y" >> $config_host_mak
6852fi
6853if test "$libattr" = "yes" ; then
6854  echo "CONFIG_LIBATTR=y" >> $config_host_mak
6855fi
6856if test "$virtfs" = "yes" ; then
6857  echo "CONFIG_VIRTFS=y" >> $config_host_mak
6858fi
6859if test "$mpath" = "yes" ; then
6860  echo "CONFIG_MPATH=y" >> $config_host_mak
6861  if test "$mpathpersist_new_api" = "yes"; then
6862    echo "CONFIG_MPATH_NEW_API=y" >> $config_host_mak
6863  fi
6864fi
6865if test "$vhost_scsi" = "yes" ; then
6866  echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
6867fi
6868if test "$vhost_net" = "yes" ; then
6869  echo "CONFIG_VHOST_NET=y" >> $config_host_mak
6870fi
6871if test "$vhost_net_user" = "yes" ; then
6872  echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
6873fi
6874if test "$vhost_crypto" = "yes" ; then
6875  echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
6876fi
6877if test "$vhost_vsock" = "yes" ; then
6878  echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
6879fi
6880if test "$vhost_kernel" = "yes" ; then
6881  echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
6882fi
6883if test "$vhost_user" = "yes" ; then
6884  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
6885fi
6886if test "$vhost_user_fs" = "yes" ; then
6887  echo "CONFIG_VHOST_USER_FS=y" >> $config_host_mak
6888fi
6889if test "$blobs" = "yes" ; then
6890  echo "INSTALL_BLOBS=yes" >> $config_host_mak
6891fi
6892if test "$iovec" = "yes" ; then
6893  echo "CONFIG_IOVEC=y" >> $config_host_mak
6894fi
6895if test "$preadv" = "yes" ; then
6896  echo "CONFIG_PREADV=y" >> $config_host_mak
6897fi
6898if test "$fdt" != "no" ; then
6899  echo "CONFIG_FDT=y" >> $config_host_mak
6900fi
6901if test "$membarrier" = "yes" ; then
6902  echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
6903fi
6904if test "$signalfd" = "yes" ; then
6905  echo "CONFIG_SIGNALFD=y" >> $config_host_mak
6906fi
6907if test "$optreset" = "yes" ; then
6908  echo "HAVE_OPTRESET=y" >> $config_host_mak
6909fi
6910if test "$tcg" = "yes"; then
6911  echo "CONFIG_TCG=y" >> $config_host_mak
6912  if test "$tcg_interpreter" = "yes" ; then
6913    echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
6914  fi
6915fi
6916if test "$fdatasync" = "yes" ; then
6917  echo "CONFIG_FDATASYNC=y" >> $config_host_mak
6918fi
6919if test "$madvise" = "yes" ; then
6920  echo "CONFIG_MADVISE=y" >> $config_host_mak
6921fi
6922if test "$posix_madvise" = "yes" ; then
6923  echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak
6924fi
6925if test "$posix_memalign" = "yes" ; then
6926  echo "CONFIG_POSIX_MEMALIGN=y" >> $config_host_mak
6927fi
6928
6929if test "$spice" = "yes" ; then
6930  echo "CONFIG_SPICE=y" >> $config_host_mak
6931fi
6932
6933if test "$smartcard" = "yes" ; then
6934  echo "CONFIG_SMARTCARD=y" >> $config_host_mak
6935  echo "SMARTCARD_CFLAGS=$libcacard_cflags" >> $config_host_mak
6936  echo "SMARTCARD_LIBS=$libcacard_libs" >> $config_host_mak
6937fi
6938
6939if test "$libusb" = "yes" ; then
6940  echo "CONFIG_USB_LIBUSB=y" >> $config_host_mak
6941  echo "LIBUSB_CFLAGS=$libusb_cflags" >> $config_host_mak
6942  echo "LIBUSB_LIBS=$libusb_libs" >> $config_host_mak
6943fi
6944
6945if test "$usb_redir" = "yes" ; then
6946  echo "CONFIG_USB_REDIR=y" >> $config_host_mak
6947  echo "USB_REDIR_CFLAGS=$usb_redir_cflags" >> $config_host_mak
6948  echo "USB_REDIR_LIBS=$usb_redir_libs" >> $config_host_mak
6949fi
6950
6951if test "$opengl" = "yes" ; then
6952  echo "CONFIG_OPENGL=y" >> $config_host_mak
6953  echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
6954  if test "$opengl_dmabuf" = "yes" ; then
6955    echo "CONFIG_OPENGL_DMABUF=y" >> $config_host_mak
6956  fi
6957fi
6958
6959if test "$gbm" = "yes" ; then
6960    echo "CONFIG_GBM=y" >> $config_host_mak
6961    echo "GBM_LIBS=$gbm_libs" >> $config_host_mak
6962    echo "GBM_CFLAGS=$gbm_cflags" >> $config_host_mak
6963fi
6964
6965
6966if test "$malloc_trim" = "yes" ; then
6967  echo "CONFIG_MALLOC_TRIM=y" >> $config_host_mak
6968fi
6969
6970if test "$avx2_opt" = "yes" ; then
6971  echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
6972fi
6973
6974if test "$lzo" = "yes" ; then
6975  echo "CONFIG_LZO=y" >> $config_host_mak
6976fi
6977
6978if test "$snappy" = "yes" ; then
6979  echo "CONFIG_SNAPPY=y" >> $config_host_mak
6980fi
6981
6982if test "$bzip2" = "yes" ; then
6983  echo "CONFIG_BZIP2=y" >> $config_host_mak
6984  echo "BZIP2_LIBS=-lbz2" >> $config_host_mak
6985fi
6986
6987if test "$lzfse" = "yes" ; then
6988  echo "CONFIG_LZFSE=y" >> $config_host_mak
6989  echo "LZFSE_LIBS=-llzfse" >> $config_host_mak
6990fi
6991
6992if test "$libiscsi" = "yes" ; then
6993  echo "CONFIG_LIBISCSI=m" >> $config_host_mak
6994  echo "LIBISCSI_CFLAGS=$libiscsi_cflags" >> $config_host_mak
6995  echo "LIBISCSI_LIBS=$libiscsi_libs" >> $config_host_mak
6996fi
6997
6998if test "$libnfs" = "yes" ; then
6999  echo "CONFIG_LIBNFS=m" >> $config_host_mak
7000  echo "LIBNFS_LIBS=$libnfs_libs" >> $config_host_mak
7001fi
7002
7003if test "$seccomp" = "yes"; then
7004  echo "CONFIG_SECCOMP=y" >> $config_host_mak
7005  echo "SECCOMP_CFLAGS=$seccomp_cflags" >> $config_host_mak
7006  echo "SECCOMP_LIBS=$seccomp_libs" >> $config_host_mak
7007fi
7008
7009# XXX: suppress that
7010if [ "$bsd" = "yes" ] ; then
7011  echo "CONFIG_BSD=y" >> $config_host_mak
7012fi
7013
7014if test "$localtime_r" = "yes" ; then
7015  echo "CONFIG_LOCALTIME_R=y" >> $config_host_mak
7016fi
7017if test "$qom_cast_debug" = "yes" ; then
7018  echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
7019fi
7020if test "$rbd" = "yes" ; then
7021  echo "CONFIG_RBD=m" >> $config_host_mak
7022  echo "RBD_CFLAGS=$rbd_cflags" >> $config_host_mak
7023  echo "RBD_LIBS=$rbd_libs" >> $config_host_mak
7024fi
7025
7026echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
7027if test "$coroutine_pool" = "yes" ; then
7028  echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
7029else
7030  echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
7031fi
7032
7033if test "$debug_stack_usage" = "yes" ; then
7034  echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
7035fi
7036
7037if test "$crypto_afalg" = "yes" ; then
7038  echo "CONFIG_AF_ALG=y" >> $config_host_mak
7039fi
7040
7041if test "$open_by_handle_at" = "yes" ; then
7042  echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
7043fi
7044
7045if test "$linux_magic_h" = "yes" ; then
7046  echo "CONFIG_LINUX_MAGIC_H=y" >> $config_host_mak
7047fi
7048
7049if test "$pragma_diagnostic_available" = "yes" ; then
7050  echo "CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE=y" >> $config_host_mak
7051fi
7052
7053if test "$valgrind_h" = "yes" ; then
7054  echo "CONFIG_VALGRIND_H=y" >> $config_host_mak
7055fi
7056
7057if test "$have_asan_iface_fiber" = "yes" ; then
7058    echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
7059fi
7060
7061if test "$has_environ" = "yes" ; then
7062  echo "CONFIG_HAS_ENVIRON=y" >> $config_host_mak
7063fi
7064
7065if test "$cpuid_h" = "yes" ; then
7066  echo "CONFIG_CPUID_H=y" >> $config_host_mak
7067fi
7068
7069if test "$int128" = "yes" ; then
7070  echo "CONFIG_INT128=y" >> $config_host_mak
7071fi
7072
7073if test "$atomic128" = "yes" ; then
7074  echo "CONFIG_ATOMIC128=y" >> $config_host_mak
7075fi
7076
7077if test "$cmpxchg128" = "yes" ; then
7078  echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
7079fi
7080
7081if test "$atomic64" = "yes" ; then
7082  echo "CONFIG_ATOMIC64=y" >> $config_host_mak
7083fi
7084
7085if test "$vector16" = "yes" ; then
7086  echo "CONFIG_VECTOR16=y" >> $config_host_mak
7087fi
7088
7089if test "$getauxval" = "yes" ; then
7090  echo "CONFIG_GETAUXVAL=y" >> $config_host_mak
7091fi
7092
7093if test "$glusterfs" = "yes" ; then
7094  echo "CONFIG_GLUSTERFS=m" >> $config_host_mak
7095  echo "GLUSTERFS_CFLAGS=$glusterfs_cflags" >> $config_host_mak
7096  echo "GLUSTERFS_LIBS=$glusterfs_libs" >> $config_host_mak
7097fi
7098
7099if test "$glusterfs_xlator_opt" = "yes" ; then
7100  echo "CONFIG_GLUSTERFS_XLATOR_OPT=y" >> $config_host_mak
7101fi
7102
7103if test "$glusterfs_discard" = "yes" ; then
7104  echo "CONFIG_GLUSTERFS_DISCARD=y" >> $config_host_mak
7105fi
7106
7107if test "$glusterfs_fallocate" = "yes" ; then
7108  echo "CONFIG_GLUSTERFS_FALLOCATE=y" >> $config_host_mak
7109fi
7110
7111if test "$glusterfs_zerofill" = "yes" ; then
7112  echo "CONFIG_GLUSTERFS_ZEROFILL=y" >> $config_host_mak
7113fi
7114
7115if test "$glusterfs_ftruncate_has_stat" = "yes" ; then
7116  echo "CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT=y" >> $config_host_mak
7117fi
7118
7119if test "$glusterfs_iocb_has_stat" = "yes" ; then
7120  echo "CONFIG_GLUSTERFS_IOCB_HAS_STAT=y" >> $config_host_mak
7121fi
7122
7123if test "$libssh" = "yes" ; then
7124  echo "CONFIG_LIBSSH=m" >> $config_host_mak
7125  echo "LIBSSH_CFLAGS=$libssh_cflags" >> $config_host_mak
7126  echo "LIBSSH_LIBS=$libssh_libs" >> $config_host_mak
7127fi
7128
7129if test "$live_block_migration" = "yes" ; then
7130  echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
7131fi
7132
7133if test "$tpm" = "yes"; then
7134  echo 'CONFIG_TPM=y' >> $config_host_mak
7135fi
7136
7137echo "TRACE_BACKENDS=$trace_backends" >> $config_host_mak
7138if have_backend "nop"; then
7139  echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
7140fi
7141if have_backend "simple"; then
7142  echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
7143  # Set the appropriate trace file.
7144  trace_file="\"$trace_file-\" FMT_pid"
7145fi
7146if have_backend "log"; then
7147  echo "CONFIG_TRACE_LOG=y" >> $config_host_mak
7148fi
7149if have_backend "ust"; then
7150  echo "CONFIG_TRACE_UST=y" >> $config_host_mak
7151fi
7152if have_backend "dtrace"; then
7153  echo "CONFIG_TRACE_DTRACE=y" >> $config_host_mak
7154  if test "$trace_backend_stap" = "yes" ; then
7155    echo "CONFIG_TRACE_SYSTEMTAP=y" >> $config_host_mak
7156  fi
7157fi
7158if have_backend "ftrace"; then
7159  if test "$linux" = "yes" ; then
7160    echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak
7161  else
7162    feature_not_found "ftrace(trace backend)" "ftrace requires Linux"
7163  fi
7164fi
7165if have_backend "syslog"; then
7166  if test "$posix_syslog" = "yes" ; then
7167    echo "CONFIG_TRACE_SYSLOG=y" >> $config_host_mak
7168  else
7169    feature_not_found "syslog(trace backend)" "syslog not available"
7170  fi
7171fi
7172echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
7173
7174if test "$rdma" = "yes" ; then
7175  echo "CONFIG_RDMA=y" >> $config_host_mak
7176  echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
7177fi
7178
7179if test "$pvrdma" = "yes" ; then
7180  echo "CONFIG_PVRDMA=y" >> $config_host_mak
7181fi
7182
7183if test "$have_rtnetlink" = "yes" ; then
7184  echo "CONFIG_RTNETLINK=y" >> $config_host_mak
7185fi
7186
7187if test "$libxml2" = "yes" ; then
7188  echo "CONFIG_LIBXML2=y" >> $config_host_mak
7189  echo "LIBXML2_CFLAGS=$libxml2_cflags" >> $config_host_mak
7190  echo "LIBXML2_LIBS=$libxml2_libs" >> $config_host_mak
7191fi
7192
7193if test "$replication" = "yes" ; then
7194  echo "CONFIG_REPLICATION=y" >> $config_host_mak
7195fi
7196
7197if test "$have_af_vsock" = "yes" ; then
7198  echo "CONFIG_AF_VSOCK=y" >> $config_host_mak
7199fi
7200
7201if test "$have_sysmacros" = "yes" ; then
7202  echo "CONFIG_SYSMACROS=y" >> $config_host_mak
7203fi
7204
7205if test "$have_static_assert" = "yes" ; then
7206  echo "CONFIG_STATIC_ASSERT=y" >> $config_host_mak
7207fi
7208
7209if test "$have_utmpx" = "yes" ; then
7210  echo "HAVE_UTMPX=y" >> $config_host_mak
7211fi
7212if test "$have_getrandom" = "yes" ; then
7213  echo "CONFIG_GETRANDOM=y" >> $config_host_mak
7214fi
7215if test "$ivshmem" = "yes" ; then
7216  echo "CONFIG_IVSHMEM=y" >> $config_host_mak
7217fi
7218if test "$capstone" != "no" ; then
7219  echo "CONFIG_CAPSTONE=y" >> $config_host_mak
7220fi
7221if test "$debug_mutex" = "yes" ; then
7222  echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
7223fi
7224
7225# Hold two types of flag:
7226#   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
7227#                                     a thread we have a handle to
7228#   CONFIG_PTHREAD_SETNAME_NP_W_TID - A way of doing it on a particular
7229#                                     platform
7230if test "$pthread_setname_np_w_tid" = "yes" ; then
7231  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
7232  echo "CONFIG_PTHREAD_SETNAME_NP_W_TID=y" >> $config_host_mak
7233elif test "$pthread_setname_np_wo_tid" = "yes" ; then
7234  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
7235  echo "CONFIG_PTHREAD_SETNAME_NP_WO_TID=y" >> $config_host_mak
7236fi
7237
7238if test "$vxhs" = "yes" ; then
7239  echo "CONFIG_VXHS=y" >> $config_host_mak
7240  echo "VXHS_LIBS=$vxhs_libs" >> $config_host_mak
7241fi
7242
7243if test "$libpmem" = "yes" ; then
7244  echo "CONFIG_LIBPMEM=y" >> $config_host_mak
7245fi
7246
7247if test "$bochs" = "yes" ; then
7248  echo "CONFIG_BOCHS=y" >> $config_host_mak
7249fi
7250if test "$cloop" = "yes" ; then
7251  echo "CONFIG_CLOOP=y" >> $config_host_mak
7252fi
7253if test "$dmg" = "yes" ; then
7254  echo "CONFIG_DMG=y" >> $config_host_mak
7255fi
7256if test "$qcow1" = "yes" ; then
7257  echo "CONFIG_QCOW1=y" >> $config_host_mak
7258fi
7259if test "$vdi" = "yes" ; then
7260  echo "CONFIG_VDI=y" >> $config_host_mak
7261fi
7262if test "$vvfat" = "yes" ; then
7263  echo "CONFIG_VVFAT=y" >> $config_host_mak
7264fi
7265if test "$qed" = "yes" ; then
7266  echo "CONFIG_QED=y" >> $config_host_mak
7267fi
7268if test "$parallels" = "yes" ; then
7269  echo "CONFIG_PARALLELS=y" >> $config_host_mak
7270fi
7271if test "$sheepdog" = "yes" ; then
7272  echo "CONFIG_SHEEPDOG=y" >> $config_host_mak
7273fi
7274
7275if test "$tcg_interpreter" = "yes"; then
7276  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/tci $QEMU_INCLUDES"
7277elif test "$ARCH" = "sparc64" ; then
7278  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/sparc $QEMU_INCLUDES"
7279elif test "$ARCH" = "s390x" ; then
7280  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/s390 $QEMU_INCLUDES"
7281elif test "$ARCH" = "x86_64" || test "$ARCH" = "x32" ; then
7282  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/i386 $QEMU_INCLUDES"
7283elif test "$ARCH" = "ppc64" ; then
7284  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/ppc $QEMU_INCLUDES"
7285elif test "$ARCH" = "riscv32" || test "$ARCH" = "riscv64" ; then
7286  QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/riscv $QEMU_INCLUDES"
7287else
7288  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/\$(ARCH) $QEMU_INCLUDES"
7289fi
7290QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg $QEMU_INCLUDES"
7291
7292echo "TOOLS=$tools" >> $config_host_mak
7293echo "ROMS=$roms" >> $config_host_mak
7294echo "MAKE=$make" >> $config_host_mak
7295echo "INSTALL=$install" >> $config_host_mak
7296echo "INSTALL_DIR=$install -d -m 0755" >> $config_host_mak
7297echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
7298echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
7299echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
7300echo "PYTHON=$python" >> $config_host_mak
7301echo "PYTHON2=$python2" >> $config_host_mak
7302echo "CC=$cc" >> $config_host_mak
7303if $iasl -h > /dev/null 2>&1; then
7304  echo "IASL=$iasl" >> $config_host_mak
7305fi
7306echo "HOST_CC=$host_cc" >> $config_host_mak
7307echo "CXX=$cxx" >> $config_host_mak
7308echo "OBJCC=$objcc" >> $config_host_mak
7309echo "AR=$ar" >> $config_host_mak
7310echo "ARFLAGS=$ARFLAGS" >> $config_host_mak
7311echo "AS=$as" >> $config_host_mak
7312echo "CCAS=$ccas" >> $config_host_mak
7313echo "CPP=$cpp" >> $config_host_mak
7314echo "OBJCOPY=$objcopy" >> $config_host_mak
7315echo "LD=$ld" >> $config_host_mak
7316echo "RANLIB=$ranlib" >> $config_host_mak
7317echo "NM=$nm" >> $config_host_mak
7318echo "PKG_CONFIG=$pkg_config_exe" >> $config_host_mak
7319echo "WINDRES=$windres" >> $config_host_mak
7320echo "CFLAGS=$CFLAGS" >> $config_host_mak
7321echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
7322echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
7323echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
7324echo "QEMU_INCLUDES=$QEMU_INCLUDES" >> $config_host_mak
7325if test "$sparse" = "yes" ; then
7326  echo "CC           := REAL_CC=\"\$(CC)\" cgcc"       >> $config_host_mak
7327  echo "CPP          := REAL_CC=\"\$(CPP)\" cgcc"      >> $config_host_mak
7328  echo "CXX          := REAL_CC=\"\$(CXX)\" cgcc"      >> $config_host_mak
7329  echo "HOST_CC      := REAL_CC=\"\$(HOST_CC)\" cgcc"  >> $config_host_mak
7330  echo "QEMU_CFLAGS  += -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-non-pointer-null" >> $config_host_mak
7331fi
7332echo "LDFLAGS=$LDFLAGS" >> $config_host_mak
7333echo "LDFLAGS_NOPIE=$LDFLAGS_NOPIE" >> $config_host_mak
7334echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
7335echo "LD_REL_FLAGS=$LD_REL_FLAGS" >> $config_host_mak
7336echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
7337echo "LIBS+=$LIBS" >> $config_host_mak
7338echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak
7339echo "PTHREAD_LIB=$PTHREAD_LIB" >> $config_host_mak
7340echo "EXESUF=$EXESUF" >> $config_host_mak
7341echo "DSOSUF=$DSOSUF" >> $config_host_mak
7342echo "LDFLAGS_SHARED=$LDFLAGS_SHARED" >> $config_host_mak
7343echo "LIBS_QGA+=$libs_qga" >> $config_host_mak
7344echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak
7345echo "TASN1_CFLAGS=$tasn1_cflags" >> $config_host_mak
7346echo "POD2MAN=$POD2MAN" >> $config_host_mak
7347if test "$gcov" = "yes" ; then
7348  echo "CONFIG_GCOV=y" >> $config_host_mak
7349  echo "GCOV=$gcov_tool" >> $config_host_mak
7350fi
7351
7352if test "$libudev" != "no"; then
7353    echo "CONFIG_LIBUDEV=y" >> $config_host_mak
7354    echo "LIBUDEV_LIBS=$libudev_libs" >> $config_host_mak
7355fi
7356
7357# use included Linux headers
7358if test "$linux" = "yes" ; then
7359  mkdir -p linux-headers
7360  case "$cpu" in
7361  i386|x86_64|x32)
7362    linux_arch=x86
7363    ;;
7364  ppc|ppc64|ppc64le)
7365    linux_arch=powerpc
7366    ;;
7367  s390x)
7368    linux_arch=s390
7369    ;;
7370  aarch64)
7371    linux_arch=arm64
7372    ;;
7373  mips64)
7374    linux_arch=mips
7375    ;;
7376  *)
7377    # For most CPUs the kernel architecture name and QEMU CPU name match.
7378    linux_arch="$cpu"
7379    ;;
7380  esac
7381    # For non-KVM architectures we will not have asm headers
7382    if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
7383      symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
7384    fi
7385fi
7386
7387for target in $target_list; do
7388target_dir="$target"
7389config_target_mak=$target_dir/config-target.mak
7390target_name=$(echo $target | cut -d '-' -f 1)
7391target_aligned_only="no"
7392case "$target_name" in
7393  alpha|hppa|mips64el|mips64|mipsel|mips|mipsn32|mipsn32el|sh4|sh4eb|sparc|sparc64|sparc32plus|xtensa|xtensaeb)
7394  target_aligned_only="yes"
7395  ;;
7396esac
7397target_bigendian="no"
7398case "$target_name" in
7399  armeb|aarch64_be|hppa|lm32|m68k|microblaze|mips|mipsn32|mips64|moxie|or1k|ppc|ppc64|ppc64abi32|s390x|sh4eb|sparc|sparc64|sparc32plus|xtensaeb)
7400  target_bigendian="yes"
7401  ;;
7402esac
7403target_softmmu="no"
7404target_user_only="no"
7405target_linux_user="no"
7406target_bsd_user="no"
7407case "$target" in
7408  ${target_name}-softmmu)
7409    target_softmmu="yes"
7410    ;;
7411  ${target_name}-linux-user)
7412    target_user_only="yes"
7413    target_linux_user="yes"
7414    ;;
7415  ${target_name}-bsd-user)
7416    target_user_only="yes"
7417    target_bsd_user="yes"
7418    ;;
7419  *)
7420    error_exit "Target '$target' not recognised"
7421    exit 1
7422    ;;
7423esac
7424
7425mkdir -p $target_dir
7426echo "# Automatically generated by configure - do not modify" > $config_target_mak
7427
7428bflt="no"
7429mttcg="no"
7430interp_prefix1=$(echo "$interp_prefix" | sed "s/%M/$target_name/g")
7431gdb_xml_files=""
7432
7433TARGET_ARCH="$target_name"
7434TARGET_BASE_ARCH=""
7435TARGET_ABI_DIR=""
7436
7437case "$target_name" in
7438  i386)
7439    mttcg="yes"
7440	gdb_xml_files="i386-32bit.xml"
7441  ;;
7442  x86_64)
7443    TARGET_BASE_ARCH=i386
7444    mttcg="yes"
7445	gdb_xml_files="i386-64bit.xml"
7446  ;;
7447  alpha)
7448    mttcg="yes"
7449  ;;
7450  arm|armeb)
7451    TARGET_ARCH=arm
7452    bflt="yes"
7453    mttcg="yes"
7454    gdb_xml_files="arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"
7455  ;;
7456  aarch64|aarch64_be)
7457    TARGET_ARCH=aarch64
7458    TARGET_BASE_ARCH=arm
7459    bflt="yes"
7460    mttcg="yes"
7461    gdb_xml_files="aarch64-core.xml aarch64-fpu.xml arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"
7462  ;;
7463  cris)
7464  ;;
7465  hppa)
7466    mttcg="yes"
7467  ;;
7468  lm32)
7469  ;;
7470  m68k)
7471    bflt="yes"
7472    gdb_xml_files="cf-core.xml cf-fp.xml m68k-fp.xml"
7473  ;;
7474  microblaze|microblazeel)
7475    TARGET_ARCH=microblaze
7476    bflt="yes"
7477    echo "TARGET_ABI32=y" >> $config_target_mak
7478  ;;
7479  mips|mipsel)
7480    mttcg="yes"
7481    TARGET_ARCH=mips
7482    echo "TARGET_ABI_MIPSO32=y" >> $config_target_mak
7483  ;;
7484  mipsn32|mipsn32el)
7485    mttcg="yes"
7486    TARGET_ARCH=mips64
7487    TARGET_BASE_ARCH=mips
7488    echo "TARGET_ABI_MIPSN32=y" >> $config_target_mak
7489    echo "TARGET_ABI32=y" >> $config_target_mak
7490  ;;
7491  mips64|mips64el)
7492    mttcg="yes"
7493    TARGET_ARCH=mips64
7494    TARGET_BASE_ARCH=mips
7495    echo "TARGET_ABI_MIPSN64=y" >> $config_target_mak
7496  ;;
7497  moxie)
7498  ;;
7499  nios2)
7500  ;;
7501  or1k)
7502    TARGET_ARCH=openrisc
7503    TARGET_BASE_ARCH=openrisc
7504  ;;
7505  ppc)
7506    gdb_xml_files="power-core.xml power-fpu.xml power-altivec.xml power-spe.xml"
7507  ;;
7508  ppc64)
7509    TARGET_BASE_ARCH=ppc
7510    TARGET_ABI_DIR=ppc
7511    mttcg=yes
7512    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
7513  ;;
7514  ppc64le)
7515    TARGET_ARCH=ppc64
7516    TARGET_BASE_ARCH=ppc
7517    TARGET_ABI_DIR=ppc
7518    mttcg=yes
7519    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
7520  ;;
7521  ppc64abi32)
7522    TARGET_ARCH=ppc64
7523    TARGET_BASE_ARCH=ppc
7524    TARGET_ABI_DIR=ppc
7525    echo "TARGET_ABI32=y" >> $config_target_mak
7526    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
7527  ;;
7528  riscv32)
7529    TARGET_BASE_ARCH=riscv
7530    TARGET_ABI_DIR=riscv
7531    mttcg=yes
7532    gdb_xml_files="riscv-32bit-cpu.xml riscv-32bit-fpu.xml riscv-32bit-csr.xml"
7533  ;;
7534  riscv64)
7535    TARGET_BASE_ARCH=riscv
7536    TARGET_ABI_DIR=riscv
7537    mttcg=yes
7538    gdb_xml_files="riscv-64bit-cpu.xml riscv-64bit-fpu.xml riscv-64bit-csr.xml"
7539  ;;
7540  sh4|sh4eb)
7541    TARGET_ARCH=sh4
7542    bflt="yes"
7543  ;;
7544  sparc)
7545  ;;
7546  sparc64)
7547    TARGET_BASE_ARCH=sparc
7548  ;;
7549  sparc32plus)
7550    TARGET_ARCH=sparc64
7551    TARGET_BASE_ARCH=sparc
7552    TARGET_ABI_DIR=sparc
7553    echo "TARGET_ABI32=y" >> $config_target_mak
7554  ;;
7555  s390x)
7556    mttcg=yes
7557    gdb_xml_files="s390x-core64.xml s390-acr.xml s390-fpr.xml s390-vx.xml s390-cr.xml s390-virt.xml s390-gs.xml"
7558  ;;
7559  tilegx)
7560  ;;
7561  tricore)
7562  ;;
7563  unicore32)
7564  ;;
7565  xtensa|xtensaeb)
7566    TARGET_ARCH=xtensa
7567    bflt="yes"
7568    mttcg="yes"
7569  ;;
7570  *)
7571    error_exit "Unsupported target CPU"
7572  ;;
7573esac
7574# TARGET_BASE_ARCH needs to be defined after TARGET_ARCH
7575if [ "$TARGET_BASE_ARCH" = "" ]; then
7576  TARGET_BASE_ARCH=$TARGET_ARCH
7577fi
7578
7579symlink "$source_path/Makefile.target" "$target_dir/Makefile"
7580
7581upper() {
7582    echo "$@"| LC_ALL=C tr '[a-z]' '[A-Z]'
7583}
7584
7585target_arch_name="$(upper $TARGET_ARCH)"
7586echo "TARGET_$target_arch_name=y" >> $config_target_mak
7587echo "TARGET_NAME=$target_name" >> $config_target_mak
7588echo "TARGET_BASE_ARCH=$TARGET_BASE_ARCH" >> $config_target_mak
7589if [ "$TARGET_ABI_DIR" = "" ]; then
7590  TARGET_ABI_DIR=$TARGET_ARCH
7591fi
7592echo "TARGET_ABI_DIR=$TARGET_ABI_DIR" >> $config_target_mak
7593if [ "$HOST_VARIANT_DIR" != "" ]; then
7594    echo "HOST_VARIANT_DIR=$HOST_VARIANT_DIR" >> $config_target_mak
7595fi
7596
7597if supported_xen_target $target; then
7598    echo "CONFIG_XEN=y" >> $config_target_mak
7599    echo "$target/config-devices.mak: CONFIG_XEN=y" >> $config_host_mak
7600    if test "$xen_pci_passthrough" = yes; then
7601        echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak"
7602    fi
7603else
7604    echo "$target/config-devices.mak: CONFIG_XEN=n" >> $config_host_mak
7605fi
7606if supported_kvm_target $target; then
7607    echo "CONFIG_KVM=y" >> $config_target_mak
7608    echo "$target/config-devices.mak: CONFIG_KVM=y" >> $config_host_mak
7609else
7610    echo "$target/config-devices.mak: CONFIG_KVM=n" >> $config_host_mak
7611fi
7612if supported_hax_target $target; then
7613    echo "CONFIG_HAX=y" >> $config_target_mak
7614fi
7615if supported_hvf_target $target; then
7616    echo "CONFIG_HVF=y" >> $config_target_mak
7617fi
7618if supported_whpx_target $target; then
7619    echo "CONFIG_WHPX=y" >> $config_target_mak
7620fi
7621if test "$target_aligned_only" = "yes" ; then
7622  echo "TARGET_ALIGNED_ONLY=y" >> $config_target_mak
7623fi
7624if test "$target_bigendian" = "yes" ; then
7625  echo "TARGET_WORDS_BIGENDIAN=y" >> $config_target_mak
7626fi
7627if test "$target_softmmu" = "yes" ; then
7628  echo "CONFIG_SOFTMMU=y" >> $config_target_mak
7629  if test "$mttcg" = "yes" ; then
7630    echo "TARGET_SUPPORTS_MTTCG=y" >> $config_target_mak
7631  fi
7632fi
7633if test "$target_user_only" = "yes" ; then
7634  echo "CONFIG_USER_ONLY=y" >> $config_target_mak
7635  echo "CONFIG_QEMU_INTERP_PREFIX=\"$interp_prefix1\"" >> $config_target_mak
7636fi
7637if test "$target_linux_user" = "yes" ; then
7638  echo "CONFIG_LINUX_USER=y" >> $config_target_mak
7639fi
7640list=""
7641if test ! -z "$gdb_xml_files" ; then
7642  for x in $gdb_xml_files; do
7643    list="$list $source_path/gdb-xml/$x"
7644  done
7645  echo "TARGET_XML_FILES=$list" >> $config_target_mak
7646fi
7647
7648if test "$target_user_only" = "yes" && test "$bflt" = "yes"; then
7649  echo "TARGET_HAS_BFLT=y" >> $config_target_mak
7650fi
7651if test "$target_bsd_user" = "yes" ; then
7652  echo "CONFIG_BSD_USER=y" >> $config_target_mak
7653fi
7654
7655
7656# generate QEMU_CFLAGS/LDFLAGS for targets
7657
7658cflags=""
7659ldflags=""
7660
7661disas_config() {
7662  echo "CONFIG_${1}_DIS=y" >> $config_target_mak
7663  echo "CONFIG_${1}_DIS=y" >> config-all-disas.mak
7664}
7665
7666for i in $ARCH $TARGET_BASE_ARCH ; do
7667  case "$i" in
7668  alpha)
7669    disas_config "ALPHA"
7670  ;;
7671  aarch64)
7672    if test -n "${cxx}"; then
7673      disas_config "ARM_A64"
7674    fi
7675  ;;
7676  arm)
7677    disas_config "ARM"
7678    if test -n "${cxx}"; then
7679      disas_config "ARM_A64"
7680    fi
7681  ;;
7682  cris)
7683    disas_config "CRIS"
7684  ;;
7685  hppa)
7686    disas_config "HPPA"
7687  ;;
7688  i386|x86_64|x32)
7689    disas_config "I386"
7690  ;;
7691  lm32)
7692    disas_config "LM32"
7693  ;;
7694  m68k)
7695    disas_config "M68K"
7696  ;;
7697  microblaze*)
7698    disas_config "MICROBLAZE"
7699  ;;
7700  mips*)
7701    disas_config "MIPS"
7702    if test -n "${cxx}"; then
7703      disas_config "NANOMIPS"
7704    fi
7705  ;;
7706  moxie*)
7707    disas_config "MOXIE"
7708  ;;
7709  nios2)
7710    disas_config "NIOS2"
7711  ;;
7712  or1k)
7713    disas_config "OPENRISC"
7714  ;;
7715  ppc*)
7716    disas_config "PPC"
7717  ;;
7718  riscv*)
7719    disas_config "RISCV"
7720  ;;
7721  s390*)
7722    disas_config "S390"
7723  ;;
7724  sh4)
7725    disas_config "SH4"
7726  ;;
7727  sparc*)
7728    disas_config "SPARC"
7729  ;;
7730  xtensa*)
7731    disas_config "XTENSA"
7732  ;;
7733  esac
7734done
7735if test "$tcg_interpreter" = "yes" ; then
7736  disas_config "TCI"
7737fi
7738
7739case "$ARCH" in
7740alpha)
7741  # Ensure there's only a single GP
7742  cflags="-msmall-data $cflags"
7743;;
7744esac
7745
7746if test "$gprof" = "yes" ; then
7747  echo "TARGET_GPROF=y" >> $config_target_mak
7748  if test "$target_linux_user" = "yes" ; then
7749    cflags="-p $cflags"
7750    ldflags="-p $ldflags"
7751  fi
7752  if test "$target_softmmu" = "yes" ; then
7753    ldflags="-p $ldflags"
7754    echo "GPROF_CFLAGS=-p" >> $config_target_mak
7755  fi
7756fi
7757
7758if test "$target_linux_user" = "yes" || test "$target_bsd_user" = "yes" ; then
7759  ldflags="$ldflags $textseg_ldflags"
7760fi
7761
7762# Newer kernels on s390 check for an S390_PGSTE program header and
7763# enable the pgste page table extensions in that case. This makes
7764# the vm.allocate_pgste sysctl unnecessary. We enable this program
7765# header if
7766#  - we build on s390x
7767#  - we build the system emulation for s390x (qemu-system-s390x)
7768#  - KVM is enabled
7769#  - the linker supports --s390-pgste
7770if test "$TARGET_ARCH" = "s390x" && test "$target_softmmu" = "yes" && \
7771        test "$ARCH" = "s390x" && test "$kvm" = "yes"; then
7772    if ld_has --s390-pgste ; then
7773        ldflags="-Wl,--s390-pgste $ldflags"
7774    fi
7775fi
7776
7777echo "LDFLAGS+=$ldflags" >> $config_target_mak
7778echo "QEMU_CFLAGS+=$cflags" >> $config_target_mak
7779
7780done # for target in $targets
7781
7782echo "PIXMAN_CFLAGS=$pixman_cflags" >> $config_host_mak
7783echo "PIXMAN_LIBS=$pixman_libs" >> $config_host_mak
7784
7785if [ "$fdt" = "git" ]; then
7786  echo "config-host.h: dtc/all" >> $config_host_mak
7787fi
7788if [ "$capstone" = "git" -o "$capstone" = "internal" ]; then
7789  echo "config-host.h: capstone/all" >> $config_host_mak
7790fi
7791if test -n "$LIBCAPSTONE"; then
7792  echo "LIBCAPSTONE=$LIBCAPSTONE" >> $config_host_mak
7793fi
7794
7795if test "$numa" = "yes"; then
7796  echo "CONFIG_NUMA=y" >> $config_host_mak
7797fi
7798
7799if test "$ccache_cpp2" = "yes"; then
7800  echo "export CCACHE_CPP2=y" >> $config_host_mak
7801fi
7802
7803# If we're using a separate build tree, set it up now.
7804# DIRS are directories which we simply mkdir in the build tree;
7805# LINKS are things to symlink back into the source tree
7806# (these can be both files and directories).
7807# Caution: do not add files or directories here using wildcards. This
7808# will result in problems later if a new file matching the wildcard is
7809# added to the source tree -- nothing will cause configure to be rerun
7810# so the build tree will be missing the link back to the new file, and
7811# tests might fail. Prefer to keep the relevant files in their own
7812# directory and symlink the directory instead.
7813DIRS="tests tests/tcg tests/tcg/lm32 tests/libqos tests/qapi-schema tests/qemu-iotests tests/vm"
7814DIRS="$DIRS tests/fp tests/qgraph"
7815DIRS="$DIRS docs docs/interop fsdev scsi"
7816DIRS="$DIRS pc-bios/optionrom pc-bios/s390-ccw"
7817DIRS="$DIRS roms/seabios roms/vgabios"
7818LINKS="Makefile"
7819LINKS="$LINKS tests/tcg/lm32/Makefile po/Makefile"
7820LINKS="$LINKS tests/tcg/Makefile.target tests/fp/Makefile"
7821LINKS="$LINKS pc-bios/optionrom/Makefile pc-bios/keymaps"
7822LINKS="$LINKS pc-bios/s390-ccw/Makefile"
7823LINKS="$LINKS roms/seabios/Makefile roms/vgabios/Makefile"
7824LINKS="$LINKS pc-bios/qemu-icon.bmp"
7825LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
7826LINKS="$LINKS tests/acceptance tests/data"
7827LINKS="$LINKS tests/qemu-iotests/check"
7828LINKS="$LINKS python"
7829for bios_file in \
7830    $source_path/pc-bios/*.bin \
7831    $source_path/pc-bios/*.lid \
7832    $source_path/pc-bios/*.rom \
7833    $source_path/pc-bios/*.dtb \
7834    $source_path/pc-bios/*.img \
7835    $source_path/pc-bios/openbios-* \
7836    $source_path/pc-bios/u-boot.* \
7837    $source_path/pc-bios/edk2-*.fd.bz2 \
7838    $source_path/pc-bios/palcode-*
7839do
7840    LINKS="$LINKS pc-bios/$(basename $bios_file)"
7841done
7842mkdir -p $DIRS
7843for f in $LINKS ; do
7844    if [ -e "$source_path/$f" ] && [ "$pwd_is_source_path" != "y" ]; then
7845        symlink "$source_path/$f" "$f"
7846    fi
7847done
7848
7849(for i in $cross_cc_vars; do
7850  export $i
7851done
7852export target_list source_path
7853$source_path/tests/tcg/configure.sh)
7854
7855# temporary config to build submodules
7856for rom in seabios vgabios ; do
7857    config_mak=roms/$rom/config.mak
7858    echo "# Automatically generated by configure - do not modify" > $config_mak
7859    echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
7860    echo "AS=$as" >> $config_mak
7861    echo "CCAS=$ccas" >> $config_mak
7862    echo "CC=$cc" >> $config_mak
7863    echo "BCC=bcc" >> $config_mak
7864    echo "CPP=$cpp" >> $config_mak
7865    echo "OBJCOPY=objcopy" >> $config_mak
7866    echo "IASL=$iasl" >> $config_mak
7867    echo "LD=$ld" >> $config_mak
7868    echo "RANLIB=$ranlib" >> $config_mak
7869done
7870
7871# set up qemu-iotests in this build directory
7872iotests_common_env="tests/qemu-iotests/common.env"
7873
7874echo "# Automatically generated by configure - do not modify" > "$iotests_common_env"
7875echo >> "$iotests_common_env"
7876echo "export PYTHON='$python'" >> "$iotests_common_env"
7877
7878# Save the configure command line for later reuse.
7879cat <<EOD >config.status
7880#!/bin/sh
7881# Generated by configure.
7882# Run this file to recreate the current configuration.
7883# Compiler output produced by configure, useful for debugging
7884# configure, is in config.log if it exists.
7885EOD
7886
7887preserve_env() {
7888    envname=$1
7889
7890    eval envval=\$$envname
7891
7892    if test -n "$envval"
7893    then
7894	echo "$envname='$envval'" >> config.status
7895	echo "export $envname" >> config.status
7896    else
7897	echo "unset $envname" >> config.status
7898    fi
7899}
7900
7901# Preserve various env variables that influence what
7902# features/build target configure will detect
7903preserve_env AR
7904preserve_env AS
7905preserve_env CC
7906preserve_env CPP
7907preserve_env CXX
7908preserve_env INSTALL
7909preserve_env LD
7910preserve_env LD_LIBRARY_PATH
7911preserve_env LIBTOOL
7912preserve_env MAKE
7913preserve_env NM
7914preserve_env OBJCOPY
7915preserve_env PATH
7916preserve_env PKG_CONFIG
7917preserve_env PKG_CONFIG_LIBDIR
7918preserve_env PKG_CONFIG_PATH
7919preserve_env PYTHON
7920preserve_env SDL2_CONFIG
7921preserve_env SMBD
7922preserve_env STRIP
7923preserve_env WINDRES
7924
7925printf "exec" >>config.status
7926printf " '%s'" "$0" "$@" >>config.status
7927echo ' "$@"' >>config.status
7928chmod +x config.status
7929
7930rm -r "$TMPDIR1"
7931