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