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