xref: /openbmc/qemu/configure (revision e6a41a04)
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
92quote_sh() {
93    printf "%s" "$1" | sed "s,','\\\\'',g; s,.*,'&',"
94}
95
96print_error() {
97    (echo
98    echo "ERROR: $1"
99    while test -n "$2"; do
100        echo "       $2"
101        shift
102    done
103    echo) >&2
104}
105
106error_exit() {
107    print_error "$@"
108    exit 1
109}
110
111do_compiler() {
112    # Run the compiler, capturing its output to the log. First argument
113    # is compiler binary to execute.
114    local compiler="$1"
115    shift
116    if test -n "$BASH_VERSION"; then eval '
117        echo >>config.log "
118funcs: ${FUNCNAME[*]}
119lines: ${BASH_LINENO[*]}"
120    '; fi
121    echo $compiler "$@" >> config.log
122    $compiler "$@" >> config.log 2>&1 || return $?
123    # Test passed. If this is an --enable-werror build, rerun
124    # the test with -Werror and bail out if it fails. This
125    # makes warning-generating-errors in configure test code
126    # obvious to developers.
127    if test "$werror" != "yes"; then
128        return 0
129    fi
130    # Don't bother rerunning the compile if we were already using -Werror
131    case "$*" in
132        *-Werror*)
133           return 0
134        ;;
135    esac
136    echo $compiler -Werror "$@" >> config.log
137    $compiler -Werror "$@" >> config.log 2>&1 && return $?
138    error_exit "configure test passed without -Werror but failed with -Werror." \
139        "This is probably a bug in the configure script. The failing command" \
140        "will be at the bottom of config.log." \
141        "You can run configure with --disable-werror to bypass this check."
142}
143
144do_cc() {
145    do_compiler "$cc" "$@"
146}
147
148do_cxx() {
149    do_compiler "$cxx" "$@"
150}
151
152# Append $2 to the variable named $1, with space separation
153add_to() {
154    eval $1=\${$1:+\"\$$1 \"}\$2
155}
156
157update_cxxflags() {
158    # Set QEMU_CXXFLAGS from QEMU_CFLAGS by filtering out those
159    # options which some versions of GCC's C++ compiler complain about
160    # because they only make sense for C programs.
161    QEMU_CXXFLAGS="$QEMU_CXXFLAGS -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"
162    CONFIGURE_CXXFLAGS=$(echo "$CONFIGURE_CFLAGS" | sed s/-std=gnu99/-std=gnu++11/)
163    for arg in $QEMU_CFLAGS; do
164        case $arg in
165            -Wstrict-prototypes|-Wmissing-prototypes|-Wnested-externs|\
166            -Wold-style-declaration|-Wold-style-definition|-Wredundant-decls)
167                ;;
168            *)
169                QEMU_CXXFLAGS=${QEMU_CXXFLAGS:+$QEMU_CXXFLAGS }$arg
170                ;;
171        esac
172    done
173}
174
175compile_object() {
176  local_cflags="$1"
177  do_cc $CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
178}
179
180compile_prog() {
181  local_cflags="$1"
182  local_ldflags="$2"
183  do_cc $CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC \
184      $LDFLAGS $CONFIGURE_LDFLAGS $QEMU_LDFLAGS $local_ldflags
185}
186
187# symbolically link $1 to $2.  Portable version of "ln -sf".
188symlink() {
189  rm -rf "$2"
190  mkdir -p "$(dirname "$2")"
191  ln -s "$1" "$2"
192}
193
194# check whether a command is available to this shell (may be either an
195# executable or a builtin)
196has() {
197    type "$1" >/dev/null 2>&1
198}
199
200version_ge () {
201    local_ver1=$(expr "$1" : '\([0-9.]*\)' | tr . ' ')
202    local_ver2=$(echo "$2" | tr . ' ')
203    while true; do
204        set x $local_ver1
205        local_first=${2-0}
206        # 'shift 2' if $2 is set, or 'shift' if $2 is not set
207        shift ${2:+2}
208        local_ver1=$*
209        set x $local_ver2
210        # the second argument finished, the first must be greater or equal
211        test $# = 1 && return 0
212        test $local_first -lt $2 && return 1
213        test $local_first -gt $2 && return 0
214        shift ${2:+2}
215        local_ver2=$*
216    done
217}
218
219have_backend () {
220    echo "$trace_backends" | grep "$1" >/dev/null
221}
222
223glob() {
224    eval test -z '"${1#'"$2"'}"'
225}
226
227ld_has() {
228    $ld --help 2>/dev/null | grep ".$1" >/dev/null 2>&1
229}
230
231if printf %s\\n "$source_path" "$PWD" | grep -q "[[:space:]:]";
232then
233  error_exit "main directory cannot contain spaces nor colons"
234fi
235
236# default parameters
237cpu=""
238iasl="iasl"
239interp_prefix="/usr/gnemul/qemu-%M"
240static="no"
241cross_compile="no"
242cross_prefix=""
243audio_drv_list=""
244block_drv_rw_whitelist=""
245block_drv_ro_whitelist=""
246host_cc="cc"
247audio_win_int=""
248libs_qga=""
249debug_info="yes"
250lto="false"
251stack_protector=""
252safe_stack=""
253use_containers="yes"
254gdb_bin=$(command -v "gdb-multiarch" || command -v "gdb")
255
256if test -e "$source_path/.git"
257then
258    git_submodules_action="update"
259    git_submodules="ui/keycodemapdb"
260    git_submodules="$git_submodules tests/fp/berkeley-testfloat-3"
261    git_submodules="$git_submodules tests/fp/berkeley-softfloat-3"
262else
263    git_submodules_action="ignore"
264    git_submodules=""
265
266    if ! test -f "$source_path/ui/keycodemapdb/README"
267    then
268        echo
269        echo "ERROR: missing file $source_path/ui/keycodemapdb/README"
270        echo
271        echo "This is not a GIT checkout but module content appears to"
272        echo "be missing. Do not use 'git archive' or GitHub download links"
273        echo "to acquire QEMU source archives. Non-GIT builds are only"
274        echo "supported with source archives linked from:"
275        echo
276        echo "  https://www.qemu.org/download/#source"
277        echo
278        echo "Developers working with GIT can use scripts/archive-source.sh"
279        echo "if they need to create valid source archives."
280        echo
281        exit 1
282    fi
283fi
284git="git"
285
286# Don't accept a target_list environment variable.
287unset target_list
288unset target_list_exclude
289
290# Default value for a variable defining feature "foo".
291#  * foo="no"  feature will only be used if --enable-foo arg is given
292#  * foo=""    feature will be searched for, and if found, will be used
293#              unless --disable-foo is given
294#  * foo="yes" this value will only be set by --enable-foo flag.
295#              feature will searched for,
296#              if not found, configure exits with error
297#
298# Always add --enable-foo and --disable-foo command line args.
299# Distributions want to ensure that several features are compiled in, and it
300# is impossible without a --enable-foo that exits if a feature is not found.
301
302default_feature=""
303# parse CC options second
304for opt do
305  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
306  case "$opt" in
307      --without-default-features)
308          default_feature="no"
309  ;;
310  esac
311done
312
313brlapi="auto"
314curl="auto"
315iconv="auto"
316curses="auto"
317docs="auto"
318fdt="auto"
319netmap="no"
320sdl="auto"
321sdl_image="auto"
322coreaudio="auto"
323virtiofsd="auto"
324virtfs="auto"
325libudev="auto"
326mpath="auto"
327vnc="enabled"
328sparse="auto"
329vde="$default_feature"
330vnc_sasl="auto"
331vnc_jpeg="auto"
332vnc_png="auto"
333xkbcommon="auto"
334xen="$default_feature"
335xen_ctrl_version="$default_feature"
336xen_pci_passthrough="auto"
337linux_aio="$default_feature"
338linux_io_uring="$default_feature"
339cap_ng="auto"
340attr="auto"
341xfs="$default_feature"
342tcg="enabled"
343membarrier="$default_feature"
344vhost_net="$default_feature"
345vhost_crypto="$default_feature"
346vhost_scsi="$default_feature"
347vhost_vsock="$default_feature"
348vhost_user="no"
349vhost_user_blk_server="auto"
350vhost_user_fs="$default_feature"
351kvm="auto"
352hax="auto"
353hvf="auto"
354whpx="auto"
355rdma="$default_feature"
356pvrdma="$default_feature"
357gprof="no"
358debug_tcg="no"
359debug="no"
360sanitizers="no"
361tsan="no"
362fortify_source="$default_feature"
363strip_opt="yes"
364tcg_interpreter="false"
365bigendian="no"
366mingw32="no"
367gcov="no"
368EXESUF="$default_feature"
369HOST_DSOSUF=".so"
370modules="no"
371module_upgrades="no"
372prefix="/usr/local"
373qemu_suffix="qemu"
374slirp="auto"
375oss_lib=""
376bsd="no"
377linux="no"
378solaris="no"
379profiler="no"
380cocoa="auto"
381softmmu="yes"
382linux_user="no"
383bsd_user="no"
384blobs="true"
385pkgversion=""
386pie=""
387qom_cast_debug="yes"
388trace_backends="log"
389trace_file="trace"
390spice="$default_feature"
391rbd="auto"
392smartcard="$default_feature"
393u2f="auto"
394libusb="$default_feature"
395usb_redir="$default_feature"
396opengl="$default_feature"
397opengl_dmabuf="no"
398cpuid_h="no"
399avx2_opt="$default_feature"
400capstone="auto"
401lzo="auto"
402snappy="auto"
403bzip2="auto"
404lzfse="auto"
405zstd="auto"
406guest_agent="$default_feature"
407guest_agent_with_vss="no"
408guest_agent_ntddscsi="no"
409guest_agent_msi="auto"
410vss_win32_sdk="$default_feature"
411win_sdk="no"
412want_tools="$default_feature"
413libiscsi="auto"
414libnfs="auto"
415coroutine=""
416coroutine_pool="$default_feature"
417debug_stack_usage="no"
418crypto_afalg="no"
419cfi="false"
420cfi_debug="false"
421seccomp="auto"
422glusterfs="auto"
423gtk="auto"
424tls_priority="NORMAL"
425gnutls="$default_feature"
426nettle="$default_feature"
427nettle_xts="no"
428gcrypt="$default_feature"
429gcrypt_hmac="no"
430gcrypt_xts="no"
431qemu_private_xts="yes"
432auth_pam="$default_feature"
433vte="$default_feature"
434virglrenderer="$default_feature"
435tpm="$default_feature"
436libssh="$default_feature"
437live_block_migration=${default_feature:-yes}
438numa="$default_feature"
439tcmalloc="no"
440jemalloc="no"
441replication=${default_feature:-yes}
442bochs=${default_feature:-yes}
443cloop=${default_feature:-yes}
444dmg=${default_feature:-yes}
445qcow1=${default_feature:-yes}
446vdi=${default_feature:-yes}
447vvfat=${default_feature:-yes}
448qed=${default_feature:-yes}
449parallels=${default_feature:-yes}
450sheepdog="no"
451libxml2="$default_feature"
452debug_mutex="no"
453libpmem="$default_feature"
454default_devices="true"
455plugins="no"
456fuzzing="no"
457rng_none="no"
458secret_keyring="$default_feature"
459libdaxctl="$default_feature"
460meson=""
461ninja=""
462skip_meson=no
463gettext="auto"
464fuse="auto"
465fuse_lseek="auto"
466multiprocess="no"
467
468malloc_trim="auto"
469
470# parse CC options second
471for opt do
472  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
473  case "$opt" in
474  --cross-prefix=*) cross_prefix="$optarg"
475                    cross_compile="yes"
476  ;;
477  --cc=*) CC="$optarg"
478  ;;
479  --cxx=*) CXX="$optarg"
480  ;;
481  --cpu=*) cpu="$optarg"
482  ;;
483  --extra-cflags=*) QEMU_CFLAGS="$QEMU_CFLAGS $optarg"
484                    QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg"
485  ;;
486  --extra-cxxflags=*) QEMU_CXXFLAGS="$QEMU_CXXFLAGS $optarg"
487  ;;
488  --extra-ldflags=*) QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg"
489                     EXTRA_LDFLAGS="$optarg"
490  ;;
491  --enable-debug-info) debug_info="yes"
492  ;;
493  --disable-debug-info) debug_info="no"
494  ;;
495  --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"
496  ;;
497  --cross-cc-cflags-*) cc_arch=${opt#--cross-cc-flags-}; cc_arch=${cc_arch%%=*}
498                      eval "cross_cc_cflags_${cc_arch}=\$optarg"
499                      cross_cc_vars="$cross_cc_vars cross_cc_cflags_${cc_arch}"
500  ;;
501  --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}
502                cc_archs="$cc_archs $cc_arch"
503                eval "cross_cc_${cc_arch}=\$optarg"
504                cross_cc_vars="$cross_cc_vars cross_cc_${cc_arch}"
505  ;;
506  esac
507done
508# OS specific
509# Using uname is really, really broken.  Once we have the right set of checks
510# we can eliminate its usage altogether.
511
512# Preferred compiler:
513#  ${CC} (if set)
514#  ${cross_prefix}gcc (if cross-prefix specified)
515#  system compiler
516if test -z "${CC}${cross_prefix}"; then
517  cc="$host_cc"
518else
519  cc="${CC-${cross_prefix}gcc}"
520fi
521
522if test -z "${CXX}${cross_prefix}"; then
523  cxx="c++"
524else
525  cxx="${CXX-${cross_prefix}g++}"
526fi
527
528ar="${AR-${cross_prefix}ar}"
529as="${AS-${cross_prefix}as}"
530ccas="${CCAS-$cc}"
531cpp="${CPP-$cc -E}"
532objcopy="${OBJCOPY-${cross_prefix}objcopy}"
533ld="${LD-${cross_prefix}ld}"
534ranlib="${RANLIB-${cross_prefix}ranlib}"
535nm="${NM-${cross_prefix}nm}"
536strip="${STRIP-${cross_prefix}strip}"
537windres="${WINDRES-${cross_prefix}windres}"
538pkg_config_exe="${PKG_CONFIG-${cross_prefix}pkg-config}"
539query_pkg_config() {
540    "${pkg_config_exe}" ${QEMU_PKG_CONFIG_FLAGS} "$@"
541}
542pkg_config=query_pkg_config
543sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
544
545# If the user hasn't specified ARFLAGS, default to 'rv', just as make does.
546ARFLAGS="${ARFLAGS-rv}"
547
548# default flags for all hosts
549# We use -fwrapv to tell the compiler that we require a C dialect where
550# left shift of signed integers is well defined and has the expected
551# 2s-complement style results. (Both clang and gcc agree that it
552# provides these semantics.)
553QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv $QEMU_CFLAGS"
554QEMU_CFLAGS="-Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS"
555QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS"
556QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
557
558# Flags that are needed during configure but later taken care of by Meson
559CONFIGURE_CFLAGS="-std=gnu99 -Wall"
560CONFIGURE_LDFLAGS=
561
562
563check_define() {
564cat > $TMPC <<EOF
565#if !defined($1)
566#error $1 not defined
567#endif
568int main(void) { return 0; }
569EOF
570  compile_object
571}
572
573check_include() {
574cat > $TMPC <<EOF
575#include <$1>
576int main(void) { return 0; }
577EOF
578  compile_object
579}
580
581write_c_skeleton() {
582    cat > $TMPC <<EOF
583int main(void) { return 0; }
584EOF
585}
586
587write_c_fuzzer_skeleton() {
588    cat > $TMPC <<EOF
589#include <stdint.h>
590#include <sys/types.h>
591int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
592int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
593EOF
594}
595
596if check_define __linux__ ; then
597  targetos="Linux"
598elif check_define _WIN32 ; then
599  targetos='MINGW32'
600elif check_define __OpenBSD__ ; then
601  targetos='OpenBSD'
602elif check_define __sun__ ; then
603  targetos='SunOS'
604elif check_define __HAIKU__ ; then
605  targetos='Haiku'
606elif check_define __FreeBSD__ ; then
607  targetos='FreeBSD'
608elif check_define __FreeBSD_kernel__ && check_define __GLIBC__; then
609  targetos='GNU/kFreeBSD'
610elif check_define __DragonFly__ ; then
611  targetos='DragonFly'
612elif check_define __NetBSD__; then
613  targetos='NetBSD'
614elif check_define __APPLE__; then
615  targetos='Darwin'
616else
617  # This is a fatal error, but don't report it yet, because we
618  # might be going to just print the --help text, or it might
619  # be the result of a missing compiler.
620  targetos='bogus'
621fi
622
623# Some host OSes need non-standard checks for which CPU to use.
624# Note that these checks are broken for cross-compilation: if you're
625# cross-compiling to one of these OSes then you'll need to specify
626# the correct CPU with the --cpu option.
627case $targetos in
628Darwin)
629  HOST_DSOSUF=".dylib"
630  ;;
631SunOS)
632  # $(uname -m) returns i86pc even on an x86_64 box, so default based on isainfo
633  if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then
634    cpu="x86_64"
635  fi
636esac
637
638if test ! -z "$cpu" ; then
639  # command line argument
640  :
641elif check_define __i386__ ; then
642  cpu="i386"
643elif check_define __x86_64__ ; then
644  if check_define __ILP32__ ; then
645    cpu="x32"
646  else
647    cpu="x86_64"
648  fi
649elif check_define __sparc__ ; then
650  if check_define __arch64__ ; then
651    cpu="sparc64"
652  else
653    cpu="sparc"
654  fi
655elif check_define _ARCH_PPC ; then
656  if check_define _ARCH_PPC64 ; then
657    if check_define _LITTLE_ENDIAN ; then
658      cpu="ppc64le"
659    else
660      cpu="ppc64"
661    fi
662  else
663    cpu="ppc"
664  fi
665elif check_define __mips__ ; then
666  cpu="mips"
667elif check_define __s390__ ; then
668  if check_define __s390x__ ; then
669    cpu="s390x"
670  else
671    cpu="s390"
672  fi
673elif check_define __riscv ; then
674  if check_define _LP64 ; then
675    cpu="riscv64"
676  else
677    cpu="riscv32"
678  fi
679elif check_define __arm__ ; then
680  cpu="arm"
681elif check_define __aarch64__ ; then
682  cpu="aarch64"
683else
684  cpu=$(uname -m)
685fi
686
687ARCH=
688# Normalise host CPU name and set ARCH.
689# Note that this case should only have supported host CPUs, not guests.
690case "$cpu" in
691  ppc|ppc64|s390x|sparc64|x32|riscv32|riscv64)
692  ;;
693  ppc64le)
694    ARCH="ppc64"
695  ;;
696  i386|i486|i586|i686|i86pc|BePC)
697    cpu="i386"
698  ;;
699  x86_64|amd64)
700    cpu="x86_64"
701  ;;
702  armv*b|armv*l|arm)
703    cpu="arm"
704  ;;
705  aarch64)
706    cpu="aarch64"
707  ;;
708  mips*)
709    cpu="mips"
710  ;;
711  sparc|sun4[cdmuv])
712    cpu="sparc"
713  ;;
714  *)
715    # This will result in either an error or falling back to TCI later
716    ARCH=unknown
717  ;;
718esac
719if test -z "$ARCH"; then
720  ARCH="$cpu"
721fi
722
723# OS specific
724
725case $targetos in
726MINGW32*)
727  mingw32="yes"
728  audio_possible_drivers="dsound sdl"
729  if check_include dsound.h; then
730    audio_drv_list="dsound"
731  else
732    audio_drv_list=""
733  fi
734  supported_os="yes"
735  pie="no"
736;;
737GNU/kFreeBSD)
738  bsd="yes"
739  audio_drv_list="oss try-sdl"
740  audio_possible_drivers="oss sdl pa"
741;;
742FreeBSD)
743  bsd="yes"
744  make="${MAKE-gmake}"
745  audio_drv_list="oss try-sdl"
746  audio_possible_drivers="oss sdl pa"
747  # needed for kinfo_getvmmap(3) in libutil.h
748  netmap=""  # enable netmap autodetect
749;;
750DragonFly)
751  bsd="yes"
752  make="${MAKE-gmake}"
753  audio_drv_list="oss try-sdl"
754  audio_possible_drivers="oss sdl pa"
755;;
756NetBSD)
757  bsd="yes"
758  make="${MAKE-gmake}"
759  audio_drv_list="oss try-sdl"
760  audio_possible_drivers="oss sdl"
761  oss_lib="-lossaudio"
762;;
763OpenBSD)
764  bsd="yes"
765  make="${MAKE-gmake}"
766  audio_drv_list="try-sdl"
767  audio_possible_drivers="sdl"
768;;
769Darwin)
770  bsd="yes"
771  darwin="yes"
772  audio_drv_list="try-coreaudio try-sdl"
773  audio_possible_drivers="coreaudio sdl"
774  # Disable attempts to use ObjectiveC features in os/object.h since they
775  # won't work when we're compiling with gcc as a C compiler.
776  QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS"
777;;
778SunOS)
779  solaris="yes"
780  make="${MAKE-gmake}"
781  smbd="${SMBD-/usr/sfw/sbin/smbd}"
782  if test -f /usr/include/sys/soundcard.h ; then
783    audio_drv_list="oss try-sdl"
784  fi
785  audio_possible_drivers="oss sdl"
786# needed for CMSG_ macros in sys/socket.h
787  QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS"
788# needed for TIOCWIN* defines in termios.h
789  QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
790;;
791Haiku)
792  haiku="yes"
793  QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS -D_BSD_SOURCE $QEMU_CFLAGS"
794;;
795Linux)
796  audio_drv_list="try-pa oss"
797  audio_possible_drivers="oss alsa sdl pa"
798  linux="yes"
799  linux_user="yes"
800  vhost_user=${default_feature:-yes}
801  multiprocess=${default_feature:-yes}
802;;
803esac
804
805if [ "$bsd" = "yes" ] ; then
806  if [ "$darwin" != "yes" ] ; then
807    bsd_user="yes"
808  fi
809fi
810
811: ${make=${MAKE-make}}
812
813# We prefer python 3.x. A bare 'python' is traditionally
814# python 2.x, but some distros have it as python 3.x, so
815# we check that too
816python=
817explicit_python=no
818for binary in "${PYTHON-python3}" python
819do
820    if has "$binary"
821    then
822        python=$(command -v "$binary")
823        break
824    fi
825done
826
827
828# Check for ancillary tools used in testing
829genisoimage=
830for binary in genisoimage mkisofs
831do
832    if has $binary
833    then
834        genisoimage=$(command -v "$binary")
835        break
836    fi
837done
838
839: ${smbd=${SMBD-/usr/sbin/smbd}}
840
841# Default objcc to clang if available, otherwise use CC
842if has clang; then
843  objcc=clang
844else
845  objcc="$cc"
846fi
847
848if test "$mingw32" = "yes" ; then
849  EXESUF=".exe"
850  HOST_DSOSUF=".dll"
851  # MinGW needs -mthreads for TLS and macro _MT.
852  CONFIGURE_CFLAGS="-mthreads $CONFIGURE_CFLAGS"
853  write_c_skeleton;
854  prefix="/qemu"
855  qemu_suffix=""
856  libs_qga="-lws2_32 -lwinmm -lpowrprof -lwtsapi32 -lwininet -liphlpapi -lnetapi32 $libs_qga"
857fi
858
859werror=""
860
861for opt do
862  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
863  case "$opt" in
864  --help|-h) show_help=yes
865  ;;
866  --version|-V) exec cat $source_path/VERSION
867  ;;
868  --prefix=*) prefix="$optarg"
869  ;;
870  --interp-prefix=*) interp_prefix="$optarg"
871  ;;
872  --cross-prefix=*)
873  ;;
874  --cc=*)
875  ;;
876  --host-cc=*) host_cc="$optarg"
877  ;;
878  --cxx=*)
879  ;;
880  --iasl=*) iasl="$optarg"
881  ;;
882  --objcc=*) objcc="$optarg"
883  ;;
884  --make=*) make="$optarg"
885  ;;
886  --install=*)
887  ;;
888  --python=*) python="$optarg" ; explicit_python=yes
889  ;;
890  --sphinx-build=*) sphinx_build="$optarg"
891  ;;
892  --skip-meson) skip_meson=yes
893  ;;
894  --meson=*) meson="$optarg"
895  ;;
896  --ninja=*) ninja="$optarg"
897  ;;
898  --smbd=*) smbd="$optarg"
899  ;;
900  --extra-cflags=*)
901  ;;
902  --extra-cxxflags=*)
903  ;;
904  --extra-ldflags=*)
905  ;;
906  --enable-debug-info)
907  ;;
908  --disable-debug-info)
909  ;;
910  --cross-cc-*)
911  ;;
912  --enable-modules)
913      modules="yes"
914  ;;
915  --disable-modules)
916      modules="no"
917  ;;
918  --disable-module-upgrades) module_upgrades="no"
919  ;;
920  --enable-module-upgrades) module_upgrades="yes"
921  ;;
922  --cpu=*)
923  ;;
924  --target-list=*) target_list="$optarg"
925                   if test "$target_list_exclude"; then
926                       error_exit "Can't mix --target-list with --target-list-exclude"
927                   fi
928  ;;
929  --target-list-exclude=*) target_list_exclude="$optarg"
930                   if test "$target_list"; then
931                       error_exit "Can't mix --target-list-exclude with --target-list"
932                   fi
933  ;;
934  --enable-trace-backends=*) trace_backends="$optarg"
935  ;;
936  # XXX: backwards compatibility
937  --enable-trace-backend=*) trace_backends="$optarg"
938  ;;
939  --with-trace-file=*) trace_file="$optarg"
940  ;;
941  --with-default-devices) default_devices="true"
942  ;;
943  --without-default-devices) default_devices="false"
944  ;;
945  --without-default-features) # processed above
946  ;;
947  --enable-gprof) gprof="yes"
948  ;;
949  --enable-gcov) gcov="yes"
950  ;;
951  --static)
952    static="yes"
953    QEMU_PKG_CONFIG_FLAGS="--static $QEMU_PKG_CONFIG_FLAGS"
954  ;;
955  --mandir=*) mandir="$optarg"
956  ;;
957  --bindir=*) bindir="$optarg"
958  ;;
959  --libdir=*) libdir="$optarg"
960  ;;
961  --libexecdir=*) libexecdir="$optarg"
962  ;;
963  --includedir=*) includedir="$optarg"
964  ;;
965  --datadir=*) datadir="$optarg"
966  ;;
967  --with-suffix=*) qemu_suffix="$optarg"
968  ;;
969  --docdir=*) docdir="$optarg"
970  ;;
971  --localedir=*) localedir="$optarg"
972  ;;
973  --sysconfdir=*) sysconfdir="$optarg"
974  ;;
975  --localstatedir=*) local_statedir="$optarg"
976  ;;
977  --firmwarepath=*) firmwarepath="$optarg"
978  ;;
979  --host=*|--build=*|\
980  --disable-dependency-tracking|\
981  --sbindir=*|--sharedstatedir=*|\
982  --oldincludedir=*|--datarootdir=*|--infodir=*|\
983  --htmldir=*|--dvidir=*|--pdfdir=*|--psdir=*)
984    # These switches are silently ignored, for compatibility with
985    # autoconf-generated configure scripts. This allows QEMU's
986    # configure to be used by RPM and similar macros that set
987    # lots of directory switches by default.
988  ;;
989  --disable-sdl) sdl="disabled"
990  ;;
991  --enable-sdl) sdl="enabled"
992  ;;
993  --disable-sdl-image) sdl_image="disabled"
994  ;;
995  --enable-sdl-image) sdl_image="enabled"
996  ;;
997  --disable-qom-cast-debug) qom_cast_debug="no"
998  ;;
999  --enable-qom-cast-debug) qom_cast_debug="yes"
1000  ;;
1001  --disable-virtfs) virtfs="disabled"
1002  ;;
1003  --enable-virtfs) virtfs="enabled"
1004  ;;
1005  --disable-libudev) libudev="disabled"
1006  ;;
1007  --enable-libudev) libudev="enabled"
1008  ;;
1009  --disable-virtiofsd) virtiofsd="disabled"
1010  ;;
1011  --enable-virtiofsd) virtiofsd="enabled"
1012  ;;
1013  --disable-mpath) mpath="disabled"
1014  ;;
1015  --enable-mpath) mpath="enabled"
1016  ;;
1017  --disable-vnc) vnc="disabled"
1018  ;;
1019  --enable-vnc) vnc="enabled"
1020  ;;
1021  --disable-gettext) gettext="disabled"
1022  ;;
1023  --enable-gettext) gettext="enabled"
1024  ;;
1025  --oss-lib=*) oss_lib="$optarg"
1026  ;;
1027  --audio-drv-list=*) audio_drv_list="$optarg"
1028  ;;
1029  --block-drv-rw-whitelist=*|--block-drv-whitelist=*) block_drv_rw_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
1030  ;;
1031  --block-drv-ro-whitelist=*) block_drv_ro_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
1032  ;;
1033  --enable-debug-tcg) debug_tcg="yes"
1034  ;;
1035  --disable-debug-tcg) debug_tcg="no"
1036  ;;
1037  --enable-debug)
1038      # Enable debugging options that aren't excessively noisy
1039      debug_tcg="yes"
1040      debug_mutex="yes"
1041      debug="yes"
1042      strip_opt="no"
1043      fortify_source="no"
1044  ;;
1045  --enable-sanitizers) sanitizers="yes"
1046  ;;
1047  --disable-sanitizers) sanitizers="no"
1048  ;;
1049  --enable-tsan) tsan="yes"
1050  ;;
1051  --disable-tsan) tsan="no"
1052  ;;
1053  --enable-sparse) sparse="enabled"
1054  ;;
1055  --disable-sparse) sparse="disabled"
1056  ;;
1057  --disable-strip) strip_opt="no"
1058  ;;
1059  --disable-vnc-sasl) vnc_sasl="disabled"
1060  ;;
1061  --enable-vnc-sasl) vnc_sasl="enabled"
1062  ;;
1063  --disable-vnc-jpeg) vnc_jpeg="disabled"
1064  ;;
1065  --enable-vnc-jpeg) vnc_jpeg="enabled"
1066  ;;
1067  --disable-vnc-png) vnc_png="disabled"
1068  ;;
1069  --enable-vnc-png) vnc_png="enabled"
1070  ;;
1071  --disable-slirp) slirp="disabled"
1072  ;;
1073  --enable-slirp) slirp="enabled"
1074  ;;
1075  --enable-slirp=git) slirp="internal"
1076  ;;
1077  --enable-slirp=system) slirp="system"
1078  ;;
1079  --disable-vde) vde="no"
1080  ;;
1081  --enable-vde) vde="yes"
1082  ;;
1083  --disable-netmap) netmap="no"
1084  ;;
1085  --enable-netmap) netmap="yes"
1086  ;;
1087  --disable-xen) xen="disabled"
1088  ;;
1089  --enable-xen) xen="enabled"
1090  ;;
1091  --disable-xen-pci-passthrough) xen_pci_passthrough="disabled"
1092  ;;
1093  --enable-xen-pci-passthrough) xen_pci_passthrough="enabled"
1094  ;;
1095  --disable-brlapi) brlapi="disabled"
1096  ;;
1097  --enable-brlapi) brlapi="enabled"
1098  ;;
1099  --disable-kvm) kvm="disabled"
1100  ;;
1101  --enable-kvm) kvm="enabled"
1102  ;;
1103  --disable-hax) hax="disabled"
1104  ;;
1105  --enable-hax) hax="enabled"
1106  ;;
1107  --disable-hvf) hvf="disabled"
1108  ;;
1109  --enable-hvf) hvf="enabled"
1110  ;;
1111  --disable-whpx) whpx="disabled"
1112  ;;
1113  --enable-whpx) whpx="enabled"
1114  ;;
1115  --disable-tcg-interpreter) tcg_interpreter="false"
1116  ;;
1117  --enable-tcg-interpreter) tcg_interpreter="true"
1118  ;;
1119  --disable-cap-ng)  cap_ng="disabled"
1120  ;;
1121  --enable-cap-ng) cap_ng="enabled"
1122  ;;
1123  --disable-tcg) tcg="disabled"
1124  ;;
1125  --enable-tcg) tcg="enabled"
1126  ;;
1127  --disable-malloc-trim) malloc_trim="disabled"
1128  ;;
1129  --enable-malloc-trim) malloc_trim="enabled"
1130  ;;
1131  --disable-spice) spice="no"
1132  ;;
1133  --enable-spice) spice="yes"
1134  ;;
1135  --disable-libiscsi) libiscsi="disabled"
1136  ;;
1137  --enable-libiscsi) libiscsi="enabled"
1138  ;;
1139  --disable-libnfs) libnfs="disabled"
1140  ;;
1141  --enable-libnfs) libnfs="enabled"
1142  ;;
1143  --enable-profiler) profiler="yes"
1144  ;;
1145  --disable-cocoa) cocoa="disabled"
1146  ;;
1147  --enable-cocoa) cocoa="enabled"
1148  ;;
1149  --disable-system) softmmu="no"
1150  ;;
1151  --enable-system) softmmu="yes"
1152  ;;
1153  --disable-user)
1154      linux_user="no" ;
1155      bsd_user="no" ;
1156  ;;
1157  --enable-user) ;;
1158  --disable-linux-user) linux_user="no"
1159  ;;
1160  --enable-linux-user) linux_user="yes"
1161  ;;
1162  --disable-bsd-user) bsd_user="no"
1163  ;;
1164  --enable-bsd-user) bsd_user="yes"
1165  ;;
1166  --enable-pie) pie="yes"
1167  ;;
1168  --disable-pie) pie="no"
1169  ;;
1170  --enable-werror) werror="yes"
1171  ;;
1172  --disable-werror) werror="no"
1173  ;;
1174  --enable-lto) lto="true"
1175  ;;
1176  --disable-lto) lto="false"
1177  ;;
1178  --enable-stack-protector) stack_protector="yes"
1179  ;;
1180  --disable-stack-protector) stack_protector="no"
1181  ;;
1182  --enable-safe-stack) safe_stack="yes"
1183  ;;
1184  --disable-safe-stack) safe_stack="no"
1185  ;;
1186  --enable-cfi)
1187      cfi="true";
1188      lto="true";
1189  ;;
1190  --disable-cfi) cfi="false"
1191  ;;
1192  --enable-cfi-debug) cfi_debug="true"
1193  ;;
1194  --disable-cfi-debug) cfi_debug="false"
1195  ;;
1196  --disable-curses) curses="disabled"
1197  ;;
1198  --enable-curses) curses="enabled"
1199  ;;
1200  --disable-iconv) iconv="disabled"
1201  ;;
1202  --enable-iconv) iconv="enabled"
1203  ;;
1204  --disable-curl) curl="disabled"
1205  ;;
1206  --enable-curl) curl="enabled"
1207  ;;
1208  --disable-fdt) fdt="disabled"
1209  ;;
1210  --enable-fdt) fdt="enabled"
1211  ;;
1212  --enable-fdt=git) fdt="internal"
1213  ;;
1214  --enable-fdt=system) fdt="system"
1215  ;;
1216  --disable-linux-aio) linux_aio="no"
1217  ;;
1218  --enable-linux-aio) linux_aio="yes"
1219  ;;
1220  --disable-linux-io-uring) linux_io_uring="no"
1221  ;;
1222  --enable-linux-io-uring) linux_io_uring="yes"
1223  ;;
1224  --disable-attr) attr="disabled"
1225  ;;
1226  --enable-attr) attr="enabled"
1227  ;;
1228  --disable-membarrier) membarrier="no"
1229  ;;
1230  --enable-membarrier) membarrier="yes"
1231  ;;
1232  --disable-blobs) blobs="false"
1233  ;;
1234  --with-pkgversion=*) pkgversion="$optarg"
1235  ;;
1236  --with-coroutine=*) coroutine="$optarg"
1237  ;;
1238  --disable-coroutine-pool) coroutine_pool="no"
1239  ;;
1240  --enable-coroutine-pool) coroutine_pool="yes"
1241  ;;
1242  --enable-debug-stack-usage) debug_stack_usage="yes"
1243  ;;
1244  --enable-crypto-afalg) crypto_afalg="yes"
1245  ;;
1246  --disable-crypto-afalg) crypto_afalg="no"
1247  ;;
1248  --disable-docs) docs="disabled"
1249  ;;
1250  --enable-docs) docs="enabled"
1251  ;;
1252  --disable-vhost-net) vhost_net="no"
1253  ;;
1254  --enable-vhost-net) vhost_net="yes"
1255  ;;
1256  --disable-vhost-crypto) vhost_crypto="no"
1257  ;;
1258  --enable-vhost-crypto) vhost_crypto="yes"
1259  ;;
1260  --disable-vhost-scsi) vhost_scsi="no"
1261  ;;
1262  --enable-vhost-scsi) vhost_scsi="yes"
1263  ;;
1264  --disable-vhost-vsock) vhost_vsock="no"
1265  ;;
1266  --enable-vhost-vsock) vhost_vsock="yes"
1267  ;;
1268  --disable-vhost-user-blk-server) vhost_user_blk_server="disabled"
1269  ;;
1270  --enable-vhost-user-blk-server) vhost_user_blk_server="enabled"
1271  ;;
1272  --disable-vhost-user-fs) vhost_user_fs="no"
1273  ;;
1274  --enable-vhost-user-fs) vhost_user_fs="yes"
1275  ;;
1276  --disable-opengl) opengl="no"
1277  ;;
1278  --enable-opengl) opengl="yes"
1279  ;;
1280  --disable-rbd) rbd="disabled"
1281  ;;
1282  --enable-rbd) rbd="enabled"
1283  ;;
1284  --disable-xfsctl) xfs="no"
1285  ;;
1286  --enable-xfsctl) xfs="yes"
1287  ;;
1288  --disable-smartcard) smartcard="no"
1289  ;;
1290  --enable-smartcard) smartcard="yes"
1291  ;;
1292  --disable-u2f) u2f="disabled"
1293  ;;
1294  --enable-u2f) u2f="enabled"
1295  ;;
1296  --disable-libusb) libusb="no"
1297  ;;
1298  --enable-libusb) libusb="yes"
1299  ;;
1300  --disable-usb-redir) usb_redir="no"
1301  ;;
1302  --enable-usb-redir) usb_redir="yes"
1303  ;;
1304  --disable-zlib-test)
1305  ;;
1306  --disable-lzo) lzo="disabled"
1307  ;;
1308  --enable-lzo) lzo="enabled"
1309  ;;
1310  --disable-snappy) snappy="disabled"
1311  ;;
1312  --enable-snappy) snappy="enabled"
1313  ;;
1314  --disable-bzip2) bzip2="disabled"
1315  ;;
1316  --enable-bzip2) bzip2="enabled"
1317  ;;
1318  --enable-lzfse) lzfse="enabled"
1319  ;;
1320  --disable-lzfse) lzfse="disabled"
1321  ;;
1322  --disable-zstd) zstd="disabled"
1323  ;;
1324  --enable-zstd) zstd="enabled"
1325  ;;
1326  --enable-guest-agent) guest_agent="yes"
1327  ;;
1328  --disable-guest-agent) guest_agent="no"
1329  ;;
1330  --enable-guest-agent-msi) guest_agent_msi="enabled"
1331  ;;
1332  --disable-guest-agent-msi) guest_agent_msi="disabled"
1333  ;;
1334  --with-vss-sdk) vss_win32_sdk=""
1335  ;;
1336  --with-vss-sdk=*) vss_win32_sdk="$optarg"
1337  ;;
1338  --without-vss-sdk) vss_win32_sdk="no"
1339  ;;
1340  --with-win-sdk) win_sdk=""
1341  ;;
1342  --with-win-sdk=*) win_sdk="$optarg"
1343  ;;
1344  --without-win-sdk) win_sdk="no"
1345  ;;
1346  --enable-tools) want_tools="yes"
1347  ;;
1348  --disable-tools) want_tools="no"
1349  ;;
1350  --enable-seccomp) seccomp="enabled"
1351  ;;
1352  --disable-seccomp) seccomp="disabled"
1353  ;;
1354  --disable-glusterfs) glusterfs="disabled"
1355  ;;
1356  --disable-avx2) avx2_opt="no"
1357  ;;
1358  --enable-avx2) avx2_opt="yes"
1359  ;;
1360  --disable-avx512f) avx512f_opt="no"
1361  ;;
1362  --enable-avx512f) avx512f_opt="yes"
1363  ;;
1364
1365  --enable-glusterfs) glusterfs="enabled"
1366  ;;
1367  --disable-virtio-blk-data-plane|--enable-virtio-blk-data-plane)
1368      echo "$0: $opt is obsolete, virtio-blk data-plane is always on" >&2
1369  ;;
1370  --enable-vhdx|--disable-vhdx)
1371      echo "$0: $opt is obsolete, VHDX driver is always built" >&2
1372  ;;
1373  --enable-uuid|--disable-uuid)
1374      echo "$0: $opt is obsolete, UUID support is always built" >&2
1375  ;;
1376  --disable-gtk) gtk="disabled"
1377  ;;
1378  --enable-gtk) gtk="enabled"
1379  ;;
1380  --tls-priority=*) tls_priority="$optarg"
1381  ;;
1382  --disable-gnutls) gnutls="no"
1383  ;;
1384  --enable-gnutls) gnutls="yes"
1385  ;;
1386  --disable-nettle) nettle="no"
1387  ;;
1388  --enable-nettle) nettle="yes"
1389  ;;
1390  --disable-gcrypt) gcrypt="no"
1391  ;;
1392  --enable-gcrypt) gcrypt="yes"
1393  ;;
1394  --disable-auth-pam) auth_pam="no"
1395  ;;
1396  --enable-auth-pam) auth_pam="yes"
1397  ;;
1398  --enable-rdma) rdma="yes"
1399  ;;
1400  --disable-rdma) rdma="no"
1401  ;;
1402  --enable-pvrdma) pvrdma="yes"
1403  ;;
1404  --disable-pvrdma) pvrdma="no"
1405  ;;
1406  --disable-vte) vte="no"
1407  ;;
1408  --enable-vte) vte="yes"
1409  ;;
1410  --disable-virglrenderer) virglrenderer="no"
1411  ;;
1412  --enable-virglrenderer) virglrenderer="yes"
1413  ;;
1414  --disable-tpm) tpm="no"
1415  ;;
1416  --enable-tpm) tpm="yes"
1417  ;;
1418  --disable-libssh) libssh="no"
1419  ;;
1420  --enable-libssh) libssh="yes"
1421  ;;
1422  --disable-live-block-migration) live_block_migration="no"
1423  ;;
1424  --enable-live-block-migration) live_block_migration="yes"
1425  ;;
1426  --disable-numa) numa="no"
1427  ;;
1428  --enable-numa) numa="yes"
1429  ;;
1430  --disable-libxml2) libxml2="no"
1431  ;;
1432  --enable-libxml2) libxml2="yes"
1433  ;;
1434  --disable-tcmalloc) tcmalloc="no"
1435  ;;
1436  --enable-tcmalloc) tcmalloc="yes"
1437  ;;
1438  --disable-jemalloc) jemalloc="no"
1439  ;;
1440  --enable-jemalloc) jemalloc="yes"
1441  ;;
1442  --disable-replication) replication="no"
1443  ;;
1444  --enable-replication) replication="yes"
1445  ;;
1446  --disable-bochs) bochs="no"
1447  ;;
1448  --enable-bochs) bochs="yes"
1449  ;;
1450  --disable-cloop) cloop="no"
1451  ;;
1452  --enable-cloop) cloop="yes"
1453  ;;
1454  --disable-dmg) dmg="no"
1455  ;;
1456  --enable-dmg) dmg="yes"
1457  ;;
1458  --disable-qcow1) qcow1="no"
1459  ;;
1460  --enable-qcow1) qcow1="yes"
1461  ;;
1462  --disable-vdi) vdi="no"
1463  ;;
1464  --enable-vdi) vdi="yes"
1465  ;;
1466  --disable-vvfat) vvfat="no"
1467  ;;
1468  --enable-vvfat) vvfat="yes"
1469  ;;
1470  --disable-qed) qed="no"
1471  ;;
1472  --enable-qed) qed="yes"
1473  ;;
1474  --disable-parallels) parallels="no"
1475  ;;
1476  --enable-parallels) parallels="yes"
1477  ;;
1478  --disable-sheepdog) sheepdog="no"
1479  ;;
1480  --enable-sheepdog) sheepdog="yes"
1481  ;;
1482  --disable-vhost-user) vhost_user="no"
1483  ;;
1484  --enable-vhost-user) vhost_user="yes"
1485  ;;
1486  --disable-vhost-vdpa) vhost_vdpa="no"
1487  ;;
1488  --enable-vhost-vdpa) vhost_vdpa="yes"
1489  ;;
1490  --disable-vhost-kernel) vhost_kernel="no"
1491  ;;
1492  --enable-vhost-kernel) vhost_kernel="yes"
1493  ;;
1494  --disable-capstone) capstone="disabled"
1495  ;;
1496  --enable-capstone) capstone="enabled"
1497  ;;
1498  --enable-capstone=git) capstone="internal"
1499  ;;
1500  --enable-capstone=system) capstone="system"
1501  ;;
1502  --with-git=*) git="$optarg"
1503  ;;
1504  --enable-git-update)
1505      git_submodules_action="update"
1506      echo "--enable-git-update deprecated, use --with-git-submodules=update"
1507  ;;
1508  --disable-git-update)
1509      git_submodules_action="validate"
1510      echo "--disable-git-update deprecated, use --with-git-submodules=validate"
1511  ;;
1512  --with-git-submodules=*)
1513      git_submodules_action="$optarg"
1514  ;;
1515  --enable-debug-mutex) debug_mutex=yes
1516  ;;
1517  --disable-debug-mutex) debug_mutex=no
1518  ;;
1519  --enable-libpmem) libpmem=yes
1520  ;;
1521  --disable-libpmem) libpmem=no
1522  ;;
1523  --enable-xkbcommon) xkbcommon="enabled"
1524  ;;
1525  --disable-xkbcommon) xkbcommon="disabled"
1526  ;;
1527  --enable-plugins) plugins="yes"
1528  ;;
1529  --disable-plugins) plugins="no"
1530  ;;
1531  --enable-containers) use_containers="yes"
1532  ;;
1533  --disable-containers) use_containers="no"
1534  ;;
1535  --enable-fuzzing) fuzzing=yes
1536  ;;
1537  --disable-fuzzing) fuzzing=no
1538  ;;
1539  --gdb=*) gdb_bin="$optarg"
1540  ;;
1541  --enable-rng-none) rng_none=yes
1542  ;;
1543  --disable-rng-none) rng_none=no
1544  ;;
1545  --enable-keyring) secret_keyring="yes"
1546  ;;
1547  --disable-keyring) secret_keyring="no"
1548  ;;
1549  --enable-libdaxctl) libdaxctl=yes
1550  ;;
1551  --disable-libdaxctl) libdaxctl=no
1552  ;;
1553  --enable-fuse) fuse="enabled"
1554  ;;
1555  --disable-fuse) fuse="disabled"
1556  ;;
1557  --enable-fuse-lseek) fuse_lseek="enabled"
1558  ;;
1559  --disable-fuse-lseek) fuse_lseek="disabled"
1560  ;;
1561  --enable-multiprocess) multiprocess="yes"
1562  ;;
1563  --disable-multiprocess) multiprocess="no"
1564  ;;
1565  *)
1566      echo "ERROR: unknown option $opt"
1567      echo "Try '$0 --help' for more information"
1568      exit 1
1569  ;;
1570  esac
1571done
1572
1573case $git_submodules_action in
1574    update|validate)
1575        if test ! -e "$source_path/.git"; then
1576            echo "ERROR: cannot $git_submodules_action git submodules without .git"
1577            exit 1
1578        fi
1579    ;;
1580    ignore)
1581    ;;
1582    *)
1583        echo "ERROR: invalid --with-git-submodules= value '$git_submodules_action'"
1584        exit 1
1585    ;;
1586esac
1587
1588libdir="${libdir:-$prefix/lib}"
1589libexecdir="${libexecdir:-$prefix/libexec}"
1590includedir="${includedir:-$prefix/include}"
1591
1592if test "$mingw32" = "yes" ; then
1593    bindir="${bindir:-$prefix}"
1594else
1595    bindir="${bindir:-$prefix/bin}"
1596fi
1597mandir="${mandir:-$prefix/share/man}"
1598datadir="${datadir:-$prefix/share}"
1599docdir="${docdir:-$prefix/share/doc}"
1600sysconfdir="${sysconfdir:-$prefix/etc}"
1601local_statedir="${local_statedir:-$prefix/var}"
1602firmwarepath="${firmwarepath:-$datadir/qemu-firmware}"
1603localedir="${localedir:-$datadir/locale}"
1604
1605case "$cpu" in
1606    ppc)
1607           CPU_CFLAGS="-m32"
1608           QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS"
1609           ;;
1610    ppc64)
1611           CPU_CFLAGS="-m64"
1612           QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1613           ;;
1614    sparc)
1615           CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc"
1616           QEMU_LDFLAGS="-m32 -mv8plus $QEMU_LDFLAGS"
1617           ;;
1618    sparc64)
1619           CPU_CFLAGS="-m64 -mcpu=ultrasparc"
1620           QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1621           ;;
1622    s390)
1623           CPU_CFLAGS="-m31"
1624           QEMU_LDFLAGS="-m31 $QEMU_LDFLAGS"
1625           ;;
1626    s390x)
1627           CPU_CFLAGS="-m64"
1628           QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1629           ;;
1630    i386)
1631           CPU_CFLAGS="-m32"
1632           QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS"
1633           ;;
1634    x86_64)
1635           # ??? Only extremely old AMD cpus do not have cmpxchg16b.
1636           # If we truly care, we should simply detect this case at
1637           # runtime and generate the fallback to serial emulation.
1638           CPU_CFLAGS="-m64 -mcx16"
1639           QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1640           ;;
1641    x32)
1642           CPU_CFLAGS="-mx32"
1643           QEMU_LDFLAGS="-mx32 $QEMU_LDFLAGS"
1644           ;;
1645    # No special flags required for other host CPUs
1646esac
1647
1648eval "cross_cc_${cpu}=\$host_cc"
1649cross_cc_vars="$cross_cc_vars cross_cc_${cpu}"
1650QEMU_CFLAGS="$CPU_CFLAGS $QEMU_CFLAGS"
1651
1652# For user-mode emulation the host arch has to be one we explicitly
1653# support, even if we're using TCI.
1654if [ "$ARCH" = "unknown" ]; then
1655  bsd_user="no"
1656  linux_user="no"
1657fi
1658
1659default_target_list=""
1660deprecated_targets_list=ppc64abi32-linux-user,tilegx-linux-user,lm32-softmmu,unicore32-softmmu
1661deprecated_features=""
1662mak_wilds=""
1663
1664if [ "$softmmu" = "yes" ]; then
1665    mak_wilds="${mak_wilds} $source_path/default-configs/targets/*-softmmu.mak"
1666fi
1667if [ "$linux_user" = "yes" ]; then
1668    mak_wilds="${mak_wilds} $source_path/default-configs/targets/*-linux-user.mak"
1669fi
1670if [ "$bsd_user" = "yes" ]; then
1671    mak_wilds="${mak_wilds} $source_path/default-configs/targets/*-bsd-user.mak"
1672fi
1673
1674# If the user doesn't explicitly specify a deprecated target we will
1675# skip it.
1676if test -z "$target_list"; then
1677    if test -z "$target_list_exclude"; then
1678        target_list_exclude="$deprecated_targets_list"
1679    else
1680        target_list_exclude="$target_list_exclude,$deprecated_targets_list"
1681    fi
1682fi
1683
1684for config in $mak_wilds; do
1685    target="$(basename "$config" .mak)"
1686    if echo "$target_list_exclude" | grep -vq "$target"; then
1687        default_target_list="${default_target_list} $target"
1688    fi
1689done
1690
1691# Enumerate public trace backends for --help output
1692trace_backend_list=$(echo $(grep -le '^PUBLIC = True$' "$source_path"/scripts/tracetool/backend/*.py | sed -e 's/^.*\/\(.*\)\.py$/\1/'))
1693
1694if test x"$show_help" = x"yes" ; then
1695cat << EOF
1696
1697Usage: configure [options]
1698Options: [defaults in brackets after descriptions]
1699
1700Standard options:
1701  --help                   print this message
1702  --prefix=PREFIX          install in PREFIX [$prefix]
1703  --interp-prefix=PREFIX   where to find shared libraries, etc.
1704                           use %M for cpu name [$interp_prefix]
1705  --target-list=LIST       set target list (default: build all non-deprecated)
1706$(echo Available targets: $default_target_list | \
1707  fold -s -w 53 | sed -e 's/^/                           /')
1708$(echo Deprecated targets: $deprecated_targets_list | \
1709  fold -s -w 53 | sed -e 's/^/                           /')
1710  --target-list-exclude=LIST exclude a set of targets from the default target-list
1711
1712Advanced options (experts only):
1713  --cross-prefix=PREFIX    use PREFIX for compile tools, PREFIX can be blank [$cross_prefix]
1714  --cc=CC                  use C compiler CC [$cc]
1715  --iasl=IASL              use ACPI compiler IASL [$iasl]
1716  --host-cc=CC             use C compiler CC [$host_cc] for code run at
1717                           build time
1718  --cxx=CXX                use C++ compiler CXX [$cxx]
1719  --objcc=OBJCC            use Objective-C compiler OBJCC [$objcc]
1720  --extra-cflags=CFLAGS    append extra C compiler flags QEMU_CFLAGS
1721  --extra-cxxflags=CXXFLAGS append extra C++ compiler flags QEMU_CXXFLAGS
1722  --extra-ldflags=LDFLAGS  append extra linker flags LDFLAGS
1723  --cross-cc-ARCH=CC       use compiler when building ARCH guest test cases
1724  --cross-cc-flags-ARCH=   use compiler flags when building ARCH guest tests
1725  --make=MAKE              use specified make [$make]
1726  --python=PYTHON          use specified python [$python]
1727  --sphinx-build=SPHINX    use specified sphinx-build [$sphinx_build]
1728  --meson=MESON            use specified meson [$meson]
1729  --ninja=NINJA            use specified ninja [$ninja]
1730  --smbd=SMBD              use specified smbd [$smbd]
1731  --with-git=GIT           use specified git [$git]
1732  --with-git-submodules=update   update git submodules (default if .git dir exists)
1733  --with-git-submodules=validate fail if git submodules are not up to date
1734  --with-git-submodules=ignore   do not update or check git submodules (default if no .git dir)
1735  --static                 enable static build [$static]
1736  --mandir=PATH            install man pages in PATH
1737  --datadir=PATH           install firmware in PATH/$qemu_suffix
1738  --localedir=PATH         install translation in PATH/$qemu_suffix
1739  --docdir=PATH            install documentation in PATH/$qemu_suffix
1740  --bindir=PATH            install binaries in PATH
1741  --libdir=PATH            install libraries in PATH
1742  --libexecdir=PATH        install helper binaries in PATH
1743  --sysconfdir=PATH        install config in PATH/$qemu_suffix
1744  --localstatedir=PATH     install local state in PATH (set at runtime on win32)
1745  --firmwarepath=PATH      search PATH for firmware files
1746  --efi-aarch64=PATH       PATH of efi file to use for aarch64 VMs.
1747  --with-suffix=SUFFIX     suffix for QEMU data inside datadir/libdir/sysconfdir/docdir [$qemu_suffix]
1748  --with-pkgversion=VERS   use specified string as sub-version of the package
1749  --without-default-features default all --enable-* options to "disabled"
1750  --without-default-devices  do not include any device that is not needed to
1751                           start the emulator (only use if you are including
1752                           desired devices in default-configs/devices/)
1753  --enable-debug           enable common debug build options
1754  --enable-sanitizers      enable default sanitizers
1755  --enable-tsan            enable thread sanitizer
1756  --disable-strip          disable stripping binaries
1757  --disable-werror         disable compilation abort on warning
1758  --disable-stack-protector disable compiler-provided stack protection
1759  --audio-drv-list=LIST    set audio drivers list:
1760                           Available drivers: $audio_possible_drivers
1761  --block-drv-whitelist=L  Same as --block-drv-rw-whitelist=L
1762  --block-drv-rw-whitelist=L
1763                           set block driver read-write whitelist
1764                           (affects only QEMU, not qemu-img)
1765  --block-drv-ro-whitelist=L
1766                           set block driver read-only whitelist
1767                           (affects only QEMU, not qemu-img)
1768  --enable-trace-backends=B Set trace backend
1769                           Available backends: $trace_backend_list
1770  --with-trace-file=NAME   Full PATH,NAME of file to store traces
1771                           Default:trace-<pid>
1772  --disable-slirp          disable SLIRP userspace network connectivity
1773  --enable-tcg-interpreter enable TCI (TCG with bytecode interpreter, experimental and slow)
1774  --enable-malloc-trim     enable libc malloc_trim() for memory optimization
1775  --oss-lib                path to OSS library
1776  --cpu=CPU                Build for host CPU [$cpu]
1777  --with-coroutine=BACKEND coroutine backend. Supported options:
1778                           ucontext, sigaltstack, windows
1779  --enable-gcov            enable test coverage analysis with gcov
1780  --disable-blobs          disable installing provided firmware blobs
1781  --with-vss-sdk=SDK-path  enable Windows VSS support in QEMU Guest Agent
1782  --with-win-sdk=SDK-path  path to Windows Platform SDK (to build VSS .tlb)
1783  --tls-priority           default TLS protocol/cipher priority string
1784  --enable-gprof           QEMU profiling with gprof
1785  --enable-profiler        profiler support
1786  --enable-debug-stack-usage
1787                           track the maximum stack usage of stacks created by qemu_alloc_stack
1788  --enable-plugins
1789                           enable plugins via shared library loading
1790  --disable-containers     don't use containers for cross-building
1791  --gdb=GDB-path           gdb to use for gdbstub tests [$gdb_bin]
1792
1793Optional features, enabled with --enable-FEATURE and
1794disabled with --disable-FEATURE, default is enabled if available
1795(unless built with --without-default-features):
1796
1797  system          all system emulation targets
1798  user            supported user emulation targets
1799  linux-user      all linux usermode emulation targets
1800  bsd-user        all BSD usermode emulation targets
1801  docs            build documentation
1802  guest-agent     build the QEMU Guest Agent
1803  guest-agent-msi build guest agent Windows MSI installation package
1804  pie             Position Independent Executables
1805  modules         modules support (non-Windows)
1806  module-upgrades try to load modules from alternate paths for upgrades
1807  debug-tcg       TCG debugging (default is disabled)
1808  debug-info      debugging information
1809  lto             Enable Link-Time Optimization.
1810  sparse          sparse checker
1811  safe-stack      SafeStack Stack Smash Protection. Depends on
1812                  clang/llvm >= 3.7 and requires coroutine backend ucontext.
1813  cfi             Enable Control-Flow Integrity for indirect function calls.
1814                  In case of a cfi violation, QEMU is terminated with SIGILL
1815                  Depends on lto and is incompatible with modules
1816                  Automatically enables Link-Time Optimization (lto)
1817  cfi-debug       In case of a cfi violation, a message containing the line that
1818                  triggered the error is written to stderr. After the error,
1819                  QEMU is still terminated with SIGILL
1820  gnutls          GNUTLS cryptography support
1821  nettle          nettle cryptography support
1822  gcrypt          libgcrypt cryptography support
1823  auth-pam        PAM access control
1824  sdl             SDL UI
1825  sdl-image       SDL Image support for icons
1826  gtk             gtk UI
1827  vte             vte support for the gtk UI
1828  curses          curses UI
1829  iconv           font glyph conversion support
1830  vnc             VNC UI support
1831  vnc-sasl        SASL encryption for VNC server
1832  vnc-jpeg        JPEG lossy compression for VNC server
1833  vnc-png         PNG compression for VNC server
1834  cocoa           Cocoa UI (Mac OS X only)
1835  virtfs          VirtFS
1836  virtiofsd       build virtiofs daemon (virtiofsd)
1837  libudev         Use libudev to enumerate host devices
1838  mpath           Multipath persistent reservation passthrough
1839  xen             xen backend driver support
1840  xen-pci-passthrough    PCI passthrough support for Xen
1841  brlapi          BrlAPI (Braile)
1842  curl            curl connectivity
1843  membarrier      membarrier system call (for Linux 4.14+ or Windows)
1844  fdt             fdt device tree
1845  kvm             KVM acceleration support
1846  hax             HAX acceleration support
1847  hvf             Hypervisor.framework acceleration support
1848  whpx            Windows Hypervisor Platform acceleration support
1849  rdma            Enable RDMA-based migration
1850  pvrdma          Enable PVRDMA support
1851  vde             support for vde network
1852  netmap          support for netmap network
1853  linux-aio       Linux AIO support
1854  linux-io-uring  Linux io_uring support
1855  cap-ng          libcap-ng support
1856  attr            attr and xattr support
1857  vhost-net       vhost-net kernel acceleration support
1858  vhost-vsock     virtio sockets device support
1859  vhost-scsi      vhost-scsi kernel target support
1860  vhost-crypto    vhost-user-crypto backend support
1861  vhost-kernel    vhost kernel backend support
1862  vhost-user      vhost-user backend support
1863  vhost-user-blk-server    vhost-user-blk server support
1864  vhost-vdpa      vhost-vdpa kernel backend support
1865  spice           spice
1866  rbd             rados block device (rbd)
1867  libiscsi        iscsi support
1868  libnfs          nfs support
1869  smartcard       smartcard support (libcacard)
1870  u2f             U2F support (u2f-emu)
1871  libusb          libusb (for usb passthrough)
1872  live-block-migration   Block migration in the main migration stream
1873  usb-redir       usb network redirection support
1874  lzo             support of lzo compression library
1875  snappy          support of snappy compression library
1876  bzip2           support of bzip2 compression library
1877                  (for reading bzip2-compressed dmg images)
1878  lzfse           support of lzfse compression library
1879                  (for reading lzfse-compressed dmg images)
1880  zstd            support for zstd compression library
1881                  (for migration compression and qcow2 cluster compression)
1882  seccomp         seccomp support
1883  coroutine-pool  coroutine freelist (better performance)
1884  glusterfs       GlusterFS backend
1885  tpm             TPM support
1886  libssh          ssh block device support
1887  numa            libnuma support
1888  libxml2         for Parallels image format
1889  tcmalloc        tcmalloc support
1890  jemalloc        jemalloc support
1891  avx2            AVX2 optimization support
1892  avx512f         AVX512F optimization support
1893  replication     replication support
1894  opengl          opengl support
1895  virglrenderer   virgl rendering support
1896  xfsctl          xfsctl support
1897  qom-cast-debug  cast debugging support
1898  tools           build qemu-io, qemu-nbd and qemu-img tools
1899  bochs           bochs image format support
1900  cloop           cloop image format support
1901  dmg             dmg image format support
1902  qcow1           qcow v1 image format support
1903  vdi             vdi image format support
1904  vvfat           vvfat image format support
1905  qed             qed image format support
1906  parallels       parallels image format support
1907  sheepdog        sheepdog block driver support (deprecated)
1908  crypto-afalg    Linux AF_ALG crypto backend driver
1909  capstone        capstone disassembler support
1910  debug-mutex     mutex debugging support
1911  libpmem         libpmem support
1912  xkbcommon       xkbcommon support
1913  rng-none        dummy RNG, avoid using /dev/(u)random and getrandom()
1914  libdaxctl       libdaxctl support
1915  fuse            FUSE block device export
1916  fuse-lseek      SEEK_HOLE/SEEK_DATA support for FUSE exports
1917  multiprocess    Multiprocess QEMU support
1918
1919NOTE: The object files are built at the place where configure is launched
1920EOF
1921exit 0
1922fi
1923
1924# Remove old dependency files to make sure that they get properly regenerated
1925rm -f */config-devices.mak.d
1926
1927if test -z "$python"
1928then
1929    error_exit "Python not found. Use --python=/path/to/python"
1930fi
1931if ! has "$make"
1932then
1933    error_exit "GNU make ($make) not found"
1934fi
1935
1936# Note that if the Python conditional here evaluates True we will exit
1937# with status 1 which is a shell 'false' value.
1938if ! $python -c 'import sys; sys.exit(sys.version_info < (3,6))'; then
1939  error_exit "Cannot use '$python', Python >= 3.6 is required." \
1940      "Use --python=/path/to/python to specify a supported Python."
1941fi
1942
1943# Preserve python version since some functionality is dependent on it
1944python_version=$($python -c 'import sys; print("%d.%d.%d" % (sys.version_info[0], sys.version_info[1], sys.version_info[2]))' 2>/dev/null)
1945
1946# Suppress writing compiled files
1947python="$python -B"
1948
1949if test -z "$meson"; then
1950    if test "$explicit_python" = no && has meson && version_ge "$(meson --version)" 0.55.3; then
1951        meson=meson
1952    elif test $git_submodules_action != 'ignore' ; then
1953        meson=git
1954    elif test -e "${source_path}/meson/meson.py" ; then
1955        meson=internal
1956    else
1957        if test "$explicit_python" = yes; then
1958            error_exit "--python requires using QEMU's embedded Meson distribution, but it was not found."
1959        else
1960            error_exit "Meson not found.  Use --meson=/path/to/meson"
1961        fi
1962    fi
1963else
1964    # Meson uses its own Python interpreter to invoke other Python scripts,
1965    # but the user wants to use the one they specified with --python.
1966    #
1967    # We do not want to override the distro Python interpreter (and sometimes
1968    # cannot: for example in Homebrew /usr/bin/meson is a bash script), so
1969    # just require --meson=git|internal together with --python.
1970    if test "$explicit_python" = yes; then
1971        case "$meson" in
1972            git | internal) ;;
1973            *) error_exit "--python requires using QEMU's embedded Meson distribution." ;;
1974        esac
1975    fi
1976fi
1977
1978if test "$meson" = git; then
1979    git_submodules="${git_submodules} meson"
1980fi
1981
1982case "$meson" in
1983    git | internal)
1984        meson="$python ${source_path}/meson/meson.py"
1985        ;;
1986    *) meson=$(command -v "$meson") ;;
1987esac
1988
1989# Probe for ninja
1990
1991if test -z "$ninja"; then
1992    for c in ninja ninja-build samu; do
1993        if has $c; then
1994            ninja=$(command -v "$c")
1995            break
1996        fi
1997    done
1998    if test -z "$ninja"; then
1999      error_exit "Cannot find Ninja"
2000    fi
2001fi
2002
2003# Check that the C compiler works. Doing this here before testing
2004# the host CPU ensures that we had a valid CC to autodetect the
2005# $cpu var (and we should bail right here if that's not the case).
2006# It also allows the help message to be printed without a CC.
2007write_c_skeleton;
2008if compile_object ; then
2009  : C compiler works ok
2010else
2011    error_exit "\"$cc\" either does not exist or does not work"
2012fi
2013if ! compile_prog ; then
2014    error_exit "\"$cc\" cannot build an executable (is your linker broken?)"
2015fi
2016
2017# Consult white-list to determine whether to enable werror
2018# by default.  Only enable by default for git builds
2019if test -z "$werror" ; then
2020    if test "$git_submodules_action" != "ignore" && \
2021        { test "$linux" = "yes" || test "$mingw32" = "yes"; }; then
2022        werror="yes"
2023    else
2024        werror="no"
2025    fi
2026fi
2027
2028if test "$targetos" = "bogus"; then
2029    # Now that we know that we're not printing the help and that
2030    # the compiler works (so the results of the check_defines we used
2031    # to identify the OS are reliable), if we didn't recognize the
2032    # host OS we should stop now.
2033    error_exit "Unrecognized host OS (uname -s reports '$(uname -s)')"
2034fi
2035
2036# Check whether the compiler matches our minimum requirements:
2037cat > $TMPC << EOF
2038#if defined(__clang_major__) && defined(__clang_minor__)
2039# ifdef __apple_build_version__
2040#  if __clang_major__ < 5 || (__clang_major__ == 5 && __clang_minor__ < 1)
2041#   error You need at least XCode Clang v5.1 to compile QEMU
2042#  endif
2043# else
2044#  if __clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ < 4)
2045#   error You need at least Clang v3.4 to compile QEMU
2046#  endif
2047# endif
2048#elif defined(__GNUC__) && defined(__GNUC_MINOR__)
2049# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8)
2050#  error You need at least GCC v4.8 to compile QEMU
2051# endif
2052#else
2053# error You either need GCC or Clang to compiler QEMU
2054#endif
2055int main (void) { return 0; }
2056EOF
2057if ! compile_prog "" "" ; then
2058    error_exit "You need at least GCC v4.8 or Clang v3.4 (or XCode Clang v5.1)"
2059fi
2060
2061# Accumulate -Wfoo and -Wno-bar separately.
2062# We will list all of the enable flags first, and the disable flags second.
2063# Note that we do not add -Werror, because that would enable it for all
2064# configure tests. If a configure test failed due to -Werror this would
2065# just silently disable some features, so it's too error prone.
2066
2067warn_flags=
2068add_to warn_flags -Wold-style-declaration
2069add_to warn_flags -Wold-style-definition
2070add_to warn_flags -Wtype-limits
2071add_to warn_flags -Wformat-security
2072add_to warn_flags -Wformat-y2k
2073add_to warn_flags -Winit-self
2074add_to warn_flags -Wignored-qualifiers
2075add_to warn_flags -Wempty-body
2076add_to warn_flags -Wnested-externs
2077add_to warn_flags -Wendif-labels
2078add_to warn_flags -Wexpansion-to-defined
2079add_to warn_flags -Wimplicit-fallthrough=2
2080
2081nowarn_flags=
2082add_to nowarn_flags -Wno-initializer-overrides
2083add_to nowarn_flags -Wno-missing-include-dirs
2084add_to nowarn_flags -Wno-shift-negative-value
2085add_to nowarn_flags -Wno-string-plus-int
2086add_to nowarn_flags -Wno-typedef-redefinition
2087add_to nowarn_flags -Wno-tautological-type-limit-compare
2088add_to nowarn_flags -Wno-psabi
2089
2090gcc_flags="$warn_flags $nowarn_flags"
2091
2092cc_has_warning_flag() {
2093    write_c_skeleton;
2094
2095    # Use the positive sense of the flag when testing for -Wno-wombat
2096    # support (gcc will happily accept the -Wno- form of unknown
2097    # warning options).
2098    optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
2099    compile_prog "-Werror $optflag" ""
2100}
2101
2102for flag in $gcc_flags; do
2103    if cc_has_warning_flag $flag ; then
2104        QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2105    fi
2106done
2107
2108if test "$stack_protector" != "no"; then
2109  cat > $TMPC << EOF
2110int main(int argc, char *argv[])
2111{
2112    char arr[64], *p = arr, *c = argv[0];
2113    while (*c) {
2114        *p++ = *c++;
2115    }
2116    return 0;
2117}
2118EOF
2119  gcc_flags="-fstack-protector-strong -fstack-protector-all"
2120  sp_on=0
2121  for flag in $gcc_flags; do
2122    # We need to check both a compile and a link, since some compiler
2123    # setups fail only on a .c->.o compile and some only at link time
2124    if compile_object "-Werror $flag" &&
2125       compile_prog "-Werror $flag" ""; then
2126      QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2127      QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
2128      sp_on=1
2129      break
2130    fi
2131  done
2132  if test "$stack_protector" = yes; then
2133    if test $sp_on = 0; then
2134      error_exit "Stack protector not supported"
2135    fi
2136  fi
2137fi
2138
2139# Disable -Wmissing-braces on older compilers that warn even for
2140# the "universal" C zero initializer {0}.
2141cat > $TMPC << EOF
2142struct {
2143  int a[2];
2144} x = {0};
2145EOF
2146if compile_object "-Werror" "" ; then
2147  :
2148else
2149  QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces"
2150fi
2151
2152# Our module code doesn't support Windows
2153if test "$modules" = "yes" && test "$mingw32" = "yes" ; then
2154  error_exit "Modules are not available for Windows"
2155fi
2156
2157# module_upgrades is only reasonable if modules are enabled
2158if test "$modules" = "no" && test "$module_upgrades" = "yes" ; then
2159  error_exit "Can't enable module-upgrades as Modules are not enabled"
2160fi
2161
2162# Static linking is not possible with modules or PIE
2163if test "$static" = "yes" ; then
2164  if test "$modules" = "yes" ; then
2165    error_exit "static and modules are mutually incompatible"
2166  fi
2167fi
2168
2169# Unconditional check for compiler __thread support
2170  cat > $TMPC << EOF
2171static __thread int tls_var;
2172int main(void) { return tls_var; }
2173EOF
2174
2175if ! compile_prog "-Werror" "" ; then
2176    error_exit "Your compiler does not support the __thread specifier for " \
2177	"Thread-Local Storage (TLS). Please upgrade to a version that does."
2178fi
2179
2180cat > $TMPC << EOF
2181
2182#ifdef __linux__
2183#  define THREAD __thread
2184#else
2185#  define THREAD
2186#endif
2187static THREAD int tls_var;
2188int main(void) { return tls_var; }
2189EOF
2190
2191# Check we support --no-pie first; we will need this for building ROMs.
2192if compile_prog "-Werror -fno-pie" "-no-pie"; then
2193  CFLAGS_NOPIE="-fno-pie"
2194fi
2195
2196if test "$static" = "yes"; then
2197  if test "$pie" != "no" && compile_prog "-Werror -fPIE -DPIE" "-static-pie"; then
2198    CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
2199    QEMU_LDFLAGS="-static-pie $QEMU_LDFLAGS"
2200    pie="yes"
2201  elif test "$pie" = "yes"; then
2202    error_exit "-static-pie not available due to missing toolchain support"
2203  else
2204    QEMU_LDFLAGS="-static $QEMU_LDFLAGS"
2205    pie="no"
2206  fi
2207elif test "$pie" = "no"; then
2208  CONFIGURE_CFLAGS="$CFLAGS_NOPIE $CONFIGURE_CFLAGS"
2209elif compile_prog "-Werror -fPIE -DPIE" "-pie"; then
2210  CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
2211  CONFIGURE_LDFLAGS="-pie $CONFIGURE_LDFLAGS"
2212  pie="yes"
2213elif test "$pie" = "yes"; then
2214  error_exit "PIE not available due to missing toolchain support"
2215else
2216  echo "Disabling PIE due to missing toolchain support"
2217  pie="no"
2218fi
2219
2220# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
2221# The combination is known as "full relro", because .got.plt is read-only too.
2222if compile_prog "" "-Wl,-z,relro -Wl,-z,now" ; then
2223  QEMU_LDFLAGS="-Wl,-z,relro -Wl,-z,now $QEMU_LDFLAGS"
2224fi
2225
2226##########################################
2227# __sync_fetch_and_and requires at least -march=i486. Many toolchains
2228# use i686 as default anyway, but for those that don't, an explicit
2229# specification is necessary
2230
2231if test "$cpu" = "i386"; then
2232  cat > $TMPC << EOF
2233static int sfaa(int *ptr)
2234{
2235  return __sync_fetch_and_and(ptr, 0);
2236}
2237
2238int main(void)
2239{
2240  int val = 42;
2241  val = __sync_val_compare_and_swap(&val, 0, 1);
2242  sfaa(&val);
2243  return val;
2244}
2245EOF
2246  if ! compile_prog "" "" ; then
2247    QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS"
2248  fi
2249fi
2250
2251#########################################
2252# Solaris specific configure tool chain decisions
2253
2254if test "$solaris" = "yes" ; then
2255  if has ar; then
2256    :
2257  else
2258    if test -f /usr/ccs/bin/ar ; then
2259      error_exit "No path includes ar" \
2260          "Add /usr/ccs/bin to your path and rerun configure"
2261    fi
2262    error_exit "No path includes ar"
2263  fi
2264fi
2265
2266if test -z "${target_list+xxx}" ; then
2267    default_targets=yes
2268    for target in $default_target_list; do
2269        target_list="$target_list $target"
2270    done
2271    target_list="${target_list# }"
2272else
2273    default_targets=no
2274    target_list=$(echo "$target_list" | sed -e 's/,/ /g')
2275    for target in $target_list; do
2276        # Check that we recognised the target name; this allows a more
2277        # friendly error message than if we let it fall through.
2278        case " $default_target_list " in
2279            *" $target "*)
2280                ;;
2281            *)
2282                error_exit "Unknown target name '$target'"
2283                ;;
2284        esac
2285    done
2286fi
2287
2288for target in $target_list; do
2289    # if a deprecated target is enabled we note it here
2290    if echo "$deprecated_targets_list" | grep -q "$target"; then
2291        add_to deprecated_features $target
2292    fi
2293done
2294
2295# see if system emulation was really requested
2296case " $target_list " in
2297  *"-softmmu "*) softmmu=yes
2298  ;;
2299  *) softmmu=no
2300  ;;
2301esac
2302
2303feature_not_found() {
2304  feature=$1
2305  remedy=$2
2306
2307  error_exit "User requested feature $feature" \
2308      "configure was not able to find it." \
2309      "$remedy"
2310}
2311
2312# ---
2313# big/little endian test
2314cat > $TMPC << EOF
2315short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, };
2316short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, };
2317extern int foo(short *, short *);
2318int main(int argc, char *argv[]) {
2319    return foo(big_endian, little_endian);
2320}
2321EOF
2322
2323if compile_object ; then
2324    if strings -a $TMPO | grep -q BiGeNdIaN ; then
2325        bigendian="yes"
2326    elif strings -a $TMPO | grep -q LiTtLeEnDiAn ; then
2327        bigendian="no"
2328    else
2329        echo big/little test failed
2330    fi
2331else
2332    echo big/little test failed
2333fi
2334
2335##########################################
2336# system tools
2337if test -z "$want_tools"; then
2338    if test "$softmmu" = "no"; then
2339        want_tools=no
2340    else
2341        want_tools=yes
2342    fi
2343fi
2344
2345##########################################
2346# Disable features only meaningful for system-mode emulation
2347if test "$softmmu" = "no"; then
2348    audio_drv_list=""
2349fi
2350
2351##########################################
2352# Some versions of Mac OS X incorrectly define SIZE_MAX
2353cat > $TMPC << EOF
2354#include <stdint.h>
2355#include <stdio.h>
2356int main(int argc, char *argv[]) {
2357    return printf("%zu", SIZE_MAX);
2358}
2359EOF
2360have_broken_size_max=no
2361if ! compile_object -Werror ; then
2362    have_broken_size_max=yes
2363fi
2364
2365##########################################
2366# L2TPV3 probe
2367
2368cat > $TMPC <<EOF
2369#include <sys/socket.h>
2370#include <linux/ip.h>
2371int main(void) { return sizeof(struct mmsghdr); }
2372EOF
2373if compile_prog "" "" ; then
2374  l2tpv3=yes
2375else
2376  l2tpv3=no
2377fi
2378
2379cat > $TMPC <<EOF
2380#include <sys/mman.h>
2381int main(int argc, char *argv[]) {
2382    return mlockall(MCL_FUTURE);
2383}
2384EOF
2385if compile_prog "" "" ; then
2386  have_mlockall=yes
2387else
2388  have_mlockall=no
2389fi
2390
2391#########################################
2392# vhost interdependencies and host support
2393
2394# vhost backends
2395if test "$vhost_user" = "yes" && test "$linux" != "yes"; then
2396  error_exit "vhost-user is only available on Linux"
2397fi
2398test "$vhost_vdpa" = "" && vhost_vdpa=$linux
2399if test "$vhost_vdpa" = "yes" && test "$linux" != "yes"; then
2400  error_exit "vhost-vdpa is only available on Linux"
2401fi
2402test "$vhost_kernel" = "" && vhost_kernel=$linux
2403if test "$vhost_kernel" = "yes" && test "$linux" != "yes"; then
2404  error_exit "vhost-kernel is only available on Linux"
2405fi
2406
2407# vhost-kernel devices
2408test "$vhost_scsi" = "" && vhost_scsi=$vhost_kernel
2409if test "$vhost_scsi" = "yes" && test "$vhost_kernel" != "yes"; then
2410  error_exit "--enable-vhost-scsi requires --enable-vhost-kernel"
2411fi
2412test "$vhost_vsock" = "" && vhost_vsock=$vhost_kernel
2413if test "$vhost_vsock" = "yes" && test "$vhost_kernel" != "yes"; then
2414  error_exit "--enable-vhost-vsock requires --enable-vhost-kernel"
2415fi
2416
2417# vhost-user backends
2418test "$vhost_net_user" = "" && vhost_net_user=$vhost_user
2419if test "$vhost_net_user" = "yes" && test "$vhost_user" = "no"; then
2420  error_exit "--enable-vhost-net-user requires --enable-vhost-user"
2421fi
2422test "$vhost_crypto" = "" && vhost_crypto=$vhost_user
2423if test "$vhost_crypto" = "yes" && test "$vhost_user" = "no"; then
2424  error_exit "--enable-vhost-crypto requires --enable-vhost-user"
2425fi
2426test "$vhost_user_fs" = "" && vhost_user_fs=$vhost_user
2427if test "$vhost_user_fs" = "yes" && test "$vhost_user" = "no"; then
2428  error_exit "--enable-vhost-user-fs requires --enable-vhost-user"
2429fi
2430#vhost-vdpa backends
2431test "$vhost_net_vdpa" = "" && vhost_net_vdpa=$vhost_vdpa
2432if test "$vhost_net_vdpa" = "yes" && test "$vhost_vdpa" = "no"; then
2433  error_exit "--enable-vhost-net-vdpa requires --enable-vhost-vdpa"
2434fi
2435
2436# OR the vhost-kernel, vhost-vdpa and vhost-user values for simplicity
2437if test "$vhost_net" = ""; then
2438  test "$vhost_net_user" = "yes" && vhost_net=yes
2439  test "$vhost_net_vdpa" = "yes" && vhost_net=yes
2440  test "$vhost_kernel" = "yes" && vhost_net=yes
2441fi
2442
2443##########################################
2444# pkg-config probe
2445
2446if ! has "$pkg_config_exe"; then
2447  error_exit "pkg-config binary '$pkg_config_exe' not found"
2448fi
2449
2450##########################################
2451# NPTL probe
2452
2453if test "$linux_user" = "yes"; then
2454  cat > $TMPC <<EOF
2455#include <sched.h>
2456#include <linux/futex.h>
2457int main(void) {
2458#if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
2459#error bork
2460#endif
2461  return 0;
2462}
2463EOF
2464  if ! compile_object ; then
2465    feature_not_found "nptl" "Install glibc and linux kernel headers."
2466  fi
2467fi
2468
2469##########################################
2470# xen probe
2471
2472if test "$xen" != "disabled" ; then
2473  # Check whether Xen library path is specified via --extra-ldflags to avoid
2474  # overriding this setting with pkg-config output. If not, try pkg-config
2475  # to obtain all needed flags.
2476
2477  if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
2478     $pkg_config --exists xencontrol ; then
2479    xen_ctrl_version="$(printf '%d%02d%02d' \
2480      $($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
2481    xen=enabled
2482    xen_pc="xencontrol xenstore xenforeignmemory xengnttab"
2483    xen_pc="$xen_pc xenevtchn xendevicemodel"
2484    if $pkg_config --exists xentoolcore; then
2485      xen_pc="$xen_pc xentoolcore"
2486    fi
2487    xen_cflags="$($pkg_config --cflags $xen_pc)"
2488    xen_libs="$($pkg_config --libs $xen_pc)"
2489  else
2490
2491    xen_libs="-lxenstore -lxenctrl"
2492    xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
2493
2494    # First we test whether Xen headers and libraries are available.
2495    # If no, we are done and there is no Xen support.
2496    # If yes, more tests are run to detect the Xen version.
2497
2498    # Xen (any)
2499    cat > $TMPC <<EOF
2500#include <xenctrl.h>
2501int main(void) {
2502  return 0;
2503}
2504EOF
2505    if ! compile_prog "" "$xen_libs" ; then
2506      # Xen not found
2507      if test "$xen" = "enabled" ; then
2508        feature_not_found "xen" "Install xen devel"
2509      fi
2510      xen=disabled
2511
2512    # Xen unstable
2513    elif
2514        cat > $TMPC <<EOF &&
2515#undef XC_WANT_COMPAT_DEVICEMODEL_API
2516#define __XEN_TOOLS__
2517#include <xendevicemodel.h>
2518#include <xenforeignmemory.h>
2519int main(void) {
2520  xendevicemodel_handle *xd;
2521  xenforeignmemory_handle *xfmem;
2522
2523  xd = xendevicemodel_open(0, 0);
2524  xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
2525
2526  xfmem = xenforeignmemory_open(0, 0);
2527  xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
2528
2529  return 0;
2530}
2531EOF
2532        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2533      then
2534      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2535      xen_ctrl_version=41100
2536      xen=enabled
2537    elif
2538        cat > $TMPC <<EOF &&
2539#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2540#include <xenforeignmemory.h>
2541#include <xentoolcore.h>
2542int main(void) {
2543  xenforeignmemory_handle *xfmem;
2544
2545  xfmem = xenforeignmemory_open(0, 0);
2546  xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
2547  xentoolcore_restrict_all(0);
2548
2549  return 0;
2550}
2551EOF
2552        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2553      then
2554      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2555      xen_ctrl_version=41000
2556      xen=enabled
2557    elif
2558        cat > $TMPC <<EOF &&
2559#undef XC_WANT_COMPAT_DEVICEMODEL_API
2560#define __XEN_TOOLS__
2561#include <xendevicemodel.h>
2562int main(void) {
2563  xendevicemodel_handle *xd;
2564
2565  xd = xendevicemodel_open(0, 0);
2566  xendevicemodel_close(xd);
2567
2568  return 0;
2569}
2570EOF
2571        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
2572      then
2573      xen_stable_libs="-lxendevicemodel $xen_stable_libs"
2574      xen_ctrl_version=40900
2575      xen=enabled
2576    elif
2577        cat > $TMPC <<EOF &&
2578/*
2579 * If we have stable libs the we don't want the libxc compat
2580 * layers, regardless of what CFLAGS we may have been given.
2581 *
2582 * Also, check if xengnttab_grant_copy_segment_t is defined and
2583 * grant copy operation is implemented.
2584 */
2585#undef XC_WANT_COMPAT_EVTCHN_API
2586#undef XC_WANT_COMPAT_GNTTAB_API
2587#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2588#include <xenctrl.h>
2589#include <xenstore.h>
2590#include <xenevtchn.h>
2591#include <xengnttab.h>
2592#include <xenforeignmemory.h>
2593#include <stdint.h>
2594#include <xen/hvm/hvm_info_table.h>
2595#if !defined(HVM_MAX_VCPUS)
2596# error HVM_MAX_VCPUS not defined
2597#endif
2598int main(void) {
2599  xc_interface *xc = NULL;
2600  xenforeignmemory_handle *xfmem;
2601  xenevtchn_handle *xe;
2602  xengnttab_handle *xg;
2603  xengnttab_grant_copy_segment_t* seg = NULL;
2604
2605  xs_daemon_open();
2606
2607  xc = xc_interface_open(0, 0, 0);
2608  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2609  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2610  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2611  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2612
2613  xfmem = xenforeignmemory_open(0, 0);
2614  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2615
2616  xe = xenevtchn_open(0, 0);
2617  xenevtchn_fd(xe);
2618
2619  xg = xengnttab_open(0, 0);
2620  xengnttab_grant_copy(xg, 0, seg);
2621
2622  return 0;
2623}
2624EOF
2625        compile_prog "" "$xen_libs $xen_stable_libs"
2626      then
2627      xen_ctrl_version=40800
2628      xen=enabled
2629    elif
2630        cat > $TMPC <<EOF &&
2631/*
2632 * If we have stable libs the we don't want the libxc compat
2633 * layers, regardless of what CFLAGS we may have been given.
2634 */
2635#undef XC_WANT_COMPAT_EVTCHN_API
2636#undef XC_WANT_COMPAT_GNTTAB_API
2637#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2638#include <xenctrl.h>
2639#include <xenstore.h>
2640#include <xenevtchn.h>
2641#include <xengnttab.h>
2642#include <xenforeignmemory.h>
2643#include <stdint.h>
2644#include <xen/hvm/hvm_info_table.h>
2645#if !defined(HVM_MAX_VCPUS)
2646# error HVM_MAX_VCPUS not defined
2647#endif
2648int main(void) {
2649  xc_interface *xc = NULL;
2650  xenforeignmemory_handle *xfmem;
2651  xenevtchn_handle *xe;
2652  xengnttab_handle *xg;
2653
2654  xs_daemon_open();
2655
2656  xc = xc_interface_open(0, 0, 0);
2657  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2658  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2659  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2660  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2661
2662  xfmem = xenforeignmemory_open(0, 0);
2663  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2664
2665  xe = xenevtchn_open(0, 0);
2666  xenevtchn_fd(xe);
2667
2668  xg = xengnttab_open(0, 0);
2669  xengnttab_map_grant_ref(xg, 0, 0, 0);
2670
2671  return 0;
2672}
2673EOF
2674        compile_prog "" "$xen_libs $xen_stable_libs"
2675      then
2676      xen_ctrl_version=40701
2677      xen=enabled
2678
2679    # Xen 4.6
2680    elif
2681        cat > $TMPC <<EOF &&
2682#include <xenctrl.h>
2683#include <xenstore.h>
2684#include <stdint.h>
2685#include <xen/hvm/hvm_info_table.h>
2686#if !defined(HVM_MAX_VCPUS)
2687# error HVM_MAX_VCPUS not defined
2688#endif
2689int main(void) {
2690  xc_interface *xc;
2691  xs_daemon_open();
2692  xc = xc_interface_open(0, 0, 0);
2693  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2694  xc_gnttab_open(NULL, 0);
2695  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2696  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2697  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2698  xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
2699  return 0;
2700}
2701EOF
2702        compile_prog "" "$xen_libs"
2703      then
2704      xen_ctrl_version=40600
2705      xen=enabled
2706
2707    # Xen 4.5
2708    elif
2709        cat > $TMPC <<EOF &&
2710#include <xenctrl.h>
2711#include <xenstore.h>
2712#include <stdint.h>
2713#include <xen/hvm/hvm_info_table.h>
2714#if !defined(HVM_MAX_VCPUS)
2715# error HVM_MAX_VCPUS not defined
2716#endif
2717int main(void) {
2718  xc_interface *xc;
2719  xs_daemon_open();
2720  xc = xc_interface_open(0, 0, 0);
2721  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2722  xc_gnttab_open(NULL, 0);
2723  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2724  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2725  xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
2726  return 0;
2727}
2728EOF
2729        compile_prog "" "$xen_libs"
2730      then
2731      xen_ctrl_version=40500
2732      xen=enabled
2733
2734    elif
2735        cat > $TMPC <<EOF &&
2736#include <xenctrl.h>
2737#include <xenstore.h>
2738#include <stdint.h>
2739#include <xen/hvm/hvm_info_table.h>
2740#if !defined(HVM_MAX_VCPUS)
2741# error HVM_MAX_VCPUS not defined
2742#endif
2743int main(void) {
2744  xc_interface *xc;
2745  xs_daemon_open();
2746  xc = xc_interface_open(0, 0, 0);
2747  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2748  xc_gnttab_open(NULL, 0);
2749  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2750  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2751  return 0;
2752}
2753EOF
2754        compile_prog "" "$xen_libs"
2755      then
2756      xen_ctrl_version=40200
2757      xen=enabled
2758
2759    else
2760      if test "$xen" = "enabled" ; then
2761        feature_not_found "xen (unsupported version)" \
2762                          "Install a supported xen (xen 4.2 or newer)"
2763      fi
2764      xen=disabled
2765    fi
2766
2767    if test "$xen" = enabled; then
2768      if test $xen_ctrl_version -ge 40701  ; then
2769        xen_libs="$xen_libs $xen_stable_libs "
2770      fi
2771    fi
2772  fi
2773fi
2774
2775##########################################
2776# GNUTLS probe
2777
2778if test "$gnutls" != "no"; then
2779    pass="no"
2780    if $pkg_config --exists "gnutls >= 3.1.18"; then
2781        gnutls_cflags=$($pkg_config --cflags gnutls)
2782        gnutls_libs=$($pkg_config --libs gnutls)
2783        # Packaging for the static libraries is not always correct.
2784        # At least ubuntu 18.04 ships only shared libraries.
2785        write_c_skeleton
2786        if compile_prog "" "$gnutls_libs" ; then
2787            pass="yes"
2788        fi
2789    fi
2790    if test "$pass" = "no" && test "$gnutls" = "yes"; then
2791	feature_not_found "gnutls" "Install gnutls devel >= 3.1.18"
2792    else
2793        gnutls="$pass"
2794    fi
2795fi
2796
2797
2798# If user didn't give a --disable/enable-gcrypt flag,
2799# then mark as disabled if user requested nettle
2800# explicitly
2801if test -z "$gcrypt"
2802then
2803    if test "$nettle" = "yes"
2804    then
2805        gcrypt="no"
2806    fi
2807fi
2808
2809# If user didn't give a --disable/enable-nettle flag,
2810# then mark as disabled if user requested gcrypt
2811# explicitly
2812if test -z "$nettle"
2813then
2814    if test "$gcrypt" = "yes"
2815    then
2816        nettle="no"
2817    fi
2818fi
2819
2820has_libgcrypt() {
2821    if ! has "libgcrypt-config"
2822    then
2823	return 1
2824    fi
2825
2826    if test -n "$cross_prefix"
2827    then
2828	host=$(libgcrypt-config --host)
2829	if test "$host-" != $cross_prefix
2830	then
2831	    return 1
2832	fi
2833    fi
2834
2835    maj=`libgcrypt-config --version | awk -F . '{print $1}'`
2836    min=`libgcrypt-config --version | awk -F . '{print $2}'`
2837
2838    if test $maj != 1 || test $min -lt 5
2839    then
2840       return 1
2841    fi
2842
2843    return 0
2844}
2845
2846
2847if test "$nettle" != "no"; then
2848    pass="no"
2849    if $pkg_config --exists "nettle >= 2.7.1"; then
2850        nettle_cflags=$($pkg_config --cflags nettle)
2851        nettle_libs=$($pkg_config --libs nettle)
2852        nettle_version=$($pkg_config --modversion nettle)
2853        # Link test to make sure the given libraries work (e.g for static).
2854        write_c_skeleton
2855        if compile_prog "" "$nettle_libs" ; then
2856            if test -z "$gcrypt"; then
2857               gcrypt="no"
2858            fi
2859            pass="yes"
2860        fi
2861    fi
2862    if test "$pass" = "yes"
2863    then
2864        cat > $TMPC << EOF
2865#include <nettle/xts.h>
2866int main(void) {
2867  return 0;
2868}
2869EOF
2870        if compile_prog "$nettle_cflags" "$nettle_libs" ; then
2871            nettle_xts=yes
2872            qemu_private_xts=no
2873        fi
2874    fi
2875    if test "$pass" = "no" && test "$nettle" = "yes"; then
2876        feature_not_found "nettle" "Install nettle devel >= 2.7.1"
2877    else
2878        nettle="$pass"
2879    fi
2880fi
2881
2882if test "$gcrypt" != "no"; then
2883    pass="no"
2884    if has_libgcrypt; then
2885        gcrypt_cflags=$(libgcrypt-config --cflags)
2886        gcrypt_libs=$(libgcrypt-config --libs)
2887        # Debian has removed -lgpg-error from libgcrypt-config
2888        # as it "spreads unnecessary dependencies" which in
2889        # turn breaks static builds...
2890        if test "$static" = "yes"
2891        then
2892            gcrypt_libs="$gcrypt_libs -lgpg-error"
2893        fi
2894
2895        # Link test to make sure the given libraries work (e.g for static).
2896        write_c_skeleton
2897        if compile_prog "" "$gcrypt_libs" ; then
2898            pass="yes"
2899        fi
2900    fi
2901    if test "$pass" = "yes"; then
2902        gcrypt="yes"
2903        cat > $TMPC << EOF
2904#include <gcrypt.h>
2905int main(void) {
2906  gcry_mac_hd_t handle;
2907  gcry_mac_open(&handle, GCRY_MAC_HMAC_MD5,
2908                GCRY_MAC_FLAG_SECURE, NULL);
2909  return 0;
2910}
2911EOF
2912        if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
2913            gcrypt_hmac=yes
2914        fi
2915        cat > $TMPC << EOF
2916#include <gcrypt.h>
2917int main(void) {
2918  gcry_cipher_hd_t handle;
2919  gcry_cipher_open(&handle, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_XTS, 0);
2920  return 0;
2921}
2922EOF
2923        if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
2924            gcrypt_xts=yes
2925            qemu_private_xts=no
2926        fi
2927    elif test "$gcrypt" = "yes"; then
2928        feature_not_found "gcrypt" "Install gcrypt devel >= 1.5.0"
2929    else
2930        gcrypt="no"
2931    fi
2932fi
2933
2934
2935if test "$gcrypt" = "yes" && test "$nettle" = "yes"
2936then
2937    error_exit "Only one of gcrypt & nettle can be enabled"
2938fi
2939
2940##########################################
2941# libtasn1 - only for the TLS creds/session test suite
2942
2943tasn1=yes
2944tasn1_cflags=""
2945tasn1_libs=""
2946if $pkg_config --exists "libtasn1"; then
2947    tasn1_cflags=$($pkg_config --cflags libtasn1)
2948    tasn1_libs=$($pkg_config --libs libtasn1)
2949else
2950    tasn1=no
2951fi
2952
2953
2954##########################################
2955# PAM probe
2956
2957if test "$auth_pam" != "no"; then
2958    cat > $TMPC <<EOF
2959#include <security/pam_appl.h>
2960#include <stdio.h>
2961int main(void) {
2962   const char *service_name = "qemu";
2963   const char *user = "frank";
2964   const struct pam_conv pam_conv = { 0 };
2965   pam_handle_t *pamh = NULL;
2966   pam_start(service_name, user, &pam_conv, &pamh);
2967   return 0;
2968}
2969EOF
2970    if compile_prog "" "-lpam" ; then
2971        auth_pam=yes
2972    else
2973        if test "$auth_pam" = "yes"; then
2974            feature_not_found "PAM" "Install PAM development package"
2975        else
2976            auth_pam=no
2977        fi
2978    fi
2979fi
2980
2981##########################################
2982# VTE probe
2983
2984if test "$vte" != "no"; then
2985    vteminversion="0.32.0"
2986    if $pkg_config --exists "vte-2.91"; then
2987      vtepackage="vte-2.91"
2988    else
2989      vtepackage="vte-2.90"
2990    fi
2991    if $pkg_config --exists "$vtepackage >= $vteminversion"; then
2992        vte_cflags=$($pkg_config --cflags $vtepackage)
2993        vte_libs=$($pkg_config --libs $vtepackage)
2994        vteversion=$($pkg_config --modversion $vtepackage)
2995        vte="yes"
2996    elif test "$vte" = "yes"; then
2997        feature_not_found "vte" "Install libvte-2.90/2.91 devel"
2998    else
2999        vte="no"
3000    fi
3001fi
3002
3003##########################################
3004# RDMA needs OpenFabrics libraries
3005if test "$rdma" != "no" ; then
3006  cat > $TMPC <<EOF
3007#include <rdma/rdma_cma.h>
3008int main(void) { return 0; }
3009EOF
3010  rdma_libs="-lrdmacm -libverbs -libumad"
3011  if compile_prog "" "$rdma_libs" ; then
3012    rdma="yes"
3013  else
3014    if test "$rdma" = "yes" ; then
3015        error_exit \
3016            " OpenFabrics librdmacm/libibverbs/libibumad not present." \
3017            " Your options:" \
3018            "  (1) Fast: Install infiniband packages (devel) from your distro." \
3019            "  (2) Cleanest: Install libraries from www.openfabrics.org" \
3020            "  (3) Also: Install softiwarp if you don't have RDMA hardware"
3021    fi
3022    rdma="no"
3023  fi
3024fi
3025
3026##########################################
3027# PVRDMA detection
3028
3029cat > $TMPC <<EOF &&
3030#include <sys/mman.h>
3031
3032int
3033main(void)
3034{
3035    char buf = 0;
3036    void *addr = &buf;
3037    addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
3038
3039    return 0;
3040}
3041EOF
3042
3043if test "$rdma" = "yes" ; then
3044    case "$pvrdma" in
3045    "")
3046        if compile_prog "" ""; then
3047            pvrdma="yes"
3048        else
3049            pvrdma="no"
3050        fi
3051        ;;
3052    "yes")
3053        if ! compile_prog "" ""; then
3054            error_exit "PVRDMA is not supported since mremap is not implemented"
3055        fi
3056        pvrdma="yes"
3057        ;;
3058    "no")
3059        pvrdma="no"
3060        ;;
3061    esac
3062else
3063    if test "$pvrdma" = "yes" ; then
3064        error_exit "PVRDMA requires rdma suppport"
3065    fi
3066    pvrdma="no"
3067fi
3068
3069# Let's see if enhanced reg_mr is supported
3070if test "$pvrdma" = "yes" ; then
3071
3072cat > $TMPC <<EOF &&
3073#include <infiniband/verbs.h>
3074
3075int
3076main(void)
3077{
3078    struct ibv_mr *mr;
3079    struct ibv_pd *pd = NULL;
3080    size_t length = 10;
3081    uint64_t iova = 0;
3082    int access = 0;
3083    void *addr = NULL;
3084
3085    mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
3086
3087    ibv_dereg_mr(mr);
3088
3089    return 0;
3090}
3091EOF
3092    if ! compile_prog "" "-libverbs"; then
3093        QEMU_CFLAGS="$QEMU_CFLAGS -DLEGACY_RDMA_REG_MR"
3094    fi
3095fi
3096
3097##########################################
3098# xfsctl() probe, used for file-posix.c
3099if test "$xfs" != "no" ; then
3100  cat > $TMPC << EOF
3101#include <stddef.h>  /* NULL */
3102#include <xfs/xfs.h>
3103int main(void)
3104{
3105    xfsctl(NULL, 0, 0, NULL);
3106    return 0;
3107}
3108EOF
3109  if compile_prog "" "" ; then
3110    xfs="yes"
3111  else
3112    if test "$xfs" = "yes" ; then
3113      feature_not_found "xfs" "Install xfsprogs/xfslibs devel"
3114    fi
3115    xfs=no
3116  fi
3117fi
3118
3119##########################################
3120# vde libraries probe
3121if test "$vde" != "no" ; then
3122  vde_libs="-lvdeplug"
3123  cat > $TMPC << EOF
3124#include <libvdeplug.h>
3125int main(void)
3126{
3127    struct vde_open_args a = {0, 0, 0};
3128    char s[] = "";
3129    vde_open(s, s, &a);
3130    return 0;
3131}
3132EOF
3133  if compile_prog "" "$vde_libs" ; then
3134    vde=yes
3135  else
3136    if test "$vde" = "yes" ; then
3137      feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
3138    fi
3139    vde=no
3140  fi
3141fi
3142
3143##########################################
3144# netmap support probe
3145# Apart from looking for netmap headers, we make sure that the host API version
3146# supports the netmap backend (>=11). The upper bound (15) is meant to simulate
3147# a minor/major version number. Minor new features will be marked with values up
3148# to 15, and if something happens that requires a change to the backend we will
3149# move above 15, submit the backend fixes and modify this two bounds.
3150if test "$netmap" != "no" ; then
3151  cat > $TMPC << EOF
3152#include <inttypes.h>
3153#include <net/if.h>
3154#include <net/netmap.h>
3155#include <net/netmap_user.h>
3156#if (NETMAP_API < 11) || (NETMAP_API > 15)
3157#error
3158#endif
3159int main(void) { return 0; }
3160EOF
3161  if compile_prog "" "" ; then
3162    netmap=yes
3163  else
3164    if test "$netmap" = "yes" ; then
3165      feature_not_found "netmap"
3166    fi
3167    netmap=no
3168  fi
3169fi
3170
3171##########################################
3172# detect CoreAudio
3173if test "$coreaudio" != "no" ; then
3174  coreaudio_libs="-framework CoreAudio"
3175  cat > $TMPC << EOF
3176#include <CoreAudio/CoreAudio.h>
3177int main(void)
3178{
3179  return (int)AudioGetCurrentHostTime();
3180}
3181EOF
3182  if compile_prog "" "$coreaudio_libs" ; then
3183    coreaudio=yes
3184  else
3185    coreaudio=no
3186  fi
3187fi
3188
3189##########################################
3190# Sound support libraries probe
3191
3192audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
3193for drv in $audio_drv_list; do
3194    case $drv in
3195    alsa | try-alsa)
3196    if $pkg_config alsa --exists; then
3197        alsa_libs=$($pkg_config alsa --libs)
3198        alsa_cflags=$($pkg_config alsa --cflags)
3199        alsa=yes
3200        if test "$drv" = "try-alsa"; then
3201            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa/alsa/')
3202        fi
3203    else
3204        if test "$drv" = "try-alsa"; then
3205            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa//')
3206        else
3207            error_exit "$drv check failed" \
3208                "Make sure to have the $drv libs and headers installed."
3209        fi
3210    fi
3211    ;;
3212
3213    pa | try-pa)
3214    if $pkg_config libpulse --exists; then
3215        libpulse=yes
3216        pulse_libs=$($pkg_config libpulse --libs)
3217        pulse_cflags=$($pkg_config libpulse --cflags)
3218        if test "$drv" = "try-pa"; then
3219            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa/pa/')
3220        fi
3221    else
3222        if test "$drv" = "try-pa"; then
3223            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa//')
3224        else
3225            error_exit "$drv check failed" \
3226                "Make sure to have the $drv libs and headers installed."
3227        fi
3228    fi
3229    ;;
3230
3231    sdl)
3232    if test "$sdl" = "no"; then
3233        error_exit "sdl not found or disabled, can not use sdl audio driver"
3234    fi
3235    ;;
3236
3237    try-sdl)
3238    if test "$sdl" = "no"; then
3239        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl//')
3240    else
3241        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl/sdl/')
3242    fi
3243    ;;
3244
3245    coreaudio | try-coreaudio)
3246    if test "$coreaudio" = "no"; then
3247      if test "$drv" = "try-coreaudio"; then
3248        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-coreaudio//')
3249      else
3250        error_exit "$drv check failed" \
3251                "Make sure to have the $drv is available."
3252      fi
3253    else
3254      coreaudio_libs="-framework CoreAudio"
3255      if test "$drv" = "try-coreaudio"; then
3256        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-coreaudio/coreaudio/')
3257      fi
3258    fi
3259    ;;
3260
3261    dsound)
3262      dsound_libs="-lole32 -ldxguid"
3263      audio_win_int="yes"
3264    ;;
3265
3266    oss)
3267      oss_libs="$oss_lib"
3268    ;;
3269
3270    jack | try-jack)
3271    if $pkg_config jack --exists; then
3272        libjack=yes
3273        jack_libs=$($pkg_config jack --libs)
3274        if test "$drv" = "try-jack"; then
3275            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack/jack/')
3276        fi
3277    else
3278        if test "$drv" = "try-jack"; then
3279            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack//')
3280        else
3281            error_exit "$drv check failed" \
3282                "Make sure to have the $drv libs and headers installed."
3283        fi
3284    fi
3285    ;;
3286
3287    *)
3288    echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
3289        error_exit "Unknown driver '$drv' selected" \
3290            "Possible drivers are: $audio_possible_drivers"
3291    }
3292    ;;
3293    esac
3294done
3295
3296##########################################
3297# glib support probe
3298
3299glib_req_ver=2.48
3300glib_modules=gthread-2.0
3301if test "$modules" = yes; then
3302    glib_modules="$glib_modules gmodule-export-2.0"
3303fi
3304if test "$plugins" = yes; then
3305    glib_modules="$glib_modules gmodule-2.0"
3306fi
3307
3308for i in $glib_modules; do
3309    if $pkg_config --atleast-version=$glib_req_ver $i; then
3310        glib_cflags=$($pkg_config --cflags $i)
3311        glib_libs=$($pkg_config --libs $i)
3312    else
3313        error_exit "glib-$glib_req_ver $i is required to compile QEMU"
3314    fi
3315done
3316
3317# This workaround is required due to a bug in pkg-config file for glib as it
3318# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
3319
3320if test "$static" = yes && test "$mingw32" = yes; then
3321    glib_cflags="-DGLIB_STATIC_COMPILATION $glib_cflags"
3322fi
3323
3324if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
3325    gio_cflags=$($pkg_config --cflags gio-2.0)
3326    gio_libs=$($pkg_config --libs gio-2.0)
3327    gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
3328    if [ ! -x "$gdbus_codegen" ]; then
3329        gdbus_codegen=
3330    fi
3331    # Check that the libraries actually work -- Ubuntu 18.04 ships
3332    # with pkg-config --static --libs data for gio-2.0 that is missing
3333    # -lblkid and will give a link error.
3334    cat > $TMPC <<EOF
3335#include <gio/gio.h>
3336int main(void)
3337{
3338    g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
3339    return 0;
3340}
3341EOF
3342    if compile_prog "$gio_cflags" "$gio_libs" ; then
3343        gio=yes
3344    else
3345        gio=no
3346    fi
3347else
3348    gio=no
3349fi
3350
3351if $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
3352    gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
3353    gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
3354fi
3355
3356# Sanity check that the current size_t matches the
3357# size that glib thinks it should be. This catches
3358# problems on multi-arch where people try to build
3359# 32-bit QEMU while pointing at 64-bit glib headers
3360cat > $TMPC <<EOF
3361#include <glib.h>
3362#include <unistd.h>
3363
3364#define QEMU_BUILD_BUG_ON(x) \
3365  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
3366
3367int main(void) {
3368   QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
3369   return 0;
3370}
3371EOF
3372
3373if ! compile_prog "$glib_cflags" "$glib_libs" ; then
3374    error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
3375               "You probably need to set PKG_CONFIG_LIBDIR"\
3376	       "to point to the right pkg-config files for your"\
3377	       "build target"
3378fi
3379
3380# Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
3381cat > $TMPC << EOF
3382#include <glib.h>
3383int main(void) { return 0; }
3384EOF
3385if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3386    if cc_has_warning_flag "-Wno-unknown-attributes"; then
3387        glib_cflags="-Wno-unknown-attributes $glib_cflags"
3388        CONFIGURE_CFLAGS="-Wno-unknown-attributes $CONFIGURE_CFLAGS"
3389    fi
3390fi
3391
3392# Silence clang warnings triggered by glib < 2.57.2
3393cat > $TMPC << EOF
3394#include <glib.h>
3395typedef struct Foo {
3396    int i;
3397} Foo;
3398static void foo_free(Foo *f)
3399{
3400    g_free(f);
3401}
3402G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free);
3403int main(void) { return 0; }
3404EOF
3405if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3406    if cc_has_warning_flag "-Wno-unused-function"; then
3407        glib_cflags="$glib_cflags -Wno-unused-function"
3408        CONFIGURE_CFLAGS="$CONFIGURE_CFLAGS -Wno-unused-function"
3409    fi
3410fi
3411
3412##########################################
3413# SHA command probe for modules
3414if test "$modules" = yes; then
3415    shacmd_probe="sha1sum sha1 shasum"
3416    for c in $shacmd_probe; do
3417        if has $c; then
3418            shacmd="$c"
3419            break
3420        fi
3421    done
3422    if test "$shacmd" = ""; then
3423        error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
3424    fi
3425fi
3426
3427##########################################
3428# pthread probe
3429PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
3430
3431pthread=no
3432cat > $TMPC << EOF
3433#include <pthread.h>
3434static void *f(void *p) { return NULL; }
3435int main(void) {
3436  pthread_t thread;
3437  pthread_create(&thread, 0, f, 0);
3438  return 0;
3439}
3440EOF
3441if compile_prog "" "" ; then
3442  pthread=yes
3443else
3444  for pthread_lib in $PTHREADLIBS_LIST; do
3445    if compile_prog "" "$pthread_lib" ; then
3446      pthread=yes
3447      break
3448    fi
3449  done
3450fi
3451
3452if test "$mingw32" != yes && test "$pthread" = no; then
3453  error_exit "pthread check failed" \
3454      "Make sure to have the pthread libs and headers installed."
3455fi
3456
3457# check for pthread_setname_np with thread id
3458pthread_setname_np_w_tid=no
3459cat > $TMPC << EOF
3460#include <pthread.h>
3461
3462static void *f(void *p) { return NULL; }
3463int main(void)
3464{
3465    pthread_t thread;
3466    pthread_create(&thread, 0, f, 0);
3467    pthread_setname_np(thread, "QEMU");
3468    return 0;
3469}
3470EOF
3471if compile_prog "" "$pthread_lib" ; then
3472  pthread_setname_np_w_tid=yes
3473fi
3474
3475# check for pthread_setname_np without thread id
3476pthread_setname_np_wo_tid=no
3477cat > $TMPC << EOF
3478#include <pthread.h>
3479
3480static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
3481int main(void)
3482{
3483    pthread_t thread;
3484    pthread_create(&thread, 0, f, 0);
3485    return 0;
3486}
3487EOF
3488if compile_prog "" "$pthread_lib" ; then
3489  pthread_setname_np_wo_tid=yes
3490fi
3491
3492##########################################
3493# libssh probe
3494if test "$libssh" != "no" ; then
3495  if $pkg_config --exists libssh; then
3496    libssh_cflags=$($pkg_config libssh --cflags)
3497    libssh_libs=$($pkg_config libssh --libs)
3498    libssh=yes
3499  else
3500    if test "$libssh" = "yes" ; then
3501      error_exit "libssh required for --enable-libssh"
3502    fi
3503    libssh=no
3504  fi
3505fi
3506
3507##########################################
3508# Check for libssh 0.8
3509# This is done like this instead of using the LIBSSH_VERSION_* and
3510# SSH_VERSION_* macros because some distributions in the past shipped
3511# snapshots of the future 0.8 from Git, and those snapshots did not
3512# have updated version numbers (still referring to 0.7.0).
3513
3514if test "$libssh" = "yes"; then
3515  cat > $TMPC <<EOF
3516#include <libssh/libssh.h>
3517int main(void) { return ssh_get_server_publickey(NULL, NULL); }
3518EOF
3519  if compile_prog "$libssh_cflags" "$libssh_libs"; then
3520    libssh_cflags="-DHAVE_LIBSSH_0_8 $libssh_cflags"
3521  fi
3522fi
3523
3524##########################################
3525# linux-aio probe
3526
3527if test "$linux_aio" != "no" ; then
3528  cat > $TMPC <<EOF
3529#include <libaio.h>
3530#include <sys/eventfd.h>
3531#include <stddef.h>
3532int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
3533EOF
3534  if compile_prog "" "-laio" ; then
3535    linux_aio=yes
3536  else
3537    if test "$linux_aio" = "yes" ; then
3538      feature_not_found "linux AIO" "Install libaio devel"
3539    fi
3540    linux_aio=no
3541  fi
3542fi
3543##########################################
3544# linux-io-uring probe
3545
3546if test "$linux_io_uring" != "no" ; then
3547  if $pkg_config liburing; then
3548    linux_io_uring_cflags=$($pkg_config --cflags liburing)
3549    linux_io_uring_libs=$($pkg_config --libs liburing)
3550    linux_io_uring=yes
3551  else
3552    if test "$linux_io_uring" = "yes" ; then
3553      feature_not_found "linux io_uring" "Install liburing devel"
3554    fi
3555    linux_io_uring=no
3556  fi
3557fi
3558
3559##########################################
3560# TPM emulation is only on POSIX
3561
3562if test "$tpm" = ""; then
3563  if test "$mingw32" = "yes"; then
3564    tpm=no
3565  else
3566    tpm=yes
3567  fi
3568elif test "$tpm" = "yes"; then
3569  if test "$mingw32" = "yes" ; then
3570    error_exit "TPM emulation only available on POSIX systems"
3571  fi
3572fi
3573
3574##########################################
3575# iovec probe
3576cat > $TMPC <<EOF
3577#include <sys/types.h>
3578#include <sys/uio.h>
3579#include <unistd.h>
3580int main(void) { return sizeof(struct iovec); }
3581EOF
3582iovec=no
3583if compile_prog "" "" ; then
3584  iovec=yes
3585fi
3586
3587##########################################
3588# fdt probe
3589
3590case "$fdt" in
3591  auto | enabled | internal)
3592    # Simpler to always update submodule, even if not needed.
3593    if test "$git_submodules_action" != "ignore"; then
3594      git_submodules="${git_submodules} dtc"
3595    fi
3596    ;;
3597esac
3598
3599##########################################
3600# opengl probe (for sdl2, gtk, milkymist-tmu2)
3601
3602gbm="no"
3603if $pkg_config gbm; then
3604    gbm_cflags="$($pkg_config --cflags gbm)"
3605    gbm_libs="$($pkg_config --libs gbm)"
3606    gbm="yes"
3607fi
3608
3609if test "$opengl" != "no" ; then
3610  opengl_pkgs="epoxy gbm"
3611  if $pkg_config $opengl_pkgs; then
3612    opengl_cflags="$($pkg_config --cflags $opengl_pkgs)"
3613    opengl_libs="$($pkg_config --libs $opengl_pkgs)"
3614    opengl=yes
3615  else
3616    if test "$opengl" = "yes" ; then
3617      feature_not_found "opengl" "Please install opengl (mesa) devel pkgs: $opengl_pkgs"
3618    fi
3619    opengl_cflags=""
3620    opengl_libs=""
3621    opengl=no
3622  fi
3623fi
3624
3625if test "$opengl" = "yes"; then
3626  cat > $TMPC << EOF
3627#include <epoxy/egl.h>
3628#ifndef EGL_MESA_image_dma_buf_export
3629# error mesa/epoxy lacks support for dmabufs (mesa 10.6+)
3630#endif
3631int main(void) { return 0; }
3632EOF
3633  if compile_prog "" "" ; then
3634    opengl_dmabuf=yes
3635  fi
3636fi
3637
3638##########################################
3639# libxml2 probe
3640if test "$libxml2" != "no" ; then
3641    if $pkg_config --exists libxml-2.0; then
3642        libxml2="yes"
3643        libxml2_cflags=$($pkg_config --cflags libxml-2.0)
3644        libxml2_libs=$($pkg_config --libs libxml-2.0)
3645    else
3646        if test "$libxml2" = "yes"; then
3647            feature_not_found "libxml2" "Install libxml2 devel"
3648        fi
3649        libxml2="no"
3650    fi
3651fi
3652
3653# Check for inotify functions when we are building linux-user
3654# emulator.  This is done because older glibc versions don't
3655# have syscall stubs for these implemented.  In that case we
3656# don't provide them even if kernel supports them.
3657#
3658inotify=no
3659cat > $TMPC << EOF
3660#include <sys/inotify.h>
3661
3662int
3663main(void)
3664{
3665	/* try to start inotify */
3666	return inotify_init();
3667}
3668EOF
3669if compile_prog "" "" ; then
3670  inotify=yes
3671fi
3672
3673inotify1=no
3674cat > $TMPC << EOF
3675#include <sys/inotify.h>
3676
3677int
3678main(void)
3679{
3680    /* try to start inotify */
3681    return inotify_init1(0);
3682}
3683EOF
3684if compile_prog "" "" ; then
3685  inotify1=yes
3686fi
3687
3688# check if pipe2 is there
3689pipe2=no
3690cat > $TMPC << EOF
3691#include <unistd.h>
3692#include <fcntl.h>
3693
3694int main(void)
3695{
3696    int pipefd[2];
3697    return pipe2(pipefd, O_CLOEXEC);
3698}
3699EOF
3700if compile_prog "" "" ; then
3701  pipe2=yes
3702fi
3703
3704# check if accept4 is there
3705accept4=no
3706cat > $TMPC << EOF
3707#include <sys/socket.h>
3708#include <stddef.h>
3709
3710int main(void)
3711{
3712    accept4(0, NULL, NULL, SOCK_CLOEXEC);
3713    return 0;
3714}
3715EOF
3716if compile_prog "" "" ; then
3717  accept4=yes
3718fi
3719
3720# check if tee/splice is there. vmsplice was added same time.
3721splice=no
3722cat > $TMPC << EOF
3723#include <unistd.h>
3724#include <fcntl.h>
3725#include <limits.h>
3726
3727int main(void)
3728{
3729    int len, fd = 0;
3730    len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
3731    splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
3732    return 0;
3733}
3734EOF
3735if compile_prog "" "" ; then
3736  splice=yes
3737fi
3738
3739##########################################
3740# libnuma probe
3741
3742if test "$numa" != "no" ; then
3743  cat > $TMPC << EOF
3744#include <numa.h>
3745int main(void) { return numa_available(); }
3746EOF
3747
3748  if compile_prog "" "-lnuma" ; then
3749    numa=yes
3750    numa_libs="-lnuma"
3751  else
3752    if test "$numa" = "yes" ; then
3753      feature_not_found "numa" "install numactl devel"
3754    fi
3755    numa=no
3756  fi
3757fi
3758
3759malloc=system
3760if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
3761    echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
3762    exit 1
3763elif test "$tcmalloc" = "yes" ; then
3764    malloc=tcmalloc
3765elif test "$jemalloc" = "yes" ; then
3766    malloc=jemalloc
3767fi
3768
3769##########################################
3770# signalfd probe
3771signalfd="no"
3772cat > $TMPC << EOF
3773#include <unistd.h>
3774#include <sys/syscall.h>
3775#include <signal.h>
3776int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }
3777EOF
3778
3779if compile_prog "" "" ; then
3780  signalfd=yes
3781fi
3782
3783# check if optreset global is declared by <getopt.h>
3784optreset="no"
3785cat > $TMPC << EOF
3786#include <getopt.h>
3787int main(void) { return optreset; }
3788EOF
3789
3790if compile_prog "" "" ; then
3791  optreset=yes
3792fi
3793
3794# check if eventfd is supported
3795eventfd=no
3796cat > $TMPC << EOF
3797#include <sys/eventfd.h>
3798
3799int main(void)
3800{
3801    return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
3802}
3803EOF
3804if compile_prog "" "" ; then
3805  eventfd=yes
3806fi
3807
3808# check if memfd is supported
3809memfd=no
3810cat > $TMPC << EOF
3811#include <sys/mman.h>
3812
3813int main(void)
3814{
3815    return memfd_create("foo", MFD_ALLOW_SEALING);
3816}
3817EOF
3818if compile_prog "" "" ; then
3819  memfd=yes
3820fi
3821
3822# check for usbfs
3823have_usbfs=no
3824if test "$linux_user" = "yes"; then
3825  cat > $TMPC << EOF
3826#include <linux/usbdevice_fs.h>
3827
3828#ifndef USBDEVFS_GET_CAPABILITIES
3829#error "USBDEVFS_GET_CAPABILITIES undefined"
3830#endif
3831
3832#ifndef USBDEVFS_DISCONNECT_CLAIM
3833#error "USBDEVFS_DISCONNECT_CLAIM undefined"
3834#endif
3835
3836int main(void)
3837{
3838    return 0;
3839}
3840EOF
3841  if compile_prog "" ""; then
3842    have_usbfs=yes
3843  fi
3844fi
3845
3846# check for fallocate
3847fallocate=no
3848cat > $TMPC << EOF
3849#include <fcntl.h>
3850
3851int main(void)
3852{
3853    fallocate(0, 0, 0, 0);
3854    return 0;
3855}
3856EOF
3857if compile_prog "" "" ; then
3858  fallocate=yes
3859fi
3860
3861# check for fallocate hole punching
3862fallocate_punch_hole=no
3863cat > $TMPC << EOF
3864#include <fcntl.h>
3865#include <linux/falloc.h>
3866
3867int main(void)
3868{
3869    fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
3870    return 0;
3871}
3872EOF
3873if compile_prog "" "" ; then
3874  fallocate_punch_hole=yes
3875fi
3876
3877# check that fallocate supports range zeroing inside the file
3878fallocate_zero_range=no
3879cat > $TMPC << EOF
3880#include <fcntl.h>
3881#include <linux/falloc.h>
3882
3883int main(void)
3884{
3885    fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0);
3886    return 0;
3887}
3888EOF
3889if compile_prog "" "" ; then
3890  fallocate_zero_range=yes
3891fi
3892
3893# check for posix_fallocate
3894posix_fallocate=no
3895cat > $TMPC << EOF
3896#include <fcntl.h>
3897
3898int main(void)
3899{
3900    posix_fallocate(0, 0, 0);
3901    return 0;
3902}
3903EOF
3904if compile_prog "" "" ; then
3905    posix_fallocate=yes
3906fi
3907
3908# check for sync_file_range
3909sync_file_range=no
3910cat > $TMPC << EOF
3911#include <fcntl.h>
3912
3913int main(void)
3914{
3915    sync_file_range(0, 0, 0, 0);
3916    return 0;
3917}
3918EOF
3919if compile_prog "" "" ; then
3920  sync_file_range=yes
3921fi
3922
3923# check for linux/fiemap.h and FS_IOC_FIEMAP
3924fiemap=no
3925cat > $TMPC << EOF
3926#include <sys/ioctl.h>
3927#include <linux/fs.h>
3928#include <linux/fiemap.h>
3929
3930int main(void)
3931{
3932    ioctl(0, FS_IOC_FIEMAP, 0);
3933    return 0;
3934}
3935EOF
3936if compile_prog "" "" ; then
3937  fiemap=yes
3938fi
3939
3940# check for dup3
3941dup3=no
3942cat > $TMPC << EOF
3943#include <unistd.h>
3944
3945int main(void)
3946{
3947    dup3(0, 0, 0);
3948    return 0;
3949}
3950EOF
3951if compile_prog "" "" ; then
3952  dup3=yes
3953fi
3954
3955# check for ppoll support
3956ppoll=no
3957cat > $TMPC << EOF
3958#include <poll.h>
3959
3960int main(void)
3961{
3962    struct pollfd pfd = { .fd = 0, .events = 0, .revents = 0 };
3963    ppoll(&pfd, 1, 0, 0);
3964    return 0;
3965}
3966EOF
3967if compile_prog "" "" ; then
3968  ppoll=yes
3969fi
3970
3971# check for prctl(PR_SET_TIMERSLACK , ... ) support
3972prctl_pr_set_timerslack=no
3973cat > $TMPC << EOF
3974#include <sys/prctl.h>
3975
3976int main(void)
3977{
3978    prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0);
3979    return 0;
3980}
3981EOF
3982if compile_prog "" "" ; then
3983  prctl_pr_set_timerslack=yes
3984fi
3985
3986# check for epoll support
3987epoll=no
3988cat > $TMPC << EOF
3989#include <sys/epoll.h>
3990
3991int main(void)
3992{
3993    epoll_create(0);
3994    return 0;
3995}
3996EOF
3997if compile_prog "" "" ; then
3998  epoll=yes
3999fi
4000
4001# epoll_create1 is a later addition
4002# so we must check separately for its presence
4003epoll_create1=no
4004cat > $TMPC << EOF
4005#include <sys/epoll.h>
4006
4007int main(void)
4008{
4009    /* Note that we use epoll_create1 as a value, not as
4010     * a function being called. This is necessary so that on
4011     * old SPARC glibc versions where the function was present in
4012     * the library but not declared in the header file we will
4013     * fail the configure check. (Otherwise we will get a compiler
4014     * warning but not an error, and will proceed to fail the
4015     * qemu compile where we compile with -Werror.)
4016     */
4017    return (int)(uintptr_t)&epoll_create1;
4018}
4019EOF
4020if compile_prog "" "" ; then
4021  epoll_create1=yes
4022fi
4023
4024# check for sendfile support
4025sendfile=no
4026cat > $TMPC << EOF
4027#include <sys/sendfile.h>
4028
4029int main(void)
4030{
4031    return sendfile(0, 0, 0, 0);
4032}
4033EOF
4034if compile_prog "" "" ; then
4035  sendfile=yes
4036fi
4037
4038# check for timerfd support (glibc 2.8 and newer)
4039timerfd=no
4040cat > $TMPC << EOF
4041#include <sys/timerfd.h>
4042
4043int main(void)
4044{
4045    return(timerfd_create(CLOCK_REALTIME, 0));
4046}
4047EOF
4048if compile_prog "" "" ; then
4049  timerfd=yes
4050fi
4051
4052# check for setns and unshare support
4053setns=no
4054cat > $TMPC << EOF
4055#include <sched.h>
4056
4057int main(void)
4058{
4059    int ret;
4060    ret = setns(0, 0);
4061    ret = unshare(0);
4062    return ret;
4063}
4064EOF
4065if compile_prog "" "" ; then
4066  setns=yes
4067fi
4068
4069# clock_adjtime probe
4070clock_adjtime=no
4071cat > $TMPC <<EOF
4072#include <time.h>
4073#include <sys/timex.h>
4074
4075int main(void)
4076{
4077    return clock_adjtime(0, 0);
4078}
4079EOF
4080clock_adjtime=no
4081if compile_prog "" "" ; then
4082  clock_adjtime=yes
4083fi
4084
4085# syncfs probe
4086syncfs=no
4087cat > $TMPC <<EOF
4088#include <unistd.h>
4089
4090int main(void)
4091{
4092    return syncfs(0);
4093}
4094EOF
4095syncfs=no
4096if compile_prog "" "" ; then
4097  syncfs=yes
4098fi
4099
4100# Search for bswap_32 function
4101byteswap_h=no
4102cat > $TMPC << EOF
4103#include <byteswap.h>
4104int main(void) { return bswap_32(0); }
4105EOF
4106if compile_prog "" "" ; then
4107  byteswap_h=yes
4108fi
4109
4110# Search for bswap32 function
4111bswap_h=no
4112cat > $TMPC << EOF
4113#include <sys/endian.h>
4114#include <sys/types.h>
4115#include <machine/bswap.h>
4116int main(void) { return bswap32(0); }
4117EOF
4118if compile_prog "" "" ; then
4119  bswap_h=yes
4120fi
4121
4122# Check whether we have openpty() in either libc or libutil
4123cat > $TMPC << EOF
4124extern int openpty(int *am, int *as, char *name, void *termp, void *winp);
4125int main(void) { return openpty(0, 0, 0, 0, 0); }
4126EOF
4127
4128have_openpty="no"
4129if compile_prog "" "" ; then
4130  have_openpty="yes"
4131else
4132  if compile_prog "" "-lutil" ; then
4133    have_openpty="yes"
4134  fi
4135fi
4136
4137##########################################
4138# spice probe
4139if test "$spice" != "no" ; then
4140  cat > $TMPC << EOF
4141#include <spice.h>
4142int main(void) { spice_server_new(); return 0; }
4143EOF
4144  spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
4145  spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
4146  if $pkg_config --atleast-version=0.12.5 spice-server && \
4147     $pkg_config --atleast-version=0.12.3 spice-protocol && \
4148     compile_prog "$spice_cflags" "$spice_libs" ; then
4149    spice="yes"
4150  else
4151    if test "$spice" = "yes" ; then
4152      feature_not_found "spice" \
4153          "Install spice-server(>=0.12.5) and spice-protocol(>=0.12.3) devel"
4154    fi
4155    spice="no"
4156  fi
4157fi
4158
4159# check for smartcard support
4160if test "$smartcard" != "no"; then
4161    if $pkg_config --atleast-version=2.5.1 libcacard; then
4162        libcacard_cflags=$($pkg_config --cflags libcacard)
4163        libcacard_libs=$($pkg_config --libs libcacard)
4164        smartcard="yes"
4165    else
4166        if test "$smartcard" = "yes"; then
4167            feature_not_found "smartcard" "Install libcacard devel"
4168        fi
4169        smartcard="no"
4170    fi
4171fi
4172
4173# check for libusb
4174if test "$libusb" != "no" ; then
4175    if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
4176        libusb="yes"
4177        libusb_cflags=$($pkg_config --cflags libusb-1.0)
4178        libusb_libs=$($pkg_config --libs libusb-1.0)
4179    else
4180        if test "$libusb" = "yes"; then
4181            feature_not_found "libusb" "Install libusb devel >= 1.0.13"
4182        fi
4183        libusb="no"
4184    fi
4185fi
4186
4187# check for usbredirparser for usb network redirection support
4188if test "$usb_redir" != "no" ; then
4189    if $pkg_config --atleast-version=0.6 libusbredirparser-0.5; then
4190        usb_redir="yes"
4191        usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5)
4192        usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5)
4193    else
4194        if test "$usb_redir" = "yes"; then
4195            feature_not_found "usb-redir" "Install usbredir devel"
4196        fi
4197        usb_redir="no"
4198    fi
4199fi
4200
4201##########################################
4202# check if we have VSS SDK headers for win
4203
4204if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
4205        test "$vss_win32_sdk" != "no" ; then
4206  case "$vss_win32_sdk" in
4207    "")   vss_win32_include="-isystem $source_path" ;;
4208    *\ *) # The SDK is installed in "Program Files" by default, but we cannot
4209          # handle path with spaces. So we symlink the headers into ".sdk/vss".
4210          vss_win32_include="-isystem $source_path/.sdk/vss"
4211	  symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
4212	  ;;
4213    *)    vss_win32_include="-isystem $vss_win32_sdk"
4214  esac
4215  cat > $TMPC << EOF
4216#define __MIDL_user_allocate_free_DEFINED__
4217#include <inc/win2003/vss.h>
4218int main(void) { return VSS_CTX_BACKUP; }
4219EOF
4220  if compile_prog "$vss_win32_include" "" ; then
4221    guest_agent_with_vss="yes"
4222    QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
4223    libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
4224    qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
4225  else
4226    if test "$vss_win32_sdk" != "" ; then
4227      echo "ERROR: Please download and install Microsoft VSS SDK:"
4228      echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
4229      echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
4230      echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
4231      echo "ERROR: The headers are extracted in the directory \`inc'."
4232      feature_not_found "VSS support"
4233    fi
4234    guest_agent_with_vss="no"
4235  fi
4236fi
4237
4238##########################################
4239# lookup Windows platform SDK (if not specified)
4240# The SDK is needed only to build .tlb (type library) file of guest agent
4241# VSS provider from the source. It is usually unnecessary because the
4242# pre-compiled .tlb file is included.
4243
4244if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
4245        test "$guest_agent_with_vss" = "yes" ; then
4246  if test -z "$win_sdk"; then
4247    programfiles="$PROGRAMFILES"
4248    test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
4249    if test -n "$programfiles"; then
4250      win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
4251    else
4252      feature_not_found "Windows SDK"
4253    fi
4254  elif test "$win_sdk" = "no"; then
4255    win_sdk=""
4256  fi
4257fi
4258
4259##########################################
4260# check if mingw environment provides a recent ntddscsi.h
4261if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
4262  cat > $TMPC << EOF
4263#include <windows.h>
4264#include <ntddscsi.h>
4265int main(void) {
4266#if !defined(IOCTL_SCSI_GET_ADDRESS)
4267#error Missing required ioctl definitions
4268#endif
4269  SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
4270  return addr.Lun;
4271}
4272EOF
4273  if compile_prog "" "" ; then
4274    guest_agent_ntddscsi=yes
4275    libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
4276  fi
4277fi
4278
4279##########################################
4280# virgl renderer probe
4281
4282if test "$virglrenderer" != "no" ; then
4283  cat > $TMPC << EOF
4284#include <virglrenderer.h>
4285int main(void) { virgl_renderer_poll(); return 0; }
4286EOF
4287  virgl_cflags=$($pkg_config --cflags virglrenderer 2>/dev/null)
4288  virgl_libs=$($pkg_config --libs virglrenderer 2>/dev/null)
4289  virgl_version=$($pkg_config --modversion virglrenderer 2>/dev/null)
4290  if $pkg_config virglrenderer >/dev/null 2>&1 && \
4291     compile_prog "$virgl_cflags" "$virgl_libs" ; then
4292    virglrenderer="yes"
4293  else
4294    if test "$virglrenderer" = "yes" ; then
4295      feature_not_found "virglrenderer"
4296    fi
4297    virglrenderer="no"
4298  fi
4299fi
4300
4301##########################################
4302# capstone
4303
4304case "$capstone" in
4305  auto | enabled | internal)
4306    # Simpler to always update submodule, even if not needed.
4307    if test "$git_submodules_action" != "ignore"; then
4308      git_submodules="${git_submodules} capstone"
4309    fi
4310    ;;
4311esac
4312
4313##########################################
4314# check if we have fdatasync
4315
4316fdatasync=no
4317cat > $TMPC << EOF
4318#include <unistd.h>
4319int main(void) {
4320#if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
4321return fdatasync(0);
4322#else
4323#error Not supported
4324#endif
4325}
4326EOF
4327if compile_prog "" "" ; then
4328    fdatasync=yes
4329fi
4330
4331##########################################
4332# check if we have madvise
4333
4334madvise=no
4335cat > $TMPC << EOF
4336#include <sys/types.h>
4337#include <sys/mman.h>
4338#include <stddef.h>
4339int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }
4340EOF
4341if compile_prog "" "" ; then
4342    madvise=yes
4343fi
4344
4345##########################################
4346# check if we have posix_madvise
4347
4348posix_madvise=no
4349cat > $TMPC << EOF
4350#include <sys/mman.h>
4351#include <stddef.h>
4352int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }
4353EOF
4354if compile_prog "" "" ; then
4355    posix_madvise=yes
4356fi
4357
4358##########################################
4359# check if we have posix_memalign()
4360
4361posix_memalign=no
4362cat > $TMPC << EOF
4363#include <stdlib.h>
4364int main(void) {
4365    void *p;
4366    return posix_memalign(&p, 8, 8);
4367}
4368EOF
4369if compile_prog "" "" ; then
4370    posix_memalign=yes
4371fi
4372
4373##########################################
4374# check if we have posix_syslog
4375
4376posix_syslog=no
4377cat > $TMPC << EOF
4378#include <syslog.h>
4379int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; }
4380EOF
4381if compile_prog "" "" ; then
4382    posix_syslog=yes
4383fi
4384
4385##########################################
4386# check if we have sem_timedwait
4387
4388sem_timedwait=no
4389cat > $TMPC << EOF
4390#include <semaphore.h>
4391int main(void) { sem_t s; struct timespec t = {0}; return sem_timedwait(&s, &t); }
4392EOF
4393if compile_prog "" "" ; then
4394    sem_timedwait=yes
4395fi
4396
4397##########################################
4398# check if we have strchrnul
4399
4400strchrnul=no
4401cat > $TMPC << EOF
4402#include <string.h>
4403int main(void);
4404// Use a haystack that the compiler shouldn't be able to constant fold
4405char *haystack = (char*)&main;
4406int main(void) { return strchrnul(haystack, 'x') != &haystack[6]; }
4407EOF
4408if compile_prog "" "" ; then
4409    strchrnul=yes
4410fi
4411
4412#########################################
4413# check if we have st_atim
4414
4415st_atim=no
4416cat > $TMPC << EOF
4417#include <sys/stat.h>
4418#include <stddef.h>
4419int main(void) { return offsetof(struct stat, st_atim); }
4420EOF
4421if compile_prog "" "" ; then
4422    st_atim=yes
4423fi
4424
4425##########################################
4426# check if trace backend exists
4427
4428$python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
4429if test "$?" -ne 0 ; then
4430  error_exit "invalid trace backends" \
4431      "Please choose supported trace backends."
4432fi
4433
4434##########################################
4435# For 'ust' backend, test if ust headers are present
4436if have_backend "ust"; then
4437  cat > $TMPC << EOF
4438#include <lttng/tracepoint.h>
4439int main(void) { return 0; }
4440EOF
4441  if compile_prog "" "-Wl,--no-as-needed -ldl" ; then
4442    if $pkg_config lttng-ust --exists; then
4443      lttng_ust_libs=$($pkg_config --libs lttng-ust)
4444    else
4445      lttng_ust_libs="-llttng-ust -ldl"
4446    fi
4447    if $pkg_config liburcu-bp --exists; then
4448      urcu_bp_libs=$($pkg_config --libs liburcu-bp)
4449    else
4450      urcu_bp_libs="-lurcu-bp"
4451    fi
4452  else
4453    error_exit "Trace backend 'ust' missing lttng-ust header files"
4454  fi
4455fi
4456
4457##########################################
4458# For 'dtrace' backend, test if 'dtrace' command is present
4459if have_backend "dtrace"; then
4460  if ! has 'dtrace' ; then
4461    error_exit "dtrace command is not found in PATH $PATH"
4462  fi
4463  trace_backend_stap="no"
4464  if has 'stap' ; then
4465    trace_backend_stap="yes"
4466
4467    # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
4468    # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
4469    # instead. QEMU --enable-modules depends on this because the SystemTap
4470    # semaphores are linked into the main binary and not the module's shared
4471    # object.
4472    QEMU_CFLAGS="$QEMU_CFLAGS -DSTAP_SDT_V2"
4473  fi
4474fi
4475
4476##########################################
4477# check and set a backend for coroutine
4478
4479# We prefer ucontext, but it's not always possible. The fallback
4480# is sigcontext. On Windows the only valid backend is the Windows
4481# specific one.
4482
4483ucontext_works=no
4484if test "$darwin" != "yes"; then
4485  cat > $TMPC << EOF
4486#include <ucontext.h>
4487#ifdef __stub_makecontext
4488#error Ignoring glibc stub makecontext which will always fail
4489#endif
4490int main(void) { makecontext(0, 0, 0); return 0; }
4491EOF
4492  if compile_prog "" "" ; then
4493    ucontext_works=yes
4494  fi
4495fi
4496
4497if test "$coroutine" = ""; then
4498  if test "$mingw32" = "yes"; then
4499    coroutine=win32
4500  elif test "$ucontext_works" = "yes"; then
4501    coroutine=ucontext
4502  else
4503    coroutine=sigaltstack
4504  fi
4505else
4506  case $coroutine in
4507  windows)
4508    if test "$mingw32" != "yes"; then
4509      error_exit "'windows' coroutine backend only valid for Windows"
4510    fi
4511    # Unfortunately the user visible backend name doesn't match the
4512    # coroutine-*.c filename for this case, so we have to adjust it here.
4513    coroutine=win32
4514    ;;
4515  ucontext)
4516    if test "$ucontext_works" != "yes"; then
4517      feature_not_found "ucontext"
4518    fi
4519    ;;
4520  sigaltstack)
4521    if test "$mingw32" = "yes"; then
4522      error_exit "only the 'windows' coroutine backend is valid for Windows"
4523    fi
4524    ;;
4525  *)
4526    error_exit "unknown coroutine backend $coroutine"
4527    ;;
4528  esac
4529fi
4530
4531if test "$coroutine_pool" = ""; then
4532  coroutine_pool=yes
4533fi
4534
4535if test "$debug_stack_usage" = "yes"; then
4536  if test "$coroutine_pool" = "yes"; then
4537    echo "WARN: disabling coroutine pool for stack usage debugging"
4538    coroutine_pool=no
4539  fi
4540fi
4541
4542##################################################
4543# SafeStack
4544
4545
4546if test "$safe_stack" = "yes"; then
4547cat > $TMPC << EOF
4548int main(int argc, char *argv[])
4549{
4550#if ! __has_feature(safe_stack)
4551#error SafeStack Disabled
4552#endif
4553    return 0;
4554}
4555EOF
4556  flag="-fsanitize=safe-stack"
4557  # Check that safe-stack is supported and enabled.
4558  if compile_prog "-Werror $flag" "$flag"; then
4559    # Flag needed both at compilation and at linking
4560    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
4561    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
4562  else
4563    error_exit "SafeStack not supported by your compiler"
4564  fi
4565  if test "$coroutine" != "ucontext"; then
4566    error_exit "SafeStack is only supported by the coroutine backend ucontext"
4567  fi
4568else
4569cat > $TMPC << EOF
4570int main(int argc, char *argv[])
4571{
4572#if defined(__has_feature)
4573#if __has_feature(safe_stack)
4574#error SafeStack Enabled
4575#endif
4576#endif
4577    return 0;
4578}
4579EOF
4580if test "$safe_stack" = "no"; then
4581  # Make sure that safe-stack is disabled
4582  if ! compile_prog "-Werror" ""; then
4583    # SafeStack was already enabled, try to explicitly remove the feature
4584    flag="-fno-sanitize=safe-stack"
4585    if ! compile_prog "-Werror $flag" "$flag"; then
4586      error_exit "Configure cannot disable SafeStack"
4587    fi
4588    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
4589    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
4590  fi
4591else # "$safe_stack" = ""
4592  # Set safe_stack to yes or no based on pre-existing flags
4593  if compile_prog "-Werror" ""; then
4594    safe_stack="no"
4595  else
4596    safe_stack="yes"
4597    if test "$coroutine" != "ucontext"; then
4598      error_exit "SafeStack is only supported by the coroutine backend ucontext"
4599    fi
4600  fi
4601fi
4602fi
4603
4604##########################################
4605# check if we have open_by_handle_at
4606
4607open_by_handle_at=no
4608cat > $TMPC << EOF
4609#include <fcntl.h>
4610#if !defined(AT_EMPTY_PATH)
4611# error missing definition
4612#else
4613int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
4614#endif
4615EOF
4616if compile_prog "" "" ; then
4617    open_by_handle_at=yes
4618fi
4619
4620########################################
4621# check if we have linux/magic.h
4622
4623linux_magic_h=no
4624cat > $TMPC << EOF
4625#include <linux/magic.h>
4626int main(void) {
4627  return 0;
4628}
4629EOF
4630if compile_prog "" "" ; then
4631    linux_magic_h=yes
4632fi
4633
4634########################################
4635# check if we have valgrind/valgrind.h
4636
4637valgrind_h=no
4638cat > $TMPC << EOF
4639#include <valgrind/valgrind.h>
4640int main(void) {
4641  return 0;
4642}
4643EOF
4644if compile_prog "" "" ; then
4645    valgrind_h=yes
4646fi
4647
4648########################################
4649# check if environ is declared
4650
4651has_environ=no
4652cat > $TMPC << EOF
4653#include <unistd.h>
4654int main(void) {
4655    environ = 0;
4656    return 0;
4657}
4658EOF
4659if compile_prog "" "" ; then
4660    has_environ=yes
4661fi
4662
4663########################################
4664# check if cpuid.h is usable.
4665
4666cat > $TMPC << EOF
4667#include <cpuid.h>
4668int main(void) {
4669    unsigned a, b, c, d;
4670    int max = __get_cpuid_max(0, 0);
4671
4672    if (max >= 1) {
4673        __cpuid(1, a, b, c, d);
4674    }
4675
4676    if (max >= 7) {
4677        __cpuid_count(7, 0, a, b, c, d);
4678    }
4679
4680    return 0;
4681}
4682EOF
4683if compile_prog "" "" ; then
4684    cpuid_h=yes
4685fi
4686
4687##########################################
4688# avx2 optimization requirement check
4689#
4690# There is no point enabling this if cpuid.h is not usable,
4691# since we won't be able to select the new routines.
4692
4693if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
4694  cat > $TMPC << EOF
4695#pragma GCC push_options
4696#pragma GCC target("avx2")
4697#include <cpuid.h>
4698#include <immintrin.h>
4699static int bar(void *a) {
4700    __m256i x = *(__m256i *)a;
4701    return _mm256_testz_si256(x, x);
4702}
4703int main(int argc, char *argv[]) { return bar(argv[0]); }
4704EOF
4705  if compile_object "" ; then
4706    avx2_opt="yes"
4707  else
4708    avx2_opt="no"
4709  fi
4710fi
4711
4712##########################################
4713# avx512f optimization requirement check
4714#
4715# There is no point enabling this if cpuid.h is not usable,
4716# since we won't be able to select the new routines.
4717# by default, it is turned off.
4718# if user explicitly want to enable it, check environment
4719
4720if test "$cpuid_h" = "yes" && test "$avx512f_opt" = "yes"; then
4721  cat > $TMPC << EOF
4722#pragma GCC push_options
4723#pragma GCC target("avx512f")
4724#include <cpuid.h>
4725#include <immintrin.h>
4726static int bar(void *a) {
4727    __m512i x = *(__m512i *)a;
4728    return _mm512_test_epi64_mask(x, x);
4729}
4730int main(int argc, char *argv[])
4731{
4732	return bar(argv[0]);
4733}
4734EOF
4735  if ! compile_object "" ; then
4736    avx512f_opt="no"
4737  fi
4738else
4739  avx512f_opt="no"
4740fi
4741
4742########################################
4743# check if __[u]int128_t is usable.
4744
4745int128=no
4746cat > $TMPC << EOF
4747__int128_t a;
4748__uint128_t b;
4749int main (void) {
4750  a = a + b;
4751  b = a * b;
4752  a = a * a;
4753  return 0;
4754}
4755EOF
4756if compile_prog "" "" ; then
4757    int128=yes
4758fi
4759
4760#########################################
4761# See if 128-bit atomic operations are supported.
4762
4763atomic128=no
4764if test "$int128" = "yes"; then
4765  cat > $TMPC << EOF
4766int main(void)
4767{
4768  unsigned __int128 x = 0, y = 0;
4769  y = __atomic_load_16(&x, 0);
4770  __atomic_store_16(&x, y, 0);
4771  __atomic_compare_exchange_16(&x, &y, x, 0, 0, 0);
4772  return 0;
4773}
4774EOF
4775  if compile_prog "" "" ; then
4776    atomic128=yes
4777  fi
4778fi
4779
4780cmpxchg128=no
4781if test "$int128" = yes && test "$atomic128" = no; then
4782  cat > $TMPC << EOF
4783int main(void)
4784{
4785  unsigned __int128 x = 0, y = 0;
4786  __sync_val_compare_and_swap_16(&x, y, x);
4787  return 0;
4788}
4789EOF
4790  if compile_prog "" "" ; then
4791    cmpxchg128=yes
4792  fi
4793fi
4794
4795#########################################
4796# See if 64-bit atomic operations are supported.
4797# Note that without __atomic builtins, we can only
4798# assume atomic loads/stores max at pointer size.
4799
4800cat > $TMPC << EOF
4801#include <stdint.h>
4802int main(void)
4803{
4804  uint64_t x = 0, y = 0;
4805#ifdef __ATOMIC_RELAXED
4806  y = __atomic_load_n(&x, __ATOMIC_RELAXED);
4807  __atomic_store_n(&x, y, __ATOMIC_RELAXED);
4808  __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
4809  __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
4810  __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
4811#else
4812  typedef char is_host64[sizeof(void *) >= sizeof(uint64_t) ? 1 : -1];
4813  __sync_lock_test_and_set(&x, y);
4814  __sync_val_compare_and_swap(&x, y, 0);
4815  __sync_fetch_and_add(&x, y);
4816#endif
4817  return 0;
4818}
4819EOF
4820if compile_prog "" "" ; then
4821  atomic64=yes
4822fi
4823
4824#########################################
4825# See if --dynamic-list is supported by the linker
4826ld_dynamic_list="no"
4827if test "$static" = "no" ; then
4828    cat > $TMPTXT <<EOF
4829{
4830  foo;
4831};
4832EOF
4833
4834    cat > $TMPC <<EOF
4835#include <stdio.h>
4836void foo(void);
4837
4838void foo(void)
4839{
4840  printf("foo\n");
4841}
4842
4843int main(void)
4844{
4845  foo();
4846  return 0;
4847}
4848EOF
4849
4850    if compile_prog "" "-Wl,--dynamic-list=$TMPTXT" ; then
4851        ld_dynamic_list="yes"
4852    fi
4853fi
4854
4855#########################################
4856# See if -exported_symbols_list is supported by the linker
4857
4858ld_exported_symbols_list="no"
4859if test "$static" = "no" ; then
4860    cat > $TMPTXT <<EOF
4861  _foo
4862EOF
4863
4864    if compile_prog "" "-Wl,-exported_symbols_list,$TMPTXT" ; then
4865        ld_exported_symbols_list="yes"
4866    fi
4867fi
4868
4869if  test "$plugins" = "yes" &&
4870    test "$ld_dynamic_list" = "no" &&
4871    test "$ld_exported_symbols_list" = "no" ; then
4872  error_exit \
4873      "Plugin support requires dynamic linking and specifying a set of symbols " \
4874      "that are exported to plugins. Unfortunately your linker doesn't " \
4875      "support the flag (--dynamic-list or -exported_symbols_list) used " \
4876      "for this purpose. You can't build with --static."
4877fi
4878
4879########################################
4880# See if __attribute__((alias)) is supported.
4881# This false for Xcode 9, but has been remedied for Xcode 10.
4882# Unfortunately, travis uses Xcode 9 by default.
4883
4884attralias=no
4885cat > $TMPC << EOF
4886int x = 1;
4887extern const int y __attribute__((alias("x")));
4888int main(void) { return 0; }
4889EOF
4890if compile_prog "" "" ; then
4891    attralias=yes
4892fi
4893
4894########################################
4895# check if getauxval is available.
4896
4897getauxval=no
4898cat > $TMPC << EOF
4899#include <sys/auxv.h>
4900int main(void) {
4901  return getauxval(AT_HWCAP) == 0;
4902}
4903EOF
4904if compile_prog "" "" ; then
4905    getauxval=yes
4906fi
4907
4908########################################
4909# check if ccache is interfering with
4910# semantic analysis of macros
4911
4912unset CCACHE_CPP2
4913ccache_cpp2=no
4914cat > $TMPC << EOF
4915static const int Z = 1;
4916#define fn() ({ Z; })
4917#define TAUT(X) ((X) == Z)
4918#define PAREN(X, Y) (X == Y)
4919#define ID(X) (X)
4920int main(int argc, char *argv[])
4921{
4922    int x = 0, y = 0;
4923    x = ID(x);
4924    x = fn();
4925    fn();
4926    if (PAREN(x, y)) return 0;
4927    if (TAUT(Z)) return 0;
4928    return 0;
4929}
4930EOF
4931
4932if ! compile_object "-Werror"; then
4933    ccache_cpp2=yes
4934fi
4935
4936#################################################
4937# clang does not support glibc + FORTIFY_SOURCE.
4938
4939if test "$fortify_source" != "no"; then
4940  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
4941    fortify_source="no";
4942  elif test -n "$cxx" && has $cxx &&
4943       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
4944    fortify_source="no";
4945  else
4946    fortify_source="yes"
4947  fi
4948fi
4949
4950###############################################
4951# Check if copy_file_range is provided by glibc
4952have_copy_file_range=no
4953cat > $TMPC << EOF
4954#include <unistd.h>
4955int main(void) {
4956  copy_file_range(0, NULL, 0, NULL, 0, 0);
4957  return 0;
4958}
4959EOF
4960if compile_prog "" "" ; then
4961    have_copy_file_range=yes
4962fi
4963
4964##########################################
4965# check if struct fsxattr is available via linux/fs.h
4966
4967have_fsxattr=no
4968cat > $TMPC << EOF
4969#include <linux/fs.h>
4970struct fsxattr foo;
4971int main(void) {
4972  return 0;
4973}
4974EOF
4975if compile_prog "" "" ; then
4976    have_fsxattr=yes
4977fi
4978
4979##########################################
4980# check for usable membarrier system call
4981if test "$membarrier" = "yes"; then
4982    have_membarrier=no
4983    if test "$mingw32" = "yes" ; then
4984        have_membarrier=yes
4985    elif test "$linux" = "yes" ; then
4986        cat > $TMPC << EOF
4987    #include <linux/membarrier.h>
4988    #include <sys/syscall.h>
4989    #include <unistd.h>
4990    #include <stdlib.h>
4991    int main(void) {
4992        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
4993        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
4994	exit(0);
4995    }
4996EOF
4997        if compile_prog "" "" ; then
4998            have_membarrier=yes
4999        fi
5000    fi
5001    if test "$have_membarrier" = "no"; then
5002      feature_not_found "membarrier" "membarrier system call not available"
5003    fi
5004else
5005    # Do not enable it by default even for Mingw32, because it doesn't
5006    # work on Wine.
5007    membarrier=no
5008fi
5009
5010##########################################
5011# check if rtnetlink.h exists and is useful
5012have_rtnetlink=no
5013cat > $TMPC << EOF
5014#include <linux/rtnetlink.h>
5015int main(void) {
5016  return IFLA_PROTO_DOWN;
5017}
5018EOF
5019if compile_prog "" "" ; then
5020    have_rtnetlink=yes
5021fi
5022
5023##########################################
5024# check for usable AF_VSOCK environment
5025have_af_vsock=no
5026cat > $TMPC << EOF
5027#include <errno.h>
5028#include <sys/types.h>
5029#include <sys/socket.h>
5030#if !defined(AF_VSOCK)
5031# error missing AF_VSOCK flag
5032#endif
5033#include <linux/vm_sockets.h>
5034int main(void) {
5035    int sock, ret;
5036    struct sockaddr_vm svm;
5037    socklen_t len = sizeof(svm);
5038    sock = socket(AF_VSOCK, SOCK_STREAM, 0);
5039    ret = getpeername(sock, (struct sockaddr *)&svm, &len);
5040    if ((ret == -1) && (errno == ENOTCONN)) {
5041        return 0;
5042    }
5043    return -1;
5044}
5045EOF
5046if compile_prog "" "" ; then
5047    have_af_vsock=yes
5048fi
5049
5050##########################################
5051# check for usable AF_ALG environment
5052have_afalg=no
5053cat > $TMPC << EOF
5054#include <errno.h>
5055#include <sys/types.h>
5056#include <sys/socket.h>
5057#include <linux/if_alg.h>
5058int main(void) {
5059    int sock;
5060    sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
5061    return sock;
5062}
5063EOF
5064if compile_prog "" "" ; then
5065    have_afalg=yes
5066fi
5067if test "$crypto_afalg" = "yes"
5068then
5069    if test "$have_afalg" != "yes"
5070    then
5071	error_exit "AF_ALG requested but could not be detected"
5072    fi
5073fi
5074
5075
5076#################################################
5077# check for sysmacros.h
5078
5079have_sysmacros=no
5080cat > $TMPC << EOF
5081#include <sys/sysmacros.h>
5082int main(void) {
5083    return makedev(0, 0);
5084}
5085EOF
5086if compile_prog "" "" ; then
5087    have_sysmacros=yes
5088fi
5089
5090##########################################
5091# check for _Static_assert()
5092
5093have_static_assert=no
5094cat > $TMPC << EOF
5095_Static_assert(1, "success");
5096int main(void) {
5097    return 0;
5098}
5099EOF
5100if compile_prog "" "" ; then
5101    have_static_assert=yes
5102fi
5103
5104##########################################
5105# check for utmpx.h, it is missing e.g. on OpenBSD
5106
5107have_utmpx=no
5108cat > $TMPC << EOF
5109#include <utmpx.h>
5110struct utmpx user_info;
5111int main(void) {
5112    return 0;
5113}
5114EOF
5115if compile_prog "" "" ; then
5116    have_utmpx=yes
5117fi
5118
5119##########################################
5120# check for getrandom()
5121
5122have_getrandom=no
5123cat > $TMPC << EOF
5124#include <sys/random.h>
5125int main(void) {
5126    return getrandom(0, 0, GRND_NONBLOCK);
5127}
5128EOF
5129if compile_prog "" "" ; then
5130    have_getrandom=yes
5131fi
5132
5133##########################################
5134# checks for sanitizers
5135
5136have_asan=no
5137have_ubsan=no
5138have_asan_iface_h=no
5139have_asan_iface_fiber=no
5140
5141if test "$sanitizers" = "yes" ; then
5142  write_c_skeleton
5143  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
5144      have_asan=yes
5145  fi
5146
5147  # we could use a simple skeleton for flags checks, but this also
5148  # detect the static linking issue of ubsan, see also:
5149  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
5150  cat > $TMPC << EOF
5151#include <stdlib.h>
5152int main(void) {
5153    void *tmp = malloc(10);
5154    if (tmp != NULL) {
5155        return *(int *)(tmp + 2);
5156    }
5157    return 1;
5158}
5159EOF
5160  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
5161      have_ubsan=yes
5162  fi
5163
5164  if check_include "sanitizer/asan_interface.h" ; then
5165      have_asan_iface_h=yes
5166  fi
5167
5168  cat > $TMPC << EOF
5169#include <sanitizer/asan_interface.h>
5170int main(void) {
5171  __sanitizer_start_switch_fiber(0, 0, 0);
5172  return 0;
5173}
5174EOF
5175  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
5176      have_asan_iface_fiber=yes
5177  fi
5178fi
5179
5180##########################################
5181# checks for fuzzer
5182if test "$fuzzing" = "yes" && test -z "${LIB_FUZZING_ENGINE+xxx}"; then
5183  write_c_fuzzer_skeleton
5184  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=fuzzer" ""; then
5185    have_fuzzer=yes
5186  else
5187    error_exit "Your compiler doesn't support -fsanitize=fuzzer"
5188    exit 1
5189  fi
5190fi
5191
5192# Thread sanitizer is, for now, much noisier than the other sanitizers;
5193# keep it separate until that is not the case.
5194if test "$tsan" = "yes" && test "$sanitizers" = "yes"; then
5195  error_exit "TSAN is not supported with other sanitiziers."
5196fi
5197have_tsan=no
5198have_tsan_iface_fiber=no
5199if test "$tsan" = "yes" ; then
5200  write_c_skeleton
5201  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
5202      have_tsan=yes
5203  fi
5204  cat > $TMPC << EOF
5205#include <sanitizer/tsan_interface.h>
5206int main(void) {
5207  __tsan_create_fiber(0);
5208  return 0;
5209}
5210EOF
5211  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
5212      have_tsan_iface_fiber=yes
5213  fi
5214fi
5215
5216##########################################
5217# check for libpmem
5218
5219if test "$libpmem" != "no"; then
5220	if $pkg_config --exists "libpmem"; then
5221		libpmem="yes"
5222		libpmem_libs=$($pkg_config --libs libpmem)
5223		libpmem_cflags=$($pkg_config --cflags libpmem)
5224	else
5225		if test "$libpmem" = "yes" ; then
5226			feature_not_found "libpmem" "Install nvml or pmdk"
5227		fi
5228		libpmem="no"
5229	fi
5230fi
5231
5232##########################################
5233# check for libdaxctl
5234
5235if test "$libdaxctl" != "no"; then
5236	if $pkg_config --atleast-version=57 "libdaxctl"; then
5237		libdaxctl="yes"
5238		libdaxctl_libs=$($pkg_config --libs libdaxctl)
5239		libdaxctl_cflags=$($pkg_config --cflags libdaxctl)
5240	else
5241		if test "$libdaxctl" = "yes" ; then
5242			feature_not_found "libdaxctl" "Install libdaxctl"
5243		fi
5244		libdaxctl="no"
5245	fi
5246fi
5247
5248##########################################
5249# check for slirp
5250
5251case "$slirp" in
5252  auto | enabled | internal)
5253    # Simpler to always update submodule, even if not needed.
5254    if test "$git_submodules_action" != "ignore"; then
5255      git_submodules="${git_submodules} slirp"
5256    fi
5257    ;;
5258esac
5259
5260##########################################
5261# check for usable __NR_keyctl syscall
5262
5263if test "$linux" = "yes" ; then
5264
5265    have_keyring=no
5266    cat > $TMPC << EOF
5267#include <errno.h>
5268#include <asm/unistd.h>
5269#include <linux/keyctl.h>
5270#include <unistd.h>
5271int main(void) {
5272    return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
5273}
5274EOF
5275    if compile_prog "" "" ; then
5276        have_keyring=yes
5277    fi
5278fi
5279if test "$secret_keyring" != "no"
5280then
5281    if test "$have_keyring" = "yes"
5282    then
5283	secret_keyring=yes
5284    else
5285	if test "$secret_keyring" = "yes"
5286	then
5287	    error_exit "syscall __NR_keyctl requested, \
5288but not implemented on your system"
5289	else
5290	    secret_keyring=no
5291	fi
5292    fi
5293fi
5294
5295##########################################
5296# End of CC checks
5297# After here, no more $cc or $ld runs
5298
5299write_c_skeleton
5300
5301if test "$gcov" = "yes" ; then
5302  :
5303elif test "$fortify_source" = "yes" ; then
5304  QEMU_CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $QEMU_CFLAGS"
5305  debug=no
5306fi
5307
5308case "$ARCH" in
5309alpha)
5310  # Ensure there's only a single GP
5311  QEMU_CFLAGS="-msmall-data $QEMU_CFLAGS"
5312;;
5313esac
5314
5315if test "$gprof" = "yes" ; then
5316  QEMU_CFLAGS="-p $QEMU_CFLAGS"
5317  QEMU_LDFLAGS="-p $QEMU_LDFLAGS"
5318fi
5319
5320if test "$have_asan" = "yes"; then
5321  QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
5322  QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
5323  if test "$have_asan_iface_h" = "no" ; then
5324      echo "ASAN build enabled, but ASAN header missing." \
5325           "Without code annotation, the report may be inferior."
5326  elif test "$have_asan_iface_fiber" = "no" ; then
5327      echo "ASAN build enabled, but ASAN header is too old." \
5328           "Without code annotation, the report may be inferior."
5329  fi
5330fi
5331if test "$have_tsan" = "yes" ; then
5332  if test "$have_tsan_iface_fiber" = "yes" ; then
5333    QEMU_CFLAGS="-fsanitize=thread $QEMU_CFLAGS"
5334    QEMU_LDFLAGS="-fsanitize=thread $QEMU_LDFLAGS"
5335  else
5336    error_exit "Cannot enable TSAN due to missing fiber annotation interface."
5337  fi
5338elif test "$tsan" = "yes" ; then
5339  error_exit "Cannot enable TSAN due to missing sanitize thread interface."
5340fi
5341if test "$have_ubsan" = "yes"; then
5342  QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS"
5343  QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
5344fi
5345
5346##########################################
5347
5348# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
5349if test "$solaris" = "no" && test "$tsan" = "no"; then
5350    if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
5351        QEMU_LDFLAGS="-Wl,--warn-common $QEMU_LDFLAGS"
5352    fi
5353fi
5354
5355# Use ASLR, no-SEH and DEP if available
5356if test "$mingw32" = "yes" ; then
5357    flags="--no-seh --nxcompat"
5358
5359    # Disable ASLR for debug builds to allow debugging with gdb
5360    if test "$debug" = "no" ; then
5361        flags="--dynamicbase $flags"
5362    fi
5363
5364    for flag in $flags; do
5365        if ld_has $flag ; then
5366            QEMU_LDFLAGS="-Wl,$flag $QEMU_LDFLAGS"
5367        fi
5368    done
5369fi
5370
5371# We can only support ivshmem if we have eventfd
5372if [ "$eventfd" = "yes" ]; then
5373  ivshmem=yes
5374fi
5375
5376# Probe for guest agent support/options
5377
5378if [ "$guest_agent" != "no" ]; then
5379  if [ "$softmmu" = no -a "$want_tools" = no ] ; then
5380      guest_agent=no
5381  elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
5382      guest_agent=yes
5383  elif [ "$guest_agent" != yes ]; then
5384      guest_agent=no
5385  else
5386      error_exit "Guest agent is not supported on this platform"
5387  fi
5388fi
5389
5390# Guest agent Windows MSI package
5391
5392if test "$QEMU_GA_MANUFACTURER" = ""; then
5393  QEMU_GA_MANUFACTURER=QEMU
5394fi
5395if test "$QEMU_GA_DISTRO" = ""; then
5396  QEMU_GA_DISTRO=Linux
5397fi
5398if test "$QEMU_GA_VERSION" = ""; then
5399    QEMU_GA_VERSION=$(cat $source_path/VERSION)
5400fi
5401
5402QEMU_GA_MSI_MINGW_DLL_PATH="$($pkg_config --variable=prefix glib-2.0)/bin"
5403
5404# Mac OS X ships with a broken assembler
5405roms=
5406if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
5407        test "$targetos" != "Darwin" && test "$targetos" != "SunOS" && \
5408        test "$targetos" != "Haiku" && test "$softmmu" = yes ; then
5409    # Different host OS linkers have different ideas about the name of the ELF
5410    # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
5411    # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
5412    for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
5413        if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
5414            ld_i386_emulation="$emu"
5415            roms="optionrom"
5416            break
5417        fi
5418    done
5419fi
5420
5421# Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
5422if test "$cpu" = "s390x" ; then
5423  write_c_skeleton
5424  if compile_prog "-march=z900" ""; then
5425    roms="$roms s390-ccw"
5426    # SLOF is required for building the s390-ccw firmware on s390x,
5427    # since it is using the libnet code from SLOF for network booting.
5428    if test "$git_submodules_action" != "ignore"; then
5429      git_submodules="${git_submodules} roms/SLOF"
5430    fi
5431  fi
5432fi
5433
5434# Check that the C++ compiler exists and works with the C compiler.
5435# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
5436if has $cxx; then
5437    cat > $TMPC <<EOF
5438int c_function(void);
5439int main(void) { return c_function(); }
5440EOF
5441
5442    compile_object
5443
5444    cat > $TMPCXX <<EOF
5445extern "C" {
5446   int c_function(void);
5447}
5448int c_function(void) { return 42; }
5449EOF
5450
5451    update_cxxflags
5452
5453    if do_cxx $CXXFLAGS $CONFIGURE_CXXFLAGS $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
5454        # C++ compiler $cxx works ok with C compiler $cc
5455        :
5456    else
5457        echo "C++ compiler $cxx does not work with C compiler $cc"
5458        echo "Disabling C++ specific optional code"
5459        cxx=
5460    fi
5461else
5462    echo "No C++ compiler available; disabling C++ specific optional code"
5463    cxx=
5464fi
5465
5466if !(GIT="$git" "$source_path/scripts/git-submodule.sh" "$git_submodules_action" "$git_submodules"); then
5467    exit 1
5468fi
5469
5470config_host_mak="config-host.mak"
5471
5472echo "# Automatically generated by configure - do not modify" > $config_host_mak
5473echo >> $config_host_mak
5474
5475echo all: >> $config_host_mak
5476echo "GIT=$git" >> $config_host_mak
5477echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
5478echo "GIT_SUBMODULES_ACTION=$git_submodules_action" >> $config_host_mak
5479
5480echo "ARCH=$ARCH" >> $config_host_mak
5481
5482if test "$debug_tcg" = "yes" ; then
5483  echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
5484fi
5485if test "$strip_opt" = "yes" ; then
5486  echo "STRIP=${strip}" >> $config_host_mak
5487fi
5488if test "$bigendian" = "yes" ; then
5489  echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
5490fi
5491if test "$mingw32" = "yes" ; then
5492  echo "CONFIG_WIN32=y" >> $config_host_mak
5493  if test "$guest_agent_with_vss" = "yes" ; then
5494    echo "CONFIG_QGA_VSS=y" >> $config_host_mak
5495    echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
5496    echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
5497  fi
5498  if test "$guest_agent_ntddscsi" = "yes" ; then
5499    echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
5500  fi
5501  echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
5502  echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
5503  echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
5504  echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
5505else
5506  echo "CONFIG_POSIX=y" >> $config_host_mak
5507fi
5508
5509if test "$linux" = "yes" ; then
5510  echo "CONFIG_LINUX=y" >> $config_host_mak
5511fi
5512
5513if test "$darwin" = "yes" ; then
5514  echo "CONFIG_DARWIN=y" >> $config_host_mak
5515fi
5516
5517if test "$solaris" = "yes" ; then
5518  echo "CONFIG_SOLARIS=y" >> $config_host_mak
5519fi
5520if test "$haiku" = "yes" ; then
5521  echo "CONFIG_HAIKU=y" >> $config_host_mak
5522fi
5523if test "$static" = "yes" ; then
5524  echo "CONFIG_STATIC=y" >> $config_host_mak
5525fi
5526if test "$profiler" = "yes" ; then
5527  echo "CONFIG_PROFILER=y" >> $config_host_mak
5528fi
5529if test "$want_tools" = "yes" ; then
5530  echo "CONFIG_TOOLS=y" >> $config_host_mak
5531fi
5532if test "$guest_agent" = "yes" ; then
5533  echo "CONFIG_GUEST_AGENT=y" >> $config_host_mak
5534fi
5535echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
5536if test "$vde" = "yes" ; then
5537  echo "CONFIG_VDE=y" >> $config_host_mak
5538  echo "VDE_LIBS=$vde_libs" >> $config_host_mak
5539fi
5540if test "$netmap" = "yes" ; then
5541  echo "CONFIG_NETMAP=y" >> $config_host_mak
5542fi
5543if test "$l2tpv3" = "yes" ; then
5544  echo "CONFIG_L2TPV3=y" >> $config_host_mak
5545fi
5546if test "$gprof" = "yes" ; then
5547  echo "CONFIG_GPROF=y" >> $config_host_mak
5548fi
5549echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
5550for drv in $audio_drv_list; do
5551    def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
5552    echo "$def=y" >> $config_host_mak
5553done
5554if test "$alsa" = "yes" ; then
5555    echo "CONFIG_ALSA=y" >> $config_host_mak
5556fi
5557echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak
5558echo "ALSA_CFLAGS=$alsa_cflags" >> $config_host_mak
5559if test "$libpulse" = "yes" ; then
5560    echo "CONFIG_LIBPULSE=y" >> $config_host_mak
5561fi
5562echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
5563echo "PULSE_CFLAGS=$pulse_cflags" >> $config_host_mak
5564echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak
5565echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak
5566echo "OSS_LIBS=$oss_libs" >> $config_host_mak
5567if test "$libjack" = "yes" ; then
5568    echo "CONFIG_LIBJACK=y" >> $config_host_mak
5569fi
5570echo "JACK_LIBS=$jack_libs" >> $config_host_mak
5571if test "$audio_win_int" = "yes" ; then
5572  echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
5573fi
5574echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
5575echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
5576if test "$xfs" = "yes" ; then
5577  echo "CONFIG_XFS=y" >> $config_host_mak
5578fi
5579qemu_version=$(head $source_path/VERSION)
5580echo "PKGVERSION=$pkgversion" >>$config_host_mak
5581echo "SRC_PATH=$source_path" >> $config_host_mak
5582echo "TARGET_DIRS=$target_list" >> $config_host_mak
5583if test "$modules" = "yes"; then
5584  # $shacmd can generate a hash started with digit, which the compiler doesn't
5585  # like as an symbol. So prefix it with an underscore
5586  echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
5587  echo "CONFIG_MODULES=y" >> $config_host_mak
5588fi
5589if test "$module_upgrades" = "yes"; then
5590  echo "CONFIG_MODULE_UPGRADES=y" >> $config_host_mak
5591fi
5592if test "$pipe2" = "yes" ; then
5593  echo "CONFIG_PIPE2=y" >> $config_host_mak
5594fi
5595if test "$accept4" = "yes" ; then
5596  echo "CONFIG_ACCEPT4=y" >> $config_host_mak
5597fi
5598if test "$splice" = "yes" ; then
5599  echo "CONFIG_SPLICE=y" >> $config_host_mak
5600fi
5601if test "$eventfd" = "yes" ; then
5602  echo "CONFIG_EVENTFD=y" >> $config_host_mak
5603fi
5604if test "$memfd" = "yes" ; then
5605  echo "CONFIG_MEMFD=y" >> $config_host_mak
5606fi
5607if test "$have_usbfs" = "yes" ; then
5608  echo "CONFIG_USBFS=y" >> $config_host_mak
5609fi
5610if test "$fallocate" = "yes" ; then
5611  echo "CONFIG_FALLOCATE=y" >> $config_host_mak
5612fi
5613if test "$fallocate_punch_hole" = "yes" ; then
5614  echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
5615fi
5616if test "$fallocate_zero_range" = "yes" ; then
5617  echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak
5618fi
5619if test "$posix_fallocate" = "yes" ; then
5620  echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
5621fi
5622if test "$sync_file_range" = "yes" ; then
5623  echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
5624fi
5625if test "$fiemap" = "yes" ; then
5626  echo "CONFIG_FIEMAP=y" >> $config_host_mak
5627fi
5628if test "$dup3" = "yes" ; then
5629  echo "CONFIG_DUP3=y" >> $config_host_mak
5630fi
5631if test "$ppoll" = "yes" ; then
5632  echo "CONFIG_PPOLL=y" >> $config_host_mak
5633fi
5634if test "$prctl_pr_set_timerslack" = "yes" ; then
5635  echo "CONFIG_PRCTL_PR_SET_TIMERSLACK=y" >> $config_host_mak
5636fi
5637if test "$epoll" = "yes" ; then
5638  echo "CONFIG_EPOLL=y" >> $config_host_mak
5639fi
5640if test "$epoll_create1" = "yes" ; then
5641  echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
5642fi
5643if test "$sendfile" = "yes" ; then
5644  echo "CONFIG_SENDFILE=y" >> $config_host_mak
5645fi
5646if test "$timerfd" = "yes" ; then
5647  echo "CONFIG_TIMERFD=y" >> $config_host_mak
5648fi
5649if test "$setns" = "yes" ; then
5650  echo "CONFIG_SETNS=y" >> $config_host_mak
5651fi
5652if test "$clock_adjtime" = "yes" ; then
5653  echo "CONFIG_CLOCK_ADJTIME=y" >> $config_host_mak
5654fi
5655if test "$syncfs" = "yes" ; then
5656  echo "CONFIG_SYNCFS=y" >> $config_host_mak
5657fi
5658if test "$inotify" = "yes" ; then
5659  echo "CONFIG_INOTIFY=y" >> $config_host_mak
5660fi
5661if test "$inotify1" = "yes" ; then
5662  echo "CONFIG_INOTIFY1=y" >> $config_host_mak
5663fi
5664if test "$sem_timedwait" = "yes" ; then
5665  echo "CONFIG_SEM_TIMEDWAIT=y" >> $config_host_mak
5666fi
5667if test "$strchrnul" = "yes" ; then
5668  echo "HAVE_STRCHRNUL=y" >> $config_host_mak
5669fi
5670if test "$st_atim" = "yes" ; then
5671  echo "HAVE_STRUCT_STAT_ST_ATIM=y" >> $config_host_mak
5672fi
5673if test "$byteswap_h" = "yes" ; then
5674  echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
5675fi
5676if test "$bswap_h" = "yes" ; then
5677  echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
5678fi
5679if test "$gio" = "yes" ; then
5680    echo "CONFIG_GIO=y" >> $config_host_mak
5681    echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
5682    echo "GIO_LIBS=$gio_libs" >> $config_host_mak
5683    echo "GDBUS_CODEGEN=$gdbus_codegen" >> $config_host_mak
5684fi
5685echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
5686if test "$gnutls" = "yes" ; then
5687  echo "CONFIG_GNUTLS=y" >> $config_host_mak
5688  echo "GNUTLS_CFLAGS=$gnutls_cflags" >> $config_host_mak
5689  echo "GNUTLS_LIBS=$gnutls_libs" >> $config_host_mak
5690fi
5691if test "$gcrypt" = "yes" ; then
5692  echo "CONFIG_GCRYPT=y" >> $config_host_mak
5693  if test "$gcrypt_hmac" = "yes" ; then
5694    echo "CONFIG_GCRYPT_HMAC=y" >> $config_host_mak
5695  fi
5696  echo "GCRYPT_CFLAGS=$gcrypt_cflags" >> $config_host_mak
5697  echo "GCRYPT_LIBS=$gcrypt_libs" >> $config_host_mak
5698fi
5699if test "$nettle" = "yes" ; then
5700  echo "CONFIG_NETTLE=y" >> $config_host_mak
5701  echo "CONFIG_NETTLE_VERSION_MAJOR=${nettle_version%%.*}" >> $config_host_mak
5702  echo "NETTLE_CFLAGS=$nettle_cflags" >> $config_host_mak
5703  echo "NETTLE_LIBS=$nettle_libs" >> $config_host_mak
5704fi
5705if test "$qemu_private_xts" = "yes" ; then
5706  echo "CONFIG_QEMU_PRIVATE_XTS=y" >> $config_host_mak
5707fi
5708if test "$tasn1" = "yes" ; then
5709  echo "CONFIG_TASN1=y" >> $config_host_mak
5710fi
5711if test "$auth_pam" = "yes" ; then
5712    echo "CONFIG_AUTH_PAM=y" >> $config_host_mak
5713fi
5714if test "$have_broken_size_max" = "yes" ; then
5715    echo "HAVE_BROKEN_SIZE_MAX=y" >> $config_host_mak
5716fi
5717if test "$have_openpty" = "yes" ; then
5718    echo "HAVE_OPENPTY=y" >> $config_host_mak
5719fi
5720
5721# Work around a system header bug with some kernel/XFS header
5722# versions where they both try to define 'struct fsxattr':
5723# xfs headers will not try to redefine structs from linux headers
5724# if this macro is set.
5725if test "$have_fsxattr" = "yes" ; then
5726    echo "HAVE_FSXATTR=y" >> $config_host_mak
5727fi
5728if test "$have_copy_file_range" = "yes" ; then
5729    echo "HAVE_COPY_FILE_RANGE=y" >> $config_host_mak
5730fi
5731if test "$vte" = "yes" ; then
5732  echo "CONFIG_VTE=y" >> $config_host_mak
5733  echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak
5734  echo "VTE_LIBS=$vte_libs" >> $config_host_mak
5735fi
5736if test "$virglrenderer" = "yes" ; then
5737  echo "CONFIG_VIRGL=y" >> $config_host_mak
5738  echo "VIRGL_CFLAGS=$virgl_cflags" >> $config_host_mak
5739  echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak
5740fi
5741if test "$xen" = "enabled" ; then
5742  echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
5743  echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
5744  echo "XEN_CFLAGS=$xen_cflags" >> $config_host_mak
5745  echo "XEN_LIBS=$xen_libs" >> $config_host_mak
5746fi
5747if test "$linux_aio" = "yes" ; then
5748  echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
5749fi
5750if test "$linux_io_uring" = "yes" ; then
5751  echo "CONFIG_LINUX_IO_URING=y" >> $config_host_mak
5752  echo "LINUX_IO_URING_CFLAGS=$linux_io_uring_cflags" >> $config_host_mak
5753  echo "LINUX_IO_URING_LIBS=$linux_io_uring_libs" >> $config_host_mak
5754fi
5755if test "$vhost_scsi" = "yes" ; then
5756  echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
5757fi
5758if test "$vhost_net" = "yes" ; then
5759  echo "CONFIG_VHOST_NET=y" >> $config_host_mak
5760fi
5761if test "$vhost_net_user" = "yes" ; then
5762  echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
5763fi
5764if test "$vhost_net_vdpa" = "yes" ; then
5765  echo "CONFIG_VHOST_NET_VDPA=y" >> $config_host_mak
5766fi
5767if test "$vhost_crypto" = "yes" ; then
5768  echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
5769fi
5770if test "$vhost_vsock" = "yes" ; then
5771  echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
5772  if test "$vhost_user" = "yes" ; then
5773    echo "CONFIG_VHOST_USER_VSOCK=y" >> $config_host_mak
5774  fi
5775fi
5776if test "$vhost_kernel" = "yes" ; then
5777  echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
5778fi
5779if test "$vhost_user" = "yes" ; then
5780  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
5781fi
5782if test "$vhost_vdpa" = "yes" ; then
5783  echo "CONFIG_VHOST_VDPA=y" >> $config_host_mak
5784fi
5785if test "$vhost_user_fs" = "yes" ; then
5786  echo "CONFIG_VHOST_USER_FS=y" >> $config_host_mak
5787fi
5788if test "$iovec" = "yes" ; then
5789  echo "CONFIG_IOVEC=y" >> $config_host_mak
5790fi
5791if test "$membarrier" = "yes" ; then
5792  echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
5793fi
5794if test "$signalfd" = "yes" ; then
5795  echo "CONFIG_SIGNALFD=y" >> $config_host_mak
5796fi
5797if test "$optreset" = "yes" ; then
5798  echo "HAVE_OPTRESET=y" >> $config_host_mak
5799fi
5800if test "$fdatasync" = "yes" ; then
5801  echo "CONFIG_FDATASYNC=y" >> $config_host_mak
5802fi
5803if test "$madvise" = "yes" ; then
5804  echo "CONFIG_MADVISE=y" >> $config_host_mak
5805fi
5806if test "$posix_madvise" = "yes" ; then
5807  echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak
5808fi
5809if test "$posix_memalign" = "yes" ; then
5810  echo "CONFIG_POSIX_MEMALIGN=y" >> $config_host_mak
5811fi
5812if test "$spice" = "yes" ; then
5813  echo "CONFIG_SPICE=y" >> $config_host_mak
5814  echo "SPICE_CFLAGS=$spice_cflags" >> $config_host_mak
5815  echo "SPICE_LIBS=$spice_libs" >> $config_host_mak
5816fi
5817
5818if test "$smartcard" = "yes" ; then
5819  echo "CONFIG_SMARTCARD=y" >> $config_host_mak
5820  echo "SMARTCARD_CFLAGS=$libcacard_cflags" >> $config_host_mak
5821  echo "SMARTCARD_LIBS=$libcacard_libs" >> $config_host_mak
5822fi
5823
5824if test "$libusb" = "yes" ; then
5825  echo "CONFIG_USB_LIBUSB=y" >> $config_host_mak
5826  echo "LIBUSB_CFLAGS=$libusb_cflags" >> $config_host_mak
5827  echo "LIBUSB_LIBS=$libusb_libs" >> $config_host_mak
5828fi
5829
5830if test "$usb_redir" = "yes" ; then
5831  echo "CONFIG_USB_REDIR=y" >> $config_host_mak
5832  echo "USB_REDIR_CFLAGS=$usb_redir_cflags" >> $config_host_mak
5833  echo "USB_REDIR_LIBS=$usb_redir_libs" >> $config_host_mak
5834fi
5835
5836if test "$opengl" = "yes" ; then
5837  echo "CONFIG_OPENGL=y" >> $config_host_mak
5838  echo "OPENGL_CFLAGS=$opengl_cflags" >> $config_host_mak
5839  echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
5840  if test "$opengl_dmabuf" = "yes" ; then
5841    echo "CONFIG_OPENGL_DMABUF=y" >> $config_host_mak
5842  fi
5843fi
5844
5845if test "$gbm" = "yes" ; then
5846    echo "CONFIG_GBM=y" >> $config_host_mak
5847    echo "GBM_LIBS=$gbm_libs" >> $config_host_mak
5848    echo "GBM_CFLAGS=$gbm_cflags" >> $config_host_mak
5849fi
5850
5851
5852if test "$avx2_opt" = "yes" ; then
5853  echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
5854fi
5855
5856if test "$avx512f_opt" = "yes" ; then
5857  echo "CONFIG_AVX512F_OPT=y" >> $config_host_mak
5858fi
5859
5860# XXX: suppress that
5861if [ "$bsd" = "yes" ] ; then
5862  echo "CONFIG_BSD=y" >> $config_host_mak
5863fi
5864
5865if test "$qom_cast_debug" = "yes" ; then
5866  echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
5867fi
5868
5869echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
5870if test "$coroutine_pool" = "yes" ; then
5871  echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
5872else
5873  echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
5874fi
5875
5876if test "$debug_stack_usage" = "yes" ; then
5877  echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
5878fi
5879
5880if test "$crypto_afalg" = "yes" ; then
5881  echo "CONFIG_AF_ALG=y" >> $config_host_mak
5882fi
5883
5884if test "$open_by_handle_at" = "yes" ; then
5885  echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
5886fi
5887
5888if test "$linux_magic_h" = "yes" ; then
5889  echo "CONFIG_LINUX_MAGIC_H=y" >> $config_host_mak
5890fi
5891
5892if test "$valgrind_h" = "yes" ; then
5893  echo "CONFIG_VALGRIND_H=y" >> $config_host_mak
5894fi
5895
5896if test "$have_asan_iface_fiber" = "yes" ; then
5897    echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
5898fi
5899
5900if test "$have_tsan" = "yes" && test "$have_tsan_iface_fiber" = "yes" ; then
5901    echo "CONFIG_TSAN=y" >> $config_host_mak
5902fi
5903
5904if test "$has_environ" = "yes" ; then
5905  echo "CONFIG_HAS_ENVIRON=y" >> $config_host_mak
5906fi
5907
5908if test "$cpuid_h" = "yes" ; then
5909  echo "CONFIG_CPUID_H=y" >> $config_host_mak
5910fi
5911
5912if test "$int128" = "yes" ; then
5913  echo "CONFIG_INT128=y" >> $config_host_mak
5914fi
5915
5916if test "$atomic128" = "yes" ; then
5917  echo "CONFIG_ATOMIC128=y" >> $config_host_mak
5918fi
5919
5920if test "$cmpxchg128" = "yes" ; then
5921  echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
5922fi
5923
5924if test "$atomic64" = "yes" ; then
5925  echo "CONFIG_ATOMIC64=y" >> $config_host_mak
5926fi
5927
5928if test "$attralias" = "yes" ; then
5929  echo "CONFIG_ATTRIBUTE_ALIAS=y" >> $config_host_mak
5930fi
5931
5932if test "$getauxval" = "yes" ; then
5933  echo "CONFIG_GETAUXVAL=y" >> $config_host_mak
5934fi
5935
5936if test "$libssh" = "yes" ; then
5937  echo "CONFIG_LIBSSH=y" >> $config_host_mak
5938  echo "LIBSSH_CFLAGS=$libssh_cflags" >> $config_host_mak
5939  echo "LIBSSH_LIBS=$libssh_libs" >> $config_host_mak
5940fi
5941
5942if test "$live_block_migration" = "yes" ; then
5943  echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
5944fi
5945
5946if test "$tpm" = "yes"; then
5947  echo 'CONFIG_TPM=y' >> $config_host_mak
5948fi
5949
5950echo "TRACE_BACKENDS=$trace_backends" >> $config_host_mak
5951if have_backend "nop"; then
5952  echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
5953fi
5954if have_backend "simple"; then
5955  echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
5956  # Set the appropriate trace file.
5957  trace_file="\"$trace_file-\" FMT_pid"
5958fi
5959if have_backend "log"; then
5960  echo "CONFIG_TRACE_LOG=y" >> $config_host_mak
5961fi
5962if have_backend "ust"; then
5963  echo "CONFIG_TRACE_UST=y" >> $config_host_mak
5964  echo "LTTNG_UST_LIBS=$lttng_ust_libs" >> $config_host_mak
5965  echo "URCU_BP_LIBS=$urcu_bp_libs" >> $config_host_mak
5966fi
5967if have_backend "dtrace"; then
5968  echo "CONFIG_TRACE_DTRACE=y" >> $config_host_mak
5969  if test "$trace_backend_stap" = "yes" ; then
5970    echo "CONFIG_TRACE_SYSTEMTAP=y" >> $config_host_mak
5971  fi
5972fi
5973if have_backend "ftrace"; then
5974  if test "$linux" = "yes" ; then
5975    echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak
5976  else
5977    feature_not_found "ftrace(trace backend)" "ftrace requires Linux"
5978  fi
5979fi
5980if have_backend "syslog"; then
5981  if test "$posix_syslog" = "yes" ; then
5982    echo "CONFIG_TRACE_SYSLOG=y" >> $config_host_mak
5983  else
5984    feature_not_found "syslog(trace backend)" "syslog not available"
5985  fi
5986fi
5987echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
5988
5989if test "$rdma" = "yes" ; then
5990  echo "CONFIG_RDMA=y" >> $config_host_mak
5991  echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
5992fi
5993
5994if test "$pvrdma" = "yes" ; then
5995  echo "CONFIG_PVRDMA=y" >> $config_host_mak
5996fi
5997
5998if test "$have_rtnetlink" = "yes" ; then
5999  echo "CONFIG_RTNETLINK=y" >> $config_host_mak
6000fi
6001
6002if test "$libxml2" = "yes" ; then
6003  echo "CONFIG_LIBXML2=y" >> $config_host_mak
6004  echo "LIBXML2_CFLAGS=$libxml2_cflags" >> $config_host_mak
6005  echo "LIBXML2_LIBS=$libxml2_libs" >> $config_host_mak
6006fi
6007
6008if test "$replication" = "yes" ; then
6009  echo "CONFIG_REPLICATION=y" >> $config_host_mak
6010fi
6011
6012if test "$have_af_vsock" = "yes" ; then
6013  echo "CONFIG_AF_VSOCK=y" >> $config_host_mak
6014fi
6015
6016if test "$have_sysmacros" = "yes" ; then
6017  echo "CONFIG_SYSMACROS=y" >> $config_host_mak
6018fi
6019
6020if test "$have_static_assert" = "yes" ; then
6021  echo "CONFIG_STATIC_ASSERT=y" >> $config_host_mak
6022fi
6023
6024if test "$have_utmpx" = "yes" ; then
6025  echo "HAVE_UTMPX=y" >> $config_host_mak
6026fi
6027if test "$have_getrandom" = "yes" ; then
6028  echo "CONFIG_GETRANDOM=y" >> $config_host_mak
6029fi
6030if test "$ivshmem" = "yes" ; then
6031  echo "CONFIG_IVSHMEM=y" >> $config_host_mak
6032fi
6033if test "$debug_mutex" = "yes" ; then
6034  echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
6035fi
6036
6037# Hold two types of flag:
6038#   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
6039#                                     a thread we have a handle to
6040#   CONFIG_PTHREAD_SETNAME_NP_W_TID - A way of doing it on a particular
6041#                                     platform
6042if test "$pthread_setname_np_w_tid" = "yes" ; then
6043  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
6044  echo "CONFIG_PTHREAD_SETNAME_NP_W_TID=y" >> $config_host_mak
6045elif test "$pthread_setname_np_wo_tid" = "yes" ; then
6046  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
6047  echo "CONFIG_PTHREAD_SETNAME_NP_WO_TID=y" >> $config_host_mak
6048fi
6049
6050if test "$libpmem" = "yes" ; then
6051  echo "CONFIG_LIBPMEM=y" >> $config_host_mak
6052  echo "LIBPMEM_LIBS=$libpmem_libs" >> $config_host_mak
6053  echo "LIBPMEM_CFLAGS=$libpmem_cflags" >> $config_host_mak
6054fi
6055
6056if test "$libdaxctl" = "yes" ; then
6057  echo "CONFIG_LIBDAXCTL=y" >> $config_host_mak
6058  echo "LIBDAXCTL_LIBS=$libdaxctl_libs" >> $config_host_mak
6059fi
6060
6061if test "$bochs" = "yes" ; then
6062  echo "CONFIG_BOCHS=y" >> $config_host_mak
6063fi
6064if test "$cloop" = "yes" ; then
6065  echo "CONFIG_CLOOP=y" >> $config_host_mak
6066fi
6067if test "$dmg" = "yes" ; then
6068  echo "CONFIG_DMG=y" >> $config_host_mak
6069fi
6070if test "$qcow1" = "yes" ; then
6071  echo "CONFIG_QCOW1=y" >> $config_host_mak
6072fi
6073if test "$vdi" = "yes" ; then
6074  echo "CONFIG_VDI=y" >> $config_host_mak
6075fi
6076if test "$vvfat" = "yes" ; then
6077  echo "CONFIG_VVFAT=y" >> $config_host_mak
6078fi
6079if test "$qed" = "yes" ; then
6080  echo "CONFIG_QED=y" >> $config_host_mak
6081fi
6082if test "$parallels" = "yes" ; then
6083  echo "CONFIG_PARALLELS=y" >> $config_host_mak
6084fi
6085if test "$sheepdog" = "yes" ; then
6086  add_to deprecated_features "sheepdog"
6087  echo "CONFIG_SHEEPDOG=y" >> $config_host_mak
6088fi
6089if test "$have_mlockall" = "yes" ; then
6090  echo "HAVE_MLOCKALL=y" >> $config_host_mak
6091fi
6092if test "$multiprocess" = "yes" ; then
6093  echo "CONFIG_MULTIPROCESS_ALLOWED=y" >> $config_host_mak
6094fi
6095if test "$fuzzing" = "yes" ; then
6096  # If LIB_FUZZING_ENGINE is set, assume we are running on OSS-Fuzz, and the
6097  # needed CFLAGS have already been provided
6098  if test -z "${LIB_FUZZING_ENGINE+xxx}" ; then
6099    QEMU_CFLAGS="$QEMU_CFLAGS -fsanitize=fuzzer-no-link"
6100    FUZZ_EXE_LDFLAGS="-fsanitize=fuzzer"
6101  else
6102    FUZZ_EXE_LDFLAGS="$LIB_FUZZING_ENGINE"
6103  fi
6104fi
6105
6106if test "$plugins" = "yes" ; then
6107    echo "CONFIG_PLUGIN=y" >> $config_host_mak
6108    # Copy the export object list to the build dir
6109    if test "$ld_dynamic_list" = "yes" ; then
6110	echo "CONFIG_HAS_LD_DYNAMIC_LIST=yes" >> $config_host_mak
6111	ld_symbols=qemu-plugins-ld.symbols
6112	cp "$source_path/plugins/qemu-plugins.symbols" $ld_symbols
6113    elif test "$ld_exported_symbols_list" = "yes" ; then
6114	echo "CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST=yes" >> $config_host_mak
6115	ld64_symbols=qemu-plugins-ld64.symbols
6116	echo "# Automatically generated by configure - do not modify" > $ld64_symbols
6117	grep 'qemu_' "$source_path/plugins/qemu-plugins.symbols" | sed 's/;//g' | \
6118	    sed -E 's/^[[:space:]]*(.*)/_\1/' >> $ld64_symbols
6119    else
6120	error_exit \
6121	    "If \$plugins=yes, either \$ld_dynamic_list or " \
6122	    "\$ld_exported_symbols_list should have been set to 'yes'."
6123    fi
6124fi
6125
6126if test -n "$gdb_bin"; then
6127    gdb_version=$($gdb_bin --version | head -n 1)
6128    if version_ge ${gdb_version##* } 9.1; then
6129        echo "HAVE_GDB_BIN=$gdb_bin" >> $config_host_mak
6130    fi
6131fi
6132
6133if test "$secret_keyring" = "yes" ; then
6134  echo "CONFIG_SECRET_KEYRING=y" >> $config_host_mak
6135fi
6136
6137echo "ROMS=$roms" >> $config_host_mak
6138echo "MAKE=$make" >> $config_host_mak
6139echo "PYTHON=$python" >> $config_host_mak
6140echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
6141echo "MESON=$meson" >> $config_host_mak
6142echo "NINJA=$ninja" >> $config_host_mak
6143echo "CC=$cc" >> $config_host_mak
6144if $iasl -h > /dev/null 2>&1; then
6145  echo "CONFIG_IASL=$iasl" >> $config_host_mak
6146fi
6147echo "CXX=$cxx" >> $config_host_mak
6148echo "OBJCC=$objcc" >> $config_host_mak
6149echo "AR=$ar" >> $config_host_mak
6150echo "ARFLAGS=$ARFLAGS" >> $config_host_mak
6151echo "AS=$as" >> $config_host_mak
6152echo "CCAS=$ccas" >> $config_host_mak
6153echo "CPP=$cpp" >> $config_host_mak
6154echo "OBJCOPY=$objcopy" >> $config_host_mak
6155echo "LD=$ld" >> $config_host_mak
6156echo "RANLIB=$ranlib" >> $config_host_mak
6157echo "NM=$nm" >> $config_host_mak
6158echo "PKG_CONFIG=$pkg_config_exe" >> $config_host_mak
6159echo "WINDRES=$windres" >> $config_host_mak
6160echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
6161echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
6162echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
6163echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
6164echo "GLIB_LIBS=$glib_libs" >> $config_host_mak
6165echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
6166echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
6167echo "EXESUF=$EXESUF" >> $config_host_mak
6168echo "HOST_DSOSUF=$HOST_DSOSUF" >> $config_host_mak
6169echo "LIBS_QGA=$libs_qga" >> $config_host_mak
6170echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak
6171echo "TASN1_CFLAGS=$tasn1_cflags" >> $config_host_mak
6172if test "$gcov" = "yes" ; then
6173  echo "CONFIG_GCOV=y" >> $config_host_mak
6174fi
6175
6176if test "$fuzzing" != "no"; then
6177    echo "CONFIG_FUZZ=y" >> $config_host_mak
6178fi
6179echo "FUZZ_EXE_LDFLAGS=$FUZZ_EXE_LDFLAGS" >> $config_host_mak
6180
6181if test "$rng_none" = "yes"; then
6182  echo "CONFIG_RNG_NONE=y" >> $config_host_mak
6183fi
6184
6185# use included Linux headers
6186if test "$linux" = "yes" ; then
6187  mkdir -p linux-headers
6188  case "$cpu" in
6189  i386|x86_64|x32)
6190    linux_arch=x86
6191    ;;
6192  ppc|ppc64|ppc64le)
6193    linux_arch=powerpc
6194    ;;
6195  s390x)
6196    linux_arch=s390
6197    ;;
6198  aarch64)
6199    linux_arch=arm64
6200    ;;
6201  mips64)
6202    linux_arch=mips
6203    ;;
6204  *)
6205    # For most CPUs the kernel architecture name and QEMU CPU name match.
6206    linux_arch="$cpu"
6207    ;;
6208  esac
6209    # For non-KVM architectures we will not have asm headers
6210    if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
6211      symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
6212    fi
6213fi
6214
6215for target in $target_list; do
6216    target_dir="$target"
6217    target_name=$(echo $target | cut -d '-' -f 1)
6218    mkdir -p $target_dir
6219    case $target in
6220        *-user) symlink "../qemu-$target_name" "$target_dir/qemu-$target_name" ;;
6221        *) symlink "../qemu-system-$target_name" "$target_dir/qemu-system-$target_name" ;;
6222    esac
6223done
6224
6225echo "CONFIG_QEMU_INTERP_PREFIX=$interp_prefix" | sed 's/%M/@0@/' >> $config_host_mak
6226if test "$default_targets" = "yes"; then
6227  echo "CONFIG_DEFAULT_TARGETS=y" >> $config_host_mak
6228fi
6229
6230if test "$numa" = "yes"; then
6231  echo "CONFIG_NUMA=y" >> $config_host_mak
6232  echo "NUMA_LIBS=$numa_libs" >> $config_host_mak
6233fi
6234
6235if test "$ccache_cpp2" = "yes"; then
6236  echo "export CCACHE_CPP2=y" >> $config_host_mak
6237fi
6238
6239if test "$safe_stack" = "yes"; then
6240  echo "CONFIG_SAFESTACK=y" >> $config_host_mak
6241fi
6242
6243# If we're using a separate build tree, set it up now.
6244# DIRS are directories which we simply mkdir in the build tree;
6245# LINKS are things to symlink back into the source tree
6246# (these can be both files and directories).
6247# Caution: do not add files or directories here using wildcards. This
6248# will result in problems later if a new file matching the wildcard is
6249# added to the source tree -- nothing will cause configure to be rerun
6250# so the build tree will be missing the link back to the new file, and
6251# tests might fail. Prefer to keep the relevant files in their own
6252# directory and symlink the directory instead.
6253# UNLINK is used to remove symlinks from older development versions
6254# that might get into the way when doing "git update" without doing
6255# a "make distclean" in between.
6256DIRS="tests tests/tcg tests/tcg/lm32 tests/qapi-schema tests/qtest/libqos"
6257DIRS="$DIRS tests/qtest tests/qemu-iotests tests/vm tests/fp tests/qgraph"
6258DIRS="$DIRS docs docs/interop fsdev scsi"
6259DIRS="$DIRS pc-bios/optionrom pc-bios/s390-ccw"
6260DIRS="$DIRS roms/seabios"
6261DIRS="$DIRS contrib/plugins/"
6262LINKS="Makefile"
6263LINKS="$LINKS tests/tcg/lm32/Makefile"
6264LINKS="$LINKS tests/tcg/Makefile.target"
6265LINKS="$LINKS pc-bios/optionrom/Makefile"
6266LINKS="$LINKS pc-bios/s390-ccw/Makefile"
6267LINKS="$LINKS roms/seabios/Makefile"
6268LINKS="$LINKS pc-bios/qemu-icon.bmp"
6269LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
6270LINKS="$LINKS tests/acceptance tests/data"
6271LINKS="$LINKS tests/qemu-iotests/check"
6272LINKS="$LINKS python"
6273LINKS="$LINKS contrib/plugins/Makefile "
6274UNLINK="pc-bios/keymaps"
6275for bios_file in \
6276    $source_path/pc-bios/*.bin \
6277    $source_path/pc-bios/*.elf \
6278    $source_path/pc-bios/*.lid \
6279    $source_path/pc-bios/*.rom \
6280    $source_path/pc-bios/*.dtb \
6281    $source_path/pc-bios/*.img \
6282    $source_path/pc-bios/openbios-* \
6283    $source_path/pc-bios/u-boot.* \
6284    $source_path/pc-bios/edk2-*.fd.bz2 \
6285    $source_path/pc-bios/palcode-*
6286do
6287    LINKS="$LINKS pc-bios/$(basename $bios_file)"
6288done
6289mkdir -p $DIRS
6290for f in $LINKS ; do
6291    if [ -e "$source_path/$f" ]; then
6292        symlink "$source_path/$f" "$f"
6293    fi
6294done
6295for f in $UNLINK ; do
6296    if [ -L "$f" ]; then
6297        rm -f "$f"
6298    fi
6299done
6300
6301(for i in $cross_cc_vars; do
6302  export $i
6303done
6304export target_list source_path use_containers
6305$source_path/tests/tcg/configure.sh)
6306
6307# temporary config to build submodules
6308for rom in seabios; do
6309    config_mak=roms/$rom/config.mak
6310    echo "# Automatically generated by configure - do not modify" > $config_mak
6311    echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
6312    echo "AS=$as" >> $config_mak
6313    echo "CCAS=$ccas" >> $config_mak
6314    echo "CC=$cc" >> $config_mak
6315    echo "BCC=bcc" >> $config_mak
6316    echo "CPP=$cpp" >> $config_mak
6317    echo "OBJCOPY=objcopy" >> $config_mak
6318    echo "IASL=$iasl" >> $config_mak
6319    echo "LD=$ld" >> $config_mak
6320    echo "RANLIB=$ranlib" >> $config_mak
6321done
6322
6323if test "$skip_meson" = no; then
6324cross="config-meson.cross.new"
6325meson_quote() {
6326    echo "'$(echo $* | sed "s/ /','/g")'"
6327}
6328
6329echo "# Automatically generated by configure - do not modify" > $cross
6330echo "[properties]" >> $cross
6331test -z "$cxx" && echo "link_language = 'c'" >> $cross
6332echo "[built-in options]" >> $cross
6333echo "c_args = [${CFLAGS:+$(meson_quote $CFLAGS)}]" >> $cross
6334echo "cpp_args = [${CXXFLAGS:+$(meson_quote $CXXFLAGS)}]" >> $cross
6335echo "c_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
6336echo "cpp_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
6337echo "[binaries]" >> $cross
6338echo "c = [$(meson_quote $cc)]" >> $cross
6339test -n "$cxx" && echo "cpp = [$(meson_quote $cxx)]" >> $cross
6340test -n "$objcc" && echo "objc = [$(meson_quote $objcc)]" >> $cross
6341echo "ar = [$(meson_quote $ar)]" >> $cross
6342echo "nm = [$(meson_quote $nm)]" >> $cross
6343echo "pkgconfig = [$(meson_quote $pkg_config_exe)]" >> $cross
6344echo "ranlib = [$(meson_quote $ranlib)]" >> $cross
6345if has $sdl2_config; then
6346  echo "sdl2-config = [$(meson_quote $sdl2_config)]" >> $cross
6347fi
6348echo "strip = [$(meson_quote $strip)]" >> $cross
6349echo "windres = [$(meson_quote $windres)]" >> $cross
6350if test "$cross_compile" = "yes"; then
6351    cross_arg="--cross-file config-meson.cross"
6352    echo "[host_machine]" >> $cross
6353    if test "$mingw32" = "yes" ; then
6354        echo "system = 'windows'" >> $cross
6355    fi
6356    if test "$linux" = "yes" ; then
6357        echo "system = 'linux'" >> $cross
6358    fi
6359    if test "$darwin" = "yes" ; then
6360        echo "system = 'darwin'" >> $cross
6361    fi
6362    case "$ARCH" in
6363        i386)
6364            echo "cpu_family = 'x86'" >> $cross
6365            ;;
6366        x86_64)
6367            echo "cpu_family = 'x86_64'" >> $cross
6368            ;;
6369        ppc64le)
6370            echo "cpu_family = 'ppc64'" >> $cross
6371            ;;
6372        *)
6373            echo "cpu_family = '$ARCH'" >> $cross
6374            ;;
6375    esac
6376    echo "cpu = '$cpu'" >> $cross
6377    if test "$bigendian" = "yes" ; then
6378        echo "endian = 'big'" >> $cross
6379    else
6380        echo "endian = 'little'" >> $cross
6381    fi
6382else
6383    cross_arg="--native-file config-meson.cross"
6384fi
6385mv $cross config-meson.cross
6386
6387rm -rf meson-private meson-info meson-logs
6388unset staticpic
6389if ! version_ge "$($meson --version)" 0.56.0; then
6390  staticpic=$(if test "$pie" = yes; then echo true; else echo false; fi)
6391fi
6392NINJA=$ninja $meson setup \
6393        --prefix "$prefix" \
6394        --libdir "$libdir" \
6395        --libexecdir "$libexecdir" \
6396        --bindir "$bindir" \
6397        --includedir "$includedir" \
6398        --datadir "$datadir" \
6399        --mandir "$mandir" \
6400        --sysconfdir "$sysconfdir" \
6401        --localedir "$localedir" \
6402        --localstatedir "$local_statedir" \
6403        -Ddocdir="$docdir" \
6404        -Dqemu_firmwarepath="$firmwarepath" \
6405        -Dqemu_suffix="$qemu_suffix" \
6406        -Doptimization=$(if test "$debug" = yes; then echo 0; else echo 2; fi) \
6407        -Ddebug=$(if test "$debug_info" = yes; then echo true; else echo false; fi) \
6408        -Dwerror=$(if test "$werror" = yes; then echo true; else echo false; fi) \
6409        -Dstrip=$(if test "$strip_opt" = yes; then echo true; else echo false; fi) \
6410        -Db_pie=$(if test "$pie" = yes; then echo true; else echo false; fi) \
6411        ${staticpic:+-Db_staticpic=$staticpic} \
6412        -Db_coverage=$(if test "$gcov" = yes; then echo true; else echo false; fi) \
6413        -Db_lto=$lto -Dcfi=$cfi -Dcfi_debug=$cfi_debug \
6414        -Dmalloc=$malloc -Dmalloc_trim=$malloc_trim -Dsparse=$sparse \
6415        -Dkvm=$kvm -Dhax=$hax -Dwhpx=$whpx -Dhvf=$hvf \
6416        -Dxen=$xen -Dxen_pci_passthrough=$xen_pci_passthrough -Dtcg=$tcg \
6417        -Dcocoa=$cocoa -Dgtk=$gtk -Dmpath=$mpath -Dsdl=$sdl -Dsdl_image=$sdl_image \
6418        -Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg -Dvnc_png=$vnc_png \
6419        -Dgettext=$gettext -Dxkbcommon=$xkbcommon -Du2f=$u2f -Dvirtiofsd=$virtiofsd \
6420        -Dcapstone=$capstone -Dslirp=$slirp -Dfdt=$fdt -Dbrlapi=$brlapi \
6421        -Dcurl=$curl -Dglusterfs=$glusterfs -Dbzip2=$bzip2 -Dlibiscsi=$libiscsi \
6422        -Dlibnfs=$libnfs -Diconv=$iconv -Dcurses=$curses -Dlibudev=$libudev\
6423        -Drbd=$rbd -Dlzo=$lzo -Dsnappy=$snappy -Dlzfse=$lzfse \
6424        -Dzstd=$zstd -Dseccomp=$seccomp -Dvirtfs=$virtfs -Dcap_ng=$cap_ng \
6425        -Dattr=$attr -Ddefault_devices=$default_devices \
6426        -Ddocs=$docs -Dsphinx_build=$sphinx_build -Dinstall_blobs=$blobs \
6427        -Dvhost_user_blk_server=$vhost_user_blk_server \
6428        -Dfuse=$fuse -Dfuse_lseek=$fuse_lseek -Dguest_agent_msi=$guest_agent_msi \
6429        $(if test "$default_features" = no; then echo "-Dauto_features=disabled"; fi) \
6430	-Dtcg_interpreter=$tcg_interpreter \
6431        $cross_arg \
6432        "$PWD" "$source_path"
6433
6434if test "$?" -ne 0 ; then
6435    error_exit "meson setup failed"
6436fi
6437fi
6438
6439if test -n "${deprecated_features}"; then
6440    echo "Warning, deprecated features enabled."
6441    echo "Please see docs/system/deprecated.rst"
6442    echo "  features: ${deprecated_features}"
6443fi
6444
6445# Save the configure command line for later reuse.
6446cat <<EOD >config.status
6447#!/bin/sh
6448# Generated by configure.
6449# Run this file to recreate the current configuration.
6450# Compiler output produced by configure, useful for debugging
6451# configure, is in config.log if it exists.
6452EOD
6453
6454preserve_env() {
6455    envname=$1
6456
6457    eval envval=\$$envname
6458
6459    if test -n "$envval"
6460    then
6461	echo "$envname='$envval'" >> config.status
6462	echo "export $envname" >> config.status
6463    else
6464	echo "unset $envname" >> config.status
6465    fi
6466}
6467
6468# Preserve various env variables that influence what
6469# features/build target configure will detect
6470preserve_env AR
6471preserve_env AS
6472preserve_env CC
6473preserve_env CPP
6474preserve_env CXX
6475preserve_env INSTALL
6476preserve_env LD
6477preserve_env LD_LIBRARY_PATH
6478preserve_env LIBTOOL
6479preserve_env MAKE
6480preserve_env NM
6481preserve_env OBJCOPY
6482preserve_env PATH
6483preserve_env PKG_CONFIG
6484preserve_env PKG_CONFIG_LIBDIR
6485preserve_env PKG_CONFIG_PATH
6486preserve_env PYTHON
6487preserve_env SDL2_CONFIG
6488preserve_env SMBD
6489preserve_env STRIP
6490preserve_env WINDRES
6491
6492printf "exec" >>config.status
6493for i in "$0" "$@"; do
6494  test "$i" = --skip-meson || printf " %s" "$(quote_sh "$i")" >>config.status
6495done
6496echo ' "$@"' >>config.status
6497chmod +x config.status
6498
6499rm -r "$TMPDIR1"
6500