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