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