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