xref: /openbmc/qemu/configure (revision dccdb0f82a0d018443b12fb13d91655a10b0a151)
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        if ! $python -c 'import pkg_resources' > /dev/null 2>&1; then
1916            error_exit "Python setuptools not found"
1917        fi
1918        meson="$python ${source_path}/meson/meson.py"
1919        ;;
1920    *) meson=$(command -v "$meson") ;;
1921esac
1922
1923# Probe for ninja
1924
1925if test -z "$ninja"; then
1926    for c in ninja ninja-build samu; do
1927        if has $c; then
1928            ninja=$(command -v "$c")
1929            break
1930        fi
1931    done
1932    if test -z "$ninja"; then
1933      error_exit "Cannot find Ninja"
1934    fi
1935fi
1936
1937# Check that the C compiler works. Doing this here before testing
1938# the host CPU ensures that we had a valid CC to autodetect the
1939# $cpu var (and we should bail right here if that's not the case).
1940# It also allows the help message to be printed without a CC.
1941write_c_skeleton;
1942if compile_object ; then
1943  : C compiler works ok
1944else
1945    error_exit "\"$cc\" either does not exist or does not work"
1946fi
1947if ! compile_prog ; then
1948    error_exit "\"$cc\" cannot build an executable (is your linker broken?)"
1949fi
1950
1951# Consult white-list to determine whether to enable werror
1952# by default.  Only enable by default for git builds
1953if test -z "$werror" ; then
1954    if test -e "$source_path/.git" && \
1955        { test "$linux" = "yes" || test "$mingw32" = "yes"; }; then
1956        werror="yes"
1957    else
1958        werror="no"
1959    fi
1960fi
1961
1962if test "$bogus_os" = "yes"; then
1963    # Now that we know that we're not printing the help and that
1964    # the compiler works (so the results of the check_defines we used
1965    # to identify the OS are reliable), if we didn't recognize the
1966    # host OS we should stop now.
1967    error_exit "Unrecognized host OS (uname -s reports '$(uname -s)')"
1968fi
1969
1970# Check whether the compiler matches our minimum requirements:
1971cat > $TMPC << EOF
1972#if defined(__clang_major__) && defined(__clang_minor__)
1973# ifdef __apple_build_version__
1974#  if __clang_major__ < 5 || (__clang_major__ == 5 && __clang_minor__ < 1)
1975#   error You need at least XCode Clang v5.1 to compile QEMU
1976#  endif
1977# else
1978#  if __clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ < 4)
1979#   error You need at least Clang v3.4 to compile QEMU
1980#  endif
1981# endif
1982#elif defined(__GNUC__) && defined(__GNUC_MINOR__)
1983# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8)
1984#  error You need at least GCC v4.8 to compile QEMU
1985# endif
1986#else
1987# error You either need GCC or Clang to compiler QEMU
1988#endif
1989int main (void) { return 0; }
1990EOF
1991if ! compile_prog "" "" ; then
1992    error_exit "You need at least GCC v4.8 or Clang v3.4 (or XCode Clang v5.1)"
1993fi
1994
1995# Accumulate -Wfoo and -Wno-bar separately.
1996# We will list all of the enable flags first, and the disable flags second.
1997# Note that we do not add -Werror, because that would enable it for all
1998# configure tests. If a configure test failed due to -Werror this would
1999# just silently disable some features, so it's too error prone.
2000
2001warn_flags=
2002add_to warn_flags -Wold-style-declaration
2003add_to warn_flags -Wold-style-definition
2004add_to warn_flags -Wtype-limits
2005add_to warn_flags -Wformat-security
2006add_to warn_flags -Wformat-y2k
2007add_to warn_flags -Winit-self
2008add_to warn_flags -Wignored-qualifiers
2009add_to warn_flags -Wempty-body
2010add_to warn_flags -Wnested-externs
2011add_to warn_flags -Wendif-labels
2012add_to warn_flags -Wexpansion-to-defined
2013
2014nowarn_flags=
2015add_to nowarn_flags -Wno-initializer-overrides
2016add_to nowarn_flags -Wno-missing-include-dirs
2017add_to nowarn_flags -Wno-shift-negative-value
2018add_to nowarn_flags -Wno-string-plus-int
2019add_to nowarn_flags -Wno-typedef-redefinition
2020add_to nowarn_flags -Wno-tautological-type-limit-compare
2021add_to nowarn_flags -Wno-psabi
2022
2023gcc_flags="$warn_flags $nowarn_flags"
2024
2025cc_has_warning_flag() {
2026    write_c_skeleton;
2027
2028    # Use the positive sense of the flag when testing for -Wno-wombat
2029    # support (gcc will happily accept the -Wno- form of unknown
2030    # warning options).
2031    optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
2032    compile_prog "-Werror $optflag" ""
2033}
2034
2035for flag in $gcc_flags; do
2036    if cc_has_warning_flag $flag ; then
2037        QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2038    fi
2039done
2040
2041if test "$stack_protector" != "no"; then
2042  cat > $TMPC << EOF
2043int main(int argc, char *argv[])
2044{
2045    char arr[64], *p = arr, *c = argv[0];
2046    while (*c) {
2047        *p++ = *c++;
2048    }
2049    return 0;
2050}
2051EOF
2052  gcc_flags="-fstack-protector-strong -fstack-protector-all"
2053  sp_on=0
2054  for flag in $gcc_flags; do
2055    # We need to check both a compile and a link, since some compiler
2056    # setups fail only on a .c->.o compile and some only at link time
2057    if compile_object "-Werror $flag" &&
2058       compile_prog "-Werror $flag" ""; then
2059      QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2060      QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
2061      sp_on=1
2062      break
2063    fi
2064  done
2065  if test "$stack_protector" = yes; then
2066    if test $sp_on = 0; then
2067      error_exit "Stack protector not supported"
2068    fi
2069  fi
2070fi
2071
2072# Disable -Wmissing-braces on older compilers that warn even for
2073# the "universal" C zero initializer {0}.
2074cat > $TMPC << EOF
2075struct {
2076  int a[2];
2077} x = {0};
2078EOF
2079if compile_object "-Werror" "" ; then
2080  :
2081else
2082  QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces"
2083fi
2084
2085# Our module code doesn't support Windows
2086if test "$modules" = "yes" && test "$mingw32" = "yes" ; then
2087  error_exit "Modules are not available for Windows"
2088fi
2089
2090# module_upgrades is only reasonable if modules are enabled
2091if test "$modules" = "no" && test "$module_upgrades" = "yes" ; then
2092  error_exit "Can't enable module-upgrades as Modules are not enabled"
2093fi
2094
2095# Static linking is not possible with modules or PIE
2096if test "$static" = "yes" ; then
2097  if test "$modules" = "yes" ; then
2098    error_exit "static and modules are mutually incompatible"
2099  fi
2100fi
2101
2102# Unconditional check for compiler __thread support
2103  cat > $TMPC << EOF
2104static __thread int tls_var;
2105int main(void) { return tls_var; }
2106EOF
2107
2108if ! compile_prog "-Werror" "" ; then
2109    error_exit "Your compiler does not support the __thread specifier for " \
2110	"Thread-Local Storage (TLS). Please upgrade to a version that does."
2111fi
2112
2113cat > $TMPC << EOF
2114
2115#ifdef __linux__
2116#  define THREAD __thread
2117#else
2118#  define THREAD
2119#endif
2120static THREAD int tls_var;
2121int main(void) { return tls_var; }
2122EOF
2123
2124# Check we support --no-pie first; we will need this for building ROMs.
2125if compile_prog "-Werror -fno-pie" "-no-pie"; then
2126  CFLAGS_NOPIE="-fno-pie"
2127  LDFLAGS_NOPIE="-no-pie"
2128fi
2129
2130if test "$static" = "yes"; then
2131  if test "$pie" != "no" && compile_prog "-Werror -fPIE -DPIE" "-static-pie"; then
2132    CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
2133    QEMU_LDFLAGS="-static-pie $QEMU_LDFLAGS"
2134    pie="yes"
2135  elif test "$pie" = "yes"; then
2136    error_exit "-static-pie not available due to missing toolchain support"
2137  else
2138    QEMU_LDFLAGS="-static $QEMU_LDFLAGS"
2139    pie="no"
2140  fi
2141elif test "$pie" = "no"; then
2142  CONFIGURE_CFLAGS="$CFLAGS_NOPIE $CONFIGURE_CFLAGS"
2143  CONFIGURE_LDFLAGS="$LDFLAGS_NOPIE $CONFIGURE_LDFLAGS"
2144elif compile_prog "-Werror -fPIE -DPIE" "-pie"; then
2145  CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
2146  CONFIGURE_LDFLAGS="-pie $CONFIGURE_LDFLAGS"
2147  pie="yes"
2148elif test "$pie" = "yes"; then
2149  error_exit "PIE not available due to missing toolchain support"
2150else
2151  echo "Disabling PIE due to missing toolchain support"
2152  pie="no"
2153fi
2154
2155# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
2156# The combination is known as "full relro", because .got.plt is read-only too.
2157if compile_prog "" "-Wl,-z,relro -Wl,-z,now" ; then
2158  QEMU_LDFLAGS="-Wl,-z,relro -Wl,-z,now $QEMU_LDFLAGS"
2159fi
2160
2161##########################################
2162# __sync_fetch_and_and requires at least -march=i486. Many toolchains
2163# use i686 as default anyway, but for those that don't, an explicit
2164# specification is necessary
2165
2166if test "$cpu" = "i386"; then
2167  cat > $TMPC << EOF
2168static int sfaa(int *ptr)
2169{
2170  return __sync_fetch_and_and(ptr, 0);
2171}
2172
2173int main(void)
2174{
2175  int val = 42;
2176  val = __sync_val_compare_and_swap(&val, 0, 1);
2177  sfaa(&val);
2178  return val;
2179}
2180EOF
2181  if ! compile_prog "" "" ; then
2182    QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS"
2183  fi
2184fi
2185
2186#########################################
2187# Solaris specific configure tool chain decisions
2188
2189if test "$solaris" = "yes" ; then
2190  if has ar; then
2191    :
2192  else
2193    if test -f /usr/ccs/bin/ar ; then
2194      error_exit "No path includes ar" \
2195          "Add /usr/ccs/bin to your path and rerun configure"
2196    fi
2197    error_exit "No path includes ar"
2198  fi
2199fi
2200
2201if test -z "${target_list+xxx}" ; then
2202    default_targets=yes
2203    for target in $default_target_list; do
2204        target_list="$target_list $target"
2205    done
2206    target_list="${target_list# }"
2207else
2208    default_targets=no
2209    target_list=$(echo "$target_list" | sed -e 's/,/ /g')
2210    for target in $target_list; do
2211        # Check that we recognised the target name; this allows a more
2212        # friendly error message than if we let it fall through.
2213        case " $default_target_list " in
2214            *" $target "*)
2215                ;;
2216            *)
2217                error_exit "Unknown target name '$target'"
2218                ;;
2219        esac
2220    done
2221fi
2222
2223for target in $target_list; do
2224    # if a deprecated target is enabled we note it here
2225    if echo "$deprecated_targets_list" | grep -q "$target"; then
2226        add_to deprecated_features $target
2227    fi
2228done
2229
2230# see if system emulation was really requested
2231case " $target_list " in
2232  *"-softmmu "*) softmmu=yes
2233  ;;
2234  *) softmmu=no
2235  ;;
2236esac
2237
2238feature_not_found() {
2239  feature=$1
2240  remedy=$2
2241
2242  error_exit "User requested feature $feature" \
2243      "configure was not able to find it." \
2244      "$remedy"
2245}
2246
2247# ---
2248# big/little endian test
2249cat > $TMPC << EOF
2250short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, };
2251short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, };
2252extern int foo(short *, short *);
2253int main(int argc, char *argv[]) {
2254    return foo(big_endian, little_endian);
2255}
2256EOF
2257
2258if compile_object ; then
2259    if strings -a $TMPO | grep -q BiGeNdIaN ; then
2260        bigendian="yes"
2261    elif strings -a $TMPO | grep -q LiTtLeEnDiAn ; then
2262        bigendian="no"
2263    else
2264        echo big/little test failed
2265    fi
2266else
2267    echo big/little test failed
2268fi
2269
2270##########################################
2271# system tools
2272if test -z "$want_tools"; then
2273    if test "$softmmu" = "no"; then
2274        want_tools=no
2275    else
2276        want_tools=yes
2277    fi
2278fi
2279
2280##########################################
2281# cocoa implies not SDL or GTK
2282# (the cocoa UI code currently assumes it is always the active UI
2283# and doesn't interact well with other UI frontend code)
2284if test "$cocoa" = "enabled"; then
2285    if test "$sdl" = "enabled"; then
2286        error_exit "Cocoa and SDL UIs cannot both be enabled at once"
2287    fi
2288    if test "$gtk" = "yes"; then
2289        error_exit "Cocoa and GTK UIs cannot both be enabled at once"
2290    fi
2291    gtk=no
2292    sdl=disabled
2293fi
2294
2295# Some versions of Mac OS X incorrectly define SIZE_MAX
2296cat > $TMPC << EOF
2297#include <stdint.h>
2298#include <stdio.h>
2299int main(int argc, char *argv[]) {
2300    return printf("%zu", SIZE_MAX);
2301}
2302EOF
2303have_broken_size_max=no
2304if ! compile_object -Werror ; then
2305    have_broken_size_max=yes
2306fi
2307
2308##########################################
2309# L2TPV3 probe
2310
2311cat > $TMPC <<EOF
2312#include <sys/socket.h>
2313#include <linux/ip.h>
2314int main(void) { return sizeof(struct mmsghdr); }
2315EOF
2316if compile_prog "" "" ; then
2317  l2tpv3=yes
2318else
2319  l2tpv3=no
2320fi
2321
2322if check_include "pty.h" ; then
2323  pty_h=yes
2324else
2325  pty_h=no
2326fi
2327
2328cat > $TMPC <<EOF
2329#include <sys/mman.h>
2330int main(int argc, char *argv[]) {
2331    return mlockall(MCL_FUTURE);
2332}
2333EOF
2334if compile_prog "" "" ; then
2335  have_mlockall=yes
2336else
2337  have_mlockall=no
2338fi
2339
2340#########################################
2341# vhost interdependencies and host support
2342
2343# vhost backends
2344if test "$vhost_user" = "yes" && test "$linux" != "yes"; then
2345  error_exit "vhost-user is only available on Linux"
2346fi
2347test "$vhost_vdpa" = "" && vhost_vdpa=$linux
2348if test "$vhost_vdpa" = "yes" && test "$linux" != "yes"; then
2349  error_exit "vhost-vdpa is only available on Linux"
2350fi
2351test "$vhost_kernel" = "" && vhost_kernel=$linux
2352if test "$vhost_kernel" = "yes" && test "$linux" != "yes"; then
2353  error_exit "vhost-kernel is only available on Linux"
2354fi
2355
2356# vhost-kernel devices
2357test "$vhost_scsi" = "" && vhost_scsi=$vhost_kernel
2358if test "$vhost_scsi" = "yes" && test "$vhost_kernel" != "yes"; then
2359  error_exit "--enable-vhost-scsi requires --enable-vhost-kernel"
2360fi
2361test "$vhost_vsock" = "" && vhost_vsock=$vhost_kernel
2362if test "$vhost_vsock" = "yes" && test "$vhost_kernel" != "yes"; then
2363  error_exit "--enable-vhost-vsock requires --enable-vhost-kernel"
2364fi
2365
2366# vhost-user backends
2367test "$vhost_net_user" = "" && vhost_net_user=$vhost_user
2368if test "$vhost_net_user" = "yes" && test "$vhost_user" = "no"; then
2369  error_exit "--enable-vhost-net-user requires --enable-vhost-user"
2370fi
2371test "$vhost_crypto" = "" && vhost_crypto=$vhost_user
2372if test "$vhost_crypto" = "yes" && test "$vhost_user" = "no"; then
2373  error_exit "--enable-vhost-crypto requires --enable-vhost-user"
2374fi
2375test "$vhost_user_fs" = "" && vhost_user_fs=$vhost_user
2376if test "$vhost_user_fs" = "yes" && test "$vhost_user" = "no"; then
2377  error_exit "--enable-vhost-user-fs requires --enable-vhost-user"
2378fi
2379#vhost-vdpa backends
2380test "$vhost_net_vdpa" = "" && vhost_net_vdpa=$vhost_vdpa
2381if test "$vhost_net_vdpa" = "yes" && test "$vhost_vdpa" = "no"; then
2382  error_exit "--enable-vhost-net-vdpa requires --enable-vhost-vdpa"
2383fi
2384
2385# OR the vhost-kernel, vhost-vdpa and vhost-user values for simplicity
2386if test "$vhost_net" = ""; then
2387  test "$vhost_net_user" = "yes" && vhost_net=yes
2388  test "$vhost_net_vdpa" = "yes" && vhost_net=yes
2389  test "$vhost_kernel" = "yes" && vhost_net=yes
2390fi
2391
2392##########################################
2393# pkg-config probe
2394
2395if ! has "$pkg_config_exe"; then
2396  error_exit "pkg-config binary '$pkg_config_exe' not found"
2397fi
2398
2399##########################################
2400# NPTL probe
2401
2402if test "$linux_user" = "yes"; then
2403  cat > $TMPC <<EOF
2404#include <sched.h>
2405#include <linux/futex.h>
2406int main(void) {
2407#if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
2408#error bork
2409#endif
2410  return 0;
2411}
2412EOF
2413  if ! compile_object ; then
2414    feature_not_found "nptl" "Install glibc and linux kernel headers."
2415  fi
2416fi
2417
2418##########################################
2419# lzo check
2420
2421if test "$lzo" != "no" ; then
2422    cat > $TMPC << EOF
2423#include <lzo/lzo1x.h>
2424int main(void) { lzo_version(); return 0; }
2425EOF
2426    if compile_prog "" "-llzo2" ; then
2427        lzo_libs="-llzo2"
2428        lzo="yes"
2429    else
2430        if test "$lzo" = "yes"; then
2431            feature_not_found "liblzo2" "Install liblzo2 devel"
2432        fi
2433        lzo="no"
2434    fi
2435fi
2436
2437##########################################
2438# snappy check
2439
2440if test "$snappy" != "no" ; then
2441    cat > $TMPC << EOF
2442#include <snappy-c.h>
2443int main(void) { snappy_max_compressed_length(4096); return 0; }
2444EOF
2445    if compile_prog "" "-lsnappy" ; then
2446        snappy_libs='-lsnappy'
2447        snappy="yes"
2448    else
2449        if test "$snappy" = "yes"; then
2450            feature_not_found "libsnappy" "Install libsnappy devel"
2451        fi
2452        snappy="no"
2453    fi
2454fi
2455
2456##########################################
2457# bzip2 check
2458
2459if test "$bzip2" != "no" ; then
2460    cat > $TMPC << EOF
2461#include <bzlib.h>
2462int main(void) { BZ2_bzlibVersion(); return 0; }
2463EOF
2464    if compile_prog "" "-lbz2" ; then
2465        bzip2="yes"
2466    else
2467        if test "$bzip2" = "yes"; then
2468            feature_not_found "libbzip2" "Install libbzip2 devel"
2469        fi
2470        bzip2="no"
2471    fi
2472fi
2473
2474##########################################
2475# lzfse check
2476
2477if test "$lzfse" != "no" ; then
2478    cat > $TMPC << EOF
2479#include <lzfse.h>
2480int main(void) { lzfse_decode_scratch_size(); return 0; }
2481EOF
2482    if compile_prog "" "-llzfse" ; then
2483        lzfse="yes"
2484    else
2485        if test "$lzfse" = "yes"; then
2486            feature_not_found "lzfse" "Install lzfse devel"
2487        fi
2488        lzfse="no"
2489    fi
2490fi
2491
2492##########################################
2493# zstd check
2494
2495if test "$zstd" != "no" ; then
2496    libzstd_minver="1.4.0"
2497    if $pkg_config --atleast-version=$libzstd_minver libzstd ; then
2498        zstd_cflags="$($pkg_config --cflags libzstd)"
2499        zstd_libs="$($pkg_config --libs libzstd)"
2500        zstd="yes"
2501    else
2502        if test "$zstd" = "yes" ; then
2503            feature_not_found "libzstd" "Install libzstd devel"
2504        fi
2505        zstd="no"
2506    fi
2507fi
2508
2509##########################################
2510# libseccomp check
2511
2512if test "$seccomp" != "no" ; then
2513    libseccomp_minver="2.3.0"
2514    if $pkg_config --atleast-version=$libseccomp_minver libseccomp ; then
2515        seccomp_cflags="$($pkg_config --cflags libseccomp)"
2516        seccomp_libs="$($pkg_config --libs libseccomp)"
2517        seccomp="yes"
2518    else
2519        if test "$seccomp" = "yes" ; then
2520            feature_not_found "libseccomp" \
2521                 "Install libseccomp devel >= $libseccomp_minver"
2522        fi
2523        seccomp="no"
2524    fi
2525fi
2526
2527##########################################
2528# xen probe
2529
2530if test "$xen" != "disabled" ; then
2531  # Check whether Xen library path is specified via --extra-ldflags to avoid
2532  # overriding this setting with pkg-config output. If not, try pkg-config
2533  # to obtain all needed flags.
2534
2535  if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
2536     $pkg_config --exists xencontrol ; then
2537    xen_ctrl_version="$(printf '%d%02d%02d' \
2538      $($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
2539    xen=enabled
2540    xen_pc="xencontrol xenstore xenforeignmemory xengnttab"
2541    xen_pc="$xen_pc xenevtchn xendevicemodel"
2542    if $pkg_config --exists xentoolcore; then
2543      xen_pc="$xen_pc xentoolcore"
2544    fi
2545    xen_cflags="$($pkg_config --cflags $xen_pc)"
2546    xen_libs="$($pkg_config --libs $xen_pc)"
2547  else
2548
2549    xen_libs="-lxenstore -lxenctrl"
2550    xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
2551
2552    # First we test whether Xen headers and libraries are available.
2553    # If no, we are done and there is no Xen support.
2554    # If yes, more tests are run to detect the Xen version.
2555
2556    # Xen (any)
2557    cat > $TMPC <<EOF
2558#include <xenctrl.h>
2559int main(void) {
2560  return 0;
2561}
2562EOF
2563    if ! compile_prog "" "$xen_libs" ; then
2564      # Xen not found
2565      if test "$xen" = "enabled" ; then
2566        feature_not_found "xen" "Install xen devel"
2567      fi
2568      xen=disabled
2569
2570    # Xen unstable
2571    elif
2572        cat > $TMPC <<EOF &&
2573#undef XC_WANT_COMPAT_DEVICEMODEL_API
2574#define __XEN_TOOLS__
2575#include <xendevicemodel.h>
2576#include <xenforeignmemory.h>
2577int main(void) {
2578  xendevicemodel_handle *xd;
2579  xenforeignmemory_handle *xfmem;
2580
2581  xd = xendevicemodel_open(0, 0);
2582  xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
2583
2584  xfmem = xenforeignmemory_open(0, 0);
2585  xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
2586
2587  return 0;
2588}
2589EOF
2590        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2591      then
2592      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2593      xen_ctrl_version=41100
2594      xen=enabled
2595    elif
2596        cat > $TMPC <<EOF &&
2597#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2598#include <xenforeignmemory.h>
2599#include <xentoolcore.h>
2600int main(void) {
2601  xenforeignmemory_handle *xfmem;
2602
2603  xfmem = xenforeignmemory_open(0, 0);
2604  xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
2605  xentoolcore_restrict_all(0);
2606
2607  return 0;
2608}
2609EOF
2610        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2611      then
2612      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2613      xen_ctrl_version=41000
2614      xen=enabled
2615    elif
2616        cat > $TMPC <<EOF &&
2617#undef XC_WANT_COMPAT_DEVICEMODEL_API
2618#define __XEN_TOOLS__
2619#include <xendevicemodel.h>
2620int main(void) {
2621  xendevicemodel_handle *xd;
2622
2623  xd = xendevicemodel_open(0, 0);
2624  xendevicemodel_close(xd);
2625
2626  return 0;
2627}
2628EOF
2629        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
2630      then
2631      xen_stable_libs="-lxendevicemodel $xen_stable_libs"
2632      xen_ctrl_version=40900
2633      xen=enabled
2634    elif
2635        cat > $TMPC <<EOF &&
2636/*
2637 * If we have stable libs the we don't want the libxc compat
2638 * layers, regardless of what CFLAGS we may have been given.
2639 *
2640 * Also, check if xengnttab_grant_copy_segment_t is defined and
2641 * grant copy operation is implemented.
2642 */
2643#undef XC_WANT_COMPAT_EVTCHN_API
2644#undef XC_WANT_COMPAT_GNTTAB_API
2645#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2646#include <xenctrl.h>
2647#include <xenstore.h>
2648#include <xenevtchn.h>
2649#include <xengnttab.h>
2650#include <xenforeignmemory.h>
2651#include <stdint.h>
2652#include <xen/hvm/hvm_info_table.h>
2653#if !defined(HVM_MAX_VCPUS)
2654# error HVM_MAX_VCPUS not defined
2655#endif
2656int main(void) {
2657  xc_interface *xc = NULL;
2658  xenforeignmemory_handle *xfmem;
2659  xenevtchn_handle *xe;
2660  xengnttab_handle *xg;
2661  xengnttab_grant_copy_segment_t* seg = NULL;
2662
2663  xs_daemon_open();
2664
2665  xc = xc_interface_open(0, 0, 0);
2666  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2667  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2668  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2669  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2670
2671  xfmem = xenforeignmemory_open(0, 0);
2672  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2673
2674  xe = xenevtchn_open(0, 0);
2675  xenevtchn_fd(xe);
2676
2677  xg = xengnttab_open(0, 0);
2678  xengnttab_grant_copy(xg, 0, seg);
2679
2680  return 0;
2681}
2682EOF
2683        compile_prog "" "$xen_libs $xen_stable_libs"
2684      then
2685      xen_ctrl_version=40800
2686      xen=enabled
2687    elif
2688        cat > $TMPC <<EOF &&
2689/*
2690 * If we have stable libs the we don't want the libxc compat
2691 * layers, regardless of what CFLAGS we may have been given.
2692 */
2693#undef XC_WANT_COMPAT_EVTCHN_API
2694#undef XC_WANT_COMPAT_GNTTAB_API
2695#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2696#include <xenctrl.h>
2697#include <xenstore.h>
2698#include <xenevtchn.h>
2699#include <xengnttab.h>
2700#include <xenforeignmemory.h>
2701#include <stdint.h>
2702#include <xen/hvm/hvm_info_table.h>
2703#if !defined(HVM_MAX_VCPUS)
2704# error HVM_MAX_VCPUS not defined
2705#endif
2706int main(void) {
2707  xc_interface *xc = NULL;
2708  xenforeignmemory_handle *xfmem;
2709  xenevtchn_handle *xe;
2710  xengnttab_handle *xg;
2711
2712  xs_daemon_open();
2713
2714  xc = xc_interface_open(0, 0, 0);
2715  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2716  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2717  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2718  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2719
2720  xfmem = xenforeignmemory_open(0, 0);
2721  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2722
2723  xe = xenevtchn_open(0, 0);
2724  xenevtchn_fd(xe);
2725
2726  xg = xengnttab_open(0, 0);
2727  xengnttab_map_grant_ref(xg, 0, 0, 0);
2728
2729  return 0;
2730}
2731EOF
2732        compile_prog "" "$xen_libs $xen_stable_libs"
2733      then
2734      xen_ctrl_version=40701
2735      xen=enabled
2736
2737    # Xen 4.6
2738    elif
2739        cat > $TMPC <<EOF &&
2740#include <xenctrl.h>
2741#include <xenstore.h>
2742#include <stdint.h>
2743#include <xen/hvm/hvm_info_table.h>
2744#if !defined(HVM_MAX_VCPUS)
2745# error HVM_MAX_VCPUS not defined
2746#endif
2747int main(void) {
2748  xc_interface *xc;
2749  xs_daemon_open();
2750  xc = xc_interface_open(0, 0, 0);
2751  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2752  xc_gnttab_open(NULL, 0);
2753  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2754  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2755  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2756  xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
2757  return 0;
2758}
2759EOF
2760        compile_prog "" "$xen_libs"
2761      then
2762      xen_ctrl_version=40600
2763      xen=enabled
2764
2765    # Xen 4.5
2766    elif
2767        cat > $TMPC <<EOF &&
2768#include <xenctrl.h>
2769#include <xenstore.h>
2770#include <stdint.h>
2771#include <xen/hvm/hvm_info_table.h>
2772#if !defined(HVM_MAX_VCPUS)
2773# error HVM_MAX_VCPUS not defined
2774#endif
2775int main(void) {
2776  xc_interface *xc;
2777  xs_daemon_open();
2778  xc = xc_interface_open(0, 0, 0);
2779  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2780  xc_gnttab_open(NULL, 0);
2781  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2782  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2783  xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
2784  return 0;
2785}
2786EOF
2787        compile_prog "" "$xen_libs"
2788      then
2789      xen_ctrl_version=40500
2790      xen=enabled
2791
2792    elif
2793        cat > $TMPC <<EOF &&
2794#include <xenctrl.h>
2795#include <xenstore.h>
2796#include <stdint.h>
2797#include <xen/hvm/hvm_info_table.h>
2798#if !defined(HVM_MAX_VCPUS)
2799# error HVM_MAX_VCPUS not defined
2800#endif
2801int main(void) {
2802  xc_interface *xc;
2803  xs_daemon_open();
2804  xc = xc_interface_open(0, 0, 0);
2805  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2806  xc_gnttab_open(NULL, 0);
2807  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2808  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2809  return 0;
2810}
2811EOF
2812        compile_prog "" "$xen_libs"
2813      then
2814      xen_ctrl_version=40200
2815      xen=enabled
2816
2817    else
2818      if test "$xen" = "enabled" ; then
2819        feature_not_found "xen (unsupported version)" \
2820                          "Install a supported xen (xen 4.2 or newer)"
2821      fi
2822      xen=disabled
2823    fi
2824
2825    if test "$xen" = enabled; then
2826      if test $xen_ctrl_version -ge 40701  ; then
2827        xen_libs="$xen_libs $xen_stable_libs "
2828      fi
2829    fi
2830  fi
2831fi
2832
2833if test "$xen_pci_passthrough" != "disabled"; then
2834  if test "$xen" = "enabled" && test "$linux" = "yes"; then
2835    xen_pci_passthrough=enabled
2836  else
2837    if test "$xen_pci_passthrough" = "enabled"; then
2838      error_exit "User requested feature Xen PCI Passthrough" \
2839          " but this feature requires /sys from Linux"
2840    fi
2841    xen_pci_passthrough=disabled
2842  fi
2843fi
2844
2845##########################################
2846# gettext probe
2847if test "$gettext" != "false" ; then
2848  if has xgettext; then
2849    gettext=true
2850  else
2851    if test "$gettext" = "true" ; then
2852      feature_not_found "gettext" "Install xgettext binary"
2853    fi
2854    gettext=false
2855  fi
2856fi
2857
2858##########################################
2859# X11 probe
2860if $pkg_config --exists "x11"; then
2861    have_x11=yes
2862    x11_cflags=$($pkg_config --cflags x11)
2863    x11_libs=$($pkg_config --libs x11)
2864fi
2865
2866##########################################
2867# GTK probe
2868
2869if test "$gtk" != "no"; then
2870    gtkpackage="gtk+-3.0"
2871    gtkx11package="gtk+-x11-3.0"
2872    gtkversion="3.22.0"
2873    if $pkg_config --exists "$gtkpackage >= $gtkversion"; then
2874        gtk_cflags=$($pkg_config --cflags $gtkpackage)
2875        gtk_libs=$($pkg_config --libs $gtkpackage)
2876        gtk_version=$($pkg_config --modversion $gtkpackage)
2877        if $pkg_config --exists "$gtkx11package >= $gtkversion"; then
2878            need_x11=yes
2879            gtk_cflags="$gtk_cflags $x11_cflags"
2880            gtk_libs="$gtk_libs $x11_libs"
2881        fi
2882        gtk="yes"
2883    elif test "$gtk" = "yes"; then
2884        feature_not_found "gtk" "Install gtk3-devel"
2885    else
2886        gtk="no"
2887    fi
2888fi
2889
2890
2891##########################################
2892# GNUTLS probe
2893
2894if test "$gnutls" != "no"; then
2895    pass="no"
2896    if $pkg_config --exists "gnutls >= 3.1.18"; then
2897        gnutls_cflags=$($pkg_config --cflags gnutls)
2898        gnutls_libs=$($pkg_config --libs gnutls)
2899        # Packaging for the static libraries is not always correct.
2900        # At least ubuntu 18.04 ships only shared libraries.
2901        write_c_skeleton
2902        if compile_prog "" "$gnutls_libs" ; then
2903            pass="yes"
2904        fi
2905    fi
2906    if test "$pass" = "no" && test "$gnutls" = "yes"; then
2907	feature_not_found "gnutls" "Install gnutls devel >= 3.1.18"
2908    else
2909        gnutls="$pass"
2910    fi
2911fi
2912
2913
2914# If user didn't give a --disable/enable-gcrypt flag,
2915# then mark as disabled if user requested nettle
2916# explicitly
2917if test -z "$gcrypt"
2918then
2919    if test "$nettle" = "yes"
2920    then
2921        gcrypt="no"
2922    fi
2923fi
2924
2925# If user didn't give a --disable/enable-nettle flag,
2926# then mark as disabled if user requested gcrypt
2927# explicitly
2928if test -z "$nettle"
2929then
2930    if test "$gcrypt" = "yes"
2931    then
2932        nettle="no"
2933    fi
2934fi
2935
2936has_libgcrypt() {
2937    if ! has "libgcrypt-config"
2938    then
2939	return 1
2940    fi
2941
2942    if test -n "$cross_prefix"
2943    then
2944	host=$(libgcrypt-config --host)
2945	if test "$host-" != $cross_prefix
2946	then
2947	    return 1
2948	fi
2949    fi
2950
2951    maj=`libgcrypt-config --version | awk -F . '{print $1}'`
2952    min=`libgcrypt-config --version | awk -F . '{print $2}'`
2953
2954    if test $maj != 1 || test $min -lt 5
2955    then
2956       return 1
2957    fi
2958
2959    return 0
2960}
2961
2962
2963if test "$nettle" != "no"; then
2964    pass="no"
2965    if $pkg_config --exists "nettle >= 2.7.1"; then
2966        nettle_cflags=$($pkg_config --cflags nettle)
2967        nettle_libs=$($pkg_config --libs nettle)
2968        nettle_version=$($pkg_config --modversion nettle)
2969        # Link test to make sure the given libraries work (e.g for static).
2970        write_c_skeleton
2971        if compile_prog "" "$nettle_libs" ; then
2972            if test -z "$gcrypt"; then
2973               gcrypt="no"
2974            fi
2975            pass="yes"
2976        fi
2977    fi
2978    if test "$pass" = "yes"
2979    then
2980        cat > $TMPC << EOF
2981#include <nettle/xts.h>
2982int main(void) {
2983  return 0;
2984}
2985EOF
2986        if compile_prog "$nettle_cflags" "$nettle_libs" ; then
2987            nettle_xts=yes
2988            qemu_private_xts=no
2989        fi
2990    fi
2991    if test "$pass" = "no" && test "$nettle" = "yes"; then
2992        feature_not_found "nettle" "Install nettle devel >= 2.7.1"
2993    else
2994        nettle="$pass"
2995    fi
2996fi
2997
2998if test "$gcrypt" != "no"; then
2999    pass="no"
3000    if has_libgcrypt; then
3001        gcrypt_cflags=$(libgcrypt-config --cflags)
3002        gcrypt_libs=$(libgcrypt-config --libs)
3003        # Debian has removed -lgpg-error from libgcrypt-config
3004        # as it "spreads unnecessary dependencies" which in
3005        # turn breaks static builds...
3006        if test "$static" = "yes"
3007        then
3008            gcrypt_libs="$gcrypt_libs -lgpg-error"
3009        fi
3010
3011        # Link test to make sure the given libraries work (e.g for static).
3012        write_c_skeleton
3013        if compile_prog "" "$gcrypt_libs" ; then
3014            pass="yes"
3015        fi
3016    fi
3017    if test "$pass" = "yes"; then
3018        gcrypt="yes"
3019        cat > $TMPC << EOF
3020#include <gcrypt.h>
3021int main(void) {
3022  gcry_mac_hd_t handle;
3023  gcry_mac_open(&handle, GCRY_MAC_HMAC_MD5,
3024                GCRY_MAC_FLAG_SECURE, NULL);
3025  return 0;
3026}
3027EOF
3028        if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
3029            gcrypt_hmac=yes
3030        fi
3031        cat > $TMPC << EOF
3032#include <gcrypt.h>
3033int main(void) {
3034  gcry_cipher_hd_t handle;
3035  gcry_cipher_open(&handle, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_XTS, 0);
3036  return 0;
3037}
3038EOF
3039        if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
3040            gcrypt_xts=yes
3041            qemu_private_xts=no
3042        fi
3043    elif test "$gcrypt" = "yes"; then
3044        feature_not_found "gcrypt" "Install gcrypt devel >= 1.5.0"
3045    else
3046        gcrypt="no"
3047    fi
3048fi
3049
3050
3051if test "$gcrypt" = "yes" && test "$nettle" = "yes"
3052then
3053    error_exit "Only one of gcrypt & nettle can be enabled"
3054fi
3055
3056##########################################
3057# libtasn1 - only for the TLS creds/session test suite
3058
3059tasn1=yes
3060tasn1_cflags=""
3061tasn1_libs=""
3062if $pkg_config --exists "libtasn1"; then
3063    tasn1_cflags=$($pkg_config --cflags libtasn1)
3064    tasn1_libs=$($pkg_config --libs libtasn1)
3065else
3066    tasn1=no
3067fi
3068
3069
3070##########################################
3071# PAM probe
3072
3073if test "$auth_pam" != "no"; then
3074    cat > $TMPC <<EOF
3075#include <security/pam_appl.h>
3076#include <stdio.h>
3077int main(void) {
3078   const char *service_name = "qemu";
3079   const char *user = "frank";
3080   const struct pam_conv pam_conv = { 0 };
3081   pam_handle_t *pamh = NULL;
3082   pam_start(service_name, user, &pam_conv, &pamh);
3083   return 0;
3084}
3085EOF
3086    if compile_prog "" "-lpam" ; then
3087        auth_pam=yes
3088    else
3089        if test "$auth_pam" = "yes"; then
3090            feature_not_found "PAM" "Install PAM development package"
3091        else
3092            auth_pam=no
3093        fi
3094    fi
3095fi
3096
3097##########################################
3098# getifaddrs (for tests/test-io-channel-socket )
3099
3100have_ifaddrs_h=yes
3101if ! check_include "ifaddrs.h" ; then
3102  have_ifaddrs_h=no
3103fi
3104
3105#########################################
3106# libdrm check
3107have_drm_h=no
3108if check_include "libdrm/drm.h" ; then
3109    have_drm_h=yes
3110fi
3111
3112#########################################
3113# sys/signal.h check
3114have_sys_signal_h=no
3115if check_include "sys/signal.h" ; then
3116  have_sys_signal_h=yes
3117fi
3118
3119##########################################
3120# VTE probe
3121
3122if test "$vte" != "no"; then
3123    vteminversion="0.32.0"
3124    if $pkg_config --exists "vte-2.91"; then
3125      vtepackage="vte-2.91"
3126    else
3127      vtepackage="vte-2.90"
3128    fi
3129    if $pkg_config --exists "$vtepackage >= $vteminversion"; then
3130        vte_cflags=$($pkg_config --cflags $vtepackage)
3131        vte_libs=$($pkg_config --libs $vtepackage)
3132        vteversion=$($pkg_config --modversion $vtepackage)
3133        vte="yes"
3134    elif test "$vte" = "yes"; then
3135        feature_not_found "vte" "Install libvte-2.90/2.91 devel"
3136    else
3137        vte="no"
3138    fi
3139fi
3140
3141##########################################
3142# RDMA needs OpenFabrics libraries
3143if test "$rdma" != "no" ; then
3144  cat > $TMPC <<EOF
3145#include <rdma/rdma_cma.h>
3146int main(void) { return 0; }
3147EOF
3148  rdma_libs="-lrdmacm -libverbs -libumad"
3149  if compile_prog "" "$rdma_libs" ; then
3150    rdma="yes"
3151  else
3152    if test "$rdma" = "yes" ; then
3153        error_exit \
3154            " OpenFabrics librdmacm/libibverbs/libibumad not present." \
3155            " Your options:" \
3156            "  (1) Fast: Install infiniband packages (devel) from your distro." \
3157            "  (2) Cleanest: Install libraries from www.openfabrics.org" \
3158            "  (3) Also: Install softiwarp if you don't have RDMA hardware"
3159    fi
3160    rdma="no"
3161  fi
3162fi
3163
3164##########################################
3165# PVRDMA detection
3166
3167cat > $TMPC <<EOF &&
3168#include <sys/mman.h>
3169
3170int
3171main(void)
3172{
3173    char buf = 0;
3174    void *addr = &buf;
3175    addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
3176
3177    return 0;
3178}
3179EOF
3180
3181if test "$rdma" = "yes" ; then
3182    case "$pvrdma" in
3183    "")
3184        if compile_prog "" ""; then
3185            pvrdma="yes"
3186        else
3187            pvrdma="no"
3188        fi
3189        ;;
3190    "yes")
3191        if ! compile_prog "" ""; then
3192            error_exit "PVRDMA is not supported since mremap is not implemented"
3193        fi
3194        pvrdma="yes"
3195        ;;
3196    "no")
3197        pvrdma="no"
3198        ;;
3199    esac
3200else
3201    if test "$pvrdma" = "yes" ; then
3202        error_exit "PVRDMA requires rdma suppport"
3203    fi
3204    pvrdma="no"
3205fi
3206
3207# Let's see if enhanced reg_mr is supported
3208if test "$pvrdma" = "yes" ; then
3209
3210cat > $TMPC <<EOF &&
3211#include <infiniband/verbs.h>
3212
3213int
3214main(void)
3215{
3216    struct ibv_mr *mr;
3217    struct ibv_pd *pd = NULL;
3218    size_t length = 10;
3219    uint64_t iova = 0;
3220    int access = 0;
3221    void *addr = NULL;
3222
3223    mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
3224
3225    ibv_dereg_mr(mr);
3226
3227    return 0;
3228}
3229EOF
3230    if ! compile_prog "" "-libverbs"; then
3231        QEMU_CFLAGS="$QEMU_CFLAGS -DLEGACY_RDMA_REG_MR"
3232    fi
3233fi
3234
3235##########################################
3236# xfsctl() probe, used for file-posix.c
3237if test "$xfs" != "no" ; then
3238  cat > $TMPC << EOF
3239#include <stddef.h>  /* NULL */
3240#include <xfs/xfs.h>
3241int main(void)
3242{
3243    xfsctl(NULL, 0, 0, NULL);
3244    return 0;
3245}
3246EOF
3247  if compile_prog "" "" ; then
3248    xfs="yes"
3249  else
3250    if test "$xfs" = "yes" ; then
3251      feature_not_found "xfs" "Install xfsprogs/xfslibs devel"
3252    fi
3253    xfs=no
3254  fi
3255fi
3256
3257##########################################
3258# vde libraries probe
3259if test "$vde" != "no" ; then
3260  vde_libs="-lvdeplug"
3261  cat > $TMPC << EOF
3262#include <libvdeplug.h>
3263int main(void)
3264{
3265    struct vde_open_args a = {0, 0, 0};
3266    char s[] = "";
3267    vde_open(s, s, &a);
3268    return 0;
3269}
3270EOF
3271  if compile_prog "" "$vde_libs" ; then
3272    vde=yes
3273  else
3274    if test "$vde" = "yes" ; then
3275      feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
3276    fi
3277    vde=no
3278  fi
3279fi
3280
3281##########################################
3282# netmap support probe
3283# Apart from looking for netmap headers, we make sure that the host API version
3284# supports the netmap backend (>=11). The upper bound (15) is meant to simulate
3285# a minor/major version number. Minor new features will be marked with values up
3286# to 15, and if something happens that requires a change to the backend we will
3287# move above 15, submit the backend fixes and modify this two bounds.
3288if test "$netmap" != "no" ; then
3289  cat > $TMPC << EOF
3290#include <inttypes.h>
3291#include <net/if.h>
3292#include <net/netmap.h>
3293#include <net/netmap_user.h>
3294#if (NETMAP_API < 11) || (NETMAP_API > 15)
3295#error
3296#endif
3297int main(void) { return 0; }
3298EOF
3299  if compile_prog "" "" ; then
3300    netmap=yes
3301  else
3302    if test "$netmap" = "yes" ; then
3303      feature_not_found "netmap"
3304    fi
3305    netmap=no
3306  fi
3307fi
3308
3309##########################################
3310# libcap-ng library probe
3311if test "$cap_ng" != "no" ; then
3312  cap_libs="-lcap-ng"
3313  cat > $TMPC << EOF
3314#include <cap-ng.h>
3315int main(void)
3316{
3317    capng_capability_to_name(CAPNG_EFFECTIVE);
3318    return 0;
3319}
3320EOF
3321  if compile_prog "" "$cap_libs" ; then
3322    cap_ng=yes
3323  else
3324    if test "$cap_ng" = "yes" ; then
3325      feature_not_found "cap_ng" "Install libcap-ng devel"
3326    fi
3327    cap_ng=no
3328  fi
3329fi
3330
3331##########################################
3332# Sound support libraries probe
3333
3334audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
3335for drv in $audio_drv_list; do
3336    case $drv in
3337    alsa | try-alsa)
3338    if $pkg_config alsa --exists; then
3339        alsa_libs=$($pkg_config alsa --libs)
3340        alsa_cflags=$($pkg_config alsa --cflags)
3341        alsa=yes
3342        if test "$drv" = "try-alsa"; then
3343            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa/alsa/')
3344        fi
3345    else
3346        if test "$drv" = "try-alsa"; then
3347            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa//')
3348        else
3349            error_exit "$drv check failed" \
3350                "Make sure to have the $drv libs and headers installed."
3351        fi
3352    fi
3353    ;;
3354
3355    pa | try-pa)
3356    if $pkg_config libpulse --exists; then
3357        libpulse=yes
3358        pulse_libs=$($pkg_config libpulse --libs)
3359        pulse_cflags=$($pkg_config libpulse --cflags)
3360        if test "$drv" = "try-pa"; then
3361            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa/pa/')
3362        fi
3363    else
3364        if test "$drv" = "try-pa"; then
3365            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa//')
3366        else
3367            error_exit "$drv check failed" \
3368                "Make sure to have the $drv libs and headers installed."
3369        fi
3370    fi
3371    ;;
3372
3373    sdl)
3374    if test "$sdl" = "no"; then
3375        error_exit "sdl not found or disabled, can not use sdl audio driver"
3376    fi
3377    ;;
3378
3379    try-sdl)
3380    if test "$sdl" = "no"; then
3381        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl//')
3382    else
3383        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl/sdl/')
3384    fi
3385    ;;
3386
3387    coreaudio)
3388      coreaudio_libs="-framework CoreAudio"
3389    ;;
3390
3391    dsound)
3392      dsound_libs="-lole32 -ldxguid"
3393      audio_win_int="yes"
3394    ;;
3395
3396    oss)
3397      oss_libs="$oss_lib"
3398    ;;
3399
3400    jack | try-jack)
3401    if $pkg_config jack --exists; then
3402        libjack=yes
3403        jack_libs=$($pkg_config jack --libs)
3404        if test "$drv" = "try-jack"; then
3405            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack/jack/')
3406        fi
3407    else
3408        if test "$drv" = "try-jack"; then
3409            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack//')
3410        else
3411            error_exit "$drv check failed" \
3412                "Make sure to have the $drv libs and headers installed."
3413        fi
3414    fi
3415    ;;
3416
3417    *)
3418    echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
3419        error_exit "Unknown driver '$drv' selected" \
3420            "Possible drivers are: $audio_possible_drivers"
3421    }
3422    ;;
3423    esac
3424done
3425
3426##########################################
3427# BrlAPI probe
3428
3429if test "$brlapi" != "no" ; then
3430  brlapi_libs="-lbrlapi"
3431  cat > $TMPC << EOF
3432#include <brlapi.h>
3433#include <stddef.h>
3434int main( void ) { return brlapi__openConnection (NULL, NULL, NULL); }
3435EOF
3436  if compile_prog "" "$brlapi_libs" ; then
3437    brlapi=yes
3438  else
3439    if test "$brlapi" = "yes" ; then
3440      feature_not_found "brlapi" "Install brlapi devel"
3441    fi
3442    brlapi=no
3443  fi
3444fi
3445
3446##########################################
3447# curl probe
3448if test "$curl" != "no" ; then
3449  if $pkg_config libcurl --exists; then
3450    curlconfig="$pkg_config libcurl"
3451  else
3452    curlconfig=curl-config
3453  fi
3454  cat > $TMPC << EOF
3455#include <curl/curl.h>
3456int main(void) { curl_easy_init(); curl_multi_setopt(0, 0, 0); return 0; }
3457EOF
3458  curl_cflags=$($curlconfig --cflags 2>/dev/null)
3459  curl_libs=$($curlconfig --libs 2>/dev/null)
3460  if compile_prog "$curl_cflags" "$curl_libs" ; then
3461    curl=yes
3462  else
3463    if test "$curl" = "yes" ; then
3464      feature_not_found "curl" "Install libcurl devel"
3465    fi
3466    curl=no
3467  fi
3468fi # test "$curl"
3469
3470##########################################
3471# glib support probe
3472
3473glib_req_ver=2.48
3474glib_modules=gthread-2.0
3475if test "$modules" = yes; then
3476    glib_modules="$glib_modules gmodule-export-2.0"
3477fi
3478if test "$plugins" = yes; then
3479    glib_modules="$glib_modules gmodule-2.0"
3480fi
3481
3482for i in $glib_modules; do
3483    if $pkg_config --atleast-version=$glib_req_ver $i; then
3484        glib_cflags=$($pkg_config --cflags $i)
3485        glib_libs=$($pkg_config --libs $i)
3486    else
3487        error_exit "glib-$glib_req_ver $i is required to compile QEMU"
3488    fi
3489done
3490
3491# This workaround is required due to a bug in pkg-config file for glib as it
3492# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
3493
3494if test "$static" = yes && test "$mingw32" = yes; then
3495    glib_cflags="-DGLIB_STATIC_COMPILATION $glib_cflags"
3496fi
3497
3498if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
3499    gio_cflags=$($pkg_config --cflags gio-2.0)
3500    gio_libs=$($pkg_config --libs gio-2.0)
3501    gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
3502    if [ ! -x "$gdbus_codegen" ]; then
3503        gdbus_codegen=
3504    fi
3505    # Check that the libraries actually work -- Ubuntu 18.04 ships
3506    # with pkg-config --static --libs data for gio-2.0 that is missing
3507    # -lblkid and will give a link error.
3508    cat > $TMPC <<EOF
3509#include <gio/gio.h>
3510int main(void)
3511{
3512    g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
3513    return 0;
3514}
3515EOF
3516    if compile_prog "$gio_cflags" "$gio_libs" ; then
3517        gio=yes
3518    else
3519        gio=no
3520    fi
3521else
3522    gio=no
3523fi
3524
3525if $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
3526    gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
3527    gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
3528fi
3529
3530# Sanity check that the current size_t matches the
3531# size that glib thinks it should be. This catches
3532# problems on multi-arch where people try to build
3533# 32-bit QEMU while pointing at 64-bit glib headers
3534cat > $TMPC <<EOF
3535#include <glib.h>
3536#include <unistd.h>
3537
3538#define QEMU_BUILD_BUG_ON(x) \
3539  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
3540
3541int main(void) {
3542   QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
3543   return 0;
3544}
3545EOF
3546
3547if ! compile_prog "$glib_cflags" "$glib_libs" ; then
3548    error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
3549               "You probably need to set PKG_CONFIG_LIBDIR"\
3550	       "to point to the right pkg-config files for your"\
3551	       "build target"
3552fi
3553
3554# Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
3555cat > $TMPC << EOF
3556#include <glib.h>
3557int main(void) { return 0; }
3558EOF
3559if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3560    if cc_has_warning_flag "-Wno-unknown-attributes"; then
3561        glib_cflags="-Wno-unknown-attributes $glib_cflags"
3562        CONFIGURE_CFLAGS="-Wno-unknown-attributes $CONFIGURE_CFLAGS"
3563    fi
3564fi
3565
3566# Silence clang warnings triggered by glib < 2.57.2
3567cat > $TMPC << EOF
3568#include <glib.h>
3569typedef struct Foo {
3570    int i;
3571} Foo;
3572static void foo_free(Foo *f)
3573{
3574    g_free(f);
3575}
3576G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free);
3577int main(void) { return 0; }
3578EOF
3579if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3580    if cc_has_warning_flag "-Wno-unused-function"; then
3581        glib_cflags="$glib_cflags -Wno-unused-function"
3582        CONFIGURE_CFLAGS="$CONFIGURE_CFLAGS -Wno-unused-function"
3583    fi
3584fi
3585
3586##########################################
3587# SHA command probe for modules
3588if test "$modules" = yes; then
3589    shacmd_probe="sha1sum sha1 shasum"
3590    for c in $shacmd_probe; do
3591        if has $c; then
3592            shacmd="$c"
3593            break
3594        fi
3595    done
3596    if test "$shacmd" = ""; then
3597        error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
3598    fi
3599fi
3600
3601##########################################
3602# pthread probe
3603PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
3604
3605pthread=no
3606cat > $TMPC << EOF
3607#include <pthread.h>
3608static void *f(void *p) { return NULL; }
3609int main(void) {
3610  pthread_t thread;
3611  pthread_create(&thread, 0, f, 0);
3612  return 0;
3613}
3614EOF
3615if compile_prog "" "" ; then
3616  pthread=yes
3617else
3618  for pthread_lib in $PTHREADLIBS_LIST; do
3619    if compile_prog "" "$pthread_lib" ; then
3620      pthread=yes
3621      found=no
3622      for lib_entry in $LIBS; do
3623        if test "$lib_entry" = "$pthread_lib"; then
3624          found=yes
3625          break
3626        fi
3627      done
3628      if test "$found" = "no"; then
3629        LIBS="$pthread_lib $LIBS"
3630      fi
3631      break
3632    fi
3633  done
3634fi
3635
3636if test "$mingw32" != yes && test "$pthread" = no; then
3637  error_exit "pthread check failed" \
3638      "Make sure to have the pthread libs and headers installed."
3639fi
3640
3641# check for pthread_setname_np with thread id
3642pthread_setname_np_w_tid=no
3643cat > $TMPC << EOF
3644#include <pthread.h>
3645
3646static void *f(void *p) { return NULL; }
3647int main(void)
3648{
3649    pthread_t thread;
3650    pthread_create(&thread, 0, f, 0);
3651    pthread_setname_np(thread, "QEMU");
3652    return 0;
3653}
3654EOF
3655if compile_prog "" "$pthread_lib" ; then
3656  pthread_setname_np_w_tid=yes
3657fi
3658
3659# check for pthread_setname_np without thread id
3660pthread_setname_np_wo_tid=no
3661cat > $TMPC << EOF
3662#include <pthread.h>
3663
3664static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
3665int main(void)
3666{
3667    pthread_t thread;
3668    pthread_create(&thread, 0, f, 0);
3669    return 0;
3670}
3671EOF
3672if compile_prog "" "$pthread_lib" ; then
3673  pthread_setname_np_wo_tid=yes
3674fi
3675
3676##########################################
3677# rbd probe
3678if test "$rbd" != "no" ; then
3679  cat > $TMPC <<EOF
3680#include <stdio.h>
3681#include <rbd/librbd.h>
3682int main(void) {
3683    rados_t cluster;
3684    rados_create(&cluster, NULL);
3685    return 0;
3686}
3687EOF
3688  rbd_libs="-lrbd -lrados"
3689  if compile_prog "" "$rbd_libs" ; then
3690    rbd=yes
3691  else
3692    if test "$rbd" = "yes" ; then
3693      feature_not_found "rados block device" "Install librbd/ceph devel"
3694    fi
3695    rbd=no
3696  fi
3697fi
3698
3699##########################################
3700# libssh probe
3701if test "$libssh" != "no" ; then
3702  if $pkg_config --exists libssh; then
3703    libssh_cflags=$($pkg_config libssh --cflags)
3704    libssh_libs=$($pkg_config libssh --libs)
3705    libssh=yes
3706  else
3707    if test "$libssh" = "yes" ; then
3708      error_exit "libssh required for --enable-libssh"
3709    fi
3710    libssh=no
3711  fi
3712fi
3713
3714##########################################
3715# Check for libssh 0.8
3716# This is done like this instead of using the LIBSSH_VERSION_* and
3717# SSH_VERSION_* macros because some distributions in the past shipped
3718# snapshots of the future 0.8 from Git, and those snapshots did not
3719# have updated version numbers (still referring to 0.7.0).
3720
3721if test "$libssh" = "yes"; then
3722  cat > $TMPC <<EOF
3723#include <libssh/libssh.h>
3724int main(void) { return ssh_get_server_publickey(NULL, NULL); }
3725EOF
3726  if compile_prog "$libssh_cflags" "$libssh_libs"; then
3727    libssh_cflags="-DHAVE_LIBSSH_0_8 $libssh_cflags"
3728  fi
3729fi
3730
3731##########################################
3732# linux-aio probe
3733
3734if test "$linux_aio" != "no" ; then
3735  cat > $TMPC <<EOF
3736#include <libaio.h>
3737#include <sys/eventfd.h>
3738#include <stddef.h>
3739int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
3740EOF
3741  if compile_prog "" "-laio" ; then
3742    linux_aio=yes
3743  else
3744    if test "$linux_aio" = "yes" ; then
3745      feature_not_found "linux AIO" "Install libaio devel"
3746    fi
3747    linux_aio=no
3748  fi
3749fi
3750##########################################
3751# linux-io-uring probe
3752
3753if test "$linux_io_uring" != "no" ; then
3754  if $pkg_config liburing; then
3755    linux_io_uring_cflags=$($pkg_config --cflags liburing)
3756    linux_io_uring_libs=$($pkg_config --libs liburing)
3757    linux_io_uring=yes
3758  else
3759    if test "$linux_io_uring" = "yes" ; then
3760      feature_not_found "linux io_uring" "Install liburing devel"
3761    fi
3762    linux_io_uring=no
3763  fi
3764fi
3765
3766##########################################
3767# TPM emulation is only on POSIX
3768
3769if test "$tpm" = ""; then
3770  if test "$mingw32" = "yes"; then
3771    tpm=no
3772  else
3773    tpm=yes
3774  fi
3775elif test "$tpm" = "yes"; then
3776  if test "$mingw32" = "yes" ; then
3777    error_exit "TPM emulation only available on POSIX systems"
3778  fi
3779fi
3780
3781##########################################
3782# attr probe
3783
3784libattr_libs=
3785if test "$attr" != "no" ; then
3786  cat > $TMPC <<EOF
3787#include <stdio.h>
3788#include <sys/types.h>
3789#ifdef CONFIG_LIBATTR
3790#include <attr/xattr.h>
3791#else
3792#include <sys/xattr.h>
3793#endif
3794int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }
3795EOF
3796  if compile_prog "" "" ; then
3797    attr=yes
3798  # Older distros have <attr/xattr.h>, and need -lattr:
3799  elif compile_prog "-DCONFIG_LIBATTR" "-lattr" ; then
3800    attr=yes
3801    libattr_libs="-lattr"
3802    libattr=yes
3803  else
3804    if test "$attr" = "yes" ; then
3805      feature_not_found "ATTR" "Install libc6 or libattr devel"
3806    fi
3807    attr=no
3808  fi
3809fi
3810
3811##########################################
3812# iovec probe
3813cat > $TMPC <<EOF
3814#include <sys/types.h>
3815#include <sys/uio.h>
3816#include <unistd.h>
3817int main(void) { return sizeof(struct iovec); }
3818EOF
3819iovec=no
3820if compile_prog "" "" ; then
3821  iovec=yes
3822fi
3823
3824##########################################
3825# preadv probe
3826cat > $TMPC <<EOF
3827#include <sys/types.h>
3828#include <sys/uio.h>
3829#include <unistd.h>
3830int main(void) { return preadv(0, 0, 0, 0); }
3831EOF
3832preadv=no
3833if compile_prog "" "" ; then
3834  preadv=yes
3835fi
3836
3837##########################################
3838# fdt probe
3839
3840case "$fdt" in
3841  auto | enabled | internal)
3842    # Simpler to always update submodule, even if not needed.
3843    if test -e "${source_path}/.git" && test $git_update = 'yes' ; then
3844      git_submodules="${git_submodules} dtc"
3845    fi
3846    ;;
3847esac
3848
3849##########################################
3850# opengl probe (for sdl2, gtk, milkymist-tmu2)
3851
3852gbm="no"
3853if $pkg_config gbm; then
3854    gbm_cflags="$($pkg_config --cflags gbm)"
3855    gbm_libs="$($pkg_config --libs gbm)"
3856    gbm="yes"
3857fi
3858
3859if test "$opengl" != "no" ; then
3860  opengl_pkgs="epoxy gbm"
3861  if $pkg_config $opengl_pkgs; then
3862    opengl_cflags="$($pkg_config --cflags $opengl_pkgs)"
3863    opengl_libs="$($pkg_config --libs $opengl_pkgs)"
3864    opengl=yes
3865    if test "$gtk" = "yes" && $pkg_config --exists "$gtkpackage >= 3.16"; then
3866        gtk_gl="yes"
3867    fi
3868  else
3869    if test "$opengl" = "yes" ; then
3870      feature_not_found "opengl" "Please install opengl (mesa) devel pkgs: $opengl_pkgs"
3871    fi
3872    opengl_cflags=""
3873    opengl_libs=""
3874    opengl=no
3875  fi
3876fi
3877
3878if test "$opengl" = "yes"; then
3879  cat > $TMPC << EOF
3880#include <epoxy/egl.h>
3881#ifndef EGL_MESA_image_dma_buf_export
3882# error mesa/epoxy lacks support for dmabufs (mesa 10.6+)
3883#endif
3884int main(void) { return 0; }
3885EOF
3886  if compile_prog "" "" ; then
3887    opengl_dmabuf=yes
3888  fi
3889fi
3890
3891if test "$opengl" = "yes" && test "$have_x11" = "yes"; then
3892  for target in $target_list; do
3893    case $target in
3894      lm32-softmmu) # milkymist-tmu2 requires X11 and OpenGL
3895        need_x11=yes
3896      ;;
3897    esac
3898  done
3899fi
3900
3901##########################################
3902# libxml2 probe
3903if test "$libxml2" != "no" ; then
3904    if $pkg_config --exists libxml-2.0; then
3905        libxml2="yes"
3906        libxml2_cflags=$($pkg_config --cflags libxml-2.0)
3907        libxml2_libs=$($pkg_config --libs libxml-2.0)
3908    else
3909        if test "$libxml2" = "yes"; then
3910            feature_not_found "libxml2" "Install libxml2 devel"
3911        fi
3912        libxml2="no"
3913    fi
3914fi
3915
3916##########################################
3917# glusterfs probe
3918if test "$glusterfs" != "no" ; then
3919  if $pkg_config --atleast-version=3 glusterfs-api; then
3920    glusterfs="yes"
3921    glusterfs_cflags=$($pkg_config --cflags glusterfs-api)
3922    glusterfs_libs=$($pkg_config --libs glusterfs-api)
3923    if $pkg_config --atleast-version=4 glusterfs-api; then
3924      glusterfs_xlator_opt="yes"
3925    fi
3926    if $pkg_config --atleast-version=5 glusterfs-api; then
3927      glusterfs_discard="yes"
3928    fi
3929    if $pkg_config --atleast-version=6 glusterfs-api; then
3930      glusterfs_fallocate="yes"
3931      glusterfs_zerofill="yes"
3932    fi
3933    cat > $TMPC << EOF
3934#include <glusterfs/api/glfs.h>
3935
3936int
3937main(void)
3938{
3939	/* new glfs_ftruncate() passes two additional args */
3940	return glfs_ftruncate(NULL, 0, NULL, NULL);
3941}
3942EOF
3943    if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
3944      glusterfs_ftruncate_has_stat="yes"
3945    fi
3946    cat > $TMPC << EOF
3947#include <glusterfs/api/glfs.h>
3948
3949/* new glfs_io_cbk() passes two additional glfs_stat structs */
3950static void
3951glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
3952{}
3953
3954int
3955main(void)
3956{
3957	glfs_io_cbk iocb = &glusterfs_iocb;
3958	iocb(NULL, 0 , NULL, NULL, NULL);
3959	return 0;
3960}
3961EOF
3962    if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
3963      glusterfs_iocb_has_stat="yes"
3964    fi
3965  else
3966    if test "$glusterfs" = "yes" ; then
3967      feature_not_found "GlusterFS backend support" \
3968          "Install glusterfs-api devel >= 3"
3969    fi
3970    glusterfs="no"
3971  fi
3972fi
3973
3974# Check for inotify functions when we are building linux-user
3975# emulator.  This is done because older glibc versions don't
3976# have syscall stubs for these implemented.  In that case we
3977# don't provide them even if kernel supports them.
3978#
3979inotify=no
3980cat > $TMPC << EOF
3981#include <sys/inotify.h>
3982
3983int
3984main(void)
3985{
3986	/* try to start inotify */
3987	return inotify_init();
3988}
3989EOF
3990if compile_prog "" "" ; then
3991  inotify=yes
3992fi
3993
3994inotify1=no
3995cat > $TMPC << EOF
3996#include <sys/inotify.h>
3997
3998int
3999main(void)
4000{
4001    /* try to start inotify */
4002    return inotify_init1(0);
4003}
4004EOF
4005if compile_prog "" "" ; then
4006  inotify1=yes
4007fi
4008
4009# check if pipe2 is there
4010pipe2=no
4011cat > $TMPC << EOF
4012#include <unistd.h>
4013#include <fcntl.h>
4014
4015int main(void)
4016{
4017    int pipefd[2];
4018    return pipe2(pipefd, O_CLOEXEC);
4019}
4020EOF
4021if compile_prog "" "" ; then
4022  pipe2=yes
4023fi
4024
4025# check if accept4 is there
4026accept4=no
4027cat > $TMPC << EOF
4028#include <sys/socket.h>
4029#include <stddef.h>
4030
4031int main(void)
4032{
4033    accept4(0, NULL, NULL, SOCK_CLOEXEC);
4034    return 0;
4035}
4036EOF
4037if compile_prog "" "" ; then
4038  accept4=yes
4039fi
4040
4041# check if tee/splice is there. vmsplice was added same time.
4042splice=no
4043cat > $TMPC << EOF
4044#include <unistd.h>
4045#include <fcntl.h>
4046#include <limits.h>
4047
4048int main(void)
4049{
4050    int len, fd = 0;
4051    len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
4052    splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
4053    return 0;
4054}
4055EOF
4056if compile_prog "" "" ; then
4057  splice=yes
4058fi
4059
4060##########################################
4061# libnuma probe
4062
4063if test "$numa" != "no" ; then
4064  cat > $TMPC << EOF
4065#include <numa.h>
4066int main(void) { return numa_available(); }
4067EOF
4068
4069  if compile_prog "" "-lnuma" ; then
4070    numa=yes
4071    numa_libs="-lnuma"
4072  else
4073    if test "$numa" = "yes" ; then
4074      feature_not_found "numa" "install numactl devel"
4075    fi
4076    numa=no
4077  fi
4078fi
4079
4080malloc=system
4081if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
4082    echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
4083    exit 1
4084elif test "$tcmalloc" = "yes" ; then
4085    malloc=tcmalloc
4086elif test "$jemalloc" = "yes" ; then
4087    malloc=jemalloc
4088fi
4089
4090##########################################
4091# signalfd probe
4092signalfd="no"
4093cat > $TMPC << EOF
4094#include <unistd.h>
4095#include <sys/syscall.h>
4096#include <signal.h>
4097int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }
4098EOF
4099
4100if compile_prog "" "" ; then
4101  signalfd=yes
4102fi
4103
4104# check if optreset global is declared by <getopt.h>
4105optreset="no"
4106cat > $TMPC << EOF
4107#include <getopt.h>
4108int main(void) { return optreset; }
4109EOF
4110
4111if compile_prog "" "" ; then
4112  optreset=yes
4113fi
4114
4115# check if eventfd is supported
4116eventfd=no
4117cat > $TMPC << EOF
4118#include <sys/eventfd.h>
4119
4120int main(void)
4121{
4122    return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
4123}
4124EOF
4125if compile_prog "" "" ; then
4126  eventfd=yes
4127fi
4128
4129# check if memfd is supported
4130memfd=no
4131cat > $TMPC << EOF
4132#include <sys/mman.h>
4133
4134int main(void)
4135{
4136    return memfd_create("foo", MFD_ALLOW_SEALING);
4137}
4138EOF
4139if compile_prog "" "" ; then
4140  memfd=yes
4141fi
4142
4143# check for usbfs
4144have_usbfs=no
4145if test "$linux_user" = "yes"; then
4146  cat > $TMPC << EOF
4147#include <linux/usbdevice_fs.h>
4148
4149#ifndef USBDEVFS_GET_CAPABILITIES
4150#error "USBDEVFS_GET_CAPABILITIES undefined"
4151#endif
4152
4153#ifndef USBDEVFS_DISCONNECT_CLAIM
4154#error "USBDEVFS_DISCONNECT_CLAIM undefined"
4155#endif
4156
4157int main(void)
4158{
4159    return 0;
4160}
4161EOF
4162  if compile_prog "" ""; then
4163    have_usbfs=yes
4164  fi
4165fi
4166
4167# check for fallocate
4168fallocate=no
4169cat > $TMPC << EOF
4170#include <fcntl.h>
4171
4172int main(void)
4173{
4174    fallocate(0, 0, 0, 0);
4175    return 0;
4176}
4177EOF
4178if compile_prog "" "" ; then
4179  fallocate=yes
4180fi
4181
4182# check for fallocate hole punching
4183fallocate_punch_hole=no
4184cat > $TMPC << EOF
4185#include <fcntl.h>
4186#include <linux/falloc.h>
4187
4188int main(void)
4189{
4190    fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
4191    return 0;
4192}
4193EOF
4194if compile_prog "" "" ; then
4195  fallocate_punch_hole=yes
4196fi
4197
4198# check that fallocate supports range zeroing inside the file
4199fallocate_zero_range=no
4200cat > $TMPC << EOF
4201#include <fcntl.h>
4202#include <linux/falloc.h>
4203
4204int main(void)
4205{
4206    fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0);
4207    return 0;
4208}
4209EOF
4210if compile_prog "" "" ; then
4211  fallocate_zero_range=yes
4212fi
4213
4214# check for posix_fallocate
4215posix_fallocate=no
4216cat > $TMPC << EOF
4217#include <fcntl.h>
4218
4219int main(void)
4220{
4221    posix_fallocate(0, 0, 0);
4222    return 0;
4223}
4224EOF
4225if compile_prog "" "" ; then
4226    posix_fallocate=yes
4227fi
4228
4229# check for sync_file_range
4230sync_file_range=no
4231cat > $TMPC << EOF
4232#include <fcntl.h>
4233
4234int main(void)
4235{
4236    sync_file_range(0, 0, 0, 0);
4237    return 0;
4238}
4239EOF
4240if compile_prog "" "" ; then
4241  sync_file_range=yes
4242fi
4243
4244# check for linux/fiemap.h and FS_IOC_FIEMAP
4245fiemap=no
4246cat > $TMPC << EOF
4247#include <sys/ioctl.h>
4248#include <linux/fs.h>
4249#include <linux/fiemap.h>
4250
4251int main(void)
4252{
4253    ioctl(0, FS_IOC_FIEMAP, 0);
4254    return 0;
4255}
4256EOF
4257if compile_prog "" "" ; then
4258  fiemap=yes
4259fi
4260
4261# check for dup3
4262dup3=no
4263cat > $TMPC << EOF
4264#include <unistd.h>
4265
4266int main(void)
4267{
4268    dup3(0, 0, 0);
4269    return 0;
4270}
4271EOF
4272if compile_prog "" "" ; then
4273  dup3=yes
4274fi
4275
4276# check for ppoll support
4277ppoll=no
4278cat > $TMPC << EOF
4279#include <poll.h>
4280
4281int main(void)
4282{
4283    struct pollfd pfd = { .fd = 0, .events = 0, .revents = 0 };
4284    ppoll(&pfd, 1, 0, 0);
4285    return 0;
4286}
4287EOF
4288if compile_prog "" "" ; then
4289  ppoll=yes
4290fi
4291
4292# check for prctl(PR_SET_TIMERSLACK , ... ) support
4293prctl_pr_set_timerslack=no
4294cat > $TMPC << EOF
4295#include <sys/prctl.h>
4296
4297int main(void)
4298{
4299    prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0);
4300    return 0;
4301}
4302EOF
4303if compile_prog "" "" ; then
4304  prctl_pr_set_timerslack=yes
4305fi
4306
4307# check for epoll support
4308epoll=no
4309cat > $TMPC << EOF
4310#include <sys/epoll.h>
4311
4312int main(void)
4313{
4314    epoll_create(0);
4315    return 0;
4316}
4317EOF
4318if compile_prog "" "" ; then
4319  epoll=yes
4320fi
4321
4322# epoll_create1 is a later addition
4323# so we must check separately for its presence
4324epoll_create1=no
4325cat > $TMPC << EOF
4326#include <sys/epoll.h>
4327
4328int main(void)
4329{
4330    /* Note that we use epoll_create1 as a value, not as
4331     * a function being called. This is necessary so that on
4332     * old SPARC glibc versions where the function was present in
4333     * the library but not declared in the header file we will
4334     * fail the configure check. (Otherwise we will get a compiler
4335     * warning but not an error, and will proceed to fail the
4336     * qemu compile where we compile with -Werror.)
4337     */
4338    return (int)(uintptr_t)&epoll_create1;
4339}
4340EOF
4341if compile_prog "" "" ; then
4342  epoll_create1=yes
4343fi
4344
4345# check for sendfile support
4346sendfile=no
4347cat > $TMPC << EOF
4348#include <sys/sendfile.h>
4349
4350int main(void)
4351{
4352    return sendfile(0, 0, 0, 0);
4353}
4354EOF
4355if compile_prog "" "" ; then
4356  sendfile=yes
4357fi
4358
4359# check for timerfd support (glibc 2.8 and newer)
4360timerfd=no
4361cat > $TMPC << EOF
4362#include <sys/timerfd.h>
4363
4364int main(void)
4365{
4366    return(timerfd_create(CLOCK_REALTIME, 0));
4367}
4368EOF
4369if compile_prog "" "" ; then
4370  timerfd=yes
4371fi
4372
4373# check for setns and unshare support
4374setns=no
4375cat > $TMPC << EOF
4376#include <sched.h>
4377
4378int main(void)
4379{
4380    int ret;
4381    ret = setns(0, 0);
4382    ret = unshare(0);
4383    return ret;
4384}
4385EOF
4386if compile_prog "" "" ; then
4387  setns=yes
4388fi
4389
4390# clock_adjtime probe
4391clock_adjtime=no
4392cat > $TMPC <<EOF
4393#include <time.h>
4394
4395int main(void)
4396{
4397    return clock_adjtime(0, 0);
4398}
4399EOF
4400clock_adjtime=no
4401if compile_prog "" "" ; then
4402  clock_adjtime=yes
4403fi
4404
4405# syncfs probe
4406syncfs=no
4407cat > $TMPC <<EOF
4408#include <unistd.h>
4409
4410int main(void)
4411{
4412    return syncfs(0);
4413}
4414EOF
4415syncfs=no
4416if compile_prog "" "" ; then
4417  syncfs=yes
4418fi
4419
4420# check for kcov support (kernel must be 4.4+, compiled with certain options)
4421kcov=no
4422if check_include sys/kcov.h ; then
4423    kcov=yes
4424fi
4425
4426# check for btrfs filesystem support (kernel must be 3.9+)
4427btrfs=no
4428if check_include linux/btrfs.h ; then
4429    btrfs=yes
4430fi
4431
4432# Search for bswap_32 function
4433byteswap_h=no
4434cat > $TMPC << EOF
4435#include <byteswap.h>
4436int main(void) { return bswap_32(0); }
4437EOF
4438if compile_prog "" "" ; then
4439  byteswap_h=yes
4440fi
4441
4442# Search for bswap32 function
4443bswap_h=no
4444cat > $TMPC << EOF
4445#include <sys/endian.h>
4446#include <sys/types.h>
4447#include <machine/bswap.h>
4448int main(void) { return bswap32(0); }
4449EOF
4450if compile_prog "" "" ; then
4451  bswap_h=yes
4452fi
4453
4454##########################################
4455# Do we have libiscsi >= 1.9.0
4456if test "$libiscsi" != "no" ; then
4457  if $pkg_config --atleast-version=1.9.0 libiscsi; then
4458    libiscsi="yes"
4459    libiscsi_cflags=$($pkg_config --cflags libiscsi)
4460    libiscsi_libs=$($pkg_config --libs libiscsi)
4461  else
4462    if test "$libiscsi" = "yes" ; then
4463      feature_not_found "libiscsi" "Install libiscsi >= 1.9.0"
4464    fi
4465    libiscsi="no"
4466  fi
4467fi
4468
4469##########################################
4470# Do we need librt
4471# uClibc provides 2 versions of clock_gettime(), one with realtime
4472# support and one without. This means that the clock_gettime() don't
4473# need -lrt. We still need it for timer_create() so we check for this
4474# function in addition.
4475cat > $TMPC <<EOF
4476#include <signal.h>
4477#include <time.h>
4478int main(void) {
4479  timer_create(CLOCK_REALTIME, NULL, NULL);
4480  return clock_gettime(CLOCK_REALTIME, NULL);
4481}
4482EOF
4483
4484if compile_prog "" "" ; then
4485  :
4486# we need pthread for static linking. use previous pthread test result
4487elif compile_prog "" "$pthread_lib -lrt" ; then
4488  LIBS="$LIBS -lrt"
4489fi
4490
4491# Check whether we have openpty() in either libc or libutil
4492cat > $TMPC << EOF
4493extern int openpty(int *am, int *as, char *name, void *termp, void *winp);
4494int main(void) { return openpty(0, 0, 0, 0, 0); }
4495EOF
4496
4497have_openpty="no"
4498if compile_prog "" "" ; then
4499  have_openpty="yes"
4500else
4501  if compile_prog "" "-lutil" ; then
4502    have_openpty="yes"
4503  fi
4504fi
4505
4506##########################################
4507# spice probe
4508if test "$spice" != "no" ; then
4509  cat > $TMPC << EOF
4510#include <spice.h>
4511int main(void) { spice_server_new(); return 0; }
4512EOF
4513  spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
4514  spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
4515  if $pkg_config --atleast-version=0.12.5 spice-server && \
4516     $pkg_config --atleast-version=0.12.3 spice-protocol && \
4517     compile_prog "$spice_cflags" "$spice_libs" ; then
4518    spice="yes"
4519  else
4520    if test "$spice" = "yes" ; then
4521      feature_not_found "spice" \
4522          "Install spice-server(>=0.12.5) and spice-protocol(>=0.12.3) devel"
4523    fi
4524    spice="no"
4525  fi
4526fi
4527
4528# check for smartcard support
4529if test "$smartcard" != "no"; then
4530    if $pkg_config --atleast-version=2.5.1 libcacard; then
4531        libcacard_cflags=$($pkg_config --cflags libcacard)
4532        libcacard_libs=$($pkg_config --libs libcacard)
4533        smartcard="yes"
4534    else
4535        if test "$smartcard" = "yes"; then
4536            feature_not_found "smartcard" "Install libcacard devel"
4537        fi
4538        smartcard="no"
4539    fi
4540fi
4541
4542# check for libusb
4543if test "$libusb" != "no" ; then
4544    if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
4545        libusb="yes"
4546        libusb_cflags=$($pkg_config --cflags libusb-1.0)
4547        libusb_libs=$($pkg_config --libs libusb-1.0)
4548    else
4549        if test "$libusb" = "yes"; then
4550            feature_not_found "libusb" "Install libusb devel >= 1.0.13"
4551        fi
4552        libusb="no"
4553    fi
4554fi
4555
4556# check for usbredirparser for usb network redirection support
4557if test "$usb_redir" != "no" ; then
4558    if $pkg_config --atleast-version=0.6 libusbredirparser-0.5; then
4559        usb_redir="yes"
4560        usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5)
4561        usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5)
4562    else
4563        if test "$usb_redir" = "yes"; then
4564            feature_not_found "usb-redir" "Install usbredir devel"
4565        fi
4566        usb_redir="no"
4567    fi
4568fi
4569
4570##########################################
4571# check if we have VSS SDK headers for win
4572
4573if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
4574        test "$vss_win32_sdk" != "no" ; then
4575  case "$vss_win32_sdk" in
4576    "")   vss_win32_include="-isystem $source_path" ;;
4577    *\ *) # The SDK is installed in "Program Files" by default, but we cannot
4578          # handle path with spaces. So we symlink the headers into ".sdk/vss".
4579          vss_win32_include="-isystem $source_path/.sdk/vss"
4580	  symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
4581	  ;;
4582    *)    vss_win32_include="-isystem $vss_win32_sdk"
4583  esac
4584  cat > $TMPC << EOF
4585#define __MIDL_user_allocate_free_DEFINED__
4586#include <inc/win2003/vss.h>
4587int main(void) { return VSS_CTX_BACKUP; }
4588EOF
4589  if compile_prog "$vss_win32_include" "" ; then
4590    guest_agent_with_vss="yes"
4591    QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
4592    libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
4593    qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
4594  else
4595    if test "$vss_win32_sdk" != "" ; then
4596      echo "ERROR: Please download and install Microsoft VSS SDK:"
4597      echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
4598      echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
4599      echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
4600      echo "ERROR: The headers are extracted in the directory \`inc'."
4601      feature_not_found "VSS support"
4602    fi
4603    guest_agent_with_vss="no"
4604  fi
4605fi
4606
4607##########################################
4608# lookup Windows platform SDK (if not specified)
4609# The SDK is needed only to build .tlb (type library) file of guest agent
4610# VSS provider from the source. It is usually unnecessary because the
4611# pre-compiled .tlb file is included.
4612
4613if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
4614        test "$guest_agent_with_vss" = "yes" ; then
4615  if test -z "$win_sdk"; then
4616    programfiles="$PROGRAMFILES"
4617    test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
4618    if test -n "$programfiles"; then
4619      win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
4620    else
4621      feature_not_found "Windows SDK"
4622    fi
4623  elif test "$win_sdk" = "no"; then
4624    win_sdk=""
4625  fi
4626fi
4627
4628##########################################
4629# check if mingw environment provides a recent ntddscsi.h
4630if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
4631  cat > $TMPC << EOF
4632#include <windows.h>
4633#include <ntddscsi.h>
4634int main(void) {
4635#if !defined(IOCTL_SCSI_GET_ADDRESS)
4636#error Missing required ioctl definitions
4637#endif
4638  SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
4639  return addr.Lun;
4640}
4641EOF
4642  if compile_prog "" "" ; then
4643    guest_agent_ntddscsi=yes
4644    libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
4645  fi
4646fi
4647
4648##########################################
4649# virgl renderer probe
4650
4651if test "$virglrenderer" != "no" ; then
4652  cat > $TMPC << EOF
4653#include <virglrenderer.h>
4654int main(void) { virgl_renderer_poll(); return 0; }
4655EOF
4656  virgl_cflags=$($pkg_config --cflags virglrenderer 2>/dev/null)
4657  virgl_libs=$($pkg_config --libs virglrenderer 2>/dev/null)
4658  virgl_version=$($pkg_config --modversion virglrenderer 2>/dev/null)
4659  if $pkg_config virglrenderer >/dev/null 2>&1 && \
4660     compile_prog "$virgl_cflags" "$virgl_libs" ; then
4661    virglrenderer="yes"
4662  else
4663    if test "$virglrenderer" = "yes" ; then
4664      feature_not_found "virglrenderer"
4665    fi
4666    virglrenderer="no"
4667  fi
4668fi
4669
4670##########################################
4671# capstone
4672
4673case "$capstone" in
4674  auto | enabled | internal)
4675    # Simpler to always update submodule, even if not needed.
4676    if test -e "${source_path}/.git" && test $git_update = 'yes' ; then
4677      git_submodules="${git_submodules} capstone"
4678    fi
4679    ;;
4680esac
4681
4682##########################################
4683# check if we have fdatasync
4684
4685fdatasync=no
4686cat > $TMPC << EOF
4687#include <unistd.h>
4688int main(void) {
4689#if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
4690return fdatasync(0);
4691#else
4692#error Not supported
4693#endif
4694}
4695EOF
4696if compile_prog "" "" ; then
4697    fdatasync=yes
4698fi
4699
4700##########################################
4701# check if we have madvise
4702
4703madvise=no
4704cat > $TMPC << EOF
4705#include <sys/types.h>
4706#include <sys/mman.h>
4707#include <stddef.h>
4708int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }
4709EOF
4710if compile_prog "" "" ; then
4711    madvise=yes
4712fi
4713
4714##########################################
4715# check if we have posix_madvise
4716
4717posix_madvise=no
4718cat > $TMPC << EOF
4719#include <sys/mman.h>
4720#include <stddef.h>
4721int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }
4722EOF
4723if compile_prog "" "" ; then
4724    posix_madvise=yes
4725fi
4726
4727##########################################
4728# check if we have posix_memalign()
4729
4730posix_memalign=no
4731cat > $TMPC << EOF
4732#include <stdlib.h>
4733int main(void) {
4734    void *p;
4735    return posix_memalign(&p, 8, 8);
4736}
4737EOF
4738if compile_prog "" "" ; then
4739    posix_memalign=yes
4740fi
4741
4742##########################################
4743# check if we have posix_syslog
4744
4745posix_syslog=no
4746cat > $TMPC << EOF
4747#include <syslog.h>
4748int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; }
4749EOF
4750if compile_prog "" "" ; then
4751    posix_syslog=yes
4752fi
4753
4754##########################################
4755# check if we have sem_timedwait
4756
4757sem_timedwait=no
4758cat > $TMPC << EOF
4759#include <semaphore.h>
4760int main(void) { sem_t s; struct timespec t = {0}; return sem_timedwait(&s, &t); }
4761EOF
4762if compile_prog "" "" ; then
4763    sem_timedwait=yes
4764fi
4765
4766##########################################
4767# check if we have strchrnul
4768
4769strchrnul=no
4770cat > $TMPC << EOF
4771#include <string.h>
4772int main(void);
4773// Use a haystack that the compiler shouldn't be able to constant fold
4774char *haystack = (char*)&main;
4775int main(void) { return strchrnul(haystack, 'x') != &haystack[6]; }
4776EOF
4777if compile_prog "" "" ; then
4778    strchrnul=yes
4779fi
4780
4781#########################################
4782# check if we have st_atim
4783
4784st_atim=no
4785cat > $TMPC << EOF
4786#include <sys/stat.h>
4787#include <stddef.h>
4788int main(void) { return offsetof(struct stat, st_atim); }
4789EOF
4790if compile_prog "" "" ; then
4791    st_atim=yes
4792fi
4793
4794##########################################
4795# check if trace backend exists
4796
4797$python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
4798if test "$?" -ne 0 ; then
4799  error_exit "invalid trace backends" \
4800      "Please choose supported trace backends."
4801fi
4802
4803##########################################
4804# For 'ust' backend, test if ust headers are present
4805if have_backend "ust"; then
4806  cat > $TMPC << EOF
4807#include <lttng/tracepoint.h>
4808int main(void) { return 0; }
4809EOF
4810  if compile_prog "" "-Wl,--no-as-needed -ldl" ; then
4811    if $pkg_config lttng-ust --exists; then
4812      lttng_ust_libs=$($pkg_config --libs lttng-ust)
4813    else
4814      lttng_ust_libs="-llttng-ust -ldl"
4815    fi
4816    if $pkg_config liburcu-bp --exists; then
4817      urcu_bp_libs=$($pkg_config --libs liburcu-bp)
4818    else
4819      urcu_bp_libs="-lurcu-bp"
4820    fi
4821  else
4822    error_exit "Trace backend 'ust' missing lttng-ust header files"
4823  fi
4824fi
4825
4826##########################################
4827# For 'dtrace' backend, test if 'dtrace' command is present
4828if have_backend "dtrace"; then
4829  if ! has 'dtrace' ; then
4830    error_exit "dtrace command is not found in PATH $PATH"
4831  fi
4832  trace_backend_stap="no"
4833  if has 'stap' ; then
4834    trace_backend_stap="yes"
4835  fi
4836fi
4837
4838##########################################
4839# check and set a backend for coroutine
4840
4841# We prefer ucontext, but it's not always possible. The fallback
4842# is sigcontext. On Windows the only valid backend is the Windows
4843# specific one.
4844
4845ucontext_works=no
4846if test "$darwin" != "yes"; then
4847  cat > $TMPC << EOF
4848#include <ucontext.h>
4849#ifdef __stub_makecontext
4850#error Ignoring glibc stub makecontext which will always fail
4851#endif
4852int main(void) { makecontext(0, 0, 0); return 0; }
4853EOF
4854  if compile_prog "" "" ; then
4855    ucontext_works=yes
4856  fi
4857fi
4858
4859if test "$coroutine" = ""; then
4860  if test "$mingw32" = "yes"; then
4861    coroutine=win32
4862  elif test "$ucontext_works" = "yes"; then
4863    coroutine=ucontext
4864  else
4865    coroutine=sigaltstack
4866  fi
4867else
4868  case $coroutine in
4869  windows)
4870    if test "$mingw32" != "yes"; then
4871      error_exit "'windows' coroutine backend only valid for Windows"
4872    fi
4873    # Unfortunately the user visible backend name doesn't match the
4874    # coroutine-*.c filename for this case, so we have to adjust it here.
4875    coroutine=win32
4876    ;;
4877  ucontext)
4878    if test "$ucontext_works" != "yes"; then
4879      feature_not_found "ucontext"
4880    fi
4881    ;;
4882  sigaltstack)
4883    if test "$mingw32" = "yes"; then
4884      error_exit "only the 'windows' coroutine backend is valid for Windows"
4885    fi
4886    ;;
4887  *)
4888    error_exit "unknown coroutine backend $coroutine"
4889    ;;
4890  esac
4891fi
4892
4893if test "$coroutine_pool" = ""; then
4894  coroutine_pool=yes
4895fi
4896
4897if test "$debug_stack_usage" = "yes"; then
4898  if test "$coroutine_pool" = "yes"; then
4899    echo "WARN: disabling coroutine pool for stack usage debugging"
4900    coroutine_pool=no
4901  fi
4902fi
4903
4904##################################################
4905# SafeStack
4906
4907
4908if test "$safe_stack" = "yes"; then
4909cat > $TMPC << EOF
4910int main(int argc, char *argv[])
4911{
4912#if ! __has_feature(safe_stack)
4913#error SafeStack Disabled
4914#endif
4915    return 0;
4916}
4917EOF
4918  flag="-fsanitize=safe-stack"
4919  # Check that safe-stack is supported and enabled.
4920  if compile_prog "-Werror $flag" "$flag"; then
4921    # Flag needed both at compilation and at linking
4922    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
4923    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
4924  else
4925    error_exit "SafeStack not supported by your compiler"
4926  fi
4927  if test "$coroutine" != "ucontext"; then
4928    error_exit "SafeStack is only supported by the coroutine backend ucontext"
4929  fi
4930else
4931cat > $TMPC << EOF
4932int main(int argc, char *argv[])
4933{
4934#if defined(__has_feature)
4935#if __has_feature(safe_stack)
4936#error SafeStack Enabled
4937#endif
4938#endif
4939    return 0;
4940}
4941EOF
4942if test "$safe_stack" = "no"; then
4943  # Make sure that safe-stack is disabled
4944  if ! compile_prog "-Werror" ""; then
4945    # SafeStack was already enabled, try to explicitly remove the feature
4946    flag="-fno-sanitize=safe-stack"
4947    if ! compile_prog "-Werror $flag" "$flag"; then
4948      error_exit "Configure cannot disable SafeStack"
4949    fi
4950    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
4951    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
4952  fi
4953else # "$safe_stack" = ""
4954  # Set safe_stack to yes or no based on pre-existing flags
4955  if compile_prog "-Werror" ""; then
4956    safe_stack="no"
4957  else
4958    safe_stack="yes"
4959    if test "$coroutine" != "ucontext"; then
4960      error_exit "SafeStack is only supported by the coroutine backend ucontext"
4961    fi
4962  fi
4963fi
4964fi
4965
4966##########################################
4967# check if we have open_by_handle_at
4968
4969open_by_handle_at=no
4970cat > $TMPC << EOF
4971#include <fcntl.h>
4972#if !defined(AT_EMPTY_PATH)
4973# error missing definition
4974#else
4975int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
4976#endif
4977EOF
4978if compile_prog "" "" ; then
4979    open_by_handle_at=yes
4980fi
4981
4982########################################
4983# check if we have linux/magic.h
4984
4985linux_magic_h=no
4986cat > $TMPC << EOF
4987#include <linux/magic.h>
4988int main(void) {
4989  return 0;
4990}
4991EOF
4992if compile_prog "" "" ; then
4993    linux_magic_h=yes
4994fi
4995
4996########################################
4997# check if we have valgrind/valgrind.h
4998
4999valgrind_h=no
5000cat > $TMPC << EOF
5001#include <valgrind/valgrind.h>
5002int main(void) {
5003  return 0;
5004}
5005EOF
5006if compile_prog "" "" ; then
5007    valgrind_h=yes
5008fi
5009
5010########################################
5011# check if environ is declared
5012
5013has_environ=no
5014cat > $TMPC << EOF
5015#include <unistd.h>
5016int main(void) {
5017    environ = 0;
5018    return 0;
5019}
5020EOF
5021if compile_prog "" "" ; then
5022    has_environ=yes
5023fi
5024
5025########################################
5026# check if cpuid.h is usable.
5027
5028cat > $TMPC << EOF
5029#include <cpuid.h>
5030int main(void) {
5031    unsigned a, b, c, d;
5032    int max = __get_cpuid_max(0, 0);
5033
5034    if (max >= 1) {
5035        __cpuid(1, a, b, c, d);
5036    }
5037
5038    if (max >= 7) {
5039        __cpuid_count(7, 0, a, b, c, d);
5040    }
5041
5042    return 0;
5043}
5044EOF
5045if compile_prog "" "" ; then
5046    cpuid_h=yes
5047fi
5048
5049##########################################
5050# avx2 optimization requirement check
5051#
5052# There is no point enabling this if cpuid.h is not usable,
5053# since we won't be able to select the new routines.
5054
5055if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
5056  cat > $TMPC << EOF
5057#pragma GCC push_options
5058#pragma GCC target("avx2")
5059#include <cpuid.h>
5060#include <immintrin.h>
5061static int bar(void *a) {
5062    __m256i x = *(__m256i *)a;
5063    return _mm256_testz_si256(x, x);
5064}
5065int main(int argc, char *argv[]) { return bar(argv[0]); }
5066EOF
5067  if compile_object "" ; then
5068    avx2_opt="yes"
5069  else
5070    avx2_opt="no"
5071  fi
5072fi
5073
5074##########################################
5075# avx512f optimization requirement check
5076#
5077# There is no point enabling this if cpuid.h is not usable,
5078# since we won't be able to select the new routines.
5079# by default, it is turned off.
5080# if user explicitly want to enable it, check environment
5081
5082if test "$cpuid_h" = "yes" && test "$avx512f_opt" = "yes"; then
5083  cat > $TMPC << EOF
5084#pragma GCC push_options
5085#pragma GCC target("avx512f")
5086#include <cpuid.h>
5087#include <immintrin.h>
5088static int bar(void *a) {
5089    __m512i x = *(__m512i *)a;
5090    return _mm512_test_epi64_mask(x, x);
5091}
5092int main(int argc, char *argv[])
5093{
5094	return bar(argv[0]);
5095}
5096EOF
5097  if ! compile_object "" ; then
5098    avx512f_opt="no"
5099  fi
5100else
5101  avx512f_opt="no"
5102fi
5103
5104########################################
5105# check if __[u]int128_t is usable.
5106
5107int128=no
5108cat > $TMPC << EOF
5109__int128_t a;
5110__uint128_t b;
5111int main (void) {
5112  a = a + b;
5113  b = a * b;
5114  a = a * a;
5115  return 0;
5116}
5117EOF
5118if compile_prog "" "" ; then
5119    int128=yes
5120fi
5121
5122#########################################
5123# See if 128-bit atomic operations are supported.
5124
5125atomic128=no
5126if test "$int128" = "yes"; then
5127  cat > $TMPC << EOF
5128int main(void)
5129{
5130  unsigned __int128 x = 0, y = 0;
5131  y = __atomic_load_16(&x, 0);
5132  __atomic_store_16(&x, y, 0);
5133  __atomic_compare_exchange_16(&x, &y, x, 0, 0, 0);
5134  return 0;
5135}
5136EOF
5137  if compile_prog "" "" ; then
5138    atomic128=yes
5139  fi
5140fi
5141
5142cmpxchg128=no
5143if test "$int128" = yes && test "$atomic128" = no; then
5144  cat > $TMPC << EOF
5145int main(void)
5146{
5147  unsigned __int128 x = 0, y = 0;
5148  __sync_val_compare_and_swap_16(&x, y, x);
5149  return 0;
5150}
5151EOF
5152  if compile_prog "" "" ; then
5153    cmpxchg128=yes
5154  fi
5155fi
5156
5157#########################################
5158# See if 64-bit atomic operations are supported.
5159# Note that without __atomic builtins, we can only
5160# assume atomic loads/stores max at pointer size.
5161
5162cat > $TMPC << EOF
5163#include <stdint.h>
5164int main(void)
5165{
5166  uint64_t x = 0, y = 0;
5167#ifdef __ATOMIC_RELAXED
5168  y = __atomic_load_n(&x, __ATOMIC_RELAXED);
5169  __atomic_store_n(&x, y, __ATOMIC_RELAXED);
5170  __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
5171  __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
5172  __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
5173#else
5174  typedef char is_host64[sizeof(void *) >= sizeof(uint64_t) ? 1 : -1];
5175  __sync_lock_test_and_set(&x, y);
5176  __sync_val_compare_and_swap(&x, y, 0);
5177  __sync_fetch_and_add(&x, y);
5178#endif
5179  return 0;
5180}
5181EOF
5182if compile_prog "" "" ; then
5183  atomic64=yes
5184fi
5185
5186#########################################
5187# See if --dynamic-list is supported by the linker
5188ld_dynamic_list="no"
5189if test "$static" = "no" ; then
5190    cat > $TMPTXT <<EOF
5191{
5192  foo;
5193};
5194EOF
5195
5196    cat > $TMPC <<EOF
5197#include <stdio.h>
5198void foo(void);
5199
5200void foo(void)
5201{
5202  printf("foo\n");
5203}
5204
5205int main(void)
5206{
5207  foo();
5208  return 0;
5209}
5210EOF
5211
5212    if compile_prog "" "-Wl,--dynamic-list=$TMPTXT" ; then
5213        ld_dynamic_list="yes"
5214    fi
5215fi
5216
5217#########################################
5218# See if -exported_symbols_list is supported by the linker
5219
5220ld_exported_symbols_list="no"
5221if test "$static" = "no" ; then
5222    cat > $TMPTXT <<EOF
5223  _foo
5224EOF
5225
5226    if compile_prog "" "-Wl,-exported_symbols_list,$TMPTXT" ; then
5227        ld_exported_symbols_list="yes"
5228    fi
5229fi
5230
5231if  test "$plugins" = "yes" &&
5232    test "$ld_dynamic_list" = "no" &&
5233    test "$ld_exported_symbols_list" = "no" ; then
5234  error_exit \
5235      "Plugin support requires dynamic linking and specifying a set of symbols " \
5236      "that are exported to plugins. Unfortunately your linker doesn't " \
5237      "support the flag (--dynamic-list or -exported_symbols_list) used " \
5238      "for this purpose. You can't build with --static."
5239fi
5240
5241########################################
5242# See if __attribute__((alias)) is supported.
5243# This false for Xcode 9, but has been remedied for Xcode 10.
5244# Unfortunately, travis uses Xcode 9 by default.
5245
5246attralias=no
5247cat > $TMPC << EOF
5248int x = 1;
5249extern const int y __attribute__((alias("x")));
5250int main(void) { return 0; }
5251EOF
5252if compile_prog "" "" ; then
5253    attralias=yes
5254fi
5255
5256########################################
5257# check if getauxval is available.
5258
5259getauxval=no
5260cat > $TMPC << EOF
5261#include <sys/auxv.h>
5262int main(void) {
5263  return getauxval(AT_HWCAP) == 0;
5264}
5265EOF
5266if compile_prog "" "" ; then
5267    getauxval=yes
5268fi
5269
5270########################################
5271# check if ccache is interfering with
5272# semantic analysis of macros
5273
5274unset CCACHE_CPP2
5275ccache_cpp2=no
5276cat > $TMPC << EOF
5277static const int Z = 1;
5278#define fn() ({ Z; })
5279#define TAUT(X) ((X) == Z)
5280#define PAREN(X, Y) (X == Y)
5281#define ID(X) (X)
5282int main(int argc, char *argv[])
5283{
5284    int x = 0, y = 0;
5285    x = ID(x);
5286    x = fn();
5287    fn();
5288    if (PAREN(x, y)) return 0;
5289    if (TAUT(Z)) return 0;
5290    return 0;
5291}
5292EOF
5293
5294if ! compile_object "-Werror"; then
5295    ccache_cpp2=yes
5296fi
5297
5298#################################################
5299# clang does not support glibc + FORTIFY_SOURCE.
5300
5301if test "$fortify_source" != "no"; then
5302  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
5303    fortify_source="no";
5304  elif test -n "$cxx" && has $cxx &&
5305       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
5306    fortify_source="no";
5307  else
5308    fortify_source="yes"
5309  fi
5310fi
5311
5312###############################################
5313# Check if copy_file_range is provided by glibc
5314have_copy_file_range=no
5315cat > $TMPC << EOF
5316#include <unistd.h>
5317int main(void) {
5318  copy_file_range(0, NULL, 0, NULL, 0, 0);
5319  return 0;
5320}
5321EOF
5322if compile_prog "" "" ; then
5323    have_copy_file_range=yes
5324fi
5325
5326##########################################
5327# check if struct fsxattr is available via linux/fs.h
5328
5329have_fsxattr=no
5330cat > $TMPC << EOF
5331#include <linux/fs.h>
5332struct fsxattr foo;
5333int main(void) {
5334  return 0;
5335}
5336EOF
5337if compile_prog "" "" ; then
5338    have_fsxattr=yes
5339fi
5340
5341##########################################
5342# check for usable membarrier system call
5343if test "$membarrier" = "yes"; then
5344    have_membarrier=no
5345    if test "$mingw32" = "yes" ; then
5346        have_membarrier=yes
5347    elif test "$linux" = "yes" ; then
5348        cat > $TMPC << EOF
5349    #include <linux/membarrier.h>
5350    #include <sys/syscall.h>
5351    #include <unistd.h>
5352    #include <stdlib.h>
5353    int main(void) {
5354        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
5355        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
5356	exit(0);
5357    }
5358EOF
5359        if compile_prog "" "" ; then
5360            have_membarrier=yes
5361        fi
5362    fi
5363    if test "$have_membarrier" = "no"; then
5364      feature_not_found "membarrier" "membarrier system call not available"
5365    fi
5366else
5367    # Do not enable it by default even for Mingw32, because it doesn't
5368    # work on Wine.
5369    membarrier=no
5370fi
5371
5372##########################################
5373# check if rtnetlink.h exists and is useful
5374have_rtnetlink=no
5375cat > $TMPC << EOF
5376#include <linux/rtnetlink.h>
5377int main(void) {
5378  return IFLA_PROTO_DOWN;
5379}
5380EOF
5381if compile_prog "" "" ; then
5382    have_rtnetlink=yes
5383fi
5384
5385##########################################
5386# check for usable AF_VSOCK environment
5387have_af_vsock=no
5388cat > $TMPC << EOF
5389#include <errno.h>
5390#include <sys/types.h>
5391#include <sys/socket.h>
5392#if !defined(AF_VSOCK)
5393# error missing AF_VSOCK flag
5394#endif
5395#include <linux/vm_sockets.h>
5396int main(void) {
5397    int sock, ret;
5398    struct sockaddr_vm svm;
5399    socklen_t len = sizeof(svm);
5400    sock = socket(AF_VSOCK, SOCK_STREAM, 0);
5401    ret = getpeername(sock, (struct sockaddr *)&svm, &len);
5402    if ((ret == -1) && (errno == ENOTCONN)) {
5403        return 0;
5404    }
5405    return -1;
5406}
5407EOF
5408if compile_prog "" "" ; then
5409    have_af_vsock=yes
5410fi
5411
5412##########################################
5413# check for usable AF_ALG environment
5414have_afalg=no
5415cat > $TMPC << EOF
5416#include <errno.h>
5417#include <sys/types.h>
5418#include <sys/socket.h>
5419#include <linux/if_alg.h>
5420int main(void) {
5421    int sock;
5422    sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
5423    return sock;
5424}
5425EOF
5426if compile_prog "" "" ; then
5427    have_afalg=yes
5428fi
5429if test "$crypto_afalg" = "yes"
5430then
5431    if test "$have_afalg" != "yes"
5432    then
5433	error_exit "AF_ALG requested but could not be detected"
5434    fi
5435fi
5436
5437
5438#################################################
5439# check for sysmacros.h
5440
5441have_sysmacros=no
5442cat > $TMPC << EOF
5443#include <sys/sysmacros.h>
5444int main(void) {
5445    return makedev(0, 0);
5446}
5447EOF
5448if compile_prog "" "" ; then
5449    have_sysmacros=yes
5450fi
5451
5452##########################################
5453# check for _Static_assert()
5454
5455have_static_assert=no
5456cat > $TMPC << EOF
5457_Static_assert(1, "success");
5458int main(void) {
5459    return 0;
5460}
5461EOF
5462if compile_prog "" "" ; then
5463    have_static_assert=yes
5464fi
5465
5466##########################################
5467# check for utmpx.h, it is missing e.g. on OpenBSD
5468
5469have_utmpx=no
5470cat > $TMPC << EOF
5471#include <utmpx.h>
5472struct utmpx user_info;
5473int main(void) {
5474    return 0;
5475}
5476EOF
5477if compile_prog "" "" ; then
5478    have_utmpx=yes
5479fi
5480
5481##########################################
5482# check for getrandom()
5483
5484have_getrandom=no
5485cat > $TMPC << EOF
5486#include <sys/random.h>
5487int main(void) {
5488    return getrandom(0, 0, GRND_NONBLOCK);
5489}
5490EOF
5491if compile_prog "" "" ; then
5492    have_getrandom=yes
5493fi
5494
5495##########################################
5496# checks for sanitizers
5497
5498have_asan=no
5499have_ubsan=no
5500have_asan_iface_h=no
5501have_asan_iface_fiber=no
5502
5503if test "$sanitizers" = "yes" ; then
5504  write_c_skeleton
5505  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
5506      have_asan=yes
5507  fi
5508
5509  # we could use a simple skeleton for flags checks, but this also
5510  # detect the static linking issue of ubsan, see also:
5511  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
5512  cat > $TMPC << EOF
5513#include <stdlib.h>
5514int main(void) {
5515    void *tmp = malloc(10);
5516    if (tmp != NULL) {
5517        return *(int *)(tmp + 2);
5518    }
5519    return 1;
5520}
5521EOF
5522  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
5523      have_ubsan=yes
5524  fi
5525
5526  if check_include "sanitizer/asan_interface.h" ; then
5527      have_asan_iface_h=yes
5528  fi
5529
5530  cat > $TMPC << EOF
5531#include <sanitizer/asan_interface.h>
5532int main(void) {
5533  __sanitizer_start_switch_fiber(0, 0, 0);
5534  return 0;
5535}
5536EOF
5537  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
5538      have_asan_iface_fiber=yes
5539  fi
5540fi
5541
5542##########################################
5543# checks for fuzzer
5544if test "$fuzzing" = "yes" && test -z "${LIB_FUZZING_ENGINE+xxx}"; then
5545  write_c_fuzzer_skeleton
5546  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=fuzzer" ""; then
5547    have_fuzzer=yes
5548  else
5549    error_exit "Your compiler doesn't support -fsanitize=fuzzer"
5550    exit 1
5551  fi
5552fi
5553
5554# Thread sanitizer is, for now, much noisier than the other sanitizers;
5555# keep it separate until that is not the case.
5556if test "$tsan" = "yes" && test "$sanitizers" = "yes"; then
5557  error_exit "TSAN is not supported with other sanitiziers."
5558fi
5559have_tsan=no
5560have_tsan_iface_fiber=no
5561if test "$tsan" = "yes" ; then
5562  write_c_skeleton
5563  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
5564      have_tsan=yes
5565  fi
5566  cat > $TMPC << EOF
5567#include <sanitizer/tsan_interface.h>
5568int main(void) {
5569  __tsan_create_fiber(0);
5570  return 0;
5571}
5572EOF
5573  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
5574      have_tsan_iface_fiber=yes
5575  fi
5576fi
5577
5578##########################################
5579# check for libpmem
5580
5581if test "$libpmem" != "no"; then
5582	if $pkg_config --exists "libpmem"; then
5583		libpmem="yes"
5584		libpmem_libs=$($pkg_config --libs libpmem)
5585		libpmem_cflags=$($pkg_config --cflags libpmem)
5586	else
5587		if test "$libpmem" = "yes" ; then
5588			feature_not_found "libpmem" "Install nvml or pmdk"
5589		fi
5590		libpmem="no"
5591	fi
5592fi
5593
5594##########################################
5595# check for libdaxctl
5596
5597if test "$libdaxctl" != "no"; then
5598	if $pkg_config --atleast-version=57 "libdaxctl"; then
5599		libdaxctl="yes"
5600		libdaxctl_libs=$($pkg_config --libs libdaxctl)
5601		libdaxctl_cflags=$($pkg_config --cflags libdaxctl)
5602	else
5603		if test "$libdaxctl" = "yes" ; then
5604			feature_not_found "libdaxctl" "Install libdaxctl"
5605		fi
5606		libdaxctl="no"
5607	fi
5608fi
5609
5610##########################################
5611# check for slirp
5612
5613case "$slirp" in
5614  auto | enabled | internal)
5615    # Simpler to always update submodule, even if not needed.
5616    if test -e "${source_path}/.git" && test $git_update = 'yes' ; then
5617      git_submodules="${git_submodules} slirp"
5618    fi
5619    ;;
5620esac
5621
5622##########################################
5623# check for usable __NR_keyctl syscall
5624
5625if test "$linux" = "yes" ; then
5626
5627    have_keyring=no
5628    cat > $TMPC << EOF
5629#include <errno.h>
5630#include <asm/unistd.h>
5631#include <linux/keyctl.h>
5632#include <unistd.h>
5633int main(void) {
5634    return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
5635}
5636EOF
5637    if compile_prog "" "" ; then
5638        have_keyring=yes
5639    fi
5640fi
5641if test "$secret_keyring" != "no"
5642then
5643    if test "$have_keyring" = "yes"
5644    then
5645	secret_keyring=yes
5646    else
5647	if test "$secret_keyring" = "yes"
5648	then
5649	    error_exit "syscall __NR_keyctl requested, \
5650but not implemented on your system"
5651	else
5652	    secret_keyring=no
5653	fi
5654    fi
5655fi
5656
5657##########################################
5658# End of CC checks
5659# After here, no more $cc or $ld runs
5660
5661write_c_skeleton
5662
5663if test "$gcov" = "yes" ; then
5664  :
5665elif test "$fortify_source" = "yes" ; then
5666  QEMU_CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $QEMU_CFLAGS"
5667  debug=no
5668fi
5669
5670case "$ARCH" in
5671alpha)
5672  # Ensure there's only a single GP
5673  QEMU_CFLAGS="-msmall-data $QEMU_CFLAGS"
5674;;
5675esac
5676
5677if test "$gprof" = "yes" ; then
5678  QEMU_CFLAGS="-p $QEMU_CFLAGS"
5679  QEMU_LDFLAGS="-p $QEMU_LDFLAGS"
5680fi
5681
5682if test "$have_asan" = "yes"; then
5683  QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
5684  QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
5685  if test "$have_asan_iface_h" = "no" ; then
5686      echo "ASAN build enabled, but ASAN header missing." \
5687           "Without code annotation, the report may be inferior."
5688  elif test "$have_asan_iface_fiber" = "no" ; then
5689      echo "ASAN build enabled, but ASAN header is too old." \
5690           "Without code annotation, the report may be inferior."
5691  fi
5692fi
5693if test "$have_tsan" = "yes" ; then
5694  if test "$have_tsan_iface_fiber" = "yes" ; then
5695    QEMU_CFLAGS="-fsanitize=thread $QEMU_CFLAGS"
5696    QEMU_LDFLAGS="-fsanitize=thread $QEMU_LDFLAGS"
5697  else
5698    error_exit "Cannot enable TSAN due to missing fiber annotation interface."
5699  fi
5700elif test "$tsan" = "yes" ; then
5701  error_exit "Cannot enable TSAN due to missing sanitize thread interface."
5702fi
5703if test "$have_ubsan" = "yes"; then
5704  QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS"
5705  QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
5706fi
5707
5708##########################################
5709# Do we have libnfs
5710if test "$libnfs" != "no" ; then
5711  if $pkg_config --atleast-version=1.9.3 libnfs; then
5712    libnfs="yes"
5713    libnfs_libs=$($pkg_config --libs libnfs)
5714  else
5715    if test "$libnfs" = "yes" ; then
5716      feature_not_found "libnfs" "Install libnfs devel >= 1.9.3"
5717    fi
5718    libnfs="no"
5719  fi
5720fi
5721
5722##########################################
5723
5724# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
5725if test "$solaris" = "no" && test "$tsan" = "no"; then
5726    if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
5727        QEMU_LDFLAGS="-Wl,--warn-common $QEMU_LDFLAGS"
5728    fi
5729fi
5730
5731# Use ASLR, no-SEH and DEP if available
5732if test "$mingw32" = "yes" ; then
5733    flags="--no-seh --nxcompat"
5734
5735    # Disable ASLR for debug builds to allow debugging with gdb
5736    if test "$debug" = "no" ; then
5737        flags="--dynamicbase $flags"
5738    fi
5739
5740    for flag in $flags; do
5741        if ld_has $flag ; then
5742            QEMU_LDFLAGS="-Wl,$flag $QEMU_LDFLAGS"
5743        fi
5744    done
5745fi
5746
5747# We can only support ivshmem if we have eventfd
5748if [ "$eventfd" = "yes" ]; then
5749  ivshmem=yes
5750fi
5751
5752if test "$softmmu" = yes ; then
5753  if test "$linux" = yes; then
5754    if test "$virtfs" != no && test "$cap_ng" = yes && test "$attr" = yes ; then
5755      virtfs=yes
5756    else
5757      if test "$virtfs" = yes; then
5758        error_exit "VirtFS requires libcap-ng devel and libattr devel"
5759      fi
5760      virtfs=no
5761    fi
5762  else
5763    if test "$virtfs" = yes; then
5764      error_exit "VirtFS is supported only on Linux"
5765    fi
5766    virtfs=no
5767  fi
5768fi
5769
5770# Probe for guest agent support/options
5771
5772if [ "$guest_agent" != "no" ]; then
5773  if [ "$softmmu" = no -a "$want_tools" = no ] ; then
5774      guest_agent=no
5775  elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
5776      guest_agent=yes
5777  elif [ "$guest_agent" != yes ]; then
5778      guest_agent=no
5779  else
5780      error_exit "Guest agent is not supported on this platform"
5781  fi
5782fi
5783
5784# Guest agent Window MSI  package
5785
5786if test "$guest_agent" != yes; then
5787  if test "$guest_agent_msi" = yes; then
5788    error_exit "MSI guest agent package requires guest agent enabled"
5789  fi
5790  guest_agent_msi=no
5791elif test "$mingw32" != "yes"; then
5792  if test "$guest_agent_msi" = "yes"; then
5793    error_exit "MSI guest agent package is available only for MinGW Windows cross-compilation"
5794  fi
5795  guest_agent_msi=no
5796elif ! has wixl; then
5797  if test "$guest_agent_msi" = "yes"; then
5798    error_exit "MSI guest agent package requires wixl tool installed ( usually from msitools package )"
5799  fi
5800  guest_agent_msi=no
5801else
5802  # we support qemu-ga, mingw32, and wixl: default to MSI enabled if it wasn't
5803  # disabled explicitly
5804  if test "$guest_agent_msi" != "no"; then
5805    guest_agent_msi=yes
5806  fi
5807fi
5808
5809if test "$guest_agent_msi" = "yes"; then
5810  if test "$guest_agent_with_vss" = "yes"; then
5811    QEMU_GA_MSI_WITH_VSS="-D InstallVss"
5812  fi
5813
5814  if test "$QEMU_GA_MANUFACTURER" = ""; then
5815    QEMU_GA_MANUFACTURER=QEMU
5816  fi
5817
5818  if test "$QEMU_GA_DISTRO" = ""; then
5819    QEMU_GA_DISTRO=Linux
5820  fi
5821
5822  if test "$QEMU_GA_VERSION" = ""; then
5823      QEMU_GA_VERSION=$(cat $source_path/VERSION)
5824  fi
5825
5826  QEMU_GA_MSI_MINGW_DLL_PATH="-D Mingw_dlls=$($pkg_config --variable=prefix glib-2.0)/bin"
5827
5828  case "$cpu" in
5829  x86_64)
5830    QEMU_GA_MSI_ARCH="-a x64 -D Arch=64"
5831    ;;
5832  i386)
5833    QEMU_GA_MSI_ARCH="-D Arch=32"
5834    ;;
5835  *)
5836    error_exit "CPU $cpu not supported for building installation package"
5837    ;;
5838  esac
5839fi
5840
5841# Mac OS X ships with a broken assembler
5842roms=
5843if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
5844        test "$targetos" != "Darwin" && test "$targetos" != "SunOS" && \
5845        test "$targetos" != "Haiku" && test "$softmmu" = yes ; then
5846    # Different host OS linkers have different ideas about the name of the ELF
5847    # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
5848    # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
5849    for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
5850        if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
5851            ld_i386_emulation="$emu"
5852            roms="optionrom"
5853            break
5854        fi
5855    done
5856fi
5857
5858# Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
5859if test "$cpu" = "s390x" ; then
5860  write_c_skeleton
5861  if compile_prog "-march=z900" ""; then
5862    roms="$roms s390-ccw"
5863    # SLOF is required for building the s390-ccw firmware on s390x,
5864    # since it is using the libnet code from SLOF for network booting.
5865    if test -e "${source_path}/.git" ; then
5866      git_submodules="${git_submodules} roms/SLOF"
5867    fi
5868  fi
5869fi
5870
5871# Check that the C++ compiler exists and works with the C compiler.
5872# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
5873if has $cxx; then
5874    cat > $TMPC <<EOF
5875int c_function(void);
5876int main(void) { return c_function(); }
5877EOF
5878
5879    compile_object
5880
5881    cat > $TMPCXX <<EOF
5882extern "C" {
5883   int c_function(void);
5884}
5885int c_function(void) { return 42; }
5886EOF
5887
5888    update_cxxflags
5889
5890    if do_cxx $CXXFLAGS $CONFIGURE_CXXFLAGS $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
5891        # C++ compiler $cxx works ok with C compiler $cc
5892        :
5893    else
5894        echo "C++ compiler $cxx does not work with C compiler $cc"
5895        echo "Disabling C++ specific optional code"
5896        cxx=
5897    fi
5898else
5899    echo "No C++ compiler available; disabling C++ specific optional code"
5900    cxx=
5901fi
5902
5903if test $git_update = 'yes' ; then
5904    (cd "${source_path}" && GIT="$git" "./scripts/git-submodule.sh" update "$git_submodules")
5905fi
5906
5907config_host_mak="config-host.mak"
5908
5909echo "# Automatically generated by configure - do not modify" > $config_host_mak
5910echo >> $config_host_mak
5911
5912echo all: >> $config_host_mak
5913echo "GIT=$git" >> $config_host_mak
5914echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
5915echo "GIT_UPDATE=$git_update" >> $config_host_mak
5916
5917echo "ARCH=$ARCH" >> $config_host_mak
5918
5919if test "$default_devices" = "yes" ; then
5920  echo "CONFIG_MINIKCONF_MODE=--defconfig" >> $config_host_mak
5921else
5922  echo "CONFIG_MINIKCONF_MODE=--allnoconfig" >> $config_host_mak
5923fi
5924if test "$debug_tcg" = "yes" ; then
5925  echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
5926fi
5927if test "$strip_opt" = "yes" ; then
5928  echo "STRIP=${strip}" >> $config_host_mak
5929fi
5930if test "$bigendian" = "yes" ; then
5931  echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
5932fi
5933if test "$mingw32" = "yes" ; then
5934  echo "CONFIG_WIN32=y" >> $config_host_mak
5935  rc_version=$(cat $source_path/VERSION)
5936  version_major=${rc_version%%.*}
5937  rc_version=${rc_version#*.}
5938  version_minor=${rc_version%%.*}
5939  rc_version=${rc_version#*.}
5940  version_subminor=${rc_version%%.*}
5941  version_micro=0
5942  echo "CONFIG_FILEVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
5943  echo "CONFIG_PRODUCTVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
5944  if test "$guest_agent_with_vss" = "yes" ; then
5945    echo "CONFIG_QGA_VSS=y" >> $config_host_mak
5946    echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
5947    echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
5948  fi
5949  if test "$guest_agent_ntddscsi" = "yes" ; then
5950    echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
5951  fi
5952  if test "$guest_agent_msi" = "yes"; then
5953    echo "CONFIG_QGA_MSI=y" >> $config_host_mak
5954    echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
5955    echo "QEMU_GA_MSI_WITH_VSS=${QEMU_GA_MSI_WITH_VSS}" >> $config_host_mak
5956    echo "QEMU_GA_MSI_ARCH=${QEMU_GA_MSI_ARCH}" >> $config_host_mak
5957    echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
5958    echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
5959    echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
5960  fi
5961else
5962  echo "CONFIG_POSIX=y" >> $config_host_mak
5963fi
5964
5965if test "$linux" = "yes" ; then
5966  echo "CONFIG_LINUX=y" >> $config_host_mak
5967fi
5968
5969if test "$darwin" = "yes" ; then
5970  echo "CONFIG_DARWIN=y" >> $config_host_mak
5971fi
5972
5973if test "$solaris" = "yes" ; then
5974  echo "CONFIG_SOLARIS=y" >> $config_host_mak
5975fi
5976if test "$haiku" = "yes" ; then
5977  echo "CONFIG_HAIKU=y" >> $config_host_mak
5978fi
5979if test "$static" = "yes" ; then
5980  echo "CONFIG_STATIC=y" >> $config_host_mak
5981fi
5982if test "$profiler" = "yes" ; then
5983  echo "CONFIG_PROFILER=y" >> $config_host_mak
5984fi
5985if test "$want_tools" = "yes" ; then
5986  echo "CONFIG_TOOLS=y" >> $config_host_mak
5987fi
5988if test "$guest_agent" = "yes" ; then
5989  echo "CONFIG_GUEST_AGENT=y" >> $config_host_mak
5990fi
5991echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
5992if test "$vde" = "yes" ; then
5993  echo "CONFIG_VDE=y" >> $config_host_mak
5994  echo "VDE_LIBS=$vde_libs" >> $config_host_mak
5995fi
5996if test "$netmap" = "yes" ; then
5997  echo "CONFIG_NETMAP=y" >> $config_host_mak
5998fi
5999if test "$l2tpv3" = "yes" ; then
6000  echo "CONFIG_L2TPV3=y" >> $config_host_mak
6001fi
6002if test "$gprof" = "yes" ; then
6003  echo "CONFIG_GPROF=y" >> $config_host_mak
6004fi
6005if test "$cap_ng" = "yes" ; then
6006  echo "CONFIG_LIBCAP_NG=y" >> $config_host_mak
6007  echo "LIBCAP_NG_LIBS=$cap_libs" >> $config_host_mak
6008fi
6009echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
6010for drv in $audio_drv_list; do
6011    def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
6012    echo "$def=y" >> $config_host_mak
6013done
6014if test "$alsa" = "yes" ; then
6015    echo "CONFIG_ALSA=y" >> $config_host_mak
6016fi
6017echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak
6018echo "ALSA_CFLAGS=$alsa_cflags" >> $config_host_mak
6019if test "$libpulse" = "yes" ; then
6020    echo "CONFIG_LIBPULSE=y" >> $config_host_mak
6021fi
6022echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
6023echo "PULSE_CFLAGS=$pulse_cflags" >> $config_host_mak
6024echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak
6025echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak
6026echo "OSS_LIBS=$oss_libs" >> $config_host_mak
6027if test "$libjack" = "yes" ; then
6028    echo "CONFIG_LIBJACK=y" >> $config_host_mak
6029fi
6030echo "JACK_LIBS=$jack_libs" >> $config_host_mak
6031if test "$audio_win_int" = "yes" ; then
6032  echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
6033fi
6034echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
6035echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
6036if test "$xfs" = "yes" ; then
6037  echo "CONFIG_XFS=y" >> $config_host_mak
6038fi
6039qemu_version=$(head $source_path/VERSION)
6040echo "PKGVERSION=$pkgversion" >>$config_host_mak
6041echo "SRC_PATH=$source_path" >> $config_host_mak
6042echo "TARGET_DIRS=$target_list" >> $config_host_mak
6043if test "$modules" = "yes"; then
6044  # $shacmd can generate a hash started with digit, which the compiler doesn't
6045  # like as an symbol. So prefix it with an underscore
6046  echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
6047  echo "CONFIG_MODULES=y" >> $config_host_mak
6048fi
6049if test "$module_upgrades" = "yes"; then
6050  echo "CONFIG_MODULE_UPGRADES=y" >> $config_host_mak
6051fi
6052if test "$have_x11" = "yes" && test "$need_x11" = "yes"; then
6053  echo "CONFIG_X11=y" >> $config_host_mak
6054  echo "X11_CFLAGS=$x11_cflags" >> $config_host_mak
6055  echo "X11_LIBS=$x11_libs" >> $config_host_mak
6056fi
6057if test "$pipe2" = "yes" ; then
6058  echo "CONFIG_PIPE2=y" >> $config_host_mak
6059fi
6060if test "$accept4" = "yes" ; then
6061  echo "CONFIG_ACCEPT4=y" >> $config_host_mak
6062fi
6063if test "$splice" = "yes" ; then
6064  echo "CONFIG_SPLICE=y" >> $config_host_mak
6065fi
6066if test "$eventfd" = "yes" ; then
6067  echo "CONFIG_EVENTFD=y" >> $config_host_mak
6068fi
6069if test "$memfd" = "yes" ; then
6070  echo "CONFIG_MEMFD=y" >> $config_host_mak
6071fi
6072if test "$have_usbfs" = "yes" ; then
6073  echo "CONFIG_USBFS=y" >> $config_host_mak
6074fi
6075if test "$fallocate" = "yes" ; then
6076  echo "CONFIG_FALLOCATE=y" >> $config_host_mak
6077fi
6078if test "$fallocate_punch_hole" = "yes" ; then
6079  echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
6080fi
6081if test "$fallocate_zero_range" = "yes" ; then
6082  echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak
6083fi
6084if test "$posix_fallocate" = "yes" ; then
6085  echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
6086fi
6087if test "$sync_file_range" = "yes" ; then
6088  echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
6089fi
6090if test "$fiemap" = "yes" ; then
6091  echo "CONFIG_FIEMAP=y" >> $config_host_mak
6092fi
6093if test "$dup3" = "yes" ; then
6094  echo "CONFIG_DUP3=y" >> $config_host_mak
6095fi
6096if test "$ppoll" = "yes" ; then
6097  echo "CONFIG_PPOLL=y" >> $config_host_mak
6098fi
6099if test "$prctl_pr_set_timerslack" = "yes" ; then
6100  echo "CONFIG_PRCTL_PR_SET_TIMERSLACK=y" >> $config_host_mak
6101fi
6102if test "$epoll" = "yes" ; then
6103  echo "CONFIG_EPOLL=y" >> $config_host_mak
6104fi
6105if test "$epoll_create1" = "yes" ; then
6106  echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
6107fi
6108if test "$sendfile" = "yes" ; then
6109  echo "CONFIG_SENDFILE=y" >> $config_host_mak
6110fi
6111if test "$timerfd" = "yes" ; then
6112  echo "CONFIG_TIMERFD=y" >> $config_host_mak
6113fi
6114if test "$setns" = "yes" ; then
6115  echo "CONFIG_SETNS=y" >> $config_host_mak
6116fi
6117if test "$clock_adjtime" = "yes" ; then
6118  echo "CONFIG_CLOCK_ADJTIME=y" >> $config_host_mak
6119fi
6120if test "$syncfs" = "yes" ; then
6121  echo "CONFIG_SYNCFS=y" >> $config_host_mak
6122fi
6123if test "$kcov" = "yes" ; then
6124  echo "CONFIG_KCOV=y" >> $config_host_mak
6125fi
6126if test "$btrfs" = "yes" ; then
6127  echo "CONFIG_BTRFS=y" >> $config_host_mak
6128fi
6129if test "$inotify" = "yes" ; then
6130  echo "CONFIG_INOTIFY=y" >> $config_host_mak
6131fi
6132if test "$inotify1" = "yes" ; then
6133  echo "CONFIG_INOTIFY1=y" >> $config_host_mak
6134fi
6135if test "$sem_timedwait" = "yes" ; then
6136  echo "CONFIG_SEM_TIMEDWAIT=y" >> $config_host_mak
6137fi
6138if test "$strchrnul" = "yes" ; then
6139  echo "HAVE_STRCHRNUL=y" >> $config_host_mak
6140fi
6141if test "$st_atim" = "yes" ; then
6142  echo "HAVE_STRUCT_STAT_ST_ATIM=y" >> $config_host_mak
6143fi
6144if test "$byteswap_h" = "yes" ; then
6145  echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
6146fi
6147if test "$bswap_h" = "yes" ; then
6148  echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
6149fi
6150if test "$curl" = "yes" ; then
6151  echo "CONFIG_CURL=y" >> $config_host_mak
6152  echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak
6153  echo "CURL_LIBS=$curl_libs" >> $config_host_mak
6154fi
6155if test "$brlapi" = "yes" ; then
6156  echo "CONFIG_BRLAPI=y" >> $config_host_mak
6157  echo "BRLAPI_LIBS=$brlapi_libs" >> $config_host_mak
6158fi
6159if test "$gtk" = "yes" ; then
6160  echo "CONFIG_GTK=y" >> $config_host_mak
6161  echo "GTK_CFLAGS=$gtk_cflags" >> $config_host_mak
6162  echo "GTK_LIBS=$gtk_libs" >> $config_host_mak
6163  if test "$gtk_gl" = "yes" ; then
6164    echo "CONFIG_GTK_GL=y" >> $config_host_mak
6165  fi
6166fi
6167if test "$gio" = "yes" ; then
6168    echo "CONFIG_GIO=y" >> $config_host_mak
6169    echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
6170    echo "GIO_LIBS=$gio_libs" >> $config_host_mak
6171    echo "GDBUS_CODEGEN=$gdbus_codegen" >> $config_host_mak
6172fi
6173echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
6174if test "$gnutls" = "yes" ; then
6175  echo "CONFIG_GNUTLS=y" >> $config_host_mak
6176  echo "GNUTLS_CFLAGS=$gnutls_cflags" >> $config_host_mak
6177  echo "GNUTLS_LIBS=$gnutls_libs" >> $config_host_mak
6178fi
6179if test "$gcrypt" = "yes" ; then
6180  echo "CONFIG_GCRYPT=y" >> $config_host_mak
6181  if test "$gcrypt_hmac" = "yes" ; then
6182    echo "CONFIG_GCRYPT_HMAC=y" >> $config_host_mak
6183  fi
6184  echo "GCRYPT_CFLAGS=$gcrypt_cflags" >> $config_host_mak
6185  echo "GCRYPT_LIBS=$gcrypt_libs" >> $config_host_mak
6186fi
6187if test "$nettle" = "yes" ; then
6188  echo "CONFIG_NETTLE=y" >> $config_host_mak
6189  echo "CONFIG_NETTLE_VERSION_MAJOR=${nettle_version%%.*}" >> $config_host_mak
6190  echo "NETTLE_CFLAGS=$nettle_cflags" >> $config_host_mak
6191  echo "NETTLE_LIBS=$nettle_libs" >> $config_host_mak
6192fi
6193if test "$qemu_private_xts" = "yes" ; then
6194  echo "CONFIG_QEMU_PRIVATE_XTS=y" >> $config_host_mak
6195fi
6196if test "$tasn1" = "yes" ; then
6197  echo "CONFIG_TASN1=y" >> $config_host_mak
6198fi
6199if test "$auth_pam" = "yes" ; then
6200    echo "CONFIG_AUTH_PAM=y" >> $config_host_mak
6201fi
6202if test "$have_ifaddrs_h" = "yes" ; then
6203    echo "HAVE_IFADDRS_H=y" >> $config_host_mak
6204fi
6205if test "$have_drm_h" = "yes" ; then
6206  echo "HAVE_DRM_H=y" >> $config_host_mak
6207fi
6208if test "$have_broken_size_max" = "yes" ; then
6209    echo "HAVE_BROKEN_SIZE_MAX=y" >> $config_host_mak
6210fi
6211if test "$have_openpty" = "yes" ; then
6212    echo "HAVE_OPENPTY=y" >> $config_host_mak
6213fi
6214if test "$have_sys_signal_h" = "yes" ; then
6215    echo "HAVE_SYS_SIGNAL_H=y" >> $config_host_mak
6216fi
6217
6218# Work around a system header bug with some kernel/XFS header
6219# versions where they both try to define 'struct fsxattr':
6220# xfs headers will not try to redefine structs from linux headers
6221# if this macro is set.
6222if test "$have_fsxattr" = "yes" ; then
6223    echo "HAVE_FSXATTR=y" >> $config_host_mak
6224fi
6225if test "$have_copy_file_range" = "yes" ; then
6226    echo "HAVE_COPY_FILE_RANGE=y" >> $config_host_mak
6227fi
6228if test "$vte" = "yes" ; then
6229  echo "CONFIG_VTE=y" >> $config_host_mak
6230  echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak
6231  echo "VTE_LIBS=$vte_libs" >> $config_host_mak
6232fi
6233if test "$virglrenderer" = "yes" ; then
6234  echo "CONFIG_VIRGL=y" >> $config_host_mak
6235  echo "VIRGL_CFLAGS=$virgl_cflags" >> $config_host_mak
6236  echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak
6237fi
6238if test "$xen" = "enabled" ; then
6239  echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
6240  echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
6241  echo "XEN_CFLAGS=$xen_cflags" >> $config_host_mak
6242  echo "XEN_LIBS=$xen_libs" >> $config_host_mak
6243fi
6244if test "$linux_aio" = "yes" ; then
6245  echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
6246fi
6247if test "$linux_io_uring" = "yes" ; then
6248  echo "CONFIG_LINUX_IO_URING=y" >> $config_host_mak
6249  echo "LINUX_IO_URING_CFLAGS=$linux_io_uring_cflags" >> $config_host_mak
6250  echo "LINUX_IO_URING_LIBS=$linux_io_uring_libs" >> $config_host_mak
6251fi
6252if test "$attr" = "yes" ; then
6253  echo "CONFIG_ATTR=y" >> $config_host_mak
6254  echo "LIBATTR_LIBS=$libattr_libs" >> $config_host_mak
6255fi
6256if test "$libattr" = "yes" ; then
6257  echo "CONFIG_LIBATTR=y" >> $config_host_mak
6258fi
6259if test "$virtfs" = "yes" ; then
6260  echo "CONFIG_VIRTFS=y" >> $config_host_mak
6261fi
6262if test "$vhost_scsi" = "yes" ; then
6263  echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
6264fi
6265if test "$vhost_net" = "yes" ; then
6266  echo "CONFIG_VHOST_NET=y" >> $config_host_mak
6267fi
6268if test "$vhost_net_user" = "yes" ; then
6269  echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
6270fi
6271if test "$vhost_net_vdpa" = "yes" ; then
6272  echo "CONFIG_VHOST_NET_VDPA=y" >> $config_host_mak
6273fi
6274if test "$vhost_crypto" = "yes" ; then
6275  echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
6276fi
6277if test "$vhost_vsock" = "yes" ; then
6278  echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
6279  if test "$vhost_user" = "yes" ; then
6280    echo "CONFIG_VHOST_USER_VSOCK=y" >> $config_host_mak
6281  fi
6282fi
6283if test "$vhost_kernel" = "yes" ; then
6284  echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
6285fi
6286if test "$vhost_user" = "yes" ; then
6287  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
6288fi
6289if test "$vhost_vdpa" = "yes" ; then
6290  echo "CONFIG_VHOST_VDPA=y" >> $config_host_mak
6291fi
6292if test "$vhost_user_fs" = "yes" ; then
6293  echo "CONFIG_VHOST_USER_FS=y" >> $config_host_mak
6294fi
6295if test "$iovec" = "yes" ; then
6296  echo "CONFIG_IOVEC=y" >> $config_host_mak
6297fi
6298if test "$preadv" = "yes" ; then
6299  echo "CONFIG_PREADV=y" >> $config_host_mak
6300fi
6301if test "$membarrier" = "yes" ; then
6302  echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
6303fi
6304if test "$signalfd" = "yes" ; then
6305  echo "CONFIG_SIGNALFD=y" >> $config_host_mak
6306fi
6307if test "$optreset" = "yes" ; then
6308  echo "HAVE_OPTRESET=y" >> $config_host_mak
6309fi
6310if test "$tcg" = "enabled"; then
6311  if test "$tcg_interpreter" = "yes" ; then
6312    echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
6313  fi
6314fi
6315if test "$fdatasync" = "yes" ; then
6316  echo "CONFIG_FDATASYNC=y" >> $config_host_mak
6317fi
6318if test "$madvise" = "yes" ; then
6319  echo "CONFIG_MADVISE=y" >> $config_host_mak
6320fi
6321if test "$posix_madvise" = "yes" ; then
6322  echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak
6323fi
6324if test "$posix_memalign" = "yes" ; then
6325  echo "CONFIG_POSIX_MEMALIGN=y" >> $config_host_mak
6326fi
6327if test "$spice" = "yes" ; then
6328  echo "CONFIG_SPICE=y" >> $config_host_mak
6329  echo "SPICE_CFLAGS=$spice_cflags" >> $config_host_mak
6330  echo "SPICE_LIBS=$spice_libs" >> $config_host_mak
6331fi
6332
6333if test "$smartcard" = "yes" ; then
6334  echo "CONFIG_SMARTCARD=y" >> $config_host_mak
6335  echo "SMARTCARD_CFLAGS=$libcacard_cflags" >> $config_host_mak
6336  echo "SMARTCARD_LIBS=$libcacard_libs" >> $config_host_mak
6337fi
6338
6339if test "$libusb" = "yes" ; then
6340  echo "CONFIG_USB_LIBUSB=y" >> $config_host_mak
6341  echo "LIBUSB_CFLAGS=$libusb_cflags" >> $config_host_mak
6342  echo "LIBUSB_LIBS=$libusb_libs" >> $config_host_mak
6343fi
6344
6345if test "$usb_redir" = "yes" ; then
6346  echo "CONFIG_USB_REDIR=y" >> $config_host_mak
6347  echo "USB_REDIR_CFLAGS=$usb_redir_cflags" >> $config_host_mak
6348  echo "USB_REDIR_LIBS=$usb_redir_libs" >> $config_host_mak
6349fi
6350
6351if test "$opengl" = "yes" ; then
6352  echo "CONFIG_OPENGL=y" >> $config_host_mak
6353  echo "OPENGL_CFLAGS=$opengl_cflags" >> $config_host_mak
6354  echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
6355  if test "$opengl_dmabuf" = "yes" ; then
6356    echo "CONFIG_OPENGL_DMABUF=y" >> $config_host_mak
6357  fi
6358fi
6359
6360if test "$gbm" = "yes" ; then
6361    echo "CONFIG_GBM=y" >> $config_host_mak
6362    echo "GBM_LIBS=$gbm_libs" >> $config_host_mak
6363    echo "GBM_CFLAGS=$gbm_cflags" >> $config_host_mak
6364fi
6365
6366
6367if test "$avx2_opt" = "yes" ; then
6368  echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
6369fi
6370
6371if test "$avx512f_opt" = "yes" ; then
6372  echo "CONFIG_AVX512F_OPT=y" >> $config_host_mak
6373fi
6374
6375if test "$lzo" = "yes" ; then
6376  echo "CONFIG_LZO=y" >> $config_host_mak
6377  echo "LZO_LIBS=$lzo_libs" >> $config_host_mak
6378fi
6379
6380if test "$snappy" = "yes" ; then
6381  echo "CONFIG_SNAPPY=y" >> $config_host_mak
6382  echo "SNAPPY_LIBS=$snappy_libs" >> $config_host_mak
6383fi
6384
6385if test "$bzip2" = "yes" ; then
6386  echo "CONFIG_BZIP2=y" >> $config_host_mak
6387  echo "BZIP2_LIBS=-lbz2" >> $config_host_mak
6388fi
6389
6390if test "$lzfse" = "yes" ; then
6391  echo "CONFIG_LZFSE=y" >> $config_host_mak
6392  echo "LZFSE_LIBS=-llzfse" >> $config_host_mak
6393fi
6394
6395if test "$zstd" = "yes" ; then
6396  echo "CONFIG_ZSTD=y" >> $config_host_mak
6397  echo "ZSTD_CFLAGS=$zstd_cflags" >> $config_host_mak
6398  echo "ZSTD_LIBS=$zstd_libs" >> $config_host_mak
6399fi
6400
6401if test "$libiscsi" = "yes" ; then
6402  echo "CONFIG_LIBISCSI=y" >> $config_host_mak
6403  echo "LIBISCSI_CFLAGS=$libiscsi_cflags" >> $config_host_mak
6404  echo "LIBISCSI_LIBS=$libiscsi_libs" >> $config_host_mak
6405fi
6406
6407if test "$libnfs" = "yes" ; then
6408  echo "CONFIG_LIBNFS=y" >> $config_host_mak
6409  echo "LIBNFS_LIBS=$libnfs_libs" >> $config_host_mak
6410fi
6411
6412if test "$seccomp" = "yes"; then
6413  echo "CONFIG_SECCOMP=y" >> $config_host_mak
6414  echo "SECCOMP_CFLAGS=$seccomp_cflags" >> $config_host_mak
6415  echo "SECCOMP_LIBS=$seccomp_libs" >> $config_host_mak
6416fi
6417
6418# XXX: suppress that
6419if [ "$bsd" = "yes" ] ; then
6420  echo "CONFIG_BSD=y" >> $config_host_mak
6421fi
6422
6423if test "$qom_cast_debug" = "yes" ; then
6424  echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
6425fi
6426if test "$rbd" = "yes" ; then
6427  echo "CONFIG_RBD=y" >> $config_host_mak
6428  echo "RBD_LIBS=$rbd_libs" >> $config_host_mak
6429fi
6430
6431echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
6432if test "$coroutine_pool" = "yes" ; then
6433  echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
6434else
6435  echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
6436fi
6437
6438if test "$debug_stack_usage" = "yes" ; then
6439  echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
6440fi
6441
6442if test "$crypto_afalg" = "yes" ; then
6443  echo "CONFIG_AF_ALG=y" >> $config_host_mak
6444fi
6445
6446if test "$open_by_handle_at" = "yes" ; then
6447  echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
6448fi
6449
6450if test "$linux_magic_h" = "yes" ; then
6451  echo "CONFIG_LINUX_MAGIC_H=y" >> $config_host_mak
6452fi
6453
6454if test "$valgrind_h" = "yes" ; then
6455  echo "CONFIG_VALGRIND_H=y" >> $config_host_mak
6456fi
6457
6458if test "$have_asan_iface_fiber" = "yes" ; then
6459    echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
6460fi
6461
6462if test "$have_tsan" = "yes" && test "$have_tsan_iface_fiber" = "yes" ; then
6463    echo "CONFIG_TSAN=y" >> $config_host_mak
6464fi
6465
6466if test "$has_environ" = "yes" ; then
6467  echo "CONFIG_HAS_ENVIRON=y" >> $config_host_mak
6468fi
6469
6470if test "$cpuid_h" = "yes" ; then
6471  echo "CONFIG_CPUID_H=y" >> $config_host_mak
6472fi
6473
6474if test "$int128" = "yes" ; then
6475  echo "CONFIG_INT128=y" >> $config_host_mak
6476fi
6477
6478if test "$atomic128" = "yes" ; then
6479  echo "CONFIG_ATOMIC128=y" >> $config_host_mak
6480fi
6481
6482if test "$cmpxchg128" = "yes" ; then
6483  echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
6484fi
6485
6486if test "$atomic64" = "yes" ; then
6487  echo "CONFIG_ATOMIC64=y" >> $config_host_mak
6488fi
6489
6490if test "$attralias" = "yes" ; then
6491  echo "CONFIG_ATTRIBUTE_ALIAS=y" >> $config_host_mak
6492fi
6493
6494if test "$getauxval" = "yes" ; then
6495  echo "CONFIG_GETAUXVAL=y" >> $config_host_mak
6496fi
6497
6498if test "$glusterfs" = "yes" ; then
6499  echo "CONFIG_GLUSTERFS=y" >> $config_host_mak
6500  echo "GLUSTERFS_CFLAGS=$glusterfs_cflags" >> $config_host_mak
6501  echo "GLUSTERFS_LIBS=$glusterfs_libs" >> $config_host_mak
6502fi
6503
6504if test "$glusterfs_xlator_opt" = "yes" ; then
6505  echo "CONFIG_GLUSTERFS_XLATOR_OPT=y" >> $config_host_mak
6506fi
6507
6508if test "$glusterfs_discard" = "yes" ; then
6509  echo "CONFIG_GLUSTERFS_DISCARD=y" >> $config_host_mak
6510fi
6511
6512if test "$glusterfs_fallocate" = "yes" ; then
6513  echo "CONFIG_GLUSTERFS_FALLOCATE=y" >> $config_host_mak
6514fi
6515
6516if test "$glusterfs_zerofill" = "yes" ; then
6517  echo "CONFIG_GLUSTERFS_ZEROFILL=y" >> $config_host_mak
6518fi
6519
6520if test "$glusterfs_ftruncate_has_stat" = "yes" ; then
6521  echo "CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT=y" >> $config_host_mak
6522fi
6523
6524if test "$glusterfs_iocb_has_stat" = "yes" ; then
6525  echo "CONFIG_GLUSTERFS_IOCB_HAS_STAT=y" >> $config_host_mak
6526fi
6527
6528if test "$libssh" = "yes" ; then
6529  echo "CONFIG_LIBSSH=y" >> $config_host_mak
6530  echo "LIBSSH_CFLAGS=$libssh_cflags" >> $config_host_mak
6531  echo "LIBSSH_LIBS=$libssh_libs" >> $config_host_mak
6532fi
6533
6534if test "$live_block_migration" = "yes" ; then
6535  echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
6536fi
6537
6538if test "$tpm" = "yes"; then
6539  echo 'CONFIG_TPM=y' >> $config_host_mak
6540fi
6541
6542echo "TRACE_BACKENDS=$trace_backends" >> $config_host_mak
6543if have_backend "nop"; then
6544  echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
6545fi
6546if have_backend "simple"; then
6547  echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
6548  # Set the appropriate trace file.
6549  trace_file="\"$trace_file-\" FMT_pid"
6550fi
6551if have_backend "log"; then
6552  echo "CONFIG_TRACE_LOG=y" >> $config_host_mak
6553fi
6554if have_backend "ust"; then
6555  echo "CONFIG_TRACE_UST=y" >> $config_host_mak
6556  echo "LTTNG_UST_LIBS=$lttng_ust_libs" >> $config_host_mak
6557  echo "URCU_BP_LIBS=$urcu_bp_libs" >> $config_host_mak
6558fi
6559if have_backend "dtrace"; then
6560  echo "CONFIG_TRACE_DTRACE=y" >> $config_host_mak
6561  if test "$trace_backend_stap" = "yes" ; then
6562    echo "CONFIG_TRACE_SYSTEMTAP=y" >> $config_host_mak
6563  fi
6564fi
6565if have_backend "ftrace"; then
6566  if test "$linux" = "yes" ; then
6567    echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak
6568  else
6569    feature_not_found "ftrace(trace backend)" "ftrace requires Linux"
6570  fi
6571fi
6572if have_backend "syslog"; then
6573  if test "$posix_syslog" = "yes" ; then
6574    echo "CONFIG_TRACE_SYSLOG=y" >> $config_host_mak
6575  else
6576    feature_not_found "syslog(trace backend)" "syslog not available"
6577  fi
6578fi
6579echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
6580
6581if test "$rdma" = "yes" ; then
6582  echo "CONFIG_RDMA=y" >> $config_host_mak
6583  echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
6584fi
6585
6586if test "$pvrdma" = "yes" ; then
6587  echo "CONFIG_PVRDMA=y" >> $config_host_mak
6588fi
6589
6590if test "$have_rtnetlink" = "yes" ; then
6591  echo "CONFIG_RTNETLINK=y" >> $config_host_mak
6592fi
6593
6594if test "$libxml2" = "yes" ; then
6595  echo "CONFIG_LIBXML2=y" >> $config_host_mak
6596  echo "LIBXML2_CFLAGS=$libxml2_cflags" >> $config_host_mak
6597  echo "LIBXML2_LIBS=$libxml2_libs" >> $config_host_mak
6598fi
6599
6600if test "$replication" = "yes" ; then
6601  echo "CONFIG_REPLICATION=y" >> $config_host_mak
6602fi
6603
6604if test "$have_af_vsock" = "yes" ; then
6605  echo "CONFIG_AF_VSOCK=y" >> $config_host_mak
6606fi
6607
6608if test "$have_sysmacros" = "yes" ; then
6609  echo "CONFIG_SYSMACROS=y" >> $config_host_mak
6610fi
6611
6612if test "$have_static_assert" = "yes" ; then
6613  echo "CONFIG_STATIC_ASSERT=y" >> $config_host_mak
6614fi
6615
6616if test "$have_utmpx" = "yes" ; then
6617  echo "HAVE_UTMPX=y" >> $config_host_mak
6618fi
6619if test "$have_getrandom" = "yes" ; then
6620  echo "CONFIG_GETRANDOM=y" >> $config_host_mak
6621fi
6622if test "$ivshmem" = "yes" ; then
6623  echo "CONFIG_IVSHMEM=y" >> $config_host_mak
6624fi
6625if test "$debug_mutex" = "yes" ; then
6626  echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
6627fi
6628
6629# Hold two types of flag:
6630#   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
6631#                                     a thread we have a handle to
6632#   CONFIG_PTHREAD_SETNAME_NP_W_TID - A way of doing it on a particular
6633#                                     platform
6634if test "$pthread_setname_np_w_tid" = "yes" ; then
6635  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
6636  echo "CONFIG_PTHREAD_SETNAME_NP_W_TID=y" >> $config_host_mak
6637elif test "$pthread_setname_np_wo_tid" = "yes" ; then
6638  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
6639  echo "CONFIG_PTHREAD_SETNAME_NP_WO_TID=y" >> $config_host_mak
6640fi
6641
6642if test "$libpmem" = "yes" ; then
6643  echo "CONFIG_LIBPMEM=y" >> $config_host_mak
6644  echo "LIBPMEM_LIBS=$libpmem_libs" >> $config_host_mak
6645  echo "LIBPMEM_CFLAGS=$libpmem_cflags" >> $config_host_mak
6646fi
6647
6648if test "$libdaxctl" = "yes" ; then
6649  echo "CONFIG_LIBDAXCTL=y" >> $config_host_mak
6650  echo "LIBDAXCTL_LIBS=$libdaxctl_libs" >> $config_host_mak
6651fi
6652
6653if test "$bochs" = "yes" ; then
6654  echo "CONFIG_BOCHS=y" >> $config_host_mak
6655fi
6656if test "$cloop" = "yes" ; then
6657  echo "CONFIG_CLOOP=y" >> $config_host_mak
6658fi
6659if test "$dmg" = "yes" ; then
6660  echo "CONFIG_DMG=y" >> $config_host_mak
6661fi
6662if test "$qcow1" = "yes" ; then
6663  echo "CONFIG_QCOW1=y" >> $config_host_mak
6664fi
6665if test "$vdi" = "yes" ; then
6666  echo "CONFIG_VDI=y" >> $config_host_mak
6667fi
6668if test "$vvfat" = "yes" ; then
6669  echo "CONFIG_VVFAT=y" >> $config_host_mak
6670fi
6671if test "$qed" = "yes" ; then
6672  echo "CONFIG_QED=y" >> $config_host_mak
6673fi
6674if test "$parallels" = "yes" ; then
6675  echo "CONFIG_PARALLELS=y" >> $config_host_mak
6676fi
6677if test "$sheepdog" = "yes" ; then
6678  add_to deprecated_features "sheepdog"
6679  echo "CONFIG_SHEEPDOG=y" >> $config_host_mak
6680fi
6681if test "$pty_h" = "yes" ; then
6682  echo "HAVE_PTY_H=y" >> $config_host_mak
6683fi
6684if test "$have_mlockall" = "yes" ; then
6685  echo "HAVE_MLOCKALL=y" >> $config_host_mak
6686fi
6687if test "$fuzzing" = "yes" ; then
6688  # If LIB_FUZZING_ENGINE is set, assume we are running on OSS-Fuzz, and the
6689  # needed CFLAGS have already been provided
6690  if test -z "${LIB_FUZZING_ENGINE+xxx}" ; then
6691    QEMU_CFLAGS="$QEMU_CFLAGS -fsanitize=fuzzer-no-link"
6692    FUZZ_EXE_LDFLAGS="-fsanitize=fuzzer"
6693  else
6694    FUZZ_EXE_LDFLAGS="$LIB_FUZZING_ENGINE"
6695  fi
6696fi
6697
6698if test "$plugins" = "yes" ; then
6699    echo "CONFIG_PLUGIN=y" >> $config_host_mak
6700    # Copy the export object list to the build dir
6701    if test "$ld_dynamic_list" = "yes" ; then
6702	echo "CONFIG_HAS_LD_DYNAMIC_LIST=yes" >> $config_host_mak
6703	ld_symbols=qemu-plugins-ld.symbols
6704	cp "$source_path/plugins/qemu-plugins.symbols" $ld_symbols
6705    elif test "$ld_exported_symbols_list" = "yes" ; then
6706	echo "CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST=yes" >> $config_host_mak
6707	ld64_symbols=qemu-plugins-ld64.symbols
6708	echo "# Automatically generated by configure - do not modify" > $ld64_symbols
6709	grep 'qemu_' "$source_path/plugins/qemu-plugins.symbols" | sed 's/;//g' | \
6710	    sed -E 's/^[[:space:]]*(.*)/_\1/' >> $ld64_symbols
6711    else
6712	error_exit \
6713	    "If \$plugins=yes, either \$ld_dynamic_list or " \
6714	    "\$ld_exported_symbols_list should have been set to 'yes'."
6715    fi
6716fi
6717
6718if test -n "$gdb_bin" ; then
6719    echo "HAVE_GDB_BIN=$gdb_bin" >> $config_host_mak
6720fi
6721
6722if test "$secret_keyring" = "yes" ; then
6723  echo "CONFIG_SECRET_KEYRING=y" >> $config_host_mak
6724fi
6725
6726echo "ROMS=$roms" >> $config_host_mak
6727echo "MAKE=$make" >> $config_host_mak
6728echo "PYTHON=$python" >> $config_host_mak
6729echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
6730echo "MESON=$meson" >> $config_host_mak
6731echo "NINJA=$ninja" >> $config_host_mak
6732echo "CC=$cc" >> $config_host_mak
6733if $iasl -h > /dev/null 2>&1; then
6734  echo "CONFIG_IASL=$iasl" >> $config_host_mak
6735fi
6736echo "CXX=$cxx" >> $config_host_mak
6737echo "OBJCC=$objcc" >> $config_host_mak
6738echo "AR=$ar" >> $config_host_mak
6739echo "ARFLAGS=$ARFLAGS" >> $config_host_mak
6740echo "AS=$as" >> $config_host_mak
6741echo "CCAS=$ccas" >> $config_host_mak
6742echo "CPP=$cpp" >> $config_host_mak
6743echo "OBJCOPY=$objcopy" >> $config_host_mak
6744echo "LD=$ld" >> $config_host_mak
6745echo "RANLIB=$ranlib" >> $config_host_mak
6746echo "NM=$nm" >> $config_host_mak
6747echo "PKG_CONFIG=$pkg_config_exe" >> $config_host_mak
6748echo "WINDRES=$windres" >> $config_host_mak
6749echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
6750echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
6751echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
6752echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
6753echo "GLIB_LIBS=$glib_libs" >> $config_host_mak
6754echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
6755echo "LDFLAGS_NOPIE=$LDFLAGS_NOPIE" >> $config_host_mak
6756echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
6757echo "EXESUF=$EXESUF" >> $config_host_mak
6758echo "HOST_DSOSUF=$HOST_DSOSUF" >> $config_host_mak
6759echo "LIBS_QGA=$libs_qga" >> $config_host_mak
6760echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak
6761echo "TASN1_CFLAGS=$tasn1_cflags" >> $config_host_mak
6762if test "$gcov" = "yes" ; then
6763  echo "CONFIG_GCOV=y" >> $config_host_mak
6764fi
6765
6766if test "$fuzzing" != "no"; then
6767    echo "CONFIG_FUZZ=y" >> $config_host_mak
6768fi
6769echo "FUZZ_EXE_LDFLAGS=$FUZZ_EXE_LDFLAGS" >> $config_host_mak
6770
6771if test "$rng_none" = "yes"; then
6772  echo "CONFIG_RNG_NONE=y" >> $config_host_mak
6773fi
6774
6775# use included Linux headers
6776if test "$linux" = "yes" ; then
6777  mkdir -p linux-headers
6778  case "$cpu" in
6779  i386|x86_64|x32)
6780    linux_arch=x86
6781    ;;
6782  ppc|ppc64|ppc64le)
6783    linux_arch=powerpc
6784    ;;
6785  s390x)
6786    linux_arch=s390
6787    ;;
6788  aarch64)
6789    linux_arch=arm64
6790    ;;
6791  mips64)
6792    linux_arch=mips
6793    ;;
6794  *)
6795    # For most CPUs the kernel architecture name and QEMU CPU name match.
6796    linux_arch="$cpu"
6797    ;;
6798  esac
6799    # For non-KVM architectures we will not have asm headers
6800    if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
6801      symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
6802    fi
6803fi
6804
6805for target in $target_list; do
6806    target_dir="$target"
6807    target_name=$(echo $target | cut -d '-' -f 1)
6808    mkdir -p $target_dir
6809    case $target in
6810        *-user) symlink "../qemu-$target_name" "$target_dir/qemu-$target_name" ;;
6811        *) symlink "../qemu-system-$target_name" "$target_dir/qemu-system-$target_name" ;;
6812    esac
6813done
6814
6815echo "CONFIG_QEMU_INTERP_PREFIX=$interp_prefix" | sed 's/%M/@0@/' >> $config_host_mak
6816if test "$default_targets" = "yes"; then
6817  echo "CONFIG_DEFAULT_TARGETS=y" >> $config_host_mak
6818fi
6819
6820if test "$numa" = "yes"; then
6821  echo "CONFIG_NUMA=y" >> $config_host_mak
6822  echo "NUMA_LIBS=$numa_libs" >> $config_host_mak
6823fi
6824
6825if test "$ccache_cpp2" = "yes"; then
6826  echo "export CCACHE_CPP2=y" >> $config_host_mak
6827fi
6828
6829if test "$safe_stack" = "yes"; then
6830  echo "CONFIG_SAFESTACK=y" >> $config_host_mak
6831fi
6832
6833# If we're using a separate build tree, set it up now.
6834# DIRS are directories which we simply mkdir in the build tree;
6835# LINKS are things to symlink back into the source tree
6836# (these can be both files and directories).
6837# Caution: do not add files or directories here using wildcards. This
6838# will result in problems later if a new file matching the wildcard is
6839# added to the source tree -- nothing will cause configure to be rerun
6840# so the build tree will be missing the link back to the new file, and
6841# tests might fail. Prefer to keep the relevant files in their own
6842# directory and symlink the directory instead.
6843# UNLINK is used to remove symlinks from older development versions
6844# that might get into the way when doing "git update" without doing
6845# a "make distclean" in between.
6846DIRS="tests tests/tcg tests/tcg/lm32 tests/qapi-schema tests/qtest/libqos"
6847DIRS="$DIRS tests/qtest tests/qemu-iotests tests/vm tests/fp tests/qgraph"
6848DIRS="$DIRS docs docs/interop fsdev scsi"
6849DIRS="$DIRS pc-bios/optionrom pc-bios/s390-ccw"
6850DIRS="$DIRS roms/seabios"
6851DIRS="$DIRS contrib/plugins/"
6852LINKS="Makefile"
6853LINKS="$LINKS tests/tcg/lm32/Makefile"
6854LINKS="$LINKS tests/tcg/Makefile.target"
6855LINKS="$LINKS pc-bios/optionrom/Makefile"
6856LINKS="$LINKS pc-bios/s390-ccw/Makefile"
6857LINKS="$LINKS roms/seabios/Makefile"
6858LINKS="$LINKS pc-bios/qemu-icon.bmp"
6859LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
6860LINKS="$LINKS tests/acceptance tests/data"
6861LINKS="$LINKS tests/qemu-iotests/check"
6862LINKS="$LINKS python"
6863LINKS="$LINKS contrib/plugins/Makefile "
6864UNLINK="pc-bios/keymaps"
6865for bios_file in \
6866    $source_path/pc-bios/*.bin \
6867    $source_path/pc-bios/*.elf \
6868    $source_path/pc-bios/*.lid \
6869    $source_path/pc-bios/*.rom \
6870    $source_path/pc-bios/*.dtb \
6871    $source_path/pc-bios/*.img \
6872    $source_path/pc-bios/openbios-* \
6873    $source_path/pc-bios/u-boot.* \
6874    $source_path/pc-bios/edk2-*.fd.bz2 \
6875    $source_path/pc-bios/palcode-*
6876do
6877    LINKS="$LINKS pc-bios/$(basename $bios_file)"
6878done
6879mkdir -p $DIRS
6880for f in $LINKS ; do
6881    if [ -e "$source_path/$f" ]; then
6882        symlink "$source_path/$f" "$f"
6883    fi
6884done
6885for f in $UNLINK ; do
6886    if [ -L "$f" ]; then
6887        rm -f "$f"
6888    fi
6889done
6890
6891(for i in $cross_cc_vars; do
6892  export $i
6893done
6894export target_list source_path use_containers
6895$source_path/tests/tcg/configure.sh)
6896
6897# temporary config to build submodules
6898for rom in seabios; do
6899    config_mak=roms/$rom/config.mak
6900    echo "# Automatically generated by configure - do not modify" > $config_mak
6901    echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
6902    echo "AS=$as" >> $config_mak
6903    echo "CCAS=$ccas" >> $config_mak
6904    echo "CC=$cc" >> $config_mak
6905    echo "BCC=bcc" >> $config_mak
6906    echo "CPP=$cpp" >> $config_mak
6907    echo "OBJCOPY=objcopy" >> $config_mak
6908    echo "IASL=$iasl" >> $config_mak
6909    echo "LD=$ld" >> $config_mak
6910    echo "RANLIB=$ranlib" >> $config_mak
6911done
6912
6913# set up qemu-iotests in this build directory
6914iotests_common_env="tests/qemu-iotests/common.env"
6915
6916echo "# Automatically generated by configure - do not modify" > "$iotests_common_env"
6917echo >> "$iotests_common_env"
6918echo "export PYTHON='$python'" >> "$iotests_common_env"
6919
6920if test "$skip_meson" = no; then
6921cross="config-meson.cross.new"
6922meson_quote() {
6923    echo "'$(echo $* | sed "s/ /','/g")'"
6924}
6925
6926echo "# Automatically generated by configure - do not modify" > $cross
6927echo "[properties]" >> $cross
6928test -z "$cxx" && echo "link_language = 'c'" >> $cross
6929echo "[built-in options]" >> $cross
6930echo "c_args = [${CFLAGS:+$(meson_quote $CFLAGS)}]" >> $cross
6931echo "cpp_args = [${CXXFLAGS:+$(meson_quote $CXXFLAGS)}]" >> $cross
6932echo "c_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
6933echo "cpp_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
6934echo "[binaries]" >> $cross
6935echo "c = [$(meson_quote $cc)]" >> $cross
6936test -n "$cxx" && echo "cpp = [$(meson_quote $cxx)]" >> $cross
6937echo "ar = [$(meson_quote $ar)]" >> $cross
6938echo "nm = [$(meson_quote $nm)]" >> $cross
6939echo "pkgconfig = [$(meson_quote $pkg_config_exe)]" >> $cross
6940echo "ranlib = [$(meson_quote $ranlib)]" >> $cross
6941if has $sdl2_config; then
6942  echo "sdl2-config = [$(meson_quote $sdl2_config)]" >> $cross
6943fi
6944echo "strip = [$(meson_quote $strip)]" >> $cross
6945echo "windres = [$(meson_quote $windres)]" >> $cross
6946if test -n "$cross_prefix"; then
6947    cross_arg="--cross-file config-meson.cross"
6948    echo "[host_machine]" >> $cross
6949    if test "$mingw32" = "yes" ; then
6950        echo "system = 'windows'" >> $cross
6951    fi
6952    if test "$linux" = "yes" ; then
6953        echo "system = 'linux'" >> $cross
6954    fi
6955    case "$ARCH" in
6956        i386|x86_64)
6957            echo "cpu_family = 'x86'" >> $cross
6958            ;;
6959        ppc64le)
6960            echo "cpu_family = 'ppc64'" >> $cross
6961            ;;
6962        *)
6963            echo "cpu_family = '$ARCH'" >> $cross
6964            ;;
6965    esac
6966    echo "cpu = '$cpu'" >> $cross
6967    if test "$bigendian" = "yes" ; then
6968        echo "endian = 'big'" >> $cross
6969    else
6970        echo "endian = 'little'" >> $cross
6971    fi
6972else
6973    cross_arg="--native-file config-meson.cross"
6974fi
6975mv $cross config-meson.cross
6976
6977rm -rf meson-private meson-info meson-logs
6978unset staticpic
6979if ! version_ge "$($meson --version)" 0.56.0; then
6980  staticpic=$(if test "$pie" = yes; then echo true; else echo false; fi)
6981fi
6982NINJA=$ninja $meson setup \
6983        --prefix "$prefix" \
6984        --libdir "$libdir" \
6985        --libexecdir "$libexecdir" \
6986        --bindir "$bindir" \
6987        --includedir "$includedir" \
6988        --datadir "$datadir" \
6989        --mandir "$mandir" \
6990        --sysconfdir "$sysconfdir" \
6991        --localedir "$localedir" \
6992        --localstatedir "$local_statedir" \
6993        -Ddocdir="$docdir" \
6994        -Dqemu_firmwarepath="$firmwarepath" \
6995        -Dqemu_suffix="$qemu_suffix" \
6996        -Doptimization=$(if test "$debug" = yes; then echo 0; else echo 2; fi) \
6997        -Ddebug=$(if test "$debug_info" = yes; then echo true; else echo false; fi) \
6998        -Dwerror=$(if test "$werror" = yes; then echo true; else echo false; fi) \
6999        -Dstrip=$(if test "$strip_opt" = yes; then echo true; else echo false; fi) \
7000        -Db_pie=$(if test "$pie" = yes; then echo true; else echo false; fi) \
7001        ${staticpic:+-Db_staticpic=$staticpic} \
7002        -Db_coverage=$(if test "$gcov" = yes; then echo true; else echo false; fi) \
7003        -Dmalloc=$malloc -Dmalloc_trim=$malloc_trim -Dsparse=$sparse \
7004        -Dkvm=$kvm -Dhax=$hax -Dwhpx=$whpx -Dhvf=$hvf \
7005        -Dxen=$xen -Dxen_pci_passthrough=$xen_pci_passthrough -Dtcg=$tcg \
7006        -Dcocoa=$cocoa -Dmpath=$mpath -Dsdl=$sdl -Dsdl_image=$sdl_image \
7007        -Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg -Dvnc_png=$vnc_png \
7008        -Dgettext=$gettext -Dxkbcommon=$xkbcommon -Du2f=$u2f -Dvirtiofsd=$virtiofsd \
7009        -Dcapstone=$capstone -Dslirp=$slirp -Dfdt=$fdt \
7010        -Diconv=$iconv -Dcurses=$curses -Dlibudev=$libudev\
7011        -Ddocs=$docs -Dsphinx_build=$sphinx_build -Dinstall_blobs=$blobs \
7012        -Dvhost_user_blk_server=$vhost_user_blk_server \
7013        $cross_arg \
7014        "$PWD" "$source_path"
7015
7016if test "$?" -ne 0 ; then
7017    error_exit "meson setup failed"
7018fi
7019fi
7020
7021if test -n "${deprecated_features}"; then
7022    echo "Warning, deprecated features enabled."
7023    echo "Please see docs/system/deprecated.rst"
7024    echo "  features: ${deprecated_features}"
7025fi
7026
7027# Save the configure command line for later reuse.
7028cat <<EOD >config.status
7029#!/bin/sh
7030# Generated by configure.
7031# Run this file to recreate the current configuration.
7032# Compiler output produced by configure, useful for debugging
7033# configure, is in config.log if it exists.
7034EOD
7035
7036preserve_env() {
7037    envname=$1
7038
7039    eval envval=\$$envname
7040
7041    if test -n "$envval"
7042    then
7043	echo "$envname='$envval'" >> config.status
7044	echo "export $envname" >> config.status
7045    else
7046	echo "unset $envname" >> config.status
7047    fi
7048}
7049
7050# Preserve various env variables that influence what
7051# features/build target configure will detect
7052preserve_env AR
7053preserve_env AS
7054preserve_env CC
7055preserve_env CPP
7056preserve_env CXX
7057preserve_env INSTALL
7058preserve_env LD
7059preserve_env LD_LIBRARY_PATH
7060preserve_env LIBTOOL
7061preserve_env MAKE
7062preserve_env NM
7063preserve_env OBJCOPY
7064preserve_env PATH
7065preserve_env PKG_CONFIG
7066preserve_env PKG_CONFIG_LIBDIR
7067preserve_env PKG_CONFIG_PATH
7068preserve_env PYTHON
7069preserve_env SDL2_CONFIG
7070preserve_env SMBD
7071preserve_env STRIP
7072preserve_env WINDRES
7073
7074printf "exec" >>config.status
7075for i in "$0" "$@"; do
7076  test "$i" = --skip-meson || printf " '%s'" "$i" >>config.status
7077done
7078echo ' "$@"' >>config.status
7079chmod +x config.status
7080
7081rm -r "$TMPDIR1"
7082