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