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