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