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