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