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