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