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