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