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