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