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