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