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