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