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