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