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