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