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