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