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