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