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