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