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