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