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