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