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