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