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