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