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