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