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