xref: /openbmc/qemu/configure (revision 587d59d6ccd0e73bfe5689d9232804339aa09bdf)
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="$default_feature"
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="$default_feature"
429debug_mutex="no"
430libpmem="$default_feature"
431default_devices="true"
432plugins="no"
433fuzzing="no"
434rng_none="no"
435secret_keyring="$default_feature"
436libdaxctl="$default_feature"
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="no"
1209  ;;
1210  --enable-linux-io-uring) linux_io_uring="yes"
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="no"
1423  ;;
1424  --enable-libxml2) libxml2="yes"
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=yes
1508  ;;
1509  --disable-libpmem) libpmem=no
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=yes
1538  ;;
1539  --disable-libdaxctl) libdaxctl=no
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# Some versions of Mac OS X incorrectly define SIZE_MAX
2380cat > $TMPC << EOF
2381#include <stdint.h>
2382#include <stdio.h>
2383int main(int argc, char *argv[]) {
2384    return printf("%zu", SIZE_MAX);
2385}
2386EOF
2387have_broken_size_max=no
2388if ! compile_object -Werror ; then
2389    have_broken_size_max=yes
2390fi
2391
2392##########################################
2393# L2TPV3 probe
2394
2395cat > $TMPC <<EOF
2396#include <sys/socket.h>
2397#include <linux/ip.h>
2398int main(void) { return sizeof(struct mmsghdr); }
2399EOF
2400if compile_prog "" "" ; then
2401  l2tpv3=yes
2402else
2403  l2tpv3=no
2404fi
2405
2406cat > $TMPC <<EOF
2407#include <sys/mman.h>
2408int main(int argc, char *argv[]) {
2409    return mlockall(MCL_FUTURE);
2410}
2411EOF
2412if compile_prog "" "" ; then
2413  have_mlockall=yes
2414else
2415  have_mlockall=no
2416fi
2417
2418#########################################
2419# vhost interdependencies and host support
2420
2421# vhost backends
2422if test "$vhost_user" = "yes" && test "$linux" != "yes"; then
2423  error_exit "vhost-user is only available on Linux"
2424fi
2425test "$vhost_vdpa" = "" && vhost_vdpa=$linux
2426if test "$vhost_vdpa" = "yes" && test "$linux" != "yes"; then
2427  error_exit "vhost-vdpa is only available on Linux"
2428fi
2429test "$vhost_kernel" = "" && vhost_kernel=$linux
2430if test "$vhost_kernel" = "yes" && test "$linux" != "yes"; then
2431  error_exit "vhost-kernel is only available on Linux"
2432fi
2433
2434# vhost-kernel devices
2435test "$vhost_scsi" = "" && vhost_scsi=$vhost_kernel
2436if test "$vhost_scsi" = "yes" && test "$vhost_kernel" != "yes"; then
2437  error_exit "--enable-vhost-scsi requires --enable-vhost-kernel"
2438fi
2439test "$vhost_vsock" = "" && vhost_vsock=$vhost_kernel
2440if test "$vhost_vsock" = "yes" && test "$vhost_kernel" != "yes"; then
2441  error_exit "--enable-vhost-vsock requires --enable-vhost-kernel"
2442fi
2443
2444# vhost-user backends
2445test "$vhost_net_user" = "" && vhost_net_user=$vhost_user
2446if test "$vhost_net_user" = "yes" && test "$vhost_user" = "no"; then
2447  error_exit "--enable-vhost-net-user requires --enable-vhost-user"
2448fi
2449test "$vhost_crypto" = "" && vhost_crypto=$vhost_user
2450if test "$vhost_crypto" = "yes" && test "$vhost_user" = "no"; then
2451  error_exit "--enable-vhost-crypto requires --enable-vhost-user"
2452fi
2453test "$vhost_user_fs" = "" && vhost_user_fs=$vhost_user
2454if test "$vhost_user_fs" = "yes" && test "$vhost_user" = "no"; then
2455  error_exit "--enable-vhost-user-fs requires --enable-vhost-user"
2456fi
2457#vhost-vdpa backends
2458test "$vhost_net_vdpa" = "" && vhost_net_vdpa=$vhost_vdpa
2459if test "$vhost_net_vdpa" = "yes" && test "$vhost_vdpa" = "no"; then
2460  error_exit "--enable-vhost-net-vdpa requires --enable-vhost-vdpa"
2461fi
2462
2463# OR the vhost-kernel, vhost-vdpa and vhost-user values for simplicity
2464if test "$vhost_net" = ""; then
2465  test "$vhost_net_user" = "yes" && vhost_net=yes
2466  test "$vhost_net_vdpa" = "yes" && vhost_net=yes
2467  test "$vhost_kernel" = "yes" && vhost_net=yes
2468fi
2469
2470##########################################
2471# pkg-config probe
2472
2473if ! has "$pkg_config_exe"; then
2474  error_exit "pkg-config binary '$pkg_config_exe' not found"
2475fi
2476
2477##########################################
2478# NPTL probe
2479
2480if test "$linux_user" = "yes"; then
2481  cat > $TMPC <<EOF
2482#include <sched.h>
2483#include <linux/futex.h>
2484int main(void) {
2485#if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
2486#error bork
2487#endif
2488  return 0;
2489}
2490EOF
2491  if ! compile_object ; then
2492    feature_not_found "nptl" "Install glibc and linux kernel headers."
2493  fi
2494fi
2495
2496##########################################
2497# xen probe
2498
2499if test "$xen" != "disabled" ; then
2500  # Check whether Xen library path is specified via --extra-ldflags to avoid
2501  # overriding this setting with pkg-config output. If not, try pkg-config
2502  # to obtain all needed flags.
2503
2504  if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
2505     $pkg_config --exists xencontrol ; then
2506    xen_ctrl_version="$(printf '%d%02d%02d' \
2507      $($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
2508    xen=enabled
2509    xen_pc="xencontrol xenstore xenforeignmemory xengnttab"
2510    xen_pc="$xen_pc xenevtchn xendevicemodel"
2511    if $pkg_config --exists xentoolcore; then
2512      xen_pc="$xen_pc xentoolcore"
2513    fi
2514    xen_cflags="$($pkg_config --cflags $xen_pc)"
2515    xen_libs="$($pkg_config --libs $xen_pc)"
2516  else
2517
2518    xen_libs="-lxenstore -lxenctrl"
2519    xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
2520
2521    # First we test whether Xen headers and libraries are available.
2522    # If no, we are done and there is no Xen support.
2523    # If yes, more tests are run to detect the Xen version.
2524
2525    # Xen (any)
2526    cat > $TMPC <<EOF
2527#include <xenctrl.h>
2528int main(void) {
2529  return 0;
2530}
2531EOF
2532    if ! compile_prog "" "$xen_libs" ; then
2533      # Xen not found
2534      if test "$xen" = "enabled" ; then
2535        feature_not_found "xen" "Install xen devel"
2536      fi
2537      xen=disabled
2538
2539    # Xen unstable
2540    elif
2541        cat > $TMPC <<EOF &&
2542#undef XC_WANT_COMPAT_DEVICEMODEL_API
2543#define __XEN_TOOLS__
2544#include <xendevicemodel.h>
2545#include <xenforeignmemory.h>
2546int main(void) {
2547  xendevicemodel_handle *xd;
2548  xenforeignmemory_handle *xfmem;
2549
2550  xd = xendevicemodel_open(0, 0);
2551  xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
2552
2553  xfmem = xenforeignmemory_open(0, 0);
2554  xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
2555
2556  return 0;
2557}
2558EOF
2559        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2560      then
2561      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2562      xen_ctrl_version=41100
2563      xen=enabled
2564    elif
2565        cat > $TMPC <<EOF &&
2566#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2567#include <xenforeignmemory.h>
2568#include <xentoolcore.h>
2569int main(void) {
2570  xenforeignmemory_handle *xfmem;
2571
2572  xfmem = xenforeignmemory_open(0, 0);
2573  xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
2574  xentoolcore_restrict_all(0);
2575
2576  return 0;
2577}
2578EOF
2579        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2580      then
2581      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2582      xen_ctrl_version=41000
2583      xen=enabled
2584    elif
2585        cat > $TMPC <<EOF &&
2586#undef XC_WANT_COMPAT_DEVICEMODEL_API
2587#define __XEN_TOOLS__
2588#include <xendevicemodel.h>
2589int main(void) {
2590  xendevicemodel_handle *xd;
2591
2592  xd = xendevicemodel_open(0, 0);
2593  xendevicemodel_close(xd);
2594
2595  return 0;
2596}
2597EOF
2598        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
2599      then
2600      xen_stable_libs="-lxendevicemodel $xen_stable_libs"
2601      xen_ctrl_version=40900
2602      xen=enabled
2603    elif
2604        cat > $TMPC <<EOF &&
2605/*
2606 * If we have stable libs the we don't want the libxc compat
2607 * layers, regardless of what CFLAGS we may have been given.
2608 *
2609 * Also, check if xengnttab_grant_copy_segment_t is defined and
2610 * grant copy operation is implemented.
2611 */
2612#undef XC_WANT_COMPAT_EVTCHN_API
2613#undef XC_WANT_COMPAT_GNTTAB_API
2614#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2615#include <xenctrl.h>
2616#include <xenstore.h>
2617#include <xenevtchn.h>
2618#include <xengnttab.h>
2619#include <xenforeignmemory.h>
2620#include <stdint.h>
2621#include <xen/hvm/hvm_info_table.h>
2622#if !defined(HVM_MAX_VCPUS)
2623# error HVM_MAX_VCPUS not defined
2624#endif
2625int main(void) {
2626  xc_interface *xc = NULL;
2627  xenforeignmemory_handle *xfmem;
2628  xenevtchn_handle *xe;
2629  xengnttab_handle *xg;
2630  xengnttab_grant_copy_segment_t* seg = NULL;
2631
2632  xs_daemon_open();
2633
2634  xc = xc_interface_open(0, 0, 0);
2635  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2636  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2637  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2638  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2639
2640  xfmem = xenforeignmemory_open(0, 0);
2641  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2642
2643  xe = xenevtchn_open(0, 0);
2644  xenevtchn_fd(xe);
2645
2646  xg = xengnttab_open(0, 0);
2647  xengnttab_grant_copy(xg, 0, seg);
2648
2649  return 0;
2650}
2651EOF
2652        compile_prog "" "$xen_libs $xen_stable_libs"
2653      then
2654      xen_ctrl_version=40800
2655      xen=enabled
2656    elif
2657        cat > $TMPC <<EOF &&
2658/*
2659 * If we have stable libs the we don't want the libxc compat
2660 * layers, regardless of what CFLAGS we may have been given.
2661 */
2662#undef XC_WANT_COMPAT_EVTCHN_API
2663#undef XC_WANT_COMPAT_GNTTAB_API
2664#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2665#include <xenctrl.h>
2666#include <xenstore.h>
2667#include <xenevtchn.h>
2668#include <xengnttab.h>
2669#include <xenforeignmemory.h>
2670#include <stdint.h>
2671#include <xen/hvm/hvm_info_table.h>
2672#if !defined(HVM_MAX_VCPUS)
2673# error HVM_MAX_VCPUS not defined
2674#endif
2675int main(void) {
2676  xc_interface *xc = NULL;
2677  xenforeignmemory_handle *xfmem;
2678  xenevtchn_handle *xe;
2679  xengnttab_handle *xg;
2680
2681  xs_daemon_open();
2682
2683  xc = xc_interface_open(0, 0, 0);
2684  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2685  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2686  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2687  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2688
2689  xfmem = xenforeignmemory_open(0, 0);
2690  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2691
2692  xe = xenevtchn_open(0, 0);
2693  xenevtchn_fd(xe);
2694
2695  xg = xengnttab_open(0, 0);
2696  xengnttab_map_grant_ref(xg, 0, 0, 0);
2697
2698  return 0;
2699}
2700EOF
2701        compile_prog "" "$xen_libs $xen_stable_libs"
2702      then
2703      xen_ctrl_version=40701
2704      xen=enabled
2705
2706    # Xen 4.6
2707    elif
2708        cat > $TMPC <<EOF &&
2709#include <xenctrl.h>
2710#include <xenstore.h>
2711#include <stdint.h>
2712#include <xen/hvm/hvm_info_table.h>
2713#if !defined(HVM_MAX_VCPUS)
2714# error HVM_MAX_VCPUS not defined
2715#endif
2716int main(void) {
2717  xc_interface *xc;
2718  xs_daemon_open();
2719  xc = xc_interface_open(0, 0, 0);
2720  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2721  xc_gnttab_open(NULL, 0);
2722  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2723  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2724  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2725  xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
2726  return 0;
2727}
2728EOF
2729        compile_prog "" "$xen_libs"
2730      then
2731      xen_ctrl_version=40600
2732      xen=enabled
2733
2734    # Xen 4.5
2735    elif
2736        cat > $TMPC <<EOF &&
2737#include <xenctrl.h>
2738#include <xenstore.h>
2739#include <stdint.h>
2740#include <xen/hvm/hvm_info_table.h>
2741#if !defined(HVM_MAX_VCPUS)
2742# error HVM_MAX_VCPUS not defined
2743#endif
2744int main(void) {
2745  xc_interface *xc;
2746  xs_daemon_open();
2747  xc = xc_interface_open(0, 0, 0);
2748  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2749  xc_gnttab_open(NULL, 0);
2750  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2751  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2752  xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
2753  return 0;
2754}
2755EOF
2756        compile_prog "" "$xen_libs"
2757      then
2758      xen_ctrl_version=40500
2759      xen=enabled
2760
2761    elif
2762        cat > $TMPC <<EOF &&
2763#include <xenctrl.h>
2764#include <xenstore.h>
2765#include <stdint.h>
2766#include <xen/hvm/hvm_info_table.h>
2767#if !defined(HVM_MAX_VCPUS)
2768# error HVM_MAX_VCPUS not defined
2769#endif
2770int main(void) {
2771  xc_interface *xc;
2772  xs_daemon_open();
2773  xc = xc_interface_open(0, 0, 0);
2774  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2775  xc_gnttab_open(NULL, 0);
2776  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2777  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2778  return 0;
2779}
2780EOF
2781        compile_prog "" "$xen_libs"
2782      then
2783      xen_ctrl_version=40200
2784      xen=enabled
2785
2786    else
2787      if test "$xen" = "enabled" ; then
2788        feature_not_found "xen (unsupported version)" \
2789                          "Install a supported xen (xen 4.2 or newer)"
2790      fi
2791      xen=disabled
2792    fi
2793
2794    if test "$xen" = enabled; then
2795      if test $xen_ctrl_version -ge 40701  ; then
2796        xen_libs="$xen_libs $xen_stable_libs "
2797      fi
2798    fi
2799  fi
2800fi
2801
2802##########################################
2803# RDMA needs OpenFabrics libraries
2804if test "$rdma" != "no" ; then
2805  cat > $TMPC <<EOF
2806#include <rdma/rdma_cma.h>
2807int main(void) { return 0; }
2808EOF
2809  rdma_libs="-lrdmacm -libverbs -libumad"
2810  if compile_prog "" "$rdma_libs" ; then
2811    rdma="yes"
2812  else
2813    if test "$rdma" = "yes" ; then
2814        error_exit \
2815            " OpenFabrics librdmacm/libibverbs/libibumad not present." \
2816            " Your options:" \
2817            "  (1) Fast: Install infiniband packages (devel) from your distro." \
2818            "  (2) Cleanest: Install libraries from www.openfabrics.org" \
2819            "  (3) Also: Install softiwarp if you don't have RDMA hardware"
2820    fi
2821    rdma="no"
2822  fi
2823fi
2824
2825##########################################
2826# PVRDMA detection
2827
2828cat > $TMPC <<EOF &&
2829#include <sys/mman.h>
2830
2831int
2832main(void)
2833{
2834    char buf = 0;
2835    void *addr = &buf;
2836    addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
2837
2838    return 0;
2839}
2840EOF
2841
2842if test "$rdma" = "yes" ; then
2843    case "$pvrdma" in
2844    "")
2845        if compile_prog "" ""; then
2846            pvrdma="yes"
2847        else
2848            pvrdma="no"
2849        fi
2850        ;;
2851    "yes")
2852        if ! compile_prog "" ""; then
2853            error_exit "PVRDMA is not supported since mremap is not implemented"
2854        fi
2855        pvrdma="yes"
2856        ;;
2857    "no")
2858        pvrdma="no"
2859        ;;
2860    esac
2861else
2862    if test "$pvrdma" = "yes" ; then
2863        error_exit "PVRDMA requires rdma suppport"
2864    fi
2865    pvrdma="no"
2866fi
2867
2868# Let's see if enhanced reg_mr is supported
2869if test "$pvrdma" = "yes" ; then
2870
2871cat > $TMPC <<EOF &&
2872#include <infiniband/verbs.h>
2873
2874int
2875main(void)
2876{
2877    struct ibv_mr *mr;
2878    struct ibv_pd *pd = NULL;
2879    size_t length = 10;
2880    uint64_t iova = 0;
2881    int access = 0;
2882    void *addr = NULL;
2883
2884    mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
2885
2886    ibv_dereg_mr(mr);
2887
2888    return 0;
2889}
2890EOF
2891    if ! compile_prog "" "-libverbs"; then
2892        QEMU_CFLAGS="$QEMU_CFLAGS -DLEGACY_RDMA_REG_MR"
2893    fi
2894fi
2895
2896##########################################
2897# xfsctl() probe, used for file-posix.c
2898if test "$xfs" != "no" ; then
2899  cat > $TMPC << EOF
2900#include <stddef.h>  /* NULL */
2901#include <xfs/xfs.h>
2902int main(void)
2903{
2904    xfsctl(NULL, 0, 0, NULL);
2905    return 0;
2906}
2907EOF
2908  if compile_prog "" "" ; then
2909    xfs="yes"
2910  else
2911    if test "$xfs" = "yes" ; then
2912      feature_not_found "xfs" "Install xfsprogs/xfslibs devel"
2913    fi
2914    xfs=no
2915  fi
2916fi
2917
2918##########################################
2919# vde libraries probe
2920if test "$vde" != "no" ; then
2921  vde_libs="-lvdeplug"
2922  cat > $TMPC << EOF
2923#include <libvdeplug.h>
2924int main(void)
2925{
2926    struct vde_open_args a = {0, 0, 0};
2927    char s[] = "";
2928    vde_open(s, s, &a);
2929    return 0;
2930}
2931EOF
2932  if compile_prog "" "$vde_libs" ; then
2933    vde=yes
2934  else
2935    if test "$vde" = "yes" ; then
2936      feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
2937    fi
2938    vde=no
2939  fi
2940fi
2941
2942##########################################
2943# netmap support probe
2944# Apart from looking for netmap headers, we make sure that the host API version
2945# supports the netmap backend (>=11). The upper bound (15) is meant to simulate
2946# a minor/major version number. Minor new features will be marked with values up
2947# to 15, and if something happens that requires a change to the backend we will
2948# move above 15, submit the backend fixes and modify this two bounds.
2949if test "$netmap" != "no" ; then
2950  cat > $TMPC << EOF
2951#include <inttypes.h>
2952#include <net/if.h>
2953#include <net/netmap.h>
2954#include <net/netmap_user.h>
2955#if (NETMAP_API < 11) || (NETMAP_API > 15)
2956#error
2957#endif
2958int main(void) { return 0; }
2959EOF
2960  if compile_prog "" "" ; then
2961    netmap=yes
2962  else
2963    if test "$netmap" = "yes" ; then
2964      feature_not_found "netmap"
2965    fi
2966    netmap=no
2967  fi
2968fi
2969
2970##########################################
2971# detect CoreAudio
2972if test "$coreaudio" != "no" ; then
2973  coreaudio_libs="-framework CoreAudio"
2974  cat > $TMPC << EOF
2975#include <CoreAudio/CoreAudio.h>
2976int main(void)
2977{
2978  return (int)AudioGetCurrentHostTime();
2979}
2980EOF
2981  if compile_prog "" "$coreaudio_libs" ; then
2982    coreaudio=yes
2983  else
2984    coreaudio=no
2985  fi
2986fi
2987
2988##########################################
2989# Sound support libraries probe
2990
2991audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
2992for drv in $audio_drv_list; do
2993    case $drv in
2994    alsa | try-alsa)
2995    if $pkg_config alsa --exists; then
2996        alsa_libs=$($pkg_config alsa --libs)
2997        alsa_cflags=$($pkg_config alsa --cflags)
2998        alsa=yes
2999        if test "$drv" = "try-alsa"; then
3000            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa/alsa/')
3001        fi
3002    else
3003        if test "$drv" = "try-alsa"; then
3004            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa//')
3005        else
3006            error_exit "$drv check failed" \
3007                "Make sure to have the $drv libs and headers installed."
3008        fi
3009    fi
3010    ;;
3011
3012    pa | try-pa)
3013    if $pkg_config libpulse --exists; then
3014        libpulse=yes
3015        pulse_libs=$($pkg_config libpulse --libs)
3016        pulse_cflags=$($pkg_config libpulse --cflags)
3017        if test "$drv" = "try-pa"; then
3018            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa/pa/')
3019        fi
3020    else
3021        if test "$drv" = "try-pa"; then
3022            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa//')
3023        else
3024            error_exit "$drv check failed" \
3025                "Make sure to have the $drv libs and headers installed."
3026        fi
3027    fi
3028    ;;
3029
3030    sdl)
3031    if test "$sdl" = "no"; then
3032        error_exit "sdl not found or disabled, can not use sdl audio driver"
3033    fi
3034    ;;
3035
3036    try-sdl)
3037    if test "$sdl" = "no"; then
3038        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl//')
3039    else
3040        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl/sdl/')
3041    fi
3042    ;;
3043
3044    coreaudio | try-coreaudio)
3045    if test "$coreaudio" = "no"; then
3046      if test "$drv" = "try-coreaudio"; then
3047        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-coreaudio//')
3048      else
3049        error_exit "$drv check failed" \
3050                "Make sure to have the $drv is available."
3051      fi
3052    else
3053      coreaudio_libs="-framework CoreAudio"
3054      if test "$drv" = "try-coreaudio"; then
3055        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-coreaudio/coreaudio/')
3056      fi
3057    fi
3058    ;;
3059
3060    dsound)
3061      dsound_libs="-lole32 -ldxguid"
3062      audio_win_int="yes"
3063    ;;
3064
3065    oss)
3066      oss_libs="$oss_lib"
3067    ;;
3068
3069    jack | try-jack)
3070    if $pkg_config jack --exists; then
3071        libjack=yes
3072        jack_libs=$($pkg_config jack --libs)
3073        if test "$drv" = "try-jack"; then
3074            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack/jack/')
3075        fi
3076    else
3077        if test "$drv" = "try-jack"; then
3078            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack//')
3079        else
3080            error_exit "$drv check failed" \
3081                "Make sure to have the $drv libs and headers installed."
3082        fi
3083    fi
3084    ;;
3085
3086    *)
3087    echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
3088        error_exit "Unknown driver '$drv' selected" \
3089            "Possible drivers are: $audio_possible_drivers"
3090    }
3091    ;;
3092    esac
3093done
3094
3095##########################################
3096# glib support probe
3097
3098glib_req_ver=2.56
3099glib_modules=gthread-2.0
3100if test "$modules" = yes; then
3101    glib_modules="$glib_modules gmodule-export-2.0"
3102fi
3103if test "$plugins" = yes; then
3104    glib_modules="$glib_modules gmodule-2.0"
3105fi
3106
3107for i in $glib_modules; do
3108    if $pkg_config --atleast-version=$glib_req_ver $i; then
3109        glib_cflags=$($pkg_config --cflags $i)
3110        glib_libs=$($pkg_config --libs $i)
3111    else
3112        error_exit "glib-$glib_req_ver $i is required to compile QEMU"
3113    fi
3114done
3115
3116# This workaround is required due to a bug in pkg-config file for glib as it
3117# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
3118
3119if test "$static" = yes && test "$mingw32" = yes; then
3120    glib_cflags="-DGLIB_STATIC_COMPILATION $glib_cflags"
3121fi
3122
3123if ! test "$gio" = "no"; then
3124    pass=no
3125    if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
3126        gio_cflags=$($pkg_config --cflags gio-2.0)
3127        gio_libs=$($pkg_config --libs gio-2.0)
3128        gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
3129        if ! has "$gdbus_codegen"; then
3130            gdbus_codegen=
3131        fi
3132        # Check that the libraries actually work -- Ubuntu 18.04 ships
3133        # with pkg-config --static --libs data for gio-2.0 that is missing
3134        # -lblkid and will give a link error.
3135        cat > $TMPC <<EOF
3136#include <gio/gio.h>
3137int main(void)
3138{
3139    g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
3140    return 0;
3141}
3142EOF
3143        if compile_prog "$gio_cflags" "$gio_libs" ; then
3144            pass=yes
3145        else
3146            pass=no
3147        fi
3148
3149        if test "$pass" = "yes" &&
3150            $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
3151            gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
3152            gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
3153        fi
3154    fi
3155
3156    if test "$pass" = "no"; then
3157        if test "$gio" = "yes"; then
3158            feature_not_found "gio" "Install libgio >= 2.0"
3159        else
3160            gio=no
3161        fi
3162    else
3163        gio=yes
3164    fi
3165fi
3166
3167# Sanity check that the current size_t matches the
3168# size that glib thinks it should be. This catches
3169# problems on multi-arch where people try to build
3170# 32-bit QEMU while pointing at 64-bit glib headers
3171cat > $TMPC <<EOF
3172#include <glib.h>
3173#include <unistd.h>
3174
3175#define QEMU_BUILD_BUG_ON(x) \
3176  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
3177
3178int main(void) {
3179   QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
3180   return 0;
3181}
3182EOF
3183
3184if ! compile_prog "$glib_cflags" "$glib_libs" ; then
3185    error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
3186               "You probably need to set PKG_CONFIG_LIBDIR"\
3187	       "to point to the right pkg-config files for your"\
3188	       "build target"
3189fi
3190
3191# Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
3192cat > $TMPC << EOF
3193#include <glib.h>
3194int main(void) { return 0; }
3195EOF
3196if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3197    if cc_has_warning_flag "-Wno-unknown-attributes"; then
3198        glib_cflags="-Wno-unknown-attributes $glib_cflags"
3199        CONFIGURE_CFLAGS="-Wno-unknown-attributes $CONFIGURE_CFLAGS"
3200    fi
3201fi
3202
3203# Silence clang warnings triggered by glib < 2.57.2
3204cat > $TMPC << EOF
3205#include <glib.h>
3206typedef struct Foo {
3207    int i;
3208} Foo;
3209static void foo_free(Foo *f)
3210{
3211    g_free(f);
3212}
3213G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free);
3214int main(void) { return 0; }
3215EOF
3216if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3217    if cc_has_warning_flag "-Wno-unused-function"; then
3218        glib_cflags="$glib_cflags -Wno-unused-function"
3219        CONFIGURE_CFLAGS="$CONFIGURE_CFLAGS -Wno-unused-function"
3220    fi
3221fi
3222
3223##########################################
3224# SHA command probe for modules
3225if test "$modules" = yes; then
3226    shacmd_probe="sha1sum sha1 shasum"
3227    for c in $shacmd_probe; do
3228        if has $c; then
3229            shacmd="$c"
3230            break
3231        fi
3232    done
3233    if test "$shacmd" = ""; then
3234        error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
3235    fi
3236fi
3237
3238##########################################
3239# pthread probe
3240PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
3241
3242pthread=no
3243cat > $TMPC << EOF
3244#include <pthread.h>
3245static void *f(void *p) { return NULL; }
3246int main(void) {
3247  pthread_t thread;
3248  pthread_create(&thread, 0, f, 0);
3249  return 0;
3250}
3251EOF
3252if compile_prog "" "" ; then
3253  pthread=yes
3254else
3255  for pthread_lib in $PTHREADLIBS_LIST; do
3256    if compile_prog "" "$pthread_lib" ; then
3257      pthread=yes
3258      break
3259    fi
3260  done
3261fi
3262
3263if test "$mingw32" != yes && test "$pthread" = no; then
3264  error_exit "pthread check failed" \
3265      "Make sure to have the pthread libs and headers installed."
3266fi
3267
3268# check for pthread_setname_np with thread id
3269pthread_setname_np_w_tid=no
3270cat > $TMPC << EOF
3271#include <pthread.h>
3272
3273static void *f(void *p) { return NULL; }
3274int main(void)
3275{
3276    pthread_t thread;
3277    pthread_create(&thread, 0, f, 0);
3278    pthread_setname_np(thread, "QEMU");
3279    return 0;
3280}
3281EOF
3282if compile_prog "" "$pthread_lib" ; then
3283  pthread_setname_np_w_tid=yes
3284fi
3285
3286# check for pthread_setname_np without thread id
3287pthread_setname_np_wo_tid=no
3288cat > $TMPC << EOF
3289#include <pthread.h>
3290
3291static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
3292int main(void)
3293{
3294    pthread_t thread;
3295    pthread_create(&thread, 0, f, 0);
3296    return 0;
3297}
3298EOF
3299if compile_prog "" "$pthread_lib" ; then
3300  pthread_setname_np_wo_tid=yes
3301fi
3302
3303##########################################
3304# libssh probe
3305if test "$libssh" != "no" ; then
3306  if $pkg_config --exists "libssh >= 0.8.7"; then
3307    libssh_cflags=$($pkg_config libssh --cflags)
3308    libssh_libs=$($pkg_config libssh --libs)
3309    libssh=yes
3310  else
3311    if test "$libssh" = "yes" ; then
3312      error_exit "libssh required for --enable-libssh"
3313    fi
3314    libssh=no
3315  fi
3316fi
3317
3318##########################################
3319# linux-aio probe
3320
3321if test "$linux_aio" != "no" ; then
3322  cat > $TMPC <<EOF
3323#include <libaio.h>
3324#include <sys/eventfd.h>
3325#include <stddef.h>
3326int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
3327EOF
3328  if compile_prog "" "-laio" ; then
3329    linux_aio=yes
3330  else
3331    if test "$linux_aio" = "yes" ; then
3332      feature_not_found "linux AIO" "Install libaio devel"
3333    fi
3334    linux_aio=no
3335  fi
3336fi
3337##########################################
3338# linux-io-uring probe
3339
3340if test "$linux_io_uring" != "no" ; then
3341  if $pkg_config liburing; then
3342    linux_io_uring_cflags=$($pkg_config --cflags liburing)
3343    linux_io_uring_libs=$($pkg_config --libs liburing)
3344    linux_io_uring=yes
3345  else
3346    if test "$linux_io_uring" = "yes" ; then
3347      feature_not_found "linux io_uring" "Install liburing devel"
3348    fi
3349    linux_io_uring=no
3350  fi
3351fi
3352
3353##########################################
3354# TPM emulation is only on POSIX
3355
3356if test "$tpm" = ""; then
3357  if test "$mingw32" = "yes"; then
3358    tpm=no
3359  else
3360    tpm=yes
3361  fi
3362elif test "$tpm" = "yes"; then
3363  if test "$mingw32" = "yes" ; then
3364    error_exit "TPM emulation only available on POSIX systems"
3365  fi
3366fi
3367
3368##########################################
3369# iovec probe
3370cat > $TMPC <<EOF
3371#include <sys/types.h>
3372#include <sys/uio.h>
3373#include <unistd.h>
3374int main(void) { return sizeof(struct iovec); }
3375EOF
3376iovec=no
3377if compile_prog "" "" ; then
3378  iovec=yes
3379fi
3380
3381##########################################
3382# fdt probe
3383
3384case "$fdt" in
3385  auto | enabled | internal)
3386    # Simpler to always update submodule, even if not needed.
3387    git_submodules="${git_submodules} dtc"
3388    ;;
3389esac
3390
3391##########################################
3392# opengl probe (for sdl2, gtk)
3393
3394gbm="no"
3395if $pkg_config gbm; then
3396    gbm_cflags="$($pkg_config --cflags gbm)"
3397    gbm_libs="$($pkg_config --libs gbm)"
3398    gbm="yes"
3399fi
3400
3401if test "$opengl" != "no" ; then
3402  epoxy=no
3403  if $pkg_config epoxy; then
3404    cat > $TMPC << EOF
3405#include <epoxy/egl.h>
3406int main(void) { return 0; }
3407EOF
3408    if compile_prog "" "" ; then
3409      epoxy=yes
3410    fi
3411  fi
3412
3413  if test "$epoxy" = "yes" ; then
3414    opengl_cflags="$($pkg_config --cflags epoxy)"
3415    opengl_libs="$($pkg_config --libs epoxy)"
3416    opengl=yes
3417  else
3418    if test "$opengl" = "yes" ; then
3419      feature_not_found "opengl" "Please install epoxy with EGL"
3420    fi
3421    opengl_cflags=""
3422    opengl_libs=""
3423    opengl=no
3424  fi
3425fi
3426
3427##########################################
3428# libxml2 probe
3429if test "$libxml2" != "no" ; then
3430    if $pkg_config --exists libxml-2.0; then
3431        libxml2="yes"
3432        libxml2_cflags=$($pkg_config --cflags libxml-2.0)
3433        libxml2_libs=$($pkg_config --libs libxml-2.0)
3434    else
3435        if test "$libxml2" = "yes"; then
3436            feature_not_found "libxml2" "Install libxml2 devel"
3437        fi
3438        libxml2="no"
3439    fi
3440fi
3441
3442# Check for inotify functions when we are building linux-user
3443# emulator.  This is done because older glibc versions don't
3444# have syscall stubs for these implemented.  In that case we
3445# don't provide them even if kernel supports them.
3446#
3447inotify=no
3448cat > $TMPC << EOF
3449#include <sys/inotify.h>
3450
3451int
3452main(void)
3453{
3454	/* try to start inotify */
3455	return inotify_init();
3456}
3457EOF
3458if compile_prog "" "" ; then
3459  inotify=yes
3460fi
3461
3462inotify1=no
3463cat > $TMPC << EOF
3464#include <sys/inotify.h>
3465
3466int
3467main(void)
3468{
3469    /* try to start inotify */
3470    return inotify_init1(0);
3471}
3472EOF
3473if compile_prog "" "" ; then
3474  inotify1=yes
3475fi
3476
3477# check if pipe2 is there
3478pipe2=no
3479cat > $TMPC << EOF
3480#include <unistd.h>
3481#include <fcntl.h>
3482
3483int main(void)
3484{
3485    int pipefd[2];
3486    return pipe2(pipefd, O_CLOEXEC);
3487}
3488EOF
3489if compile_prog "" "" ; then
3490  pipe2=yes
3491fi
3492
3493# check if accept4 is there
3494accept4=no
3495cat > $TMPC << EOF
3496#include <sys/socket.h>
3497#include <stddef.h>
3498
3499int main(void)
3500{
3501    accept4(0, NULL, NULL, SOCK_CLOEXEC);
3502    return 0;
3503}
3504EOF
3505if compile_prog "" "" ; then
3506  accept4=yes
3507fi
3508
3509# check if tee/splice is there. vmsplice was added same time.
3510splice=no
3511cat > $TMPC << EOF
3512#include <unistd.h>
3513#include <fcntl.h>
3514#include <limits.h>
3515
3516int main(void)
3517{
3518    int len, fd = 0;
3519    len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
3520    splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
3521    return 0;
3522}
3523EOF
3524if compile_prog "" "" ; then
3525  splice=yes
3526fi
3527
3528##########################################
3529# libnuma probe
3530
3531if test "$numa" != "no" ; then
3532  cat > $TMPC << EOF
3533#include <numa.h>
3534int main(void) { return numa_available(); }
3535EOF
3536
3537  if compile_prog "" "-lnuma" ; then
3538    numa=yes
3539    numa_libs="-lnuma"
3540  else
3541    if test "$numa" = "yes" ; then
3542      feature_not_found "numa" "install numactl devel"
3543    fi
3544    numa=no
3545  fi
3546fi
3547
3548malloc=system
3549if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
3550    echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
3551    exit 1
3552elif test "$tcmalloc" = "yes" ; then
3553    malloc=tcmalloc
3554elif test "$jemalloc" = "yes" ; then
3555    malloc=jemalloc
3556fi
3557
3558##########################################
3559# signalfd probe
3560signalfd="no"
3561cat > $TMPC << EOF
3562#include <unistd.h>
3563#include <sys/syscall.h>
3564#include <signal.h>
3565int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }
3566EOF
3567
3568if compile_prog "" "" ; then
3569  signalfd=yes
3570fi
3571
3572# check if optreset global is declared by <getopt.h>
3573optreset="no"
3574cat > $TMPC << EOF
3575#include <getopt.h>
3576int main(void) { return optreset; }
3577EOF
3578
3579if compile_prog "" "" ; then
3580  optreset=yes
3581fi
3582
3583# check if eventfd is supported
3584eventfd=no
3585cat > $TMPC << EOF
3586#include <sys/eventfd.h>
3587
3588int main(void)
3589{
3590    return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
3591}
3592EOF
3593if compile_prog "" "" ; then
3594  eventfd=yes
3595fi
3596
3597# check if memfd is supported
3598memfd=no
3599cat > $TMPC << EOF
3600#include <sys/mman.h>
3601
3602int main(void)
3603{
3604    return memfd_create("foo", MFD_ALLOW_SEALING);
3605}
3606EOF
3607if compile_prog "" "" ; then
3608  memfd=yes
3609fi
3610
3611# check for usbfs
3612have_usbfs=no
3613if test "$linux_user" = "yes"; then
3614  cat > $TMPC << EOF
3615#include <linux/usbdevice_fs.h>
3616
3617#ifndef USBDEVFS_GET_CAPABILITIES
3618#error "USBDEVFS_GET_CAPABILITIES undefined"
3619#endif
3620
3621#ifndef USBDEVFS_DISCONNECT_CLAIM
3622#error "USBDEVFS_DISCONNECT_CLAIM undefined"
3623#endif
3624
3625int main(void)
3626{
3627    return 0;
3628}
3629EOF
3630  if compile_prog "" ""; then
3631    have_usbfs=yes
3632  fi
3633fi
3634
3635# check for fallocate
3636fallocate=no
3637cat > $TMPC << EOF
3638#include <fcntl.h>
3639
3640int main(void)
3641{
3642    fallocate(0, 0, 0, 0);
3643    return 0;
3644}
3645EOF
3646if compile_prog "" "" ; then
3647  fallocate=yes
3648fi
3649
3650# check for fallocate hole punching
3651fallocate_punch_hole=no
3652cat > $TMPC << EOF
3653#include <fcntl.h>
3654#include <linux/falloc.h>
3655
3656int main(void)
3657{
3658    fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
3659    return 0;
3660}
3661EOF
3662if compile_prog "" "" ; then
3663  fallocate_punch_hole=yes
3664fi
3665
3666# check that fallocate supports range zeroing inside the file
3667fallocate_zero_range=no
3668cat > $TMPC << EOF
3669#include <fcntl.h>
3670#include <linux/falloc.h>
3671
3672int main(void)
3673{
3674    fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0);
3675    return 0;
3676}
3677EOF
3678if compile_prog "" "" ; then
3679  fallocate_zero_range=yes
3680fi
3681
3682# check for posix_fallocate
3683posix_fallocate=no
3684cat > $TMPC << EOF
3685#include <fcntl.h>
3686
3687int main(void)
3688{
3689    posix_fallocate(0, 0, 0);
3690    return 0;
3691}
3692EOF
3693if compile_prog "" "" ; then
3694    posix_fallocate=yes
3695fi
3696
3697# check for sync_file_range
3698sync_file_range=no
3699cat > $TMPC << EOF
3700#include <fcntl.h>
3701
3702int main(void)
3703{
3704    sync_file_range(0, 0, 0, 0);
3705    return 0;
3706}
3707EOF
3708if compile_prog "" "" ; then
3709  sync_file_range=yes
3710fi
3711
3712# check for linux/fiemap.h and FS_IOC_FIEMAP
3713fiemap=no
3714cat > $TMPC << EOF
3715#include <sys/ioctl.h>
3716#include <linux/fs.h>
3717#include <linux/fiemap.h>
3718
3719int main(void)
3720{
3721    ioctl(0, FS_IOC_FIEMAP, 0);
3722    return 0;
3723}
3724EOF
3725if compile_prog "" "" ; then
3726  fiemap=yes
3727fi
3728
3729# check for dup3
3730dup3=no
3731cat > $TMPC << EOF
3732#include <unistd.h>
3733
3734int main(void)
3735{
3736    dup3(0, 0, 0);
3737    return 0;
3738}
3739EOF
3740if compile_prog "" "" ; then
3741  dup3=yes
3742fi
3743
3744# check for ppoll support
3745ppoll=no
3746cat > $TMPC << EOF
3747#include <poll.h>
3748
3749int main(void)
3750{
3751    struct pollfd pfd = { .fd = 0, .events = 0, .revents = 0 };
3752    ppoll(&pfd, 1, 0, 0);
3753    return 0;
3754}
3755EOF
3756if compile_prog "" "" ; then
3757  ppoll=yes
3758fi
3759
3760# check for prctl(PR_SET_TIMERSLACK , ... ) support
3761prctl_pr_set_timerslack=no
3762cat > $TMPC << EOF
3763#include <sys/prctl.h>
3764
3765int main(void)
3766{
3767    prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0);
3768    return 0;
3769}
3770EOF
3771if compile_prog "" "" ; then
3772  prctl_pr_set_timerslack=yes
3773fi
3774
3775# check for epoll support
3776epoll=no
3777cat > $TMPC << EOF
3778#include <sys/epoll.h>
3779
3780int main(void)
3781{
3782    epoll_create(0);
3783    return 0;
3784}
3785EOF
3786if compile_prog "" "" ; then
3787  epoll=yes
3788fi
3789
3790# epoll_create1 is a later addition
3791# so we must check separately for its presence
3792epoll_create1=no
3793cat > $TMPC << EOF
3794#include <sys/epoll.h>
3795
3796int main(void)
3797{
3798    /* Note that we use epoll_create1 as a value, not as
3799     * a function being called. This is necessary so that on
3800     * old SPARC glibc versions where the function was present in
3801     * the library but not declared in the header file we will
3802     * fail the configure check. (Otherwise we will get a compiler
3803     * warning but not an error, and will proceed to fail the
3804     * qemu compile where we compile with -Werror.)
3805     */
3806    return (int)(uintptr_t)&epoll_create1;
3807}
3808EOF
3809if compile_prog "" "" ; then
3810  epoll_create1=yes
3811fi
3812
3813# check for sendfile support
3814sendfile=no
3815cat > $TMPC << EOF
3816#include <sys/sendfile.h>
3817
3818int main(void)
3819{
3820    return sendfile(0, 0, 0, 0);
3821}
3822EOF
3823if compile_prog "" "" ; then
3824  sendfile=yes
3825fi
3826
3827# check for timerfd support (glibc 2.8 and newer)
3828timerfd=no
3829cat > $TMPC << EOF
3830#include <sys/timerfd.h>
3831
3832int main(void)
3833{
3834    return(timerfd_create(CLOCK_REALTIME, 0));
3835}
3836EOF
3837if compile_prog "" "" ; then
3838  timerfd=yes
3839fi
3840
3841# check for setns and unshare support
3842setns=no
3843cat > $TMPC << EOF
3844#include <sched.h>
3845
3846int main(void)
3847{
3848    int ret;
3849    ret = setns(0, 0);
3850    ret = unshare(0);
3851    return ret;
3852}
3853EOF
3854if compile_prog "" "" ; then
3855  setns=yes
3856fi
3857
3858# clock_adjtime probe
3859clock_adjtime=no
3860cat > $TMPC <<EOF
3861#include <time.h>
3862#include <sys/timex.h>
3863
3864int main(void)
3865{
3866    return clock_adjtime(0, 0);
3867}
3868EOF
3869clock_adjtime=no
3870if compile_prog "" "" ; then
3871  clock_adjtime=yes
3872fi
3873
3874# syncfs probe
3875syncfs=no
3876cat > $TMPC <<EOF
3877#include <unistd.h>
3878
3879int main(void)
3880{
3881    return syncfs(0);
3882}
3883EOF
3884syncfs=no
3885if compile_prog "" "" ; then
3886  syncfs=yes
3887fi
3888
3889# Search for bswap_32 function
3890byteswap_h=no
3891cat > $TMPC << EOF
3892#include <byteswap.h>
3893int main(void) { return bswap_32(0); }
3894EOF
3895if compile_prog "" "" ; then
3896  byteswap_h=yes
3897fi
3898
3899# Search for bswap32 function
3900bswap_h=no
3901cat > $TMPC << EOF
3902#include <sys/endian.h>
3903#include <sys/types.h>
3904#include <machine/bswap.h>
3905int main(void) { return bswap32(0); }
3906EOF
3907if compile_prog "" "" ; then
3908  bswap_h=yes
3909fi
3910
3911# Check whether we have openpty() in either libc or libutil
3912cat > $TMPC << EOF
3913extern int openpty(int *am, int *as, char *name, void *termp, void *winp);
3914int main(void) { return openpty(0, 0, 0, 0, 0); }
3915EOF
3916
3917have_openpty="no"
3918if compile_prog "" "" ; then
3919  have_openpty="yes"
3920else
3921  if compile_prog "" "-lutil" ; then
3922    have_openpty="yes"
3923  fi
3924fi
3925
3926##########################################
3927# spice probe
3928if test "$spice_protocol" != "no" ; then
3929  spice_protocol_cflags=$($pkg_config --cflags spice-protocol 2>/dev/null)
3930  if $pkg_config --atleast-version=0.12.3 spice-protocol; then
3931    spice_protocol="yes"
3932  else
3933    if test "$spice_protocol" = "yes" ; then
3934      feature_not_found "spice_protocol" \
3935          "Install spice-protocol(>=0.12.3) devel"
3936    fi
3937    spice_protocol="no"
3938  fi
3939fi
3940
3941if test "$spice" != "no" ; then
3942  cat > $TMPC << EOF
3943#include <spice.h>
3944int main(void) { spice_server_new(); return 0; }
3945EOF
3946  spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
3947  spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
3948  if $pkg_config --atleast-version=0.12.5 spice-server && \
3949     test "$spice_protocol" = "yes" && \
3950     compile_prog "$spice_cflags" "$spice_libs" ; then
3951    spice="yes"
3952  else
3953    if test "$spice" = "yes" ; then
3954      feature_not_found "spice" \
3955          "Install spice-server(>=0.12.5) devel"
3956    fi
3957    spice="no"
3958  fi
3959fi
3960
3961##########################################
3962# check if we have VSS SDK headers for win
3963
3964if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
3965        test "$vss_win32_sdk" != "no" ; then
3966  case "$vss_win32_sdk" in
3967    "")   vss_win32_include="-isystem $source_path" ;;
3968    *\ *) # The SDK is installed in "Program Files" by default, but we cannot
3969          # handle path with spaces. So we symlink the headers into ".sdk/vss".
3970          vss_win32_include="-isystem $source_path/.sdk/vss"
3971	  symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
3972	  ;;
3973    *)    vss_win32_include="-isystem $vss_win32_sdk"
3974  esac
3975  cat > $TMPC << EOF
3976#define __MIDL_user_allocate_free_DEFINED__
3977#include <inc/win2003/vss.h>
3978int main(void) { return VSS_CTX_BACKUP; }
3979EOF
3980  if compile_prog "$vss_win32_include" "" ; then
3981    guest_agent_with_vss="yes"
3982    QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
3983    libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
3984    qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
3985  else
3986    if test "$vss_win32_sdk" != "" ; then
3987      echo "ERROR: Please download and install Microsoft VSS SDK:"
3988      echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
3989      echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
3990      echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
3991      echo "ERROR: The headers are extracted in the directory \`inc'."
3992      feature_not_found "VSS support"
3993    fi
3994    guest_agent_with_vss="no"
3995  fi
3996fi
3997
3998##########################################
3999# lookup Windows platform SDK (if not specified)
4000# The SDK is needed only to build .tlb (type library) file of guest agent
4001# VSS provider from the source. It is usually unnecessary because the
4002# pre-compiled .tlb file is included.
4003
4004if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
4005        test "$guest_agent_with_vss" = "yes" ; then
4006  if test -z "$win_sdk"; then
4007    programfiles="$PROGRAMFILES"
4008    test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
4009    if test -n "$programfiles"; then
4010      win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
4011    else
4012      feature_not_found "Windows SDK"
4013    fi
4014  elif test "$win_sdk" = "no"; then
4015    win_sdk=""
4016  fi
4017fi
4018
4019##########################################
4020# check if mingw environment provides a recent ntddscsi.h
4021if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
4022  cat > $TMPC << EOF
4023#include <windows.h>
4024#include <ntddscsi.h>
4025int main(void) {
4026#if !defined(IOCTL_SCSI_GET_ADDRESS)
4027#error Missing required ioctl definitions
4028#endif
4029  SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
4030  return addr.Lun;
4031}
4032EOF
4033  if compile_prog "" "" ; then
4034    guest_agent_ntddscsi=yes
4035    libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
4036  fi
4037fi
4038
4039##########################################
4040# capstone
4041
4042case "$capstone" in
4043  auto | enabled | internal)
4044    # Simpler to always update submodule, even if not needed.
4045    git_submodules="${git_submodules} capstone"
4046    ;;
4047esac
4048
4049##########################################
4050# check if we have fdatasync
4051
4052fdatasync=no
4053cat > $TMPC << EOF
4054#include <unistd.h>
4055int main(void) {
4056#if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
4057return fdatasync(0);
4058#else
4059#error Not supported
4060#endif
4061}
4062EOF
4063if compile_prog "" "" ; then
4064    fdatasync=yes
4065fi
4066
4067##########################################
4068# check if we have madvise
4069
4070madvise=no
4071cat > $TMPC << EOF
4072#include <sys/types.h>
4073#include <sys/mman.h>
4074#include <stddef.h>
4075int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }
4076EOF
4077if compile_prog "" "" ; then
4078    madvise=yes
4079fi
4080
4081##########################################
4082# check if we have posix_madvise
4083
4084posix_madvise=no
4085cat > $TMPC << EOF
4086#include <sys/mman.h>
4087#include <stddef.h>
4088int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }
4089EOF
4090if compile_prog "" "" ; then
4091    posix_madvise=yes
4092fi
4093
4094##########################################
4095# check if we have posix_memalign()
4096
4097posix_memalign=no
4098cat > $TMPC << EOF
4099#include <stdlib.h>
4100int main(void) {
4101    void *p;
4102    return posix_memalign(&p, 8, 8);
4103}
4104EOF
4105if compile_prog "" "" ; then
4106    posix_memalign=yes
4107fi
4108
4109##########################################
4110# check if we have posix_syslog
4111
4112posix_syslog=no
4113cat > $TMPC << EOF
4114#include <syslog.h>
4115int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; }
4116EOF
4117if compile_prog "" "" ; then
4118    posix_syslog=yes
4119fi
4120
4121##########################################
4122# check if we have sem_timedwait
4123
4124sem_timedwait=no
4125cat > $TMPC << EOF
4126#include <semaphore.h>
4127int main(void) { sem_t s; struct timespec t = {0}; return sem_timedwait(&s, &t); }
4128EOF
4129if compile_prog "" "" ; then
4130    sem_timedwait=yes
4131fi
4132
4133##########################################
4134# check if we have strchrnul
4135
4136strchrnul=no
4137cat > $TMPC << EOF
4138#include <string.h>
4139int main(void);
4140// Use a haystack that the compiler shouldn't be able to constant fold
4141char *haystack = (char*)&main;
4142int main(void) { return strchrnul(haystack, 'x') != &haystack[6]; }
4143EOF
4144if compile_prog "" "" ; then
4145    strchrnul=yes
4146fi
4147
4148#########################################
4149# check if we have st_atim
4150
4151st_atim=no
4152cat > $TMPC << EOF
4153#include <sys/stat.h>
4154#include <stddef.h>
4155int main(void) { return offsetof(struct stat, st_atim); }
4156EOF
4157if compile_prog "" "" ; then
4158    st_atim=yes
4159fi
4160
4161##########################################
4162# check if we have sigev_notify_thread_id
4163
4164sigev_notify_thread_id=no
4165cat > $TMPC << EOF
4166#include <stddef.h>
4167#include <signal.h>
4168int main(void) { return offsetof(struct sigevent, sigev_notify_thread_id); }
4169EOF
4170if compile_prog "" "" ; then
4171    sigev_notify_thread_id=yes
4172fi
4173
4174##########################################
4175# check if trace backend exists
4176
4177$python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
4178if test "$?" -ne 0 ; then
4179  error_exit "invalid trace backends" \
4180      "Please choose supported trace backends."
4181fi
4182
4183##########################################
4184# For 'ust' backend, test if ust headers are present
4185if have_backend "ust"; then
4186  cat > $TMPC << EOF
4187#include <lttng/tracepoint.h>
4188int main(void) { return 0; }
4189EOF
4190  if compile_prog "" "-Wl,--no-as-needed -ldl" ; then
4191    if $pkg_config lttng-ust --exists; then
4192      lttng_ust_libs=$($pkg_config --libs lttng-ust)
4193    else
4194      lttng_ust_libs="-llttng-ust -ldl"
4195    fi
4196    if $pkg_config liburcu-bp --exists; then
4197      urcu_bp_libs=$($pkg_config --libs liburcu-bp)
4198    else
4199      urcu_bp_libs="-lurcu-bp"
4200    fi
4201  else
4202    error_exit "Trace backend 'ust' missing lttng-ust header files"
4203  fi
4204fi
4205
4206##########################################
4207# For 'dtrace' backend, test if 'dtrace' command is present
4208if have_backend "dtrace"; then
4209  if ! has 'dtrace' ; then
4210    error_exit "dtrace command is not found in PATH $PATH"
4211  fi
4212  trace_backend_stap="no"
4213  if has 'stap' ; then
4214    trace_backend_stap="yes"
4215
4216    # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
4217    # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
4218    # instead. QEMU --enable-modules depends on this because the SystemTap
4219    # semaphores are linked into the main binary and not the module's shared
4220    # object.
4221    QEMU_CFLAGS="$QEMU_CFLAGS -DSTAP_SDT_V2"
4222  fi
4223fi
4224
4225##########################################
4226# check and set a backend for coroutine
4227
4228# We prefer ucontext, but it's not always possible. The fallback
4229# is sigcontext. On Windows the only valid backend is the Windows
4230# specific one.
4231
4232ucontext_works=no
4233if test "$darwin" != "yes"; then
4234  cat > $TMPC << EOF
4235#include <ucontext.h>
4236#ifdef __stub_makecontext
4237#error Ignoring glibc stub makecontext which will always fail
4238#endif
4239int main(void) { makecontext(0, 0, 0); return 0; }
4240EOF
4241  if compile_prog "" "" ; then
4242    ucontext_works=yes
4243  fi
4244fi
4245
4246if test "$coroutine" = ""; then
4247  if test "$mingw32" = "yes"; then
4248    coroutine=win32
4249  elif test "$ucontext_works" = "yes"; then
4250    coroutine=ucontext
4251  else
4252    coroutine=sigaltstack
4253  fi
4254else
4255  case $coroutine in
4256  windows)
4257    if test "$mingw32" != "yes"; then
4258      error_exit "'windows' coroutine backend only valid for Windows"
4259    fi
4260    # Unfortunately the user visible backend name doesn't match the
4261    # coroutine-*.c filename for this case, so we have to adjust it here.
4262    coroutine=win32
4263    ;;
4264  ucontext)
4265    if test "$ucontext_works" != "yes"; then
4266      feature_not_found "ucontext"
4267    fi
4268    ;;
4269  sigaltstack)
4270    if test "$mingw32" = "yes"; then
4271      error_exit "only the 'windows' coroutine backend is valid for Windows"
4272    fi
4273    ;;
4274  *)
4275    error_exit "unknown coroutine backend $coroutine"
4276    ;;
4277  esac
4278fi
4279
4280if test "$coroutine_pool" = ""; then
4281  coroutine_pool=yes
4282fi
4283
4284if test "$debug_stack_usage" = "yes"; then
4285  if test "$coroutine_pool" = "yes"; then
4286    echo "WARN: disabling coroutine pool for stack usage debugging"
4287    coroutine_pool=no
4288  fi
4289fi
4290
4291##################################################
4292# SafeStack
4293
4294
4295if test "$safe_stack" = "yes"; then
4296cat > $TMPC << EOF
4297int main(int argc, char *argv[])
4298{
4299#if ! __has_feature(safe_stack)
4300#error SafeStack Disabled
4301#endif
4302    return 0;
4303}
4304EOF
4305  flag="-fsanitize=safe-stack"
4306  # Check that safe-stack is supported and enabled.
4307  if compile_prog "-Werror $flag" "$flag"; then
4308    # Flag needed both at compilation and at linking
4309    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
4310    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
4311  else
4312    error_exit "SafeStack not supported by your compiler"
4313  fi
4314  if test "$coroutine" != "ucontext"; then
4315    error_exit "SafeStack is only supported by the coroutine backend ucontext"
4316  fi
4317else
4318cat > $TMPC << EOF
4319int main(int argc, char *argv[])
4320{
4321#if defined(__has_feature)
4322#if __has_feature(safe_stack)
4323#error SafeStack Enabled
4324#endif
4325#endif
4326    return 0;
4327}
4328EOF
4329if test "$safe_stack" = "no"; then
4330  # Make sure that safe-stack is disabled
4331  if ! compile_prog "-Werror" ""; then
4332    # SafeStack was already enabled, try to explicitly remove the feature
4333    flag="-fno-sanitize=safe-stack"
4334    if ! compile_prog "-Werror $flag" "$flag"; then
4335      error_exit "Configure cannot disable SafeStack"
4336    fi
4337    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
4338    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
4339  fi
4340else # "$safe_stack" = ""
4341  # Set safe_stack to yes or no based on pre-existing flags
4342  if compile_prog "-Werror" ""; then
4343    safe_stack="no"
4344  else
4345    safe_stack="yes"
4346    if test "$coroutine" != "ucontext"; then
4347      error_exit "SafeStack is only supported by the coroutine backend ucontext"
4348    fi
4349  fi
4350fi
4351fi
4352
4353##########################################
4354# check if we have open_by_handle_at
4355
4356open_by_handle_at=no
4357cat > $TMPC << EOF
4358#include <fcntl.h>
4359#if !defined(AT_EMPTY_PATH)
4360# error missing definition
4361#else
4362int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
4363#endif
4364EOF
4365if compile_prog "" "" ; then
4366    open_by_handle_at=yes
4367fi
4368
4369########################################
4370# check if we have linux/magic.h
4371
4372linux_magic_h=no
4373cat > $TMPC << EOF
4374#include <linux/magic.h>
4375int main(void) {
4376  return 0;
4377}
4378EOF
4379if compile_prog "" "" ; then
4380    linux_magic_h=yes
4381fi
4382
4383########################################
4384# check if we have valgrind/valgrind.h
4385
4386valgrind_h=no
4387cat > $TMPC << EOF
4388#include <valgrind/valgrind.h>
4389int main(void) {
4390  return 0;
4391}
4392EOF
4393if compile_prog "" "" ; then
4394    valgrind_h=yes
4395fi
4396
4397########################################
4398# check if environ is declared
4399
4400has_environ=no
4401cat > $TMPC << EOF
4402#include <unistd.h>
4403int main(void) {
4404    environ = 0;
4405    return 0;
4406}
4407EOF
4408if compile_prog "" "" ; then
4409    has_environ=yes
4410fi
4411
4412########################################
4413# check if cpuid.h is usable.
4414
4415cat > $TMPC << EOF
4416#include <cpuid.h>
4417int main(void) {
4418    unsigned a, b, c, d;
4419    int max = __get_cpuid_max(0, 0);
4420
4421    if (max >= 1) {
4422        __cpuid(1, a, b, c, d);
4423    }
4424
4425    if (max >= 7) {
4426        __cpuid_count(7, 0, a, b, c, d);
4427    }
4428
4429    return 0;
4430}
4431EOF
4432if compile_prog "" "" ; then
4433    cpuid_h=yes
4434fi
4435
4436##########################################
4437# avx2 optimization requirement check
4438#
4439# There is no point enabling this if cpuid.h is not usable,
4440# since we won't be able to select the new routines.
4441
4442if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
4443  cat > $TMPC << EOF
4444#pragma GCC push_options
4445#pragma GCC target("avx2")
4446#include <cpuid.h>
4447#include <immintrin.h>
4448static int bar(void *a) {
4449    __m256i x = *(__m256i *)a;
4450    return _mm256_testz_si256(x, x);
4451}
4452int main(int argc, char *argv[]) { return bar(argv[0]); }
4453EOF
4454  if compile_object "" ; then
4455    avx2_opt="yes"
4456  else
4457    avx2_opt="no"
4458  fi
4459fi
4460
4461##########################################
4462# avx512f optimization requirement check
4463#
4464# There is no point enabling this if cpuid.h is not usable,
4465# since we won't be able to select the new routines.
4466# by default, it is turned off.
4467# if user explicitly want to enable it, check environment
4468
4469if test "$cpuid_h" = "yes" && test "$avx512f_opt" = "yes"; then
4470  cat > $TMPC << EOF
4471#pragma GCC push_options
4472#pragma GCC target("avx512f")
4473#include <cpuid.h>
4474#include <immintrin.h>
4475static int bar(void *a) {
4476    __m512i x = *(__m512i *)a;
4477    return _mm512_test_epi64_mask(x, x);
4478}
4479int main(int argc, char *argv[])
4480{
4481	return bar(argv[0]);
4482}
4483EOF
4484  if ! compile_object "" ; then
4485    avx512f_opt="no"
4486  fi
4487else
4488  avx512f_opt="no"
4489fi
4490
4491########################################
4492# check if __[u]int128_t is usable.
4493
4494int128=no
4495cat > $TMPC << EOF
4496__int128_t a;
4497__uint128_t b;
4498int main (void) {
4499  a = a + b;
4500  b = a * b;
4501  a = a * a;
4502  return 0;
4503}
4504EOF
4505if compile_prog "" "" ; then
4506    int128=yes
4507fi
4508
4509#########################################
4510# See if 128-bit atomic operations are supported.
4511
4512atomic128=no
4513if test "$int128" = "yes"; then
4514  cat > $TMPC << EOF
4515int main(void)
4516{
4517  unsigned __int128 x = 0, y = 0;
4518  y = __atomic_load(&x, 0);
4519  __atomic_store(&x, y, 0);
4520  __atomic_compare_exchange(&x, &y, x, 0, 0, 0);
4521  return 0;
4522}
4523EOF
4524  if compile_prog "" "" ; then
4525    atomic128=yes
4526  fi
4527fi
4528
4529cmpxchg128=no
4530if test "$int128" = yes && test "$atomic128" = no; then
4531  cat > $TMPC << EOF
4532int main(void)
4533{
4534  unsigned __int128 x = 0, y = 0;
4535  __sync_val_compare_and_swap_16(&x, y, x);
4536  return 0;
4537}
4538EOF
4539  if compile_prog "" "" ; then
4540    cmpxchg128=yes
4541  fi
4542fi
4543
4544#########################################
4545# See if 64-bit atomic operations are supported.
4546# Note that without __atomic builtins, we can only
4547# assume atomic loads/stores max at pointer size.
4548
4549cat > $TMPC << EOF
4550#include <stdint.h>
4551int main(void)
4552{
4553  uint64_t x = 0, y = 0;
4554#ifdef __ATOMIC_RELAXED
4555  y = __atomic_load_n(&x, __ATOMIC_RELAXED);
4556  __atomic_store_n(&x, y, __ATOMIC_RELAXED);
4557  __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
4558  __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
4559  __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
4560#else
4561  typedef char is_host64[sizeof(void *) >= sizeof(uint64_t) ? 1 : -1];
4562  __sync_lock_test_and_set(&x, y);
4563  __sync_val_compare_and_swap(&x, y, 0);
4564  __sync_fetch_and_add(&x, y);
4565#endif
4566  return 0;
4567}
4568EOF
4569if compile_prog "" "" ; then
4570  atomic64=yes
4571fi
4572
4573#########################################
4574# See if --dynamic-list is supported by the linker
4575ld_dynamic_list="no"
4576if test "$static" = "no" ; then
4577    cat > $TMPTXT <<EOF
4578{
4579  foo;
4580};
4581EOF
4582
4583    cat > $TMPC <<EOF
4584#include <stdio.h>
4585void foo(void);
4586
4587void foo(void)
4588{
4589  printf("foo\n");
4590}
4591
4592int main(void)
4593{
4594  foo();
4595  return 0;
4596}
4597EOF
4598
4599    if compile_prog "" "-Wl,--dynamic-list=$TMPTXT" ; then
4600        ld_dynamic_list="yes"
4601    fi
4602fi
4603
4604#########################################
4605# See if -exported_symbols_list is supported by the linker
4606
4607ld_exported_symbols_list="no"
4608if test "$static" = "no" ; then
4609    cat > $TMPTXT <<EOF
4610  _foo
4611EOF
4612
4613    if compile_prog "" "-Wl,-exported_symbols_list,$TMPTXT" ; then
4614        ld_exported_symbols_list="yes"
4615    fi
4616fi
4617
4618if  test "$plugins" = "yes" &&
4619    test "$ld_dynamic_list" = "no" &&
4620    test "$ld_exported_symbols_list" = "no" ; then
4621  error_exit \
4622      "Plugin support requires dynamic linking and specifying a set of symbols " \
4623      "that are exported to plugins. Unfortunately your linker doesn't " \
4624      "support the flag (--dynamic-list or -exported_symbols_list) used " \
4625      "for this purpose. You can't build with --static."
4626fi
4627
4628########################################
4629# check if getauxval is available.
4630
4631getauxval=no
4632cat > $TMPC << EOF
4633#include <sys/auxv.h>
4634int main(void) {
4635  return getauxval(AT_HWCAP) == 0;
4636}
4637EOF
4638if compile_prog "" "" ; then
4639    getauxval=yes
4640fi
4641
4642########################################
4643# check if ccache is interfering with
4644# semantic analysis of macros
4645
4646unset CCACHE_CPP2
4647ccache_cpp2=no
4648cat > $TMPC << EOF
4649static const int Z = 1;
4650#define fn() ({ Z; })
4651#define TAUT(X) ((X) == Z)
4652#define PAREN(X, Y) (X == Y)
4653#define ID(X) (X)
4654int main(int argc, char *argv[])
4655{
4656    int x = 0, y = 0;
4657    x = ID(x);
4658    x = fn();
4659    fn();
4660    if (PAREN(x, y)) return 0;
4661    if (TAUT(Z)) return 0;
4662    return 0;
4663}
4664EOF
4665
4666if ! compile_object "-Werror"; then
4667    ccache_cpp2=yes
4668fi
4669
4670#################################################
4671# clang does not support glibc + FORTIFY_SOURCE.
4672
4673if test "$fortify_source" != "no"; then
4674  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
4675    fortify_source="no";
4676  elif test -n "$cxx" && has $cxx &&
4677       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
4678    fortify_source="no";
4679  else
4680    fortify_source="yes"
4681  fi
4682fi
4683
4684###############################################
4685# Check if copy_file_range is provided by glibc
4686have_copy_file_range=no
4687cat > $TMPC << EOF
4688#include <unistd.h>
4689int main(void) {
4690  copy_file_range(0, NULL, 0, NULL, 0, 0);
4691  return 0;
4692}
4693EOF
4694if compile_prog "" "" ; then
4695    have_copy_file_range=yes
4696fi
4697
4698##########################################
4699# check if struct fsxattr is available via linux/fs.h
4700
4701have_fsxattr=no
4702cat > $TMPC << EOF
4703#include <linux/fs.h>
4704struct fsxattr foo;
4705int main(void) {
4706  return 0;
4707}
4708EOF
4709if compile_prog "" "" ; then
4710    have_fsxattr=yes
4711fi
4712
4713##########################################
4714# check for usable membarrier system call
4715if test "$membarrier" = "yes"; then
4716    have_membarrier=no
4717    if test "$mingw32" = "yes" ; then
4718        have_membarrier=yes
4719    elif test "$linux" = "yes" ; then
4720        cat > $TMPC << EOF
4721    #include <linux/membarrier.h>
4722    #include <sys/syscall.h>
4723    #include <unistd.h>
4724    #include <stdlib.h>
4725    int main(void) {
4726        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
4727        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
4728	exit(0);
4729    }
4730EOF
4731        if compile_prog "" "" ; then
4732            have_membarrier=yes
4733        fi
4734    fi
4735    if test "$have_membarrier" = "no"; then
4736      feature_not_found "membarrier" "membarrier system call not available"
4737    fi
4738else
4739    # Do not enable it by default even for Mingw32, because it doesn't
4740    # work on Wine.
4741    membarrier=no
4742fi
4743
4744##########################################
4745# check if rtnetlink.h exists and is useful
4746have_rtnetlink=no
4747cat > $TMPC << EOF
4748#include <linux/rtnetlink.h>
4749int main(void) {
4750  return IFLA_PROTO_DOWN;
4751}
4752EOF
4753if compile_prog "" "" ; then
4754    have_rtnetlink=yes
4755fi
4756
4757##########################################
4758# check for usable AF_VSOCK environment
4759have_af_vsock=no
4760cat > $TMPC << EOF
4761#include <errno.h>
4762#include <sys/types.h>
4763#include <sys/socket.h>
4764#if !defined(AF_VSOCK)
4765# error missing AF_VSOCK flag
4766#endif
4767#include <linux/vm_sockets.h>
4768int main(void) {
4769    int sock, ret;
4770    struct sockaddr_vm svm;
4771    socklen_t len = sizeof(svm);
4772    sock = socket(AF_VSOCK, SOCK_STREAM, 0);
4773    ret = getpeername(sock, (struct sockaddr *)&svm, &len);
4774    if ((ret == -1) && (errno == ENOTCONN)) {
4775        return 0;
4776    }
4777    return -1;
4778}
4779EOF
4780if compile_prog "" "" ; then
4781    have_af_vsock=yes
4782fi
4783
4784##########################################
4785# check for usable AF_ALG environment
4786have_afalg=no
4787cat > $TMPC << EOF
4788#include <errno.h>
4789#include <sys/types.h>
4790#include <sys/socket.h>
4791#include <linux/if_alg.h>
4792int main(void) {
4793    int sock;
4794    sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
4795    return sock;
4796}
4797EOF
4798if compile_prog "" "" ; then
4799    have_afalg=yes
4800fi
4801if test "$crypto_afalg" = "yes"
4802then
4803    if test "$have_afalg" != "yes"
4804    then
4805	error_exit "AF_ALG requested but could not be detected"
4806    fi
4807fi
4808
4809
4810#################################################
4811# check for sysmacros.h
4812
4813have_sysmacros=no
4814cat > $TMPC << EOF
4815#include <sys/sysmacros.h>
4816int main(void) {
4817    return makedev(0, 0);
4818}
4819EOF
4820if compile_prog "" "" ; then
4821    have_sysmacros=yes
4822fi
4823
4824##########################################
4825# check for utmpx.h, it is missing e.g. on OpenBSD
4826
4827have_utmpx=no
4828cat > $TMPC << EOF
4829#include <utmpx.h>
4830struct utmpx user_info;
4831int main(void) {
4832    return 0;
4833}
4834EOF
4835if compile_prog "" "" ; then
4836    have_utmpx=yes
4837fi
4838
4839##########################################
4840# check for getrandom()
4841
4842have_getrandom=no
4843cat > $TMPC << EOF
4844#include <sys/random.h>
4845int main(void) {
4846    return getrandom(0, 0, GRND_NONBLOCK);
4847}
4848EOF
4849if compile_prog "" "" ; then
4850    have_getrandom=yes
4851fi
4852
4853##########################################
4854# checks for sanitizers
4855
4856have_asan=no
4857have_ubsan=no
4858have_asan_iface_h=no
4859have_asan_iface_fiber=no
4860
4861if test "$sanitizers" = "yes" ; then
4862  write_c_skeleton
4863  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
4864      have_asan=yes
4865  fi
4866
4867  # we could use a simple skeleton for flags checks, but this also
4868  # detect the static linking issue of ubsan, see also:
4869  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
4870  cat > $TMPC << EOF
4871#include <stdlib.h>
4872int main(void) {
4873    void *tmp = malloc(10);
4874    if (tmp != NULL) {
4875        return *(int *)(tmp + 2);
4876    }
4877    return 1;
4878}
4879EOF
4880  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
4881      have_ubsan=yes
4882  fi
4883
4884  if check_include "sanitizer/asan_interface.h" ; then
4885      have_asan_iface_h=yes
4886  fi
4887
4888  cat > $TMPC << EOF
4889#include <sanitizer/asan_interface.h>
4890int main(void) {
4891  __sanitizer_start_switch_fiber(0, 0, 0);
4892  return 0;
4893}
4894EOF
4895  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
4896      have_asan_iface_fiber=yes
4897  fi
4898fi
4899
4900##########################################
4901# checks for fuzzer
4902if test "$fuzzing" = "yes" && test -z "${LIB_FUZZING_ENGINE+xxx}"; then
4903  write_c_fuzzer_skeleton
4904  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=fuzzer" ""; then
4905    have_fuzzer=yes
4906  else
4907    error_exit "Your compiler doesn't support -fsanitize=fuzzer"
4908    exit 1
4909  fi
4910fi
4911
4912# Thread sanitizer is, for now, much noisier than the other sanitizers;
4913# keep it separate until that is not the case.
4914if test "$tsan" = "yes" && test "$sanitizers" = "yes"; then
4915  error_exit "TSAN is not supported with other sanitiziers."
4916fi
4917have_tsan=no
4918have_tsan_iface_fiber=no
4919if test "$tsan" = "yes" ; then
4920  write_c_skeleton
4921  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
4922      have_tsan=yes
4923  fi
4924  cat > $TMPC << EOF
4925#include <sanitizer/tsan_interface.h>
4926int main(void) {
4927  __tsan_create_fiber(0);
4928  return 0;
4929}
4930EOF
4931  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
4932      have_tsan_iface_fiber=yes
4933  fi
4934fi
4935
4936##########################################
4937# check for libpmem
4938
4939if test "$libpmem" != "no"; then
4940	if $pkg_config --exists "libpmem"; then
4941		libpmem="yes"
4942		libpmem_libs=$($pkg_config --libs libpmem)
4943		libpmem_cflags=$($pkg_config --cflags libpmem)
4944	else
4945		if test "$libpmem" = "yes" ; then
4946			feature_not_found "libpmem" "Install nvml or pmdk"
4947		fi
4948		libpmem="no"
4949	fi
4950fi
4951
4952##########################################
4953# check for libdaxctl
4954
4955if test "$libdaxctl" != "no"; then
4956	if $pkg_config --atleast-version=57 "libdaxctl"; then
4957		libdaxctl="yes"
4958		libdaxctl_libs=$($pkg_config --libs libdaxctl)
4959		libdaxctl_cflags=$($pkg_config --cflags libdaxctl)
4960	else
4961		if test "$libdaxctl" = "yes" ; then
4962			feature_not_found "libdaxctl" "Install libdaxctl"
4963		fi
4964		libdaxctl="no"
4965	fi
4966fi
4967
4968##########################################
4969# check for slirp
4970
4971case "$slirp" in
4972  auto | enabled | internal)
4973    # Simpler to always update submodule, even if not needed.
4974    git_submodules="${git_submodules} slirp"
4975    ;;
4976esac
4977
4978# Check for slirp smbd dupport
4979: ${smbd=${SMBD-/usr/sbin/smbd}}
4980if test "$slirp_smbd" != "no" ; then
4981  if test "$mingw32" = "yes" ; then
4982    if test "$slirp_smbd" = "yes" ; then
4983      error_exit "Host smbd not supported on this platform."
4984    fi
4985    slirp_smbd=no
4986  else
4987    slirp_smbd=yes
4988  fi
4989fi
4990
4991##########################################
4992# check for usable __NR_keyctl syscall
4993
4994if test "$linux" = "yes" ; then
4995
4996    have_keyring=no
4997    cat > $TMPC << EOF
4998#include <errno.h>
4999#include <asm/unistd.h>
5000#include <linux/keyctl.h>
5001#include <unistd.h>
5002int main(void) {
5003    return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
5004}
5005EOF
5006    if compile_prog "" "" ; then
5007        have_keyring=yes
5008    fi
5009fi
5010if test "$secret_keyring" != "no"
5011then
5012    if test "$have_keyring" = "yes"
5013    then
5014	secret_keyring=yes
5015    else
5016	if test "$secret_keyring" = "yes"
5017	then
5018	    error_exit "syscall __NR_keyctl requested, \
5019but not implemented on your system"
5020	else
5021	    secret_keyring=no
5022	fi
5023    fi
5024fi
5025
5026##########################################
5027# End of CC checks
5028# After here, no more $cc or $ld runs
5029
5030write_c_skeleton
5031
5032if test "$gcov" = "yes" ; then
5033  :
5034elif test "$fortify_source" = "yes" ; then
5035  QEMU_CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $QEMU_CFLAGS"
5036  debug=no
5037fi
5038
5039case "$ARCH" in
5040alpha)
5041  # Ensure there's only a single GP
5042  QEMU_CFLAGS="-msmall-data $QEMU_CFLAGS"
5043;;
5044esac
5045
5046if test "$gprof" = "yes" ; then
5047  QEMU_CFLAGS="-p $QEMU_CFLAGS"
5048  QEMU_LDFLAGS="-p $QEMU_LDFLAGS"
5049fi
5050
5051if test "$have_asan" = "yes"; then
5052  QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
5053  QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
5054  if test "$have_asan_iface_h" = "no" ; then
5055      echo "ASAN build enabled, but ASAN header missing." \
5056           "Without code annotation, the report may be inferior."
5057  elif test "$have_asan_iface_fiber" = "no" ; then
5058      echo "ASAN build enabled, but ASAN header is too old." \
5059           "Without code annotation, the report may be inferior."
5060  fi
5061fi
5062if test "$have_tsan" = "yes" ; then
5063  if test "$have_tsan_iface_fiber" = "yes" ; then
5064    QEMU_CFLAGS="-fsanitize=thread $QEMU_CFLAGS"
5065    QEMU_LDFLAGS="-fsanitize=thread $QEMU_LDFLAGS"
5066  else
5067    error_exit "Cannot enable TSAN due to missing fiber annotation interface."
5068  fi
5069elif test "$tsan" = "yes" ; then
5070  error_exit "Cannot enable TSAN due to missing sanitize thread interface."
5071fi
5072if test "$have_ubsan" = "yes"; then
5073  QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS"
5074  QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
5075fi
5076
5077##########################################
5078
5079# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
5080if test "$solaris" = "no" && test "$tsan" = "no"; then
5081    if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
5082        QEMU_LDFLAGS="-Wl,--warn-common $QEMU_LDFLAGS"
5083    fi
5084fi
5085
5086# Use ASLR, no-SEH and DEP if available
5087if test "$mingw32" = "yes" ; then
5088    flags="--no-seh --nxcompat"
5089
5090    # Disable ASLR for debug builds to allow debugging with gdb
5091    if test "$debug" = "no" ; then
5092        flags="--dynamicbase $flags"
5093    fi
5094
5095    for flag in $flags; do
5096        if ld_has $flag ; then
5097            QEMU_LDFLAGS="-Wl,$flag $QEMU_LDFLAGS"
5098        fi
5099    done
5100fi
5101
5102# We can only support ivshmem if we have eventfd
5103if [ "$eventfd" = "yes" ]; then
5104  ivshmem=yes
5105fi
5106
5107# Probe for guest agent support/options
5108
5109if [ "$guest_agent" != "no" ]; then
5110  if [ "$softmmu" = no -a "$want_tools" = no ] ; then
5111      guest_agent=no
5112  elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
5113      guest_agent=yes
5114  elif [ "$guest_agent" != yes ]; then
5115      guest_agent=no
5116  else
5117      error_exit "Guest agent is not supported on this platform"
5118  fi
5119fi
5120
5121# Guest agent Windows MSI package
5122
5123if test "$QEMU_GA_MANUFACTURER" = ""; then
5124  QEMU_GA_MANUFACTURER=QEMU
5125fi
5126if test "$QEMU_GA_DISTRO" = ""; then
5127  QEMU_GA_DISTRO=Linux
5128fi
5129if test "$QEMU_GA_VERSION" = ""; then
5130    QEMU_GA_VERSION=$(cat $source_path/VERSION)
5131fi
5132
5133QEMU_GA_MSI_MINGW_DLL_PATH="$($pkg_config --variable=prefix glib-2.0)/bin"
5134
5135# Mac OS X ships with a broken assembler
5136roms=
5137if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
5138        test "$targetos" != "Darwin" && test "$targetos" != "SunOS" && \
5139        test "$targetos" != "Haiku" && test "$softmmu" = yes ; then
5140    # Different host OS linkers have different ideas about the name of the ELF
5141    # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
5142    # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
5143    for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
5144        if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
5145            ld_i386_emulation="$emu"
5146            roms="optionrom"
5147            break
5148        fi
5149    done
5150fi
5151
5152# Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
5153# or -march=z10 (which is the lowest architecture level that Clang supports)
5154if test "$cpu" = "s390x" ; then
5155  write_c_skeleton
5156  compile_prog "-march=z900" ""
5157  has_z900=$?
5158  if [ $has_z900 = 0 ] || compile_object "-march=z10 -msoft-float -Werror"; then
5159    if [ $has_z900 != 0 ]; then
5160      echo "WARNING: Your compiler does not support the z900!"
5161      echo "         The s390-ccw bios will only work with guest CPUs >= z10."
5162    fi
5163    roms="$roms s390-ccw"
5164    # SLOF is required for building the s390-ccw firmware on s390x,
5165    # since it is using the libnet code from SLOF for network booting.
5166    git_submodules="${git_submodules} roms/SLOF"
5167  fi
5168fi
5169
5170# Check that the C++ compiler exists and works with the C compiler.
5171# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
5172if has $cxx; then
5173    cat > $TMPC <<EOF
5174int c_function(void);
5175int main(void) { return c_function(); }
5176EOF
5177
5178    compile_object
5179
5180    cat > $TMPCXX <<EOF
5181extern "C" {
5182   int c_function(void);
5183}
5184int c_function(void) { return 42; }
5185EOF
5186
5187    update_cxxflags
5188
5189    if do_cxx $CXXFLAGS $CONFIGURE_CXXFLAGS $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
5190        # C++ compiler $cxx works ok with C compiler $cc
5191        :
5192    else
5193        echo "C++ compiler $cxx does not work with C compiler $cc"
5194        echo "Disabling C++ specific optional code"
5195        cxx=
5196    fi
5197else
5198    echo "No C++ compiler available; disabling C++ specific optional code"
5199    cxx=
5200fi
5201
5202if !(GIT="$git" "$source_path/scripts/git-submodule.sh" "$git_submodules_action" "$git_submodules"); then
5203    exit 1
5204fi
5205
5206config_host_mak="config-host.mak"
5207
5208echo "# Automatically generated by configure - do not modify" > $config_host_mak
5209echo >> $config_host_mak
5210
5211echo all: >> $config_host_mak
5212echo "GIT=$git" >> $config_host_mak
5213echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
5214echo "GIT_SUBMODULES_ACTION=$git_submodules_action" >> $config_host_mak
5215
5216echo "ARCH=$ARCH" >> $config_host_mak
5217
5218if test "$debug_tcg" = "yes" ; then
5219  echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
5220fi
5221if test "$strip_opt" = "yes" ; then
5222  echo "STRIP=${strip}" >> $config_host_mak
5223fi
5224if test "$bigendian" = "yes" ; then
5225  echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
5226fi
5227if test "$mingw32" = "yes" ; then
5228  echo "CONFIG_WIN32=y" >> $config_host_mak
5229  if test "$guest_agent_with_vss" = "yes" ; then
5230    echo "CONFIG_QGA_VSS=y" >> $config_host_mak
5231    echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
5232    echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
5233  fi
5234  if test "$guest_agent_ntddscsi" = "yes" ; then
5235    echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
5236  fi
5237  echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
5238  echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
5239  echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
5240  echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
5241else
5242  echo "CONFIG_POSIX=y" >> $config_host_mak
5243fi
5244
5245if test "$linux" = "yes" ; then
5246  echo "CONFIG_LINUX=y" >> $config_host_mak
5247fi
5248
5249if test "$darwin" = "yes" ; then
5250  echo "CONFIG_DARWIN=y" >> $config_host_mak
5251fi
5252
5253if test "$solaris" = "yes" ; then
5254  echo "CONFIG_SOLARIS=y" >> $config_host_mak
5255fi
5256if test "$haiku" = "yes" ; then
5257  echo "CONFIG_HAIKU=y" >> $config_host_mak
5258fi
5259if test "$static" = "yes" ; then
5260  echo "CONFIG_STATIC=y" >> $config_host_mak
5261fi
5262if test "$profiler" = "yes" ; then
5263  echo "CONFIG_PROFILER=y" >> $config_host_mak
5264fi
5265if test "$want_tools" = "yes" ; then
5266  echo "CONFIG_TOOLS=y" >> $config_host_mak
5267fi
5268if test "$guest_agent" = "yes" ; then
5269  echo "CONFIG_GUEST_AGENT=y" >> $config_host_mak
5270fi
5271if test "$slirp_smbd" = "yes" ; then
5272  echo "CONFIG_SLIRP_SMBD=y" >> $config_host_mak
5273  echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
5274fi
5275if test "$vde" = "yes" ; then
5276  echo "CONFIG_VDE=y" >> $config_host_mak
5277  echo "VDE_LIBS=$vde_libs" >> $config_host_mak
5278fi
5279if test "$netmap" = "yes" ; then
5280  echo "CONFIG_NETMAP=y" >> $config_host_mak
5281fi
5282if test "$l2tpv3" = "yes" ; then
5283  echo "CONFIG_L2TPV3=y" >> $config_host_mak
5284fi
5285if test "$gprof" = "yes" ; then
5286  echo "CONFIG_GPROF=y" >> $config_host_mak
5287fi
5288echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
5289for drv in $audio_drv_list; do
5290    def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
5291    echo "$def=y" >> $config_host_mak
5292done
5293if test "$alsa" = "yes" ; then
5294    echo "CONFIG_ALSA=y" >> $config_host_mak
5295fi
5296echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak
5297echo "ALSA_CFLAGS=$alsa_cflags" >> $config_host_mak
5298if test "$libpulse" = "yes" ; then
5299    echo "CONFIG_LIBPULSE=y" >> $config_host_mak
5300fi
5301echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
5302echo "PULSE_CFLAGS=$pulse_cflags" >> $config_host_mak
5303echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak
5304echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak
5305echo "OSS_LIBS=$oss_libs" >> $config_host_mak
5306if test "$libjack" = "yes" ; then
5307    echo "CONFIG_LIBJACK=y" >> $config_host_mak
5308fi
5309echo "JACK_LIBS=$jack_libs" >> $config_host_mak
5310if test "$audio_win_int" = "yes" ; then
5311  echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
5312fi
5313echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
5314echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
5315if test "$xfs" = "yes" ; then
5316  echo "CONFIG_XFS=y" >> $config_host_mak
5317fi
5318qemu_version=$(head $source_path/VERSION)
5319echo "PKGVERSION=$pkgversion" >>$config_host_mak
5320echo "SRC_PATH=$source_path" >> $config_host_mak
5321echo "TARGET_DIRS=$target_list" >> $config_host_mak
5322if test "$modules" = "yes"; then
5323  # $shacmd can generate a hash started with digit, which the compiler doesn't
5324  # like as an symbol. So prefix it with an underscore
5325  echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
5326  echo "CONFIG_MODULES=y" >> $config_host_mak
5327fi
5328if test "$module_upgrades" = "yes"; then
5329  echo "CONFIG_MODULE_UPGRADES=y" >> $config_host_mak
5330fi
5331if test "$pipe2" = "yes" ; then
5332  echo "CONFIG_PIPE2=y" >> $config_host_mak
5333fi
5334if test "$accept4" = "yes" ; then
5335  echo "CONFIG_ACCEPT4=y" >> $config_host_mak
5336fi
5337if test "$splice" = "yes" ; then
5338  echo "CONFIG_SPLICE=y" >> $config_host_mak
5339fi
5340if test "$eventfd" = "yes" ; then
5341  echo "CONFIG_EVENTFD=y" >> $config_host_mak
5342fi
5343if test "$memfd" = "yes" ; then
5344  echo "CONFIG_MEMFD=y" >> $config_host_mak
5345fi
5346if test "$have_usbfs" = "yes" ; then
5347  echo "CONFIG_USBFS=y" >> $config_host_mak
5348fi
5349if test "$fallocate" = "yes" ; then
5350  echo "CONFIG_FALLOCATE=y" >> $config_host_mak
5351fi
5352if test "$fallocate_punch_hole" = "yes" ; then
5353  echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
5354fi
5355if test "$fallocate_zero_range" = "yes" ; then
5356  echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak
5357fi
5358if test "$posix_fallocate" = "yes" ; then
5359  echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
5360fi
5361if test "$sync_file_range" = "yes" ; then
5362  echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
5363fi
5364if test "$fiemap" = "yes" ; then
5365  echo "CONFIG_FIEMAP=y" >> $config_host_mak
5366fi
5367if test "$dup3" = "yes" ; then
5368  echo "CONFIG_DUP3=y" >> $config_host_mak
5369fi
5370if test "$ppoll" = "yes" ; then
5371  echo "CONFIG_PPOLL=y" >> $config_host_mak
5372fi
5373if test "$prctl_pr_set_timerslack" = "yes" ; then
5374  echo "CONFIG_PRCTL_PR_SET_TIMERSLACK=y" >> $config_host_mak
5375fi
5376if test "$epoll" = "yes" ; then
5377  echo "CONFIG_EPOLL=y" >> $config_host_mak
5378fi
5379if test "$epoll_create1" = "yes" ; then
5380  echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
5381fi
5382if test "$sendfile" = "yes" ; then
5383  echo "CONFIG_SENDFILE=y" >> $config_host_mak
5384fi
5385if test "$timerfd" = "yes" ; then
5386  echo "CONFIG_TIMERFD=y" >> $config_host_mak
5387fi
5388if test "$setns" = "yes" ; then
5389  echo "CONFIG_SETNS=y" >> $config_host_mak
5390fi
5391if test "$clock_adjtime" = "yes" ; then
5392  echo "CONFIG_CLOCK_ADJTIME=y" >> $config_host_mak
5393fi
5394if test "$syncfs" = "yes" ; then
5395  echo "CONFIG_SYNCFS=y" >> $config_host_mak
5396fi
5397if test "$inotify" = "yes" ; then
5398  echo "CONFIG_INOTIFY=y" >> $config_host_mak
5399fi
5400if test "$inotify1" = "yes" ; then
5401  echo "CONFIG_INOTIFY1=y" >> $config_host_mak
5402fi
5403if test "$sem_timedwait" = "yes" ; then
5404  echo "CONFIG_SEM_TIMEDWAIT=y" >> $config_host_mak
5405fi
5406if test "$strchrnul" = "yes" ; then
5407  echo "HAVE_STRCHRNUL=y" >> $config_host_mak
5408fi
5409if test "$st_atim" = "yes" ; then
5410  echo "HAVE_STRUCT_STAT_ST_ATIM=y" >> $config_host_mak
5411fi
5412if test "$sigev_notify_thread_id" = "yes" ; then
5413  echo "HAVE_SIGEV_NOTIFY_THREAD_ID=y" >> $config_host_mak
5414fi
5415if test "$byteswap_h" = "yes" ; then
5416  echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
5417fi
5418if test "$bswap_h" = "yes" ; then
5419  echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
5420fi
5421if test "$gio" = "yes" ; then
5422    echo "CONFIG_GIO=y" >> $config_host_mak
5423    echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
5424    echo "GIO_LIBS=$gio_libs" >> $config_host_mak
5425fi
5426if test "$gdbus_codegen" != "" ; then
5427    echo "GDBUS_CODEGEN=$gdbus_codegen" >> $config_host_mak
5428fi
5429echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
5430if test "$have_broken_size_max" = "yes" ; then
5431    echo "HAVE_BROKEN_SIZE_MAX=y" >> $config_host_mak
5432fi
5433if test "$have_openpty" = "yes" ; then
5434    echo "HAVE_OPENPTY=y" >> $config_host_mak
5435fi
5436
5437# Work around a system header bug with some kernel/XFS header
5438# versions where they both try to define 'struct fsxattr':
5439# xfs headers will not try to redefine structs from linux headers
5440# if this macro is set.
5441if test "$have_fsxattr" = "yes" ; then
5442    echo "HAVE_FSXATTR=y" >> $config_host_mak
5443fi
5444if test "$have_copy_file_range" = "yes" ; then
5445    echo "HAVE_COPY_FILE_RANGE=y" >> $config_host_mak
5446fi
5447if test "$xen" = "enabled" ; then
5448  echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
5449  echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
5450  echo "XEN_CFLAGS=$xen_cflags" >> $config_host_mak
5451  echo "XEN_LIBS=$xen_libs" >> $config_host_mak
5452fi
5453if test "$linux_aio" = "yes" ; then
5454  echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
5455fi
5456if test "$linux_io_uring" = "yes" ; then
5457  echo "CONFIG_LINUX_IO_URING=y" >> $config_host_mak
5458  echo "LINUX_IO_URING_CFLAGS=$linux_io_uring_cflags" >> $config_host_mak
5459  echo "LINUX_IO_URING_LIBS=$linux_io_uring_libs" >> $config_host_mak
5460fi
5461if test "$vhost_scsi" = "yes" ; then
5462  echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
5463fi
5464if test "$vhost_net" = "yes" ; then
5465  echo "CONFIG_VHOST_NET=y" >> $config_host_mak
5466fi
5467if test "$vhost_net_user" = "yes" ; then
5468  echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
5469fi
5470if test "$vhost_net_vdpa" = "yes" ; then
5471  echo "CONFIG_VHOST_NET_VDPA=y" >> $config_host_mak
5472fi
5473if test "$vhost_crypto" = "yes" ; then
5474  echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
5475fi
5476if test "$vhost_vsock" = "yes" ; then
5477  echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
5478  if test "$vhost_user" = "yes" ; then
5479    echo "CONFIG_VHOST_USER_VSOCK=y" >> $config_host_mak
5480  fi
5481fi
5482if test "$vhost_kernel" = "yes" ; then
5483  echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
5484fi
5485if test "$vhost_user" = "yes" ; then
5486  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
5487fi
5488if test "$vhost_vdpa" = "yes" ; then
5489  echo "CONFIG_VHOST_VDPA=y" >> $config_host_mak
5490fi
5491if test "$vhost_user_fs" = "yes" ; then
5492  echo "CONFIG_VHOST_USER_FS=y" >> $config_host_mak
5493fi
5494if test "$iovec" = "yes" ; then
5495  echo "CONFIG_IOVEC=y" >> $config_host_mak
5496fi
5497if test "$membarrier" = "yes" ; then
5498  echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
5499fi
5500if test "$signalfd" = "yes" ; then
5501  echo "CONFIG_SIGNALFD=y" >> $config_host_mak
5502fi
5503if test "$optreset" = "yes" ; then
5504  echo "HAVE_OPTRESET=y" >> $config_host_mak
5505fi
5506if test "$tcg" = "enabled" -a "$tcg_interpreter" = "true" ; then
5507  echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
5508fi
5509if test "$fdatasync" = "yes" ; then
5510  echo "CONFIG_FDATASYNC=y" >> $config_host_mak
5511fi
5512if test "$madvise" = "yes" ; then
5513  echo "CONFIG_MADVISE=y" >> $config_host_mak
5514fi
5515if test "$posix_madvise" = "yes" ; then
5516  echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak
5517fi
5518if test "$posix_memalign" = "yes" ; then
5519  echo "CONFIG_POSIX_MEMALIGN=y" >> $config_host_mak
5520fi
5521
5522if test "$spice_protocol" = "yes" ; then
5523  echo "CONFIG_SPICE_PROTOCOL=y" >> $config_host_mak
5524  echo "SPICE_PROTOCOL_CFLAGS=$spice_protocol_cflags" >> $config_host_mak
5525fi
5526if test "$spice" = "yes" ; then
5527  echo "CONFIG_SPICE=y" >> $config_host_mak
5528  echo "SPICE_CFLAGS=$spice_cflags $spice_protocol_cflags" >> $config_host_mak
5529  echo "SPICE_LIBS=$spice_libs" >> $config_host_mak
5530fi
5531
5532if test "$opengl" = "yes" ; then
5533  echo "CONFIG_OPENGL=y" >> $config_host_mak
5534  echo "OPENGL_CFLAGS=$opengl_cflags" >> $config_host_mak
5535  echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
5536fi
5537
5538if test "$gbm" = "yes" ; then
5539    echo "CONFIG_GBM=y" >> $config_host_mak
5540    echo "GBM_LIBS=$gbm_libs" >> $config_host_mak
5541    echo "GBM_CFLAGS=$gbm_cflags" >> $config_host_mak
5542fi
5543
5544
5545if test "$avx2_opt" = "yes" ; then
5546  echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
5547fi
5548
5549if test "$avx512f_opt" = "yes" ; then
5550  echo "CONFIG_AVX512F_OPT=y" >> $config_host_mak
5551fi
5552
5553# XXX: suppress that
5554if [ "$bsd" = "yes" ] ; then
5555  echo "CONFIG_BSD=y" >> $config_host_mak
5556fi
5557
5558if test "$qom_cast_debug" = "yes" ; then
5559  echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
5560fi
5561
5562echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
5563if test "$coroutine_pool" = "yes" ; then
5564  echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
5565else
5566  echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
5567fi
5568
5569if test "$debug_stack_usage" = "yes" ; then
5570  echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
5571fi
5572
5573if test "$crypto_afalg" = "yes" ; then
5574  echo "CONFIG_AF_ALG=y" >> $config_host_mak
5575fi
5576
5577if test "$open_by_handle_at" = "yes" ; then
5578  echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
5579fi
5580
5581if test "$linux_magic_h" = "yes" ; then
5582  echo "CONFIG_LINUX_MAGIC_H=y" >> $config_host_mak
5583fi
5584
5585if test "$valgrind_h" = "yes" ; then
5586  echo "CONFIG_VALGRIND_H=y" >> $config_host_mak
5587fi
5588
5589if test "$have_asan_iface_fiber" = "yes" ; then
5590    echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
5591fi
5592
5593if test "$have_tsan" = "yes" && test "$have_tsan_iface_fiber" = "yes" ; then
5594    echo "CONFIG_TSAN=y" >> $config_host_mak
5595fi
5596
5597if test "$has_environ" = "yes" ; then
5598  echo "CONFIG_HAS_ENVIRON=y" >> $config_host_mak
5599fi
5600
5601if test "$cpuid_h" = "yes" ; then
5602  echo "CONFIG_CPUID_H=y" >> $config_host_mak
5603fi
5604
5605if test "$int128" = "yes" ; then
5606  echo "CONFIG_INT128=y" >> $config_host_mak
5607fi
5608
5609if test "$atomic128" = "yes" ; then
5610  echo "CONFIG_ATOMIC128=y" >> $config_host_mak
5611fi
5612
5613if test "$cmpxchg128" = "yes" ; then
5614  echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
5615fi
5616
5617if test "$atomic64" = "yes" ; then
5618  echo "CONFIG_ATOMIC64=y" >> $config_host_mak
5619fi
5620
5621if test "$getauxval" = "yes" ; then
5622  echo "CONFIG_GETAUXVAL=y" >> $config_host_mak
5623fi
5624
5625if test "$libssh" = "yes" ; then
5626  echo "CONFIG_LIBSSH=y" >> $config_host_mak
5627  echo "LIBSSH_CFLAGS=$libssh_cflags" >> $config_host_mak
5628  echo "LIBSSH_LIBS=$libssh_libs" >> $config_host_mak
5629fi
5630
5631if test "$live_block_migration" = "yes" ; then
5632  echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
5633fi
5634
5635if test "$tpm" = "yes"; then
5636  echo 'CONFIG_TPM=y' >> $config_host_mak
5637fi
5638
5639echo "TRACE_BACKENDS=$trace_backends" >> $config_host_mak
5640if have_backend "nop"; then
5641  echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
5642fi
5643if have_backend "simple"; then
5644  echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
5645  # Set the appropriate trace file.
5646  trace_file="\"$trace_file-\" FMT_pid"
5647fi
5648if have_backend "log"; then
5649  echo "CONFIG_TRACE_LOG=y" >> $config_host_mak
5650fi
5651if have_backend "ust"; then
5652  echo "CONFIG_TRACE_UST=y" >> $config_host_mak
5653  echo "LTTNG_UST_LIBS=$lttng_ust_libs" >> $config_host_mak
5654  echo "URCU_BP_LIBS=$urcu_bp_libs" >> $config_host_mak
5655fi
5656if have_backend "dtrace"; then
5657  echo "CONFIG_TRACE_DTRACE=y" >> $config_host_mak
5658  if test "$trace_backend_stap" = "yes" ; then
5659    echo "CONFIG_TRACE_SYSTEMTAP=y" >> $config_host_mak
5660  fi
5661fi
5662if have_backend "ftrace"; then
5663  if test "$linux" = "yes" ; then
5664    echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak
5665  else
5666    feature_not_found "ftrace(trace backend)" "ftrace requires Linux"
5667  fi
5668fi
5669if have_backend "syslog"; then
5670  if test "$posix_syslog" = "yes" ; then
5671    echo "CONFIG_TRACE_SYSLOG=y" >> $config_host_mak
5672  else
5673    feature_not_found "syslog(trace backend)" "syslog not available"
5674  fi
5675fi
5676echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
5677
5678if test "$rdma" = "yes" ; then
5679  echo "CONFIG_RDMA=y" >> $config_host_mak
5680  echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
5681fi
5682
5683if test "$pvrdma" = "yes" ; then
5684  echo "CONFIG_PVRDMA=y" >> $config_host_mak
5685fi
5686
5687if test "$have_rtnetlink" = "yes" ; then
5688  echo "CONFIG_RTNETLINK=y" >> $config_host_mak
5689fi
5690
5691if test "$libxml2" = "yes" ; then
5692  echo "CONFIG_LIBXML2=y" >> $config_host_mak
5693  echo "LIBXML2_CFLAGS=$libxml2_cflags" >> $config_host_mak
5694  echo "LIBXML2_LIBS=$libxml2_libs" >> $config_host_mak
5695fi
5696
5697if test "$replication" = "yes" ; then
5698  echo "CONFIG_REPLICATION=y" >> $config_host_mak
5699fi
5700
5701if test "$have_af_vsock" = "yes" ; then
5702  echo "CONFIG_AF_VSOCK=y" >> $config_host_mak
5703fi
5704
5705if test "$have_sysmacros" = "yes" ; then
5706  echo "CONFIG_SYSMACROS=y" >> $config_host_mak
5707fi
5708
5709if test "$have_utmpx" = "yes" ; then
5710  echo "HAVE_UTMPX=y" >> $config_host_mak
5711fi
5712if test "$have_getrandom" = "yes" ; then
5713  echo "CONFIG_GETRANDOM=y" >> $config_host_mak
5714fi
5715if test "$ivshmem" = "yes" ; then
5716  echo "CONFIG_IVSHMEM=y" >> $config_host_mak
5717fi
5718if test "$debug_mutex" = "yes" ; then
5719  echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
5720fi
5721
5722# Hold two types of flag:
5723#   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
5724#                                     a thread we have a handle to
5725#   CONFIG_PTHREAD_SETNAME_NP_W_TID - A way of doing it on a particular
5726#                                     platform
5727if test "$pthread_setname_np_w_tid" = "yes" ; then
5728  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
5729  echo "CONFIG_PTHREAD_SETNAME_NP_W_TID=y" >> $config_host_mak
5730elif test "$pthread_setname_np_wo_tid" = "yes" ; then
5731  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
5732  echo "CONFIG_PTHREAD_SETNAME_NP_WO_TID=y" >> $config_host_mak
5733fi
5734
5735if test "$libpmem" = "yes" ; then
5736  echo "CONFIG_LIBPMEM=y" >> $config_host_mak
5737  echo "LIBPMEM_LIBS=$libpmem_libs" >> $config_host_mak
5738  echo "LIBPMEM_CFLAGS=$libpmem_cflags" >> $config_host_mak
5739fi
5740
5741if test "$libdaxctl" = "yes" ; then
5742  echo "CONFIG_LIBDAXCTL=y" >> $config_host_mak
5743  echo "LIBDAXCTL_LIBS=$libdaxctl_libs" >> $config_host_mak
5744fi
5745
5746if test "$bochs" = "yes" ; then
5747  echo "CONFIG_BOCHS=y" >> $config_host_mak
5748fi
5749if test "$cloop" = "yes" ; then
5750  echo "CONFIG_CLOOP=y" >> $config_host_mak
5751fi
5752if test "$dmg" = "yes" ; then
5753  echo "CONFIG_DMG=y" >> $config_host_mak
5754fi
5755if test "$qcow1" = "yes" ; then
5756  echo "CONFIG_QCOW1=y" >> $config_host_mak
5757fi
5758if test "$vdi" = "yes" ; then
5759  echo "CONFIG_VDI=y" >> $config_host_mak
5760fi
5761if test "$vvfat" = "yes" ; then
5762  echo "CONFIG_VVFAT=y" >> $config_host_mak
5763fi
5764if test "$qed" = "yes" ; then
5765  echo "CONFIG_QED=y" >> $config_host_mak
5766fi
5767if test "$parallels" = "yes" ; then
5768  echo "CONFIG_PARALLELS=y" >> $config_host_mak
5769fi
5770if test "$have_mlockall" = "yes" ; then
5771  echo "HAVE_MLOCKALL=y" >> $config_host_mak
5772fi
5773if test "$fuzzing" = "yes" ; then
5774  # If LIB_FUZZING_ENGINE is set, assume we are running on OSS-Fuzz, and the
5775  # needed CFLAGS have already been provided
5776  if test -z "${LIB_FUZZING_ENGINE+xxx}" ; then
5777    # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
5778    # compiled code.
5779    QEMU_CFLAGS="$QEMU_CFLAGS -fsanitize=fuzzer-no-link"
5780    # To build non-fuzzer binaries with --enable-fuzzing, link everything with
5781    # fsanitize=fuzzer-no-link. Otherwise, the linker will be unable to bind
5782    # the fuzzer-related callbacks added by instrumentation.
5783    QEMU_LDFLAGS="$QEMU_LDFLAGS -fsanitize=fuzzer-no-link"
5784    # For the actual fuzzer binaries, we need to link against the libfuzzer
5785    # library. Provide the flags for doing this in FUZZ_EXE_LDFLAGS. The meson
5786    # rule for the fuzzer adds these to the link_args. They need to be
5787    # configurable, to support OSS-Fuzz
5788    FUZZ_EXE_LDFLAGS="-fsanitize=fuzzer"
5789  else
5790    FUZZ_EXE_LDFLAGS="$LIB_FUZZING_ENGINE"
5791  fi
5792fi
5793
5794if test "$plugins" = "yes" ; then
5795    echo "CONFIG_PLUGIN=y" >> $config_host_mak
5796    # Copy the export object list to the build dir
5797    if test "$ld_dynamic_list" = "yes" ; then
5798	echo "CONFIG_HAS_LD_DYNAMIC_LIST=yes" >> $config_host_mak
5799	ld_symbols=qemu-plugins-ld.symbols
5800	cp "$source_path/plugins/qemu-plugins.symbols" $ld_symbols
5801    elif test "$ld_exported_symbols_list" = "yes" ; then
5802	echo "CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST=yes" >> $config_host_mak
5803	ld64_symbols=qemu-plugins-ld64.symbols
5804	echo "# Automatically generated by configure - do not modify" > $ld64_symbols
5805	grep 'qemu_' "$source_path/plugins/qemu-plugins.symbols" | sed 's/;//g' | \
5806	    sed -E 's/^[[:space:]]*(.*)/_\1/' >> $ld64_symbols
5807    else
5808	error_exit \
5809	    "If \$plugins=yes, either \$ld_dynamic_list or " \
5810	    "\$ld_exported_symbols_list should have been set to 'yes'."
5811    fi
5812fi
5813
5814if test -n "$gdb_bin"; then
5815    gdb_version=$($gdb_bin --version | head -n 1)
5816    if version_ge ${gdb_version##* } 9.1; then
5817        echo "HAVE_GDB_BIN=$gdb_bin" >> $config_host_mak
5818    fi
5819fi
5820
5821if test "$secret_keyring" = "yes" ; then
5822  echo "CONFIG_SECRET_KEYRING=y" >> $config_host_mak
5823fi
5824
5825echo "ROMS=$roms" >> $config_host_mak
5826echo "MAKE=$make" >> $config_host_mak
5827echo "PYTHON=$python" >> $config_host_mak
5828echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
5829echo "MESON=$meson" >> $config_host_mak
5830echo "NINJA=$ninja" >> $config_host_mak
5831echo "CC=$cc" >> $config_host_mak
5832echo "HOST_CC=$host_cc" >> $config_host_mak
5833if $iasl -h > /dev/null 2>&1; then
5834  echo "CONFIG_IASL=$iasl" >> $config_host_mak
5835fi
5836echo "CXX=$cxx" >> $config_host_mak
5837echo "OBJCC=$objcc" >> $config_host_mak
5838echo "AR=$ar" >> $config_host_mak
5839echo "ARFLAGS=$ARFLAGS" >> $config_host_mak
5840echo "AS=$as" >> $config_host_mak
5841echo "CCAS=$ccas" >> $config_host_mak
5842echo "CPP=$cpp" >> $config_host_mak
5843echo "OBJCOPY=$objcopy" >> $config_host_mak
5844echo "LD=$ld" >> $config_host_mak
5845echo "RANLIB=$ranlib" >> $config_host_mak
5846echo "NM=$nm" >> $config_host_mak
5847echo "PKG_CONFIG=$pkg_config_exe" >> $config_host_mak
5848echo "WINDRES=$windres" >> $config_host_mak
5849echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
5850echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
5851echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
5852echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
5853echo "GLIB_LIBS=$glib_libs" >> $config_host_mak
5854echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
5855echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
5856echo "EXESUF=$EXESUF" >> $config_host_mak
5857echo "HOST_DSOSUF=$HOST_DSOSUF" >> $config_host_mak
5858echo "LIBS_QGA=$libs_qga" >> $config_host_mak
5859if test "$gcov" = "yes" ; then
5860  echo "CONFIG_GCOV=y" >> $config_host_mak
5861fi
5862
5863if test "$fuzzing" != "no"; then
5864    echo "CONFIG_FUZZ=y" >> $config_host_mak
5865fi
5866echo "FUZZ_EXE_LDFLAGS=$FUZZ_EXE_LDFLAGS" >> $config_host_mak
5867
5868if test "$rng_none" = "yes"; then
5869  echo "CONFIG_RNG_NONE=y" >> $config_host_mak
5870fi
5871
5872# use included Linux headers
5873if test "$linux" = "yes" ; then
5874  mkdir -p linux-headers
5875  case "$cpu" in
5876  i386|x86_64|x32)
5877    linux_arch=x86
5878    ;;
5879  ppc|ppc64|ppc64le)
5880    linux_arch=powerpc
5881    ;;
5882  s390x)
5883    linux_arch=s390
5884    ;;
5885  aarch64)
5886    linux_arch=arm64
5887    ;;
5888  mips64)
5889    linux_arch=mips
5890    ;;
5891  *)
5892    # For most CPUs the kernel architecture name and QEMU CPU name match.
5893    linux_arch="$cpu"
5894    ;;
5895  esac
5896    # For non-KVM architectures we will not have asm headers
5897    if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
5898      symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
5899    fi
5900fi
5901
5902for target in $target_list; do
5903    target_dir="$target"
5904    target_name=$(echo $target | cut -d '-' -f 1)
5905    mkdir -p $target_dir
5906    case $target in
5907        *-user) symlink "../qemu-$target_name" "$target_dir/qemu-$target_name" ;;
5908        *) symlink "../qemu-system-$target_name" "$target_dir/qemu-system-$target_name" ;;
5909    esac
5910done
5911
5912echo "CONFIG_QEMU_INTERP_PREFIX=$interp_prefix" | sed 's/%M/@0@/' >> $config_host_mak
5913if test "$default_targets" = "yes"; then
5914  echo "CONFIG_DEFAULT_TARGETS=y" >> $config_host_mak
5915fi
5916
5917if test "$numa" = "yes"; then
5918  echo "CONFIG_NUMA=y" >> $config_host_mak
5919  echo "NUMA_LIBS=$numa_libs" >> $config_host_mak
5920fi
5921
5922if test "$ccache_cpp2" = "yes"; then
5923  echo "export CCACHE_CPP2=y" >> $config_host_mak
5924fi
5925
5926if test "$safe_stack" = "yes"; then
5927  echo "CONFIG_SAFESTACK=y" >> $config_host_mak
5928fi
5929
5930# If we're using a separate build tree, set it up now.
5931# DIRS are directories which we simply mkdir in the build tree;
5932# LINKS are things to symlink back into the source tree
5933# (these can be both files and directories).
5934# Caution: do not add files or directories here using wildcards. This
5935# will result in problems later if a new file matching the wildcard is
5936# added to the source tree -- nothing will cause configure to be rerun
5937# so the build tree will be missing the link back to the new file, and
5938# tests might fail. Prefer to keep the relevant files in their own
5939# directory and symlink the directory instead.
5940# UNLINK is used to remove symlinks from older development versions
5941# that might get into the way when doing "git update" without doing
5942# a "make distclean" in between.
5943DIRS="tests tests/tcg tests/qapi-schema tests/qtest/libqos"
5944DIRS="$DIRS tests/qtest tests/qemu-iotests tests/vm tests/fp tests/qgraph"
5945DIRS="$DIRS docs docs/interop fsdev scsi"
5946DIRS="$DIRS pc-bios/optionrom pc-bios/s390-ccw"
5947DIRS="$DIRS roms/seabios"
5948DIRS="$DIRS contrib/plugins/"
5949LINKS="Makefile"
5950LINKS="$LINKS tests/tcg/Makefile.target"
5951LINKS="$LINKS pc-bios/optionrom/Makefile"
5952LINKS="$LINKS pc-bios/s390-ccw/Makefile"
5953LINKS="$LINKS roms/seabios/Makefile"
5954LINKS="$LINKS pc-bios/qemu-icon.bmp"
5955LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
5956LINKS="$LINKS tests/acceptance tests/data"
5957LINKS="$LINKS tests/qemu-iotests/check"
5958LINKS="$LINKS python"
5959LINKS="$LINKS contrib/plugins/Makefile "
5960UNLINK="pc-bios/keymaps"
5961for bios_file in \
5962    $source_path/pc-bios/*.bin \
5963    $source_path/pc-bios/*.elf \
5964    $source_path/pc-bios/*.lid \
5965    $source_path/pc-bios/*.rom \
5966    $source_path/pc-bios/*.dtb \
5967    $source_path/pc-bios/*.img \
5968    $source_path/pc-bios/openbios-* \
5969    $source_path/pc-bios/u-boot.* \
5970    $source_path/pc-bios/edk2-*.fd.bz2 \
5971    $source_path/pc-bios/palcode-*
5972do
5973    LINKS="$LINKS pc-bios/$(basename $bios_file)"
5974done
5975mkdir -p $DIRS
5976for f in $LINKS ; do
5977    if [ -e "$source_path/$f" ]; then
5978        symlink "$source_path/$f" "$f"
5979    fi
5980done
5981for f in $UNLINK ; do
5982    if [ -L "$f" ]; then
5983        rm -f "$f"
5984    fi
5985done
5986
5987(for i in $cross_cc_vars; do
5988  export $i
5989done
5990export target_list source_path use_containers ARCH
5991$source_path/tests/tcg/configure.sh)
5992
5993# temporary config to build submodules
5994for rom in seabios; do
5995    config_mak=roms/$rom/config.mak
5996    echo "# Automatically generated by configure - do not modify" > $config_mak
5997    echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
5998    echo "AS=$as" >> $config_mak
5999    echo "CCAS=$ccas" >> $config_mak
6000    echo "CC=$cc" >> $config_mak
6001    echo "BCC=bcc" >> $config_mak
6002    echo "CPP=$cpp" >> $config_mak
6003    echo "OBJCOPY=objcopy" >> $config_mak
6004    echo "IASL=$iasl" >> $config_mak
6005    echo "LD=$ld" >> $config_mak
6006    echo "RANLIB=$ranlib" >> $config_mak
6007done
6008
6009if test "$skip_meson" = no; then
6010  cross="config-meson.cross.new"
6011  meson_quote() {
6012    echo "'$(echo $* | sed "s/ /','/g")'"
6013  }
6014
6015  echo "# Automatically generated by configure - do not modify" > $cross
6016  echo "[properties]" >> $cross
6017  test -z "$cxx" && echo "link_language = 'c'" >> $cross
6018  echo "[built-in options]" >> $cross
6019  echo "c_args = [${CFLAGS:+$(meson_quote $CFLAGS)}]" >> $cross
6020  echo "cpp_args = [${CXXFLAGS:+$(meson_quote $CXXFLAGS)}]" >> $cross
6021  echo "c_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
6022  echo "cpp_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
6023  echo "[binaries]" >> $cross
6024  echo "c = [$(meson_quote $cc)]" >> $cross
6025  test -n "$cxx" && echo "cpp = [$(meson_quote $cxx)]" >> $cross
6026  test -n "$objcc" && echo "objc = [$(meson_quote $objcc)]" >> $cross
6027  echo "ar = [$(meson_quote $ar)]" >> $cross
6028  echo "nm = [$(meson_quote $nm)]" >> $cross
6029  echo "pkgconfig = [$(meson_quote $pkg_config_exe)]" >> $cross
6030  echo "ranlib = [$(meson_quote $ranlib)]" >> $cross
6031  if has $sdl2_config; then
6032    echo "sdl2-config = [$(meson_quote $sdl2_config)]" >> $cross
6033  fi
6034  echo "strip = [$(meson_quote $strip)]" >> $cross
6035  echo "windres = [$(meson_quote $windres)]" >> $cross
6036  if test "$cross_compile" = "yes"; then
6037    cross_arg="--cross-file config-meson.cross"
6038    echo "[host_machine]" >> $cross
6039    if test "$mingw32" = "yes" ; then
6040        echo "system = 'windows'" >> $cross
6041    fi
6042    if test "$linux" = "yes" ; then
6043        echo "system = 'linux'" >> $cross
6044    fi
6045    if test "$darwin" = "yes" ; then
6046        echo "system = 'darwin'" >> $cross
6047    fi
6048    case "$ARCH" in
6049        i386)
6050            echo "cpu_family = 'x86'" >> $cross
6051            ;;
6052        x86_64|x32)
6053            echo "cpu_family = 'x86_64'" >> $cross
6054            ;;
6055        ppc64le)
6056            echo "cpu_family = 'ppc64'" >> $cross
6057            ;;
6058        *)
6059            echo "cpu_family = '$ARCH'" >> $cross
6060            ;;
6061    esac
6062    echo "cpu = '$cpu'" >> $cross
6063    if test "$bigendian" = "yes" ; then
6064        echo "endian = 'big'" >> $cross
6065    else
6066        echo "endian = 'little'" >> $cross
6067    fi
6068  else
6069    cross_arg="--native-file config-meson.cross"
6070  fi
6071  mv $cross config-meson.cross
6072
6073  rm -rf meson-private meson-info meson-logs
6074  unset staticpic
6075  if ! version_ge "$($meson --version)" 0.56.0; then
6076    staticpic=$(if test "$pie" = yes; then echo true; else echo false; fi)
6077  fi
6078  NINJA=$ninja $meson setup \
6079        --prefix "$prefix" \
6080        --libdir "$libdir" \
6081        --libexecdir "$libexecdir" \
6082        --bindir "$bindir" \
6083        --includedir "$includedir" \
6084        --datadir "$datadir" \
6085        --mandir "$mandir" \
6086        --sysconfdir "$sysconfdir" \
6087        --localedir "$localedir" \
6088        --localstatedir "$local_statedir" \
6089        -Ddocdir="$docdir" \
6090        -Dqemu_firmwarepath="$firmwarepath" \
6091        -Dqemu_suffix="$qemu_suffix" \
6092        -Doptimization=$(if test "$debug" = yes; then echo 0; else echo 2; fi) \
6093        -Ddebug=$(if test "$debug_info" = yes; then echo true; else echo false; fi) \
6094        -Dwerror=$(if test "$werror" = yes; then echo true; else echo false; fi) \
6095        -Dstrip=$(if test "$strip_opt" = yes; then echo true; else echo false; fi) \
6096        -Db_pie=$(if test "$pie" = yes; then echo true; else echo false; fi) \
6097        ${staticpic:+-Db_staticpic=$staticpic} \
6098        -Db_coverage=$(if test "$gcov" = yes; then echo true; else echo false; fi) \
6099        -Db_lto=$lto -Dcfi=$cfi -Dcfi_debug=$cfi_debug \
6100        -Dmalloc=$malloc -Dmalloc_trim=$malloc_trim -Dsparse=$sparse \
6101        -Dkvm=$kvm -Dhax=$hax -Dwhpx=$whpx -Dhvf=$hvf -Dnvmm=$nvmm \
6102        -Dxen=$xen -Dxen_pci_passthrough=$xen_pci_passthrough -Dtcg=$tcg \
6103        -Dcocoa=$cocoa -Dgtk=$gtk -Dmpath=$mpath -Dsdl=$sdl -Dsdl_image=$sdl_image \
6104        -Dlibusb=$libusb -Dsmartcard=$smartcard -Dusb_redir=$usb_redir -Dvte=$vte \
6105        -Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg -Dvnc_png=$vnc_png \
6106        -Dgettext=$gettext -Dxkbcommon=$xkbcommon -Du2f=$u2f -Dvirtiofsd=$virtiofsd \
6107        -Dcapstone=$capstone -Dslirp=$slirp -Dfdt=$fdt -Dbrlapi=$brlapi \
6108        -Dcurl=$curl -Dglusterfs=$glusterfs -Dbzip2=$bzip2 -Dlibiscsi=$libiscsi \
6109        -Dlibnfs=$libnfs -Diconv=$iconv -Dcurses=$curses -Dlibudev=$libudev\
6110        -Drbd=$rbd -Dlzo=$lzo -Dsnappy=$snappy -Dlzfse=$lzfse \
6111        -Dgnutls=$gnutls -Dnettle=$nettle -Dgcrypt=$gcrypt -Dauth_pam=$auth_pam \
6112        -Dzstd=$zstd -Dseccomp=$seccomp -Dvirtfs=$virtfs -Dcap_ng=$cap_ng \
6113        -Dattr=$attr -Ddefault_devices=$default_devices -Dvirglrenderer=$virglrenderer \
6114        -Ddocs=$docs -Dsphinx_build=$sphinx_build -Dinstall_blobs=$blobs \
6115        -Dvhost_user_blk_server=$vhost_user_blk_server -Dmultiprocess=$multiprocess \
6116        -Dfuse=$fuse -Dfuse_lseek=$fuse_lseek -Dguest_agent_msi=$guest_agent_msi -Dbpf=$bpf\
6117        $(if test "$default_features" = no; then echo "-Dauto_features=disabled"; fi) \
6118	-Dtcg_interpreter=$tcg_interpreter \
6119        $cross_arg \
6120        "$PWD" "$source_path"
6121
6122  if test "$?" -ne 0 ; then
6123      error_exit "meson setup failed"
6124  fi
6125else
6126  if test -f meson-private/cmd_line.txt; then
6127    # Adjust old command line options whose type was changed
6128    # Avoids having to use "setup --wipe" when Meson is upgraded
6129    perl -i -ne '
6130      s/^gettext = true$/gettext = auto/;
6131      s/^gettext = false$/gettext = disabled/;
6132      print;' meson-private/cmd_line.txt
6133  fi
6134fi
6135
6136if test -n "${deprecated_features}"; then
6137    echo "Warning, deprecated features enabled."
6138    echo "Please see docs/system/deprecated.rst"
6139    echo "  features: ${deprecated_features}"
6140fi
6141
6142# Create list of config switches that should be poisoned in common code...
6143# but filter out CONFIG_TCG and CONFIG_USER_ONLY which are special.
6144target_configs_h=$(ls *-config-devices.h *-config-target.h 2>/dev/null)
6145if test -n "$target_configs_h" ; then
6146    sed -n -e '/CONFIG_TCG/d' -e '/CONFIG_USER_ONLY/d' \
6147        -e '/^#define / { s///; s/ .*//; s/^/#pragma GCC poison /p; }' \
6148        $target_configs_h | sort -u > config-poison.h
6149else
6150    :> config-poison.h
6151fi
6152
6153# Save the configure command line for later reuse.
6154cat <<EOD >config.status
6155#!/bin/sh
6156# Generated by configure.
6157# Run this file to recreate the current configuration.
6158# Compiler output produced by configure, useful for debugging
6159# configure, is in config.log if it exists.
6160EOD
6161
6162preserve_env() {
6163    envname=$1
6164
6165    eval envval=\$$envname
6166
6167    if test -n "$envval"
6168    then
6169	echo "$envname='$envval'" >> config.status
6170	echo "export $envname" >> config.status
6171    else
6172	echo "unset $envname" >> config.status
6173    fi
6174}
6175
6176# Preserve various env variables that influence what
6177# features/build target configure will detect
6178preserve_env AR
6179preserve_env AS
6180preserve_env CC
6181preserve_env CPP
6182preserve_env CXX
6183preserve_env INSTALL
6184preserve_env LD
6185preserve_env LD_LIBRARY_PATH
6186preserve_env LIBTOOL
6187preserve_env MAKE
6188preserve_env NM
6189preserve_env OBJCOPY
6190preserve_env PATH
6191preserve_env PKG_CONFIG
6192preserve_env PKG_CONFIG_LIBDIR
6193preserve_env PKG_CONFIG_PATH
6194preserve_env PYTHON
6195preserve_env SDL2_CONFIG
6196preserve_env SMBD
6197preserve_env STRIP
6198preserve_env WINDRES
6199
6200printf "exec" >>config.status
6201for i in "$0" "$@"; do
6202  test "$i" = --skip-meson || printf " %s" "$(quote_sh "$i")" >>config.status
6203done
6204echo ' "$@"' >>config.status
6205chmod +x config.status
6206
6207rm -r "$TMPDIR1"
6208