xref: /openbmc/qemu/configure (revision 327d4b7f)
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    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=gnu11/-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"
259else
260    git_submodules_action="ignore"
261fi
262
263git_submodules="ui/keycodemapdb"
264git="git"
265
266# Don't accept a target_list environment variable.
267unset target_list
268unset target_list_exclude
269
270# Default value for a variable defining feature "foo".
271#  * foo="no"  feature will only be used if --enable-foo arg is given
272#  * foo=""    feature will be searched for, and if found, will be used
273#              unless --disable-foo is given
274#  * foo="yes" this value will only be set by --enable-foo flag.
275#              feature will searched for,
276#              if not found, configure exits with error
277#
278# Always add --enable-foo and --disable-foo command line args.
279# Distributions want to ensure that several features are compiled in, and it
280# is impossible without a --enable-foo that exits if a feature is not found.
281
282default_feature=""
283# parse CC options second
284for opt do
285  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
286  case "$opt" in
287      --without-default-features)
288          default_feature="no"
289  ;;
290  esac
291done
292
293brlapi="auto"
294curl="auto"
295iconv="auto"
296curses="auto"
297docs="auto"
298fdt="auto"
299netmap="no"
300sdl="auto"
301sdl_image="auto"
302coreaudio="auto"
303virtiofsd="auto"
304virtfs="auto"
305libudev="auto"
306mpath="auto"
307vnc="enabled"
308sparse="auto"
309vde="$default_feature"
310vnc_sasl="auto"
311vnc_jpeg="auto"
312vnc_png="auto"
313xkbcommon="auto"
314xen="$default_feature"
315xen_ctrl_version="$default_feature"
316xen_pci_passthrough="auto"
317linux_aio="$default_feature"
318linux_io_uring="auto"
319cap_ng="auto"
320attr="auto"
321xfs="$default_feature"
322tcg="enabled"
323membarrier="$default_feature"
324vhost_net="$default_feature"
325vhost_crypto="$default_feature"
326vhost_scsi="$default_feature"
327vhost_vsock="$default_feature"
328vhost_user="no"
329vhost_user_blk_server="auto"
330vhost_user_fs="$default_feature"
331bpf="auto"
332kvm="auto"
333hax="auto"
334hvf="auto"
335whpx="auto"
336nvmm="auto"
337rdma="$default_feature"
338pvrdma="$default_feature"
339gprof="no"
340debug_tcg="no"
341debug="no"
342sanitizers="no"
343tsan="no"
344fortify_source="$default_feature"
345strip_opt="yes"
346tcg_interpreter="false"
347bigendian="no"
348mingw32="no"
349gcov="no"
350EXESUF=""
351HOST_DSOSUF=".so"
352modules="no"
353module_upgrades="no"
354prefix="/usr/local"
355qemu_suffix="qemu"
356slirp="auto"
357oss_lib=""
358bsd="no"
359linux="no"
360solaris="no"
361profiler="no"
362cocoa="auto"
363softmmu="yes"
364linux_user="no"
365bsd_user="no"
366blobs="true"
367pkgversion=""
368pie=""
369qom_cast_debug="yes"
370trace_backends="log"
371trace_file="trace"
372spice="$default_feature"
373spice_protocol="auto"
374rbd="auto"
375smartcard="auto"
376u2f="auto"
377libusb="auto"
378usb_redir="auto"
379opengl="$default_feature"
380cpuid_h="no"
381avx2_opt="$default_feature"
382capstone="auto"
383lzo="auto"
384snappy="auto"
385bzip2="auto"
386lzfse="auto"
387zstd="auto"
388guest_agent="$default_feature"
389guest_agent_with_vss="no"
390guest_agent_ntddscsi="no"
391guest_agent_msi="auto"
392vss_win32_sdk="$default_feature"
393win_sdk="no"
394want_tools="$default_feature"
395libiscsi="auto"
396libnfs="auto"
397coroutine=""
398coroutine_pool="$default_feature"
399debug_stack_usage="no"
400crypto_afalg="no"
401cfi="false"
402cfi_debug="false"
403seccomp="auto"
404glusterfs="auto"
405gtk="auto"
406tls_priority="NORMAL"
407gnutls="auto"
408nettle="auto"
409gcrypt="auto"
410auth_pam="auto"
411vte="auto"
412virglrenderer="auto"
413tpm="$default_feature"
414libssh="$default_feature"
415live_block_migration=${default_feature:-yes}
416numa="$default_feature"
417tcmalloc="no"
418jemalloc="no"
419replication=${default_feature:-yes}
420bochs=${default_feature:-yes}
421cloop=${default_feature:-yes}
422dmg=${default_feature:-yes}
423qcow1=${default_feature:-yes}
424vdi=${default_feature:-yes}
425vvfat=${default_feature:-yes}
426qed=${default_feature:-yes}
427parallels=${default_feature:-yes}
428libxml2="auto"
429debug_mutex="no"
430libpmem="auto"
431default_devices="true"
432plugins="no"
433fuzzing="no"
434rng_none="no"
435secret_keyring="$default_feature"
436libdaxctl="auto"
437meson=""
438ninja=""
439skip_meson=no
440gettext="auto"
441fuse="auto"
442fuse_lseek="auto"
443multiprocess="auto"
444slirp_smbd="$default_feature"
445
446malloc_trim="auto"
447gio="$default_feature"
448
449# parse CC options second
450for opt do
451  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
452  case "$opt" in
453  --cross-prefix=*) cross_prefix="$optarg"
454                    cross_compile="yes"
455  ;;
456  --cc=*) CC="$optarg"
457  ;;
458  --cxx=*) CXX="$optarg"
459  ;;
460  --cpu=*) cpu="$optarg"
461  ;;
462  --extra-cflags=*) QEMU_CFLAGS="$QEMU_CFLAGS $optarg"
463                    QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg"
464  ;;
465  --extra-cxxflags=*) QEMU_CXXFLAGS="$QEMU_CXXFLAGS $optarg"
466  ;;
467  --extra-ldflags=*) QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg"
468                     EXTRA_LDFLAGS="$optarg"
469  ;;
470  --enable-debug-info) debug_info="yes"
471  ;;
472  --disable-debug-info) debug_info="no"
473  ;;
474  --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"
475  ;;
476  --cross-cc-cflags-*) cc_arch=${opt#--cross-cc-flags-}; cc_arch=${cc_arch%%=*}
477                      eval "cross_cc_cflags_${cc_arch}=\$optarg"
478                      cross_cc_vars="$cross_cc_vars cross_cc_cflags_${cc_arch}"
479  ;;
480  --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}
481                cc_archs="$cc_archs $cc_arch"
482                eval "cross_cc_${cc_arch}=\$optarg"
483                cross_cc_vars="$cross_cc_vars cross_cc_${cc_arch}"
484  ;;
485  esac
486done
487# OS specific
488# Using uname is really, really broken.  Once we have the right set of checks
489# we can eliminate its usage altogether.
490
491# Preferred compiler:
492#  ${CC} (if set)
493#  ${cross_prefix}gcc (if cross-prefix specified)
494#  system compiler
495if test -z "${CC}${cross_prefix}"; then
496  cc="$host_cc"
497else
498  cc="${CC-${cross_prefix}gcc}"
499fi
500
501if test -z "${CXX}${cross_prefix}"; then
502  cxx="c++"
503else
504  cxx="${CXX-${cross_prefix}g++}"
505fi
506
507ar="${AR-${cross_prefix}ar}"
508as="${AS-${cross_prefix}as}"
509ccas="${CCAS-$cc}"
510cpp="${CPP-$cc -E}"
511objcopy="${OBJCOPY-${cross_prefix}objcopy}"
512ld="${LD-${cross_prefix}ld}"
513ranlib="${RANLIB-${cross_prefix}ranlib}"
514nm="${NM-${cross_prefix}nm}"
515strip="${STRIP-${cross_prefix}strip}"
516windres="${WINDRES-${cross_prefix}windres}"
517pkg_config_exe="${PKG_CONFIG-${cross_prefix}pkg-config}"
518query_pkg_config() {
519    "${pkg_config_exe}" ${QEMU_PKG_CONFIG_FLAGS} "$@"
520}
521pkg_config=query_pkg_config
522sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
523
524# default flags for all hosts
525# We use -fwrapv to tell the compiler that we require a C dialect where
526# left shift of signed integers is well defined and has the expected
527# 2s-complement style results. (Both clang and gcc agree that it
528# provides these semantics.)
529QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv $QEMU_CFLAGS"
530QEMU_CFLAGS="-Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS"
531QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS"
532QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
533
534# Flags that are needed during configure but later taken care of by Meson
535CONFIGURE_CFLAGS="-std=gnu11 -Wall"
536CONFIGURE_LDFLAGS=
537
538
539check_define() {
540cat > $TMPC <<EOF
541#if !defined($1)
542#error $1 not defined
543#endif
544int main(void) { return 0; }
545EOF
546  compile_object
547}
548
549check_include() {
550cat > $TMPC <<EOF
551#include <$1>
552int main(void) { return 0; }
553EOF
554  compile_object
555}
556
557write_c_skeleton() {
558    cat > $TMPC <<EOF
559int main(void) { return 0; }
560EOF
561}
562
563write_c_fuzzer_skeleton() {
564    cat > $TMPC <<EOF
565#include <stdint.h>
566#include <sys/types.h>
567int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
568int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
569EOF
570}
571
572if check_define __linux__ ; then
573  targetos="Linux"
574elif check_define _WIN32 ; then
575  targetos='MINGW32'
576elif check_define __OpenBSD__ ; then
577  targetos='OpenBSD'
578elif check_define __sun__ ; then
579  targetos='SunOS'
580elif check_define __HAIKU__ ; then
581  targetos='Haiku'
582elif check_define __FreeBSD__ ; then
583  targetos='FreeBSD'
584elif check_define __FreeBSD_kernel__ && check_define __GLIBC__; then
585  targetos='GNU/kFreeBSD'
586elif check_define __DragonFly__ ; then
587  targetos='DragonFly'
588elif check_define __NetBSD__; then
589  targetos='NetBSD'
590elif check_define __APPLE__; then
591  targetos='Darwin'
592else
593  # This is a fatal error, but don't report it yet, because we
594  # might be going to just print the --help text, or it might
595  # be the result of a missing compiler.
596  targetos='bogus'
597fi
598
599# Some host OSes need non-standard checks for which CPU to use.
600# Note that these checks are broken for cross-compilation: if you're
601# cross-compiling to one of these OSes then you'll need to specify
602# the correct CPU with the --cpu option.
603case $targetos in
604Darwin)
605  HOST_DSOSUF=".dylib"
606  ;;
607SunOS)
608  # $(uname -m) returns i86pc even on an x86_64 box, so default based on isainfo
609  if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then
610    cpu="x86_64"
611  fi
612esac
613
614if test ! -z "$cpu" ; then
615  # command line argument
616  :
617elif check_define __i386__ ; then
618  cpu="i386"
619elif check_define __x86_64__ ; then
620  if check_define __ILP32__ ; then
621    cpu="x32"
622  else
623    cpu="x86_64"
624  fi
625elif check_define __sparc__ ; then
626  if check_define __arch64__ ; then
627    cpu="sparc64"
628  else
629    cpu="sparc"
630  fi
631elif check_define _ARCH_PPC ; then
632  if check_define _ARCH_PPC64 ; then
633    if check_define _LITTLE_ENDIAN ; then
634      cpu="ppc64le"
635    else
636      cpu="ppc64"
637    fi
638  else
639    cpu="ppc"
640  fi
641elif check_define __mips__ ; then
642  cpu="mips"
643elif check_define __s390__ ; then
644  if check_define __s390x__ ; then
645    cpu="s390x"
646  else
647    cpu="s390"
648  fi
649elif check_define __riscv ; then
650  if check_define _LP64 ; then
651    cpu="riscv64"
652  else
653    cpu="riscv32"
654  fi
655elif check_define __arm__ ; then
656  cpu="arm"
657elif check_define __aarch64__ ; then
658  cpu="aarch64"
659else
660  cpu=$(uname -m)
661fi
662
663ARCH=
664# Normalise host CPU name and set ARCH.
665# Note that this case should only have supported host CPUs, not guests.
666case "$cpu" in
667  ppc|ppc64|s390x|sparc64|x32|riscv32|riscv64)
668  ;;
669  ppc64le)
670    ARCH="ppc64"
671  ;;
672  i386|i486|i586|i686|i86pc|BePC)
673    cpu="i386"
674  ;;
675  x86_64|amd64)
676    cpu="x86_64"
677  ;;
678  armv*b|armv*l|arm)
679    cpu="arm"
680  ;;
681  aarch64)
682    cpu="aarch64"
683  ;;
684  mips*)
685    cpu="mips"
686  ;;
687  sparc|sun4[cdmuv])
688    cpu="sparc"
689  ;;
690  *)
691    # This will result in either an error or falling back to TCI later
692    ARCH=unknown
693  ;;
694esac
695if test -z "$ARCH"; then
696  ARCH="$cpu"
697fi
698
699# OS specific
700
701case $targetos in
702MINGW32*)
703  mingw32="yes"
704  audio_possible_drivers="dsound sdl"
705  if check_include dsound.h; then
706    audio_drv_list="dsound"
707  else
708    audio_drv_list=""
709  fi
710  supported_os="yes"
711  pie="no"
712;;
713GNU/kFreeBSD)
714  bsd="yes"
715  audio_drv_list="oss try-sdl"
716  audio_possible_drivers="oss sdl pa"
717;;
718FreeBSD)
719  bsd="yes"
720  make="${MAKE-gmake}"
721  audio_drv_list="oss try-sdl"
722  audio_possible_drivers="oss sdl pa"
723  # needed for kinfo_getvmmap(3) in libutil.h
724  netmap=""  # enable netmap autodetect
725;;
726DragonFly)
727  bsd="yes"
728  make="${MAKE-gmake}"
729  audio_drv_list="oss try-sdl"
730  audio_possible_drivers="oss sdl pa"
731;;
732NetBSD)
733  bsd="yes"
734  make="${MAKE-gmake}"
735  audio_drv_list="oss try-sdl"
736  audio_possible_drivers="oss sdl"
737  oss_lib="-lossaudio"
738;;
739OpenBSD)
740  bsd="yes"
741  make="${MAKE-gmake}"
742  audio_drv_list="try-sdl"
743  audio_possible_drivers="sdl"
744;;
745Darwin)
746  bsd="yes"
747  darwin="yes"
748  audio_drv_list="try-coreaudio try-sdl"
749  audio_possible_drivers="coreaudio sdl"
750  # Disable attempts to use ObjectiveC features in os/object.h since they
751  # won't work when we're compiling with gcc as a C compiler.
752  QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS"
753;;
754SunOS)
755  solaris="yes"
756  make="${MAKE-gmake}"
757  smbd="${SMBD-/usr/sfw/sbin/smbd}"
758  if test -f /usr/include/sys/soundcard.h ; then
759    audio_drv_list="oss try-sdl"
760  fi
761  audio_possible_drivers="oss sdl"
762# needed for CMSG_ macros in sys/socket.h
763  QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS"
764# needed for TIOCWIN* defines in termios.h
765  QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
766;;
767Haiku)
768  haiku="yes"
769  QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS -D_BSD_SOURCE $QEMU_CFLAGS"
770;;
771Linux)
772  audio_drv_list="try-pa oss"
773  audio_possible_drivers="oss alsa sdl pa"
774  linux="yes"
775  linux_user="yes"
776  vhost_user=${default_feature:-yes}
777;;
778esac
779
780if [ "$bsd" = "yes" ] ; then
781  if [ "$darwin" != "yes" ] ; then
782    bsd_user="yes"
783  fi
784fi
785
786: ${make=${MAKE-make}}
787
788# We prefer python 3.x. A bare 'python' is traditionally
789# python 2.x, but some distros have it as python 3.x, so
790# we check that too
791python=
792explicit_python=no
793for binary in "${PYTHON-python3}" python
794do
795    if has "$binary"
796    then
797        python=$(command -v "$binary")
798        break
799    fi
800done
801
802
803# Check for ancillary tools used in testing
804genisoimage=
805for binary in genisoimage mkisofs
806do
807    if has $binary
808    then
809        genisoimage=$(command -v "$binary")
810        break
811    fi
812done
813
814# Default objcc to clang if available, otherwise use CC
815if has clang; then
816  objcc=clang
817else
818  objcc="$cc"
819fi
820
821if test "$mingw32" = "yes" ; then
822  EXESUF=".exe"
823  HOST_DSOSUF=".dll"
824  # MinGW needs -mthreads for TLS and macro _MT.
825  CONFIGURE_CFLAGS="-mthreads $CONFIGURE_CFLAGS"
826  write_c_skeleton;
827  prefix="/qemu"
828  qemu_suffix=""
829  libs_qga="-lws2_32 -lwinmm -lpowrprof -lwtsapi32 -lwininet -liphlpapi -lnetapi32 $libs_qga"
830fi
831
832werror=""
833
834for opt do
835  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
836  case "$opt" in
837  --help|-h) show_help=yes
838  ;;
839  --version|-V) exec cat $source_path/VERSION
840  ;;
841  --prefix=*) prefix="$optarg"
842  ;;
843  --interp-prefix=*) interp_prefix="$optarg"
844  ;;
845  --cross-prefix=*)
846  ;;
847  --cc=*)
848  ;;
849  --host-cc=*) host_cc="$optarg"
850  ;;
851  --cxx=*)
852  ;;
853  --iasl=*) iasl="$optarg"
854  ;;
855  --objcc=*) objcc="$optarg"
856  ;;
857  --make=*) make="$optarg"
858  ;;
859  --install=*)
860  ;;
861  --python=*) python="$optarg" ; explicit_python=yes
862  ;;
863  --sphinx-build=*) sphinx_build="$optarg"
864  ;;
865  --skip-meson) skip_meson=yes
866  ;;
867  --meson=*) meson="$optarg"
868  ;;
869  --ninja=*) ninja="$optarg"
870  ;;
871  --smbd=*) smbd="$optarg"
872  ;;
873  --extra-cflags=*)
874  ;;
875  --extra-cxxflags=*)
876  ;;
877  --extra-ldflags=*)
878  ;;
879  --enable-debug-info)
880  ;;
881  --disable-debug-info)
882  ;;
883  --cross-cc-*)
884  ;;
885  --enable-modules)
886      modules="yes"
887  ;;
888  --disable-modules)
889      modules="no"
890  ;;
891  --disable-module-upgrades) module_upgrades="no"
892  ;;
893  --enable-module-upgrades) module_upgrades="yes"
894  ;;
895  --cpu=*)
896  ;;
897  --target-list=*) target_list="$optarg"
898                   if test "$target_list_exclude"; then
899                       error_exit "Can't mix --target-list with --target-list-exclude"
900                   fi
901  ;;
902  --target-list-exclude=*) target_list_exclude="$optarg"
903                   if test "$target_list"; then
904                       error_exit "Can't mix --target-list-exclude with --target-list"
905                   fi
906  ;;
907  --enable-trace-backends=*) trace_backends="$optarg"
908  ;;
909  # XXX: backwards compatibility
910  --enable-trace-backend=*) trace_backends="$optarg"
911  ;;
912  --with-trace-file=*) trace_file="$optarg"
913  ;;
914  --with-default-devices) default_devices="true"
915  ;;
916  --without-default-devices) default_devices="false"
917  ;;
918  --without-default-features) # processed above
919  ;;
920  --enable-gprof) gprof="yes"
921  ;;
922  --enable-gcov) gcov="yes"
923  ;;
924  --static)
925    static="yes"
926    QEMU_PKG_CONFIG_FLAGS="--static $QEMU_PKG_CONFIG_FLAGS"
927  ;;
928  --mandir=*) mandir="$optarg"
929  ;;
930  --bindir=*) bindir="$optarg"
931  ;;
932  --libdir=*) libdir="$optarg"
933  ;;
934  --libexecdir=*) libexecdir="$optarg"
935  ;;
936  --includedir=*) includedir="$optarg"
937  ;;
938  --datadir=*) datadir="$optarg"
939  ;;
940  --with-suffix=*) qemu_suffix="$optarg"
941  ;;
942  --docdir=*) docdir="$optarg"
943  ;;
944  --localedir=*) localedir="$optarg"
945  ;;
946  --sysconfdir=*) sysconfdir="$optarg"
947  ;;
948  --localstatedir=*) local_statedir="$optarg"
949  ;;
950  --firmwarepath=*) firmwarepath="$optarg"
951  ;;
952  --host=*|--build=*|\
953  --disable-dependency-tracking|\
954  --sbindir=*|--sharedstatedir=*|\
955  --oldincludedir=*|--datarootdir=*|--infodir=*|\
956  --htmldir=*|--dvidir=*|--pdfdir=*|--psdir=*)
957    # These switches are silently ignored, for compatibility with
958    # autoconf-generated configure scripts. This allows QEMU's
959    # configure to be used by RPM and similar macros that set
960    # lots of directory switches by default.
961  ;;
962  --disable-sdl) sdl="disabled"
963  ;;
964  --enable-sdl) sdl="enabled"
965  ;;
966  --disable-sdl-image) sdl_image="disabled"
967  ;;
968  --enable-sdl-image) sdl_image="enabled"
969  ;;
970  --disable-qom-cast-debug) qom_cast_debug="no"
971  ;;
972  --enable-qom-cast-debug) qom_cast_debug="yes"
973  ;;
974  --disable-virtfs) virtfs="disabled"
975  ;;
976  --enable-virtfs) virtfs="enabled"
977  ;;
978  --disable-libudev) libudev="disabled"
979  ;;
980  --enable-libudev) libudev="enabled"
981  ;;
982  --disable-virtiofsd) virtiofsd="disabled"
983  ;;
984  --enable-virtiofsd) virtiofsd="enabled"
985  ;;
986  --disable-mpath) mpath="disabled"
987  ;;
988  --enable-mpath) mpath="enabled"
989  ;;
990  --disable-vnc) vnc="disabled"
991  ;;
992  --enable-vnc) vnc="enabled"
993  ;;
994  --disable-gettext) gettext="disabled"
995  ;;
996  --enable-gettext) gettext="enabled"
997  ;;
998  --oss-lib=*) oss_lib="$optarg"
999  ;;
1000  --audio-drv-list=*) audio_drv_list="$optarg"
1001  ;;
1002  --block-drv-rw-whitelist=*|--block-drv-whitelist=*) block_drv_rw_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
1003  ;;
1004  --block-drv-ro-whitelist=*) block_drv_ro_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
1005  ;;
1006  --enable-debug-tcg) debug_tcg="yes"
1007  ;;
1008  --disable-debug-tcg) debug_tcg="no"
1009  ;;
1010  --enable-debug)
1011      # Enable debugging options that aren't excessively noisy
1012      debug_tcg="yes"
1013      debug_mutex="yes"
1014      debug="yes"
1015      strip_opt="no"
1016      fortify_source="no"
1017  ;;
1018  --enable-sanitizers) sanitizers="yes"
1019  ;;
1020  --disable-sanitizers) sanitizers="no"
1021  ;;
1022  --enable-tsan) tsan="yes"
1023  ;;
1024  --disable-tsan) tsan="no"
1025  ;;
1026  --enable-sparse) sparse="enabled"
1027  ;;
1028  --disable-sparse) sparse="disabled"
1029  ;;
1030  --disable-strip) strip_opt="no"
1031  ;;
1032  --disable-vnc-sasl) vnc_sasl="disabled"
1033  ;;
1034  --enable-vnc-sasl) vnc_sasl="enabled"
1035  ;;
1036  --disable-vnc-jpeg) vnc_jpeg="disabled"
1037  ;;
1038  --enable-vnc-jpeg) vnc_jpeg="enabled"
1039  ;;
1040  --disable-vnc-png) vnc_png="disabled"
1041  ;;
1042  --enable-vnc-png) vnc_png="enabled"
1043  ;;
1044  --disable-slirp) slirp="disabled"
1045  ;;
1046  --enable-slirp) slirp="enabled"
1047  ;;
1048  --enable-slirp=git) slirp="internal"
1049  ;;
1050  --enable-slirp=system) slirp="system"
1051  ;;
1052  --disable-vde) vde="no"
1053  ;;
1054  --enable-vde) vde="yes"
1055  ;;
1056  --disable-netmap) netmap="no"
1057  ;;
1058  --enable-netmap) netmap="yes"
1059  ;;
1060  --disable-xen) xen="disabled"
1061  ;;
1062  --enable-xen) xen="enabled"
1063  ;;
1064  --disable-xen-pci-passthrough) xen_pci_passthrough="disabled"
1065  ;;
1066  --enable-xen-pci-passthrough) xen_pci_passthrough="enabled"
1067  ;;
1068  --disable-brlapi) brlapi="disabled"
1069  ;;
1070  --enable-brlapi) brlapi="enabled"
1071  ;;
1072  --disable-kvm) kvm="disabled"
1073  ;;
1074  --enable-kvm) kvm="enabled"
1075  ;;
1076  --disable-hax) hax="disabled"
1077  ;;
1078  --enable-hax) hax="enabled"
1079  ;;
1080  --disable-hvf) hvf="disabled"
1081  ;;
1082  --enable-hvf) hvf="enabled"
1083  ;;
1084  --disable-nvmm) nvmm="disabled"
1085  ;;
1086  --enable-nvmm) nvmm="enabled"
1087  ;;
1088  --disable-whpx) whpx="disabled"
1089  ;;
1090  --enable-whpx) whpx="enabled"
1091  ;;
1092  --disable-tcg-interpreter) tcg_interpreter="false"
1093  ;;
1094  --enable-tcg-interpreter) tcg_interpreter="true"
1095  ;;
1096  --disable-cap-ng)  cap_ng="disabled"
1097  ;;
1098  --enable-cap-ng) cap_ng="enabled"
1099  ;;
1100  --disable-tcg) tcg="disabled"
1101  ;;
1102  --enable-tcg) tcg="enabled"
1103  ;;
1104  --disable-malloc-trim) malloc_trim="disabled"
1105  ;;
1106  --enable-malloc-trim) malloc_trim="enabled"
1107  ;;
1108  --disable-spice) spice="no"
1109  ;;
1110  --enable-spice)
1111      spice_protocol="yes"
1112      spice="yes"
1113  ;;
1114  --disable-spice-protocol)
1115      spice_protocol="no"
1116      spice="no"
1117  ;;
1118  --enable-spice-protocol) spice_protocol="yes"
1119  ;;
1120  --disable-libiscsi) libiscsi="disabled"
1121  ;;
1122  --enable-libiscsi) libiscsi="enabled"
1123  ;;
1124  --disable-libnfs) libnfs="disabled"
1125  ;;
1126  --enable-libnfs) libnfs="enabled"
1127  ;;
1128  --enable-profiler) profiler="yes"
1129  ;;
1130  --disable-cocoa) cocoa="disabled"
1131  ;;
1132  --enable-cocoa) cocoa="enabled"
1133  ;;
1134  --disable-system) softmmu="no"
1135  ;;
1136  --enable-system) softmmu="yes"
1137  ;;
1138  --disable-user)
1139      linux_user="no" ;
1140      bsd_user="no" ;
1141  ;;
1142  --enable-user) ;;
1143  --disable-linux-user) linux_user="no"
1144  ;;
1145  --enable-linux-user) linux_user="yes"
1146  ;;
1147  --disable-bsd-user) bsd_user="no"
1148  ;;
1149  --enable-bsd-user) bsd_user="yes"
1150  ;;
1151  --enable-pie) pie="yes"
1152  ;;
1153  --disable-pie) pie="no"
1154  ;;
1155  --enable-werror) werror="yes"
1156  ;;
1157  --disable-werror) werror="no"
1158  ;;
1159  --enable-lto) lto="true"
1160  ;;
1161  --disable-lto) lto="false"
1162  ;;
1163  --enable-stack-protector) stack_protector="yes"
1164  ;;
1165  --disable-stack-protector) stack_protector="no"
1166  ;;
1167  --enable-safe-stack) safe_stack="yes"
1168  ;;
1169  --disable-safe-stack) safe_stack="no"
1170  ;;
1171  --enable-cfi)
1172      cfi="true";
1173      lto="true";
1174  ;;
1175  --disable-cfi) cfi="false"
1176  ;;
1177  --enable-cfi-debug) cfi_debug="true"
1178  ;;
1179  --disable-cfi-debug) cfi_debug="false"
1180  ;;
1181  --disable-curses) curses="disabled"
1182  ;;
1183  --enable-curses) curses="enabled"
1184  ;;
1185  --disable-iconv) iconv="disabled"
1186  ;;
1187  --enable-iconv) iconv="enabled"
1188  ;;
1189  --disable-curl) curl="disabled"
1190  ;;
1191  --enable-curl) curl="enabled"
1192  ;;
1193  --disable-fdt) fdt="disabled"
1194  ;;
1195  --enable-fdt) fdt="enabled"
1196  ;;
1197  --enable-fdt=git) fdt="internal"
1198  ;;
1199  --enable-fdt=system) fdt="system"
1200  ;;
1201  --disable-linux-aio) linux_aio="no"
1202  ;;
1203  --enable-linux-aio) linux_aio="yes"
1204  ;;
1205  --disable-linux-io-uring) linux_io_uring="disabled"
1206  ;;
1207  --enable-linux-io-uring) linux_io_uring="enabled"
1208  ;;
1209  --disable-attr) attr="disabled"
1210  ;;
1211  --enable-attr) attr="enabled"
1212  ;;
1213  --disable-membarrier) membarrier="no"
1214  ;;
1215  --enable-membarrier) membarrier="yes"
1216  ;;
1217  --disable-bpf) bpf="disabled"
1218  ;;
1219  --enable-bpf) bpf="enabled"
1220  ;;
1221  --disable-blobs) blobs="false"
1222  ;;
1223  --with-pkgversion=*) pkgversion="$optarg"
1224  ;;
1225  --with-coroutine=*) coroutine="$optarg"
1226  ;;
1227  --disable-coroutine-pool) coroutine_pool="no"
1228  ;;
1229  --enable-coroutine-pool) coroutine_pool="yes"
1230  ;;
1231  --enable-debug-stack-usage) debug_stack_usage="yes"
1232  ;;
1233  --enable-crypto-afalg) crypto_afalg="yes"
1234  ;;
1235  --disable-crypto-afalg) crypto_afalg="no"
1236  ;;
1237  --disable-docs) docs="disabled"
1238  ;;
1239  --enable-docs) docs="enabled"
1240  ;;
1241  --disable-vhost-net) vhost_net="no"
1242  ;;
1243  --enable-vhost-net) vhost_net="yes"
1244  ;;
1245  --disable-vhost-crypto) vhost_crypto="no"
1246  ;;
1247  --enable-vhost-crypto) vhost_crypto="yes"
1248  ;;
1249  --disable-vhost-scsi) vhost_scsi="no"
1250  ;;
1251  --enable-vhost-scsi) vhost_scsi="yes"
1252  ;;
1253  --disable-vhost-vsock) vhost_vsock="no"
1254  ;;
1255  --enable-vhost-vsock) vhost_vsock="yes"
1256  ;;
1257  --disable-vhost-user-blk-server) vhost_user_blk_server="disabled"
1258  ;;
1259  --enable-vhost-user-blk-server) vhost_user_blk_server="enabled"
1260  ;;
1261  --disable-vhost-user-fs) vhost_user_fs="no"
1262  ;;
1263  --enable-vhost-user-fs) vhost_user_fs="yes"
1264  ;;
1265  --disable-opengl) opengl="no"
1266  ;;
1267  --enable-opengl) opengl="yes"
1268  ;;
1269  --disable-rbd) rbd="disabled"
1270  ;;
1271  --enable-rbd) rbd="enabled"
1272  ;;
1273  --disable-xfsctl) xfs="no"
1274  ;;
1275  --enable-xfsctl) xfs="yes"
1276  ;;
1277  --disable-smartcard) smartcard="disabled"
1278  ;;
1279  --enable-smartcard) smartcard="enabled"
1280  ;;
1281  --disable-u2f) u2f="disabled"
1282  ;;
1283  --enable-u2f) u2f="enabled"
1284  ;;
1285  --disable-libusb) libusb="disabled"
1286  ;;
1287  --enable-libusb) libusb="enabled"
1288  ;;
1289  --disable-usb-redir) usb_redir="disabled"
1290  ;;
1291  --enable-usb-redir) usb_redir="enabled"
1292  ;;
1293  --disable-zlib-test)
1294  ;;
1295  --disable-lzo) lzo="disabled"
1296  ;;
1297  --enable-lzo) lzo="enabled"
1298  ;;
1299  --disable-snappy) snappy="disabled"
1300  ;;
1301  --enable-snappy) snappy="enabled"
1302  ;;
1303  --disable-bzip2) bzip2="disabled"
1304  ;;
1305  --enable-bzip2) bzip2="enabled"
1306  ;;
1307  --enable-lzfse) lzfse="enabled"
1308  ;;
1309  --disable-lzfse) lzfse="disabled"
1310  ;;
1311  --disable-zstd) zstd="disabled"
1312  ;;
1313  --enable-zstd) zstd="enabled"
1314  ;;
1315  --enable-guest-agent) guest_agent="yes"
1316  ;;
1317  --disable-guest-agent) guest_agent="no"
1318  ;;
1319  --enable-guest-agent-msi) guest_agent_msi="enabled"
1320  ;;
1321  --disable-guest-agent-msi) guest_agent_msi="disabled"
1322  ;;
1323  --with-vss-sdk) vss_win32_sdk=""
1324  ;;
1325  --with-vss-sdk=*) vss_win32_sdk="$optarg"
1326  ;;
1327  --without-vss-sdk) vss_win32_sdk="no"
1328  ;;
1329  --with-win-sdk) win_sdk=""
1330  ;;
1331  --with-win-sdk=*) win_sdk="$optarg"
1332  ;;
1333  --without-win-sdk) win_sdk="no"
1334  ;;
1335  --enable-tools) want_tools="yes"
1336  ;;
1337  --disable-tools) want_tools="no"
1338  ;;
1339  --enable-seccomp) seccomp="enabled"
1340  ;;
1341  --disable-seccomp) seccomp="disabled"
1342  ;;
1343  --disable-glusterfs) glusterfs="disabled"
1344  ;;
1345  --disable-avx2) avx2_opt="no"
1346  ;;
1347  --enable-avx2) avx2_opt="yes"
1348  ;;
1349  --disable-avx512f) avx512f_opt="no"
1350  ;;
1351  --enable-avx512f) avx512f_opt="yes"
1352  ;;
1353
1354  --enable-glusterfs) glusterfs="enabled"
1355  ;;
1356  --disable-virtio-blk-data-plane|--enable-virtio-blk-data-plane)
1357      echo "$0: $opt is obsolete, virtio-blk data-plane is always on" >&2
1358  ;;
1359  --enable-vhdx|--disable-vhdx)
1360      echo "$0: $opt is obsolete, VHDX driver is always built" >&2
1361  ;;
1362  --enable-uuid|--disable-uuid)
1363      echo "$0: $opt is obsolete, UUID support is always built" >&2
1364  ;;
1365  --disable-gtk) gtk="disabled"
1366  ;;
1367  --enable-gtk) gtk="enabled"
1368  ;;
1369  --tls-priority=*) tls_priority="$optarg"
1370  ;;
1371  --disable-gnutls) gnutls="disabled"
1372  ;;
1373  --enable-gnutls) gnutls="enabled"
1374  ;;
1375  --disable-nettle) nettle="disabled"
1376  ;;
1377  --enable-nettle) nettle="enabled"
1378  ;;
1379  --disable-gcrypt) gcrypt="disabled"
1380  ;;
1381  --enable-gcrypt) gcrypt="enabled"
1382  ;;
1383  --disable-auth-pam) auth_pam="disabled"
1384  ;;
1385  --enable-auth-pam) auth_pam="enabled"
1386  ;;
1387  --enable-rdma) rdma="yes"
1388  ;;
1389  --disable-rdma) rdma="no"
1390  ;;
1391  --enable-pvrdma) pvrdma="yes"
1392  ;;
1393  --disable-pvrdma) pvrdma="no"
1394  ;;
1395  --disable-vte) vte="disabled"
1396  ;;
1397  --enable-vte) vte="enabled"
1398  ;;
1399  --disable-virglrenderer) virglrenderer="disabled"
1400  ;;
1401  --enable-virglrenderer) virglrenderer="enabled"
1402  ;;
1403  --disable-tpm) tpm="no"
1404  ;;
1405  --enable-tpm) tpm="yes"
1406  ;;
1407  --disable-libssh) libssh="no"
1408  ;;
1409  --enable-libssh) libssh="yes"
1410  ;;
1411  --disable-live-block-migration) live_block_migration="no"
1412  ;;
1413  --enable-live-block-migration) live_block_migration="yes"
1414  ;;
1415  --disable-numa) numa="no"
1416  ;;
1417  --enable-numa) numa="yes"
1418  ;;
1419  --disable-libxml2) libxml2="disabled"
1420  ;;
1421  --enable-libxml2) libxml2="enabled"
1422  ;;
1423  --disable-tcmalloc) tcmalloc="no"
1424  ;;
1425  --enable-tcmalloc) tcmalloc="yes"
1426  ;;
1427  --disable-jemalloc) jemalloc="no"
1428  ;;
1429  --enable-jemalloc) jemalloc="yes"
1430  ;;
1431  --disable-replication) replication="no"
1432  ;;
1433  --enable-replication) replication="yes"
1434  ;;
1435  --disable-bochs) bochs="no"
1436  ;;
1437  --enable-bochs) bochs="yes"
1438  ;;
1439  --disable-cloop) cloop="no"
1440  ;;
1441  --enable-cloop) cloop="yes"
1442  ;;
1443  --disable-dmg) dmg="no"
1444  ;;
1445  --enable-dmg) dmg="yes"
1446  ;;
1447  --disable-qcow1) qcow1="no"
1448  ;;
1449  --enable-qcow1) qcow1="yes"
1450  ;;
1451  --disable-vdi) vdi="no"
1452  ;;
1453  --enable-vdi) vdi="yes"
1454  ;;
1455  --disable-vvfat) vvfat="no"
1456  ;;
1457  --enable-vvfat) vvfat="yes"
1458  ;;
1459  --disable-qed) qed="no"
1460  ;;
1461  --enable-qed) qed="yes"
1462  ;;
1463  --disable-parallels) parallels="no"
1464  ;;
1465  --enable-parallels) parallels="yes"
1466  ;;
1467  --disable-vhost-user) vhost_user="no"
1468  ;;
1469  --enable-vhost-user) vhost_user="yes"
1470  ;;
1471  --disable-vhost-vdpa) vhost_vdpa="no"
1472  ;;
1473  --enable-vhost-vdpa) vhost_vdpa="yes"
1474  ;;
1475  --disable-vhost-kernel) vhost_kernel="no"
1476  ;;
1477  --enable-vhost-kernel) vhost_kernel="yes"
1478  ;;
1479  --disable-capstone) capstone="disabled"
1480  ;;
1481  --enable-capstone) capstone="enabled"
1482  ;;
1483  --enable-capstone=git) capstone="internal"
1484  ;;
1485  --enable-capstone=system) capstone="system"
1486  ;;
1487  --with-git=*) git="$optarg"
1488  ;;
1489  --enable-git-update)
1490      git_submodules_action="update"
1491      echo "--enable-git-update deprecated, use --with-git-submodules=update"
1492  ;;
1493  --disable-git-update)
1494      git_submodules_action="validate"
1495      echo "--disable-git-update deprecated, use --with-git-submodules=validate"
1496  ;;
1497  --with-git-submodules=*)
1498      git_submodules_action="$optarg"
1499  ;;
1500  --enable-debug-mutex) debug_mutex=yes
1501  ;;
1502  --disable-debug-mutex) debug_mutex=no
1503  ;;
1504  --enable-libpmem) libpmem=disabled
1505  ;;
1506  --disable-libpmem) libpmem=enabled
1507  ;;
1508  --enable-xkbcommon) xkbcommon="enabled"
1509  ;;
1510  --disable-xkbcommon) xkbcommon="disabled"
1511  ;;
1512  --enable-plugins) plugins="yes"
1513  ;;
1514  --disable-plugins) plugins="no"
1515  ;;
1516  --enable-containers) use_containers="yes"
1517  ;;
1518  --disable-containers) use_containers="no"
1519  ;;
1520  --enable-fuzzing) fuzzing=yes
1521  ;;
1522  --disable-fuzzing) fuzzing=no
1523  ;;
1524  --gdb=*) gdb_bin="$optarg"
1525  ;;
1526  --enable-rng-none) rng_none=yes
1527  ;;
1528  --disable-rng-none) rng_none=no
1529  ;;
1530  --enable-keyring) secret_keyring="yes"
1531  ;;
1532  --disable-keyring) secret_keyring="no"
1533  ;;
1534  --enable-libdaxctl) libdaxctl=disabled
1535  ;;
1536  --disable-libdaxctl) libdaxctl=enabled
1537  ;;
1538  --enable-fuse) fuse="enabled"
1539  ;;
1540  --disable-fuse) fuse="disabled"
1541  ;;
1542  --enable-fuse-lseek) fuse_lseek="enabled"
1543  ;;
1544  --disable-fuse-lseek) fuse_lseek="disabled"
1545  ;;
1546  --enable-multiprocess) multiprocess="enabled"
1547  ;;
1548  --disable-multiprocess) multiprocess="disabled"
1549  ;;
1550  --enable-gio) gio=yes
1551  ;;
1552  --disable-gio) gio=no
1553  ;;
1554  --enable-slirp-smbd) slirp_smbd=yes
1555  ;;
1556  --disable-slirp-smbd) slirp_smbd=no
1557  ;;
1558  *)
1559      echo "ERROR: unknown option $opt"
1560      echo "Try '$0 --help' for more information"
1561      exit 1
1562  ;;
1563  esac
1564done
1565
1566case $git_submodules_action in
1567    update|validate)
1568        if test ! -e "$source_path/.git"; then
1569            echo "ERROR: cannot $git_submodules_action git submodules without .git"
1570            exit 1
1571        fi
1572    ;;
1573    ignore)
1574        if ! test -f "$source_path/ui/keycodemapdb/README"
1575        then
1576            echo
1577            echo "ERROR: missing GIT submodules"
1578            echo
1579            if test -e "$source_path/.git"; then
1580                echo "--with-git-submodules=ignore specified but submodules were not"
1581                echo "checked out.  Please initialize and update submodules."
1582            else
1583                echo "This is not a GIT checkout but module content appears to"
1584                echo "be missing. Do not use 'git archive' or GitHub download links"
1585                echo "to acquire QEMU source archives. Non-GIT builds are only"
1586                echo "supported with source archives linked from:"
1587                echo
1588                echo "  https://www.qemu.org/download/#source"
1589                echo
1590                echo "Developers working with GIT can use scripts/archive-source.sh"
1591                echo "if they need to create valid source archives."
1592            fi
1593            echo
1594            exit 1
1595        fi
1596    ;;
1597    *)
1598        echo "ERROR: invalid --with-git-submodules= value '$git_submodules_action'"
1599        exit 1
1600    ;;
1601esac
1602
1603libdir="${libdir:-$prefix/lib}"
1604libexecdir="${libexecdir:-$prefix/libexec}"
1605includedir="${includedir:-$prefix/include}"
1606
1607if test "$mingw32" = "yes" ; then
1608    bindir="${bindir:-$prefix}"
1609else
1610    bindir="${bindir:-$prefix/bin}"
1611fi
1612mandir="${mandir:-$prefix/share/man}"
1613datadir="${datadir:-$prefix/share}"
1614docdir="${docdir:-$prefix/share/doc}"
1615sysconfdir="${sysconfdir:-$prefix/etc}"
1616local_statedir="${local_statedir:-$prefix/var}"
1617firmwarepath="${firmwarepath:-$datadir/qemu-firmware}"
1618localedir="${localedir:-$datadir/locale}"
1619
1620case "$cpu" in
1621    ppc)
1622           CPU_CFLAGS="-m32"
1623           QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS"
1624           ;;
1625    ppc64)
1626           CPU_CFLAGS="-m64"
1627           QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1628           ;;
1629    sparc)
1630           CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc"
1631           QEMU_LDFLAGS="-m32 -mv8plus $QEMU_LDFLAGS"
1632           ;;
1633    sparc64)
1634           CPU_CFLAGS="-m64 -mcpu=ultrasparc"
1635           QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1636           ;;
1637    s390)
1638           CPU_CFLAGS="-m31"
1639           QEMU_LDFLAGS="-m31 $QEMU_LDFLAGS"
1640           ;;
1641    s390x)
1642           CPU_CFLAGS="-m64"
1643           QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1644           ;;
1645    i386)
1646           CPU_CFLAGS="-m32"
1647           QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS"
1648           ;;
1649    x86_64)
1650           # ??? Only extremely old AMD cpus do not have cmpxchg16b.
1651           # If we truly care, we should simply detect this case at
1652           # runtime and generate the fallback to serial emulation.
1653           CPU_CFLAGS="-m64 -mcx16"
1654           QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1655           ;;
1656    x32)
1657           CPU_CFLAGS="-mx32"
1658           QEMU_LDFLAGS="-mx32 $QEMU_LDFLAGS"
1659           ;;
1660    # No special flags required for other host CPUs
1661esac
1662
1663eval "cross_cc_${cpu}=\$cc"
1664cross_cc_vars="$cross_cc_vars cross_cc_${cpu}"
1665QEMU_CFLAGS="$CPU_CFLAGS $QEMU_CFLAGS"
1666
1667# For user-mode emulation the host arch has to be one we explicitly
1668# support, even if we're using TCI.
1669if [ "$ARCH" = "unknown" ]; then
1670  bsd_user="no"
1671  linux_user="no"
1672fi
1673
1674default_target_list=""
1675deprecated_targets_list=ppc64abi32-linux-user
1676deprecated_features=""
1677mak_wilds=""
1678
1679if [ "$softmmu" = "yes" ]; then
1680    mak_wilds="${mak_wilds} $source_path/default-configs/targets/*-softmmu.mak"
1681fi
1682if [ "$linux_user" = "yes" ]; then
1683    mak_wilds="${mak_wilds} $source_path/default-configs/targets/*-linux-user.mak"
1684fi
1685if [ "$bsd_user" = "yes" ]; then
1686    mak_wilds="${mak_wilds} $source_path/default-configs/targets/*-bsd-user.mak"
1687fi
1688
1689# If the user doesn't explicitly specify a deprecated target we will
1690# skip it.
1691if test -z "$target_list"; then
1692    if test -z "$target_list_exclude"; then
1693        target_list_exclude="$deprecated_targets_list"
1694    else
1695        target_list_exclude="$target_list_exclude,$deprecated_targets_list"
1696    fi
1697fi
1698
1699for config in $mak_wilds; do
1700    target="$(basename "$config" .mak)"
1701    if echo "$target_list_exclude" | grep -vq "$target"; then
1702        default_target_list="${default_target_list} $target"
1703    fi
1704done
1705
1706# Enumerate public trace backends for --help output
1707trace_backend_list=$(echo $(grep -le '^PUBLIC = True$' "$source_path"/scripts/tracetool/backend/*.py | sed -e 's/^.*\/\(.*\)\.py$/\1/'))
1708
1709if test x"$show_help" = x"yes" ; then
1710cat << EOF
1711
1712Usage: configure [options]
1713Options: [defaults in brackets after descriptions]
1714
1715Standard options:
1716  --help                   print this message
1717  --prefix=PREFIX          install in PREFIX [$prefix]
1718  --interp-prefix=PREFIX   where to find shared libraries, etc.
1719                           use %M for cpu name [$interp_prefix]
1720  --target-list=LIST       set target list (default: build all non-deprecated)
1721$(echo Available targets: $default_target_list | \
1722  fold -s -w 53 | sed -e 's/^/                           /')
1723$(echo Deprecated targets: $deprecated_targets_list | \
1724  fold -s -w 53 | sed -e 's/^/                           /')
1725  --target-list-exclude=LIST exclude a set of targets from the default target-list
1726
1727Advanced options (experts only):
1728  --cross-prefix=PREFIX    use PREFIX for compile tools, PREFIX can be blank [$cross_prefix]
1729  --cc=CC                  use C compiler CC [$cc]
1730  --iasl=IASL              use ACPI compiler IASL [$iasl]
1731  --host-cc=CC             use C compiler CC [$host_cc] for code run at
1732                           build time
1733  --cxx=CXX                use C++ compiler CXX [$cxx]
1734  --objcc=OBJCC            use Objective-C compiler OBJCC [$objcc]
1735  --extra-cflags=CFLAGS    append extra C compiler flags QEMU_CFLAGS
1736  --extra-cxxflags=CXXFLAGS append extra C++ compiler flags QEMU_CXXFLAGS
1737  --extra-ldflags=LDFLAGS  append extra linker flags LDFLAGS
1738  --cross-cc-ARCH=CC       use compiler when building ARCH guest test cases
1739  --cross-cc-flags-ARCH=   use compiler flags when building ARCH guest tests
1740  --make=MAKE              use specified make [$make]
1741  --python=PYTHON          use specified python [$python]
1742  --sphinx-build=SPHINX    use specified sphinx-build [$sphinx_build]
1743  --meson=MESON            use specified meson [$meson]
1744  --ninja=NINJA            use specified ninja [$ninja]
1745  --smbd=SMBD              use specified smbd [$smbd]
1746  --with-git=GIT           use specified git [$git]
1747  --with-git-submodules=update   update git submodules (default if .git dir exists)
1748  --with-git-submodules=validate fail if git submodules are not up to date
1749  --with-git-submodules=ignore   do not update or check git submodules (default if no .git dir)
1750  --static                 enable static build [$static]
1751  --mandir=PATH            install man pages in PATH
1752  --datadir=PATH           install firmware in PATH/$qemu_suffix
1753  --localedir=PATH         install translation in PATH/$qemu_suffix
1754  --docdir=PATH            install documentation in PATH/$qemu_suffix
1755  --bindir=PATH            install binaries in PATH
1756  --libdir=PATH            install libraries in PATH
1757  --libexecdir=PATH        install helper binaries in PATH
1758  --sysconfdir=PATH        install config in PATH/$qemu_suffix
1759  --localstatedir=PATH     install local state in PATH (set at runtime on win32)
1760  --firmwarepath=PATH      search PATH for firmware files
1761  --efi-aarch64=PATH       PATH of efi file to use for aarch64 VMs.
1762  --with-suffix=SUFFIX     suffix for QEMU data inside datadir/libdir/sysconfdir/docdir [$qemu_suffix]
1763  --with-pkgversion=VERS   use specified string as sub-version of the package
1764  --without-default-features default all --enable-* options to "disabled"
1765  --without-default-devices  do not include any device that is not needed to
1766                           start the emulator (only use if you are including
1767                           desired devices in default-configs/devices/)
1768  --enable-debug           enable common debug build options
1769  --enable-sanitizers      enable default sanitizers
1770  --enable-tsan            enable thread sanitizer
1771  --disable-strip          disable stripping binaries
1772  --disable-werror         disable compilation abort on warning
1773  --disable-stack-protector disable compiler-provided stack protection
1774  --audio-drv-list=LIST    set audio drivers list:
1775                           Available drivers: $audio_possible_drivers
1776  --block-drv-whitelist=L  Same as --block-drv-rw-whitelist=L
1777  --block-drv-rw-whitelist=L
1778                           set block driver read-write whitelist
1779                           (affects only QEMU, not qemu-img)
1780  --block-drv-ro-whitelist=L
1781                           set block driver read-only whitelist
1782                           (affects only QEMU, not qemu-img)
1783  --enable-trace-backends=B Set trace backend
1784                           Available backends: $trace_backend_list
1785  --with-trace-file=NAME   Full PATH,NAME of file to store traces
1786                           Default:trace-<pid>
1787  --disable-slirp          disable SLIRP userspace network connectivity
1788  --enable-tcg-interpreter enable TCI (TCG with bytecode interpreter, experimental and slow)
1789  --enable-malloc-trim     enable libc malloc_trim() for memory optimization
1790  --oss-lib                path to OSS library
1791  --cpu=CPU                Build for host CPU [$cpu]
1792  --with-coroutine=BACKEND coroutine backend. Supported options:
1793                           ucontext, sigaltstack, windows
1794  --enable-gcov            enable test coverage analysis with gcov
1795  --disable-blobs          disable installing provided firmware blobs
1796  --with-vss-sdk=SDK-path  enable Windows VSS support in QEMU Guest Agent
1797  --with-win-sdk=SDK-path  path to Windows Platform SDK (to build VSS .tlb)
1798  --tls-priority           default TLS protocol/cipher priority string
1799  --enable-gprof           QEMU profiling with gprof
1800  --enable-profiler        profiler support
1801  --enable-debug-stack-usage
1802                           track the maximum stack usage of stacks created by qemu_alloc_stack
1803  --enable-plugins
1804                           enable plugins via shared library loading
1805  --disable-containers     don't use containers for cross-building
1806  --gdb=GDB-path           gdb to use for gdbstub tests [$gdb_bin]
1807
1808Optional features, enabled with --enable-FEATURE and
1809disabled with --disable-FEATURE, default is enabled if available
1810(unless built with --without-default-features):
1811
1812  system          all system emulation targets
1813  user            supported user emulation targets
1814  linux-user      all linux usermode emulation targets
1815  bsd-user        all BSD usermode emulation targets
1816  docs            build documentation
1817  guest-agent     build the QEMU Guest Agent
1818  guest-agent-msi build guest agent Windows MSI installation package
1819  pie             Position Independent Executables
1820  modules         modules support (non-Windows)
1821  module-upgrades try to load modules from alternate paths for upgrades
1822  debug-tcg       TCG debugging (default is disabled)
1823  debug-info      debugging information
1824  lto             Enable Link-Time Optimization.
1825  sparse          sparse checker
1826  safe-stack      SafeStack Stack Smash Protection. Depends on
1827                  clang/llvm >= 3.7 and requires coroutine backend ucontext.
1828  cfi             Enable Control-Flow Integrity for indirect function calls.
1829                  In case of a cfi violation, QEMU is terminated with SIGILL
1830                  Depends on lto and is incompatible with modules
1831                  Automatically enables Link-Time Optimization (lto)
1832  cfi-debug       In case of a cfi violation, a message containing the line that
1833                  triggered the error is written to stderr. After the error,
1834                  QEMU is still terminated with SIGILL
1835  gnutls          GNUTLS cryptography support
1836  nettle          nettle cryptography support
1837  gcrypt          libgcrypt cryptography support
1838  auth-pam        PAM access control
1839  sdl             SDL UI
1840  sdl-image       SDL Image support for icons
1841  gtk             gtk UI
1842  vte             vte support for the gtk UI
1843  curses          curses UI
1844  iconv           font glyph conversion support
1845  vnc             VNC UI support
1846  vnc-sasl        SASL encryption for VNC server
1847  vnc-jpeg        JPEG lossy compression for VNC server
1848  vnc-png         PNG compression for VNC server
1849  cocoa           Cocoa UI (Mac OS X only)
1850  virtfs          VirtFS
1851  virtiofsd       build virtiofs daemon (virtiofsd)
1852  libudev         Use libudev to enumerate host devices
1853  mpath           Multipath persistent reservation passthrough
1854  xen             xen backend driver support
1855  xen-pci-passthrough    PCI passthrough support for Xen
1856  brlapi          BrlAPI (Braile)
1857  curl            curl connectivity
1858  membarrier      membarrier system call (for Linux 4.14+ or Windows)
1859  fdt             fdt device tree
1860  kvm             KVM acceleration support
1861  hax             HAX acceleration support
1862  hvf             Hypervisor.framework acceleration support
1863  nvmm            NVMM acceleration support
1864  whpx            Windows Hypervisor Platform acceleration support
1865  rdma            Enable RDMA-based migration
1866  pvrdma          Enable PVRDMA support
1867  vde             support for vde network
1868  netmap          support for netmap network
1869  linux-aio       Linux AIO support
1870  linux-io-uring  Linux io_uring support
1871  cap-ng          libcap-ng support
1872  attr            attr and xattr support
1873  vhost-net       vhost-net kernel acceleration support
1874  vhost-vsock     virtio sockets device support
1875  vhost-scsi      vhost-scsi kernel target support
1876  vhost-crypto    vhost-user-crypto backend support
1877  vhost-kernel    vhost kernel backend support
1878  vhost-user      vhost-user backend support
1879  vhost-user-blk-server    vhost-user-blk server support
1880  vhost-vdpa      vhost-vdpa kernel backend support
1881  bpf             BPF kernel support
1882  spice           spice
1883  spice-protocol  spice-protocol
1884  rbd             rados block device (rbd)
1885  libiscsi        iscsi support
1886  libnfs          nfs support
1887  smartcard       smartcard support (libcacard)
1888  u2f             U2F support (u2f-emu)
1889  libusb          libusb (for usb passthrough)
1890  live-block-migration   Block migration in the main migration stream
1891  usb-redir       usb network redirection support
1892  lzo             support of lzo compression library
1893  snappy          support of snappy compression library
1894  bzip2           support of bzip2 compression library
1895                  (for reading bzip2-compressed dmg images)
1896  lzfse           support of lzfse compression library
1897                  (for reading lzfse-compressed dmg images)
1898  zstd            support for zstd compression library
1899                  (for migration compression and qcow2 cluster compression)
1900  seccomp         seccomp support
1901  coroutine-pool  coroutine freelist (better performance)
1902  glusterfs       GlusterFS backend
1903  tpm             TPM support
1904  libssh          ssh block device support
1905  numa            libnuma support
1906  libxml2         for Parallels image format
1907  tcmalloc        tcmalloc support
1908  jemalloc        jemalloc support
1909  avx2            AVX2 optimization support
1910  avx512f         AVX512F optimization support
1911  replication     replication support
1912  opengl          opengl support
1913  virglrenderer   virgl rendering support
1914  xfsctl          xfsctl support
1915  qom-cast-debug  cast debugging support
1916  tools           build qemu-io, qemu-nbd and qemu-img tools
1917  bochs           bochs image format support
1918  cloop           cloop image format support
1919  dmg             dmg image format support
1920  qcow1           qcow v1 image format support
1921  vdi             vdi image format support
1922  vvfat           vvfat image format support
1923  qed             qed image format support
1924  parallels       parallels image format support
1925  crypto-afalg    Linux AF_ALG crypto backend driver
1926  capstone        capstone disassembler support
1927  debug-mutex     mutex debugging support
1928  libpmem         libpmem support
1929  xkbcommon       xkbcommon support
1930  rng-none        dummy RNG, avoid using /dev/(u)random and getrandom()
1931  libdaxctl       libdaxctl support
1932  fuse            FUSE block device export
1933  fuse-lseek      SEEK_HOLE/SEEK_DATA support for FUSE exports
1934  multiprocess    Out of process device emulation support
1935  gio             libgio support
1936  slirp-smbd      use smbd (at path --smbd=*) in slirp networking
1937
1938NOTE: The object files are built at the place where configure is launched
1939EOF
1940exit 0
1941fi
1942
1943# Remove old dependency files to make sure that they get properly regenerated
1944rm -f */config-devices.mak.d
1945
1946if test -z "$python"
1947then
1948    error_exit "Python not found. Use --python=/path/to/python"
1949fi
1950if ! has "$make"
1951then
1952    error_exit "GNU make ($make) not found"
1953fi
1954
1955# Note that if the Python conditional here evaluates True we will exit
1956# with status 1 which is a shell 'false' value.
1957if ! $python -c 'import sys; sys.exit(sys.version_info < (3,6))'; then
1958  error_exit "Cannot use '$python', Python >= 3.6 is required." \
1959      "Use --python=/path/to/python to specify a supported Python."
1960fi
1961
1962# Preserve python version since some functionality is dependent on it
1963python_version=$($python -c 'import sys; print("%d.%d.%d" % (sys.version_info[0], sys.version_info[1], sys.version_info[2]))' 2>/dev/null)
1964
1965# Suppress writing compiled files
1966python="$python -B"
1967
1968if test -z "$meson"; then
1969    if test "$explicit_python" = no && has meson && version_ge "$(meson --version)" 0.55.3; then
1970        meson=meson
1971    elif test $git_submodules_action != 'ignore' ; then
1972        meson=git
1973    elif test -e "${source_path}/meson/meson.py" ; then
1974        meson=internal
1975    else
1976        if test "$explicit_python" = yes; then
1977            error_exit "--python requires using QEMU's embedded Meson distribution, but it was not found."
1978        else
1979            error_exit "Meson not found.  Use --meson=/path/to/meson"
1980        fi
1981    fi
1982else
1983    # Meson uses its own Python interpreter to invoke other Python scripts,
1984    # but the user wants to use the one they specified with --python.
1985    #
1986    # We do not want to override the distro Python interpreter (and sometimes
1987    # cannot: for example in Homebrew /usr/bin/meson is a bash script), so
1988    # just require --meson=git|internal together with --python.
1989    if test "$explicit_python" = yes; then
1990        case "$meson" in
1991            git | internal) ;;
1992            *) error_exit "--python requires using QEMU's embedded Meson distribution." ;;
1993        esac
1994    fi
1995fi
1996
1997if test "$meson" = git; then
1998    git_submodules="${git_submodules} meson"
1999fi
2000
2001case "$meson" in
2002    git | internal)
2003        meson="$python ${source_path}/meson/meson.py"
2004        ;;
2005    *) meson=$(command -v "$meson") ;;
2006esac
2007
2008# Probe for ninja
2009
2010if test -z "$ninja"; then
2011    for c in ninja ninja-build samu; do
2012        if has $c; then
2013            ninja=$(command -v "$c")
2014            break
2015        fi
2016    done
2017    if test -z "$ninja"; then
2018      error_exit "Cannot find Ninja"
2019    fi
2020fi
2021
2022# Check that the C compiler works. Doing this here before testing
2023# the host CPU ensures that we had a valid CC to autodetect the
2024# $cpu var (and we should bail right here if that's not the case).
2025# It also allows the help message to be printed without a CC.
2026write_c_skeleton;
2027if compile_object ; then
2028  : C compiler works ok
2029else
2030    error_exit "\"$cc\" either does not exist or does not work"
2031fi
2032if ! compile_prog ; then
2033    error_exit "\"$cc\" cannot build an executable (is your linker broken?)"
2034fi
2035
2036# Consult white-list to determine whether to enable werror
2037# by default.  Only enable by default for git builds
2038if test -z "$werror" ; then
2039    if test "$git_submodules_action" != "ignore" && \
2040        { test "$linux" = "yes" || test "$mingw32" = "yes"; }; then
2041        werror="yes"
2042    else
2043        werror="no"
2044    fi
2045fi
2046
2047if test "$targetos" = "bogus"; then
2048    # Now that we know that we're not printing the help and that
2049    # the compiler works (so the results of the check_defines we used
2050    # to identify the OS are reliable), if we didn't recognize the
2051    # host OS we should stop now.
2052    error_exit "Unrecognized host OS (uname -s reports '$(uname -s)')"
2053fi
2054
2055# Check whether the compiler matches our minimum requirements:
2056cat > $TMPC << EOF
2057#if defined(__clang_major__) && defined(__clang_minor__)
2058# ifdef __apple_build_version__
2059#  if __clang_major__ < 10 || (__clang_major__ == 10 && __clang_minor__ < 0)
2060#   error You need at least XCode Clang v10.0 to compile QEMU
2061#  endif
2062# else
2063#  if __clang_major__ < 6 || (__clang_major__ == 6 && __clang_minor__ < 0)
2064#   error You need at least Clang v6.0 to compile QEMU
2065#  endif
2066# endif
2067#elif defined(__GNUC__) && defined(__GNUC_MINOR__)
2068# if __GNUC__ < 7 || (__GNUC__ == 7 && __GNUC_MINOR__ < 5)
2069#  error You need at least GCC v7.5.0 to compile QEMU
2070# endif
2071#else
2072# error You either need GCC or Clang to compiler QEMU
2073#endif
2074int main (void) { return 0; }
2075EOF
2076if ! compile_prog "" "" ; then
2077    error_exit "You need at least GCC v7.5 or Clang v6.0 (or XCode Clang v10.0)"
2078fi
2079
2080# Accumulate -Wfoo and -Wno-bar separately.
2081# We will list all of the enable flags first, and the disable flags second.
2082# Note that we do not add -Werror, because that would enable it for all
2083# configure tests. If a configure test failed due to -Werror this would
2084# just silently disable some features, so it's too error prone.
2085
2086warn_flags=
2087add_to warn_flags -Wold-style-declaration
2088add_to warn_flags -Wold-style-definition
2089add_to warn_flags -Wtype-limits
2090add_to warn_flags -Wformat-security
2091add_to warn_flags -Wformat-y2k
2092add_to warn_flags -Winit-self
2093add_to warn_flags -Wignored-qualifiers
2094add_to warn_flags -Wempty-body
2095add_to warn_flags -Wnested-externs
2096add_to warn_flags -Wendif-labels
2097add_to warn_flags -Wexpansion-to-defined
2098add_to warn_flags -Wimplicit-fallthrough=2
2099
2100nowarn_flags=
2101add_to nowarn_flags -Wno-initializer-overrides
2102add_to nowarn_flags -Wno-missing-include-dirs
2103add_to nowarn_flags -Wno-shift-negative-value
2104add_to nowarn_flags -Wno-string-plus-int
2105add_to nowarn_flags -Wno-typedef-redefinition
2106add_to nowarn_flags -Wno-tautological-type-limit-compare
2107add_to nowarn_flags -Wno-psabi
2108
2109gcc_flags="$warn_flags $nowarn_flags"
2110
2111cc_has_warning_flag() {
2112    write_c_skeleton;
2113
2114    # Use the positive sense of the flag when testing for -Wno-wombat
2115    # support (gcc will happily accept the -Wno- form of unknown
2116    # warning options).
2117    optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
2118    compile_prog "-Werror $optflag" ""
2119}
2120
2121for flag in $gcc_flags; do
2122    if cc_has_warning_flag $flag ; then
2123        QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2124    fi
2125done
2126
2127if test "$stack_protector" != "no"; then
2128  cat > $TMPC << EOF
2129int main(int argc, char *argv[])
2130{
2131    char arr[64], *p = arr, *c = argv[0];
2132    while (*c) {
2133        *p++ = *c++;
2134    }
2135    return 0;
2136}
2137EOF
2138  gcc_flags="-fstack-protector-strong -fstack-protector-all"
2139  sp_on=0
2140  for flag in $gcc_flags; do
2141    # We need to check both a compile and a link, since some compiler
2142    # setups fail only on a .c->.o compile and some only at link time
2143    if compile_object "-Werror $flag" &&
2144       compile_prog "-Werror $flag" ""; then
2145      QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2146      QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
2147      sp_on=1
2148      break
2149    fi
2150  done
2151  if test "$stack_protector" = yes; then
2152    if test $sp_on = 0; then
2153      error_exit "Stack protector not supported"
2154    fi
2155  fi
2156fi
2157
2158# Disable -Wmissing-braces on older compilers that warn even for
2159# the "universal" C zero initializer {0}.
2160cat > $TMPC << EOF
2161struct {
2162  int a[2];
2163} x = {0};
2164EOF
2165if compile_object "-Werror" "" ; then
2166  :
2167else
2168  QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces"
2169fi
2170
2171# Our module code doesn't support Windows
2172if test "$modules" = "yes" && test "$mingw32" = "yes" ; then
2173  error_exit "Modules are not available for Windows"
2174fi
2175
2176# module_upgrades is only reasonable if modules are enabled
2177if test "$modules" = "no" && test "$module_upgrades" = "yes" ; then
2178  error_exit "Can't enable module-upgrades as Modules are not enabled"
2179fi
2180
2181# Static linking is not possible with modules or PIE
2182if test "$static" = "yes" ; then
2183  if test "$modules" = "yes" ; then
2184    error_exit "static and modules are mutually incompatible"
2185  fi
2186fi
2187
2188# Unconditional check for compiler __thread support
2189  cat > $TMPC << EOF
2190static __thread int tls_var;
2191int main(void) { return tls_var; }
2192EOF
2193
2194if ! compile_prog "-Werror" "" ; then
2195    error_exit "Your compiler does not support the __thread specifier for " \
2196	"Thread-Local Storage (TLS). Please upgrade to a version that does."
2197fi
2198
2199cat > $TMPC << EOF
2200
2201#ifdef __linux__
2202#  define THREAD __thread
2203#else
2204#  define THREAD
2205#endif
2206static THREAD int tls_var;
2207int main(void) { return tls_var; }
2208EOF
2209
2210# Check we support --no-pie first; we will need this for building ROMs.
2211if compile_prog "-Werror -fno-pie" "-no-pie"; then
2212  CFLAGS_NOPIE="-fno-pie"
2213fi
2214
2215if test "$static" = "yes"; then
2216  if test "$pie" != "no" && compile_prog "-Werror -fPIE -DPIE" "-static-pie"; then
2217    CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
2218    QEMU_LDFLAGS="-static-pie $QEMU_LDFLAGS"
2219    pie="yes"
2220  elif test "$pie" = "yes"; then
2221    error_exit "-static-pie not available due to missing toolchain support"
2222  else
2223    QEMU_LDFLAGS="-static $QEMU_LDFLAGS"
2224    pie="no"
2225  fi
2226elif test "$pie" = "no"; then
2227  CONFIGURE_CFLAGS="$CFLAGS_NOPIE $CONFIGURE_CFLAGS"
2228elif compile_prog "-Werror -fPIE -DPIE" "-pie"; then
2229  CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
2230  CONFIGURE_LDFLAGS="-pie $CONFIGURE_LDFLAGS"
2231  pie="yes"
2232elif test "$pie" = "yes"; then
2233  error_exit "PIE not available due to missing toolchain support"
2234else
2235  echo "Disabling PIE due to missing toolchain support"
2236  pie="no"
2237fi
2238
2239# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
2240# The combination is known as "full relro", because .got.plt is read-only too.
2241if compile_prog "" "-Wl,-z,relro -Wl,-z,now" ; then
2242  QEMU_LDFLAGS="-Wl,-z,relro -Wl,-z,now $QEMU_LDFLAGS"
2243fi
2244
2245##########################################
2246# __sync_fetch_and_and requires at least -march=i486. Many toolchains
2247# use i686 as default anyway, but for those that don't, an explicit
2248# specification is necessary
2249
2250if test "$cpu" = "i386"; then
2251  cat > $TMPC << EOF
2252static int sfaa(int *ptr)
2253{
2254  return __sync_fetch_and_and(ptr, 0);
2255}
2256
2257int main(void)
2258{
2259  int val = 42;
2260  val = __sync_val_compare_and_swap(&val, 0, 1);
2261  sfaa(&val);
2262  return val;
2263}
2264EOF
2265  if ! compile_prog "" "" ; then
2266    QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS"
2267  fi
2268fi
2269
2270#########################################
2271# Solaris specific configure tool chain decisions
2272
2273if test "$solaris" = "yes" ; then
2274  if has ar; then
2275    :
2276  else
2277    if test -f /usr/ccs/bin/ar ; then
2278      error_exit "No path includes ar" \
2279          "Add /usr/ccs/bin to your path and rerun configure"
2280    fi
2281    error_exit "No path includes ar"
2282  fi
2283fi
2284
2285if test "$tcg" = "enabled"; then
2286    git_submodules="$git_submodules tests/fp/berkeley-testfloat-3"
2287    git_submodules="$git_submodules tests/fp/berkeley-softfloat-3"
2288fi
2289
2290if test -z "${target_list+xxx}" ; then
2291    default_targets=yes
2292    for target in $default_target_list; do
2293        target_list="$target_list $target"
2294    done
2295    target_list="${target_list# }"
2296else
2297    default_targets=no
2298    target_list=$(echo "$target_list" | sed -e 's/,/ /g')
2299    for target in $target_list; do
2300        # Check that we recognised the target name; this allows a more
2301        # friendly error message than if we let it fall through.
2302        case " $default_target_list " in
2303            *" $target "*)
2304                ;;
2305            *)
2306                error_exit "Unknown target name '$target'"
2307                ;;
2308        esac
2309    done
2310fi
2311
2312for target in $target_list; do
2313    # if a deprecated target is enabled we note it here
2314    if echo "$deprecated_targets_list" | grep -q "$target"; then
2315        add_to deprecated_features $target
2316    fi
2317done
2318
2319# see if system emulation was really requested
2320case " $target_list " in
2321  *"-softmmu "*) softmmu=yes
2322  ;;
2323  *) softmmu=no
2324  ;;
2325esac
2326
2327feature_not_found() {
2328  feature=$1
2329  remedy=$2
2330
2331  error_exit "User requested feature $feature" \
2332      "configure was not able to find it." \
2333      "$remedy"
2334}
2335
2336# ---
2337# big/little endian test
2338cat > $TMPC << EOF
2339short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, };
2340short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, };
2341extern int foo(short *, short *);
2342int main(int argc, char *argv[]) {
2343    return foo(big_endian, little_endian);
2344}
2345EOF
2346
2347if compile_object ; then
2348    if strings -a $TMPO | grep -q BiGeNdIaN ; then
2349        bigendian="yes"
2350    elif strings -a $TMPO | grep -q LiTtLeEnDiAn ; then
2351        bigendian="no"
2352    else
2353        echo big/little test failed
2354    fi
2355else
2356    echo big/little test failed
2357fi
2358
2359##########################################
2360# system tools
2361if test -z "$want_tools"; then
2362    if test "$softmmu" = "no"; then
2363        want_tools=no
2364    else
2365        want_tools=yes
2366    fi
2367fi
2368
2369##########################################
2370# Disable features only meaningful for system-mode emulation
2371if test "$softmmu" = "no"; then
2372    audio_drv_list=""
2373fi
2374
2375##########################################
2376# L2TPV3 probe
2377
2378cat > $TMPC <<EOF
2379#include <sys/socket.h>
2380#include <linux/ip.h>
2381int main(void) { return sizeof(struct mmsghdr); }
2382EOF
2383if compile_prog "" "" ; then
2384  l2tpv3=yes
2385else
2386  l2tpv3=no
2387fi
2388
2389cat > $TMPC <<EOF
2390#include <sys/mman.h>
2391int main(int argc, char *argv[]) {
2392    return mlockall(MCL_FUTURE);
2393}
2394EOF
2395if compile_prog "" "" ; then
2396  have_mlockall=yes
2397else
2398  have_mlockall=no
2399fi
2400
2401#########################################
2402# vhost interdependencies and host support
2403
2404# vhost backends
2405if test "$vhost_user" = "yes" && test "$linux" != "yes"; then
2406  error_exit "vhost-user is only available on Linux"
2407fi
2408test "$vhost_vdpa" = "" && vhost_vdpa=$linux
2409if test "$vhost_vdpa" = "yes" && test "$linux" != "yes"; then
2410  error_exit "vhost-vdpa is only available on Linux"
2411fi
2412test "$vhost_kernel" = "" && vhost_kernel=$linux
2413if test "$vhost_kernel" = "yes" && test "$linux" != "yes"; then
2414  error_exit "vhost-kernel is only available on Linux"
2415fi
2416
2417# vhost-kernel devices
2418test "$vhost_scsi" = "" && vhost_scsi=$vhost_kernel
2419if test "$vhost_scsi" = "yes" && test "$vhost_kernel" != "yes"; then
2420  error_exit "--enable-vhost-scsi requires --enable-vhost-kernel"
2421fi
2422test "$vhost_vsock" = "" && vhost_vsock=$vhost_kernel
2423if test "$vhost_vsock" = "yes" && test "$vhost_kernel" != "yes"; then
2424  error_exit "--enable-vhost-vsock requires --enable-vhost-kernel"
2425fi
2426
2427# vhost-user backends
2428test "$vhost_net_user" = "" && vhost_net_user=$vhost_user
2429if test "$vhost_net_user" = "yes" && test "$vhost_user" = "no"; then
2430  error_exit "--enable-vhost-net-user requires --enable-vhost-user"
2431fi
2432test "$vhost_crypto" = "" && vhost_crypto=$vhost_user
2433if test "$vhost_crypto" = "yes" && test "$vhost_user" = "no"; then
2434  error_exit "--enable-vhost-crypto requires --enable-vhost-user"
2435fi
2436test "$vhost_user_fs" = "" && vhost_user_fs=$vhost_user
2437if test "$vhost_user_fs" = "yes" && test "$vhost_user" = "no"; then
2438  error_exit "--enable-vhost-user-fs requires --enable-vhost-user"
2439fi
2440#vhost-vdpa backends
2441test "$vhost_net_vdpa" = "" && vhost_net_vdpa=$vhost_vdpa
2442if test "$vhost_net_vdpa" = "yes" && test "$vhost_vdpa" = "no"; then
2443  error_exit "--enable-vhost-net-vdpa requires --enable-vhost-vdpa"
2444fi
2445
2446# OR the vhost-kernel, vhost-vdpa and vhost-user values for simplicity
2447if test "$vhost_net" = ""; then
2448  test "$vhost_net_user" = "yes" && vhost_net=yes
2449  test "$vhost_net_vdpa" = "yes" && vhost_net=yes
2450  test "$vhost_kernel" = "yes" && vhost_net=yes
2451fi
2452
2453##########################################
2454# pkg-config probe
2455
2456if ! has "$pkg_config_exe"; then
2457  error_exit "pkg-config binary '$pkg_config_exe' not found"
2458fi
2459
2460##########################################
2461# NPTL probe
2462
2463if test "$linux_user" = "yes"; then
2464  cat > $TMPC <<EOF
2465#include <sched.h>
2466#include <linux/futex.h>
2467int main(void) {
2468#if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
2469#error bork
2470#endif
2471  return 0;
2472}
2473EOF
2474  if ! compile_object ; then
2475    feature_not_found "nptl" "Install glibc and linux kernel headers."
2476  fi
2477fi
2478
2479##########################################
2480# xen probe
2481
2482if test "$xen" != "disabled" ; then
2483  # Check whether Xen library path is specified via --extra-ldflags to avoid
2484  # overriding this setting with pkg-config output. If not, try pkg-config
2485  # to obtain all needed flags.
2486
2487  if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
2488     $pkg_config --exists xencontrol ; then
2489    xen_ctrl_version="$(printf '%d%02d%02d' \
2490      $($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
2491    xen=enabled
2492    xen_pc="xencontrol xenstore xenforeignmemory xengnttab"
2493    xen_pc="$xen_pc xenevtchn xendevicemodel"
2494    if $pkg_config --exists xentoolcore; then
2495      xen_pc="$xen_pc xentoolcore"
2496    fi
2497    xen_cflags="$($pkg_config --cflags $xen_pc)"
2498    xen_libs="$($pkg_config --libs $xen_pc)"
2499  else
2500
2501    xen_libs="-lxenstore -lxenctrl"
2502    xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
2503
2504    # First we test whether Xen headers and libraries are available.
2505    # If no, we are done and there is no Xen support.
2506    # If yes, more tests are run to detect the Xen version.
2507
2508    # Xen (any)
2509    cat > $TMPC <<EOF
2510#include <xenctrl.h>
2511int main(void) {
2512  return 0;
2513}
2514EOF
2515    if ! compile_prog "" "$xen_libs" ; then
2516      # Xen not found
2517      if test "$xen" = "enabled" ; then
2518        feature_not_found "xen" "Install xen devel"
2519      fi
2520      xen=disabled
2521
2522    # Xen unstable
2523    elif
2524        cat > $TMPC <<EOF &&
2525#undef XC_WANT_COMPAT_DEVICEMODEL_API
2526#define __XEN_TOOLS__
2527#include <xendevicemodel.h>
2528#include <xenforeignmemory.h>
2529int main(void) {
2530  xendevicemodel_handle *xd;
2531  xenforeignmemory_handle *xfmem;
2532
2533  xd = xendevicemodel_open(0, 0);
2534  xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
2535
2536  xfmem = xenforeignmemory_open(0, 0);
2537  xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
2538
2539  return 0;
2540}
2541EOF
2542        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2543      then
2544      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2545      xen_ctrl_version=41100
2546      xen=enabled
2547    elif
2548        cat > $TMPC <<EOF &&
2549#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2550#include <xenforeignmemory.h>
2551#include <xentoolcore.h>
2552int main(void) {
2553  xenforeignmemory_handle *xfmem;
2554
2555  xfmem = xenforeignmemory_open(0, 0);
2556  xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
2557  xentoolcore_restrict_all(0);
2558
2559  return 0;
2560}
2561EOF
2562        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2563      then
2564      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2565      xen_ctrl_version=41000
2566      xen=enabled
2567    elif
2568        cat > $TMPC <<EOF &&
2569#undef XC_WANT_COMPAT_DEVICEMODEL_API
2570#define __XEN_TOOLS__
2571#include <xendevicemodel.h>
2572int main(void) {
2573  xendevicemodel_handle *xd;
2574
2575  xd = xendevicemodel_open(0, 0);
2576  xendevicemodel_close(xd);
2577
2578  return 0;
2579}
2580EOF
2581        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
2582      then
2583      xen_stable_libs="-lxendevicemodel $xen_stable_libs"
2584      xen_ctrl_version=40900
2585      xen=enabled
2586    elif
2587        cat > $TMPC <<EOF &&
2588/*
2589 * If we have stable libs the we don't want the libxc compat
2590 * layers, regardless of what CFLAGS we may have been given.
2591 *
2592 * Also, check if xengnttab_grant_copy_segment_t is defined and
2593 * grant copy operation is implemented.
2594 */
2595#undef XC_WANT_COMPAT_EVTCHN_API
2596#undef XC_WANT_COMPAT_GNTTAB_API
2597#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2598#include <xenctrl.h>
2599#include <xenstore.h>
2600#include <xenevtchn.h>
2601#include <xengnttab.h>
2602#include <xenforeignmemory.h>
2603#include <stdint.h>
2604#include <xen/hvm/hvm_info_table.h>
2605#if !defined(HVM_MAX_VCPUS)
2606# error HVM_MAX_VCPUS not defined
2607#endif
2608int main(void) {
2609  xc_interface *xc = NULL;
2610  xenforeignmemory_handle *xfmem;
2611  xenevtchn_handle *xe;
2612  xengnttab_handle *xg;
2613  xengnttab_grant_copy_segment_t* seg = NULL;
2614
2615  xs_daemon_open();
2616
2617  xc = xc_interface_open(0, 0, 0);
2618  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2619  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2620  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2621  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2622
2623  xfmem = xenforeignmemory_open(0, 0);
2624  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2625
2626  xe = xenevtchn_open(0, 0);
2627  xenevtchn_fd(xe);
2628
2629  xg = xengnttab_open(0, 0);
2630  xengnttab_grant_copy(xg, 0, seg);
2631
2632  return 0;
2633}
2634EOF
2635        compile_prog "" "$xen_libs $xen_stable_libs"
2636      then
2637      xen_ctrl_version=40800
2638      xen=enabled
2639    elif
2640        cat > $TMPC <<EOF &&
2641/*
2642 * If we have stable libs the we don't want the libxc compat
2643 * layers, regardless of what CFLAGS we may have been given.
2644 */
2645#undef XC_WANT_COMPAT_EVTCHN_API
2646#undef XC_WANT_COMPAT_GNTTAB_API
2647#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2648#include <xenctrl.h>
2649#include <xenstore.h>
2650#include <xenevtchn.h>
2651#include <xengnttab.h>
2652#include <xenforeignmemory.h>
2653#include <stdint.h>
2654#include <xen/hvm/hvm_info_table.h>
2655#if !defined(HVM_MAX_VCPUS)
2656# error HVM_MAX_VCPUS not defined
2657#endif
2658int main(void) {
2659  xc_interface *xc = NULL;
2660  xenforeignmemory_handle *xfmem;
2661  xenevtchn_handle *xe;
2662  xengnttab_handle *xg;
2663
2664  xs_daemon_open();
2665
2666  xc = xc_interface_open(0, 0, 0);
2667  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2668  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2669  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2670  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2671
2672  xfmem = xenforeignmemory_open(0, 0);
2673  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2674
2675  xe = xenevtchn_open(0, 0);
2676  xenevtchn_fd(xe);
2677
2678  xg = xengnttab_open(0, 0);
2679  xengnttab_map_grant_ref(xg, 0, 0, 0);
2680
2681  return 0;
2682}
2683EOF
2684        compile_prog "" "$xen_libs $xen_stable_libs"
2685      then
2686      xen_ctrl_version=40701
2687      xen=enabled
2688
2689    # Xen 4.6
2690    elif
2691        cat > $TMPC <<EOF &&
2692#include <xenctrl.h>
2693#include <xenstore.h>
2694#include <stdint.h>
2695#include <xen/hvm/hvm_info_table.h>
2696#if !defined(HVM_MAX_VCPUS)
2697# error HVM_MAX_VCPUS not defined
2698#endif
2699int main(void) {
2700  xc_interface *xc;
2701  xs_daemon_open();
2702  xc = xc_interface_open(0, 0, 0);
2703  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2704  xc_gnttab_open(NULL, 0);
2705  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2706  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2707  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2708  xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
2709  return 0;
2710}
2711EOF
2712        compile_prog "" "$xen_libs"
2713      then
2714      xen_ctrl_version=40600
2715      xen=enabled
2716
2717    # Xen 4.5
2718    elif
2719        cat > $TMPC <<EOF &&
2720#include <xenctrl.h>
2721#include <xenstore.h>
2722#include <stdint.h>
2723#include <xen/hvm/hvm_info_table.h>
2724#if !defined(HVM_MAX_VCPUS)
2725# error HVM_MAX_VCPUS not defined
2726#endif
2727int main(void) {
2728  xc_interface *xc;
2729  xs_daemon_open();
2730  xc = xc_interface_open(0, 0, 0);
2731  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2732  xc_gnttab_open(NULL, 0);
2733  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2734  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2735  xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
2736  return 0;
2737}
2738EOF
2739        compile_prog "" "$xen_libs"
2740      then
2741      xen_ctrl_version=40500
2742      xen=enabled
2743
2744    elif
2745        cat > $TMPC <<EOF &&
2746#include <xenctrl.h>
2747#include <xenstore.h>
2748#include <stdint.h>
2749#include <xen/hvm/hvm_info_table.h>
2750#if !defined(HVM_MAX_VCPUS)
2751# error HVM_MAX_VCPUS not defined
2752#endif
2753int main(void) {
2754  xc_interface *xc;
2755  xs_daemon_open();
2756  xc = xc_interface_open(0, 0, 0);
2757  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2758  xc_gnttab_open(NULL, 0);
2759  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2760  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2761  return 0;
2762}
2763EOF
2764        compile_prog "" "$xen_libs"
2765      then
2766      xen_ctrl_version=40200
2767      xen=enabled
2768
2769    else
2770      if test "$xen" = "enabled" ; then
2771        feature_not_found "xen (unsupported version)" \
2772                          "Install a supported xen (xen 4.2 or newer)"
2773      fi
2774      xen=disabled
2775    fi
2776
2777    if test "$xen" = enabled; then
2778      if test $xen_ctrl_version -ge 40701  ; then
2779        xen_libs="$xen_libs $xen_stable_libs "
2780      fi
2781    fi
2782  fi
2783fi
2784
2785##########################################
2786# RDMA needs OpenFabrics libraries
2787if test "$rdma" != "no" ; then
2788  cat > $TMPC <<EOF
2789#include <rdma/rdma_cma.h>
2790int main(void) { return 0; }
2791EOF
2792  rdma_libs="-lrdmacm -libverbs -libumad"
2793  if compile_prog "" "$rdma_libs" ; then
2794    rdma="yes"
2795  else
2796    if test "$rdma" = "yes" ; then
2797        error_exit \
2798            " OpenFabrics librdmacm/libibverbs/libibumad not present." \
2799            " Your options:" \
2800            "  (1) Fast: Install infiniband packages (devel) from your distro." \
2801            "  (2) Cleanest: Install libraries from www.openfabrics.org" \
2802            "  (3) Also: Install softiwarp if you don't have RDMA hardware"
2803    fi
2804    rdma="no"
2805  fi
2806fi
2807
2808##########################################
2809# PVRDMA detection
2810
2811cat > $TMPC <<EOF &&
2812#include <sys/mman.h>
2813
2814int
2815main(void)
2816{
2817    char buf = 0;
2818    void *addr = &buf;
2819    addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
2820
2821    return 0;
2822}
2823EOF
2824
2825if test "$rdma" = "yes" ; then
2826    case "$pvrdma" in
2827    "")
2828        if compile_prog "" ""; then
2829            pvrdma="yes"
2830        else
2831            pvrdma="no"
2832        fi
2833        ;;
2834    "yes")
2835        if ! compile_prog "" ""; then
2836            error_exit "PVRDMA is not supported since mremap is not implemented"
2837        fi
2838        pvrdma="yes"
2839        ;;
2840    "no")
2841        pvrdma="no"
2842        ;;
2843    esac
2844else
2845    if test "$pvrdma" = "yes" ; then
2846        error_exit "PVRDMA requires rdma suppport"
2847    fi
2848    pvrdma="no"
2849fi
2850
2851# Let's see if enhanced reg_mr is supported
2852if test "$pvrdma" = "yes" ; then
2853
2854cat > $TMPC <<EOF &&
2855#include <infiniband/verbs.h>
2856
2857int
2858main(void)
2859{
2860    struct ibv_mr *mr;
2861    struct ibv_pd *pd = NULL;
2862    size_t length = 10;
2863    uint64_t iova = 0;
2864    int access = 0;
2865    void *addr = NULL;
2866
2867    mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
2868
2869    ibv_dereg_mr(mr);
2870
2871    return 0;
2872}
2873EOF
2874    if ! compile_prog "" "-libverbs"; then
2875        QEMU_CFLAGS="$QEMU_CFLAGS -DLEGACY_RDMA_REG_MR"
2876    fi
2877fi
2878
2879##########################################
2880# xfsctl() probe, used for file-posix.c
2881if test "$xfs" != "no" ; then
2882  cat > $TMPC << EOF
2883#include <stddef.h>  /* NULL */
2884#include <xfs/xfs.h>
2885int main(void)
2886{
2887    xfsctl(NULL, 0, 0, NULL);
2888    return 0;
2889}
2890EOF
2891  if compile_prog "" "" ; then
2892    xfs="yes"
2893  else
2894    if test "$xfs" = "yes" ; then
2895      feature_not_found "xfs" "Install xfsprogs/xfslibs devel"
2896    fi
2897    xfs=no
2898  fi
2899fi
2900
2901##########################################
2902# vde libraries probe
2903if test "$vde" != "no" ; then
2904  vde_libs="-lvdeplug"
2905  cat > $TMPC << EOF
2906#include <libvdeplug.h>
2907int main(void)
2908{
2909    struct vde_open_args a = {0, 0, 0};
2910    char s[] = "";
2911    vde_open(s, s, &a);
2912    return 0;
2913}
2914EOF
2915  if compile_prog "" "$vde_libs" ; then
2916    vde=yes
2917  else
2918    if test "$vde" = "yes" ; then
2919      feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
2920    fi
2921    vde=no
2922  fi
2923fi
2924
2925##########################################
2926# netmap support probe
2927# Apart from looking for netmap headers, we make sure that the host API version
2928# supports the netmap backend (>=11). The upper bound (15) is meant to simulate
2929# a minor/major version number. Minor new features will be marked with values up
2930# to 15, and if something happens that requires a change to the backend we will
2931# move above 15, submit the backend fixes and modify this two bounds.
2932if test "$netmap" != "no" ; then
2933  cat > $TMPC << EOF
2934#include <inttypes.h>
2935#include <net/if.h>
2936#include <net/netmap.h>
2937#include <net/netmap_user.h>
2938#if (NETMAP_API < 11) || (NETMAP_API > 15)
2939#error
2940#endif
2941int main(void) { return 0; }
2942EOF
2943  if compile_prog "" "" ; then
2944    netmap=yes
2945  else
2946    if test "$netmap" = "yes" ; then
2947      feature_not_found "netmap"
2948    fi
2949    netmap=no
2950  fi
2951fi
2952
2953##########################################
2954# detect CoreAudio
2955if test "$coreaudio" != "no" ; then
2956  coreaudio_libs="-framework CoreAudio"
2957  cat > $TMPC << EOF
2958#include <CoreAudio/CoreAudio.h>
2959int main(void)
2960{
2961  return (int)AudioGetCurrentHostTime();
2962}
2963EOF
2964  if compile_prog "" "$coreaudio_libs" ; then
2965    coreaudio=yes
2966  else
2967    coreaudio=no
2968  fi
2969fi
2970
2971##########################################
2972# Sound support libraries probe
2973
2974audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
2975for drv in $audio_drv_list; do
2976    case $drv in
2977    alsa | try-alsa)
2978    if $pkg_config alsa --exists; then
2979        alsa_libs=$($pkg_config alsa --libs)
2980        alsa_cflags=$($pkg_config alsa --cflags)
2981        alsa=yes
2982        if test "$drv" = "try-alsa"; then
2983            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa/alsa/')
2984        fi
2985    else
2986        if test "$drv" = "try-alsa"; then
2987            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa//')
2988        else
2989            error_exit "$drv check failed" \
2990                "Make sure to have the $drv libs and headers installed."
2991        fi
2992    fi
2993    ;;
2994
2995    pa | try-pa)
2996    if $pkg_config libpulse --exists; then
2997        libpulse=yes
2998        pulse_libs=$($pkg_config libpulse --libs)
2999        pulse_cflags=$($pkg_config libpulse --cflags)
3000        if test "$drv" = "try-pa"; then
3001            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa/pa/')
3002        fi
3003    else
3004        if test "$drv" = "try-pa"; then
3005            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa//')
3006        else
3007            error_exit "$drv check failed" \
3008                "Make sure to have the $drv libs and headers installed."
3009        fi
3010    fi
3011    ;;
3012
3013    sdl)
3014    if test "$sdl" = "no"; then
3015        error_exit "sdl not found or disabled, can not use sdl audio driver"
3016    fi
3017    ;;
3018
3019    try-sdl)
3020    if test "$sdl" = "no"; then
3021        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl//')
3022    else
3023        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl/sdl/')
3024    fi
3025    ;;
3026
3027    coreaudio | try-coreaudio)
3028    if test "$coreaudio" = "no"; then
3029      if test "$drv" = "try-coreaudio"; then
3030        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-coreaudio//')
3031      else
3032        error_exit "$drv check failed" \
3033                "Make sure to have the $drv is available."
3034      fi
3035    else
3036      coreaudio_libs="-framework CoreAudio"
3037      if test "$drv" = "try-coreaudio"; then
3038        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-coreaudio/coreaudio/')
3039      fi
3040    fi
3041    ;;
3042
3043    dsound)
3044      dsound_libs="-lole32 -ldxguid"
3045      audio_win_int="yes"
3046    ;;
3047
3048    oss)
3049      oss_libs="$oss_lib"
3050    ;;
3051
3052    jack | try-jack)
3053    if $pkg_config jack --exists; then
3054        libjack=yes
3055        jack_libs=$($pkg_config jack --libs)
3056        if test "$drv" = "try-jack"; then
3057            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack/jack/')
3058        fi
3059    else
3060        if test "$drv" = "try-jack"; then
3061            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack//')
3062        else
3063            error_exit "$drv check failed" \
3064                "Make sure to have the $drv libs and headers installed."
3065        fi
3066    fi
3067    ;;
3068
3069    *)
3070    echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
3071        error_exit "Unknown driver '$drv' selected" \
3072            "Possible drivers are: $audio_possible_drivers"
3073    }
3074    ;;
3075    esac
3076done
3077
3078##########################################
3079# glib support probe
3080
3081glib_req_ver=2.56
3082glib_modules=gthread-2.0
3083if test "$modules" = yes; then
3084    glib_modules="$glib_modules gmodule-export-2.0"
3085fi
3086if test "$plugins" = yes; then
3087    glib_modules="$glib_modules gmodule-2.0"
3088fi
3089
3090for i in $glib_modules; do
3091    if $pkg_config --atleast-version=$glib_req_ver $i; then
3092        glib_cflags=$($pkg_config --cflags $i)
3093        glib_libs=$($pkg_config --libs $i)
3094    else
3095        error_exit "glib-$glib_req_ver $i is required to compile QEMU"
3096    fi
3097done
3098
3099# This workaround is required due to a bug in pkg-config file for glib as it
3100# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
3101
3102if test "$static" = yes && test "$mingw32" = yes; then
3103    glib_cflags="-DGLIB_STATIC_COMPILATION $glib_cflags"
3104fi
3105
3106if ! test "$gio" = "no"; then
3107    pass=no
3108    if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
3109        gio_cflags=$($pkg_config --cflags gio-2.0)
3110        gio_libs=$($pkg_config --libs gio-2.0)
3111        gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
3112        if ! has "$gdbus_codegen"; then
3113            gdbus_codegen=
3114        fi
3115        # Check that the libraries actually work -- Ubuntu 18.04 ships
3116        # with pkg-config --static --libs data for gio-2.0 that is missing
3117        # -lblkid and will give a link error.
3118        cat > $TMPC <<EOF
3119#include <gio/gio.h>
3120int main(void)
3121{
3122    g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
3123    return 0;
3124}
3125EOF
3126        if compile_prog "$gio_cflags" "$gio_libs" ; then
3127            pass=yes
3128        else
3129            pass=no
3130        fi
3131
3132        if test "$pass" = "yes" &&
3133            $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
3134            gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
3135            gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
3136        fi
3137    fi
3138
3139    if test "$pass" = "no"; then
3140        if test "$gio" = "yes"; then
3141            feature_not_found "gio" "Install libgio >= 2.0"
3142        else
3143            gio=no
3144        fi
3145    else
3146        gio=yes
3147    fi
3148fi
3149
3150# Sanity check that the current size_t matches the
3151# size that glib thinks it should be. This catches
3152# problems on multi-arch where people try to build
3153# 32-bit QEMU while pointing at 64-bit glib headers
3154cat > $TMPC <<EOF
3155#include <glib.h>
3156#include <unistd.h>
3157
3158#define QEMU_BUILD_BUG_ON(x) \
3159  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
3160
3161int main(void) {
3162   QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
3163   return 0;
3164}
3165EOF
3166
3167if ! compile_prog "$glib_cflags" "$glib_libs" ; then
3168    error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
3169               "You probably need to set PKG_CONFIG_LIBDIR"\
3170	       "to point to the right pkg-config files for your"\
3171	       "build target"
3172fi
3173
3174# Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
3175cat > $TMPC << EOF
3176#include <glib.h>
3177int main(void) { return 0; }
3178EOF
3179if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3180    if cc_has_warning_flag "-Wno-unknown-attributes"; then
3181        glib_cflags="-Wno-unknown-attributes $glib_cflags"
3182        CONFIGURE_CFLAGS="-Wno-unknown-attributes $CONFIGURE_CFLAGS"
3183    fi
3184fi
3185
3186# Silence clang warnings triggered by glib < 2.57.2
3187cat > $TMPC << EOF
3188#include <glib.h>
3189typedef struct Foo {
3190    int i;
3191} Foo;
3192static void foo_free(Foo *f)
3193{
3194    g_free(f);
3195}
3196G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free);
3197int main(void) { return 0; }
3198EOF
3199if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3200    if cc_has_warning_flag "-Wno-unused-function"; then
3201        glib_cflags="$glib_cflags -Wno-unused-function"
3202        CONFIGURE_CFLAGS="$CONFIGURE_CFLAGS -Wno-unused-function"
3203    fi
3204fi
3205
3206##########################################
3207# SHA command probe for modules
3208if test "$modules" = yes; then
3209    shacmd_probe="sha1sum sha1 shasum"
3210    for c in $shacmd_probe; do
3211        if has $c; then
3212            shacmd="$c"
3213            break
3214        fi
3215    done
3216    if test "$shacmd" = ""; then
3217        error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
3218    fi
3219fi
3220
3221##########################################
3222# pthread probe
3223PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
3224
3225pthread=no
3226cat > $TMPC << EOF
3227#include <pthread.h>
3228static void *f(void *p) { return NULL; }
3229int main(void) {
3230  pthread_t thread;
3231  pthread_create(&thread, 0, f, 0);
3232  return 0;
3233}
3234EOF
3235if compile_prog "" "" ; then
3236  pthread=yes
3237else
3238  for pthread_lib in $PTHREADLIBS_LIST; do
3239    if compile_prog "" "$pthread_lib" ; then
3240      pthread=yes
3241      break
3242    fi
3243  done
3244fi
3245
3246if test "$mingw32" != yes && test "$pthread" = no; then
3247  error_exit "pthread check failed" \
3248      "Make sure to have the pthread libs and headers installed."
3249fi
3250
3251# check for pthread_setname_np with thread id
3252pthread_setname_np_w_tid=no
3253cat > $TMPC << EOF
3254#include <pthread.h>
3255
3256static void *f(void *p) { return NULL; }
3257int main(void)
3258{
3259    pthread_t thread;
3260    pthread_create(&thread, 0, f, 0);
3261    pthread_setname_np(thread, "QEMU");
3262    return 0;
3263}
3264EOF
3265if compile_prog "" "$pthread_lib" ; then
3266  pthread_setname_np_w_tid=yes
3267fi
3268
3269# check for pthread_setname_np without thread id
3270pthread_setname_np_wo_tid=no
3271cat > $TMPC << EOF
3272#include <pthread.h>
3273
3274static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
3275int main(void)
3276{
3277    pthread_t thread;
3278    pthread_create(&thread, 0, f, 0);
3279    return 0;
3280}
3281EOF
3282if compile_prog "" "$pthread_lib" ; then
3283  pthread_setname_np_wo_tid=yes
3284fi
3285
3286##########################################
3287# libssh probe
3288if test "$libssh" != "no" ; then
3289  if $pkg_config --exists "libssh >= 0.8.7"; then
3290    libssh_cflags=$($pkg_config libssh --cflags)
3291    libssh_libs=$($pkg_config libssh --libs)
3292    libssh=yes
3293  else
3294    if test "$libssh" = "yes" ; then
3295      error_exit "libssh required for --enable-libssh"
3296    fi
3297    libssh=no
3298  fi
3299fi
3300
3301##########################################
3302# linux-aio probe
3303
3304if test "$linux_aio" != "no" ; then
3305  cat > $TMPC <<EOF
3306#include <libaio.h>
3307#include <sys/eventfd.h>
3308#include <stddef.h>
3309int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
3310EOF
3311  if compile_prog "" "-laio" ; then
3312    linux_aio=yes
3313  else
3314    if test "$linux_aio" = "yes" ; then
3315      feature_not_found "linux AIO" "Install libaio devel"
3316    fi
3317    linux_aio=no
3318  fi
3319fi
3320
3321##########################################
3322# TPM emulation is only on POSIX
3323
3324if test "$tpm" = ""; then
3325  if test "$mingw32" = "yes"; then
3326    tpm=no
3327  else
3328    tpm=yes
3329  fi
3330elif test "$tpm" = "yes"; then
3331  if test "$mingw32" = "yes" ; then
3332    error_exit "TPM emulation only available on POSIX systems"
3333  fi
3334fi
3335
3336##########################################
3337# iovec probe
3338cat > $TMPC <<EOF
3339#include <sys/types.h>
3340#include <sys/uio.h>
3341#include <unistd.h>
3342int main(void) { return sizeof(struct iovec); }
3343EOF
3344iovec=no
3345if compile_prog "" "" ; then
3346  iovec=yes
3347fi
3348
3349##########################################
3350# fdt probe
3351
3352case "$fdt" in
3353  auto | enabled | internal)
3354    # Simpler to always update submodule, even if not needed.
3355    git_submodules="${git_submodules} dtc"
3356    ;;
3357esac
3358
3359##########################################
3360# opengl probe (for sdl2, gtk)
3361
3362gbm="no"
3363if $pkg_config gbm; then
3364    gbm_cflags="$($pkg_config --cflags gbm)"
3365    gbm_libs="$($pkg_config --libs gbm)"
3366    gbm="yes"
3367fi
3368
3369if test "$opengl" != "no" ; then
3370  epoxy=no
3371  if $pkg_config epoxy; then
3372    cat > $TMPC << EOF
3373#include <epoxy/egl.h>
3374int main(void) { return 0; }
3375EOF
3376    if compile_prog "" "" ; then
3377      epoxy=yes
3378    fi
3379  fi
3380
3381  if test "$epoxy" = "yes" ; then
3382    opengl_cflags="$($pkg_config --cflags epoxy)"
3383    opengl_libs="$($pkg_config --libs epoxy)"
3384    opengl=yes
3385  else
3386    if test "$opengl" = "yes" ; then
3387      feature_not_found "opengl" "Please install epoxy with EGL"
3388    fi
3389    opengl_cflags=""
3390    opengl_libs=""
3391    opengl=no
3392  fi
3393fi
3394
3395##########################################
3396# libnuma probe
3397
3398if test "$numa" != "no" ; then
3399  cat > $TMPC << EOF
3400#include <numa.h>
3401int main(void) { return numa_available(); }
3402EOF
3403
3404  if compile_prog "" "-lnuma" ; then
3405    numa=yes
3406    numa_libs="-lnuma"
3407  else
3408    if test "$numa" = "yes" ; then
3409      feature_not_found "numa" "install numactl devel"
3410    fi
3411    numa=no
3412  fi
3413fi
3414
3415malloc=system
3416if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
3417    echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
3418    exit 1
3419elif test "$tcmalloc" = "yes" ; then
3420    malloc=tcmalloc
3421elif test "$jemalloc" = "yes" ; then
3422    malloc=jemalloc
3423fi
3424
3425# check for usbfs
3426have_usbfs=no
3427if test "$linux_user" = "yes"; then
3428  cat > $TMPC << EOF
3429#include <linux/usbdevice_fs.h>
3430
3431#ifndef USBDEVFS_GET_CAPABILITIES
3432#error "USBDEVFS_GET_CAPABILITIES undefined"
3433#endif
3434
3435#ifndef USBDEVFS_DISCONNECT_CLAIM
3436#error "USBDEVFS_DISCONNECT_CLAIM undefined"
3437#endif
3438
3439int main(void)
3440{
3441    return 0;
3442}
3443EOF
3444  if compile_prog "" ""; then
3445    have_usbfs=yes
3446  fi
3447fi
3448
3449##########################################
3450# spice probe
3451if test "$spice_protocol" != "no" ; then
3452  spice_protocol_cflags=$($pkg_config --cflags spice-protocol 2>/dev/null)
3453  if $pkg_config --atleast-version=0.12.3 spice-protocol; then
3454    spice_protocol="yes"
3455  else
3456    if test "$spice_protocol" = "yes" ; then
3457      feature_not_found "spice_protocol" \
3458          "Install spice-protocol(>=0.12.3) devel"
3459    fi
3460    spice_protocol="no"
3461  fi
3462fi
3463
3464if test "$spice" != "no" ; then
3465  cat > $TMPC << EOF
3466#include <spice.h>
3467int main(void) { spice_server_new(); return 0; }
3468EOF
3469  spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
3470  spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
3471  if $pkg_config --atleast-version=0.12.5 spice-server && \
3472     test "$spice_protocol" = "yes" && \
3473     compile_prog "$spice_cflags" "$spice_libs" ; then
3474    spice="yes"
3475  else
3476    if test "$spice" = "yes" ; then
3477      feature_not_found "spice" \
3478          "Install spice-server(>=0.12.5) devel"
3479    fi
3480    spice="no"
3481  fi
3482fi
3483
3484##########################################
3485# check if we have VSS SDK headers for win
3486
3487if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
3488        test "$vss_win32_sdk" != "no" ; then
3489  case "$vss_win32_sdk" in
3490    "")   vss_win32_include="-isystem $source_path" ;;
3491    *\ *) # The SDK is installed in "Program Files" by default, but we cannot
3492          # handle path with spaces. So we symlink the headers into ".sdk/vss".
3493          vss_win32_include="-isystem $source_path/.sdk/vss"
3494	  symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
3495	  ;;
3496    *)    vss_win32_include="-isystem $vss_win32_sdk"
3497  esac
3498  cat > $TMPC << EOF
3499#define __MIDL_user_allocate_free_DEFINED__
3500#include <inc/win2003/vss.h>
3501int main(void) { return VSS_CTX_BACKUP; }
3502EOF
3503  if compile_prog "$vss_win32_include" "" ; then
3504    guest_agent_with_vss="yes"
3505    QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
3506    libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
3507    qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
3508  else
3509    if test "$vss_win32_sdk" != "" ; then
3510      echo "ERROR: Please download and install Microsoft VSS SDK:"
3511      echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
3512      echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
3513      echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
3514      echo "ERROR: The headers are extracted in the directory \`inc'."
3515      feature_not_found "VSS support"
3516    fi
3517    guest_agent_with_vss="no"
3518  fi
3519fi
3520
3521##########################################
3522# lookup Windows platform SDK (if not specified)
3523# The SDK is needed only to build .tlb (type library) file of guest agent
3524# VSS provider from the source. It is usually unnecessary because the
3525# pre-compiled .tlb file is included.
3526
3527if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
3528        test "$guest_agent_with_vss" = "yes" ; then
3529  if test -z "$win_sdk"; then
3530    programfiles="$PROGRAMFILES"
3531    test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
3532    if test -n "$programfiles"; then
3533      win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
3534    else
3535      feature_not_found "Windows SDK"
3536    fi
3537  elif test "$win_sdk" = "no"; then
3538    win_sdk=""
3539  fi
3540fi
3541
3542##########################################
3543# check if mingw environment provides a recent ntddscsi.h
3544if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
3545  cat > $TMPC << EOF
3546#include <windows.h>
3547#include <ntddscsi.h>
3548int main(void) {
3549#if !defined(IOCTL_SCSI_GET_ADDRESS)
3550#error Missing required ioctl definitions
3551#endif
3552  SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
3553  return addr.Lun;
3554}
3555EOF
3556  if compile_prog "" "" ; then
3557    guest_agent_ntddscsi=yes
3558    libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
3559  fi
3560fi
3561
3562##########################################
3563# capstone
3564
3565case "$capstone" in
3566  auto | enabled | internal)
3567    # Simpler to always update submodule, even if not needed.
3568    git_submodules="${git_submodules} capstone"
3569    ;;
3570esac
3571
3572##########################################
3573# check if we have posix_syslog
3574
3575posix_syslog=no
3576cat > $TMPC << EOF
3577#include <syslog.h>
3578int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; }
3579EOF
3580if compile_prog "" "" ; then
3581    posix_syslog=yes
3582fi
3583
3584##########################################
3585# check if trace backend exists
3586
3587$python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
3588if test "$?" -ne 0 ; then
3589  error_exit "invalid trace backends" \
3590      "Please choose supported trace backends."
3591fi
3592
3593##########################################
3594# For 'ust' backend, test if ust headers are present
3595if have_backend "ust"; then
3596  cat > $TMPC << EOF
3597#include <lttng/tracepoint.h>
3598int main(void) { return 0; }
3599EOF
3600  if compile_prog "" "-Wl,--no-as-needed -ldl" ; then
3601    if $pkg_config lttng-ust --exists; then
3602      lttng_ust_libs=$($pkg_config --libs lttng-ust)
3603    else
3604      lttng_ust_libs="-llttng-ust -ldl"
3605    fi
3606    if $pkg_config liburcu-bp --exists; then
3607      urcu_bp_libs=$($pkg_config --libs liburcu-bp)
3608    else
3609      urcu_bp_libs="-lurcu-bp"
3610    fi
3611  else
3612    error_exit "Trace backend 'ust' missing lttng-ust header files"
3613  fi
3614fi
3615
3616##########################################
3617# For 'dtrace' backend, test if 'dtrace' command is present
3618if have_backend "dtrace"; then
3619  if ! has 'dtrace' ; then
3620    error_exit "dtrace command is not found in PATH $PATH"
3621  fi
3622  trace_backend_stap="no"
3623  if has 'stap' ; then
3624    trace_backend_stap="yes"
3625
3626    # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
3627    # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
3628    # instead. QEMU --enable-modules depends on this because the SystemTap
3629    # semaphores are linked into the main binary and not the module's shared
3630    # object.
3631    QEMU_CFLAGS="$QEMU_CFLAGS -DSTAP_SDT_V2"
3632  fi
3633fi
3634
3635##########################################
3636# check and set a backend for coroutine
3637
3638# We prefer ucontext, but it's not always possible. The fallback
3639# is sigcontext. On Windows the only valid backend is the Windows
3640# specific one.
3641
3642ucontext_works=no
3643if test "$darwin" != "yes"; then
3644  cat > $TMPC << EOF
3645#include <ucontext.h>
3646#ifdef __stub_makecontext
3647#error Ignoring glibc stub makecontext which will always fail
3648#endif
3649int main(void) { makecontext(0, 0, 0); return 0; }
3650EOF
3651  if compile_prog "" "" ; then
3652    ucontext_works=yes
3653  fi
3654fi
3655
3656if test "$coroutine" = ""; then
3657  if test "$mingw32" = "yes"; then
3658    coroutine=win32
3659  elif test "$ucontext_works" = "yes"; then
3660    coroutine=ucontext
3661  else
3662    coroutine=sigaltstack
3663  fi
3664else
3665  case $coroutine in
3666  windows)
3667    if test "$mingw32" != "yes"; then
3668      error_exit "'windows' coroutine backend only valid for Windows"
3669    fi
3670    # Unfortunately the user visible backend name doesn't match the
3671    # coroutine-*.c filename for this case, so we have to adjust it here.
3672    coroutine=win32
3673    ;;
3674  ucontext)
3675    if test "$ucontext_works" != "yes"; then
3676      feature_not_found "ucontext"
3677    fi
3678    ;;
3679  sigaltstack)
3680    if test "$mingw32" = "yes"; then
3681      error_exit "only the 'windows' coroutine backend is valid for Windows"
3682    fi
3683    ;;
3684  *)
3685    error_exit "unknown coroutine backend $coroutine"
3686    ;;
3687  esac
3688fi
3689
3690if test "$coroutine_pool" = ""; then
3691  coroutine_pool=yes
3692fi
3693
3694if test "$debug_stack_usage" = "yes"; then
3695  if test "$coroutine_pool" = "yes"; then
3696    echo "WARN: disabling coroutine pool for stack usage debugging"
3697    coroutine_pool=no
3698  fi
3699fi
3700
3701##################################################
3702# SafeStack
3703
3704
3705if test "$safe_stack" = "yes"; then
3706cat > $TMPC << EOF
3707int main(int argc, char *argv[])
3708{
3709#if ! __has_feature(safe_stack)
3710#error SafeStack Disabled
3711#endif
3712    return 0;
3713}
3714EOF
3715  flag="-fsanitize=safe-stack"
3716  # Check that safe-stack is supported and enabled.
3717  if compile_prog "-Werror $flag" "$flag"; then
3718    # Flag needed both at compilation and at linking
3719    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
3720    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
3721  else
3722    error_exit "SafeStack not supported by your compiler"
3723  fi
3724  if test "$coroutine" != "ucontext"; then
3725    error_exit "SafeStack is only supported by the coroutine backend ucontext"
3726  fi
3727else
3728cat > $TMPC << EOF
3729int main(int argc, char *argv[])
3730{
3731#if defined(__has_feature)
3732#if __has_feature(safe_stack)
3733#error SafeStack Enabled
3734#endif
3735#endif
3736    return 0;
3737}
3738EOF
3739if test "$safe_stack" = "no"; then
3740  # Make sure that safe-stack is disabled
3741  if ! compile_prog "-Werror" ""; then
3742    # SafeStack was already enabled, try to explicitly remove the feature
3743    flag="-fno-sanitize=safe-stack"
3744    if ! compile_prog "-Werror $flag" "$flag"; then
3745      error_exit "Configure cannot disable SafeStack"
3746    fi
3747    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
3748    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
3749  fi
3750else # "$safe_stack" = ""
3751  # Set safe_stack to yes or no based on pre-existing flags
3752  if compile_prog "-Werror" ""; then
3753    safe_stack="no"
3754  else
3755    safe_stack="yes"
3756    if test "$coroutine" != "ucontext"; then
3757      error_exit "SafeStack is only supported by the coroutine backend ucontext"
3758    fi
3759  fi
3760fi
3761fi
3762
3763########################################
3764# check if cpuid.h is usable.
3765
3766cat > $TMPC << EOF
3767#include <cpuid.h>
3768int main(void) {
3769    unsigned a, b, c, d;
3770    int max = __get_cpuid_max(0, 0);
3771
3772    if (max >= 1) {
3773        __cpuid(1, a, b, c, d);
3774    }
3775
3776    if (max >= 7) {
3777        __cpuid_count(7, 0, a, b, c, d);
3778    }
3779
3780    return 0;
3781}
3782EOF
3783if compile_prog "" "" ; then
3784    cpuid_h=yes
3785fi
3786
3787##########################################
3788# avx2 optimization requirement check
3789#
3790# There is no point enabling this if cpuid.h is not usable,
3791# since we won't be able to select the new routines.
3792
3793if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
3794  cat > $TMPC << EOF
3795#pragma GCC push_options
3796#pragma GCC target("avx2")
3797#include <cpuid.h>
3798#include <immintrin.h>
3799static int bar(void *a) {
3800    __m256i x = *(__m256i *)a;
3801    return _mm256_testz_si256(x, x);
3802}
3803int main(int argc, char *argv[]) { return bar(argv[0]); }
3804EOF
3805  if compile_object "" ; then
3806    avx2_opt="yes"
3807  else
3808    avx2_opt="no"
3809  fi
3810fi
3811
3812##########################################
3813# avx512f optimization requirement check
3814#
3815# There is no point enabling this if cpuid.h is not usable,
3816# since we won't be able to select the new routines.
3817# by default, it is turned off.
3818# if user explicitly want to enable it, check environment
3819
3820if test "$cpuid_h" = "yes" && test "$avx512f_opt" = "yes"; then
3821  cat > $TMPC << EOF
3822#pragma GCC push_options
3823#pragma GCC target("avx512f")
3824#include <cpuid.h>
3825#include <immintrin.h>
3826static int bar(void *a) {
3827    __m512i x = *(__m512i *)a;
3828    return _mm512_test_epi64_mask(x, x);
3829}
3830int main(int argc, char *argv[])
3831{
3832	return bar(argv[0]);
3833}
3834EOF
3835  if ! compile_object "" ; then
3836    avx512f_opt="no"
3837  fi
3838else
3839  avx512f_opt="no"
3840fi
3841
3842########################################
3843# check if __[u]int128_t is usable.
3844
3845int128=no
3846cat > $TMPC << EOF
3847__int128_t a;
3848__uint128_t b;
3849int main (void) {
3850  a = a + b;
3851  b = a * b;
3852  a = a * a;
3853  return 0;
3854}
3855EOF
3856if compile_prog "" "" ; then
3857    int128=yes
3858fi
3859
3860#########################################
3861# See if 128-bit atomic operations are supported.
3862
3863atomic128=no
3864if test "$int128" = "yes"; then
3865  cat > $TMPC << EOF
3866int main(void)
3867{
3868  unsigned __int128 x = 0, y = 0;
3869  y = __atomic_load(&x, 0);
3870  __atomic_store(&x, y, 0);
3871  __atomic_compare_exchange(&x, &y, x, 0, 0, 0);
3872  return 0;
3873}
3874EOF
3875  if compile_prog "" "" ; then
3876    atomic128=yes
3877  fi
3878fi
3879
3880cmpxchg128=no
3881if test "$int128" = yes && test "$atomic128" = no; then
3882  cat > $TMPC << EOF
3883int main(void)
3884{
3885  unsigned __int128 x = 0, y = 0;
3886  __sync_val_compare_and_swap_16(&x, y, x);
3887  return 0;
3888}
3889EOF
3890  if compile_prog "" "" ; then
3891    cmpxchg128=yes
3892  fi
3893fi
3894
3895#########################################
3896# See if 64-bit atomic operations are supported.
3897# Note that without __atomic builtins, we can only
3898# assume atomic loads/stores max at pointer size.
3899
3900cat > $TMPC << EOF
3901#include <stdint.h>
3902int main(void)
3903{
3904  uint64_t x = 0, y = 0;
3905#ifdef __ATOMIC_RELAXED
3906  y = __atomic_load_n(&x, __ATOMIC_RELAXED);
3907  __atomic_store_n(&x, y, __ATOMIC_RELAXED);
3908  __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
3909  __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
3910  __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
3911#else
3912  typedef char is_host64[sizeof(void *) >= sizeof(uint64_t) ? 1 : -1];
3913  __sync_lock_test_and_set(&x, y);
3914  __sync_val_compare_and_swap(&x, y, 0);
3915  __sync_fetch_and_add(&x, y);
3916#endif
3917  return 0;
3918}
3919EOF
3920if compile_prog "" "" ; then
3921  atomic64=yes
3922fi
3923
3924#########################################
3925# See if --dynamic-list is supported by the linker
3926ld_dynamic_list="no"
3927if test "$static" = "no" ; then
3928    cat > $TMPTXT <<EOF
3929{
3930  foo;
3931};
3932EOF
3933
3934    cat > $TMPC <<EOF
3935#include <stdio.h>
3936void foo(void);
3937
3938void foo(void)
3939{
3940  printf("foo\n");
3941}
3942
3943int main(void)
3944{
3945  foo();
3946  return 0;
3947}
3948EOF
3949
3950    if compile_prog "" "-Wl,--dynamic-list=$TMPTXT" ; then
3951        ld_dynamic_list="yes"
3952    fi
3953fi
3954
3955#########################################
3956# See if -exported_symbols_list is supported by the linker
3957
3958ld_exported_symbols_list="no"
3959if test "$static" = "no" ; then
3960    cat > $TMPTXT <<EOF
3961  _foo
3962EOF
3963
3964    if compile_prog "" "-Wl,-exported_symbols_list,$TMPTXT" ; then
3965        ld_exported_symbols_list="yes"
3966    fi
3967fi
3968
3969if  test "$plugins" = "yes" &&
3970    test "$ld_dynamic_list" = "no" &&
3971    test "$ld_exported_symbols_list" = "no" ; then
3972  error_exit \
3973      "Plugin support requires dynamic linking and specifying a set of symbols " \
3974      "that are exported to plugins. Unfortunately your linker doesn't " \
3975      "support the flag (--dynamic-list or -exported_symbols_list) used " \
3976      "for this purpose. You can't build with --static."
3977fi
3978
3979########################################
3980# check if getauxval is available.
3981
3982getauxval=no
3983cat > $TMPC << EOF
3984#include <sys/auxv.h>
3985int main(void) {
3986  return getauxval(AT_HWCAP) == 0;
3987}
3988EOF
3989if compile_prog "" "" ; then
3990    getauxval=yes
3991fi
3992
3993########################################
3994# check if ccache is interfering with
3995# semantic analysis of macros
3996
3997unset CCACHE_CPP2
3998ccache_cpp2=no
3999cat > $TMPC << EOF
4000static const int Z = 1;
4001#define fn() ({ Z; })
4002#define TAUT(X) ((X) == Z)
4003#define PAREN(X, Y) (X == Y)
4004#define ID(X) (X)
4005int main(int argc, char *argv[])
4006{
4007    int x = 0, y = 0;
4008    x = ID(x);
4009    x = fn();
4010    fn();
4011    if (PAREN(x, y)) return 0;
4012    if (TAUT(Z)) return 0;
4013    return 0;
4014}
4015EOF
4016
4017if ! compile_object "-Werror"; then
4018    ccache_cpp2=yes
4019fi
4020
4021#################################################
4022# clang does not support glibc + FORTIFY_SOURCE.
4023
4024if test "$fortify_source" != "no"; then
4025  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
4026    fortify_source="no";
4027  elif test -n "$cxx" && has $cxx &&
4028       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
4029    fortify_source="no";
4030  else
4031    fortify_source="yes"
4032  fi
4033fi
4034
4035##########################################
4036# check if struct fsxattr is available via linux/fs.h
4037
4038have_fsxattr=no
4039cat > $TMPC << EOF
4040#include <linux/fs.h>
4041struct fsxattr foo;
4042int main(void) {
4043  return 0;
4044}
4045EOF
4046if compile_prog "" "" ; then
4047    have_fsxattr=yes
4048fi
4049
4050##########################################
4051# check for usable membarrier system call
4052if test "$membarrier" = "yes"; then
4053    have_membarrier=no
4054    if test "$mingw32" = "yes" ; then
4055        have_membarrier=yes
4056    elif test "$linux" = "yes" ; then
4057        cat > $TMPC << EOF
4058    #include <linux/membarrier.h>
4059    #include <sys/syscall.h>
4060    #include <unistd.h>
4061    #include <stdlib.h>
4062    int main(void) {
4063        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
4064        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
4065	exit(0);
4066    }
4067EOF
4068        if compile_prog "" "" ; then
4069            have_membarrier=yes
4070        fi
4071    fi
4072    if test "$have_membarrier" = "no"; then
4073      feature_not_found "membarrier" "membarrier system call not available"
4074    fi
4075else
4076    # Do not enable it by default even for Mingw32, because it doesn't
4077    # work on Wine.
4078    membarrier=no
4079fi
4080
4081##########################################
4082# check for usable AF_VSOCK environment
4083have_af_vsock=no
4084cat > $TMPC << EOF
4085#include <errno.h>
4086#include <sys/types.h>
4087#include <sys/socket.h>
4088#if !defined(AF_VSOCK)
4089# error missing AF_VSOCK flag
4090#endif
4091#include <linux/vm_sockets.h>
4092int main(void) {
4093    int sock, ret;
4094    struct sockaddr_vm svm;
4095    socklen_t len = sizeof(svm);
4096    sock = socket(AF_VSOCK, SOCK_STREAM, 0);
4097    ret = getpeername(sock, (struct sockaddr *)&svm, &len);
4098    if ((ret == -1) && (errno == ENOTCONN)) {
4099        return 0;
4100    }
4101    return -1;
4102}
4103EOF
4104if compile_prog "" "" ; then
4105    have_af_vsock=yes
4106fi
4107
4108##########################################
4109# check for usable AF_ALG environment
4110have_afalg=no
4111cat > $TMPC << EOF
4112#include <errno.h>
4113#include <sys/types.h>
4114#include <sys/socket.h>
4115#include <linux/if_alg.h>
4116int main(void) {
4117    int sock;
4118    sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
4119    return sock;
4120}
4121EOF
4122if compile_prog "" "" ; then
4123    have_afalg=yes
4124fi
4125if test "$crypto_afalg" = "yes"
4126then
4127    if test "$have_afalg" != "yes"
4128    then
4129	error_exit "AF_ALG requested but could not be detected"
4130    fi
4131fi
4132
4133
4134##########################################
4135# checks for sanitizers
4136
4137have_asan=no
4138have_ubsan=no
4139have_asan_iface_h=no
4140have_asan_iface_fiber=no
4141
4142if test "$sanitizers" = "yes" ; then
4143  write_c_skeleton
4144  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
4145      have_asan=yes
4146  fi
4147
4148  # we could use a simple skeleton for flags checks, but this also
4149  # detect the static linking issue of ubsan, see also:
4150  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
4151  cat > $TMPC << EOF
4152#include <stdlib.h>
4153int main(void) {
4154    void *tmp = malloc(10);
4155    if (tmp != NULL) {
4156        return *(int *)(tmp + 2);
4157    }
4158    return 1;
4159}
4160EOF
4161  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
4162      have_ubsan=yes
4163  fi
4164
4165  if check_include "sanitizer/asan_interface.h" ; then
4166      have_asan_iface_h=yes
4167  fi
4168
4169  cat > $TMPC << EOF
4170#include <sanitizer/asan_interface.h>
4171int main(void) {
4172  __sanitizer_start_switch_fiber(0, 0, 0);
4173  return 0;
4174}
4175EOF
4176  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
4177      have_asan_iface_fiber=yes
4178  fi
4179fi
4180
4181##########################################
4182# checks for fuzzer
4183if test "$fuzzing" = "yes" && test -z "${LIB_FUZZING_ENGINE+xxx}"; then
4184  write_c_fuzzer_skeleton
4185  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=fuzzer" ""; then
4186    have_fuzzer=yes
4187  else
4188    error_exit "Your compiler doesn't support -fsanitize=fuzzer"
4189    exit 1
4190  fi
4191fi
4192
4193# Thread sanitizer is, for now, much noisier than the other sanitizers;
4194# keep it separate until that is not the case.
4195if test "$tsan" = "yes" && test "$sanitizers" = "yes"; then
4196  error_exit "TSAN is not supported with other sanitiziers."
4197fi
4198have_tsan=no
4199have_tsan_iface_fiber=no
4200if test "$tsan" = "yes" ; then
4201  write_c_skeleton
4202  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
4203      have_tsan=yes
4204  fi
4205  cat > $TMPC << EOF
4206#include <sanitizer/tsan_interface.h>
4207int main(void) {
4208  __tsan_create_fiber(0);
4209  return 0;
4210}
4211EOF
4212  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
4213      have_tsan_iface_fiber=yes
4214  fi
4215fi
4216
4217##########################################
4218# check for slirp
4219
4220case "$slirp" in
4221  auto | enabled | internal)
4222    # Simpler to always update submodule, even if not needed.
4223    git_submodules="${git_submodules} slirp"
4224    ;;
4225esac
4226
4227# Check for slirp smbd dupport
4228: ${smbd=${SMBD-/usr/sbin/smbd}}
4229if test "$slirp_smbd" != "no" ; then
4230  if test "$mingw32" = "yes" ; then
4231    if test "$slirp_smbd" = "yes" ; then
4232      error_exit "Host smbd not supported on this platform."
4233    fi
4234    slirp_smbd=no
4235  else
4236    slirp_smbd=yes
4237  fi
4238fi
4239
4240##########################################
4241# check for usable __NR_keyctl syscall
4242
4243if test "$linux" = "yes" ; then
4244
4245    have_keyring=no
4246    cat > $TMPC << EOF
4247#include <errno.h>
4248#include <asm/unistd.h>
4249#include <linux/keyctl.h>
4250#include <unistd.h>
4251int main(void) {
4252    return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
4253}
4254EOF
4255    if compile_prog "" "" ; then
4256        have_keyring=yes
4257    fi
4258fi
4259if test "$secret_keyring" != "no"
4260then
4261    if test "$have_keyring" = "yes"
4262    then
4263	secret_keyring=yes
4264    else
4265	if test "$secret_keyring" = "yes"
4266	then
4267	    error_exit "syscall __NR_keyctl requested, \
4268but not implemented on your system"
4269	else
4270	    secret_keyring=no
4271	fi
4272    fi
4273fi
4274
4275##########################################
4276# End of CC checks
4277# After here, no more $cc or $ld runs
4278
4279write_c_skeleton
4280
4281if test "$gcov" = "yes" ; then
4282  :
4283elif test "$fortify_source" = "yes" ; then
4284  QEMU_CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $QEMU_CFLAGS"
4285  debug=no
4286fi
4287
4288case "$ARCH" in
4289alpha)
4290  # Ensure there's only a single GP
4291  QEMU_CFLAGS="-msmall-data $QEMU_CFLAGS"
4292;;
4293esac
4294
4295if test "$gprof" = "yes" ; then
4296  QEMU_CFLAGS="-p $QEMU_CFLAGS"
4297  QEMU_LDFLAGS="-p $QEMU_LDFLAGS"
4298fi
4299
4300if test "$have_asan" = "yes"; then
4301  QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
4302  QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
4303  if test "$have_asan_iface_h" = "no" ; then
4304      echo "ASAN build enabled, but ASAN header missing." \
4305           "Without code annotation, the report may be inferior."
4306  elif test "$have_asan_iface_fiber" = "no" ; then
4307      echo "ASAN build enabled, but ASAN header is too old." \
4308           "Without code annotation, the report may be inferior."
4309  fi
4310fi
4311if test "$have_tsan" = "yes" ; then
4312  if test "$have_tsan_iface_fiber" = "yes" ; then
4313    QEMU_CFLAGS="-fsanitize=thread $QEMU_CFLAGS"
4314    QEMU_LDFLAGS="-fsanitize=thread $QEMU_LDFLAGS"
4315  else
4316    error_exit "Cannot enable TSAN due to missing fiber annotation interface."
4317  fi
4318elif test "$tsan" = "yes" ; then
4319  error_exit "Cannot enable TSAN due to missing sanitize thread interface."
4320fi
4321if test "$have_ubsan" = "yes"; then
4322  QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS"
4323  QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
4324fi
4325
4326##########################################
4327
4328# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
4329if test "$solaris" = "no" && test "$tsan" = "no"; then
4330    if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
4331        QEMU_LDFLAGS="-Wl,--warn-common $QEMU_LDFLAGS"
4332    fi
4333fi
4334
4335# Use ASLR, no-SEH and DEP if available
4336if test "$mingw32" = "yes" ; then
4337    flags="--no-seh --nxcompat"
4338
4339    # Disable ASLR for debug builds to allow debugging with gdb
4340    if test "$debug" = "no" ; then
4341        flags="--dynamicbase $flags"
4342    fi
4343
4344    for flag in $flags; do
4345        if ld_has $flag ; then
4346            QEMU_LDFLAGS="-Wl,$flag $QEMU_LDFLAGS"
4347        fi
4348    done
4349fi
4350
4351# Probe for guest agent support/options
4352
4353if [ "$guest_agent" != "no" ]; then
4354  if [ "$softmmu" = no -a "$want_tools" = no ] ; then
4355      guest_agent=no
4356  elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
4357      guest_agent=yes
4358  elif [ "$guest_agent" != yes ]; then
4359      guest_agent=no
4360  else
4361      error_exit "Guest agent is not supported on this platform"
4362  fi
4363fi
4364
4365# Guest agent Windows MSI package
4366
4367if test "$QEMU_GA_MANUFACTURER" = ""; then
4368  QEMU_GA_MANUFACTURER=QEMU
4369fi
4370if test "$QEMU_GA_DISTRO" = ""; then
4371  QEMU_GA_DISTRO=Linux
4372fi
4373if test "$QEMU_GA_VERSION" = ""; then
4374    QEMU_GA_VERSION=$(cat $source_path/VERSION)
4375fi
4376
4377QEMU_GA_MSI_MINGW_DLL_PATH="$($pkg_config --variable=prefix glib-2.0)/bin"
4378
4379# Mac OS X ships with a broken assembler
4380roms=
4381if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
4382        test "$targetos" != "Darwin" && test "$targetos" != "SunOS" && \
4383        test "$targetos" != "Haiku" && test "$softmmu" = yes ; then
4384    # Different host OS linkers have different ideas about the name of the ELF
4385    # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
4386    # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
4387    for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
4388        if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
4389            ld_i386_emulation="$emu"
4390            roms="optionrom"
4391            break
4392        fi
4393    done
4394fi
4395
4396# Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
4397# or -march=z10 (which is the lowest architecture level that Clang supports)
4398if test "$cpu" = "s390x" ; then
4399  write_c_skeleton
4400  compile_prog "-march=z900" ""
4401  has_z900=$?
4402  if [ $has_z900 = 0 ] || compile_object "-march=z10 -msoft-float -Werror"; then
4403    if [ $has_z900 != 0 ]; then
4404      echo "WARNING: Your compiler does not support the z900!"
4405      echo "         The s390-ccw bios will only work with guest CPUs >= z10."
4406    fi
4407    roms="$roms s390-ccw"
4408    # SLOF is required for building the s390-ccw firmware on s390x,
4409    # since it is using the libnet code from SLOF for network booting.
4410    git_submodules="${git_submodules} roms/SLOF"
4411  fi
4412fi
4413
4414# Check that the C++ compiler exists and works with the C compiler.
4415# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
4416if has $cxx; then
4417    cat > $TMPC <<EOF
4418int c_function(void);
4419int main(void) { return c_function(); }
4420EOF
4421
4422    compile_object
4423
4424    cat > $TMPCXX <<EOF
4425extern "C" {
4426   int c_function(void);
4427}
4428int c_function(void) { return 42; }
4429EOF
4430
4431    update_cxxflags
4432
4433    if do_cxx $CXXFLAGS $CONFIGURE_CXXFLAGS $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
4434        # C++ compiler $cxx works ok with C compiler $cc
4435        :
4436    else
4437        echo "C++ compiler $cxx does not work with C compiler $cc"
4438        echo "Disabling C++ specific optional code"
4439        cxx=
4440    fi
4441else
4442    echo "No C++ compiler available; disabling C++ specific optional code"
4443    cxx=
4444fi
4445
4446if !(GIT="$git" "$source_path/scripts/git-submodule.sh" "$git_submodules_action" "$git_submodules"); then
4447    exit 1
4448fi
4449
4450config_host_mak="config-host.mak"
4451
4452echo "# Automatically generated by configure - do not modify" > $config_host_mak
4453echo >> $config_host_mak
4454
4455echo all: >> $config_host_mak
4456echo "GIT=$git" >> $config_host_mak
4457echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
4458echo "GIT_SUBMODULES_ACTION=$git_submodules_action" >> $config_host_mak
4459
4460echo "ARCH=$ARCH" >> $config_host_mak
4461
4462if test "$debug_tcg" = "yes" ; then
4463  echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
4464fi
4465if test "$strip_opt" = "yes" ; then
4466  echo "STRIP=${strip}" >> $config_host_mak
4467fi
4468if test "$bigendian" = "yes" ; then
4469  echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
4470fi
4471if test "$mingw32" = "yes" ; then
4472  echo "CONFIG_WIN32=y" >> $config_host_mak
4473  if test "$guest_agent_with_vss" = "yes" ; then
4474    echo "CONFIG_QGA_VSS=y" >> $config_host_mak
4475    echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
4476    echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
4477  fi
4478  if test "$guest_agent_ntddscsi" = "yes" ; then
4479    echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
4480  fi
4481  echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
4482  echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
4483  echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
4484  echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
4485else
4486  echo "CONFIG_POSIX=y" >> $config_host_mak
4487fi
4488
4489if test "$linux" = "yes" ; then
4490  echo "CONFIG_LINUX=y" >> $config_host_mak
4491fi
4492
4493if test "$darwin" = "yes" ; then
4494  echo "CONFIG_DARWIN=y" >> $config_host_mak
4495fi
4496
4497if test "$solaris" = "yes" ; then
4498  echo "CONFIG_SOLARIS=y" >> $config_host_mak
4499fi
4500if test "$haiku" = "yes" ; then
4501  echo "CONFIG_HAIKU=y" >> $config_host_mak
4502fi
4503if test "$static" = "yes" ; then
4504  echo "CONFIG_STATIC=y" >> $config_host_mak
4505fi
4506if test "$profiler" = "yes" ; then
4507  echo "CONFIG_PROFILER=y" >> $config_host_mak
4508fi
4509if test "$want_tools" = "yes" ; then
4510  echo "CONFIG_TOOLS=y" >> $config_host_mak
4511fi
4512if test "$guest_agent" = "yes" ; then
4513  echo "CONFIG_GUEST_AGENT=y" >> $config_host_mak
4514fi
4515if test "$slirp_smbd" = "yes" ; then
4516  echo "CONFIG_SLIRP_SMBD=y" >> $config_host_mak
4517  echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
4518fi
4519if test "$vde" = "yes" ; then
4520  echo "CONFIG_VDE=y" >> $config_host_mak
4521  echo "VDE_LIBS=$vde_libs" >> $config_host_mak
4522fi
4523if test "$netmap" = "yes" ; then
4524  echo "CONFIG_NETMAP=y" >> $config_host_mak
4525fi
4526if test "$l2tpv3" = "yes" ; then
4527  echo "CONFIG_L2TPV3=y" >> $config_host_mak
4528fi
4529if test "$gprof" = "yes" ; then
4530  echo "CONFIG_GPROF=y" >> $config_host_mak
4531fi
4532echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
4533for drv in $audio_drv_list; do
4534    def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
4535    echo "$def=y" >> $config_host_mak
4536done
4537if test "$alsa" = "yes" ; then
4538    echo "CONFIG_ALSA=y" >> $config_host_mak
4539fi
4540echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak
4541echo "ALSA_CFLAGS=$alsa_cflags" >> $config_host_mak
4542if test "$libpulse" = "yes" ; then
4543    echo "CONFIG_LIBPULSE=y" >> $config_host_mak
4544fi
4545echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
4546echo "PULSE_CFLAGS=$pulse_cflags" >> $config_host_mak
4547echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak
4548echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak
4549echo "OSS_LIBS=$oss_libs" >> $config_host_mak
4550if test "$libjack" = "yes" ; then
4551    echo "CONFIG_LIBJACK=y" >> $config_host_mak
4552fi
4553echo "JACK_LIBS=$jack_libs" >> $config_host_mak
4554if test "$audio_win_int" = "yes" ; then
4555  echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
4556fi
4557echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
4558echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
4559if test "$xfs" = "yes" ; then
4560  echo "CONFIG_XFS=y" >> $config_host_mak
4561fi
4562qemu_version=$(head $source_path/VERSION)
4563echo "PKGVERSION=$pkgversion" >>$config_host_mak
4564echo "SRC_PATH=$source_path" >> $config_host_mak
4565echo "TARGET_DIRS=$target_list" >> $config_host_mak
4566if test "$modules" = "yes"; then
4567  # $shacmd can generate a hash started with digit, which the compiler doesn't
4568  # like as an symbol. So prefix it with an underscore
4569  echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
4570  echo "CONFIG_MODULES=y" >> $config_host_mak
4571fi
4572if test "$module_upgrades" = "yes"; then
4573  echo "CONFIG_MODULE_UPGRADES=y" >> $config_host_mak
4574fi
4575if test "$have_usbfs" = "yes" ; then
4576  echo "CONFIG_USBFS=y" >> $config_host_mak
4577fi
4578if test "$gio" = "yes" ; then
4579    echo "CONFIG_GIO=y" >> $config_host_mak
4580    echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
4581    echo "GIO_LIBS=$gio_libs" >> $config_host_mak
4582fi
4583if test "$gdbus_codegen" != "" ; then
4584    echo "GDBUS_CODEGEN=$gdbus_codegen" >> $config_host_mak
4585fi
4586echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
4587
4588# Work around a system header bug with some kernel/XFS header
4589# versions where they both try to define 'struct fsxattr':
4590# xfs headers will not try to redefine structs from linux headers
4591# if this macro is set.
4592if test "$have_fsxattr" = "yes" ; then
4593    echo "HAVE_FSXATTR=y" >> $config_host_mak
4594fi
4595if test "$xen" = "enabled" ; then
4596  echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
4597  echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
4598  echo "XEN_CFLAGS=$xen_cflags" >> $config_host_mak
4599  echo "XEN_LIBS=$xen_libs" >> $config_host_mak
4600fi
4601if test "$linux_aio" = "yes" ; then
4602  echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
4603fi
4604if test "$vhost_scsi" = "yes" ; then
4605  echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
4606fi
4607if test "$vhost_net" = "yes" ; then
4608  echo "CONFIG_VHOST_NET=y" >> $config_host_mak
4609fi
4610if test "$vhost_net_user" = "yes" ; then
4611  echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
4612fi
4613if test "$vhost_net_vdpa" = "yes" ; then
4614  echo "CONFIG_VHOST_NET_VDPA=y" >> $config_host_mak
4615fi
4616if test "$vhost_crypto" = "yes" ; then
4617  echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
4618fi
4619if test "$vhost_vsock" = "yes" ; then
4620  echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
4621  if test "$vhost_user" = "yes" ; then
4622    echo "CONFIG_VHOST_USER_VSOCK=y" >> $config_host_mak
4623  fi
4624fi
4625if test "$vhost_kernel" = "yes" ; then
4626  echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
4627fi
4628if test "$vhost_user" = "yes" ; then
4629  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
4630fi
4631if test "$vhost_vdpa" = "yes" ; then
4632  echo "CONFIG_VHOST_VDPA=y" >> $config_host_mak
4633fi
4634if test "$vhost_user_fs" = "yes" ; then
4635  echo "CONFIG_VHOST_USER_FS=y" >> $config_host_mak
4636fi
4637if test "$iovec" = "yes" ; then
4638  echo "CONFIG_IOVEC=y" >> $config_host_mak
4639fi
4640if test "$membarrier" = "yes" ; then
4641  echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
4642fi
4643if test "$tcg" = "enabled" -a "$tcg_interpreter" = "true" ; then
4644  echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
4645fi
4646
4647if test "$spice_protocol" = "yes" ; then
4648  echo "CONFIG_SPICE_PROTOCOL=y" >> $config_host_mak
4649  echo "SPICE_PROTOCOL_CFLAGS=$spice_protocol_cflags" >> $config_host_mak
4650fi
4651if test "$spice" = "yes" ; then
4652  echo "CONFIG_SPICE=y" >> $config_host_mak
4653  echo "SPICE_CFLAGS=$spice_cflags $spice_protocol_cflags" >> $config_host_mak
4654  echo "SPICE_LIBS=$spice_libs" >> $config_host_mak
4655fi
4656
4657if test "$opengl" = "yes" ; then
4658  echo "CONFIG_OPENGL=y" >> $config_host_mak
4659  echo "OPENGL_CFLAGS=$opengl_cflags" >> $config_host_mak
4660  echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
4661fi
4662
4663if test "$gbm" = "yes" ; then
4664    echo "CONFIG_GBM=y" >> $config_host_mak
4665    echo "GBM_LIBS=$gbm_libs" >> $config_host_mak
4666    echo "GBM_CFLAGS=$gbm_cflags" >> $config_host_mak
4667fi
4668
4669
4670if test "$avx2_opt" = "yes" ; then
4671  echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
4672fi
4673
4674if test "$avx512f_opt" = "yes" ; then
4675  echo "CONFIG_AVX512F_OPT=y" >> $config_host_mak
4676fi
4677
4678# XXX: suppress that
4679if [ "$bsd" = "yes" ] ; then
4680  echo "CONFIG_BSD=y" >> $config_host_mak
4681fi
4682
4683if test "$qom_cast_debug" = "yes" ; then
4684  echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
4685fi
4686
4687echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
4688if test "$coroutine_pool" = "yes" ; then
4689  echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
4690else
4691  echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
4692fi
4693
4694if test "$debug_stack_usage" = "yes" ; then
4695  echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
4696fi
4697
4698if test "$crypto_afalg" = "yes" ; then
4699  echo "CONFIG_AF_ALG=y" >> $config_host_mak
4700fi
4701
4702if test "$have_asan_iface_fiber" = "yes" ; then
4703    echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
4704fi
4705
4706if test "$have_tsan" = "yes" && test "$have_tsan_iface_fiber" = "yes" ; then
4707    echo "CONFIG_TSAN=y" >> $config_host_mak
4708fi
4709
4710if test "$cpuid_h" = "yes" ; then
4711  echo "CONFIG_CPUID_H=y" >> $config_host_mak
4712fi
4713
4714if test "$int128" = "yes" ; then
4715  echo "CONFIG_INT128=y" >> $config_host_mak
4716fi
4717
4718if test "$atomic128" = "yes" ; then
4719  echo "CONFIG_ATOMIC128=y" >> $config_host_mak
4720fi
4721
4722if test "$cmpxchg128" = "yes" ; then
4723  echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
4724fi
4725
4726if test "$atomic64" = "yes" ; then
4727  echo "CONFIG_ATOMIC64=y" >> $config_host_mak
4728fi
4729
4730if test "$getauxval" = "yes" ; then
4731  echo "CONFIG_GETAUXVAL=y" >> $config_host_mak
4732fi
4733
4734if test "$libssh" = "yes" ; then
4735  echo "CONFIG_LIBSSH=y" >> $config_host_mak
4736  echo "LIBSSH_CFLAGS=$libssh_cflags" >> $config_host_mak
4737  echo "LIBSSH_LIBS=$libssh_libs" >> $config_host_mak
4738fi
4739
4740if test "$live_block_migration" = "yes" ; then
4741  echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
4742fi
4743
4744if test "$tpm" = "yes"; then
4745  echo 'CONFIG_TPM=y' >> $config_host_mak
4746fi
4747
4748echo "TRACE_BACKENDS=$trace_backends" >> $config_host_mak
4749if have_backend "nop"; then
4750  echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
4751fi
4752if have_backend "simple"; then
4753  echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
4754  # Set the appropriate trace file.
4755  trace_file="\"$trace_file-\" FMT_pid"
4756fi
4757if have_backend "log"; then
4758  echo "CONFIG_TRACE_LOG=y" >> $config_host_mak
4759fi
4760if have_backend "ust"; then
4761  echo "CONFIG_TRACE_UST=y" >> $config_host_mak
4762  echo "LTTNG_UST_LIBS=$lttng_ust_libs" >> $config_host_mak
4763  echo "URCU_BP_LIBS=$urcu_bp_libs" >> $config_host_mak
4764fi
4765if have_backend "dtrace"; then
4766  echo "CONFIG_TRACE_DTRACE=y" >> $config_host_mak
4767  if test "$trace_backend_stap" = "yes" ; then
4768    echo "CONFIG_TRACE_SYSTEMTAP=y" >> $config_host_mak
4769  fi
4770fi
4771if have_backend "ftrace"; then
4772  if test "$linux" = "yes" ; then
4773    echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak
4774  else
4775    feature_not_found "ftrace(trace backend)" "ftrace requires Linux"
4776  fi
4777fi
4778if have_backend "syslog"; then
4779  if test "$posix_syslog" = "yes" ; then
4780    echo "CONFIG_TRACE_SYSLOG=y" >> $config_host_mak
4781  else
4782    feature_not_found "syslog(trace backend)" "syslog not available"
4783  fi
4784fi
4785echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
4786
4787if test "$rdma" = "yes" ; then
4788  echo "CONFIG_RDMA=y" >> $config_host_mak
4789  echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
4790fi
4791
4792if test "$pvrdma" = "yes" ; then
4793  echo "CONFIG_PVRDMA=y" >> $config_host_mak
4794fi
4795
4796if test "$replication" = "yes" ; then
4797  echo "CONFIG_REPLICATION=y" >> $config_host_mak
4798fi
4799
4800if test "$have_af_vsock" = "yes" ; then
4801  echo "CONFIG_AF_VSOCK=y" >> $config_host_mak
4802fi
4803
4804if test "$debug_mutex" = "yes" ; then
4805  echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
4806fi
4807
4808# Hold two types of flag:
4809#   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
4810#                                     a thread we have a handle to
4811#   CONFIG_PTHREAD_SETNAME_NP_W_TID - A way of doing it on a particular
4812#                                     platform
4813if test "$pthread_setname_np_w_tid" = "yes" ; then
4814  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
4815  echo "CONFIG_PTHREAD_SETNAME_NP_W_TID=y" >> $config_host_mak
4816elif test "$pthread_setname_np_wo_tid" = "yes" ; then
4817  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
4818  echo "CONFIG_PTHREAD_SETNAME_NP_WO_TID=y" >> $config_host_mak
4819fi
4820
4821if test "$libpmem" = "yes" ; then
4822  echo "CONFIG_LIBPMEM=y" >> $config_host_mak
4823  echo "LIBPMEM_LIBS=$libpmem_libs" >> $config_host_mak
4824  echo "LIBPMEM_CFLAGS=$libpmem_cflags" >> $config_host_mak
4825fi
4826
4827if test "$bochs" = "yes" ; then
4828  echo "CONFIG_BOCHS=y" >> $config_host_mak
4829fi
4830if test "$cloop" = "yes" ; then
4831  echo "CONFIG_CLOOP=y" >> $config_host_mak
4832fi
4833if test "$dmg" = "yes" ; then
4834  echo "CONFIG_DMG=y" >> $config_host_mak
4835fi
4836if test "$qcow1" = "yes" ; then
4837  echo "CONFIG_QCOW1=y" >> $config_host_mak
4838fi
4839if test "$vdi" = "yes" ; then
4840  echo "CONFIG_VDI=y" >> $config_host_mak
4841fi
4842if test "$vvfat" = "yes" ; then
4843  echo "CONFIG_VVFAT=y" >> $config_host_mak
4844fi
4845if test "$qed" = "yes" ; then
4846  echo "CONFIG_QED=y" >> $config_host_mak
4847fi
4848if test "$parallels" = "yes" ; then
4849  echo "CONFIG_PARALLELS=y" >> $config_host_mak
4850fi
4851if test "$have_mlockall" = "yes" ; then
4852  echo "HAVE_MLOCKALL=y" >> $config_host_mak
4853fi
4854if test "$fuzzing" = "yes" ; then
4855  # If LIB_FUZZING_ENGINE is set, assume we are running on OSS-Fuzz, and the
4856  # needed CFLAGS have already been provided
4857  if test -z "${LIB_FUZZING_ENGINE+xxx}" ; then
4858    # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
4859    # compiled code.
4860    QEMU_CFLAGS="$QEMU_CFLAGS -fsanitize=fuzzer-no-link"
4861    # To build non-fuzzer binaries with --enable-fuzzing, link everything with
4862    # fsanitize=fuzzer-no-link. Otherwise, the linker will be unable to bind
4863    # the fuzzer-related callbacks added by instrumentation.
4864    QEMU_LDFLAGS="$QEMU_LDFLAGS -fsanitize=fuzzer-no-link"
4865    # For the actual fuzzer binaries, we need to link against the libfuzzer
4866    # library. Provide the flags for doing this in FUZZ_EXE_LDFLAGS. The meson
4867    # rule for the fuzzer adds these to the link_args. They need to be
4868    # configurable, to support OSS-Fuzz
4869    FUZZ_EXE_LDFLAGS="-fsanitize=fuzzer"
4870  else
4871    FUZZ_EXE_LDFLAGS="$LIB_FUZZING_ENGINE"
4872  fi
4873fi
4874
4875if test "$plugins" = "yes" ; then
4876    echo "CONFIG_PLUGIN=y" >> $config_host_mak
4877    # Copy the export object list to the build dir
4878    if test "$ld_dynamic_list" = "yes" ; then
4879	echo "CONFIG_HAS_LD_DYNAMIC_LIST=yes" >> $config_host_mak
4880	ld_symbols=qemu-plugins-ld.symbols
4881	cp "$source_path/plugins/qemu-plugins.symbols" $ld_symbols
4882    elif test "$ld_exported_symbols_list" = "yes" ; then
4883	echo "CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST=yes" >> $config_host_mak
4884	ld64_symbols=qemu-plugins-ld64.symbols
4885	echo "# Automatically generated by configure - do not modify" > $ld64_symbols
4886	grep 'qemu_' "$source_path/plugins/qemu-plugins.symbols" | sed 's/;//g' | \
4887	    sed -E 's/^[[:space:]]*(.*)/_\1/' >> $ld64_symbols
4888    else
4889	error_exit \
4890	    "If \$plugins=yes, either \$ld_dynamic_list or " \
4891	    "\$ld_exported_symbols_list should have been set to 'yes'."
4892    fi
4893fi
4894
4895if test -n "$gdb_bin"; then
4896    gdb_version=$($gdb_bin --version | head -n 1)
4897    if version_ge ${gdb_version##* } 9.1; then
4898        echo "HAVE_GDB_BIN=$gdb_bin" >> $config_host_mak
4899    fi
4900fi
4901
4902if test "$secret_keyring" = "yes" ; then
4903  echo "CONFIG_SECRET_KEYRING=y" >> $config_host_mak
4904fi
4905
4906echo "ROMS=$roms" >> $config_host_mak
4907echo "MAKE=$make" >> $config_host_mak
4908echo "PYTHON=$python" >> $config_host_mak
4909echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
4910echo "MESON=$meson" >> $config_host_mak
4911echo "NINJA=$ninja" >> $config_host_mak
4912echo "CC=$cc" >> $config_host_mak
4913echo "HOST_CC=$host_cc" >> $config_host_mak
4914if $iasl -h > /dev/null 2>&1; then
4915  echo "CONFIG_IASL=$iasl" >> $config_host_mak
4916fi
4917echo "AR=$ar" >> $config_host_mak
4918echo "AS=$as" >> $config_host_mak
4919echo "CCAS=$ccas" >> $config_host_mak
4920echo "CPP=$cpp" >> $config_host_mak
4921echo "OBJCOPY=$objcopy" >> $config_host_mak
4922echo "LD=$ld" >> $config_host_mak
4923echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
4924echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
4925echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
4926echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
4927echo "GLIB_LIBS=$glib_libs" >> $config_host_mak
4928echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
4929echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
4930echo "EXESUF=$EXESUF" >> $config_host_mak
4931echo "HOST_DSOSUF=$HOST_DSOSUF" >> $config_host_mak
4932echo "LIBS_QGA=$libs_qga" >> $config_host_mak
4933if test "$gcov" = "yes" ; then
4934  echo "CONFIG_GCOV=y" >> $config_host_mak
4935fi
4936
4937if test "$fuzzing" != "no"; then
4938    echo "CONFIG_FUZZ=y" >> $config_host_mak
4939fi
4940echo "FUZZ_EXE_LDFLAGS=$FUZZ_EXE_LDFLAGS" >> $config_host_mak
4941
4942if test "$rng_none" = "yes"; then
4943  echo "CONFIG_RNG_NONE=y" >> $config_host_mak
4944fi
4945
4946# use included Linux headers
4947if test "$linux" = "yes" ; then
4948  mkdir -p linux-headers
4949  case "$cpu" in
4950  i386|x86_64|x32)
4951    linux_arch=x86
4952    ;;
4953  ppc|ppc64|ppc64le)
4954    linux_arch=powerpc
4955    ;;
4956  s390x)
4957    linux_arch=s390
4958    ;;
4959  aarch64)
4960    linux_arch=arm64
4961    ;;
4962  mips64)
4963    linux_arch=mips
4964    ;;
4965  *)
4966    # For most CPUs the kernel architecture name and QEMU CPU name match.
4967    linux_arch="$cpu"
4968    ;;
4969  esac
4970    # For non-KVM architectures we will not have asm headers
4971    if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
4972      symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
4973    fi
4974fi
4975
4976for target in $target_list; do
4977    target_dir="$target"
4978    target_name=$(echo $target | cut -d '-' -f 1)
4979    mkdir -p $target_dir
4980    case $target in
4981        *-user) symlink "../qemu-$target_name" "$target_dir/qemu-$target_name" ;;
4982        *) symlink "../qemu-system-$target_name" "$target_dir/qemu-system-$target_name" ;;
4983    esac
4984done
4985
4986echo "CONFIG_QEMU_INTERP_PREFIX=$interp_prefix" | sed 's/%M/@0@/' >> $config_host_mak
4987if test "$default_targets" = "yes"; then
4988  echo "CONFIG_DEFAULT_TARGETS=y" >> $config_host_mak
4989fi
4990
4991if test "$numa" = "yes"; then
4992  echo "CONFIG_NUMA=y" >> $config_host_mak
4993  echo "NUMA_LIBS=$numa_libs" >> $config_host_mak
4994fi
4995
4996if test "$ccache_cpp2" = "yes"; then
4997  echo "export CCACHE_CPP2=y" >> $config_host_mak
4998fi
4999
5000if test "$safe_stack" = "yes"; then
5001  echo "CONFIG_SAFESTACK=y" >> $config_host_mak
5002fi
5003
5004# If we're using a separate build tree, set it up now.
5005# DIRS are directories which we simply mkdir in the build tree;
5006# LINKS are things to symlink back into the source tree
5007# (these can be both files and directories).
5008# Caution: do not add files or directories here using wildcards. This
5009# will result in problems later if a new file matching the wildcard is
5010# added to the source tree -- nothing will cause configure to be rerun
5011# so the build tree will be missing the link back to the new file, and
5012# tests might fail. Prefer to keep the relevant files in their own
5013# directory and symlink the directory instead.
5014# UNLINK is used to remove symlinks from older development versions
5015# that might get into the way when doing "git update" without doing
5016# a "make distclean" in between.
5017DIRS="tests tests/tcg tests/qapi-schema tests/qtest/libqos"
5018DIRS="$DIRS tests/qtest tests/qemu-iotests tests/vm tests/fp tests/qgraph"
5019DIRS="$DIRS docs docs/interop fsdev scsi"
5020DIRS="$DIRS pc-bios/optionrom pc-bios/s390-ccw"
5021DIRS="$DIRS roms/seabios"
5022DIRS="$DIRS contrib/plugins/"
5023LINKS="Makefile"
5024LINKS="$LINKS tests/tcg/Makefile.target"
5025LINKS="$LINKS pc-bios/optionrom/Makefile"
5026LINKS="$LINKS pc-bios/s390-ccw/Makefile"
5027LINKS="$LINKS roms/seabios/Makefile"
5028LINKS="$LINKS pc-bios/qemu-icon.bmp"
5029LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
5030LINKS="$LINKS tests/acceptance tests/data"
5031LINKS="$LINKS tests/qemu-iotests/check"
5032LINKS="$LINKS python"
5033LINKS="$LINKS contrib/plugins/Makefile "
5034UNLINK="pc-bios/keymaps"
5035for bios_file in \
5036    $source_path/pc-bios/*.bin \
5037    $source_path/pc-bios/*.elf \
5038    $source_path/pc-bios/*.lid \
5039    $source_path/pc-bios/*.rom \
5040    $source_path/pc-bios/*.dtb \
5041    $source_path/pc-bios/*.img \
5042    $source_path/pc-bios/openbios-* \
5043    $source_path/pc-bios/u-boot.* \
5044    $source_path/pc-bios/edk2-*.fd.bz2 \
5045    $source_path/pc-bios/palcode-*
5046do
5047    LINKS="$LINKS pc-bios/$(basename $bios_file)"
5048done
5049mkdir -p $DIRS
5050for f in $LINKS ; do
5051    if [ -e "$source_path/$f" ]; then
5052        symlink "$source_path/$f" "$f"
5053    fi
5054done
5055for f in $UNLINK ; do
5056    if [ -L "$f" ]; then
5057        rm -f "$f"
5058    fi
5059done
5060
5061(for i in $cross_cc_vars; do
5062  export $i
5063done
5064export target_list source_path use_containers ARCH
5065$source_path/tests/tcg/configure.sh)
5066
5067# temporary config to build submodules
5068for rom in seabios; do
5069    config_mak=roms/$rom/config.mak
5070    echo "# Automatically generated by configure - do not modify" > $config_mak
5071    echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
5072    echo "AS=$as" >> $config_mak
5073    echo "CCAS=$ccas" >> $config_mak
5074    echo "CC=$cc" >> $config_mak
5075    echo "BCC=bcc" >> $config_mak
5076    echo "CPP=$cpp" >> $config_mak
5077    echo "OBJCOPY=objcopy" >> $config_mak
5078    echo "IASL=$iasl" >> $config_mak
5079    echo "LD=$ld" >> $config_mak
5080    echo "RANLIB=$ranlib" >> $config_mak
5081done
5082
5083if test "$skip_meson" = no; then
5084  cross="config-meson.cross.new"
5085  meson_quote() {
5086    echo "'$(echo $* | sed "s/ /','/g")'"
5087  }
5088
5089  echo "# Automatically generated by configure - do not modify" > $cross
5090  echo "[properties]" >> $cross
5091  test -z "$cxx" && echo "link_language = 'c'" >> $cross
5092  echo "[built-in options]" >> $cross
5093  echo "c_args = [${CFLAGS:+$(meson_quote $CFLAGS)}]" >> $cross
5094  echo "cpp_args = [${CXXFLAGS:+$(meson_quote $CXXFLAGS)}]" >> $cross
5095  echo "c_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
5096  echo "cpp_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
5097  echo "[binaries]" >> $cross
5098  echo "c = [$(meson_quote $cc)]" >> $cross
5099  test -n "$cxx" && echo "cpp = [$(meson_quote $cxx)]" >> $cross
5100  test -n "$objcc" && echo "objc = [$(meson_quote $objcc)]" >> $cross
5101  echo "ar = [$(meson_quote $ar)]" >> $cross
5102  echo "nm = [$(meson_quote $nm)]" >> $cross
5103  echo "pkgconfig = [$(meson_quote $pkg_config_exe)]" >> $cross
5104  echo "ranlib = [$(meson_quote $ranlib)]" >> $cross
5105  if has $sdl2_config; then
5106    echo "sdl2-config = [$(meson_quote $sdl2_config)]" >> $cross
5107  fi
5108  echo "strip = [$(meson_quote $strip)]" >> $cross
5109  echo "windres = [$(meson_quote $windres)]" >> $cross
5110  if test "$cross_compile" = "yes"; then
5111    cross_arg="--cross-file config-meson.cross"
5112    echo "[host_machine]" >> $cross
5113    if test "$mingw32" = "yes" ; then
5114        echo "system = 'windows'" >> $cross
5115    fi
5116    if test "$linux" = "yes" ; then
5117        echo "system = 'linux'" >> $cross
5118    fi
5119    if test "$darwin" = "yes" ; then
5120        echo "system = 'darwin'" >> $cross
5121    fi
5122    case "$ARCH" in
5123        i386)
5124            echo "cpu_family = 'x86'" >> $cross
5125            ;;
5126        x86_64|x32)
5127            echo "cpu_family = 'x86_64'" >> $cross
5128            ;;
5129        ppc64le)
5130            echo "cpu_family = 'ppc64'" >> $cross
5131            ;;
5132        *)
5133            echo "cpu_family = '$ARCH'" >> $cross
5134            ;;
5135    esac
5136    echo "cpu = '$cpu'" >> $cross
5137    if test "$bigendian" = "yes" ; then
5138        echo "endian = 'big'" >> $cross
5139    else
5140        echo "endian = 'little'" >> $cross
5141    fi
5142  else
5143    cross_arg="--native-file config-meson.cross"
5144  fi
5145  mv $cross config-meson.cross
5146
5147  rm -rf meson-private meson-info meson-logs
5148  unset staticpic
5149  if ! version_ge "$($meson --version)" 0.56.0; then
5150    staticpic=$(if test "$pie" = yes; then echo true; else echo false; fi)
5151  fi
5152  NINJA=$ninja $meson setup \
5153        --prefix "$prefix" \
5154        --libdir "$libdir" \
5155        --libexecdir "$libexecdir" \
5156        --bindir "$bindir" \
5157        --includedir "$includedir" \
5158        --datadir "$datadir" \
5159        --mandir "$mandir" \
5160        --sysconfdir "$sysconfdir" \
5161        --localedir "$localedir" \
5162        --localstatedir "$local_statedir" \
5163        -Ddocdir="$docdir" \
5164        -Dqemu_firmwarepath="$firmwarepath" \
5165        -Dqemu_suffix="$qemu_suffix" \
5166        -Doptimization=$(if test "$debug" = yes; then echo 0; else echo 2; fi) \
5167        -Ddebug=$(if test "$debug_info" = yes; then echo true; else echo false; fi) \
5168        -Dwerror=$(if test "$werror" = yes; then echo true; else echo false; fi) \
5169        -Dstrip=$(if test "$strip_opt" = yes; then echo true; else echo false; fi) \
5170        -Db_pie=$(if test "$pie" = yes; then echo true; else echo false; fi) \
5171        ${staticpic:+-Db_staticpic=$staticpic} \
5172        -Db_coverage=$(if test "$gcov" = yes; then echo true; else echo false; fi) \
5173        -Db_lto=$lto -Dcfi=$cfi -Dcfi_debug=$cfi_debug \
5174        -Dmalloc=$malloc -Dmalloc_trim=$malloc_trim -Dsparse=$sparse \
5175        -Dkvm=$kvm -Dhax=$hax -Dwhpx=$whpx -Dhvf=$hvf -Dnvmm=$nvmm \
5176        -Dxen=$xen -Dxen_pci_passthrough=$xen_pci_passthrough -Dtcg=$tcg \
5177        -Dcocoa=$cocoa -Dgtk=$gtk -Dmpath=$mpath -Dsdl=$sdl -Dsdl_image=$sdl_image \
5178        -Dlibusb=$libusb -Dsmartcard=$smartcard -Dusb_redir=$usb_redir -Dvte=$vte \
5179        -Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg -Dvnc_png=$vnc_png \
5180        -Dgettext=$gettext -Dxkbcommon=$xkbcommon -Du2f=$u2f -Dvirtiofsd=$virtiofsd \
5181        -Dcapstone=$capstone -Dslirp=$slirp -Dfdt=$fdt -Dbrlapi=$brlapi \
5182        -Dcurl=$curl -Dglusterfs=$glusterfs -Dbzip2=$bzip2 -Dlibiscsi=$libiscsi \
5183        -Dlibnfs=$libnfs -Diconv=$iconv -Dcurses=$curses -Dlibudev=$libudev\
5184        -Drbd=$rbd -Dlzo=$lzo -Dsnappy=$snappy -Dlzfse=$lzfse -Dlibxml2=$libxml2 \
5185        -Dlibdaxctl=$libdaxctl -Dlibpmem=$libpmem -Dlinux_io_uring=$linux_io_uring \
5186        -Dgnutls=$gnutls -Dnettle=$nettle -Dgcrypt=$gcrypt -Dauth_pam=$auth_pam \
5187        -Dzstd=$zstd -Dseccomp=$seccomp -Dvirtfs=$virtfs -Dcap_ng=$cap_ng \
5188        -Dattr=$attr -Ddefault_devices=$default_devices -Dvirglrenderer=$virglrenderer \
5189        -Ddocs=$docs -Dsphinx_build=$sphinx_build -Dinstall_blobs=$blobs \
5190        -Dvhost_user_blk_server=$vhost_user_blk_server -Dmultiprocess=$multiprocess \
5191        -Dfuse=$fuse -Dfuse_lseek=$fuse_lseek -Dguest_agent_msi=$guest_agent_msi -Dbpf=$bpf\
5192        $(if test "$default_features" = no; then echo "-Dauto_features=disabled"; fi) \
5193	-Dtcg_interpreter=$tcg_interpreter \
5194        $cross_arg \
5195        "$PWD" "$source_path"
5196
5197  if test "$?" -ne 0 ; then
5198      error_exit "meson setup failed"
5199  fi
5200else
5201  if test -f meson-private/cmd_line.txt; then
5202    # Adjust old command line options whose type was changed
5203    # Avoids having to use "setup --wipe" when Meson is upgraded
5204    perl -i -ne '
5205      s/^gettext = true$/gettext = auto/;
5206      s/^gettext = false$/gettext = disabled/;
5207      print;' meson-private/cmd_line.txt
5208  fi
5209fi
5210
5211if test -n "${deprecated_features}"; then
5212    echo "Warning, deprecated features enabled."
5213    echo "Please see docs/system/deprecated.rst"
5214    echo "  features: ${deprecated_features}"
5215fi
5216
5217# Create list of config switches that should be poisoned in common code...
5218# but filter out CONFIG_TCG and CONFIG_USER_ONLY which are special.
5219target_configs_h=$(ls *-config-devices.h *-config-target.h 2>/dev/null)
5220if test -n "$target_configs_h" ; then
5221    sed -n -e '/CONFIG_TCG/d' -e '/CONFIG_USER_ONLY/d' \
5222        -e '/^#define / { s///; s/ .*//; s/^/#pragma GCC poison /p; }' \
5223        $target_configs_h | sort -u > config-poison.h
5224else
5225    :> config-poison.h
5226fi
5227
5228# Save the configure command line for later reuse.
5229cat <<EOD >config.status
5230#!/bin/sh
5231# Generated by configure.
5232# Run this file to recreate the current configuration.
5233# Compiler output produced by configure, useful for debugging
5234# configure, is in config.log if it exists.
5235EOD
5236
5237preserve_env() {
5238    envname=$1
5239
5240    eval envval=\$$envname
5241
5242    if test -n "$envval"
5243    then
5244	echo "$envname='$envval'" >> config.status
5245	echo "export $envname" >> config.status
5246    else
5247	echo "unset $envname" >> config.status
5248    fi
5249}
5250
5251# Preserve various env variables that influence what
5252# features/build target configure will detect
5253preserve_env AR
5254preserve_env AS
5255preserve_env CC
5256preserve_env CPP
5257preserve_env CXX
5258preserve_env INSTALL
5259preserve_env LD
5260preserve_env LD_LIBRARY_PATH
5261preserve_env LIBTOOL
5262preserve_env MAKE
5263preserve_env NM
5264preserve_env OBJCOPY
5265preserve_env PATH
5266preserve_env PKG_CONFIG
5267preserve_env PKG_CONFIG_LIBDIR
5268preserve_env PKG_CONFIG_PATH
5269preserve_env PYTHON
5270preserve_env SDL2_CONFIG
5271preserve_env SMBD
5272preserve_env STRIP
5273preserve_env WINDRES
5274
5275printf "exec" >>config.status
5276for i in "$0" "$@"; do
5277  test "$i" = --skip-meson || printf " %s" "$(quote_sh "$i")" >>config.status
5278done
5279echo ' "$@"' >>config.status
5280chmod +x config.status
5281
5282rm -r "$TMPDIR1"
5283