xref: /openbmc/qemu/configure (revision c97377652dfeef2e0373faa2cdc05548b1536d77)
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# Disable features only meaningful for system-mode emulation
2324if test "$softmmu" = "no"; then
2325    audio_drv_list=""
2326fi
2327
2328##########################################
2329# Some versions of Mac OS X incorrectly define SIZE_MAX
2330cat > $TMPC << EOF
2331#include <stdint.h>
2332#include <stdio.h>
2333int main(int argc, char *argv[]) {
2334    return printf("%zu", SIZE_MAX);
2335}
2336EOF
2337have_broken_size_max=no
2338if ! compile_object -Werror ; then
2339    have_broken_size_max=yes
2340fi
2341
2342##########################################
2343# L2TPV3 probe
2344
2345cat > $TMPC <<EOF
2346#include <sys/socket.h>
2347#include <linux/ip.h>
2348int main(void) { return sizeof(struct mmsghdr); }
2349EOF
2350if compile_prog "" "" ; then
2351  l2tpv3=yes
2352else
2353  l2tpv3=no
2354fi
2355
2356cat > $TMPC <<EOF
2357#include <sys/mman.h>
2358int main(int argc, char *argv[]) {
2359    return mlockall(MCL_FUTURE);
2360}
2361EOF
2362if compile_prog "" "" ; then
2363  have_mlockall=yes
2364else
2365  have_mlockall=no
2366fi
2367
2368#########################################
2369# vhost interdependencies and host support
2370
2371# vhost backends
2372if test "$vhost_user" = "yes" && test "$linux" != "yes"; then
2373  error_exit "vhost-user is only available on Linux"
2374fi
2375test "$vhost_vdpa" = "" && vhost_vdpa=$linux
2376if test "$vhost_vdpa" = "yes" && test "$linux" != "yes"; then
2377  error_exit "vhost-vdpa is only available on Linux"
2378fi
2379test "$vhost_kernel" = "" && vhost_kernel=$linux
2380if test "$vhost_kernel" = "yes" && test "$linux" != "yes"; then
2381  error_exit "vhost-kernel is only available on Linux"
2382fi
2383
2384# vhost-kernel devices
2385test "$vhost_scsi" = "" && vhost_scsi=$vhost_kernel
2386if test "$vhost_scsi" = "yes" && test "$vhost_kernel" != "yes"; then
2387  error_exit "--enable-vhost-scsi requires --enable-vhost-kernel"
2388fi
2389test "$vhost_vsock" = "" && vhost_vsock=$vhost_kernel
2390if test "$vhost_vsock" = "yes" && test "$vhost_kernel" != "yes"; then
2391  error_exit "--enable-vhost-vsock requires --enable-vhost-kernel"
2392fi
2393
2394# vhost-user backends
2395test "$vhost_net_user" = "" && vhost_net_user=$vhost_user
2396if test "$vhost_net_user" = "yes" && test "$vhost_user" = "no"; then
2397  error_exit "--enable-vhost-net-user requires --enable-vhost-user"
2398fi
2399test "$vhost_crypto" = "" && vhost_crypto=$vhost_user
2400if test "$vhost_crypto" = "yes" && test "$vhost_user" = "no"; then
2401  error_exit "--enable-vhost-crypto requires --enable-vhost-user"
2402fi
2403test "$vhost_user_fs" = "" && vhost_user_fs=$vhost_user
2404if test "$vhost_user_fs" = "yes" && test "$vhost_user" = "no"; then
2405  error_exit "--enable-vhost-user-fs requires --enable-vhost-user"
2406fi
2407#vhost-vdpa backends
2408test "$vhost_net_vdpa" = "" && vhost_net_vdpa=$vhost_vdpa
2409if test "$vhost_net_vdpa" = "yes" && test "$vhost_vdpa" = "no"; then
2410  error_exit "--enable-vhost-net-vdpa requires --enable-vhost-vdpa"
2411fi
2412
2413# OR the vhost-kernel, vhost-vdpa and vhost-user values for simplicity
2414if test "$vhost_net" = ""; then
2415  test "$vhost_net_user" = "yes" && vhost_net=yes
2416  test "$vhost_net_vdpa" = "yes" && vhost_net=yes
2417  test "$vhost_kernel" = "yes" && vhost_net=yes
2418fi
2419
2420##########################################
2421# pkg-config probe
2422
2423if ! has "$pkg_config_exe"; then
2424  error_exit "pkg-config binary '$pkg_config_exe' not found"
2425fi
2426
2427##########################################
2428# NPTL probe
2429
2430if test "$linux_user" = "yes"; then
2431  cat > $TMPC <<EOF
2432#include <sched.h>
2433#include <linux/futex.h>
2434int main(void) {
2435#if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
2436#error bork
2437#endif
2438  return 0;
2439}
2440EOF
2441  if ! compile_object ; then
2442    feature_not_found "nptl" "Install glibc and linux kernel headers."
2443  fi
2444fi
2445
2446##########################################
2447# xen probe
2448
2449if test "$xen" != "disabled" ; then
2450  # Check whether Xen library path is specified via --extra-ldflags to avoid
2451  # overriding this setting with pkg-config output. If not, try pkg-config
2452  # to obtain all needed flags.
2453
2454  if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
2455     $pkg_config --exists xencontrol ; then
2456    xen_ctrl_version="$(printf '%d%02d%02d' \
2457      $($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
2458    xen=enabled
2459    xen_pc="xencontrol xenstore xenforeignmemory xengnttab"
2460    xen_pc="$xen_pc xenevtchn xendevicemodel"
2461    if $pkg_config --exists xentoolcore; then
2462      xen_pc="$xen_pc xentoolcore"
2463    fi
2464    xen_cflags="$($pkg_config --cflags $xen_pc)"
2465    xen_libs="$($pkg_config --libs $xen_pc)"
2466  else
2467
2468    xen_libs="-lxenstore -lxenctrl"
2469    xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
2470
2471    # First we test whether Xen headers and libraries are available.
2472    # If no, we are done and there is no Xen support.
2473    # If yes, more tests are run to detect the Xen version.
2474
2475    # Xen (any)
2476    cat > $TMPC <<EOF
2477#include <xenctrl.h>
2478int main(void) {
2479  return 0;
2480}
2481EOF
2482    if ! compile_prog "" "$xen_libs" ; then
2483      # Xen not found
2484      if test "$xen" = "enabled" ; then
2485        feature_not_found "xen" "Install xen devel"
2486      fi
2487      xen=disabled
2488
2489    # Xen unstable
2490    elif
2491        cat > $TMPC <<EOF &&
2492#undef XC_WANT_COMPAT_DEVICEMODEL_API
2493#define __XEN_TOOLS__
2494#include <xendevicemodel.h>
2495#include <xenforeignmemory.h>
2496int main(void) {
2497  xendevicemodel_handle *xd;
2498  xenforeignmemory_handle *xfmem;
2499
2500  xd = xendevicemodel_open(0, 0);
2501  xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
2502
2503  xfmem = xenforeignmemory_open(0, 0);
2504  xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
2505
2506  return 0;
2507}
2508EOF
2509        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2510      then
2511      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2512      xen_ctrl_version=41100
2513      xen=enabled
2514    elif
2515        cat > $TMPC <<EOF &&
2516#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2517#include <xenforeignmemory.h>
2518#include <xentoolcore.h>
2519int main(void) {
2520  xenforeignmemory_handle *xfmem;
2521
2522  xfmem = xenforeignmemory_open(0, 0);
2523  xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
2524  xentoolcore_restrict_all(0);
2525
2526  return 0;
2527}
2528EOF
2529        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2530      then
2531      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2532      xen_ctrl_version=41000
2533      xen=enabled
2534    elif
2535        cat > $TMPC <<EOF &&
2536#undef XC_WANT_COMPAT_DEVICEMODEL_API
2537#define __XEN_TOOLS__
2538#include <xendevicemodel.h>
2539int main(void) {
2540  xendevicemodel_handle *xd;
2541
2542  xd = xendevicemodel_open(0, 0);
2543  xendevicemodel_close(xd);
2544
2545  return 0;
2546}
2547EOF
2548        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
2549      then
2550      xen_stable_libs="-lxendevicemodel $xen_stable_libs"
2551      xen_ctrl_version=40900
2552      xen=enabled
2553    elif
2554        cat > $TMPC <<EOF &&
2555/*
2556 * If we have stable libs the we don't want the libxc compat
2557 * layers, regardless of what CFLAGS we may have been given.
2558 *
2559 * Also, check if xengnttab_grant_copy_segment_t is defined and
2560 * grant copy operation is implemented.
2561 */
2562#undef XC_WANT_COMPAT_EVTCHN_API
2563#undef XC_WANT_COMPAT_GNTTAB_API
2564#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2565#include <xenctrl.h>
2566#include <xenstore.h>
2567#include <xenevtchn.h>
2568#include <xengnttab.h>
2569#include <xenforeignmemory.h>
2570#include <stdint.h>
2571#include <xen/hvm/hvm_info_table.h>
2572#if !defined(HVM_MAX_VCPUS)
2573# error HVM_MAX_VCPUS not defined
2574#endif
2575int main(void) {
2576  xc_interface *xc = NULL;
2577  xenforeignmemory_handle *xfmem;
2578  xenevtchn_handle *xe;
2579  xengnttab_handle *xg;
2580  xengnttab_grant_copy_segment_t* seg = NULL;
2581
2582  xs_daemon_open();
2583
2584  xc = xc_interface_open(0, 0, 0);
2585  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2586  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2587  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2588  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2589
2590  xfmem = xenforeignmemory_open(0, 0);
2591  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2592
2593  xe = xenevtchn_open(0, 0);
2594  xenevtchn_fd(xe);
2595
2596  xg = xengnttab_open(0, 0);
2597  xengnttab_grant_copy(xg, 0, seg);
2598
2599  return 0;
2600}
2601EOF
2602        compile_prog "" "$xen_libs $xen_stable_libs"
2603      then
2604      xen_ctrl_version=40800
2605      xen=enabled
2606    elif
2607        cat > $TMPC <<EOF &&
2608/*
2609 * If we have stable libs the we don't want the libxc compat
2610 * layers, regardless of what CFLAGS we may have been given.
2611 */
2612#undef XC_WANT_COMPAT_EVTCHN_API
2613#undef XC_WANT_COMPAT_GNTTAB_API
2614#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2615#include <xenctrl.h>
2616#include <xenstore.h>
2617#include <xenevtchn.h>
2618#include <xengnttab.h>
2619#include <xenforeignmemory.h>
2620#include <stdint.h>
2621#include <xen/hvm/hvm_info_table.h>
2622#if !defined(HVM_MAX_VCPUS)
2623# error HVM_MAX_VCPUS not defined
2624#endif
2625int main(void) {
2626  xc_interface *xc = NULL;
2627  xenforeignmemory_handle *xfmem;
2628  xenevtchn_handle *xe;
2629  xengnttab_handle *xg;
2630
2631  xs_daemon_open();
2632
2633  xc = xc_interface_open(0, 0, 0);
2634  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2635  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2636  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2637  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2638
2639  xfmem = xenforeignmemory_open(0, 0);
2640  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2641
2642  xe = xenevtchn_open(0, 0);
2643  xenevtchn_fd(xe);
2644
2645  xg = xengnttab_open(0, 0);
2646  xengnttab_map_grant_ref(xg, 0, 0, 0);
2647
2648  return 0;
2649}
2650EOF
2651        compile_prog "" "$xen_libs $xen_stable_libs"
2652      then
2653      xen_ctrl_version=40701
2654      xen=enabled
2655
2656    # Xen 4.6
2657    elif
2658        cat > $TMPC <<EOF &&
2659#include <xenctrl.h>
2660#include <xenstore.h>
2661#include <stdint.h>
2662#include <xen/hvm/hvm_info_table.h>
2663#if !defined(HVM_MAX_VCPUS)
2664# error HVM_MAX_VCPUS not defined
2665#endif
2666int main(void) {
2667  xc_interface *xc;
2668  xs_daemon_open();
2669  xc = xc_interface_open(0, 0, 0);
2670  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2671  xc_gnttab_open(NULL, 0);
2672  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2673  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2674  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2675  xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
2676  return 0;
2677}
2678EOF
2679        compile_prog "" "$xen_libs"
2680      then
2681      xen_ctrl_version=40600
2682      xen=enabled
2683
2684    # Xen 4.5
2685    elif
2686        cat > $TMPC <<EOF &&
2687#include <xenctrl.h>
2688#include <xenstore.h>
2689#include <stdint.h>
2690#include <xen/hvm/hvm_info_table.h>
2691#if !defined(HVM_MAX_VCPUS)
2692# error HVM_MAX_VCPUS not defined
2693#endif
2694int main(void) {
2695  xc_interface *xc;
2696  xs_daemon_open();
2697  xc = xc_interface_open(0, 0, 0);
2698  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2699  xc_gnttab_open(NULL, 0);
2700  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2701  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2702  xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
2703  return 0;
2704}
2705EOF
2706        compile_prog "" "$xen_libs"
2707      then
2708      xen_ctrl_version=40500
2709      xen=enabled
2710
2711    elif
2712        cat > $TMPC <<EOF &&
2713#include <xenctrl.h>
2714#include <xenstore.h>
2715#include <stdint.h>
2716#include <xen/hvm/hvm_info_table.h>
2717#if !defined(HVM_MAX_VCPUS)
2718# error HVM_MAX_VCPUS not defined
2719#endif
2720int main(void) {
2721  xc_interface *xc;
2722  xs_daemon_open();
2723  xc = xc_interface_open(0, 0, 0);
2724  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2725  xc_gnttab_open(NULL, 0);
2726  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2727  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2728  return 0;
2729}
2730EOF
2731        compile_prog "" "$xen_libs"
2732      then
2733      xen_ctrl_version=40200
2734      xen=enabled
2735
2736    else
2737      if test "$xen" = "enabled" ; then
2738        feature_not_found "xen (unsupported version)" \
2739                          "Install a supported xen (xen 4.2 or newer)"
2740      fi
2741      xen=disabled
2742    fi
2743
2744    if test "$xen" = enabled; then
2745      if test $xen_ctrl_version -ge 40701  ; then
2746        xen_libs="$xen_libs $xen_stable_libs "
2747      fi
2748    fi
2749  fi
2750fi
2751
2752##########################################
2753# GNUTLS probe
2754
2755if test "$gnutls" != "no"; then
2756    pass="no"
2757    if $pkg_config --exists "gnutls >= 3.1.18"; then
2758        gnutls_cflags=$($pkg_config --cflags gnutls)
2759        gnutls_libs=$($pkg_config --libs gnutls)
2760        # Packaging for the static libraries is not always correct.
2761        # At least ubuntu 18.04 ships only shared libraries.
2762        write_c_skeleton
2763        if compile_prog "" "$gnutls_libs" ; then
2764            pass="yes"
2765        fi
2766    fi
2767    if test "$pass" = "no" && test "$gnutls" = "yes"; then
2768	feature_not_found "gnutls" "Install gnutls devel >= 3.1.18"
2769    else
2770        gnutls="$pass"
2771    fi
2772fi
2773
2774
2775# If user didn't give a --disable/enable-gcrypt flag,
2776# then mark as disabled if user requested nettle
2777# explicitly
2778if test -z "$gcrypt"
2779then
2780    if test "$nettle" = "yes"
2781    then
2782        gcrypt="no"
2783    fi
2784fi
2785
2786# If user didn't give a --disable/enable-nettle flag,
2787# then mark as disabled if user requested gcrypt
2788# explicitly
2789if test -z "$nettle"
2790then
2791    if test "$gcrypt" = "yes"
2792    then
2793        nettle="no"
2794    fi
2795fi
2796
2797has_libgcrypt() {
2798    if ! has "libgcrypt-config"
2799    then
2800	return 1
2801    fi
2802
2803    if test -n "$cross_prefix"
2804    then
2805	host=$(libgcrypt-config --host)
2806	if test "$host-" != $cross_prefix
2807	then
2808	    return 1
2809	fi
2810    fi
2811
2812    maj=`libgcrypt-config --version | awk -F . '{print $1}'`
2813    min=`libgcrypt-config --version | awk -F . '{print $2}'`
2814
2815    if test $maj != 1 || test $min -lt 5
2816    then
2817       return 1
2818    fi
2819
2820    return 0
2821}
2822
2823
2824if test "$nettle" != "no"; then
2825    pass="no"
2826    if $pkg_config --exists "nettle >= 2.7.1"; then
2827        nettle_cflags=$($pkg_config --cflags nettle)
2828        nettle_libs=$($pkg_config --libs nettle)
2829        nettle_version=$($pkg_config --modversion nettle)
2830        # Link test to make sure the given libraries work (e.g for static).
2831        write_c_skeleton
2832        if compile_prog "" "$nettle_libs" ; then
2833            if test -z "$gcrypt"; then
2834               gcrypt="no"
2835            fi
2836            pass="yes"
2837        fi
2838    fi
2839    if test "$pass" = "yes"
2840    then
2841        cat > $TMPC << EOF
2842#include <nettle/xts.h>
2843int main(void) {
2844  return 0;
2845}
2846EOF
2847        if compile_prog "$nettle_cflags" "$nettle_libs" ; then
2848            nettle_xts=yes
2849            qemu_private_xts=no
2850        fi
2851    fi
2852    if test "$pass" = "no" && test "$nettle" = "yes"; then
2853        feature_not_found "nettle" "Install nettle devel >= 2.7.1"
2854    else
2855        nettle="$pass"
2856    fi
2857fi
2858
2859if test "$gcrypt" != "no"; then
2860    pass="no"
2861    if has_libgcrypt; then
2862        gcrypt_cflags=$(libgcrypt-config --cflags)
2863        gcrypt_libs=$(libgcrypt-config --libs)
2864        # Debian has removed -lgpg-error from libgcrypt-config
2865        # as it "spreads unnecessary dependencies" which in
2866        # turn breaks static builds...
2867        if test "$static" = "yes"
2868        then
2869            gcrypt_libs="$gcrypt_libs -lgpg-error"
2870        fi
2871
2872        # Link test to make sure the given libraries work (e.g for static).
2873        write_c_skeleton
2874        if compile_prog "" "$gcrypt_libs" ; then
2875            pass="yes"
2876        fi
2877    fi
2878    if test "$pass" = "yes"; then
2879        gcrypt="yes"
2880        cat > $TMPC << EOF
2881#include <gcrypt.h>
2882int main(void) {
2883  gcry_mac_hd_t handle;
2884  gcry_mac_open(&handle, GCRY_MAC_HMAC_MD5,
2885                GCRY_MAC_FLAG_SECURE, NULL);
2886  return 0;
2887}
2888EOF
2889        if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
2890            gcrypt_hmac=yes
2891        fi
2892        cat > $TMPC << EOF
2893#include <gcrypt.h>
2894int main(void) {
2895  gcry_cipher_hd_t handle;
2896  gcry_cipher_open(&handle, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_XTS, 0);
2897  return 0;
2898}
2899EOF
2900        if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
2901            gcrypt_xts=yes
2902            qemu_private_xts=no
2903        fi
2904    elif test "$gcrypt" = "yes"; then
2905        feature_not_found "gcrypt" "Install gcrypt devel >= 1.5.0"
2906    else
2907        gcrypt="no"
2908    fi
2909fi
2910
2911
2912if test "$gcrypt" = "yes" && test "$nettle" = "yes"
2913then
2914    error_exit "Only one of gcrypt & nettle can be enabled"
2915fi
2916
2917##########################################
2918# libtasn1 - only for the TLS creds/session test suite
2919
2920tasn1=yes
2921tasn1_cflags=""
2922tasn1_libs=""
2923if $pkg_config --exists "libtasn1"; then
2924    tasn1_cflags=$($pkg_config --cflags libtasn1)
2925    tasn1_libs=$($pkg_config --libs libtasn1)
2926else
2927    tasn1=no
2928fi
2929
2930
2931##########################################
2932# PAM probe
2933
2934if test "$auth_pam" != "no"; then
2935    cat > $TMPC <<EOF
2936#include <security/pam_appl.h>
2937#include <stdio.h>
2938int main(void) {
2939   const char *service_name = "qemu";
2940   const char *user = "frank";
2941   const struct pam_conv pam_conv = { 0 };
2942   pam_handle_t *pamh = NULL;
2943   pam_start(service_name, user, &pam_conv, &pamh);
2944   return 0;
2945}
2946EOF
2947    if compile_prog "" "-lpam" ; then
2948        auth_pam=yes
2949    else
2950        if test "$auth_pam" = "yes"; then
2951            feature_not_found "PAM" "Install PAM development package"
2952        else
2953            auth_pam=no
2954        fi
2955    fi
2956fi
2957
2958##########################################
2959# VTE probe
2960
2961if test "$vte" != "no"; then
2962    vteminversion="0.32.0"
2963    if $pkg_config --exists "vte-2.91"; then
2964      vtepackage="vte-2.91"
2965    else
2966      vtepackage="vte-2.90"
2967    fi
2968    if $pkg_config --exists "$vtepackage >= $vteminversion"; then
2969        vte_cflags=$($pkg_config --cflags $vtepackage)
2970        vte_libs=$($pkg_config --libs $vtepackage)
2971        vteversion=$($pkg_config --modversion $vtepackage)
2972        vte="yes"
2973    elif test "$vte" = "yes"; then
2974        feature_not_found "vte" "Install libvte-2.90/2.91 devel"
2975    else
2976        vte="no"
2977    fi
2978fi
2979
2980##########################################
2981# RDMA needs OpenFabrics libraries
2982if test "$rdma" != "no" ; then
2983  cat > $TMPC <<EOF
2984#include <rdma/rdma_cma.h>
2985int main(void) { return 0; }
2986EOF
2987  rdma_libs="-lrdmacm -libverbs -libumad"
2988  if compile_prog "" "$rdma_libs" ; then
2989    rdma="yes"
2990  else
2991    if test "$rdma" = "yes" ; then
2992        error_exit \
2993            " OpenFabrics librdmacm/libibverbs/libibumad not present." \
2994            " Your options:" \
2995            "  (1) Fast: Install infiniband packages (devel) from your distro." \
2996            "  (2) Cleanest: Install libraries from www.openfabrics.org" \
2997            "  (3) Also: Install softiwarp if you don't have RDMA hardware"
2998    fi
2999    rdma="no"
3000  fi
3001fi
3002
3003##########################################
3004# PVRDMA detection
3005
3006cat > $TMPC <<EOF &&
3007#include <sys/mman.h>
3008
3009int
3010main(void)
3011{
3012    char buf = 0;
3013    void *addr = &buf;
3014    addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
3015
3016    return 0;
3017}
3018EOF
3019
3020if test "$rdma" = "yes" ; then
3021    case "$pvrdma" in
3022    "")
3023        if compile_prog "" ""; then
3024            pvrdma="yes"
3025        else
3026            pvrdma="no"
3027        fi
3028        ;;
3029    "yes")
3030        if ! compile_prog "" ""; then
3031            error_exit "PVRDMA is not supported since mremap is not implemented"
3032        fi
3033        pvrdma="yes"
3034        ;;
3035    "no")
3036        pvrdma="no"
3037        ;;
3038    esac
3039else
3040    if test "$pvrdma" = "yes" ; then
3041        error_exit "PVRDMA requires rdma suppport"
3042    fi
3043    pvrdma="no"
3044fi
3045
3046# Let's see if enhanced reg_mr is supported
3047if test "$pvrdma" = "yes" ; then
3048
3049cat > $TMPC <<EOF &&
3050#include <infiniband/verbs.h>
3051
3052int
3053main(void)
3054{
3055    struct ibv_mr *mr;
3056    struct ibv_pd *pd = NULL;
3057    size_t length = 10;
3058    uint64_t iova = 0;
3059    int access = 0;
3060    void *addr = NULL;
3061
3062    mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
3063
3064    ibv_dereg_mr(mr);
3065
3066    return 0;
3067}
3068EOF
3069    if ! compile_prog "" "-libverbs"; then
3070        QEMU_CFLAGS="$QEMU_CFLAGS -DLEGACY_RDMA_REG_MR"
3071    fi
3072fi
3073
3074##########################################
3075# xfsctl() probe, used for file-posix.c
3076if test "$xfs" != "no" ; then
3077  cat > $TMPC << EOF
3078#include <stddef.h>  /* NULL */
3079#include <xfs/xfs.h>
3080int main(void)
3081{
3082    xfsctl(NULL, 0, 0, NULL);
3083    return 0;
3084}
3085EOF
3086  if compile_prog "" "" ; then
3087    xfs="yes"
3088  else
3089    if test "$xfs" = "yes" ; then
3090      feature_not_found "xfs" "Install xfsprogs/xfslibs devel"
3091    fi
3092    xfs=no
3093  fi
3094fi
3095
3096##########################################
3097# vde libraries probe
3098if test "$vde" != "no" ; then
3099  vde_libs="-lvdeplug"
3100  cat > $TMPC << EOF
3101#include <libvdeplug.h>
3102int main(void)
3103{
3104    struct vde_open_args a = {0, 0, 0};
3105    char s[] = "";
3106    vde_open(s, s, &a);
3107    return 0;
3108}
3109EOF
3110  if compile_prog "" "$vde_libs" ; then
3111    vde=yes
3112  else
3113    if test "$vde" = "yes" ; then
3114      feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
3115    fi
3116    vde=no
3117  fi
3118fi
3119
3120##########################################
3121# netmap support probe
3122# Apart from looking for netmap headers, we make sure that the host API version
3123# supports the netmap backend (>=11). The upper bound (15) is meant to simulate
3124# a minor/major version number. Minor new features will be marked with values up
3125# to 15, and if something happens that requires a change to the backend we will
3126# move above 15, submit the backend fixes and modify this two bounds.
3127if test "$netmap" != "no" ; then
3128  cat > $TMPC << EOF
3129#include <inttypes.h>
3130#include <net/if.h>
3131#include <net/netmap.h>
3132#include <net/netmap_user.h>
3133#if (NETMAP_API < 11) || (NETMAP_API > 15)
3134#error
3135#endif
3136int main(void) { return 0; }
3137EOF
3138  if compile_prog "" "" ; then
3139    netmap=yes
3140  else
3141    if test "$netmap" = "yes" ; then
3142      feature_not_found "netmap"
3143    fi
3144    netmap=no
3145  fi
3146fi
3147
3148##########################################
3149# Sound support libraries probe
3150
3151audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
3152for drv in $audio_drv_list; do
3153    case $drv in
3154    alsa | try-alsa)
3155    if $pkg_config alsa --exists; then
3156        alsa_libs=$($pkg_config alsa --libs)
3157        alsa_cflags=$($pkg_config alsa --cflags)
3158        alsa=yes
3159        if test "$drv" = "try-alsa"; then
3160            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa/alsa/')
3161        fi
3162    else
3163        if test "$drv" = "try-alsa"; then
3164            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa//')
3165        else
3166            error_exit "$drv check failed" \
3167                "Make sure to have the $drv libs and headers installed."
3168        fi
3169    fi
3170    ;;
3171
3172    pa | try-pa)
3173    if $pkg_config libpulse --exists; then
3174        libpulse=yes
3175        pulse_libs=$($pkg_config libpulse --libs)
3176        pulse_cflags=$($pkg_config libpulse --cflags)
3177        if test "$drv" = "try-pa"; then
3178            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa/pa/')
3179        fi
3180    else
3181        if test "$drv" = "try-pa"; then
3182            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa//')
3183        else
3184            error_exit "$drv check failed" \
3185                "Make sure to have the $drv libs and headers installed."
3186        fi
3187    fi
3188    ;;
3189
3190    sdl)
3191    if test "$sdl" = "no"; then
3192        error_exit "sdl not found or disabled, can not use sdl audio driver"
3193    fi
3194    ;;
3195
3196    try-sdl)
3197    if test "$sdl" = "no"; then
3198        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl//')
3199    else
3200        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl/sdl/')
3201    fi
3202    ;;
3203
3204    coreaudio)
3205      coreaudio_libs="-framework CoreAudio"
3206    ;;
3207
3208    dsound)
3209      dsound_libs="-lole32 -ldxguid"
3210      audio_win_int="yes"
3211    ;;
3212
3213    oss)
3214      oss_libs="$oss_lib"
3215    ;;
3216
3217    jack | try-jack)
3218    if $pkg_config jack --exists; then
3219        libjack=yes
3220        jack_libs=$($pkg_config jack --libs)
3221        if test "$drv" = "try-jack"; then
3222            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack/jack/')
3223        fi
3224    else
3225        if test "$drv" = "try-jack"; then
3226            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack//')
3227        else
3228            error_exit "$drv check failed" \
3229                "Make sure to have the $drv libs and headers installed."
3230        fi
3231    fi
3232    ;;
3233
3234    *)
3235    echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
3236        error_exit "Unknown driver '$drv' selected" \
3237            "Possible drivers are: $audio_possible_drivers"
3238    }
3239    ;;
3240    esac
3241done
3242
3243##########################################
3244# glib support probe
3245
3246glib_req_ver=2.48
3247glib_modules=gthread-2.0
3248if test "$modules" = yes; then
3249    glib_modules="$glib_modules gmodule-export-2.0"
3250fi
3251if test "$plugins" = yes; then
3252    glib_modules="$glib_modules gmodule-2.0"
3253fi
3254
3255for i in $glib_modules; do
3256    if $pkg_config --atleast-version=$glib_req_ver $i; then
3257        glib_cflags=$($pkg_config --cflags $i)
3258        glib_libs=$($pkg_config --libs $i)
3259    else
3260        error_exit "glib-$glib_req_ver $i is required to compile QEMU"
3261    fi
3262done
3263
3264# This workaround is required due to a bug in pkg-config file for glib as it
3265# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
3266
3267if test "$static" = yes && test "$mingw32" = yes; then
3268    glib_cflags="-DGLIB_STATIC_COMPILATION $glib_cflags"
3269fi
3270
3271if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
3272    gio_cflags=$($pkg_config --cflags gio-2.0)
3273    gio_libs=$($pkg_config --libs gio-2.0)
3274    gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
3275    if [ ! -x "$gdbus_codegen" ]; then
3276        gdbus_codegen=
3277    fi
3278    # Check that the libraries actually work -- Ubuntu 18.04 ships
3279    # with pkg-config --static --libs data for gio-2.0 that is missing
3280    # -lblkid and will give a link error.
3281    cat > $TMPC <<EOF
3282#include <gio/gio.h>
3283int main(void)
3284{
3285    g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
3286    return 0;
3287}
3288EOF
3289    if compile_prog "$gio_cflags" "$gio_libs" ; then
3290        gio=yes
3291    else
3292        gio=no
3293    fi
3294else
3295    gio=no
3296fi
3297
3298if $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
3299    gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
3300    gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
3301fi
3302
3303# Sanity check that the current size_t matches the
3304# size that glib thinks it should be. This catches
3305# problems on multi-arch where people try to build
3306# 32-bit QEMU while pointing at 64-bit glib headers
3307cat > $TMPC <<EOF
3308#include <glib.h>
3309#include <unistd.h>
3310
3311#define QEMU_BUILD_BUG_ON(x) \
3312  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
3313
3314int main(void) {
3315   QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
3316   return 0;
3317}
3318EOF
3319
3320if ! compile_prog "$glib_cflags" "$glib_libs" ; then
3321    error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
3322               "You probably need to set PKG_CONFIG_LIBDIR"\
3323	       "to point to the right pkg-config files for your"\
3324	       "build target"
3325fi
3326
3327# Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
3328cat > $TMPC << EOF
3329#include <glib.h>
3330int main(void) { return 0; }
3331EOF
3332if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3333    if cc_has_warning_flag "-Wno-unknown-attributes"; then
3334        glib_cflags="-Wno-unknown-attributes $glib_cflags"
3335        CONFIGURE_CFLAGS="-Wno-unknown-attributes $CONFIGURE_CFLAGS"
3336    fi
3337fi
3338
3339# Silence clang warnings triggered by glib < 2.57.2
3340cat > $TMPC << EOF
3341#include <glib.h>
3342typedef struct Foo {
3343    int i;
3344} Foo;
3345static void foo_free(Foo *f)
3346{
3347    g_free(f);
3348}
3349G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free);
3350int main(void) { return 0; }
3351EOF
3352if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3353    if cc_has_warning_flag "-Wno-unused-function"; then
3354        glib_cflags="$glib_cflags -Wno-unused-function"
3355        CONFIGURE_CFLAGS="$CONFIGURE_CFLAGS -Wno-unused-function"
3356    fi
3357fi
3358
3359##########################################
3360# SHA command probe for modules
3361if test "$modules" = yes; then
3362    shacmd_probe="sha1sum sha1 shasum"
3363    for c in $shacmd_probe; do
3364        if has $c; then
3365            shacmd="$c"
3366            break
3367        fi
3368    done
3369    if test "$shacmd" = ""; then
3370        error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
3371    fi
3372fi
3373
3374##########################################
3375# pthread probe
3376PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
3377
3378pthread=no
3379cat > $TMPC << EOF
3380#include <pthread.h>
3381static void *f(void *p) { return NULL; }
3382int main(void) {
3383  pthread_t thread;
3384  pthread_create(&thread, 0, f, 0);
3385  return 0;
3386}
3387EOF
3388if compile_prog "" "" ; then
3389  pthread=yes
3390else
3391  for pthread_lib in $PTHREADLIBS_LIST; do
3392    if compile_prog "" "$pthread_lib" ; then
3393      pthread=yes
3394      break
3395    fi
3396  done
3397fi
3398
3399if test "$mingw32" != yes && test "$pthread" = no; then
3400  error_exit "pthread check failed" \
3401      "Make sure to have the pthread libs and headers installed."
3402fi
3403
3404# check for pthread_setname_np with thread id
3405pthread_setname_np_w_tid=no
3406cat > $TMPC << EOF
3407#include <pthread.h>
3408
3409static void *f(void *p) { return NULL; }
3410int main(void)
3411{
3412    pthread_t thread;
3413    pthread_create(&thread, 0, f, 0);
3414    pthread_setname_np(thread, "QEMU");
3415    return 0;
3416}
3417EOF
3418if compile_prog "" "$pthread_lib" ; then
3419  pthread_setname_np_w_tid=yes
3420fi
3421
3422# check for pthread_setname_np without thread id
3423pthread_setname_np_wo_tid=no
3424cat > $TMPC << EOF
3425#include <pthread.h>
3426
3427static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
3428int main(void)
3429{
3430    pthread_t thread;
3431    pthread_create(&thread, 0, f, 0);
3432    return 0;
3433}
3434EOF
3435if compile_prog "" "$pthread_lib" ; then
3436  pthread_setname_np_wo_tid=yes
3437fi
3438
3439##########################################
3440# libssh probe
3441if test "$libssh" != "no" ; then
3442  if $pkg_config --exists libssh; then
3443    libssh_cflags=$($pkg_config libssh --cflags)
3444    libssh_libs=$($pkg_config libssh --libs)
3445    libssh=yes
3446  else
3447    if test "$libssh" = "yes" ; then
3448      error_exit "libssh required for --enable-libssh"
3449    fi
3450    libssh=no
3451  fi
3452fi
3453
3454##########################################
3455# Check for libssh 0.8
3456# This is done like this instead of using the LIBSSH_VERSION_* and
3457# SSH_VERSION_* macros because some distributions in the past shipped
3458# snapshots of the future 0.8 from Git, and those snapshots did not
3459# have updated version numbers (still referring to 0.7.0).
3460
3461if test "$libssh" = "yes"; then
3462  cat > $TMPC <<EOF
3463#include <libssh/libssh.h>
3464int main(void) { return ssh_get_server_publickey(NULL, NULL); }
3465EOF
3466  if compile_prog "$libssh_cflags" "$libssh_libs"; then
3467    libssh_cflags="-DHAVE_LIBSSH_0_8 $libssh_cflags"
3468  fi
3469fi
3470
3471##########################################
3472# linux-aio probe
3473
3474if test "$linux_aio" != "no" ; then
3475  cat > $TMPC <<EOF
3476#include <libaio.h>
3477#include <sys/eventfd.h>
3478#include <stddef.h>
3479int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
3480EOF
3481  if compile_prog "" "-laio" ; then
3482    linux_aio=yes
3483  else
3484    if test "$linux_aio" = "yes" ; then
3485      feature_not_found "linux AIO" "Install libaio devel"
3486    fi
3487    linux_aio=no
3488  fi
3489fi
3490##########################################
3491# linux-io-uring probe
3492
3493if test "$linux_io_uring" != "no" ; then
3494  if $pkg_config liburing; then
3495    linux_io_uring_cflags=$($pkg_config --cflags liburing)
3496    linux_io_uring_libs=$($pkg_config --libs liburing)
3497    linux_io_uring=yes
3498  else
3499    if test "$linux_io_uring" = "yes" ; then
3500      feature_not_found "linux io_uring" "Install liburing devel"
3501    fi
3502    linux_io_uring=no
3503  fi
3504fi
3505
3506##########################################
3507# TPM emulation is only on POSIX
3508
3509if test "$tpm" = ""; then
3510  if test "$mingw32" = "yes"; then
3511    tpm=no
3512  else
3513    tpm=yes
3514  fi
3515elif test "$tpm" = "yes"; then
3516  if test "$mingw32" = "yes" ; then
3517    error_exit "TPM emulation only available on POSIX systems"
3518  fi
3519fi
3520
3521##########################################
3522# iovec probe
3523cat > $TMPC <<EOF
3524#include <sys/types.h>
3525#include <sys/uio.h>
3526#include <unistd.h>
3527int main(void) { return sizeof(struct iovec); }
3528EOF
3529iovec=no
3530if compile_prog "" "" ; then
3531  iovec=yes
3532fi
3533
3534##########################################
3535# preadv probe
3536cat > $TMPC <<EOF
3537#include <sys/types.h>
3538#include <sys/uio.h>
3539#include <unistd.h>
3540int main(void) { return preadv(0, 0, 0, 0); }
3541EOF
3542preadv=no
3543if compile_prog "" "" ; then
3544  preadv=yes
3545fi
3546
3547##########################################
3548# fdt probe
3549
3550case "$fdt" in
3551  auto | enabled | internal)
3552    # Simpler to always update submodule, even if not needed.
3553    if test -e "${source_path}/.git" && test $git_update = 'yes' ; then
3554      git_submodules="${git_submodules} dtc"
3555    fi
3556    ;;
3557esac
3558
3559##########################################
3560# opengl probe (for sdl2, gtk, milkymist-tmu2)
3561
3562gbm="no"
3563if $pkg_config gbm; then
3564    gbm_cflags="$($pkg_config --cflags gbm)"
3565    gbm_libs="$($pkg_config --libs gbm)"
3566    gbm="yes"
3567fi
3568
3569if test "$opengl" != "no" ; then
3570  opengl_pkgs="epoxy gbm"
3571  if $pkg_config $opengl_pkgs; then
3572    opengl_cflags="$($pkg_config --cflags $opengl_pkgs)"
3573    opengl_libs="$($pkg_config --libs $opengl_pkgs)"
3574    opengl=yes
3575  else
3576    if test "$opengl" = "yes" ; then
3577      feature_not_found "opengl" "Please install opengl (mesa) devel pkgs: $opengl_pkgs"
3578    fi
3579    opengl_cflags=""
3580    opengl_libs=""
3581    opengl=no
3582  fi
3583fi
3584
3585if test "$opengl" = "yes"; then
3586  cat > $TMPC << EOF
3587#include <epoxy/egl.h>
3588#ifndef EGL_MESA_image_dma_buf_export
3589# error mesa/epoxy lacks support for dmabufs (mesa 10.6+)
3590#endif
3591int main(void) { return 0; }
3592EOF
3593  if compile_prog "" "" ; then
3594    opengl_dmabuf=yes
3595  fi
3596fi
3597
3598##########################################
3599# libxml2 probe
3600if test "$libxml2" != "no" ; then
3601    if $pkg_config --exists libxml-2.0; then
3602        libxml2="yes"
3603        libxml2_cflags=$($pkg_config --cflags libxml-2.0)
3604        libxml2_libs=$($pkg_config --libs libxml-2.0)
3605    else
3606        if test "$libxml2" = "yes"; then
3607            feature_not_found "libxml2" "Install libxml2 devel"
3608        fi
3609        libxml2="no"
3610    fi
3611fi
3612
3613# Check for inotify functions when we are building linux-user
3614# emulator.  This is done because older glibc versions don't
3615# have syscall stubs for these implemented.  In that case we
3616# don't provide them even if kernel supports them.
3617#
3618inotify=no
3619cat > $TMPC << EOF
3620#include <sys/inotify.h>
3621
3622int
3623main(void)
3624{
3625	/* try to start inotify */
3626	return inotify_init();
3627}
3628EOF
3629if compile_prog "" "" ; then
3630  inotify=yes
3631fi
3632
3633inotify1=no
3634cat > $TMPC << EOF
3635#include <sys/inotify.h>
3636
3637int
3638main(void)
3639{
3640    /* try to start inotify */
3641    return inotify_init1(0);
3642}
3643EOF
3644if compile_prog "" "" ; then
3645  inotify1=yes
3646fi
3647
3648# check if pipe2 is there
3649pipe2=no
3650cat > $TMPC << EOF
3651#include <unistd.h>
3652#include <fcntl.h>
3653
3654int main(void)
3655{
3656    int pipefd[2];
3657    return pipe2(pipefd, O_CLOEXEC);
3658}
3659EOF
3660if compile_prog "" "" ; then
3661  pipe2=yes
3662fi
3663
3664# check if accept4 is there
3665accept4=no
3666cat > $TMPC << EOF
3667#include <sys/socket.h>
3668#include <stddef.h>
3669
3670int main(void)
3671{
3672    accept4(0, NULL, NULL, SOCK_CLOEXEC);
3673    return 0;
3674}
3675EOF
3676if compile_prog "" "" ; then
3677  accept4=yes
3678fi
3679
3680# check if tee/splice is there. vmsplice was added same time.
3681splice=no
3682cat > $TMPC << EOF
3683#include <unistd.h>
3684#include <fcntl.h>
3685#include <limits.h>
3686
3687int main(void)
3688{
3689    int len, fd = 0;
3690    len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
3691    splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
3692    return 0;
3693}
3694EOF
3695if compile_prog "" "" ; then
3696  splice=yes
3697fi
3698
3699##########################################
3700# libnuma probe
3701
3702if test "$numa" != "no" ; then
3703  cat > $TMPC << EOF
3704#include <numa.h>
3705int main(void) { return numa_available(); }
3706EOF
3707
3708  if compile_prog "" "-lnuma" ; then
3709    numa=yes
3710    numa_libs="-lnuma"
3711  else
3712    if test "$numa" = "yes" ; then
3713      feature_not_found "numa" "install numactl devel"
3714    fi
3715    numa=no
3716  fi
3717fi
3718
3719malloc=system
3720if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
3721    echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
3722    exit 1
3723elif test "$tcmalloc" = "yes" ; then
3724    malloc=tcmalloc
3725elif test "$jemalloc" = "yes" ; then
3726    malloc=jemalloc
3727fi
3728
3729##########################################
3730# signalfd probe
3731signalfd="no"
3732cat > $TMPC << EOF
3733#include <unistd.h>
3734#include <sys/syscall.h>
3735#include <signal.h>
3736int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }
3737EOF
3738
3739if compile_prog "" "" ; then
3740  signalfd=yes
3741fi
3742
3743# check if optreset global is declared by <getopt.h>
3744optreset="no"
3745cat > $TMPC << EOF
3746#include <getopt.h>
3747int main(void) { return optreset; }
3748EOF
3749
3750if compile_prog "" "" ; then
3751  optreset=yes
3752fi
3753
3754# check if eventfd is supported
3755eventfd=no
3756cat > $TMPC << EOF
3757#include <sys/eventfd.h>
3758
3759int main(void)
3760{
3761    return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
3762}
3763EOF
3764if compile_prog "" "" ; then
3765  eventfd=yes
3766fi
3767
3768# check if memfd is supported
3769memfd=no
3770cat > $TMPC << EOF
3771#include <sys/mman.h>
3772
3773int main(void)
3774{
3775    return memfd_create("foo", MFD_ALLOW_SEALING);
3776}
3777EOF
3778if compile_prog "" "" ; then
3779  memfd=yes
3780fi
3781
3782# check for usbfs
3783have_usbfs=no
3784if test "$linux_user" = "yes"; then
3785  cat > $TMPC << EOF
3786#include <linux/usbdevice_fs.h>
3787
3788#ifndef USBDEVFS_GET_CAPABILITIES
3789#error "USBDEVFS_GET_CAPABILITIES undefined"
3790#endif
3791
3792#ifndef USBDEVFS_DISCONNECT_CLAIM
3793#error "USBDEVFS_DISCONNECT_CLAIM undefined"
3794#endif
3795
3796int main(void)
3797{
3798    return 0;
3799}
3800EOF
3801  if compile_prog "" ""; then
3802    have_usbfs=yes
3803  fi
3804fi
3805
3806# check for fallocate
3807fallocate=no
3808cat > $TMPC << EOF
3809#include <fcntl.h>
3810
3811int main(void)
3812{
3813    fallocate(0, 0, 0, 0);
3814    return 0;
3815}
3816EOF
3817if compile_prog "" "" ; then
3818  fallocate=yes
3819fi
3820
3821# check for fallocate hole punching
3822fallocate_punch_hole=no
3823cat > $TMPC << EOF
3824#include <fcntl.h>
3825#include <linux/falloc.h>
3826
3827int main(void)
3828{
3829    fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
3830    return 0;
3831}
3832EOF
3833if compile_prog "" "" ; then
3834  fallocate_punch_hole=yes
3835fi
3836
3837# check that fallocate supports range zeroing inside the file
3838fallocate_zero_range=no
3839cat > $TMPC << EOF
3840#include <fcntl.h>
3841#include <linux/falloc.h>
3842
3843int main(void)
3844{
3845    fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0);
3846    return 0;
3847}
3848EOF
3849if compile_prog "" "" ; then
3850  fallocate_zero_range=yes
3851fi
3852
3853# check for posix_fallocate
3854posix_fallocate=no
3855cat > $TMPC << EOF
3856#include <fcntl.h>
3857
3858int main(void)
3859{
3860    posix_fallocate(0, 0, 0);
3861    return 0;
3862}
3863EOF
3864if compile_prog "" "" ; then
3865    posix_fallocate=yes
3866fi
3867
3868# check for sync_file_range
3869sync_file_range=no
3870cat > $TMPC << EOF
3871#include <fcntl.h>
3872
3873int main(void)
3874{
3875    sync_file_range(0, 0, 0, 0);
3876    return 0;
3877}
3878EOF
3879if compile_prog "" "" ; then
3880  sync_file_range=yes
3881fi
3882
3883# check for linux/fiemap.h and FS_IOC_FIEMAP
3884fiemap=no
3885cat > $TMPC << EOF
3886#include <sys/ioctl.h>
3887#include <linux/fs.h>
3888#include <linux/fiemap.h>
3889
3890int main(void)
3891{
3892    ioctl(0, FS_IOC_FIEMAP, 0);
3893    return 0;
3894}
3895EOF
3896if compile_prog "" "" ; then
3897  fiemap=yes
3898fi
3899
3900# check for dup3
3901dup3=no
3902cat > $TMPC << EOF
3903#include <unistd.h>
3904
3905int main(void)
3906{
3907    dup3(0, 0, 0);
3908    return 0;
3909}
3910EOF
3911if compile_prog "" "" ; then
3912  dup3=yes
3913fi
3914
3915# check for ppoll support
3916ppoll=no
3917cat > $TMPC << EOF
3918#include <poll.h>
3919
3920int main(void)
3921{
3922    struct pollfd pfd = { .fd = 0, .events = 0, .revents = 0 };
3923    ppoll(&pfd, 1, 0, 0);
3924    return 0;
3925}
3926EOF
3927if compile_prog "" "" ; then
3928  ppoll=yes
3929fi
3930
3931# check for prctl(PR_SET_TIMERSLACK , ... ) support
3932prctl_pr_set_timerslack=no
3933cat > $TMPC << EOF
3934#include <sys/prctl.h>
3935
3936int main(void)
3937{
3938    prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0);
3939    return 0;
3940}
3941EOF
3942if compile_prog "" "" ; then
3943  prctl_pr_set_timerslack=yes
3944fi
3945
3946# check for epoll support
3947epoll=no
3948cat > $TMPC << EOF
3949#include <sys/epoll.h>
3950
3951int main(void)
3952{
3953    epoll_create(0);
3954    return 0;
3955}
3956EOF
3957if compile_prog "" "" ; then
3958  epoll=yes
3959fi
3960
3961# epoll_create1 is a later addition
3962# so we must check separately for its presence
3963epoll_create1=no
3964cat > $TMPC << EOF
3965#include <sys/epoll.h>
3966
3967int main(void)
3968{
3969    /* Note that we use epoll_create1 as a value, not as
3970     * a function being called. This is necessary so that on
3971     * old SPARC glibc versions where the function was present in
3972     * the library but not declared in the header file we will
3973     * fail the configure check. (Otherwise we will get a compiler
3974     * warning but not an error, and will proceed to fail the
3975     * qemu compile where we compile with -Werror.)
3976     */
3977    return (int)(uintptr_t)&epoll_create1;
3978}
3979EOF
3980if compile_prog "" "" ; then
3981  epoll_create1=yes
3982fi
3983
3984# check for sendfile support
3985sendfile=no
3986cat > $TMPC << EOF
3987#include <sys/sendfile.h>
3988
3989int main(void)
3990{
3991    return sendfile(0, 0, 0, 0);
3992}
3993EOF
3994if compile_prog "" "" ; then
3995  sendfile=yes
3996fi
3997
3998# check for timerfd support (glibc 2.8 and newer)
3999timerfd=no
4000cat > $TMPC << EOF
4001#include <sys/timerfd.h>
4002
4003int main(void)
4004{
4005    return(timerfd_create(CLOCK_REALTIME, 0));
4006}
4007EOF
4008if compile_prog "" "" ; then
4009  timerfd=yes
4010fi
4011
4012# check for setns and unshare support
4013setns=no
4014cat > $TMPC << EOF
4015#include <sched.h>
4016
4017int main(void)
4018{
4019    int ret;
4020    ret = setns(0, 0);
4021    ret = unshare(0);
4022    return ret;
4023}
4024EOF
4025if compile_prog "" "" ; then
4026  setns=yes
4027fi
4028
4029# clock_adjtime probe
4030clock_adjtime=no
4031cat > $TMPC <<EOF
4032#include <time.h>
4033#include <sys/timex.h>
4034
4035int main(void)
4036{
4037    return clock_adjtime(0, 0);
4038}
4039EOF
4040clock_adjtime=no
4041if compile_prog "" "" ; then
4042  clock_adjtime=yes
4043fi
4044
4045# syncfs probe
4046syncfs=no
4047cat > $TMPC <<EOF
4048#include <unistd.h>
4049
4050int main(void)
4051{
4052    return syncfs(0);
4053}
4054EOF
4055syncfs=no
4056if compile_prog "" "" ; then
4057  syncfs=yes
4058fi
4059
4060# Search for bswap_32 function
4061byteswap_h=no
4062cat > $TMPC << EOF
4063#include <byteswap.h>
4064int main(void) { return bswap_32(0); }
4065EOF
4066if compile_prog "" "" ; then
4067  byteswap_h=yes
4068fi
4069
4070# Search for bswap32 function
4071bswap_h=no
4072cat > $TMPC << EOF
4073#include <sys/endian.h>
4074#include <sys/types.h>
4075#include <machine/bswap.h>
4076int main(void) { return bswap32(0); }
4077EOF
4078if compile_prog "" "" ; then
4079  bswap_h=yes
4080fi
4081
4082# Check whether we have openpty() in either libc or libutil
4083cat > $TMPC << EOF
4084extern int openpty(int *am, int *as, char *name, void *termp, void *winp);
4085int main(void) { return openpty(0, 0, 0, 0, 0); }
4086EOF
4087
4088have_openpty="no"
4089if compile_prog "" "" ; then
4090  have_openpty="yes"
4091else
4092  if compile_prog "" "-lutil" ; then
4093    have_openpty="yes"
4094  fi
4095fi
4096
4097##########################################
4098# spice probe
4099if test "$spice" != "no" ; then
4100  cat > $TMPC << EOF
4101#include <spice.h>
4102int main(void) { spice_server_new(); return 0; }
4103EOF
4104  spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
4105  spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
4106  if $pkg_config --atleast-version=0.12.5 spice-server && \
4107     $pkg_config --atleast-version=0.12.3 spice-protocol && \
4108     compile_prog "$spice_cflags" "$spice_libs" ; then
4109    spice="yes"
4110  else
4111    if test "$spice" = "yes" ; then
4112      feature_not_found "spice" \
4113          "Install spice-server(>=0.12.5) and spice-protocol(>=0.12.3) devel"
4114    fi
4115    spice="no"
4116  fi
4117fi
4118
4119# check for smartcard support
4120if test "$smartcard" != "no"; then
4121    if $pkg_config --atleast-version=2.5.1 libcacard; then
4122        libcacard_cflags=$($pkg_config --cflags libcacard)
4123        libcacard_libs=$($pkg_config --libs libcacard)
4124        smartcard="yes"
4125    else
4126        if test "$smartcard" = "yes"; then
4127            feature_not_found "smartcard" "Install libcacard devel"
4128        fi
4129        smartcard="no"
4130    fi
4131fi
4132
4133# check for libusb
4134if test "$libusb" != "no" ; then
4135    if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
4136        libusb="yes"
4137        libusb_cflags=$($pkg_config --cflags libusb-1.0)
4138        libusb_libs=$($pkg_config --libs libusb-1.0)
4139    else
4140        if test "$libusb" = "yes"; then
4141            feature_not_found "libusb" "Install libusb devel >= 1.0.13"
4142        fi
4143        libusb="no"
4144    fi
4145fi
4146
4147# check for usbredirparser for usb network redirection support
4148if test "$usb_redir" != "no" ; then
4149    if $pkg_config --atleast-version=0.6 libusbredirparser-0.5; then
4150        usb_redir="yes"
4151        usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5)
4152        usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5)
4153    else
4154        if test "$usb_redir" = "yes"; then
4155            feature_not_found "usb-redir" "Install usbredir devel"
4156        fi
4157        usb_redir="no"
4158    fi
4159fi
4160
4161##########################################
4162# check if we have VSS SDK headers for win
4163
4164if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
4165        test "$vss_win32_sdk" != "no" ; then
4166  case "$vss_win32_sdk" in
4167    "")   vss_win32_include="-isystem $source_path" ;;
4168    *\ *) # The SDK is installed in "Program Files" by default, but we cannot
4169          # handle path with spaces. So we symlink the headers into ".sdk/vss".
4170          vss_win32_include="-isystem $source_path/.sdk/vss"
4171	  symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
4172	  ;;
4173    *)    vss_win32_include="-isystem $vss_win32_sdk"
4174  esac
4175  cat > $TMPC << EOF
4176#define __MIDL_user_allocate_free_DEFINED__
4177#include <inc/win2003/vss.h>
4178int main(void) { return VSS_CTX_BACKUP; }
4179EOF
4180  if compile_prog "$vss_win32_include" "" ; then
4181    guest_agent_with_vss="yes"
4182    QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
4183    libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
4184    qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
4185  else
4186    if test "$vss_win32_sdk" != "" ; then
4187      echo "ERROR: Please download and install Microsoft VSS SDK:"
4188      echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
4189      echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
4190      echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
4191      echo "ERROR: The headers are extracted in the directory \`inc'."
4192      feature_not_found "VSS support"
4193    fi
4194    guest_agent_with_vss="no"
4195  fi
4196fi
4197
4198##########################################
4199# lookup Windows platform SDK (if not specified)
4200# The SDK is needed only to build .tlb (type library) file of guest agent
4201# VSS provider from the source. It is usually unnecessary because the
4202# pre-compiled .tlb file is included.
4203
4204if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
4205        test "$guest_agent_with_vss" = "yes" ; then
4206  if test -z "$win_sdk"; then
4207    programfiles="$PROGRAMFILES"
4208    test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
4209    if test -n "$programfiles"; then
4210      win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
4211    else
4212      feature_not_found "Windows SDK"
4213    fi
4214  elif test "$win_sdk" = "no"; then
4215    win_sdk=""
4216  fi
4217fi
4218
4219##########################################
4220# check if mingw environment provides a recent ntddscsi.h
4221if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
4222  cat > $TMPC << EOF
4223#include <windows.h>
4224#include <ntddscsi.h>
4225int main(void) {
4226#if !defined(IOCTL_SCSI_GET_ADDRESS)
4227#error Missing required ioctl definitions
4228#endif
4229  SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
4230  return addr.Lun;
4231}
4232EOF
4233  if compile_prog "" "" ; then
4234    guest_agent_ntddscsi=yes
4235    libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
4236  fi
4237fi
4238
4239##########################################
4240# virgl renderer probe
4241
4242if test "$virglrenderer" != "no" ; then
4243  cat > $TMPC << EOF
4244#include <virglrenderer.h>
4245int main(void) { virgl_renderer_poll(); return 0; }
4246EOF
4247  virgl_cflags=$($pkg_config --cflags virglrenderer 2>/dev/null)
4248  virgl_libs=$($pkg_config --libs virglrenderer 2>/dev/null)
4249  virgl_version=$($pkg_config --modversion virglrenderer 2>/dev/null)
4250  if $pkg_config virglrenderer >/dev/null 2>&1 && \
4251     compile_prog "$virgl_cflags" "$virgl_libs" ; then
4252    virglrenderer="yes"
4253  else
4254    if test "$virglrenderer" = "yes" ; then
4255      feature_not_found "virglrenderer"
4256    fi
4257    virglrenderer="no"
4258  fi
4259fi
4260
4261##########################################
4262# capstone
4263
4264case "$capstone" in
4265  auto | enabled | internal)
4266    # Simpler to always update submodule, even if not needed.
4267    if test -e "${source_path}/.git" && test $git_update = 'yes' ; then
4268      git_submodules="${git_submodules} capstone"
4269    fi
4270    ;;
4271esac
4272
4273##########################################
4274# check if we have fdatasync
4275
4276fdatasync=no
4277cat > $TMPC << EOF
4278#include <unistd.h>
4279int main(void) {
4280#if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
4281return fdatasync(0);
4282#else
4283#error Not supported
4284#endif
4285}
4286EOF
4287if compile_prog "" "" ; then
4288    fdatasync=yes
4289fi
4290
4291##########################################
4292# check if we have madvise
4293
4294madvise=no
4295cat > $TMPC << EOF
4296#include <sys/types.h>
4297#include <sys/mman.h>
4298#include <stddef.h>
4299int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }
4300EOF
4301if compile_prog "" "" ; then
4302    madvise=yes
4303fi
4304
4305##########################################
4306# check if we have posix_madvise
4307
4308posix_madvise=no
4309cat > $TMPC << EOF
4310#include <sys/mman.h>
4311#include <stddef.h>
4312int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }
4313EOF
4314if compile_prog "" "" ; then
4315    posix_madvise=yes
4316fi
4317
4318##########################################
4319# check if we have posix_memalign()
4320
4321posix_memalign=no
4322cat > $TMPC << EOF
4323#include <stdlib.h>
4324int main(void) {
4325    void *p;
4326    return posix_memalign(&p, 8, 8);
4327}
4328EOF
4329if compile_prog "" "" ; then
4330    posix_memalign=yes
4331fi
4332
4333##########################################
4334# check if we have posix_syslog
4335
4336posix_syslog=no
4337cat > $TMPC << EOF
4338#include <syslog.h>
4339int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; }
4340EOF
4341if compile_prog "" "" ; then
4342    posix_syslog=yes
4343fi
4344
4345##########################################
4346# check if we have sem_timedwait
4347
4348sem_timedwait=no
4349cat > $TMPC << EOF
4350#include <semaphore.h>
4351int main(void) { sem_t s; struct timespec t = {0}; return sem_timedwait(&s, &t); }
4352EOF
4353if compile_prog "" "" ; then
4354    sem_timedwait=yes
4355fi
4356
4357##########################################
4358# check if we have strchrnul
4359
4360strchrnul=no
4361cat > $TMPC << EOF
4362#include <string.h>
4363int main(void);
4364// Use a haystack that the compiler shouldn't be able to constant fold
4365char *haystack = (char*)&main;
4366int main(void) { return strchrnul(haystack, 'x') != &haystack[6]; }
4367EOF
4368if compile_prog "" "" ; then
4369    strchrnul=yes
4370fi
4371
4372#########################################
4373# check if we have st_atim
4374
4375st_atim=no
4376cat > $TMPC << EOF
4377#include <sys/stat.h>
4378#include <stddef.h>
4379int main(void) { return offsetof(struct stat, st_atim); }
4380EOF
4381if compile_prog "" "" ; then
4382    st_atim=yes
4383fi
4384
4385##########################################
4386# check if trace backend exists
4387
4388$python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
4389if test "$?" -ne 0 ; then
4390  error_exit "invalid trace backends" \
4391      "Please choose supported trace backends."
4392fi
4393
4394##########################################
4395# For 'ust' backend, test if ust headers are present
4396if have_backend "ust"; then
4397  cat > $TMPC << EOF
4398#include <lttng/tracepoint.h>
4399int main(void) { return 0; }
4400EOF
4401  if compile_prog "" "-Wl,--no-as-needed -ldl" ; then
4402    if $pkg_config lttng-ust --exists; then
4403      lttng_ust_libs=$($pkg_config --libs lttng-ust)
4404    else
4405      lttng_ust_libs="-llttng-ust -ldl"
4406    fi
4407    if $pkg_config liburcu-bp --exists; then
4408      urcu_bp_libs=$($pkg_config --libs liburcu-bp)
4409    else
4410      urcu_bp_libs="-lurcu-bp"
4411    fi
4412  else
4413    error_exit "Trace backend 'ust' missing lttng-ust header files"
4414  fi
4415fi
4416
4417##########################################
4418# For 'dtrace' backend, test if 'dtrace' command is present
4419if have_backend "dtrace"; then
4420  if ! has 'dtrace' ; then
4421    error_exit "dtrace command is not found in PATH $PATH"
4422  fi
4423  trace_backend_stap="no"
4424  if has 'stap' ; then
4425    trace_backend_stap="yes"
4426
4427    # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
4428    # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
4429    # instead. QEMU --enable-modules depends on this because the SystemTap
4430    # semaphores are linked into the main binary and not the module's shared
4431    # object.
4432    QEMU_CFLAGS="$QEMU_CFLAGS -DSTAP_SDT_V2"
4433  fi
4434fi
4435
4436##########################################
4437# check and set a backend for coroutine
4438
4439# We prefer ucontext, but it's not always possible. The fallback
4440# is sigcontext. On Windows the only valid backend is the Windows
4441# specific one.
4442
4443ucontext_works=no
4444if test "$darwin" != "yes"; then
4445  cat > $TMPC << EOF
4446#include <ucontext.h>
4447#ifdef __stub_makecontext
4448#error Ignoring glibc stub makecontext which will always fail
4449#endif
4450int main(void) { makecontext(0, 0, 0); return 0; }
4451EOF
4452  if compile_prog "" "" ; then
4453    ucontext_works=yes
4454  fi
4455fi
4456
4457if test "$coroutine" = ""; then
4458  if test "$mingw32" = "yes"; then
4459    coroutine=win32
4460  elif test "$ucontext_works" = "yes"; then
4461    coroutine=ucontext
4462  else
4463    coroutine=sigaltstack
4464  fi
4465else
4466  case $coroutine in
4467  windows)
4468    if test "$mingw32" != "yes"; then
4469      error_exit "'windows' coroutine backend only valid for Windows"
4470    fi
4471    # Unfortunately the user visible backend name doesn't match the
4472    # coroutine-*.c filename for this case, so we have to adjust it here.
4473    coroutine=win32
4474    ;;
4475  ucontext)
4476    if test "$ucontext_works" != "yes"; then
4477      feature_not_found "ucontext"
4478    fi
4479    ;;
4480  sigaltstack)
4481    if test "$mingw32" = "yes"; then
4482      error_exit "only the 'windows' coroutine backend is valid for Windows"
4483    fi
4484    ;;
4485  *)
4486    error_exit "unknown coroutine backend $coroutine"
4487    ;;
4488  esac
4489fi
4490
4491if test "$coroutine_pool" = ""; then
4492  coroutine_pool=yes
4493fi
4494
4495if test "$debug_stack_usage" = "yes"; then
4496  if test "$coroutine_pool" = "yes"; then
4497    echo "WARN: disabling coroutine pool for stack usage debugging"
4498    coroutine_pool=no
4499  fi
4500fi
4501
4502##################################################
4503# SafeStack
4504
4505
4506if test "$safe_stack" = "yes"; then
4507cat > $TMPC << EOF
4508int main(int argc, char *argv[])
4509{
4510#if ! __has_feature(safe_stack)
4511#error SafeStack Disabled
4512#endif
4513    return 0;
4514}
4515EOF
4516  flag="-fsanitize=safe-stack"
4517  # Check that safe-stack is supported and enabled.
4518  if compile_prog "-Werror $flag" "$flag"; then
4519    # Flag needed both at compilation and at linking
4520    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
4521    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
4522  else
4523    error_exit "SafeStack not supported by your compiler"
4524  fi
4525  if test "$coroutine" != "ucontext"; then
4526    error_exit "SafeStack is only supported by the coroutine backend ucontext"
4527  fi
4528else
4529cat > $TMPC << EOF
4530int main(int argc, char *argv[])
4531{
4532#if defined(__has_feature)
4533#if __has_feature(safe_stack)
4534#error SafeStack Enabled
4535#endif
4536#endif
4537    return 0;
4538}
4539EOF
4540if test "$safe_stack" = "no"; then
4541  # Make sure that safe-stack is disabled
4542  if ! compile_prog "-Werror" ""; then
4543    # SafeStack was already enabled, try to explicitly remove the feature
4544    flag="-fno-sanitize=safe-stack"
4545    if ! compile_prog "-Werror $flag" "$flag"; then
4546      error_exit "Configure cannot disable SafeStack"
4547    fi
4548    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
4549    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
4550  fi
4551else # "$safe_stack" = ""
4552  # Set safe_stack to yes or no based on pre-existing flags
4553  if compile_prog "-Werror" ""; then
4554    safe_stack="no"
4555  else
4556    safe_stack="yes"
4557    if test "$coroutine" != "ucontext"; then
4558      error_exit "SafeStack is only supported by the coroutine backend ucontext"
4559    fi
4560  fi
4561fi
4562fi
4563
4564##########################################
4565# check if we have open_by_handle_at
4566
4567open_by_handle_at=no
4568cat > $TMPC << EOF
4569#include <fcntl.h>
4570#if !defined(AT_EMPTY_PATH)
4571# error missing definition
4572#else
4573int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
4574#endif
4575EOF
4576if compile_prog "" "" ; then
4577    open_by_handle_at=yes
4578fi
4579
4580########################################
4581# check if we have linux/magic.h
4582
4583linux_magic_h=no
4584cat > $TMPC << EOF
4585#include <linux/magic.h>
4586int main(void) {
4587  return 0;
4588}
4589EOF
4590if compile_prog "" "" ; then
4591    linux_magic_h=yes
4592fi
4593
4594########################################
4595# check if we have valgrind/valgrind.h
4596
4597valgrind_h=no
4598cat > $TMPC << EOF
4599#include <valgrind/valgrind.h>
4600int main(void) {
4601  return 0;
4602}
4603EOF
4604if compile_prog "" "" ; then
4605    valgrind_h=yes
4606fi
4607
4608########################################
4609# check if environ is declared
4610
4611has_environ=no
4612cat > $TMPC << EOF
4613#include <unistd.h>
4614int main(void) {
4615    environ = 0;
4616    return 0;
4617}
4618EOF
4619if compile_prog "" "" ; then
4620    has_environ=yes
4621fi
4622
4623########################################
4624# check if cpuid.h is usable.
4625
4626cat > $TMPC << EOF
4627#include <cpuid.h>
4628int main(void) {
4629    unsigned a, b, c, d;
4630    int max = __get_cpuid_max(0, 0);
4631
4632    if (max >= 1) {
4633        __cpuid(1, a, b, c, d);
4634    }
4635
4636    if (max >= 7) {
4637        __cpuid_count(7, 0, a, b, c, d);
4638    }
4639
4640    return 0;
4641}
4642EOF
4643if compile_prog "" "" ; then
4644    cpuid_h=yes
4645fi
4646
4647##########################################
4648# avx2 optimization requirement check
4649#
4650# There is no point enabling this if cpuid.h is not usable,
4651# since we won't be able to select the new routines.
4652
4653if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
4654  cat > $TMPC << EOF
4655#pragma GCC push_options
4656#pragma GCC target("avx2")
4657#include <cpuid.h>
4658#include <immintrin.h>
4659static int bar(void *a) {
4660    __m256i x = *(__m256i *)a;
4661    return _mm256_testz_si256(x, x);
4662}
4663int main(int argc, char *argv[]) { return bar(argv[0]); }
4664EOF
4665  if compile_object "" ; then
4666    avx2_opt="yes"
4667  else
4668    avx2_opt="no"
4669  fi
4670fi
4671
4672##########################################
4673# avx512f optimization requirement check
4674#
4675# There is no point enabling this if cpuid.h is not usable,
4676# since we won't be able to select the new routines.
4677# by default, it is turned off.
4678# if user explicitly want to enable it, check environment
4679
4680if test "$cpuid_h" = "yes" && test "$avx512f_opt" = "yes"; then
4681  cat > $TMPC << EOF
4682#pragma GCC push_options
4683#pragma GCC target("avx512f")
4684#include <cpuid.h>
4685#include <immintrin.h>
4686static int bar(void *a) {
4687    __m512i x = *(__m512i *)a;
4688    return _mm512_test_epi64_mask(x, x);
4689}
4690int main(int argc, char *argv[])
4691{
4692	return bar(argv[0]);
4693}
4694EOF
4695  if ! compile_object "" ; then
4696    avx512f_opt="no"
4697  fi
4698else
4699  avx512f_opt="no"
4700fi
4701
4702########################################
4703# check if __[u]int128_t is usable.
4704
4705int128=no
4706cat > $TMPC << EOF
4707__int128_t a;
4708__uint128_t b;
4709int main (void) {
4710  a = a + b;
4711  b = a * b;
4712  a = a * a;
4713  return 0;
4714}
4715EOF
4716if compile_prog "" "" ; then
4717    int128=yes
4718fi
4719
4720#########################################
4721# See if 128-bit atomic operations are supported.
4722
4723atomic128=no
4724if test "$int128" = "yes"; then
4725  cat > $TMPC << EOF
4726int main(void)
4727{
4728  unsigned __int128 x = 0, y = 0;
4729  y = __atomic_load_16(&x, 0);
4730  __atomic_store_16(&x, y, 0);
4731  __atomic_compare_exchange_16(&x, &y, x, 0, 0, 0);
4732  return 0;
4733}
4734EOF
4735  if compile_prog "" "" ; then
4736    atomic128=yes
4737  fi
4738fi
4739
4740cmpxchg128=no
4741if test "$int128" = yes && test "$atomic128" = no; then
4742  cat > $TMPC << EOF
4743int main(void)
4744{
4745  unsigned __int128 x = 0, y = 0;
4746  __sync_val_compare_and_swap_16(&x, y, x);
4747  return 0;
4748}
4749EOF
4750  if compile_prog "" "" ; then
4751    cmpxchg128=yes
4752  fi
4753fi
4754
4755#########################################
4756# See if 64-bit atomic operations are supported.
4757# Note that without __atomic builtins, we can only
4758# assume atomic loads/stores max at pointer size.
4759
4760cat > $TMPC << EOF
4761#include <stdint.h>
4762int main(void)
4763{
4764  uint64_t x = 0, y = 0;
4765#ifdef __ATOMIC_RELAXED
4766  y = __atomic_load_n(&x, __ATOMIC_RELAXED);
4767  __atomic_store_n(&x, y, __ATOMIC_RELAXED);
4768  __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
4769  __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
4770  __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
4771#else
4772  typedef char is_host64[sizeof(void *) >= sizeof(uint64_t) ? 1 : -1];
4773  __sync_lock_test_and_set(&x, y);
4774  __sync_val_compare_and_swap(&x, y, 0);
4775  __sync_fetch_and_add(&x, y);
4776#endif
4777  return 0;
4778}
4779EOF
4780if compile_prog "" "" ; then
4781  atomic64=yes
4782fi
4783
4784#########################################
4785# See if --dynamic-list is supported by the linker
4786ld_dynamic_list="no"
4787if test "$static" = "no" ; then
4788    cat > $TMPTXT <<EOF
4789{
4790  foo;
4791};
4792EOF
4793
4794    cat > $TMPC <<EOF
4795#include <stdio.h>
4796void foo(void);
4797
4798void foo(void)
4799{
4800  printf("foo\n");
4801}
4802
4803int main(void)
4804{
4805  foo();
4806  return 0;
4807}
4808EOF
4809
4810    if compile_prog "" "-Wl,--dynamic-list=$TMPTXT" ; then
4811        ld_dynamic_list="yes"
4812    fi
4813fi
4814
4815#########################################
4816# See if -exported_symbols_list is supported by the linker
4817
4818ld_exported_symbols_list="no"
4819if test "$static" = "no" ; then
4820    cat > $TMPTXT <<EOF
4821  _foo
4822EOF
4823
4824    if compile_prog "" "-Wl,-exported_symbols_list,$TMPTXT" ; then
4825        ld_exported_symbols_list="yes"
4826    fi
4827fi
4828
4829if  test "$plugins" = "yes" &&
4830    test "$ld_dynamic_list" = "no" &&
4831    test "$ld_exported_symbols_list" = "no" ; then
4832  error_exit \
4833      "Plugin support requires dynamic linking and specifying a set of symbols " \
4834      "that are exported to plugins. Unfortunately your linker doesn't " \
4835      "support the flag (--dynamic-list or -exported_symbols_list) used " \
4836      "for this purpose. You can't build with --static."
4837fi
4838
4839########################################
4840# See if __attribute__((alias)) is supported.
4841# This false for Xcode 9, but has been remedied for Xcode 10.
4842# Unfortunately, travis uses Xcode 9 by default.
4843
4844attralias=no
4845cat > $TMPC << EOF
4846int x = 1;
4847extern const int y __attribute__((alias("x")));
4848int main(void) { return 0; }
4849EOF
4850if compile_prog "" "" ; then
4851    attralias=yes
4852fi
4853
4854########################################
4855# check if getauxval is available.
4856
4857getauxval=no
4858cat > $TMPC << EOF
4859#include <sys/auxv.h>
4860int main(void) {
4861  return getauxval(AT_HWCAP) == 0;
4862}
4863EOF
4864if compile_prog "" "" ; then
4865    getauxval=yes
4866fi
4867
4868########################################
4869# check if ccache is interfering with
4870# semantic analysis of macros
4871
4872unset CCACHE_CPP2
4873ccache_cpp2=no
4874cat > $TMPC << EOF
4875static const int Z = 1;
4876#define fn() ({ Z; })
4877#define TAUT(X) ((X) == Z)
4878#define PAREN(X, Y) (X == Y)
4879#define ID(X) (X)
4880int main(int argc, char *argv[])
4881{
4882    int x = 0, y = 0;
4883    x = ID(x);
4884    x = fn();
4885    fn();
4886    if (PAREN(x, y)) return 0;
4887    if (TAUT(Z)) return 0;
4888    return 0;
4889}
4890EOF
4891
4892if ! compile_object "-Werror"; then
4893    ccache_cpp2=yes
4894fi
4895
4896#################################################
4897# clang does not support glibc + FORTIFY_SOURCE.
4898
4899if test "$fortify_source" != "no"; then
4900  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
4901    fortify_source="no";
4902  elif test -n "$cxx" && has $cxx &&
4903       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
4904    fortify_source="no";
4905  else
4906    fortify_source="yes"
4907  fi
4908fi
4909
4910###############################################
4911# Check if copy_file_range is provided by glibc
4912have_copy_file_range=no
4913cat > $TMPC << EOF
4914#include <unistd.h>
4915int main(void) {
4916  copy_file_range(0, NULL, 0, NULL, 0, 0);
4917  return 0;
4918}
4919EOF
4920if compile_prog "" "" ; then
4921    have_copy_file_range=yes
4922fi
4923
4924##########################################
4925# check if struct fsxattr is available via linux/fs.h
4926
4927have_fsxattr=no
4928cat > $TMPC << EOF
4929#include <linux/fs.h>
4930struct fsxattr foo;
4931int main(void) {
4932  return 0;
4933}
4934EOF
4935if compile_prog "" "" ; then
4936    have_fsxattr=yes
4937fi
4938
4939##########################################
4940# check for usable membarrier system call
4941if test "$membarrier" = "yes"; then
4942    have_membarrier=no
4943    if test "$mingw32" = "yes" ; then
4944        have_membarrier=yes
4945    elif test "$linux" = "yes" ; then
4946        cat > $TMPC << EOF
4947    #include <linux/membarrier.h>
4948    #include <sys/syscall.h>
4949    #include <unistd.h>
4950    #include <stdlib.h>
4951    int main(void) {
4952        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
4953        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
4954	exit(0);
4955    }
4956EOF
4957        if compile_prog "" "" ; then
4958            have_membarrier=yes
4959        fi
4960    fi
4961    if test "$have_membarrier" = "no"; then
4962      feature_not_found "membarrier" "membarrier system call not available"
4963    fi
4964else
4965    # Do not enable it by default even for Mingw32, because it doesn't
4966    # work on Wine.
4967    membarrier=no
4968fi
4969
4970##########################################
4971# check if rtnetlink.h exists and is useful
4972have_rtnetlink=no
4973cat > $TMPC << EOF
4974#include <linux/rtnetlink.h>
4975int main(void) {
4976  return IFLA_PROTO_DOWN;
4977}
4978EOF
4979if compile_prog "" "" ; then
4980    have_rtnetlink=yes
4981fi
4982
4983##########################################
4984# check for usable AF_VSOCK environment
4985have_af_vsock=no
4986cat > $TMPC << EOF
4987#include <errno.h>
4988#include <sys/types.h>
4989#include <sys/socket.h>
4990#if !defined(AF_VSOCK)
4991# error missing AF_VSOCK flag
4992#endif
4993#include <linux/vm_sockets.h>
4994int main(void) {
4995    int sock, ret;
4996    struct sockaddr_vm svm;
4997    socklen_t len = sizeof(svm);
4998    sock = socket(AF_VSOCK, SOCK_STREAM, 0);
4999    ret = getpeername(sock, (struct sockaddr *)&svm, &len);
5000    if ((ret == -1) && (errno == ENOTCONN)) {
5001        return 0;
5002    }
5003    return -1;
5004}
5005EOF
5006if compile_prog "" "" ; then
5007    have_af_vsock=yes
5008fi
5009
5010##########################################
5011# check for usable AF_ALG environment
5012have_afalg=no
5013cat > $TMPC << EOF
5014#include <errno.h>
5015#include <sys/types.h>
5016#include <sys/socket.h>
5017#include <linux/if_alg.h>
5018int main(void) {
5019    int sock;
5020    sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
5021    return sock;
5022}
5023EOF
5024if compile_prog "" "" ; then
5025    have_afalg=yes
5026fi
5027if test "$crypto_afalg" = "yes"
5028then
5029    if test "$have_afalg" != "yes"
5030    then
5031	error_exit "AF_ALG requested but could not be detected"
5032    fi
5033fi
5034
5035
5036#################################################
5037# check for sysmacros.h
5038
5039have_sysmacros=no
5040cat > $TMPC << EOF
5041#include <sys/sysmacros.h>
5042int main(void) {
5043    return makedev(0, 0);
5044}
5045EOF
5046if compile_prog "" "" ; then
5047    have_sysmacros=yes
5048fi
5049
5050##########################################
5051# check for _Static_assert()
5052
5053have_static_assert=no
5054cat > $TMPC << EOF
5055_Static_assert(1, "success");
5056int main(void) {
5057    return 0;
5058}
5059EOF
5060if compile_prog "" "" ; then
5061    have_static_assert=yes
5062fi
5063
5064##########################################
5065# check for utmpx.h, it is missing e.g. on OpenBSD
5066
5067have_utmpx=no
5068cat > $TMPC << EOF
5069#include <utmpx.h>
5070struct utmpx user_info;
5071int main(void) {
5072    return 0;
5073}
5074EOF
5075if compile_prog "" "" ; then
5076    have_utmpx=yes
5077fi
5078
5079##########################################
5080# check for getrandom()
5081
5082have_getrandom=no
5083cat > $TMPC << EOF
5084#include <sys/random.h>
5085int main(void) {
5086    return getrandom(0, 0, GRND_NONBLOCK);
5087}
5088EOF
5089if compile_prog "" "" ; then
5090    have_getrandom=yes
5091fi
5092
5093##########################################
5094# checks for sanitizers
5095
5096have_asan=no
5097have_ubsan=no
5098have_asan_iface_h=no
5099have_asan_iface_fiber=no
5100
5101if test "$sanitizers" = "yes" ; then
5102  write_c_skeleton
5103  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
5104      have_asan=yes
5105  fi
5106
5107  # we could use a simple skeleton for flags checks, but this also
5108  # detect the static linking issue of ubsan, see also:
5109  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
5110  cat > $TMPC << EOF
5111#include <stdlib.h>
5112int main(void) {
5113    void *tmp = malloc(10);
5114    if (tmp != NULL) {
5115        return *(int *)(tmp + 2);
5116    }
5117    return 1;
5118}
5119EOF
5120  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
5121      have_ubsan=yes
5122  fi
5123
5124  if check_include "sanitizer/asan_interface.h" ; then
5125      have_asan_iface_h=yes
5126  fi
5127
5128  cat > $TMPC << EOF
5129#include <sanitizer/asan_interface.h>
5130int main(void) {
5131  __sanitizer_start_switch_fiber(0, 0, 0);
5132  return 0;
5133}
5134EOF
5135  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
5136      have_asan_iface_fiber=yes
5137  fi
5138fi
5139
5140##########################################
5141# checks for fuzzer
5142if test "$fuzzing" = "yes" && test -z "${LIB_FUZZING_ENGINE+xxx}"; then
5143  write_c_fuzzer_skeleton
5144  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=fuzzer" ""; then
5145    have_fuzzer=yes
5146  else
5147    error_exit "Your compiler doesn't support -fsanitize=fuzzer"
5148    exit 1
5149  fi
5150fi
5151
5152# Thread sanitizer is, for now, much noisier than the other sanitizers;
5153# keep it separate until that is not the case.
5154if test "$tsan" = "yes" && test "$sanitizers" = "yes"; then
5155  error_exit "TSAN is not supported with other sanitiziers."
5156fi
5157have_tsan=no
5158have_tsan_iface_fiber=no
5159if test "$tsan" = "yes" ; then
5160  write_c_skeleton
5161  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
5162      have_tsan=yes
5163  fi
5164  cat > $TMPC << EOF
5165#include <sanitizer/tsan_interface.h>
5166int main(void) {
5167  __tsan_create_fiber(0);
5168  return 0;
5169}
5170EOF
5171  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
5172      have_tsan_iface_fiber=yes
5173  fi
5174fi
5175
5176##########################################
5177# check for libpmem
5178
5179if test "$libpmem" != "no"; then
5180	if $pkg_config --exists "libpmem"; then
5181		libpmem="yes"
5182		libpmem_libs=$($pkg_config --libs libpmem)
5183		libpmem_cflags=$($pkg_config --cflags libpmem)
5184	else
5185		if test "$libpmem" = "yes" ; then
5186			feature_not_found "libpmem" "Install nvml or pmdk"
5187		fi
5188		libpmem="no"
5189	fi
5190fi
5191
5192##########################################
5193# check for libdaxctl
5194
5195if test "$libdaxctl" != "no"; then
5196	if $pkg_config --atleast-version=57 "libdaxctl"; then
5197		libdaxctl="yes"
5198		libdaxctl_libs=$($pkg_config --libs libdaxctl)
5199		libdaxctl_cflags=$($pkg_config --cflags libdaxctl)
5200	else
5201		if test "$libdaxctl" = "yes" ; then
5202			feature_not_found "libdaxctl" "Install libdaxctl"
5203		fi
5204		libdaxctl="no"
5205	fi
5206fi
5207
5208##########################################
5209# check for slirp
5210
5211case "$slirp" in
5212  auto | enabled | internal)
5213    # Simpler to always update submodule, even if not needed.
5214    if test -e "${source_path}/.git" && test $git_update = 'yes' ; then
5215      git_submodules="${git_submodules} slirp"
5216    fi
5217    ;;
5218esac
5219
5220##########################################
5221# check for usable __NR_keyctl syscall
5222
5223if test "$linux" = "yes" ; then
5224
5225    have_keyring=no
5226    cat > $TMPC << EOF
5227#include <errno.h>
5228#include <asm/unistd.h>
5229#include <linux/keyctl.h>
5230#include <unistd.h>
5231int main(void) {
5232    return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
5233}
5234EOF
5235    if compile_prog "" "" ; then
5236        have_keyring=yes
5237    fi
5238fi
5239if test "$secret_keyring" != "no"
5240then
5241    if test "$have_keyring" = "yes"
5242    then
5243	secret_keyring=yes
5244    else
5245	if test "$secret_keyring" = "yes"
5246	then
5247	    error_exit "syscall __NR_keyctl requested, \
5248but not implemented on your system"
5249	else
5250	    secret_keyring=no
5251	fi
5252    fi
5253fi
5254
5255##########################################
5256# End of CC checks
5257# After here, no more $cc or $ld runs
5258
5259write_c_skeleton
5260
5261if test "$gcov" = "yes" ; then
5262  :
5263elif test "$fortify_source" = "yes" ; then
5264  QEMU_CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $QEMU_CFLAGS"
5265  debug=no
5266fi
5267
5268case "$ARCH" in
5269alpha)
5270  # Ensure there's only a single GP
5271  QEMU_CFLAGS="-msmall-data $QEMU_CFLAGS"
5272;;
5273esac
5274
5275if test "$gprof" = "yes" ; then
5276  QEMU_CFLAGS="-p $QEMU_CFLAGS"
5277  QEMU_LDFLAGS="-p $QEMU_LDFLAGS"
5278fi
5279
5280if test "$have_asan" = "yes"; then
5281  QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
5282  QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
5283  if test "$have_asan_iface_h" = "no" ; then
5284      echo "ASAN build enabled, but ASAN header missing." \
5285           "Without code annotation, the report may be inferior."
5286  elif test "$have_asan_iface_fiber" = "no" ; then
5287      echo "ASAN build enabled, but ASAN header is too old." \
5288           "Without code annotation, the report may be inferior."
5289  fi
5290fi
5291if test "$have_tsan" = "yes" ; then
5292  if test "$have_tsan_iface_fiber" = "yes" ; then
5293    QEMU_CFLAGS="-fsanitize=thread $QEMU_CFLAGS"
5294    QEMU_LDFLAGS="-fsanitize=thread $QEMU_LDFLAGS"
5295  else
5296    error_exit "Cannot enable TSAN due to missing fiber annotation interface."
5297  fi
5298elif test "$tsan" = "yes" ; then
5299  error_exit "Cannot enable TSAN due to missing sanitize thread interface."
5300fi
5301if test "$have_ubsan" = "yes"; then
5302  QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS"
5303  QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
5304fi
5305
5306##########################################
5307
5308# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
5309if test "$solaris" = "no" && test "$tsan" = "no"; then
5310    if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
5311        QEMU_LDFLAGS="-Wl,--warn-common $QEMU_LDFLAGS"
5312    fi
5313fi
5314
5315# Use ASLR, no-SEH and DEP if available
5316if test "$mingw32" = "yes" ; then
5317    flags="--no-seh --nxcompat"
5318
5319    # Disable ASLR for debug builds to allow debugging with gdb
5320    if test "$debug" = "no" ; then
5321        flags="--dynamicbase $flags"
5322    fi
5323
5324    for flag in $flags; do
5325        if ld_has $flag ; then
5326            QEMU_LDFLAGS="-Wl,$flag $QEMU_LDFLAGS"
5327        fi
5328    done
5329fi
5330
5331# We can only support ivshmem if we have eventfd
5332if [ "$eventfd" = "yes" ]; then
5333  ivshmem=yes
5334fi
5335
5336# Probe for guest agent support/options
5337
5338if [ "$guest_agent" != "no" ]; then
5339  if [ "$softmmu" = no -a "$want_tools" = no ] ; then
5340      guest_agent=no
5341  elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
5342      guest_agent=yes
5343  elif [ "$guest_agent" != yes ]; then
5344      guest_agent=no
5345  else
5346      error_exit "Guest agent is not supported on this platform"
5347  fi
5348fi
5349
5350# Guest agent Windows MSI package
5351
5352if test "$QEMU_GA_MANUFACTURER" = ""; then
5353  QEMU_GA_MANUFACTURER=QEMU
5354fi
5355if test "$QEMU_GA_DISTRO" = ""; then
5356  QEMU_GA_DISTRO=Linux
5357fi
5358if test "$QEMU_GA_VERSION" = ""; then
5359    QEMU_GA_VERSION=$(cat $source_path/VERSION)
5360fi
5361
5362QEMU_GA_MSI_MINGW_DLL_PATH="$($pkg_config --variable=prefix glib-2.0)/bin"
5363
5364# Mac OS X ships with a broken assembler
5365roms=
5366if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
5367        test "$targetos" != "Darwin" && test "$targetos" != "SunOS" && \
5368        test "$targetos" != "Haiku" && test "$softmmu" = yes ; then
5369    # Different host OS linkers have different ideas about the name of the ELF
5370    # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
5371    # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
5372    for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
5373        if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
5374            ld_i386_emulation="$emu"
5375            roms="optionrom"
5376            break
5377        fi
5378    done
5379fi
5380
5381# Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
5382if test "$cpu" = "s390x" ; then
5383  write_c_skeleton
5384  if compile_prog "-march=z900" ""; then
5385    roms="$roms s390-ccw"
5386    # SLOF is required for building the s390-ccw firmware on s390x,
5387    # since it is using the libnet code from SLOF for network booting.
5388    if test -e "${source_path}/.git" ; then
5389      git_submodules="${git_submodules} roms/SLOF"
5390    fi
5391  fi
5392fi
5393
5394# Check that the C++ compiler exists and works with the C compiler.
5395# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
5396if has $cxx; then
5397    cat > $TMPC <<EOF
5398int c_function(void);
5399int main(void) { return c_function(); }
5400EOF
5401
5402    compile_object
5403
5404    cat > $TMPCXX <<EOF
5405extern "C" {
5406   int c_function(void);
5407}
5408int c_function(void) { return 42; }
5409EOF
5410
5411    update_cxxflags
5412
5413    if do_cxx $CXXFLAGS $CONFIGURE_CXXFLAGS $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
5414        # C++ compiler $cxx works ok with C compiler $cc
5415        :
5416    else
5417        echo "C++ compiler $cxx does not work with C compiler $cc"
5418        echo "Disabling C++ specific optional code"
5419        cxx=
5420    fi
5421else
5422    echo "No C++ compiler available; disabling C++ specific optional code"
5423    cxx=
5424fi
5425
5426if test $git_update = 'yes' ; then
5427    (cd "${source_path}" && GIT="$git" "./scripts/git-submodule.sh" update "$git_submodules")
5428fi
5429
5430config_host_mak="config-host.mak"
5431
5432echo "# Automatically generated by configure - do not modify" > $config_host_mak
5433echo >> $config_host_mak
5434
5435echo all: >> $config_host_mak
5436echo "GIT=$git" >> $config_host_mak
5437echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
5438echo "GIT_UPDATE=$git_update" >> $config_host_mak
5439
5440echo "ARCH=$ARCH" >> $config_host_mak
5441
5442if test "$debug_tcg" = "yes" ; then
5443  echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
5444fi
5445if test "$strip_opt" = "yes" ; then
5446  echo "STRIP=${strip}" >> $config_host_mak
5447fi
5448if test "$bigendian" = "yes" ; then
5449  echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
5450fi
5451if test "$mingw32" = "yes" ; then
5452  echo "CONFIG_WIN32=y" >> $config_host_mak
5453  if test "$guest_agent_with_vss" = "yes" ; then
5454    echo "CONFIG_QGA_VSS=y" >> $config_host_mak
5455    echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
5456    echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
5457  fi
5458  if test "$guest_agent_ntddscsi" = "yes" ; then
5459    echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
5460  fi
5461  echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
5462  echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
5463  echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
5464  echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
5465else
5466  echo "CONFIG_POSIX=y" >> $config_host_mak
5467fi
5468
5469if test "$linux" = "yes" ; then
5470  echo "CONFIG_LINUX=y" >> $config_host_mak
5471fi
5472
5473if test "$darwin" = "yes" ; then
5474  echo "CONFIG_DARWIN=y" >> $config_host_mak
5475fi
5476
5477if test "$solaris" = "yes" ; then
5478  echo "CONFIG_SOLARIS=y" >> $config_host_mak
5479fi
5480if test "$haiku" = "yes" ; then
5481  echo "CONFIG_HAIKU=y" >> $config_host_mak
5482fi
5483if test "$static" = "yes" ; then
5484  echo "CONFIG_STATIC=y" >> $config_host_mak
5485fi
5486if test "$profiler" = "yes" ; then
5487  echo "CONFIG_PROFILER=y" >> $config_host_mak
5488fi
5489if test "$want_tools" = "yes" ; then
5490  echo "CONFIG_TOOLS=y" >> $config_host_mak
5491fi
5492if test "$guest_agent" = "yes" ; then
5493  echo "CONFIG_GUEST_AGENT=y" >> $config_host_mak
5494fi
5495echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
5496if test "$vde" = "yes" ; then
5497  echo "CONFIG_VDE=y" >> $config_host_mak
5498  echo "VDE_LIBS=$vde_libs" >> $config_host_mak
5499fi
5500if test "$netmap" = "yes" ; then
5501  echo "CONFIG_NETMAP=y" >> $config_host_mak
5502fi
5503if test "$l2tpv3" = "yes" ; then
5504  echo "CONFIG_L2TPV3=y" >> $config_host_mak
5505fi
5506if test "$gprof" = "yes" ; then
5507  echo "CONFIG_GPROF=y" >> $config_host_mak
5508fi
5509echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
5510for drv in $audio_drv_list; do
5511    def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
5512    echo "$def=y" >> $config_host_mak
5513done
5514if test "$alsa" = "yes" ; then
5515    echo "CONFIG_ALSA=y" >> $config_host_mak
5516fi
5517echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak
5518echo "ALSA_CFLAGS=$alsa_cflags" >> $config_host_mak
5519if test "$libpulse" = "yes" ; then
5520    echo "CONFIG_LIBPULSE=y" >> $config_host_mak
5521fi
5522echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
5523echo "PULSE_CFLAGS=$pulse_cflags" >> $config_host_mak
5524echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak
5525echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak
5526echo "OSS_LIBS=$oss_libs" >> $config_host_mak
5527if test "$libjack" = "yes" ; then
5528    echo "CONFIG_LIBJACK=y" >> $config_host_mak
5529fi
5530echo "JACK_LIBS=$jack_libs" >> $config_host_mak
5531if test "$audio_win_int" = "yes" ; then
5532  echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
5533fi
5534echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
5535echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
5536if test "$xfs" = "yes" ; then
5537  echo "CONFIG_XFS=y" >> $config_host_mak
5538fi
5539qemu_version=$(head $source_path/VERSION)
5540echo "PKGVERSION=$pkgversion" >>$config_host_mak
5541echo "SRC_PATH=$source_path" >> $config_host_mak
5542echo "TARGET_DIRS=$target_list" >> $config_host_mak
5543if test "$modules" = "yes"; then
5544  # $shacmd can generate a hash started with digit, which the compiler doesn't
5545  # like as an symbol. So prefix it with an underscore
5546  echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
5547  echo "CONFIG_MODULES=y" >> $config_host_mak
5548fi
5549if test "$module_upgrades" = "yes"; then
5550  echo "CONFIG_MODULE_UPGRADES=y" >> $config_host_mak
5551fi
5552if test "$pipe2" = "yes" ; then
5553  echo "CONFIG_PIPE2=y" >> $config_host_mak
5554fi
5555if test "$accept4" = "yes" ; then
5556  echo "CONFIG_ACCEPT4=y" >> $config_host_mak
5557fi
5558if test "$splice" = "yes" ; then
5559  echo "CONFIG_SPLICE=y" >> $config_host_mak
5560fi
5561if test "$eventfd" = "yes" ; then
5562  echo "CONFIG_EVENTFD=y" >> $config_host_mak
5563fi
5564if test "$memfd" = "yes" ; then
5565  echo "CONFIG_MEMFD=y" >> $config_host_mak
5566fi
5567if test "$have_usbfs" = "yes" ; then
5568  echo "CONFIG_USBFS=y" >> $config_host_mak
5569fi
5570if test "$fallocate" = "yes" ; then
5571  echo "CONFIG_FALLOCATE=y" >> $config_host_mak
5572fi
5573if test "$fallocate_punch_hole" = "yes" ; then
5574  echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
5575fi
5576if test "$fallocate_zero_range" = "yes" ; then
5577  echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak
5578fi
5579if test "$posix_fallocate" = "yes" ; then
5580  echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
5581fi
5582if test "$sync_file_range" = "yes" ; then
5583  echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
5584fi
5585if test "$fiemap" = "yes" ; then
5586  echo "CONFIG_FIEMAP=y" >> $config_host_mak
5587fi
5588if test "$dup3" = "yes" ; then
5589  echo "CONFIG_DUP3=y" >> $config_host_mak
5590fi
5591if test "$ppoll" = "yes" ; then
5592  echo "CONFIG_PPOLL=y" >> $config_host_mak
5593fi
5594if test "$prctl_pr_set_timerslack" = "yes" ; then
5595  echo "CONFIG_PRCTL_PR_SET_TIMERSLACK=y" >> $config_host_mak
5596fi
5597if test "$epoll" = "yes" ; then
5598  echo "CONFIG_EPOLL=y" >> $config_host_mak
5599fi
5600if test "$epoll_create1" = "yes" ; then
5601  echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
5602fi
5603if test "$sendfile" = "yes" ; then
5604  echo "CONFIG_SENDFILE=y" >> $config_host_mak
5605fi
5606if test "$timerfd" = "yes" ; then
5607  echo "CONFIG_TIMERFD=y" >> $config_host_mak
5608fi
5609if test "$setns" = "yes" ; then
5610  echo "CONFIG_SETNS=y" >> $config_host_mak
5611fi
5612if test "$clock_adjtime" = "yes" ; then
5613  echo "CONFIG_CLOCK_ADJTIME=y" >> $config_host_mak
5614fi
5615if test "$syncfs" = "yes" ; then
5616  echo "CONFIG_SYNCFS=y" >> $config_host_mak
5617fi
5618if test "$inotify" = "yes" ; then
5619  echo "CONFIG_INOTIFY=y" >> $config_host_mak
5620fi
5621if test "$inotify1" = "yes" ; then
5622  echo "CONFIG_INOTIFY1=y" >> $config_host_mak
5623fi
5624if test "$sem_timedwait" = "yes" ; then
5625  echo "CONFIG_SEM_TIMEDWAIT=y" >> $config_host_mak
5626fi
5627if test "$strchrnul" = "yes" ; then
5628  echo "HAVE_STRCHRNUL=y" >> $config_host_mak
5629fi
5630if test "$st_atim" = "yes" ; then
5631  echo "HAVE_STRUCT_STAT_ST_ATIM=y" >> $config_host_mak
5632fi
5633if test "$byteswap_h" = "yes" ; then
5634  echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
5635fi
5636if test "$bswap_h" = "yes" ; then
5637  echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
5638fi
5639if test "$gio" = "yes" ; then
5640    echo "CONFIG_GIO=y" >> $config_host_mak
5641    echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
5642    echo "GIO_LIBS=$gio_libs" >> $config_host_mak
5643    echo "GDBUS_CODEGEN=$gdbus_codegen" >> $config_host_mak
5644fi
5645echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
5646if test "$gnutls" = "yes" ; then
5647  echo "CONFIG_GNUTLS=y" >> $config_host_mak
5648  echo "GNUTLS_CFLAGS=$gnutls_cflags" >> $config_host_mak
5649  echo "GNUTLS_LIBS=$gnutls_libs" >> $config_host_mak
5650fi
5651if test "$gcrypt" = "yes" ; then
5652  echo "CONFIG_GCRYPT=y" >> $config_host_mak
5653  if test "$gcrypt_hmac" = "yes" ; then
5654    echo "CONFIG_GCRYPT_HMAC=y" >> $config_host_mak
5655  fi
5656  echo "GCRYPT_CFLAGS=$gcrypt_cflags" >> $config_host_mak
5657  echo "GCRYPT_LIBS=$gcrypt_libs" >> $config_host_mak
5658fi
5659if test "$nettle" = "yes" ; then
5660  echo "CONFIG_NETTLE=y" >> $config_host_mak
5661  echo "CONFIG_NETTLE_VERSION_MAJOR=${nettle_version%%.*}" >> $config_host_mak
5662  echo "NETTLE_CFLAGS=$nettle_cflags" >> $config_host_mak
5663  echo "NETTLE_LIBS=$nettle_libs" >> $config_host_mak
5664fi
5665if test "$qemu_private_xts" = "yes" ; then
5666  echo "CONFIG_QEMU_PRIVATE_XTS=y" >> $config_host_mak
5667fi
5668if test "$tasn1" = "yes" ; then
5669  echo "CONFIG_TASN1=y" >> $config_host_mak
5670fi
5671if test "$auth_pam" = "yes" ; then
5672    echo "CONFIG_AUTH_PAM=y" >> $config_host_mak
5673fi
5674if test "$have_broken_size_max" = "yes" ; then
5675    echo "HAVE_BROKEN_SIZE_MAX=y" >> $config_host_mak
5676fi
5677if test "$have_openpty" = "yes" ; then
5678    echo "HAVE_OPENPTY=y" >> $config_host_mak
5679fi
5680
5681# Work around a system header bug with some kernel/XFS header
5682# versions where they both try to define 'struct fsxattr':
5683# xfs headers will not try to redefine structs from linux headers
5684# if this macro is set.
5685if test "$have_fsxattr" = "yes" ; then
5686    echo "HAVE_FSXATTR=y" >> $config_host_mak
5687fi
5688if test "$have_copy_file_range" = "yes" ; then
5689    echo "HAVE_COPY_FILE_RANGE=y" >> $config_host_mak
5690fi
5691if test "$vte" = "yes" ; then
5692  echo "CONFIG_VTE=y" >> $config_host_mak
5693  echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak
5694  echo "VTE_LIBS=$vte_libs" >> $config_host_mak
5695fi
5696if test "$virglrenderer" = "yes" ; then
5697  echo "CONFIG_VIRGL=y" >> $config_host_mak
5698  echo "VIRGL_CFLAGS=$virgl_cflags" >> $config_host_mak
5699  echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak
5700fi
5701if test "$xen" = "enabled" ; then
5702  echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
5703  echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
5704  echo "XEN_CFLAGS=$xen_cflags" >> $config_host_mak
5705  echo "XEN_LIBS=$xen_libs" >> $config_host_mak
5706fi
5707if test "$linux_aio" = "yes" ; then
5708  echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
5709fi
5710if test "$linux_io_uring" = "yes" ; then
5711  echo "CONFIG_LINUX_IO_URING=y" >> $config_host_mak
5712  echo "LINUX_IO_URING_CFLAGS=$linux_io_uring_cflags" >> $config_host_mak
5713  echo "LINUX_IO_URING_LIBS=$linux_io_uring_libs" >> $config_host_mak
5714fi
5715if test "$vhost_scsi" = "yes" ; then
5716  echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
5717fi
5718if test "$vhost_net" = "yes" ; then
5719  echo "CONFIG_VHOST_NET=y" >> $config_host_mak
5720fi
5721if test "$vhost_net_user" = "yes" ; then
5722  echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
5723fi
5724if test "$vhost_net_vdpa" = "yes" ; then
5725  echo "CONFIG_VHOST_NET_VDPA=y" >> $config_host_mak
5726fi
5727if test "$vhost_crypto" = "yes" ; then
5728  echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
5729fi
5730if test "$vhost_vsock" = "yes" ; then
5731  echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
5732  if test "$vhost_user" = "yes" ; then
5733    echo "CONFIG_VHOST_USER_VSOCK=y" >> $config_host_mak
5734  fi
5735fi
5736if test "$vhost_kernel" = "yes" ; then
5737  echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
5738fi
5739if test "$vhost_user" = "yes" ; then
5740  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
5741fi
5742if test "$vhost_vdpa" = "yes" ; then
5743  echo "CONFIG_VHOST_VDPA=y" >> $config_host_mak
5744fi
5745if test "$vhost_user_fs" = "yes" ; then
5746  echo "CONFIG_VHOST_USER_FS=y" >> $config_host_mak
5747fi
5748if test "$iovec" = "yes" ; then
5749  echo "CONFIG_IOVEC=y" >> $config_host_mak
5750fi
5751if test "$preadv" = "yes" ; then
5752  echo "CONFIG_PREADV=y" >> $config_host_mak
5753fi
5754if test "$membarrier" = "yes" ; then
5755  echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
5756fi
5757if test "$signalfd" = "yes" ; then
5758  echo "CONFIG_SIGNALFD=y" >> $config_host_mak
5759fi
5760if test "$optreset" = "yes" ; then
5761  echo "HAVE_OPTRESET=y" >> $config_host_mak
5762fi
5763if test "$fdatasync" = "yes" ; then
5764  echo "CONFIG_FDATASYNC=y" >> $config_host_mak
5765fi
5766if test "$madvise" = "yes" ; then
5767  echo "CONFIG_MADVISE=y" >> $config_host_mak
5768fi
5769if test "$posix_madvise" = "yes" ; then
5770  echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak
5771fi
5772if test "$posix_memalign" = "yes" ; then
5773  echo "CONFIG_POSIX_MEMALIGN=y" >> $config_host_mak
5774fi
5775if test "$spice" = "yes" ; then
5776  echo "CONFIG_SPICE=y" >> $config_host_mak
5777  echo "SPICE_CFLAGS=$spice_cflags" >> $config_host_mak
5778  echo "SPICE_LIBS=$spice_libs" >> $config_host_mak
5779fi
5780
5781if test "$smartcard" = "yes" ; then
5782  echo "CONFIG_SMARTCARD=y" >> $config_host_mak
5783  echo "SMARTCARD_CFLAGS=$libcacard_cflags" >> $config_host_mak
5784  echo "SMARTCARD_LIBS=$libcacard_libs" >> $config_host_mak
5785fi
5786
5787if test "$libusb" = "yes" ; then
5788  echo "CONFIG_USB_LIBUSB=y" >> $config_host_mak
5789  echo "LIBUSB_CFLAGS=$libusb_cflags" >> $config_host_mak
5790  echo "LIBUSB_LIBS=$libusb_libs" >> $config_host_mak
5791fi
5792
5793if test "$usb_redir" = "yes" ; then
5794  echo "CONFIG_USB_REDIR=y" >> $config_host_mak
5795  echo "USB_REDIR_CFLAGS=$usb_redir_cflags" >> $config_host_mak
5796  echo "USB_REDIR_LIBS=$usb_redir_libs" >> $config_host_mak
5797fi
5798
5799if test "$opengl" = "yes" ; then
5800  echo "CONFIG_OPENGL=y" >> $config_host_mak
5801  echo "OPENGL_CFLAGS=$opengl_cflags" >> $config_host_mak
5802  echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
5803  if test "$opengl_dmabuf" = "yes" ; then
5804    echo "CONFIG_OPENGL_DMABUF=y" >> $config_host_mak
5805  fi
5806fi
5807
5808if test "$gbm" = "yes" ; then
5809    echo "CONFIG_GBM=y" >> $config_host_mak
5810    echo "GBM_LIBS=$gbm_libs" >> $config_host_mak
5811    echo "GBM_CFLAGS=$gbm_cflags" >> $config_host_mak
5812fi
5813
5814
5815if test "$avx2_opt" = "yes" ; then
5816  echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
5817fi
5818
5819if test "$avx512f_opt" = "yes" ; then
5820  echo "CONFIG_AVX512F_OPT=y" >> $config_host_mak
5821fi
5822
5823# XXX: suppress that
5824if [ "$bsd" = "yes" ] ; then
5825  echo "CONFIG_BSD=y" >> $config_host_mak
5826fi
5827
5828if test "$qom_cast_debug" = "yes" ; then
5829  echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
5830fi
5831
5832echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
5833if test "$coroutine_pool" = "yes" ; then
5834  echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
5835else
5836  echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
5837fi
5838
5839if test "$debug_stack_usage" = "yes" ; then
5840  echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
5841fi
5842
5843if test "$crypto_afalg" = "yes" ; then
5844  echo "CONFIG_AF_ALG=y" >> $config_host_mak
5845fi
5846
5847if test "$open_by_handle_at" = "yes" ; then
5848  echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
5849fi
5850
5851if test "$linux_magic_h" = "yes" ; then
5852  echo "CONFIG_LINUX_MAGIC_H=y" >> $config_host_mak
5853fi
5854
5855if test "$valgrind_h" = "yes" ; then
5856  echo "CONFIG_VALGRIND_H=y" >> $config_host_mak
5857fi
5858
5859if test "$have_asan_iface_fiber" = "yes" ; then
5860    echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
5861fi
5862
5863if test "$have_tsan" = "yes" && test "$have_tsan_iface_fiber" = "yes" ; then
5864    echo "CONFIG_TSAN=y" >> $config_host_mak
5865fi
5866
5867if test "$has_environ" = "yes" ; then
5868  echo "CONFIG_HAS_ENVIRON=y" >> $config_host_mak
5869fi
5870
5871if test "$cpuid_h" = "yes" ; then
5872  echo "CONFIG_CPUID_H=y" >> $config_host_mak
5873fi
5874
5875if test "$int128" = "yes" ; then
5876  echo "CONFIG_INT128=y" >> $config_host_mak
5877fi
5878
5879if test "$atomic128" = "yes" ; then
5880  echo "CONFIG_ATOMIC128=y" >> $config_host_mak
5881fi
5882
5883if test "$cmpxchg128" = "yes" ; then
5884  echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
5885fi
5886
5887if test "$atomic64" = "yes" ; then
5888  echo "CONFIG_ATOMIC64=y" >> $config_host_mak
5889fi
5890
5891if test "$attralias" = "yes" ; then
5892  echo "CONFIG_ATTRIBUTE_ALIAS=y" >> $config_host_mak
5893fi
5894
5895if test "$getauxval" = "yes" ; then
5896  echo "CONFIG_GETAUXVAL=y" >> $config_host_mak
5897fi
5898
5899if test "$libssh" = "yes" ; then
5900  echo "CONFIG_LIBSSH=y" >> $config_host_mak
5901  echo "LIBSSH_CFLAGS=$libssh_cflags" >> $config_host_mak
5902  echo "LIBSSH_LIBS=$libssh_libs" >> $config_host_mak
5903fi
5904
5905if test "$live_block_migration" = "yes" ; then
5906  echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
5907fi
5908
5909if test "$tpm" = "yes"; then
5910  echo 'CONFIG_TPM=y' >> $config_host_mak
5911fi
5912
5913echo "TRACE_BACKENDS=$trace_backends" >> $config_host_mak
5914if have_backend "nop"; then
5915  echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
5916fi
5917if have_backend "simple"; then
5918  echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
5919  # Set the appropriate trace file.
5920  trace_file="\"$trace_file-\" FMT_pid"
5921fi
5922if have_backend "log"; then
5923  echo "CONFIG_TRACE_LOG=y" >> $config_host_mak
5924fi
5925if have_backend "ust"; then
5926  echo "CONFIG_TRACE_UST=y" >> $config_host_mak
5927  echo "LTTNG_UST_LIBS=$lttng_ust_libs" >> $config_host_mak
5928  echo "URCU_BP_LIBS=$urcu_bp_libs" >> $config_host_mak
5929fi
5930if have_backend "dtrace"; then
5931  echo "CONFIG_TRACE_DTRACE=y" >> $config_host_mak
5932  if test "$trace_backend_stap" = "yes" ; then
5933    echo "CONFIG_TRACE_SYSTEMTAP=y" >> $config_host_mak
5934  fi
5935fi
5936if have_backend "ftrace"; then
5937  if test "$linux" = "yes" ; then
5938    echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak
5939  else
5940    feature_not_found "ftrace(trace backend)" "ftrace requires Linux"
5941  fi
5942fi
5943if have_backend "syslog"; then
5944  if test "$posix_syslog" = "yes" ; then
5945    echo "CONFIG_TRACE_SYSLOG=y" >> $config_host_mak
5946  else
5947    feature_not_found "syslog(trace backend)" "syslog not available"
5948  fi
5949fi
5950echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
5951
5952if test "$rdma" = "yes" ; then
5953  echo "CONFIG_RDMA=y" >> $config_host_mak
5954  echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
5955fi
5956
5957if test "$pvrdma" = "yes" ; then
5958  echo "CONFIG_PVRDMA=y" >> $config_host_mak
5959fi
5960
5961if test "$have_rtnetlink" = "yes" ; then
5962  echo "CONFIG_RTNETLINK=y" >> $config_host_mak
5963fi
5964
5965if test "$libxml2" = "yes" ; then
5966  echo "CONFIG_LIBXML2=y" >> $config_host_mak
5967  echo "LIBXML2_CFLAGS=$libxml2_cflags" >> $config_host_mak
5968  echo "LIBXML2_LIBS=$libxml2_libs" >> $config_host_mak
5969fi
5970
5971if test "$replication" = "yes" ; then
5972  echo "CONFIG_REPLICATION=y" >> $config_host_mak
5973fi
5974
5975if test "$have_af_vsock" = "yes" ; then
5976  echo "CONFIG_AF_VSOCK=y" >> $config_host_mak
5977fi
5978
5979if test "$have_sysmacros" = "yes" ; then
5980  echo "CONFIG_SYSMACROS=y" >> $config_host_mak
5981fi
5982
5983if test "$have_static_assert" = "yes" ; then
5984  echo "CONFIG_STATIC_ASSERT=y" >> $config_host_mak
5985fi
5986
5987if test "$have_utmpx" = "yes" ; then
5988  echo "HAVE_UTMPX=y" >> $config_host_mak
5989fi
5990if test "$have_getrandom" = "yes" ; then
5991  echo "CONFIG_GETRANDOM=y" >> $config_host_mak
5992fi
5993if test "$ivshmem" = "yes" ; then
5994  echo "CONFIG_IVSHMEM=y" >> $config_host_mak
5995fi
5996if test "$debug_mutex" = "yes" ; then
5997  echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
5998fi
5999
6000# Hold two types of flag:
6001#   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
6002#                                     a thread we have a handle to
6003#   CONFIG_PTHREAD_SETNAME_NP_W_TID - A way of doing it on a particular
6004#                                     platform
6005if test "$pthread_setname_np_w_tid" = "yes" ; then
6006  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
6007  echo "CONFIG_PTHREAD_SETNAME_NP_W_TID=y" >> $config_host_mak
6008elif test "$pthread_setname_np_wo_tid" = "yes" ; then
6009  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
6010  echo "CONFIG_PTHREAD_SETNAME_NP_WO_TID=y" >> $config_host_mak
6011fi
6012
6013if test "$libpmem" = "yes" ; then
6014  echo "CONFIG_LIBPMEM=y" >> $config_host_mak
6015  echo "LIBPMEM_LIBS=$libpmem_libs" >> $config_host_mak
6016  echo "LIBPMEM_CFLAGS=$libpmem_cflags" >> $config_host_mak
6017fi
6018
6019if test "$libdaxctl" = "yes" ; then
6020  echo "CONFIG_LIBDAXCTL=y" >> $config_host_mak
6021  echo "LIBDAXCTL_LIBS=$libdaxctl_libs" >> $config_host_mak
6022fi
6023
6024if test "$bochs" = "yes" ; then
6025  echo "CONFIG_BOCHS=y" >> $config_host_mak
6026fi
6027if test "$cloop" = "yes" ; then
6028  echo "CONFIG_CLOOP=y" >> $config_host_mak
6029fi
6030if test "$dmg" = "yes" ; then
6031  echo "CONFIG_DMG=y" >> $config_host_mak
6032fi
6033if test "$qcow1" = "yes" ; then
6034  echo "CONFIG_QCOW1=y" >> $config_host_mak
6035fi
6036if test "$vdi" = "yes" ; then
6037  echo "CONFIG_VDI=y" >> $config_host_mak
6038fi
6039if test "$vvfat" = "yes" ; then
6040  echo "CONFIG_VVFAT=y" >> $config_host_mak
6041fi
6042if test "$qed" = "yes" ; then
6043  echo "CONFIG_QED=y" >> $config_host_mak
6044fi
6045if test "$parallels" = "yes" ; then
6046  echo "CONFIG_PARALLELS=y" >> $config_host_mak
6047fi
6048if test "$sheepdog" = "yes" ; then
6049  add_to deprecated_features "sheepdog"
6050  echo "CONFIG_SHEEPDOG=y" >> $config_host_mak
6051fi
6052if test "$have_mlockall" = "yes" ; then
6053  echo "HAVE_MLOCKALL=y" >> $config_host_mak
6054fi
6055if test "$fuzzing" = "yes" ; then
6056  # If LIB_FUZZING_ENGINE is set, assume we are running on OSS-Fuzz, and the
6057  # needed CFLAGS have already been provided
6058  if test -z "${LIB_FUZZING_ENGINE+xxx}" ; then
6059    QEMU_CFLAGS="$QEMU_CFLAGS -fsanitize=fuzzer-no-link"
6060    FUZZ_EXE_LDFLAGS="-fsanitize=fuzzer"
6061  else
6062    FUZZ_EXE_LDFLAGS="$LIB_FUZZING_ENGINE"
6063  fi
6064fi
6065
6066if test "$plugins" = "yes" ; then
6067    echo "CONFIG_PLUGIN=y" >> $config_host_mak
6068    # Copy the export object list to the build dir
6069    if test "$ld_dynamic_list" = "yes" ; then
6070	echo "CONFIG_HAS_LD_DYNAMIC_LIST=yes" >> $config_host_mak
6071	ld_symbols=qemu-plugins-ld.symbols
6072	cp "$source_path/plugins/qemu-plugins.symbols" $ld_symbols
6073    elif test "$ld_exported_symbols_list" = "yes" ; then
6074	echo "CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST=yes" >> $config_host_mak
6075	ld64_symbols=qemu-plugins-ld64.symbols
6076	echo "# Automatically generated by configure - do not modify" > $ld64_symbols
6077	grep 'qemu_' "$source_path/plugins/qemu-plugins.symbols" | sed 's/;//g' | \
6078	    sed -E 's/^[[:space:]]*(.*)/_\1/' >> $ld64_symbols
6079    else
6080	error_exit \
6081	    "If \$plugins=yes, either \$ld_dynamic_list or " \
6082	    "\$ld_exported_symbols_list should have been set to 'yes'."
6083    fi
6084fi
6085
6086if test -n "$gdb_bin"; then
6087    gdb_version=$($gdb_bin --version | head -n 1)
6088    if version_ge ${gdb_version##* } 8.3.1; then
6089        echo "HAVE_GDB_BIN=$gdb_bin" >> $config_host_mak
6090    fi
6091fi
6092
6093if test "$secret_keyring" = "yes" ; then
6094  echo "CONFIG_SECRET_KEYRING=y" >> $config_host_mak
6095fi
6096
6097echo "ROMS=$roms" >> $config_host_mak
6098echo "MAKE=$make" >> $config_host_mak
6099echo "PYTHON=$python" >> $config_host_mak
6100echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
6101echo "MESON=$meson" >> $config_host_mak
6102echo "NINJA=$ninja" >> $config_host_mak
6103echo "CC=$cc" >> $config_host_mak
6104if $iasl -h > /dev/null 2>&1; then
6105  echo "CONFIG_IASL=$iasl" >> $config_host_mak
6106fi
6107echo "CXX=$cxx" >> $config_host_mak
6108echo "OBJCC=$objcc" >> $config_host_mak
6109echo "AR=$ar" >> $config_host_mak
6110echo "ARFLAGS=$ARFLAGS" >> $config_host_mak
6111echo "AS=$as" >> $config_host_mak
6112echo "CCAS=$ccas" >> $config_host_mak
6113echo "CPP=$cpp" >> $config_host_mak
6114echo "OBJCOPY=$objcopy" >> $config_host_mak
6115echo "LD=$ld" >> $config_host_mak
6116echo "RANLIB=$ranlib" >> $config_host_mak
6117echo "NM=$nm" >> $config_host_mak
6118echo "PKG_CONFIG=$pkg_config_exe" >> $config_host_mak
6119echo "WINDRES=$windres" >> $config_host_mak
6120echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
6121echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
6122echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
6123echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
6124echo "GLIB_LIBS=$glib_libs" >> $config_host_mak
6125echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
6126echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
6127echo "EXESUF=$EXESUF" >> $config_host_mak
6128echo "HOST_DSOSUF=$HOST_DSOSUF" >> $config_host_mak
6129echo "LIBS_QGA=$libs_qga" >> $config_host_mak
6130echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak
6131echo "TASN1_CFLAGS=$tasn1_cflags" >> $config_host_mak
6132if test "$gcov" = "yes" ; then
6133  echo "CONFIG_GCOV=y" >> $config_host_mak
6134fi
6135
6136if test "$fuzzing" != "no"; then
6137    echo "CONFIG_FUZZ=y" >> $config_host_mak
6138fi
6139echo "FUZZ_EXE_LDFLAGS=$FUZZ_EXE_LDFLAGS" >> $config_host_mak
6140
6141if test "$rng_none" = "yes"; then
6142  echo "CONFIG_RNG_NONE=y" >> $config_host_mak
6143fi
6144
6145# use included Linux headers
6146if test "$linux" = "yes" ; then
6147  mkdir -p linux-headers
6148  case "$cpu" in
6149  i386|x86_64|x32)
6150    linux_arch=x86
6151    ;;
6152  ppc|ppc64|ppc64le)
6153    linux_arch=powerpc
6154    ;;
6155  s390x)
6156    linux_arch=s390
6157    ;;
6158  aarch64)
6159    linux_arch=arm64
6160    ;;
6161  mips64)
6162    linux_arch=mips
6163    ;;
6164  *)
6165    # For most CPUs the kernel architecture name and QEMU CPU name match.
6166    linux_arch="$cpu"
6167    ;;
6168  esac
6169    # For non-KVM architectures we will not have asm headers
6170    if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
6171      symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
6172    fi
6173fi
6174
6175for target in $target_list; do
6176    target_dir="$target"
6177    target_name=$(echo $target | cut -d '-' -f 1)
6178    mkdir -p $target_dir
6179    case $target in
6180        *-user) symlink "../qemu-$target_name" "$target_dir/qemu-$target_name" ;;
6181        *) symlink "../qemu-system-$target_name" "$target_dir/qemu-system-$target_name" ;;
6182    esac
6183done
6184
6185echo "CONFIG_QEMU_INTERP_PREFIX=$interp_prefix" | sed 's/%M/@0@/' >> $config_host_mak
6186if test "$default_targets" = "yes"; then
6187  echo "CONFIG_DEFAULT_TARGETS=y" >> $config_host_mak
6188fi
6189
6190if test "$numa" = "yes"; then
6191  echo "CONFIG_NUMA=y" >> $config_host_mak
6192  echo "NUMA_LIBS=$numa_libs" >> $config_host_mak
6193fi
6194
6195if test "$ccache_cpp2" = "yes"; then
6196  echo "export CCACHE_CPP2=y" >> $config_host_mak
6197fi
6198
6199if test "$safe_stack" = "yes"; then
6200  echo "CONFIG_SAFESTACK=y" >> $config_host_mak
6201fi
6202
6203# If we're using a separate build tree, set it up now.
6204# DIRS are directories which we simply mkdir in the build tree;
6205# LINKS are things to symlink back into the source tree
6206# (these can be both files and directories).
6207# Caution: do not add files or directories here using wildcards. This
6208# will result in problems later if a new file matching the wildcard is
6209# added to the source tree -- nothing will cause configure to be rerun
6210# so the build tree will be missing the link back to the new file, and
6211# tests might fail. Prefer to keep the relevant files in their own
6212# directory and symlink the directory instead.
6213# UNLINK is used to remove symlinks from older development versions
6214# that might get into the way when doing "git update" without doing
6215# a "make distclean" in between.
6216DIRS="tests tests/tcg tests/tcg/lm32 tests/qapi-schema tests/qtest/libqos"
6217DIRS="$DIRS tests/qtest tests/qemu-iotests tests/vm tests/fp tests/qgraph"
6218DIRS="$DIRS docs docs/interop fsdev scsi"
6219DIRS="$DIRS pc-bios/optionrom pc-bios/s390-ccw"
6220DIRS="$DIRS roms/seabios"
6221DIRS="$DIRS contrib/plugins/"
6222LINKS="Makefile"
6223LINKS="$LINKS tests/tcg/lm32/Makefile"
6224LINKS="$LINKS tests/tcg/Makefile.target"
6225LINKS="$LINKS pc-bios/optionrom/Makefile"
6226LINKS="$LINKS pc-bios/s390-ccw/Makefile"
6227LINKS="$LINKS roms/seabios/Makefile"
6228LINKS="$LINKS pc-bios/qemu-icon.bmp"
6229LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
6230LINKS="$LINKS tests/acceptance tests/data"
6231LINKS="$LINKS tests/qemu-iotests/check"
6232LINKS="$LINKS python"
6233LINKS="$LINKS contrib/plugins/Makefile "
6234UNLINK="pc-bios/keymaps"
6235for bios_file in \
6236    $source_path/pc-bios/*.bin \
6237    $source_path/pc-bios/*.elf \
6238    $source_path/pc-bios/*.lid \
6239    $source_path/pc-bios/*.rom \
6240    $source_path/pc-bios/*.dtb \
6241    $source_path/pc-bios/*.img \
6242    $source_path/pc-bios/openbios-* \
6243    $source_path/pc-bios/u-boot.* \
6244    $source_path/pc-bios/edk2-*.fd.bz2 \
6245    $source_path/pc-bios/palcode-*
6246do
6247    LINKS="$LINKS pc-bios/$(basename $bios_file)"
6248done
6249mkdir -p $DIRS
6250for f in $LINKS ; do
6251    if [ -e "$source_path/$f" ]; then
6252        symlink "$source_path/$f" "$f"
6253    fi
6254done
6255for f in $UNLINK ; do
6256    if [ -L "$f" ]; then
6257        rm -f "$f"
6258    fi
6259done
6260
6261(for i in $cross_cc_vars; do
6262  export $i
6263done
6264export target_list source_path use_containers
6265$source_path/tests/tcg/configure.sh)
6266
6267# temporary config to build submodules
6268for rom in seabios; do
6269    config_mak=roms/$rom/config.mak
6270    echo "# Automatically generated by configure - do not modify" > $config_mak
6271    echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
6272    echo "AS=$as" >> $config_mak
6273    echo "CCAS=$ccas" >> $config_mak
6274    echo "CC=$cc" >> $config_mak
6275    echo "BCC=bcc" >> $config_mak
6276    echo "CPP=$cpp" >> $config_mak
6277    echo "OBJCOPY=objcopy" >> $config_mak
6278    echo "IASL=$iasl" >> $config_mak
6279    echo "LD=$ld" >> $config_mak
6280    echo "RANLIB=$ranlib" >> $config_mak
6281done
6282
6283if test "$skip_meson" = no; then
6284cross="config-meson.cross.new"
6285meson_quote() {
6286    echo "'$(echo $* | sed "s/ /','/g")'"
6287}
6288
6289echo "# Automatically generated by configure - do not modify" > $cross
6290echo "[properties]" >> $cross
6291test -z "$cxx" && echo "link_language = 'c'" >> $cross
6292echo "[built-in options]" >> $cross
6293echo "c_args = [${CFLAGS:+$(meson_quote $CFLAGS)}]" >> $cross
6294echo "cpp_args = [${CXXFLAGS:+$(meson_quote $CXXFLAGS)}]" >> $cross
6295echo "c_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
6296echo "cpp_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
6297echo "[binaries]" >> $cross
6298echo "c = [$(meson_quote $cc)]" >> $cross
6299test -n "$cxx" && echo "cpp = [$(meson_quote $cxx)]" >> $cross
6300echo "ar = [$(meson_quote $ar)]" >> $cross
6301echo "nm = [$(meson_quote $nm)]" >> $cross
6302echo "pkgconfig = [$(meson_quote $pkg_config_exe)]" >> $cross
6303echo "ranlib = [$(meson_quote $ranlib)]" >> $cross
6304if has $sdl2_config; then
6305  echo "sdl2-config = [$(meson_quote $sdl2_config)]" >> $cross
6306fi
6307echo "strip = [$(meson_quote $strip)]" >> $cross
6308echo "windres = [$(meson_quote $windres)]" >> $cross
6309if test -n "$cross_prefix"; then
6310    cross_arg="--cross-file config-meson.cross"
6311    echo "[host_machine]" >> $cross
6312    if test "$mingw32" = "yes" ; then
6313        echo "system = 'windows'" >> $cross
6314    fi
6315    if test "$linux" = "yes" ; then
6316        echo "system = 'linux'" >> $cross
6317    fi
6318    case "$ARCH" in
6319        i386|x86_64)
6320            echo "cpu_family = 'x86'" >> $cross
6321            ;;
6322        ppc64le)
6323            echo "cpu_family = 'ppc64'" >> $cross
6324            ;;
6325        *)
6326            echo "cpu_family = '$ARCH'" >> $cross
6327            ;;
6328    esac
6329    echo "cpu = '$cpu'" >> $cross
6330    if test "$bigendian" = "yes" ; then
6331        echo "endian = 'big'" >> $cross
6332    else
6333        echo "endian = 'little'" >> $cross
6334    fi
6335else
6336    cross_arg="--native-file config-meson.cross"
6337fi
6338mv $cross config-meson.cross
6339
6340rm -rf meson-private meson-info meson-logs
6341unset staticpic
6342if ! version_ge "$($meson --version)" 0.56.0; then
6343  staticpic=$(if test "$pie" = yes; then echo true; else echo false; fi)
6344fi
6345NINJA=$ninja $meson setup \
6346        --prefix "$prefix" \
6347        --libdir "$libdir" \
6348        --libexecdir "$libexecdir" \
6349        --bindir "$bindir" \
6350        --includedir "$includedir" \
6351        --datadir "$datadir" \
6352        --mandir "$mandir" \
6353        --sysconfdir "$sysconfdir" \
6354        --localedir "$localedir" \
6355        --localstatedir "$local_statedir" \
6356        -Ddocdir="$docdir" \
6357        -Dqemu_firmwarepath="$firmwarepath" \
6358        -Dqemu_suffix="$qemu_suffix" \
6359        -Doptimization=$(if test "$debug" = yes; then echo 0; else echo 2; fi) \
6360        -Ddebug=$(if test "$debug_info" = yes; then echo true; else echo false; fi) \
6361        -Dwerror=$(if test "$werror" = yes; then echo true; else echo false; fi) \
6362        -Dstrip=$(if test "$strip_opt" = yes; then echo true; else echo false; fi) \
6363        -Db_pie=$(if test "$pie" = yes; then echo true; else echo false; fi) \
6364        ${staticpic:+-Db_staticpic=$staticpic} \
6365        -Db_coverage=$(if test "$gcov" = yes; then echo true; else echo false; fi) \
6366        -Db_lto=$lto -Dcfi=$cfi -Dcfi_debug=$cfi_debug \
6367        -Dmalloc=$malloc -Dmalloc_trim=$malloc_trim -Dsparse=$sparse \
6368        -Dkvm=$kvm -Dhax=$hax -Dwhpx=$whpx -Dhvf=$hvf \
6369        -Dxen=$xen -Dxen_pci_passthrough=$xen_pci_passthrough -Dtcg=$tcg \
6370        -Dcocoa=$cocoa -Dgtk=$gtk -Dmpath=$mpath -Dsdl=$sdl -Dsdl_image=$sdl_image \
6371        -Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg -Dvnc_png=$vnc_png \
6372        -Dgettext=$gettext -Dxkbcommon=$xkbcommon -Du2f=$u2f -Dvirtiofsd=$virtiofsd \
6373        -Dcapstone=$capstone -Dslirp=$slirp -Dfdt=$fdt -Dbrlapi=$brlapi \
6374        -Dcurl=$curl -Dglusterfs=$glusterfs -Dbzip2=$bzip2 -Dlibiscsi=$libiscsi \
6375        -Dlibnfs=$libnfs -Diconv=$iconv -Dcurses=$curses -Dlibudev=$libudev\
6376        -Drbd=$rbd -Dlzo=$lzo -Dsnappy=$snappy -Dlzfse=$lzfse \
6377        -Dzstd=$zstd -Dseccomp=$seccomp -Dvirtfs=$virtfs -Dcap_ng=$cap_ng \
6378        -Dattr=$attr -Ddefault_devices=$default_devices \
6379        -Ddocs=$docs -Dsphinx_build=$sphinx_build -Dinstall_blobs=$blobs \
6380        -Dvhost_user_blk_server=$vhost_user_blk_server \
6381        -Dfuse=$fuse -Dfuse_lseek=$fuse_lseek -Dguest_agent_msi=$guest_agent_msi \
6382        $(if test "$default_features" = no; then echo "-Dauto_features=disabled"; fi) \
6383        $cross_arg \
6384        "$PWD" "$source_path"
6385
6386if test "$?" -ne 0 ; then
6387    error_exit "meson setup failed"
6388fi
6389fi
6390
6391if test -n "${deprecated_features}"; then
6392    echo "Warning, deprecated features enabled."
6393    echo "Please see docs/system/deprecated.rst"
6394    echo "  features: ${deprecated_features}"
6395fi
6396
6397# Save the configure command line for later reuse.
6398cat <<EOD >config.status
6399#!/bin/sh
6400# Generated by configure.
6401# Run this file to recreate the current configuration.
6402# Compiler output produced by configure, useful for debugging
6403# configure, is in config.log if it exists.
6404EOD
6405
6406preserve_env() {
6407    envname=$1
6408
6409    eval envval=\$$envname
6410
6411    if test -n "$envval"
6412    then
6413	echo "$envname='$envval'" >> config.status
6414	echo "export $envname" >> config.status
6415    else
6416	echo "unset $envname" >> config.status
6417    fi
6418}
6419
6420# Preserve various env variables that influence what
6421# features/build target configure will detect
6422preserve_env AR
6423preserve_env AS
6424preserve_env CC
6425preserve_env CPP
6426preserve_env CXX
6427preserve_env INSTALL
6428preserve_env LD
6429preserve_env LD_LIBRARY_PATH
6430preserve_env LIBTOOL
6431preserve_env MAKE
6432preserve_env NM
6433preserve_env OBJCOPY
6434preserve_env PATH
6435preserve_env PKG_CONFIG
6436preserve_env PKG_CONFIG_LIBDIR
6437preserve_env PKG_CONFIG_PATH
6438preserve_env PYTHON
6439preserve_env SDL2_CONFIG
6440preserve_env SMBD
6441preserve_env STRIP
6442preserve_env WINDRES
6443
6444printf "exec" >>config.status
6445for i in "$0" "$@"; do
6446  test "$i" = --skip-meson || printf " %s" "$(quote_sh "$i")" >>config.status
6447done
6448echo ' "$@"' >>config.status
6449chmod +x config.status
6450
6451rm -r "$TMPDIR1"
6452