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