xref: /openbmc/qemu/configure (revision a10b9d93)
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
4043int main(void)
4044{
4045    return clock_adjtime(0, 0);
4046}
4047EOF
4048clock_adjtime=no
4049if compile_prog "" "" ; then
4050  clock_adjtime=yes
4051fi
4052
4053# syncfs probe
4054syncfs=no
4055cat > $TMPC <<EOF
4056#include <unistd.h>
4057
4058int main(void)
4059{
4060    return syncfs(0);
4061}
4062EOF
4063syncfs=no
4064if compile_prog "" "" ; then
4065  syncfs=yes
4066fi
4067
4068# Search for bswap_32 function
4069byteswap_h=no
4070cat > $TMPC << EOF
4071#include <byteswap.h>
4072int main(void) { return bswap_32(0); }
4073EOF
4074if compile_prog "" "" ; then
4075  byteswap_h=yes
4076fi
4077
4078# Search for bswap32 function
4079bswap_h=no
4080cat > $TMPC << EOF
4081#include <sys/endian.h>
4082#include <sys/types.h>
4083#include <machine/bswap.h>
4084int main(void) { return bswap32(0); }
4085EOF
4086if compile_prog "" "" ; then
4087  bswap_h=yes
4088fi
4089
4090##########################################
4091# Do we need librt
4092# uClibc provides 2 versions of clock_gettime(), one with realtime
4093# support and one without. This means that the clock_gettime() don't
4094# need -lrt. We still need it for timer_create() so we check for this
4095# function in addition.
4096cat > $TMPC <<EOF
4097#include <signal.h>
4098#include <time.h>
4099int main(void) {
4100  timer_create(CLOCK_REALTIME, NULL, NULL);
4101  return clock_gettime(CLOCK_REALTIME, NULL);
4102}
4103EOF
4104
4105if compile_prog "" "" ; then
4106  :
4107# we need pthread for static linking. use previous pthread test result
4108elif compile_prog "" "$pthread_lib -lrt" ; then
4109  LIBS="$LIBS -lrt"
4110fi
4111
4112# Check whether we have openpty() in either libc or libutil
4113cat > $TMPC << EOF
4114extern int openpty(int *am, int *as, char *name, void *termp, void *winp);
4115int main(void) { return openpty(0, 0, 0, 0, 0); }
4116EOF
4117
4118have_openpty="no"
4119if compile_prog "" "" ; then
4120  have_openpty="yes"
4121else
4122  if compile_prog "" "-lutil" ; then
4123    have_openpty="yes"
4124  fi
4125fi
4126
4127##########################################
4128# spice probe
4129if test "$spice" != "no" ; then
4130  cat > $TMPC << EOF
4131#include <spice.h>
4132int main(void) { spice_server_new(); return 0; }
4133EOF
4134  spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
4135  spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
4136  if $pkg_config --atleast-version=0.12.5 spice-server && \
4137     $pkg_config --atleast-version=0.12.3 spice-protocol && \
4138     compile_prog "$spice_cflags" "$spice_libs" ; then
4139    spice="yes"
4140  else
4141    if test "$spice" = "yes" ; then
4142      feature_not_found "spice" \
4143          "Install spice-server(>=0.12.5) and spice-protocol(>=0.12.3) devel"
4144    fi
4145    spice="no"
4146  fi
4147fi
4148
4149# check for smartcard support
4150if test "$smartcard" != "no"; then
4151    if $pkg_config --atleast-version=2.5.1 libcacard; then
4152        libcacard_cflags=$($pkg_config --cflags libcacard)
4153        libcacard_libs=$($pkg_config --libs libcacard)
4154        smartcard="yes"
4155    else
4156        if test "$smartcard" = "yes"; then
4157            feature_not_found "smartcard" "Install libcacard devel"
4158        fi
4159        smartcard="no"
4160    fi
4161fi
4162
4163# check for libusb
4164if test "$libusb" != "no" ; then
4165    if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
4166        libusb="yes"
4167        libusb_cflags=$($pkg_config --cflags libusb-1.0)
4168        libusb_libs=$($pkg_config --libs libusb-1.0)
4169    else
4170        if test "$libusb" = "yes"; then
4171            feature_not_found "libusb" "Install libusb devel >= 1.0.13"
4172        fi
4173        libusb="no"
4174    fi
4175fi
4176
4177# check for usbredirparser for usb network redirection support
4178if test "$usb_redir" != "no" ; then
4179    if $pkg_config --atleast-version=0.6 libusbredirparser-0.5; then
4180        usb_redir="yes"
4181        usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5)
4182        usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5)
4183    else
4184        if test "$usb_redir" = "yes"; then
4185            feature_not_found "usb-redir" "Install usbredir devel"
4186        fi
4187        usb_redir="no"
4188    fi
4189fi
4190
4191##########################################
4192# check if we have VSS SDK headers for win
4193
4194if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
4195        test "$vss_win32_sdk" != "no" ; then
4196  case "$vss_win32_sdk" in
4197    "")   vss_win32_include="-isystem $source_path" ;;
4198    *\ *) # The SDK is installed in "Program Files" by default, but we cannot
4199          # handle path with spaces. So we symlink the headers into ".sdk/vss".
4200          vss_win32_include="-isystem $source_path/.sdk/vss"
4201	  symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
4202	  ;;
4203    *)    vss_win32_include="-isystem $vss_win32_sdk"
4204  esac
4205  cat > $TMPC << EOF
4206#define __MIDL_user_allocate_free_DEFINED__
4207#include <inc/win2003/vss.h>
4208int main(void) { return VSS_CTX_BACKUP; }
4209EOF
4210  if compile_prog "$vss_win32_include" "" ; then
4211    guest_agent_with_vss="yes"
4212    QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
4213    libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
4214    qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
4215  else
4216    if test "$vss_win32_sdk" != "" ; then
4217      echo "ERROR: Please download and install Microsoft VSS SDK:"
4218      echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
4219      echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
4220      echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
4221      echo "ERROR: The headers are extracted in the directory \`inc'."
4222      feature_not_found "VSS support"
4223    fi
4224    guest_agent_with_vss="no"
4225  fi
4226fi
4227
4228##########################################
4229# lookup Windows platform SDK (if not specified)
4230# The SDK is needed only to build .tlb (type library) file of guest agent
4231# VSS provider from the source. It is usually unnecessary because the
4232# pre-compiled .tlb file is included.
4233
4234if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
4235        test "$guest_agent_with_vss" = "yes" ; then
4236  if test -z "$win_sdk"; then
4237    programfiles="$PROGRAMFILES"
4238    test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
4239    if test -n "$programfiles"; then
4240      win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
4241    else
4242      feature_not_found "Windows SDK"
4243    fi
4244  elif test "$win_sdk" = "no"; then
4245    win_sdk=""
4246  fi
4247fi
4248
4249##########################################
4250# check if mingw environment provides a recent ntddscsi.h
4251if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
4252  cat > $TMPC << EOF
4253#include <windows.h>
4254#include <ntddscsi.h>
4255int main(void) {
4256#if !defined(IOCTL_SCSI_GET_ADDRESS)
4257#error Missing required ioctl definitions
4258#endif
4259  SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
4260  return addr.Lun;
4261}
4262EOF
4263  if compile_prog "" "" ; then
4264    guest_agent_ntddscsi=yes
4265    libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
4266  fi
4267fi
4268
4269##########################################
4270# virgl renderer probe
4271
4272if test "$virglrenderer" != "no" ; then
4273  cat > $TMPC << EOF
4274#include <virglrenderer.h>
4275int main(void) { virgl_renderer_poll(); return 0; }
4276EOF
4277  virgl_cflags=$($pkg_config --cflags virglrenderer 2>/dev/null)
4278  virgl_libs=$($pkg_config --libs virglrenderer 2>/dev/null)
4279  virgl_version=$($pkg_config --modversion virglrenderer 2>/dev/null)
4280  if $pkg_config virglrenderer >/dev/null 2>&1 && \
4281     compile_prog "$virgl_cflags" "$virgl_libs" ; then
4282    virglrenderer="yes"
4283  else
4284    if test "$virglrenderer" = "yes" ; then
4285      feature_not_found "virglrenderer"
4286    fi
4287    virglrenderer="no"
4288  fi
4289fi
4290
4291##########################################
4292# capstone
4293
4294case "$capstone" in
4295  auto | enabled | internal)
4296    # Simpler to always update submodule, even if not needed.
4297    if test -e "${source_path}/.git" && test $git_update = 'yes' ; then
4298      git_submodules="${git_submodules} capstone"
4299    fi
4300    ;;
4301esac
4302
4303##########################################
4304# check if we have fdatasync
4305
4306fdatasync=no
4307cat > $TMPC << EOF
4308#include <unistd.h>
4309int main(void) {
4310#if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
4311return fdatasync(0);
4312#else
4313#error Not supported
4314#endif
4315}
4316EOF
4317if compile_prog "" "" ; then
4318    fdatasync=yes
4319fi
4320
4321##########################################
4322# check if we have madvise
4323
4324madvise=no
4325cat > $TMPC << EOF
4326#include <sys/types.h>
4327#include <sys/mman.h>
4328#include <stddef.h>
4329int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }
4330EOF
4331if compile_prog "" "" ; then
4332    madvise=yes
4333fi
4334
4335##########################################
4336# check if we have posix_madvise
4337
4338posix_madvise=no
4339cat > $TMPC << EOF
4340#include <sys/mman.h>
4341#include <stddef.h>
4342int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }
4343EOF
4344if compile_prog "" "" ; then
4345    posix_madvise=yes
4346fi
4347
4348##########################################
4349# check if we have posix_memalign()
4350
4351posix_memalign=no
4352cat > $TMPC << EOF
4353#include <stdlib.h>
4354int main(void) {
4355    void *p;
4356    return posix_memalign(&p, 8, 8);
4357}
4358EOF
4359if compile_prog "" "" ; then
4360    posix_memalign=yes
4361fi
4362
4363##########################################
4364# check if we have posix_syslog
4365
4366posix_syslog=no
4367cat > $TMPC << EOF
4368#include <syslog.h>
4369int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; }
4370EOF
4371if compile_prog "" "" ; then
4372    posix_syslog=yes
4373fi
4374
4375##########################################
4376# check if we have sem_timedwait
4377
4378sem_timedwait=no
4379cat > $TMPC << EOF
4380#include <semaphore.h>
4381int main(void) { sem_t s; struct timespec t = {0}; return sem_timedwait(&s, &t); }
4382EOF
4383if compile_prog "" "" ; then
4384    sem_timedwait=yes
4385fi
4386
4387##########################################
4388# check if we have strchrnul
4389
4390strchrnul=no
4391cat > $TMPC << EOF
4392#include <string.h>
4393int main(void);
4394// Use a haystack that the compiler shouldn't be able to constant fold
4395char *haystack = (char*)&main;
4396int main(void) { return strchrnul(haystack, 'x') != &haystack[6]; }
4397EOF
4398if compile_prog "" "" ; then
4399    strchrnul=yes
4400fi
4401
4402#########################################
4403# check if we have st_atim
4404
4405st_atim=no
4406cat > $TMPC << EOF
4407#include <sys/stat.h>
4408#include <stddef.h>
4409int main(void) { return offsetof(struct stat, st_atim); }
4410EOF
4411if compile_prog "" "" ; then
4412    st_atim=yes
4413fi
4414
4415##########################################
4416# check if trace backend exists
4417
4418$python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
4419if test "$?" -ne 0 ; then
4420  error_exit "invalid trace backends" \
4421      "Please choose supported trace backends."
4422fi
4423
4424##########################################
4425# For 'ust' backend, test if ust headers are present
4426if have_backend "ust"; then
4427  cat > $TMPC << EOF
4428#include <lttng/tracepoint.h>
4429int main(void) { return 0; }
4430EOF
4431  if compile_prog "" "-Wl,--no-as-needed -ldl" ; then
4432    if $pkg_config lttng-ust --exists; then
4433      lttng_ust_libs=$($pkg_config --libs lttng-ust)
4434    else
4435      lttng_ust_libs="-llttng-ust -ldl"
4436    fi
4437    if $pkg_config liburcu-bp --exists; then
4438      urcu_bp_libs=$($pkg_config --libs liburcu-bp)
4439    else
4440      urcu_bp_libs="-lurcu-bp"
4441    fi
4442  else
4443    error_exit "Trace backend 'ust' missing lttng-ust header files"
4444  fi
4445fi
4446
4447##########################################
4448# For 'dtrace' backend, test if 'dtrace' command is present
4449if have_backend "dtrace"; then
4450  if ! has 'dtrace' ; then
4451    error_exit "dtrace command is not found in PATH $PATH"
4452  fi
4453  trace_backend_stap="no"
4454  if has 'stap' ; then
4455    trace_backend_stap="yes"
4456
4457    # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
4458    # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
4459    # instead. QEMU --enable-modules depends on this because the SystemTap
4460    # semaphores are linked into the main binary and not the module's shared
4461    # object.
4462    QEMU_CFLAGS="$QEMU_CFLAGS -DSTAP_SDT_V2"
4463  fi
4464fi
4465
4466##########################################
4467# check and set a backend for coroutine
4468
4469# We prefer ucontext, but it's not always possible. The fallback
4470# is sigcontext. On Windows the only valid backend is the Windows
4471# specific one.
4472
4473ucontext_works=no
4474if test "$darwin" != "yes"; then
4475  cat > $TMPC << EOF
4476#include <ucontext.h>
4477#ifdef __stub_makecontext
4478#error Ignoring glibc stub makecontext which will always fail
4479#endif
4480int main(void) { makecontext(0, 0, 0); return 0; }
4481EOF
4482  if compile_prog "" "" ; then
4483    ucontext_works=yes
4484  fi
4485fi
4486
4487if test "$coroutine" = ""; then
4488  if test "$mingw32" = "yes"; then
4489    coroutine=win32
4490  elif test "$ucontext_works" = "yes"; then
4491    coroutine=ucontext
4492  else
4493    coroutine=sigaltstack
4494  fi
4495else
4496  case $coroutine in
4497  windows)
4498    if test "$mingw32" != "yes"; then
4499      error_exit "'windows' coroutine backend only valid for Windows"
4500    fi
4501    # Unfortunately the user visible backend name doesn't match the
4502    # coroutine-*.c filename for this case, so we have to adjust it here.
4503    coroutine=win32
4504    ;;
4505  ucontext)
4506    if test "$ucontext_works" != "yes"; then
4507      feature_not_found "ucontext"
4508    fi
4509    ;;
4510  sigaltstack)
4511    if test "$mingw32" = "yes"; then
4512      error_exit "only the 'windows' coroutine backend is valid for Windows"
4513    fi
4514    ;;
4515  *)
4516    error_exit "unknown coroutine backend $coroutine"
4517    ;;
4518  esac
4519fi
4520
4521if test "$coroutine_pool" = ""; then
4522  coroutine_pool=yes
4523fi
4524
4525if test "$debug_stack_usage" = "yes"; then
4526  if test "$coroutine_pool" = "yes"; then
4527    echo "WARN: disabling coroutine pool for stack usage debugging"
4528    coroutine_pool=no
4529  fi
4530fi
4531
4532##################################################
4533# SafeStack
4534
4535
4536if test "$safe_stack" = "yes"; then
4537cat > $TMPC << EOF
4538int main(int argc, char *argv[])
4539{
4540#if ! __has_feature(safe_stack)
4541#error SafeStack Disabled
4542#endif
4543    return 0;
4544}
4545EOF
4546  flag="-fsanitize=safe-stack"
4547  # Check that safe-stack is supported and enabled.
4548  if compile_prog "-Werror $flag" "$flag"; then
4549    # Flag needed both at compilation and at linking
4550    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
4551    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
4552  else
4553    error_exit "SafeStack not supported by your compiler"
4554  fi
4555  if test "$coroutine" != "ucontext"; then
4556    error_exit "SafeStack is only supported by the coroutine backend ucontext"
4557  fi
4558else
4559cat > $TMPC << EOF
4560int main(int argc, char *argv[])
4561{
4562#if defined(__has_feature)
4563#if __has_feature(safe_stack)
4564#error SafeStack Enabled
4565#endif
4566#endif
4567    return 0;
4568}
4569EOF
4570if test "$safe_stack" = "no"; then
4571  # Make sure that safe-stack is disabled
4572  if ! compile_prog "-Werror" ""; then
4573    # SafeStack was already enabled, try to explicitly remove the feature
4574    flag="-fno-sanitize=safe-stack"
4575    if ! compile_prog "-Werror $flag" "$flag"; then
4576      error_exit "Configure cannot disable SafeStack"
4577    fi
4578    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
4579    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
4580  fi
4581else # "$safe_stack" = ""
4582  # Set safe_stack to yes or no based on pre-existing flags
4583  if compile_prog "-Werror" ""; then
4584    safe_stack="no"
4585  else
4586    safe_stack="yes"
4587    if test "$coroutine" != "ucontext"; then
4588      error_exit "SafeStack is only supported by the coroutine backend ucontext"
4589    fi
4590  fi
4591fi
4592fi
4593
4594##########################################
4595# check if we have open_by_handle_at
4596
4597open_by_handle_at=no
4598cat > $TMPC << EOF
4599#include <fcntl.h>
4600#if !defined(AT_EMPTY_PATH)
4601# error missing definition
4602#else
4603int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
4604#endif
4605EOF
4606if compile_prog "" "" ; then
4607    open_by_handle_at=yes
4608fi
4609
4610########################################
4611# check if we have linux/magic.h
4612
4613linux_magic_h=no
4614cat > $TMPC << EOF
4615#include <linux/magic.h>
4616int main(void) {
4617  return 0;
4618}
4619EOF
4620if compile_prog "" "" ; then
4621    linux_magic_h=yes
4622fi
4623
4624########################################
4625# check if we have valgrind/valgrind.h
4626
4627valgrind_h=no
4628cat > $TMPC << EOF
4629#include <valgrind/valgrind.h>
4630int main(void) {
4631  return 0;
4632}
4633EOF
4634if compile_prog "" "" ; then
4635    valgrind_h=yes
4636fi
4637
4638########################################
4639# check if environ is declared
4640
4641has_environ=no
4642cat > $TMPC << EOF
4643#include <unistd.h>
4644int main(void) {
4645    environ = 0;
4646    return 0;
4647}
4648EOF
4649if compile_prog "" "" ; then
4650    has_environ=yes
4651fi
4652
4653########################################
4654# check if cpuid.h is usable.
4655
4656cat > $TMPC << EOF
4657#include <cpuid.h>
4658int main(void) {
4659    unsigned a, b, c, d;
4660    int max = __get_cpuid_max(0, 0);
4661
4662    if (max >= 1) {
4663        __cpuid(1, a, b, c, d);
4664    }
4665
4666    if (max >= 7) {
4667        __cpuid_count(7, 0, a, b, c, d);
4668    }
4669
4670    return 0;
4671}
4672EOF
4673if compile_prog "" "" ; then
4674    cpuid_h=yes
4675fi
4676
4677##########################################
4678# avx2 optimization requirement check
4679#
4680# There is no point enabling this if cpuid.h is not usable,
4681# since we won't be able to select the new routines.
4682
4683if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
4684  cat > $TMPC << EOF
4685#pragma GCC push_options
4686#pragma GCC target("avx2")
4687#include <cpuid.h>
4688#include <immintrin.h>
4689static int bar(void *a) {
4690    __m256i x = *(__m256i *)a;
4691    return _mm256_testz_si256(x, x);
4692}
4693int main(int argc, char *argv[]) { return bar(argv[0]); }
4694EOF
4695  if compile_object "" ; then
4696    avx2_opt="yes"
4697  else
4698    avx2_opt="no"
4699  fi
4700fi
4701
4702##########################################
4703# avx512f optimization requirement check
4704#
4705# There is no point enabling this if cpuid.h is not usable,
4706# since we won't be able to select the new routines.
4707# by default, it is turned off.
4708# if user explicitly want to enable it, check environment
4709
4710if test "$cpuid_h" = "yes" && test "$avx512f_opt" = "yes"; then
4711  cat > $TMPC << EOF
4712#pragma GCC push_options
4713#pragma GCC target("avx512f")
4714#include <cpuid.h>
4715#include <immintrin.h>
4716static int bar(void *a) {
4717    __m512i x = *(__m512i *)a;
4718    return _mm512_test_epi64_mask(x, x);
4719}
4720int main(int argc, char *argv[])
4721{
4722	return bar(argv[0]);
4723}
4724EOF
4725  if ! compile_object "" ; then
4726    avx512f_opt="no"
4727  fi
4728else
4729  avx512f_opt="no"
4730fi
4731
4732########################################
4733# check if __[u]int128_t is usable.
4734
4735int128=no
4736cat > $TMPC << EOF
4737__int128_t a;
4738__uint128_t b;
4739int main (void) {
4740  a = a + b;
4741  b = a * b;
4742  a = a * a;
4743  return 0;
4744}
4745EOF
4746if compile_prog "" "" ; then
4747    int128=yes
4748fi
4749
4750#########################################
4751# See if 128-bit atomic operations are supported.
4752
4753atomic128=no
4754if test "$int128" = "yes"; then
4755  cat > $TMPC << EOF
4756int main(void)
4757{
4758  unsigned __int128 x = 0, y = 0;
4759  y = __atomic_load_16(&x, 0);
4760  __atomic_store_16(&x, y, 0);
4761  __atomic_compare_exchange_16(&x, &y, x, 0, 0, 0);
4762  return 0;
4763}
4764EOF
4765  if compile_prog "" "" ; then
4766    atomic128=yes
4767  fi
4768fi
4769
4770cmpxchg128=no
4771if test "$int128" = yes && test "$atomic128" = no; then
4772  cat > $TMPC << EOF
4773int main(void)
4774{
4775  unsigned __int128 x = 0, y = 0;
4776  __sync_val_compare_and_swap_16(&x, y, x);
4777  return 0;
4778}
4779EOF
4780  if compile_prog "" "" ; then
4781    cmpxchg128=yes
4782  fi
4783fi
4784
4785#########################################
4786# See if 64-bit atomic operations are supported.
4787# Note that without __atomic builtins, we can only
4788# assume atomic loads/stores max at pointer size.
4789
4790cat > $TMPC << EOF
4791#include <stdint.h>
4792int main(void)
4793{
4794  uint64_t x = 0, y = 0;
4795#ifdef __ATOMIC_RELAXED
4796  y = __atomic_load_n(&x, __ATOMIC_RELAXED);
4797  __atomic_store_n(&x, y, __ATOMIC_RELAXED);
4798  __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
4799  __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
4800  __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
4801#else
4802  typedef char is_host64[sizeof(void *) >= sizeof(uint64_t) ? 1 : -1];
4803  __sync_lock_test_and_set(&x, y);
4804  __sync_val_compare_and_swap(&x, y, 0);
4805  __sync_fetch_and_add(&x, y);
4806#endif
4807  return 0;
4808}
4809EOF
4810if compile_prog "" "" ; then
4811  atomic64=yes
4812fi
4813
4814#########################################
4815# See if --dynamic-list is supported by the linker
4816ld_dynamic_list="no"
4817if test "$static" = "no" ; then
4818    cat > $TMPTXT <<EOF
4819{
4820  foo;
4821};
4822EOF
4823
4824    cat > $TMPC <<EOF
4825#include <stdio.h>
4826void foo(void);
4827
4828void foo(void)
4829{
4830  printf("foo\n");
4831}
4832
4833int main(void)
4834{
4835  foo();
4836  return 0;
4837}
4838EOF
4839
4840    if compile_prog "" "-Wl,--dynamic-list=$TMPTXT" ; then
4841        ld_dynamic_list="yes"
4842    fi
4843fi
4844
4845#########################################
4846# See if -exported_symbols_list is supported by the linker
4847
4848ld_exported_symbols_list="no"
4849if test "$static" = "no" ; then
4850    cat > $TMPTXT <<EOF
4851  _foo
4852EOF
4853
4854    if compile_prog "" "-Wl,-exported_symbols_list,$TMPTXT" ; then
4855        ld_exported_symbols_list="yes"
4856    fi
4857fi
4858
4859if  test "$plugins" = "yes" &&
4860    test "$ld_dynamic_list" = "no" &&
4861    test "$ld_exported_symbols_list" = "no" ; then
4862  error_exit \
4863      "Plugin support requires dynamic linking and specifying a set of symbols " \
4864      "that are exported to plugins. Unfortunately your linker doesn't " \
4865      "support the flag (--dynamic-list or -exported_symbols_list) used " \
4866      "for this purpose. You can't build with --static."
4867fi
4868
4869########################################
4870# See if __attribute__((alias)) is supported.
4871# This false for Xcode 9, but has been remedied for Xcode 10.
4872# Unfortunately, travis uses Xcode 9 by default.
4873
4874attralias=no
4875cat > $TMPC << EOF
4876int x = 1;
4877extern const int y __attribute__((alias("x")));
4878int main(void) { return 0; }
4879EOF
4880if compile_prog "" "" ; then
4881    attralias=yes
4882fi
4883
4884########################################
4885# check if getauxval is available.
4886
4887getauxval=no
4888cat > $TMPC << EOF
4889#include <sys/auxv.h>
4890int main(void) {
4891  return getauxval(AT_HWCAP) == 0;
4892}
4893EOF
4894if compile_prog "" "" ; then
4895    getauxval=yes
4896fi
4897
4898########################################
4899# check if ccache is interfering with
4900# semantic analysis of macros
4901
4902unset CCACHE_CPP2
4903ccache_cpp2=no
4904cat > $TMPC << EOF
4905static const int Z = 1;
4906#define fn() ({ Z; })
4907#define TAUT(X) ((X) == Z)
4908#define PAREN(X, Y) (X == Y)
4909#define ID(X) (X)
4910int main(int argc, char *argv[])
4911{
4912    int x = 0, y = 0;
4913    x = ID(x);
4914    x = fn();
4915    fn();
4916    if (PAREN(x, y)) return 0;
4917    if (TAUT(Z)) return 0;
4918    return 0;
4919}
4920EOF
4921
4922if ! compile_object "-Werror"; then
4923    ccache_cpp2=yes
4924fi
4925
4926#################################################
4927# clang does not support glibc + FORTIFY_SOURCE.
4928
4929if test "$fortify_source" != "no"; then
4930  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
4931    fortify_source="no";
4932  elif test -n "$cxx" && has $cxx &&
4933       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
4934    fortify_source="no";
4935  else
4936    fortify_source="yes"
4937  fi
4938fi
4939
4940###############################################
4941# Check if copy_file_range is provided by glibc
4942have_copy_file_range=no
4943cat > $TMPC << EOF
4944#include <unistd.h>
4945int main(void) {
4946  copy_file_range(0, NULL, 0, NULL, 0, 0);
4947  return 0;
4948}
4949EOF
4950if compile_prog "" "" ; then
4951    have_copy_file_range=yes
4952fi
4953
4954##########################################
4955# check if struct fsxattr is available via linux/fs.h
4956
4957have_fsxattr=no
4958cat > $TMPC << EOF
4959#include <linux/fs.h>
4960struct fsxattr foo;
4961int main(void) {
4962  return 0;
4963}
4964EOF
4965if compile_prog "" "" ; then
4966    have_fsxattr=yes
4967fi
4968
4969##########################################
4970# check for usable membarrier system call
4971if test "$membarrier" = "yes"; then
4972    have_membarrier=no
4973    if test "$mingw32" = "yes" ; then
4974        have_membarrier=yes
4975    elif test "$linux" = "yes" ; then
4976        cat > $TMPC << EOF
4977    #include <linux/membarrier.h>
4978    #include <sys/syscall.h>
4979    #include <unistd.h>
4980    #include <stdlib.h>
4981    int main(void) {
4982        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
4983        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
4984	exit(0);
4985    }
4986EOF
4987        if compile_prog "" "" ; then
4988            have_membarrier=yes
4989        fi
4990    fi
4991    if test "$have_membarrier" = "no"; then
4992      feature_not_found "membarrier" "membarrier system call not available"
4993    fi
4994else
4995    # Do not enable it by default even for Mingw32, because it doesn't
4996    # work on Wine.
4997    membarrier=no
4998fi
4999
5000##########################################
5001# check if rtnetlink.h exists and is useful
5002have_rtnetlink=no
5003cat > $TMPC << EOF
5004#include <linux/rtnetlink.h>
5005int main(void) {
5006  return IFLA_PROTO_DOWN;
5007}
5008EOF
5009if compile_prog "" "" ; then
5010    have_rtnetlink=yes
5011fi
5012
5013##########################################
5014# check for usable AF_VSOCK environment
5015have_af_vsock=no
5016cat > $TMPC << EOF
5017#include <errno.h>
5018#include <sys/types.h>
5019#include <sys/socket.h>
5020#if !defined(AF_VSOCK)
5021# error missing AF_VSOCK flag
5022#endif
5023#include <linux/vm_sockets.h>
5024int main(void) {
5025    int sock, ret;
5026    struct sockaddr_vm svm;
5027    socklen_t len = sizeof(svm);
5028    sock = socket(AF_VSOCK, SOCK_STREAM, 0);
5029    ret = getpeername(sock, (struct sockaddr *)&svm, &len);
5030    if ((ret == -1) && (errno == ENOTCONN)) {
5031        return 0;
5032    }
5033    return -1;
5034}
5035EOF
5036if compile_prog "" "" ; then
5037    have_af_vsock=yes
5038fi
5039
5040##########################################
5041# check for usable AF_ALG environment
5042have_afalg=no
5043cat > $TMPC << EOF
5044#include <errno.h>
5045#include <sys/types.h>
5046#include <sys/socket.h>
5047#include <linux/if_alg.h>
5048int main(void) {
5049    int sock;
5050    sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
5051    return sock;
5052}
5053EOF
5054if compile_prog "" "" ; then
5055    have_afalg=yes
5056fi
5057if test "$crypto_afalg" = "yes"
5058then
5059    if test "$have_afalg" != "yes"
5060    then
5061	error_exit "AF_ALG requested but could not be detected"
5062    fi
5063fi
5064
5065
5066#################################################
5067# check for sysmacros.h
5068
5069have_sysmacros=no
5070cat > $TMPC << EOF
5071#include <sys/sysmacros.h>
5072int main(void) {
5073    return makedev(0, 0);
5074}
5075EOF
5076if compile_prog "" "" ; then
5077    have_sysmacros=yes
5078fi
5079
5080##########################################
5081# check for _Static_assert()
5082
5083have_static_assert=no
5084cat > $TMPC << EOF
5085_Static_assert(1, "success");
5086int main(void) {
5087    return 0;
5088}
5089EOF
5090if compile_prog "" "" ; then
5091    have_static_assert=yes
5092fi
5093
5094##########################################
5095# check for utmpx.h, it is missing e.g. on OpenBSD
5096
5097have_utmpx=no
5098cat > $TMPC << EOF
5099#include <utmpx.h>
5100struct utmpx user_info;
5101int main(void) {
5102    return 0;
5103}
5104EOF
5105if compile_prog "" "" ; then
5106    have_utmpx=yes
5107fi
5108
5109##########################################
5110# check for getrandom()
5111
5112have_getrandom=no
5113cat > $TMPC << EOF
5114#include <sys/random.h>
5115int main(void) {
5116    return getrandom(0, 0, GRND_NONBLOCK);
5117}
5118EOF
5119if compile_prog "" "" ; then
5120    have_getrandom=yes
5121fi
5122
5123##########################################
5124# checks for sanitizers
5125
5126have_asan=no
5127have_ubsan=no
5128have_asan_iface_h=no
5129have_asan_iface_fiber=no
5130
5131if test "$sanitizers" = "yes" ; then
5132  write_c_skeleton
5133  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
5134      have_asan=yes
5135  fi
5136
5137  # we could use a simple skeleton for flags checks, but this also
5138  # detect the static linking issue of ubsan, see also:
5139  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
5140  cat > $TMPC << EOF
5141#include <stdlib.h>
5142int main(void) {
5143    void *tmp = malloc(10);
5144    if (tmp != NULL) {
5145        return *(int *)(tmp + 2);
5146    }
5147    return 1;
5148}
5149EOF
5150  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
5151      have_ubsan=yes
5152  fi
5153
5154  if check_include "sanitizer/asan_interface.h" ; then
5155      have_asan_iface_h=yes
5156  fi
5157
5158  cat > $TMPC << EOF
5159#include <sanitizer/asan_interface.h>
5160int main(void) {
5161  __sanitizer_start_switch_fiber(0, 0, 0);
5162  return 0;
5163}
5164EOF
5165  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
5166      have_asan_iface_fiber=yes
5167  fi
5168fi
5169
5170##########################################
5171# checks for fuzzer
5172if test "$fuzzing" = "yes" && test -z "${LIB_FUZZING_ENGINE+xxx}"; then
5173  write_c_fuzzer_skeleton
5174  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=fuzzer" ""; then
5175    have_fuzzer=yes
5176  else
5177    error_exit "Your compiler doesn't support -fsanitize=fuzzer"
5178    exit 1
5179  fi
5180fi
5181
5182# Thread sanitizer is, for now, much noisier than the other sanitizers;
5183# keep it separate until that is not the case.
5184if test "$tsan" = "yes" && test "$sanitizers" = "yes"; then
5185  error_exit "TSAN is not supported with other sanitiziers."
5186fi
5187have_tsan=no
5188have_tsan_iface_fiber=no
5189if test "$tsan" = "yes" ; then
5190  write_c_skeleton
5191  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
5192      have_tsan=yes
5193  fi
5194  cat > $TMPC << EOF
5195#include <sanitizer/tsan_interface.h>
5196int main(void) {
5197  __tsan_create_fiber(0);
5198  return 0;
5199}
5200EOF
5201  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
5202      have_tsan_iface_fiber=yes
5203  fi
5204fi
5205
5206##########################################
5207# check for libpmem
5208
5209if test "$libpmem" != "no"; then
5210	if $pkg_config --exists "libpmem"; then
5211		libpmem="yes"
5212		libpmem_libs=$($pkg_config --libs libpmem)
5213		libpmem_cflags=$($pkg_config --cflags libpmem)
5214	else
5215		if test "$libpmem" = "yes" ; then
5216			feature_not_found "libpmem" "Install nvml or pmdk"
5217		fi
5218		libpmem="no"
5219	fi
5220fi
5221
5222##########################################
5223# check for libdaxctl
5224
5225if test "$libdaxctl" != "no"; then
5226	if $pkg_config --atleast-version=57 "libdaxctl"; then
5227		libdaxctl="yes"
5228		libdaxctl_libs=$($pkg_config --libs libdaxctl)
5229		libdaxctl_cflags=$($pkg_config --cflags libdaxctl)
5230	else
5231		if test "$libdaxctl" = "yes" ; then
5232			feature_not_found "libdaxctl" "Install libdaxctl"
5233		fi
5234		libdaxctl="no"
5235	fi
5236fi
5237
5238##########################################
5239# check for slirp
5240
5241case "$slirp" in
5242  auto | enabled | internal)
5243    # Simpler to always update submodule, even if not needed.
5244    if test -e "${source_path}/.git" && test $git_update = 'yes' ; then
5245      git_submodules="${git_submodules} slirp"
5246    fi
5247    ;;
5248esac
5249
5250##########################################
5251# check for usable __NR_keyctl syscall
5252
5253if test "$linux" = "yes" ; then
5254
5255    have_keyring=no
5256    cat > $TMPC << EOF
5257#include <errno.h>
5258#include <asm/unistd.h>
5259#include <linux/keyctl.h>
5260#include <unistd.h>
5261int main(void) {
5262    return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
5263}
5264EOF
5265    if compile_prog "" "" ; then
5266        have_keyring=yes
5267    fi
5268fi
5269if test "$secret_keyring" != "no"
5270then
5271    if test "$have_keyring" = "yes"
5272    then
5273	secret_keyring=yes
5274    else
5275	if test "$secret_keyring" = "yes"
5276	then
5277	    error_exit "syscall __NR_keyctl requested, \
5278but not implemented on your system"
5279	else
5280	    secret_keyring=no
5281	fi
5282    fi
5283fi
5284
5285##########################################
5286# End of CC checks
5287# After here, no more $cc or $ld runs
5288
5289write_c_skeleton
5290
5291if test "$gcov" = "yes" ; then
5292  :
5293elif test "$fortify_source" = "yes" ; then
5294  QEMU_CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $QEMU_CFLAGS"
5295  debug=no
5296fi
5297
5298case "$ARCH" in
5299alpha)
5300  # Ensure there's only a single GP
5301  QEMU_CFLAGS="-msmall-data $QEMU_CFLAGS"
5302;;
5303esac
5304
5305if test "$gprof" = "yes" ; then
5306  QEMU_CFLAGS="-p $QEMU_CFLAGS"
5307  QEMU_LDFLAGS="-p $QEMU_LDFLAGS"
5308fi
5309
5310if test "$have_asan" = "yes"; then
5311  QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
5312  QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
5313  if test "$have_asan_iface_h" = "no" ; then
5314      echo "ASAN build enabled, but ASAN header missing." \
5315           "Without code annotation, the report may be inferior."
5316  elif test "$have_asan_iface_fiber" = "no" ; then
5317      echo "ASAN build enabled, but ASAN header is too old." \
5318           "Without code annotation, the report may be inferior."
5319  fi
5320fi
5321if test "$have_tsan" = "yes" ; then
5322  if test "$have_tsan_iface_fiber" = "yes" ; then
5323    QEMU_CFLAGS="-fsanitize=thread $QEMU_CFLAGS"
5324    QEMU_LDFLAGS="-fsanitize=thread $QEMU_LDFLAGS"
5325  else
5326    error_exit "Cannot enable TSAN due to missing fiber annotation interface."
5327  fi
5328elif test "$tsan" = "yes" ; then
5329  error_exit "Cannot enable TSAN due to missing sanitize thread interface."
5330fi
5331if test "$have_ubsan" = "yes"; then
5332  QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS"
5333  QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
5334fi
5335
5336##########################################
5337
5338# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
5339if test "$solaris" = "no" && test "$tsan" = "no"; then
5340    if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
5341        QEMU_LDFLAGS="-Wl,--warn-common $QEMU_LDFLAGS"
5342    fi
5343fi
5344
5345# Use ASLR, no-SEH and DEP if available
5346if test "$mingw32" = "yes" ; then
5347    flags="--no-seh --nxcompat"
5348
5349    # Disable ASLR for debug builds to allow debugging with gdb
5350    if test "$debug" = "no" ; then
5351        flags="--dynamicbase $flags"
5352    fi
5353
5354    for flag in $flags; do
5355        if ld_has $flag ; then
5356            QEMU_LDFLAGS="-Wl,$flag $QEMU_LDFLAGS"
5357        fi
5358    done
5359fi
5360
5361# We can only support ivshmem if we have eventfd
5362if [ "$eventfd" = "yes" ]; then
5363  ivshmem=yes
5364fi
5365
5366# Probe for guest agent support/options
5367
5368if [ "$guest_agent" != "no" ]; then
5369  if [ "$softmmu" = no -a "$want_tools" = no ] ; then
5370      guest_agent=no
5371  elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
5372      guest_agent=yes
5373  elif [ "$guest_agent" != yes ]; then
5374      guest_agent=no
5375  else
5376      error_exit "Guest agent is not supported on this platform"
5377  fi
5378fi
5379
5380# Guest agent Window MSI  package
5381
5382if test "$guest_agent" != yes; then
5383  if test "$guest_agent_msi" = yes; then
5384    error_exit "MSI guest agent package requires guest agent enabled"
5385  fi
5386  guest_agent_msi=no
5387elif test "$mingw32" != "yes"; then
5388  if test "$guest_agent_msi" = "yes"; then
5389    error_exit "MSI guest agent package is available only for MinGW Windows cross-compilation"
5390  fi
5391  guest_agent_msi=no
5392elif ! has wixl; then
5393  if test "$guest_agent_msi" = "yes"; then
5394    error_exit "MSI guest agent package requires wixl tool installed ( usually from msitools package )"
5395  fi
5396  guest_agent_msi=no
5397else
5398  # we support qemu-ga, mingw32, and wixl: default to MSI enabled if it wasn't
5399  # disabled explicitly
5400  if test "$guest_agent_msi" != "no"; then
5401    guest_agent_msi=yes
5402  fi
5403fi
5404
5405if test "$guest_agent_msi" = "yes"; then
5406  if test "$guest_agent_with_vss" = "yes"; then
5407    QEMU_GA_MSI_WITH_VSS="-D InstallVss"
5408  fi
5409
5410  if test "$QEMU_GA_MANUFACTURER" = ""; then
5411    QEMU_GA_MANUFACTURER=QEMU
5412  fi
5413
5414  if test "$QEMU_GA_DISTRO" = ""; then
5415    QEMU_GA_DISTRO=Linux
5416  fi
5417
5418  if test "$QEMU_GA_VERSION" = ""; then
5419      QEMU_GA_VERSION=$(cat $source_path/VERSION)
5420  fi
5421
5422  QEMU_GA_MSI_MINGW_DLL_PATH="-D Mingw_dlls=$($pkg_config --variable=prefix glib-2.0)/bin"
5423
5424  case "$cpu" in
5425  x86_64)
5426    QEMU_GA_MSI_ARCH="-a x64 -D Arch=64"
5427    ;;
5428  i386)
5429    QEMU_GA_MSI_ARCH="-D Arch=32"
5430    ;;
5431  *)
5432    error_exit "CPU $cpu not supported for building installation package"
5433    ;;
5434  esac
5435fi
5436
5437# Mac OS X ships with a broken assembler
5438roms=
5439if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
5440        test "$targetos" != "Darwin" && test "$targetos" != "SunOS" && \
5441        test "$targetos" != "Haiku" && test "$softmmu" = yes ; then
5442    # Different host OS linkers have different ideas about the name of the ELF
5443    # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
5444    # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
5445    for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
5446        if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
5447            ld_i386_emulation="$emu"
5448            roms="optionrom"
5449            break
5450        fi
5451    done
5452fi
5453
5454# Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
5455if test "$cpu" = "s390x" ; then
5456  write_c_skeleton
5457  if compile_prog "-march=z900" ""; then
5458    roms="$roms s390-ccw"
5459    # SLOF is required for building the s390-ccw firmware on s390x,
5460    # since it is using the libnet code from SLOF for network booting.
5461    if test -e "${source_path}/.git" ; then
5462      git_submodules="${git_submodules} roms/SLOF"
5463    fi
5464  fi
5465fi
5466
5467# Check that the C++ compiler exists and works with the C compiler.
5468# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
5469if has $cxx; then
5470    cat > $TMPC <<EOF
5471int c_function(void);
5472int main(void) { return c_function(); }
5473EOF
5474
5475    compile_object
5476
5477    cat > $TMPCXX <<EOF
5478extern "C" {
5479   int c_function(void);
5480}
5481int c_function(void) { return 42; }
5482EOF
5483
5484    update_cxxflags
5485
5486    if do_cxx $CXXFLAGS $CONFIGURE_CXXFLAGS $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
5487        # C++ compiler $cxx works ok with C compiler $cc
5488        :
5489    else
5490        echo "C++ compiler $cxx does not work with C compiler $cc"
5491        echo "Disabling C++ specific optional code"
5492        cxx=
5493    fi
5494else
5495    echo "No C++ compiler available; disabling C++ specific optional code"
5496    cxx=
5497fi
5498
5499if test $git_update = 'yes' ; then
5500    (cd "${source_path}" && GIT="$git" "./scripts/git-submodule.sh" update "$git_submodules")
5501fi
5502
5503config_host_mak="config-host.mak"
5504
5505echo "# Automatically generated by configure - do not modify" > $config_host_mak
5506echo >> $config_host_mak
5507
5508echo all: >> $config_host_mak
5509echo "GIT=$git" >> $config_host_mak
5510echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
5511echo "GIT_UPDATE=$git_update" >> $config_host_mak
5512
5513echo "ARCH=$ARCH" >> $config_host_mak
5514
5515if test "$debug_tcg" = "yes" ; then
5516  echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
5517fi
5518if test "$strip_opt" = "yes" ; then
5519  echo "STRIP=${strip}" >> $config_host_mak
5520fi
5521if test "$bigendian" = "yes" ; then
5522  echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
5523fi
5524if test "$mingw32" = "yes" ; then
5525  echo "CONFIG_WIN32=y" >> $config_host_mak
5526  if test "$guest_agent_with_vss" = "yes" ; then
5527    echo "CONFIG_QGA_VSS=y" >> $config_host_mak
5528    echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
5529    echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
5530  fi
5531  if test "$guest_agent_ntddscsi" = "yes" ; then
5532    echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
5533  fi
5534  if test "$guest_agent_msi" = "yes"; then
5535    echo "CONFIG_QGA_MSI=y" >> $config_host_mak
5536    echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
5537    echo "QEMU_GA_MSI_WITH_VSS=${QEMU_GA_MSI_WITH_VSS}" >> $config_host_mak
5538    echo "QEMU_GA_MSI_ARCH=${QEMU_GA_MSI_ARCH}" >> $config_host_mak
5539    echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
5540    echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
5541    echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
5542  fi
5543else
5544  echo "CONFIG_POSIX=y" >> $config_host_mak
5545fi
5546
5547if test "$linux" = "yes" ; then
5548  echo "CONFIG_LINUX=y" >> $config_host_mak
5549fi
5550
5551if test "$darwin" = "yes" ; then
5552  echo "CONFIG_DARWIN=y" >> $config_host_mak
5553fi
5554
5555if test "$solaris" = "yes" ; then
5556  echo "CONFIG_SOLARIS=y" >> $config_host_mak
5557fi
5558if test "$haiku" = "yes" ; then
5559  echo "CONFIG_HAIKU=y" >> $config_host_mak
5560fi
5561if test "$static" = "yes" ; then
5562  echo "CONFIG_STATIC=y" >> $config_host_mak
5563fi
5564if test "$profiler" = "yes" ; then
5565  echo "CONFIG_PROFILER=y" >> $config_host_mak
5566fi
5567if test "$want_tools" = "yes" ; then
5568  echo "CONFIG_TOOLS=y" >> $config_host_mak
5569fi
5570if test "$guest_agent" = "yes" ; then
5571  echo "CONFIG_GUEST_AGENT=y" >> $config_host_mak
5572fi
5573echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
5574if test "$vde" = "yes" ; then
5575  echo "CONFIG_VDE=y" >> $config_host_mak
5576  echo "VDE_LIBS=$vde_libs" >> $config_host_mak
5577fi
5578if test "$netmap" = "yes" ; then
5579  echo "CONFIG_NETMAP=y" >> $config_host_mak
5580fi
5581if test "$l2tpv3" = "yes" ; then
5582  echo "CONFIG_L2TPV3=y" >> $config_host_mak
5583fi
5584if test "$gprof" = "yes" ; then
5585  echo "CONFIG_GPROF=y" >> $config_host_mak
5586fi
5587echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
5588for drv in $audio_drv_list; do
5589    def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
5590    echo "$def=y" >> $config_host_mak
5591done
5592if test "$alsa" = "yes" ; then
5593    echo "CONFIG_ALSA=y" >> $config_host_mak
5594fi
5595echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak
5596echo "ALSA_CFLAGS=$alsa_cflags" >> $config_host_mak
5597if test "$libpulse" = "yes" ; then
5598    echo "CONFIG_LIBPULSE=y" >> $config_host_mak
5599fi
5600echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
5601echo "PULSE_CFLAGS=$pulse_cflags" >> $config_host_mak
5602echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak
5603echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak
5604echo "OSS_LIBS=$oss_libs" >> $config_host_mak
5605if test "$libjack" = "yes" ; then
5606    echo "CONFIG_LIBJACK=y" >> $config_host_mak
5607fi
5608echo "JACK_LIBS=$jack_libs" >> $config_host_mak
5609if test "$audio_win_int" = "yes" ; then
5610  echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
5611fi
5612echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
5613echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
5614if test "$xfs" = "yes" ; then
5615  echo "CONFIG_XFS=y" >> $config_host_mak
5616fi
5617qemu_version=$(head $source_path/VERSION)
5618echo "PKGVERSION=$pkgversion" >>$config_host_mak
5619echo "SRC_PATH=$source_path" >> $config_host_mak
5620echo "TARGET_DIRS=$target_list" >> $config_host_mak
5621if test "$modules" = "yes"; then
5622  # $shacmd can generate a hash started with digit, which the compiler doesn't
5623  # like as an symbol. So prefix it with an underscore
5624  echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
5625  echo "CONFIG_MODULES=y" >> $config_host_mak
5626fi
5627if test "$module_upgrades" = "yes"; then
5628  echo "CONFIG_MODULE_UPGRADES=y" >> $config_host_mak
5629fi
5630if test "$pipe2" = "yes" ; then
5631  echo "CONFIG_PIPE2=y" >> $config_host_mak
5632fi
5633if test "$accept4" = "yes" ; then
5634  echo "CONFIG_ACCEPT4=y" >> $config_host_mak
5635fi
5636if test "$splice" = "yes" ; then
5637  echo "CONFIG_SPLICE=y" >> $config_host_mak
5638fi
5639if test "$eventfd" = "yes" ; then
5640  echo "CONFIG_EVENTFD=y" >> $config_host_mak
5641fi
5642if test "$memfd" = "yes" ; then
5643  echo "CONFIG_MEMFD=y" >> $config_host_mak
5644fi
5645if test "$have_usbfs" = "yes" ; then
5646  echo "CONFIG_USBFS=y" >> $config_host_mak
5647fi
5648if test "$fallocate" = "yes" ; then
5649  echo "CONFIG_FALLOCATE=y" >> $config_host_mak
5650fi
5651if test "$fallocate_punch_hole" = "yes" ; then
5652  echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
5653fi
5654if test "$fallocate_zero_range" = "yes" ; then
5655  echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak
5656fi
5657if test "$posix_fallocate" = "yes" ; then
5658  echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
5659fi
5660if test "$sync_file_range" = "yes" ; then
5661  echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
5662fi
5663if test "$fiemap" = "yes" ; then
5664  echo "CONFIG_FIEMAP=y" >> $config_host_mak
5665fi
5666if test "$dup3" = "yes" ; then
5667  echo "CONFIG_DUP3=y" >> $config_host_mak
5668fi
5669if test "$ppoll" = "yes" ; then
5670  echo "CONFIG_PPOLL=y" >> $config_host_mak
5671fi
5672if test "$prctl_pr_set_timerslack" = "yes" ; then
5673  echo "CONFIG_PRCTL_PR_SET_TIMERSLACK=y" >> $config_host_mak
5674fi
5675if test "$epoll" = "yes" ; then
5676  echo "CONFIG_EPOLL=y" >> $config_host_mak
5677fi
5678if test "$epoll_create1" = "yes" ; then
5679  echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
5680fi
5681if test "$sendfile" = "yes" ; then
5682  echo "CONFIG_SENDFILE=y" >> $config_host_mak
5683fi
5684if test "$timerfd" = "yes" ; then
5685  echo "CONFIG_TIMERFD=y" >> $config_host_mak
5686fi
5687if test "$setns" = "yes" ; then
5688  echo "CONFIG_SETNS=y" >> $config_host_mak
5689fi
5690if test "$clock_adjtime" = "yes" ; then
5691  echo "CONFIG_CLOCK_ADJTIME=y" >> $config_host_mak
5692fi
5693if test "$syncfs" = "yes" ; then
5694  echo "CONFIG_SYNCFS=y" >> $config_host_mak
5695fi
5696if test "$inotify" = "yes" ; then
5697  echo "CONFIG_INOTIFY=y" >> $config_host_mak
5698fi
5699if test "$inotify1" = "yes" ; then
5700  echo "CONFIG_INOTIFY1=y" >> $config_host_mak
5701fi
5702if test "$sem_timedwait" = "yes" ; then
5703  echo "CONFIG_SEM_TIMEDWAIT=y" >> $config_host_mak
5704fi
5705if test "$strchrnul" = "yes" ; then
5706  echo "HAVE_STRCHRNUL=y" >> $config_host_mak
5707fi
5708if test "$st_atim" = "yes" ; then
5709  echo "HAVE_STRUCT_STAT_ST_ATIM=y" >> $config_host_mak
5710fi
5711if test "$byteswap_h" = "yes" ; then
5712  echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
5713fi
5714if test "$bswap_h" = "yes" ; then
5715  echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
5716fi
5717if test "$gio" = "yes" ; then
5718    echo "CONFIG_GIO=y" >> $config_host_mak
5719    echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
5720    echo "GIO_LIBS=$gio_libs" >> $config_host_mak
5721    echo "GDBUS_CODEGEN=$gdbus_codegen" >> $config_host_mak
5722fi
5723echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
5724if test "$gnutls" = "yes" ; then
5725  echo "CONFIG_GNUTLS=y" >> $config_host_mak
5726  echo "GNUTLS_CFLAGS=$gnutls_cflags" >> $config_host_mak
5727  echo "GNUTLS_LIBS=$gnutls_libs" >> $config_host_mak
5728fi
5729if test "$gcrypt" = "yes" ; then
5730  echo "CONFIG_GCRYPT=y" >> $config_host_mak
5731  if test "$gcrypt_hmac" = "yes" ; then
5732    echo "CONFIG_GCRYPT_HMAC=y" >> $config_host_mak
5733  fi
5734  echo "GCRYPT_CFLAGS=$gcrypt_cflags" >> $config_host_mak
5735  echo "GCRYPT_LIBS=$gcrypt_libs" >> $config_host_mak
5736fi
5737if test "$nettle" = "yes" ; then
5738  echo "CONFIG_NETTLE=y" >> $config_host_mak
5739  echo "CONFIG_NETTLE_VERSION_MAJOR=${nettle_version%%.*}" >> $config_host_mak
5740  echo "NETTLE_CFLAGS=$nettle_cflags" >> $config_host_mak
5741  echo "NETTLE_LIBS=$nettle_libs" >> $config_host_mak
5742fi
5743if test "$qemu_private_xts" = "yes" ; then
5744  echo "CONFIG_QEMU_PRIVATE_XTS=y" >> $config_host_mak
5745fi
5746if test "$tasn1" = "yes" ; then
5747  echo "CONFIG_TASN1=y" >> $config_host_mak
5748fi
5749if test "$auth_pam" = "yes" ; then
5750    echo "CONFIG_AUTH_PAM=y" >> $config_host_mak
5751fi
5752if test "$have_broken_size_max" = "yes" ; then
5753    echo "HAVE_BROKEN_SIZE_MAX=y" >> $config_host_mak
5754fi
5755if test "$have_openpty" = "yes" ; then
5756    echo "HAVE_OPENPTY=y" >> $config_host_mak
5757fi
5758
5759# Work around a system header bug with some kernel/XFS header
5760# versions where they both try to define 'struct fsxattr':
5761# xfs headers will not try to redefine structs from linux headers
5762# if this macro is set.
5763if test "$have_fsxattr" = "yes" ; then
5764    echo "HAVE_FSXATTR=y" >> $config_host_mak
5765fi
5766if test "$have_copy_file_range" = "yes" ; then
5767    echo "HAVE_COPY_FILE_RANGE=y" >> $config_host_mak
5768fi
5769if test "$vte" = "yes" ; then
5770  echo "CONFIG_VTE=y" >> $config_host_mak
5771  echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak
5772  echo "VTE_LIBS=$vte_libs" >> $config_host_mak
5773fi
5774if test "$virglrenderer" = "yes" ; then
5775  echo "CONFIG_VIRGL=y" >> $config_host_mak
5776  echo "VIRGL_CFLAGS=$virgl_cflags" >> $config_host_mak
5777  echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak
5778fi
5779if test "$xen" = "enabled" ; then
5780  echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
5781  echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
5782  echo "XEN_CFLAGS=$xen_cflags" >> $config_host_mak
5783  echo "XEN_LIBS=$xen_libs" >> $config_host_mak
5784fi
5785if test "$linux_aio" = "yes" ; then
5786  echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
5787fi
5788if test "$linux_io_uring" = "yes" ; then
5789  echo "CONFIG_LINUX_IO_URING=y" >> $config_host_mak
5790  echo "LINUX_IO_URING_CFLAGS=$linux_io_uring_cflags" >> $config_host_mak
5791  echo "LINUX_IO_URING_LIBS=$linux_io_uring_libs" >> $config_host_mak
5792fi
5793if test "$vhost_scsi" = "yes" ; then
5794  echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
5795fi
5796if test "$vhost_net" = "yes" ; then
5797  echo "CONFIG_VHOST_NET=y" >> $config_host_mak
5798fi
5799if test "$vhost_net_user" = "yes" ; then
5800  echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
5801fi
5802if test "$vhost_net_vdpa" = "yes" ; then
5803  echo "CONFIG_VHOST_NET_VDPA=y" >> $config_host_mak
5804fi
5805if test "$vhost_crypto" = "yes" ; then
5806  echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
5807fi
5808if test "$vhost_vsock" = "yes" ; then
5809  echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
5810  if test "$vhost_user" = "yes" ; then
5811    echo "CONFIG_VHOST_USER_VSOCK=y" >> $config_host_mak
5812  fi
5813fi
5814if test "$vhost_kernel" = "yes" ; then
5815  echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
5816fi
5817if test "$vhost_user" = "yes" ; then
5818  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
5819fi
5820if test "$vhost_vdpa" = "yes" ; then
5821  echo "CONFIG_VHOST_VDPA=y" >> $config_host_mak
5822fi
5823if test "$vhost_user_fs" = "yes" ; then
5824  echo "CONFIG_VHOST_USER_FS=y" >> $config_host_mak
5825fi
5826if test "$iovec" = "yes" ; then
5827  echo "CONFIG_IOVEC=y" >> $config_host_mak
5828fi
5829if test "$preadv" = "yes" ; then
5830  echo "CONFIG_PREADV=y" >> $config_host_mak
5831fi
5832if test "$membarrier" = "yes" ; then
5833  echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
5834fi
5835if test "$signalfd" = "yes" ; then
5836  echo "CONFIG_SIGNALFD=y" >> $config_host_mak
5837fi
5838if test "$optreset" = "yes" ; then
5839  echo "HAVE_OPTRESET=y" >> $config_host_mak
5840fi
5841if test "$tcg" = "enabled"; then
5842  if test "$tcg_interpreter" = "yes" ; then
5843    echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
5844  fi
5845fi
5846if test "$fdatasync" = "yes" ; then
5847  echo "CONFIG_FDATASYNC=y" >> $config_host_mak
5848fi
5849if test "$madvise" = "yes" ; then
5850  echo "CONFIG_MADVISE=y" >> $config_host_mak
5851fi
5852if test "$posix_madvise" = "yes" ; then
5853  echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak
5854fi
5855if test "$posix_memalign" = "yes" ; then
5856  echo "CONFIG_POSIX_MEMALIGN=y" >> $config_host_mak
5857fi
5858if test "$spice" = "yes" ; then
5859  echo "CONFIG_SPICE=y" >> $config_host_mak
5860  echo "SPICE_CFLAGS=$spice_cflags" >> $config_host_mak
5861  echo "SPICE_LIBS=$spice_libs" >> $config_host_mak
5862fi
5863
5864if test "$smartcard" = "yes" ; then
5865  echo "CONFIG_SMARTCARD=y" >> $config_host_mak
5866  echo "SMARTCARD_CFLAGS=$libcacard_cflags" >> $config_host_mak
5867  echo "SMARTCARD_LIBS=$libcacard_libs" >> $config_host_mak
5868fi
5869
5870if test "$libusb" = "yes" ; then
5871  echo "CONFIG_USB_LIBUSB=y" >> $config_host_mak
5872  echo "LIBUSB_CFLAGS=$libusb_cflags" >> $config_host_mak
5873  echo "LIBUSB_LIBS=$libusb_libs" >> $config_host_mak
5874fi
5875
5876if test "$usb_redir" = "yes" ; then
5877  echo "CONFIG_USB_REDIR=y" >> $config_host_mak
5878  echo "USB_REDIR_CFLAGS=$usb_redir_cflags" >> $config_host_mak
5879  echo "USB_REDIR_LIBS=$usb_redir_libs" >> $config_host_mak
5880fi
5881
5882if test "$opengl" = "yes" ; then
5883  echo "CONFIG_OPENGL=y" >> $config_host_mak
5884  echo "OPENGL_CFLAGS=$opengl_cflags" >> $config_host_mak
5885  echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
5886  if test "$opengl_dmabuf" = "yes" ; then
5887    echo "CONFIG_OPENGL_DMABUF=y" >> $config_host_mak
5888  fi
5889fi
5890
5891if test "$gbm" = "yes" ; then
5892    echo "CONFIG_GBM=y" >> $config_host_mak
5893    echo "GBM_LIBS=$gbm_libs" >> $config_host_mak
5894    echo "GBM_CFLAGS=$gbm_cflags" >> $config_host_mak
5895fi
5896
5897
5898if test "$avx2_opt" = "yes" ; then
5899  echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
5900fi
5901
5902if test "$avx512f_opt" = "yes" ; then
5903  echo "CONFIG_AVX512F_OPT=y" >> $config_host_mak
5904fi
5905
5906# XXX: suppress that
5907if [ "$bsd" = "yes" ] ; then
5908  echo "CONFIG_BSD=y" >> $config_host_mak
5909fi
5910
5911if test "$qom_cast_debug" = "yes" ; then
5912  echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
5913fi
5914
5915echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
5916if test "$coroutine_pool" = "yes" ; then
5917  echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
5918else
5919  echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
5920fi
5921
5922if test "$debug_stack_usage" = "yes" ; then
5923  echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
5924fi
5925
5926if test "$crypto_afalg" = "yes" ; then
5927  echo "CONFIG_AF_ALG=y" >> $config_host_mak
5928fi
5929
5930if test "$open_by_handle_at" = "yes" ; then
5931  echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
5932fi
5933
5934if test "$linux_magic_h" = "yes" ; then
5935  echo "CONFIG_LINUX_MAGIC_H=y" >> $config_host_mak
5936fi
5937
5938if test "$valgrind_h" = "yes" ; then
5939  echo "CONFIG_VALGRIND_H=y" >> $config_host_mak
5940fi
5941
5942if test "$have_asan_iface_fiber" = "yes" ; then
5943    echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
5944fi
5945
5946if test "$have_tsan" = "yes" && test "$have_tsan_iface_fiber" = "yes" ; then
5947    echo "CONFIG_TSAN=y" >> $config_host_mak
5948fi
5949
5950if test "$has_environ" = "yes" ; then
5951  echo "CONFIG_HAS_ENVIRON=y" >> $config_host_mak
5952fi
5953
5954if test "$cpuid_h" = "yes" ; then
5955  echo "CONFIG_CPUID_H=y" >> $config_host_mak
5956fi
5957
5958if test "$int128" = "yes" ; then
5959  echo "CONFIG_INT128=y" >> $config_host_mak
5960fi
5961
5962if test "$atomic128" = "yes" ; then
5963  echo "CONFIG_ATOMIC128=y" >> $config_host_mak
5964fi
5965
5966if test "$cmpxchg128" = "yes" ; then
5967  echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
5968fi
5969
5970if test "$atomic64" = "yes" ; then
5971  echo "CONFIG_ATOMIC64=y" >> $config_host_mak
5972fi
5973
5974if test "$attralias" = "yes" ; then
5975  echo "CONFIG_ATTRIBUTE_ALIAS=y" >> $config_host_mak
5976fi
5977
5978if test "$getauxval" = "yes" ; then
5979  echo "CONFIG_GETAUXVAL=y" >> $config_host_mak
5980fi
5981
5982if test "$libssh" = "yes" ; then
5983  echo "CONFIG_LIBSSH=y" >> $config_host_mak
5984  echo "LIBSSH_CFLAGS=$libssh_cflags" >> $config_host_mak
5985  echo "LIBSSH_LIBS=$libssh_libs" >> $config_host_mak
5986fi
5987
5988if test "$live_block_migration" = "yes" ; then
5989  echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
5990fi
5991
5992if test "$tpm" = "yes"; then
5993  echo 'CONFIG_TPM=y' >> $config_host_mak
5994fi
5995
5996echo "TRACE_BACKENDS=$trace_backends" >> $config_host_mak
5997if have_backend "nop"; then
5998  echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
5999fi
6000if have_backend "simple"; then
6001  echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
6002  # Set the appropriate trace file.
6003  trace_file="\"$trace_file-\" FMT_pid"
6004fi
6005if have_backend "log"; then
6006  echo "CONFIG_TRACE_LOG=y" >> $config_host_mak
6007fi
6008if have_backend "ust"; then
6009  echo "CONFIG_TRACE_UST=y" >> $config_host_mak
6010  echo "LTTNG_UST_LIBS=$lttng_ust_libs" >> $config_host_mak
6011  echo "URCU_BP_LIBS=$urcu_bp_libs" >> $config_host_mak
6012fi
6013if have_backend "dtrace"; then
6014  echo "CONFIG_TRACE_DTRACE=y" >> $config_host_mak
6015  if test "$trace_backend_stap" = "yes" ; then
6016    echo "CONFIG_TRACE_SYSTEMTAP=y" >> $config_host_mak
6017  fi
6018fi
6019if have_backend "ftrace"; then
6020  if test "$linux" = "yes" ; then
6021    echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak
6022  else
6023    feature_not_found "ftrace(trace backend)" "ftrace requires Linux"
6024  fi
6025fi
6026if have_backend "syslog"; then
6027  if test "$posix_syslog" = "yes" ; then
6028    echo "CONFIG_TRACE_SYSLOG=y" >> $config_host_mak
6029  else
6030    feature_not_found "syslog(trace backend)" "syslog not available"
6031  fi
6032fi
6033echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
6034
6035if test "$rdma" = "yes" ; then
6036  echo "CONFIG_RDMA=y" >> $config_host_mak
6037  echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
6038fi
6039
6040if test "$pvrdma" = "yes" ; then
6041  echo "CONFIG_PVRDMA=y" >> $config_host_mak
6042fi
6043
6044if test "$have_rtnetlink" = "yes" ; then
6045  echo "CONFIG_RTNETLINK=y" >> $config_host_mak
6046fi
6047
6048if test "$libxml2" = "yes" ; then
6049  echo "CONFIG_LIBXML2=y" >> $config_host_mak
6050  echo "LIBXML2_CFLAGS=$libxml2_cflags" >> $config_host_mak
6051  echo "LIBXML2_LIBS=$libxml2_libs" >> $config_host_mak
6052fi
6053
6054if test "$replication" = "yes" ; then
6055  echo "CONFIG_REPLICATION=y" >> $config_host_mak
6056fi
6057
6058if test "$have_af_vsock" = "yes" ; then
6059  echo "CONFIG_AF_VSOCK=y" >> $config_host_mak
6060fi
6061
6062if test "$have_sysmacros" = "yes" ; then
6063  echo "CONFIG_SYSMACROS=y" >> $config_host_mak
6064fi
6065
6066if test "$have_static_assert" = "yes" ; then
6067  echo "CONFIG_STATIC_ASSERT=y" >> $config_host_mak
6068fi
6069
6070if test "$have_utmpx" = "yes" ; then
6071  echo "HAVE_UTMPX=y" >> $config_host_mak
6072fi
6073if test "$have_getrandom" = "yes" ; then
6074  echo "CONFIG_GETRANDOM=y" >> $config_host_mak
6075fi
6076if test "$ivshmem" = "yes" ; then
6077  echo "CONFIG_IVSHMEM=y" >> $config_host_mak
6078fi
6079if test "$debug_mutex" = "yes" ; then
6080  echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
6081fi
6082
6083# Hold two types of flag:
6084#   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
6085#                                     a thread we have a handle to
6086#   CONFIG_PTHREAD_SETNAME_NP_W_TID - A way of doing it on a particular
6087#                                     platform
6088if test "$pthread_setname_np_w_tid" = "yes" ; then
6089  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
6090  echo "CONFIG_PTHREAD_SETNAME_NP_W_TID=y" >> $config_host_mak
6091elif test "$pthread_setname_np_wo_tid" = "yes" ; then
6092  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
6093  echo "CONFIG_PTHREAD_SETNAME_NP_WO_TID=y" >> $config_host_mak
6094fi
6095
6096if test "$libpmem" = "yes" ; then
6097  echo "CONFIG_LIBPMEM=y" >> $config_host_mak
6098  echo "LIBPMEM_LIBS=$libpmem_libs" >> $config_host_mak
6099  echo "LIBPMEM_CFLAGS=$libpmem_cflags" >> $config_host_mak
6100fi
6101
6102if test "$libdaxctl" = "yes" ; then
6103  echo "CONFIG_LIBDAXCTL=y" >> $config_host_mak
6104  echo "LIBDAXCTL_LIBS=$libdaxctl_libs" >> $config_host_mak
6105fi
6106
6107if test "$bochs" = "yes" ; then
6108  echo "CONFIG_BOCHS=y" >> $config_host_mak
6109fi
6110if test "$cloop" = "yes" ; then
6111  echo "CONFIG_CLOOP=y" >> $config_host_mak
6112fi
6113if test "$dmg" = "yes" ; then
6114  echo "CONFIG_DMG=y" >> $config_host_mak
6115fi
6116if test "$qcow1" = "yes" ; then
6117  echo "CONFIG_QCOW1=y" >> $config_host_mak
6118fi
6119if test "$vdi" = "yes" ; then
6120  echo "CONFIG_VDI=y" >> $config_host_mak
6121fi
6122if test "$vvfat" = "yes" ; then
6123  echo "CONFIG_VVFAT=y" >> $config_host_mak
6124fi
6125if test "$qed" = "yes" ; then
6126  echo "CONFIG_QED=y" >> $config_host_mak
6127fi
6128if test "$parallels" = "yes" ; then
6129  echo "CONFIG_PARALLELS=y" >> $config_host_mak
6130fi
6131if test "$sheepdog" = "yes" ; then
6132  add_to deprecated_features "sheepdog"
6133  echo "CONFIG_SHEEPDOG=y" >> $config_host_mak
6134fi
6135if test "$have_mlockall" = "yes" ; then
6136  echo "HAVE_MLOCKALL=y" >> $config_host_mak
6137fi
6138if test "$fuzzing" = "yes" ; then
6139  # If LIB_FUZZING_ENGINE is set, assume we are running on OSS-Fuzz, and the
6140  # needed CFLAGS have already been provided
6141  if test -z "${LIB_FUZZING_ENGINE+xxx}" ; then
6142    QEMU_CFLAGS="$QEMU_CFLAGS -fsanitize=fuzzer-no-link"
6143    FUZZ_EXE_LDFLAGS="-fsanitize=fuzzer"
6144  else
6145    FUZZ_EXE_LDFLAGS="$LIB_FUZZING_ENGINE"
6146  fi
6147fi
6148
6149if test "$plugins" = "yes" ; then
6150    echo "CONFIG_PLUGIN=y" >> $config_host_mak
6151    # Copy the export object list to the build dir
6152    if test "$ld_dynamic_list" = "yes" ; then
6153	echo "CONFIG_HAS_LD_DYNAMIC_LIST=yes" >> $config_host_mak
6154	ld_symbols=qemu-plugins-ld.symbols
6155	cp "$source_path/plugins/qemu-plugins.symbols" $ld_symbols
6156    elif test "$ld_exported_symbols_list" = "yes" ; then
6157	echo "CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST=yes" >> $config_host_mak
6158	ld64_symbols=qemu-plugins-ld64.symbols
6159	echo "# Automatically generated by configure - do not modify" > $ld64_symbols
6160	grep 'qemu_' "$source_path/plugins/qemu-plugins.symbols" | sed 's/;//g' | \
6161	    sed -E 's/^[[:space:]]*(.*)/_\1/' >> $ld64_symbols
6162    else
6163	error_exit \
6164	    "If \$plugins=yes, either \$ld_dynamic_list or " \
6165	    "\$ld_exported_symbols_list should have been set to 'yes'."
6166    fi
6167fi
6168
6169if test -n "$gdb_bin"; then
6170    gdb_version=$($gdb_bin --version | head -n 1)
6171    if version_ge ${gdb_version##* } 8.3.1; then
6172        echo "HAVE_GDB_BIN=$gdb_bin" >> $config_host_mak
6173    fi
6174fi
6175
6176if test "$secret_keyring" = "yes" ; then
6177  echo "CONFIG_SECRET_KEYRING=y" >> $config_host_mak
6178fi
6179
6180echo "ROMS=$roms" >> $config_host_mak
6181echo "MAKE=$make" >> $config_host_mak
6182echo "PYTHON=$python" >> $config_host_mak
6183echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
6184echo "MESON=$meson" >> $config_host_mak
6185echo "NINJA=$ninja" >> $config_host_mak
6186echo "CC=$cc" >> $config_host_mak
6187if $iasl -h > /dev/null 2>&1; then
6188  echo "CONFIG_IASL=$iasl" >> $config_host_mak
6189fi
6190echo "CXX=$cxx" >> $config_host_mak
6191echo "OBJCC=$objcc" >> $config_host_mak
6192echo "AR=$ar" >> $config_host_mak
6193echo "ARFLAGS=$ARFLAGS" >> $config_host_mak
6194echo "AS=$as" >> $config_host_mak
6195echo "CCAS=$ccas" >> $config_host_mak
6196echo "CPP=$cpp" >> $config_host_mak
6197echo "OBJCOPY=$objcopy" >> $config_host_mak
6198echo "LD=$ld" >> $config_host_mak
6199echo "RANLIB=$ranlib" >> $config_host_mak
6200echo "NM=$nm" >> $config_host_mak
6201echo "PKG_CONFIG=$pkg_config_exe" >> $config_host_mak
6202echo "WINDRES=$windres" >> $config_host_mak
6203echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
6204echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
6205echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
6206echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
6207echo "GLIB_LIBS=$glib_libs" >> $config_host_mak
6208echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
6209echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
6210echo "EXESUF=$EXESUF" >> $config_host_mak
6211echo "HOST_DSOSUF=$HOST_DSOSUF" >> $config_host_mak
6212echo "LIBS_QGA=$libs_qga" >> $config_host_mak
6213echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak
6214echo "TASN1_CFLAGS=$tasn1_cflags" >> $config_host_mak
6215if test "$gcov" = "yes" ; then
6216  echo "CONFIG_GCOV=y" >> $config_host_mak
6217fi
6218
6219if test "$fuzzing" != "no"; then
6220    echo "CONFIG_FUZZ=y" >> $config_host_mak
6221fi
6222echo "FUZZ_EXE_LDFLAGS=$FUZZ_EXE_LDFLAGS" >> $config_host_mak
6223
6224if test "$rng_none" = "yes"; then
6225  echo "CONFIG_RNG_NONE=y" >> $config_host_mak
6226fi
6227
6228# use included Linux headers
6229if test "$linux" = "yes" ; then
6230  mkdir -p linux-headers
6231  case "$cpu" in
6232  i386|x86_64|x32)
6233    linux_arch=x86
6234    ;;
6235  ppc|ppc64|ppc64le)
6236    linux_arch=powerpc
6237    ;;
6238  s390x)
6239    linux_arch=s390
6240    ;;
6241  aarch64)
6242    linux_arch=arm64
6243    ;;
6244  mips64)
6245    linux_arch=mips
6246    ;;
6247  *)
6248    # For most CPUs the kernel architecture name and QEMU CPU name match.
6249    linux_arch="$cpu"
6250    ;;
6251  esac
6252    # For non-KVM architectures we will not have asm headers
6253    if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
6254      symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
6255    fi
6256fi
6257
6258for target in $target_list; do
6259    target_dir="$target"
6260    target_name=$(echo $target | cut -d '-' -f 1)
6261    mkdir -p $target_dir
6262    case $target in
6263        *-user) symlink "../qemu-$target_name" "$target_dir/qemu-$target_name" ;;
6264        *) symlink "../qemu-system-$target_name" "$target_dir/qemu-system-$target_name" ;;
6265    esac
6266done
6267
6268echo "CONFIG_QEMU_INTERP_PREFIX=$interp_prefix" | sed 's/%M/@0@/' >> $config_host_mak
6269if test "$default_targets" = "yes"; then
6270  echo "CONFIG_DEFAULT_TARGETS=y" >> $config_host_mak
6271fi
6272
6273if test "$numa" = "yes"; then
6274  echo "CONFIG_NUMA=y" >> $config_host_mak
6275  echo "NUMA_LIBS=$numa_libs" >> $config_host_mak
6276fi
6277
6278if test "$ccache_cpp2" = "yes"; then
6279  echo "export CCACHE_CPP2=y" >> $config_host_mak
6280fi
6281
6282if test "$safe_stack" = "yes"; then
6283  echo "CONFIG_SAFESTACK=y" >> $config_host_mak
6284fi
6285
6286# If we're using a separate build tree, set it up now.
6287# DIRS are directories which we simply mkdir in the build tree;
6288# LINKS are things to symlink back into the source tree
6289# (these can be both files and directories).
6290# Caution: do not add files or directories here using wildcards. This
6291# will result in problems later if a new file matching the wildcard is
6292# added to the source tree -- nothing will cause configure to be rerun
6293# so the build tree will be missing the link back to the new file, and
6294# tests might fail. Prefer to keep the relevant files in their own
6295# directory and symlink the directory instead.
6296# UNLINK is used to remove symlinks from older development versions
6297# that might get into the way when doing "git update" without doing
6298# a "make distclean" in between.
6299DIRS="tests tests/tcg tests/tcg/lm32 tests/qapi-schema tests/qtest/libqos"
6300DIRS="$DIRS tests/qtest tests/qemu-iotests tests/vm tests/fp tests/qgraph"
6301DIRS="$DIRS docs docs/interop fsdev scsi"
6302DIRS="$DIRS pc-bios/optionrom pc-bios/s390-ccw"
6303DIRS="$DIRS roms/seabios"
6304DIRS="$DIRS contrib/plugins/"
6305LINKS="Makefile"
6306LINKS="$LINKS tests/tcg/lm32/Makefile"
6307LINKS="$LINKS tests/tcg/Makefile.target"
6308LINKS="$LINKS pc-bios/optionrom/Makefile"
6309LINKS="$LINKS pc-bios/s390-ccw/Makefile"
6310LINKS="$LINKS roms/seabios/Makefile"
6311LINKS="$LINKS pc-bios/qemu-icon.bmp"
6312LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
6313LINKS="$LINKS tests/acceptance tests/data"
6314LINKS="$LINKS tests/qemu-iotests/check"
6315LINKS="$LINKS python"
6316LINKS="$LINKS contrib/plugins/Makefile "
6317UNLINK="pc-bios/keymaps"
6318for bios_file in \
6319    $source_path/pc-bios/*.bin \
6320    $source_path/pc-bios/*.elf \
6321    $source_path/pc-bios/*.lid \
6322    $source_path/pc-bios/*.rom \
6323    $source_path/pc-bios/*.dtb \
6324    $source_path/pc-bios/*.img \
6325    $source_path/pc-bios/openbios-* \
6326    $source_path/pc-bios/u-boot.* \
6327    $source_path/pc-bios/edk2-*.fd.bz2 \
6328    $source_path/pc-bios/palcode-*
6329do
6330    LINKS="$LINKS pc-bios/$(basename $bios_file)"
6331done
6332mkdir -p $DIRS
6333for f in $LINKS ; do
6334    if [ -e "$source_path/$f" ]; then
6335        symlink "$source_path/$f" "$f"
6336    fi
6337done
6338for f in $UNLINK ; do
6339    if [ -L "$f" ]; then
6340        rm -f "$f"
6341    fi
6342done
6343
6344(for i in $cross_cc_vars; do
6345  export $i
6346done
6347export target_list source_path use_containers
6348$source_path/tests/tcg/configure.sh)
6349
6350# temporary config to build submodules
6351for rom in seabios; do
6352    config_mak=roms/$rom/config.mak
6353    echo "# Automatically generated by configure - do not modify" > $config_mak
6354    echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
6355    echo "AS=$as" >> $config_mak
6356    echo "CCAS=$ccas" >> $config_mak
6357    echo "CC=$cc" >> $config_mak
6358    echo "BCC=bcc" >> $config_mak
6359    echo "CPP=$cpp" >> $config_mak
6360    echo "OBJCOPY=objcopy" >> $config_mak
6361    echo "IASL=$iasl" >> $config_mak
6362    echo "LD=$ld" >> $config_mak
6363    echo "RANLIB=$ranlib" >> $config_mak
6364done
6365
6366if test "$skip_meson" = no; then
6367cross="config-meson.cross.new"
6368meson_quote() {
6369    echo "'$(echo $* | sed "s/ /','/g")'"
6370}
6371
6372echo "# Automatically generated by configure - do not modify" > $cross
6373echo "[properties]" >> $cross
6374test -z "$cxx" && echo "link_language = 'c'" >> $cross
6375echo "[built-in options]" >> $cross
6376echo "c_args = [${CFLAGS:+$(meson_quote $CFLAGS)}]" >> $cross
6377echo "cpp_args = [${CXXFLAGS:+$(meson_quote $CXXFLAGS)}]" >> $cross
6378echo "c_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
6379echo "cpp_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
6380echo "[binaries]" >> $cross
6381echo "c = [$(meson_quote $cc)]" >> $cross
6382test -n "$cxx" && echo "cpp = [$(meson_quote $cxx)]" >> $cross
6383echo "ar = [$(meson_quote $ar)]" >> $cross
6384echo "nm = [$(meson_quote $nm)]" >> $cross
6385echo "pkgconfig = [$(meson_quote $pkg_config_exe)]" >> $cross
6386echo "ranlib = [$(meson_quote $ranlib)]" >> $cross
6387if has $sdl2_config; then
6388  echo "sdl2-config = [$(meson_quote $sdl2_config)]" >> $cross
6389fi
6390echo "strip = [$(meson_quote $strip)]" >> $cross
6391echo "windres = [$(meson_quote $windres)]" >> $cross
6392if test -n "$cross_prefix"; then
6393    cross_arg="--cross-file config-meson.cross"
6394    echo "[host_machine]" >> $cross
6395    if test "$mingw32" = "yes" ; then
6396        echo "system = 'windows'" >> $cross
6397    fi
6398    if test "$linux" = "yes" ; then
6399        echo "system = 'linux'" >> $cross
6400    fi
6401    case "$ARCH" in
6402        i386|x86_64)
6403            echo "cpu_family = 'x86'" >> $cross
6404            ;;
6405        ppc64le)
6406            echo "cpu_family = 'ppc64'" >> $cross
6407            ;;
6408        *)
6409            echo "cpu_family = '$ARCH'" >> $cross
6410            ;;
6411    esac
6412    echo "cpu = '$cpu'" >> $cross
6413    if test "$bigendian" = "yes" ; then
6414        echo "endian = 'big'" >> $cross
6415    else
6416        echo "endian = 'little'" >> $cross
6417    fi
6418else
6419    cross_arg="--native-file config-meson.cross"
6420fi
6421mv $cross config-meson.cross
6422
6423rm -rf meson-private meson-info meson-logs
6424unset staticpic
6425if ! version_ge "$($meson --version)" 0.56.0; then
6426  staticpic=$(if test "$pie" = yes; then echo true; else echo false; fi)
6427fi
6428NINJA=$ninja $meson setup \
6429        --prefix "$prefix" \
6430        --libdir "$libdir" \
6431        --libexecdir "$libexecdir" \
6432        --bindir "$bindir" \
6433        --includedir "$includedir" \
6434        --datadir "$datadir" \
6435        --mandir "$mandir" \
6436        --sysconfdir "$sysconfdir" \
6437        --localedir "$localedir" \
6438        --localstatedir "$local_statedir" \
6439        -Ddocdir="$docdir" \
6440        -Dqemu_firmwarepath="$firmwarepath" \
6441        -Dqemu_suffix="$qemu_suffix" \
6442        -Doptimization=$(if test "$debug" = yes; then echo 0; else echo 2; fi) \
6443        -Ddebug=$(if test "$debug_info" = yes; then echo true; else echo false; fi) \
6444        -Dwerror=$(if test "$werror" = yes; then echo true; else echo false; fi) \
6445        -Dstrip=$(if test "$strip_opt" = yes; then echo true; else echo false; fi) \
6446        -Db_pie=$(if test "$pie" = yes; then echo true; else echo false; fi) \
6447        ${staticpic:+-Db_staticpic=$staticpic} \
6448        -Db_coverage=$(if test "$gcov" = yes; then echo true; else echo false; fi) \
6449        -Db_lto=$lto -Dcfi=$cfi -Dcfi_debug=$cfi_debug \
6450        -Dmalloc=$malloc -Dmalloc_trim=$malloc_trim -Dsparse=$sparse \
6451        -Dkvm=$kvm -Dhax=$hax -Dwhpx=$whpx -Dhvf=$hvf \
6452        -Dxen=$xen -Dxen_pci_passthrough=$xen_pci_passthrough -Dtcg=$tcg \
6453        -Dcocoa=$cocoa -Dgtk=$gtk -Dmpath=$mpath -Dsdl=$sdl -Dsdl_image=$sdl_image \
6454        -Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg -Dvnc_png=$vnc_png \
6455        -Dgettext=$gettext -Dxkbcommon=$xkbcommon -Du2f=$u2f -Dvirtiofsd=$virtiofsd \
6456        -Dcapstone=$capstone -Dslirp=$slirp -Dfdt=$fdt -Dbrlapi=$brlapi \
6457        -Dcurl=$curl -Dglusterfs=$glusterfs -Dbzip2=$bzip2 -Dlibiscsi=$libiscsi \
6458        -Dlibnfs=$libnfs -Diconv=$iconv -Dcurses=$curses -Dlibudev=$libudev\
6459        -Drbd=$rbd -Dlzo=$lzo -Dsnappy=$snappy -Dlzfse=$lzfse \
6460        -Dzstd=$zstd -Dseccomp=$seccomp -Dvirtfs=$virtfs -Dcap_ng=$cap_ng \
6461        -Dattr=$attr -Ddefault_devices=$default_devices \
6462        -Ddocs=$docs -Dsphinx_build=$sphinx_build -Dinstall_blobs=$blobs \
6463        -Dvhost_user_blk_server=$vhost_user_blk_server \
6464        -Dfuse=$fuse -Dfuse_lseek=$fuse_lseek \
6465        $(if test "$default_features" = no; then echo "-Dauto_features=disabled"; fi) \
6466        $cross_arg \
6467        "$PWD" "$source_path"
6468
6469if test "$?" -ne 0 ; then
6470    error_exit "meson setup failed"
6471fi
6472fi
6473
6474if test -n "${deprecated_features}"; then
6475    echo "Warning, deprecated features enabled."
6476    echo "Please see docs/system/deprecated.rst"
6477    echo "  features: ${deprecated_features}"
6478fi
6479
6480# Save the configure command line for later reuse.
6481cat <<EOD >config.status
6482#!/bin/sh
6483# Generated by configure.
6484# Run this file to recreate the current configuration.
6485# Compiler output produced by configure, useful for debugging
6486# configure, is in config.log if it exists.
6487EOD
6488
6489preserve_env() {
6490    envname=$1
6491
6492    eval envval=\$$envname
6493
6494    if test -n "$envval"
6495    then
6496	echo "$envname='$envval'" >> config.status
6497	echo "export $envname" >> config.status
6498    else
6499	echo "unset $envname" >> config.status
6500    fi
6501}
6502
6503# Preserve various env variables that influence what
6504# features/build target configure will detect
6505preserve_env AR
6506preserve_env AS
6507preserve_env CC
6508preserve_env CPP
6509preserve_env CXX
6510preserve_env INSTALL
6511preserve_env LD
6512preserve_env LD_LIBRARY_PATH
6513preserve_env LIBTOOL
6514preserve_env MAKE
6515preserve_env NM
6516preserve_env OBJCOPY
6517preserve_env PATH
6518preserve_env PKG_CONFIG
6519preserve_env PKG_CONFIG_LIBDIR
6520preserve_env PKG_CONFIG_PATH
6521preserve_env PYTHON
6522preserve_env SDL2_CONFIG
6523preserve_env SMBD
6524preserve_env STRIP
6525preserve_env WINDRES
6526
6527printf "exec" >>config.status
6528for i in "$0" "$@"; do
6529  test "$i" = --skip-meson || printf " %s" "$(quote_sh "$i")" >>config.status
6530done
6531echo ' "$@"' >>config.status
6532chmod +x config.status
6533
6534rm -r "$TMPDIR1"
6535