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