xref: /qemu/configure (revision 922d42bb)
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 -DBSD_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    write_c_skeleton
3509    if compile_prog "" "$gio_libs" ; then
3510        gio=yes
3511    else
3512        gio=no
3513    fi
3514else
3515    gio=no
3516fi
3517
3518if $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
3519    gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
3520    gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
3521fi
3522
3523# Sanity check that the current size_t matches the
3524# size that glib thinks it should be. This catches
3525# problems on multi-arch where people try to build
3526# 32-bit QEMU while pointing at 64-bit glib headers
3527cat > $TMPC <<EOF
3528#include <glib.h>
3529#include <unistd.h>
3530
3531#define QEMU_BUILD_BUG_ON(x) \
3532  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
3533
3534int main(void) {
3535   QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
3536   return 0;
3537}
3538EOF
3539
3540if ! compile_prog "$glib_cflags" "$glib_libs" ; then
3541    error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
3542               "You probably need to set PKG_CONFIG_LIBDIR"\
3543	       "to point to the right pkg-config files for your"\
3544	       "build target"
3545fi
3546
3547# Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
3548cat > $TMPC << EOF
3549#include <glib.h>
3550int main(void) { return 0; }
3551EOF
3552if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3553    if cc_has_warning_flag "-Wno-unknown-attributes"; then
3554        glib_cflags="-Wno-unknown-attributes $glib_cflags"
3555        CONFIGURE_CFLAGS="-Wno-unknown-attributes $CONFIGURE_CFLAGS"
3556    fi
3557fi
3558
3559# Silence clang warnings triggered by glib < 2.57.2
3560cat > $TMPC << EOF
3561#include <glib.h>
3562typedef struct Foo {
3563    int i;
3564} Foo;
3565static void foo_free(Foo *f)
3566{
3567    g_free(f);
3568}
3569G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free);
3570int main(void) { return 0; }
3571EOF
3572if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3573    if cc_has_warning_flag "-Wno-unused-function"; then
3574        glib_cflags="$glib_cflags -Wno-unused-function"
3575        CONFIGURE_CFLAGS="$CONFIGURE_CFLAGS -Wno-unused-function"
3576    fi
3577fi
3578
3579##########################################
3580# SHA command probe for modules
3581if test "$modules" = yes; then
3582    shacmd_probe="sha1sum sha1 shasum"
3583    for c in $shacmd_probe; do
3584        if has $c; then
3585            shacmd="$c"
3586            break
3587        fi
3588    done
3589    if test "$shacmd" = ""; then
3590        error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
3591    fi
3592fi
3593
3594##########################################
3595# pthread probe
3596PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
3597
3598pthread=no
3599cat > $TMPC << EOF
3600#include <pthread.h>
3601static void *f(void *p) { return NULL; }
3602int main(void) {
3603  pthread_t thread;
3604  pthread_create(&thread, 0, f, 0);
3605  return 0;
3606}
3607EOF
3608if compile_prog "" "" ; then
3609  pthread=yes
3610else
3611  for pthread_lib in $PTHREADLIBS_LIST; do
3612    if compile_prog "" "$pthread_lib" ; then
3613      pthread=yes
3614      found=no
3615      for lib_entry in $LIBS; do
3616        if test "$lib_entry" = "$pthread_lib"; then
3617          found=yes
3618          break
3619        fi
3620      done
3621      if test "$found" = "no"; then
3622        LIBS="$pthread_lib $LIBS"
3623      fi
3624      break
3625    fi
3626  done
3627fi
3628
3629if test "$mingw32" != yes && test "$pthread" = no; then
3630  error_exit "pthread check failed" \
3631      "Make sure to have the pthread libs and headers installed."
3632fi
3633
3634# check for pthread_setname_np with thread id
3635pthread_setname_np_w_tid=no
3636cat > $TMPC << EOF
3637#include <pthread.h>
3638
3639static void *f(void *p) { return NULL; }
3640int main(void)
3641{
3642    pthread_t thread;
3643    pthread_create(&thread, 0, f, 0);
3644    pthread_setname_np(thread, "QEMU");
3645    return 0;
3646}
3647EOF
3648if compile_prog "" "$pthread_lib" ; then
3649  pthread_setname_np_w_tid=yes
3650fi
3651
3652# check for pthread_setname_np without thread id
3653pthread_setname_np_wo_tid=no
3654cat > $TMPC << EOF
3655#include <pthread.h>
3656
3657static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
3658int main(void)
3659{
3660    pthread_t thread;
3661    pthread_create(&thread, 0, f, 0);
3662    return 0;
3663}
3664EOF
3665if compile_prog "" "$pthread_lib" ; then
3666  pthread_setname_np_wo_tid=yes
3667fi
3668
3669##########################################
3670# rbd probe
3671if test "$rbd" != "no" ; then
3672  cat > $TMPC <<EOF
3673#include <stdio.h>
3674#include <rbd/librbd.h>
3675int main(void) {
3676    rados_t cluster;
3677    rados_create(&cluster, NULL);
3678    return 0;
3679}
3680EOF
3681  rbd_libs="-lrbd -lrados"
3682  if compile_prog "" "$rbd_libs" ; then
3683    rbd=yes
3684  else
3685    if test "$rbd" = "yes" ; then
3686      feature_not_found "rados block device" "Install librbd/ceph devel"
3687    fi
3688    rbd=no
3689  fi
3690fi
3691
3692##########################################
3693# libssh probe
3694if test "$libssh" != "no" ; then
3695  if $pkg_config --exists libssh; then
3696    libssh_cflags=$($pkg_config libssh --cflags)
3697    libssh_libs=$($pkg_config libssh --libs)
3698    libssh=yes
3699  else
3700    if test "$libssh" = "yes" ; then
3701      error_exit "libssh required for --enable-libssh"
3702    fi
3703    libssh=no
3704  fi
3705fi
3706
3707##########################################
3708# Check for libssh 0.8
3709# This is done like this instead of using the LIBSSH_VERSION_* and
3710# SSH_VERSION_* macros because some distributions in the past shipped
3711# snapshots of the future 0.8 from Git, and those snapshots did not
3712# have updated version numbers (still referring to 0.7.0).
3713
3714if test "$libssh" = "yes"; then
3715  cat > $TMPC <<EOF
3716#include <libssh/libssh.h>
3717int main(void) { return ssh_get_server_publickey(NULL, NULL); }
3718EOF
3719  if compile_prog "$libssh_cflags" "$libssh_libs"; then
3720    libssh_cflags="-DHAVE_LIBSSH_0_8 $libssh_cflags"
3721  fi
3722fi
3723
3724##########################################
3725# linux-aio probe
3726
3727if test "$linux_aio" != "no" ; then
3728  cat > $TMPC <<EOF
3729#include <libaio.h>
3730#include <sys/eventfd.h>
3731#include <stddef.h>
3732int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
3733EOF
3734  if compile_prog "" "-laio" ; then
3735    linux_aio=yes
3736  else
3737    if test "$linux_aio" = "yes" ; then
3738      feature_not_found "linux AIO" "Install libaio devel"
3739    fi
3740    linux_aio=no
3741  fi
3742fi
3743##########################################
3744# linux-io-uring probe
3745
3746if test "$linux_io_uring" != "no" ; then
3747  if $pkg_config liburing; then
3748    linux_io_uring_cflags=$($pkg_config --cflags liburing)
3749    linux_io_uring_libs=$($pkg_config --libs liburing)
3750    linux_io_uring=yes
3751  else
3752    if test "$linux_io_uring" = "yes" ; then
3753      feature_not_found "linux io_uring" "Install liburing devel"
3754    fi
3755    linux_io_uring=no
3756  fi
3757fi
3758
3759##########################################
3760# TPM emulation is only on POSIX
3761
3762if test "$tpm" = ""; then
3763  if test "$mingw32" = "yes"; then
3764    tpm=no
3765  else
3766    tpm=yes
3767  fi
3768elif test "$tpm" = "yes"; then
3769  if test "$mingw32" = "yes" ; then
3770    error_exit "TPM emulation only available on POSIX systems"
3771  fi
3772fi
3773
3774##########################################
3775# attr probe
3776
3777libattr_libs=
3778if test "$attr" != "no" ; then
3779  cat > $TMPC <<EOF
3780#include <stdio.h>
3781#include <sys/types.h>
3782#ifdef CONFIG_LIBATTR
3783#include <attr/xattr.h>
3784#else
3785#include <sys/xattr.h>
3786#endif
3787int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }
3788EOF
3789  if compile_prog "" "" ; then
3790    attr=yes
3791  # Older distros have <attr/xattr.h>, and need -lattr:
3792  elif compile_prog "-DCONFIG_LIBATTR" "-lattr" ; then
3793    attr=yes
3794    libattr_libs="-lattr"
3795    libattr=yes
3796  else
3797    if test "$attr" = "yes" ; then
3798      feature_not_found "ATTR" "Install libc6 or libattr devel"
3799    fi
3800    attr=no
3801  fi
3802fi
3803
3804##########################################
3805# iovec probe
3806cat > $TMPC <<EOF
3807#include <sys/types.h>
3808#include <sys/uio.h>
3809#include <unistd.h>
3810int main(void) { return sizeof(struct iovec); }
3811EOF
3812iovec=no
3813if compile_prog "" "" ; then
3814  iovec=yes
3815fi
3816
3817##########################################
3818# preadv probe
3819cat > $TMPC <<EOF
3820#include <sys/types.h>
3821#include <sys/uio.h>
3822#include <unistd.h>
3823int main(void) { return preadv(0, 0, 0, 0); }
3824EOF
3825preadv=no
3826if compile_prog "" "" ; then
3827  preadv=yes
3828fi
3829
3830##########################################
3831# fdt probe
3832
3833case "$fdt" in
3834  auto | enabled | internal)
3835    # Simpler to always update submodule, even if not needed.
3836    if test -e "${source_path}/.git" && test $git_update = 'yes' ; then
3837      git_submodules="${git_submodules} dtc"
3838    fi
3839    ;;
3840esac
3841
3842##########################################
3843# opengl probe (for sdl2, gtk, milkymist-tmu2)
3844
3845gbm="no"
3846if $pkg_config gbm; then
3847    gbm_cflags="$($pkg_config --cflags gbm)"
3848    gbm_libs="$($pkg_config --libs gbm)"
3849    gbm="yes"
3850fi
3851
3852if test "$opengl" != "no" ; then
3853  opengl_pkgs="epoxy gbm"
3854  if $pkg_config $opengl_pkgs; then
3855    opengl_cflags="$($pkg_config --cflags $opengl_pkgs)"
3856    opengl_libs="$($pkg_config --libs $opengl_pkgs)"
3857    opengl=yes
3858    if test "$gtk" = "yes" && $pkg_config --exists "$gtkpackage >= 3.16"; then
3859        gtk_gl="yes"
3860    fi
3861  else
3862    if test "$opengl" = "yes" ; then
3863      feature_not_found "opengl" "Please install opengl (mesa) devel pkgs: $opengl_pkgs"
3864    fi
3865    opengl_cflags=""
3866    opengl_libs=""
3867    opengl=no
3868  fi
3869fi
3870
3871if test "$opengl" = "yes"; then
3872  cat > $TMPC << EOF
3873#include <epoxy/egl.h>
3874#ifndef EGL_MESA_image_dma_buf_export
3875# error mesa/epoxy lacks support for dmabufs (mesa 10.6+)
3876#endif
3877int main(void) { return 0; }
3878EOF
3879  if compile_prog "" "" ; then
3880    opengl_dmabuf=yes
3881  fi
3882fi
3883
3884if test "$opengl" = "yes" && test "$have_x11" = "yes"; then
3885  for target in $target_list; do
3886    case $target in
3887      lm32-softmmu) # milkymist-tmu2 requires X11 and OpenGL
3888        need_x11=yes
3889      ;;
3890    esac
3891  done
3892fi
3893
3894##########################################
3895# libxml2 probe
3896if test "$libxml2" != "no" ; then
3897    if $pkg_config --exists libxml-2.0; then
3898        libxml2="yes"
3899        libxml2_cflags=$($pkg_config --cflags libxml-2.0)
3900        libxml2_libs=$($pkg_config --libs libxml-2.0)
3901    else
3902        if test "$libxml2" = "yes"; then
3903            feature_not_found "libxml2" "Install libxml2 devel"
3904        fi
3905        libxml2="no"
3906    fi
3907fi
3908
3909##########################################
3910# glusterfs probe
3911if test "$glusterfs" != "no" ; then
3912  if $pkg_config --atleast-version=3 glusterfs-api; then
3913    glusterfs="yes"
3914    glusterfs_cflags=$($pkg_config --cflags glusterfs-api)
3915    glusterfs_libs=$($pkg_config --libs glusterfs-api)
3916    if $pkg_config --atleast-version=4 glusterfs-api; then
3917      glusterfs_xlator_opt="yes"
3918    fi
3919    if $pkg_config --atleast-version=5 glusterfs-api; then
3920      glusterfs_discard="yes"
3921    fi
3922    if $pkg_config --atleast-version=6 glusterfs-api; then
3923      glusterfs_fallocate="yes"
3924      glusterfs_zerofill="yes"
3925    fi
3926    cat > $TMPC << EOF
3927#include <glusterfs/api/glfs.h>
3928
3929int
3930main(void)
3931{
3932	/* new glfs_ftruncate() passes two additional args */
3933	return glfs_ftruncate(NULL, 0, NULL, NULL);
3934}
3935EOF
3936    if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
3937      glusterfs_ftruncate_has_stat="yes"
3938    fi
3939    cat > $TMPC << EOF
3940#include <glusterfs/api/glfs.h>
3941
3942/* new glfs_io_cbk() passes two additional glfs_stat structs */
3943static void
3944glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
3945{}
3946
3947int
3948main(void)
3949{
3950	glfs_io_cbk iocb = &glusterfs_iocb;
3951	iocb(NULL, 0 , NULL, NULL, NULL);
3952	return 0;
3953}
3954EOF
3955    if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
3956      glusterfs_iocb_has_stat="yes"
3957    fi
3958  else
3959    if test "$glusterfs" = "yes" ; then
3960      feature_not_found "GlusterFS backend support" \
3961          "Install glusterfs-api devel >= 3"
3962    fi
3963    glusterfs="no"
3964  fi
3965fi
3966
3967# Check for inotify functions when we are building linux-user
3968# emulator.  This is done because older glibc versions don't
3969# have syscall stubs for these implemented.  In that case we
3970# don't provide them even if kernel supports them.
3971#
3972inotify=no
3973cat > $TMPC << EOF
3974#include <sys/inotify.h>
3975
3976int
3977main(void)
3978{
3979	/* try to start inotify */
3980	return inotify_init();
3981}
3982EOF
3983if compile_prog "" "" ; then
3984  inotify=yes
3985fi
3986
3987inotify1=no
3988cat > $TMPC << EOF
3989#include <sys/inotify.h>
3990
3991int
3992main(void)
3993{
3994    /* try to start inotify */
3995    return inotify_init1(0);
3996}
3997EOF
3998if compile_prog "" "" ; then
3999  inotify1=yes
4000fi
4001
4002# check if pipe2 is there
4003pipe2=no
4004cat > $TMPC << EOF
4005#include <unistd.h>
4006#include <fcntl.h>
4007
4008int main(void)
4009{
4010    int pipefd[2];
4011    return pipe2(pipefd, O_CLOEXEC);
4012}
4013EOF
4014if compile_prog "" "" ; then
4015  pipe2=yes
4016fi
4017
4018# check if accept4 is there
4019accept4=no
4020cat > $TMPC << EOF
4021#include <sys/socket.h>
4022#include <stddef.h>
4023
4024int main(void)
4025{
4026    accept4(0, NULL, NULL, SOCK_CLOEXEC);
4027    return 0;
4028}
4029EOF
4030if compile_prog "" "" ; then
4031  accept4=yes
4032fi
4033
4034# check if tee/splice is there. vmsplice was added same time.
4035splice=no
4036cat > $TMPC << EOF
4037#include <unistd.h>
4038#include <fcntl.h>
4039#include <limits.h>
4040
4041int main(void)
4042{
4043    int len, fd = 0;
4044    len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
4045    splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
4046    return 0;
4047}
4048EOF
4049if compile_prog "" "" ; then
4050  splice=yes
4051fi
4052
4053##########################################
4054# libnuma probe
4055
4056if test "$numa" != "no" ; then
4057  cat > $TMPC << EOF
4058#include <numa.h>
4059int main(void) { return numa_available(); }
4060EOF
4061
4062  if compile_prog "" "-lnuma" ; then
4063    numa=yes
4064    numa_libs="-lnuma"
4065  else
4066    if test "$numa" = "yes" ; then
4067      feature_not_found "numa" "install numactl devel"
4068    fi
4069    numa=no
4070  fi
4071fi
4072
4073malloc=system
4074if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
4075    echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
4076    exit 1
4077elif test "$tcmalloc" = "yes" ; then
4078    malloc=tcmalloc
4079elif test "$jemalloc" = "yes" ; then
4080    malloc=jemalloc
4081fi
4082
4083##########################################
4084# signalfd probe
4085signalfd="no"
4086cat > $TMPC << EOF
4087#include <unistd.h>
4088#include <sys/syscall.h>
4089#include <signal.h>
4090int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }
4091EOF
4092
4093if compile_prog "" "" ; then
4094  signalfd=yes
4095fi
4096
4097# check if optreset global is declared by <getopt.h>
4098optreset="no"
4099cat > $TMPC << EOF
4100#include <getopt.h>
4101int main(void) { return optreset; }
4102EOF
4103
4104if compile_prog "" "" ; then
4105  optreset=yes
4106fi
4107
4108# check if eventfd is supported
4109eventfd=no
4110cat > $TMPC << EOF
4111#include <sys/eventfd.h>
4112
4113int main(void)
4114{
4115    return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
4116}
4117EOF
4118if compile_prog "" "" ; then
4119  eventfd=yes
4120fi
4121
4122# check if memfd is supported
4123memfd=no
4124cat > $TMPC << EOF
4125#include <sys/mman.h>
4126
4127int main(void)
4128{
4129    return memfd_create("foo", MFD_ALLOW_SEALING);
4130}
4131EOF
4132if compile_prog "" "" ; then
4133  memfd=yes
4134fi
4135
4136# check for usbfs
4137have_usbfs=no
4138if test "$linux_user" = "yes"; then
4139  cat > $TMPC << EOF
4140#include <linux/usbdevice_fs.h>
4141
4142#ifndef USBDEVFS_GET_CAPABILITIES
4143#error "USBDEVFS_GET_CAPABILITIES undefined"
4144#endif
4145
4146#ifndef USBDEVFS_DISCONNECT_CLAIM
4147#error "USBDEVFS_DISCONNECT_CLAIM undefined"
4148#endif
4149
4150int main(void)
4151{
4152    return 0;
4153}
4154EOF
4155  if compile_prog "" ""; then
4156    have_usbfs=yes
4157  fi
4158fi
4159
4160# check for fallocate
4161fallocate=no
4162cat > $TMPC << EOF
4163#include <fcntl.h>
4164
4165int main(void)
4166{
4167    fallocate(0, 0, 0, 0);
4168    return 0;
4169}
4170EOF
4171if compile_prog "" "" ; then
4172  fallocate=yes
4173fi
4174
4175# check for fallocate hole punching
4176fallocate_punch_hole=no
4177cat > $TMPC << EOF
4178#include <fcntl.h>
4179#include <linux/falloc.h>
4180
4181int main(void)
4182{
4183    fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
4184    return 0;
4185}
4186EOF
4187if compile_prog "" "" ; then
4188  fallocate_punch_hole=yes
4189fi
4190
4191# check that fallocate supports range zeroing inside the file
4192fallocate_zero_range=no
4193cat > $TMPC << EOF
4194#include <fcntl.h>
4195#include <linux/falloc.h>
4196
4197int main(void)
4198{
4199    fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0);
4200    return 0;
4201}
4202EOF
4203if compile_prog "" "" ; then
4204  fallocate_zero_range=yes
4205fi
4206
4207# check for posix_fallocate
4208posix_fallocate=no
4209cat > $TMPC << EOF
4210#include <fcntl.h>
4211
4212int main(void)
4213{
4214    posix_fallocate(0, 0, 0);
4215    return 0;
4216}
4217EOF
4218if compile_prog "" "" ; then
4219    posix_fallocate=yes
4220fi
4221
4222# check for sync_file_range
4223sync_file_range=no
4224cat > $TMPC << EOF
4225#include <fcntl.h>
4226
4227int main(void)
4228{
4229    sync_file_range(0, 0, 0, 0);
4230    return 0;
4231}
4232EOF
4233if compile_prog "" "" ; then
4234  sync_file_range=yes
4235fi
4236
4237# check for linux/fiemap.h and FS_IOC_FIEMAP
4238fiemap=no
4239cat > $TMPC << EOF
4240#include <sys/ioctl.h>
4241#include <linux/fs.h>
4242#include <linux/fiemap.h>
4243
4244int main(void)
4245{
4246    ioctl(0, FS_IOC_FIEMAP, 0);
4247    return 0;
4248}
4249EOF
4250if compile_prog "" "" ; then
4251  fiemap=yes
4252fi
4253
4254# check for dup3
4255dup3=no
4256cat > $TMPC << EOF
4257#include <unistd.h>
4258
4259int main(void)
4260{
4261    dup3(0, 0, 0);
4262    return 0;
4263}
4264EOF
4265if compile_prog "" "" ; then
4266  dup3=yes
4267fi
4268
4269# check for ppoll support
4270ppoll=no
4271cat > $TMPC << EOF
4272#include <poll.h>
4273
4274int main(void)
4275{
4276    struct pollfd pfd = { .fd = 0, .events = 0, .revents = 0 };
4277    ppoll(&pfd, 1, 0, 0);
4278    return 0;
4279}
4280EOF
4281if compile_prog "" "" ; then
4282  ppoll=yes
4283fi
4284
4285# check for prctl(PR_SET_TIMERSLACK , ... ) support
4286prctl_pr_set_timerslack=no
4287cat > $TMPC << EOF
4288#include <sys/prctl.h>
4289
4290int main(void)
4291{
4292    prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0);
4293    return 0;
4294}
4295EOF
4296if compile_prog "" "" ; then
4297  prctl_pr_set_timerslack=yes
4298fi
4299
4300# check for epoll support
4301epoll=no
4302cat > $TMPC << EOF
4303#include <sys/epoll.h>
4304
4305int main(void)
4306{
4307    epoll_create(0);
4308    return 0;
4309}
4310EOF
4311if compile_prog "" "" ; then
4312  epoll=yes
4313fi
4314
4315# epoll_create1 is a later addition
4316# so we must check separately for its presence
4317epoll_create1=no
4318cat > $TMPC << EOF
4319#include <sys/epoll.h>
4320
4321int main(void)
4322{
4323    /* Note that we use epoll_create1 as a value, not as
4324     * a function being called. This is necessary so that on
4325     * old SPARC glibc versions where the function was present in
4326     * the library but not declared in the header file we will
4327     * fail the configure check. (Otherwise we will get a compiler
4328     * warning but not an error, and will proceed to fail the
4329     * qemu compile where we compile with -Werror.)
4330     */
4331    return (int)(uintptr_t)&epoll_create1;
4332}
4333EOF
4334if compile_prog "" "" ; then
4335  epoll_create1=yes
4336fi
4337
4338# check for sendfile support
4339sendfile=no
4340cat > $TMPC << EOF
4341#include <sys/sendfile.h>
4342
4343int main(void)
4344{
4345    return sendfile(0, 0, 0, 0);
4346}
4347EOF
4348if compile_prog "" "" ; then
4349  sendfile=yes
4350fi
4351
4352# check for timerfd support (glibc 2.8 and newer)
4353timerfd=no
4354cat > $TMPC << EOF
4355#include <sys/timerfd.h>
4356
4357int main(void)
4358{
4359    return(timerfd_create(CLOCK_REALTIME, 0));
4360}
4361EOF
4362if compile_prog "" "" ; then
4363  timerfd=yes
4364fi
4365
4366# check for setns and unshare support
4367setns=no
4368cat > $TMPC << EOF
4369#include <sched.h>
4370
4371int main(void)
4372{
4373    int ret;
4374    ret = setns(0, 0);
4375    ret = unshare(0);
4376    return ret;
4377}
4378EOF
4379if compile_prog "" "" ; then
4380  setns=yes
4381fi
4382
4383# clock_adjtime probe
4384clock_adjtime=no
4385cat > $TMPC <<EOF
4386#include <time.h>
4387
4388int main(void)
4389{
4390    return clock_adjtime(0, 0);
4391}
4392EOF
4393clock_adjtime=no
4394if compile_prog "" "" ; then
4395  clock_adjtime=yes
4396fi
4397
4398# syncfs probe
4399syncfs=no
4400cat > $TMPC <<EOF
4401#include <unistd.h>
4402
4403int main(void)
4404{
4405    return syncfs(0);
4406}
4407EOF
4408syncfs=no
4409if compile_prog "" "" ; then
4410  syncfs=yes
4411fi
4412
4413# check for kcov support (kernel must be 4.4+, compiled with certain options)
4414kcov=no
4415if check_include sys/kcov.h ; then
4416    kcov=yes
4417fi
4418
4419# check for btrfs filesystem support (kernel must be 3.9+)
4420btrfs=no
4421if check_include linux/btrfs.h ; then
4422    btrfs=yes
4423fi
4424
4425# Search for bswap_32 function
4426byteswap_h=no
4427cat > $TMPC << EOF
4428#include <byteswap.h>
4429int main(void) { return bswap_32(0); }
4430EOF
4431if compile_prog "" "" ; then
4432  byteswap_h=yes
4433fi
4434
4435# Search for bswap32 function
4436bswap_h=no
4437cat > $TMPC << EOF
4438#include <sys/endian.h>
4439#include <sys/types.h>
4440#include <machine/bswap.h>
4441int main(void) { return bswap32(0); }
4442EOF
4443if compile_prog "" "" ; then
4444  bswap_h=yes
4445fi
4446
4447##########################################
4448# Do we have libiscsi >= 1.9.0
4449if test "$libiscsi" != "no" ; then
4450  if $pkg_config --atleast-version=1.9.0 libiscsi; then
4451    libiscsi="yes"
4452    libiscsi_cflags=$($pkg_config --cflags libiscsi)
4453    libiscsi_libs=$($pkg_config --libs libiscsi)
4454  else
4455    if test "$libiscsi" = "yes" ; then
4456      feature_not_found "libiscsi" "Install libiscsi >= 1.9.0"
4457    fi
4458    libiscsi="no"
4459  fi
4460fi
4461
4462##########################################
4463# Do we need librt
4464# uClibc provides 2 versions of clock_gettime(), one with realtime
4465# support and one without. This means that the clock_gettime() don't
4466# need -lrt. We still need it for timer_create() so we check for this
4467# function in addition.
4468cat > $TMPC <<EOF
4469#include <signal.h>
4470#include <time.h>
4471int main(void) {
4472  timer_create(CLOCK_REALTIME, NULL, NULL);
4473  return clock_gettime(CLOCK_REALTIME, NULL);
4474}
4475EOF
4476
4477if compile_prog "" "" ; then
4478  :
4479# we need pthread for static linking. use previous pthread test result
4480elif compile_prog "" "$pthread_lib -lrt" ; then
4481  LIBS="$LIBS -lrt"
4482fi
4483
4484# Check whether we have openpty() in either libc or libutil
4485cat > $TMPC << EOF
4486extern int openpty(int *am, int *as, char *name, void *termp, void *winp);
4487int main(void) { return openpty(0, 0, 0, 0, 0); }
4488EOF
4489
4490have_openpty="no"
4491if compile_prog "" "" ; then
4492  have_openpty="yes"
4493else
4494  if compile_prog "" "-lutil" ; then
4495    have_openpty="yes"
4496  fi
4497fi
4498
4499##########################################
4500# spice probe
4501if test "$spice" != "no" ; then
4502  cat > $TMPC << EOF
4503#include <spice.h>
4504int main(void) { spice_server_new(); return 0; }
4505EOF
4506  spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
4507  spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
4508  if $pkg_config --atleast-version=0.12.5 spice-server && \
4509     $pkg_config --atleast-version=0.12.3 spice-protocol && \
4510     compile_prog "$spice_cflags" "$spice_libs" ; then
4511    spice="yes"
4512  else
4513    if test "$spice" = "yes" ; then
4514      feature_not_found "spice" \
4515          "Install spice-server(>=0.12.5) and spice-protocol(>=0.12.3) devel"
4516    fi
4517    spice="no"
4518  fi
4519fi
4520
4521# check for smartcard support
4522if test "$smartcard" != "no"; then
4523    if $pkg_config --atleast-version=2.5.1 libcacard; then
4524        libcacard_cflags=$($pkg_config --cflags libcacard)
4525        libcacard_libs=$($pkg_config --libs libcacard)
4526        smartcard="yes"
4527    else
4528        if test "$smartcard" = "yes"; then
4529            feature_not_found "smartcard" "Install libcacard devel"
4530        fi
4531        smartcard="no"
4532    fi
4533fi
4534
4535# check for libusb
4536if test "$libusb" != "no" ; then
4537    if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
4538        libusb="yes"
4539        libusb_cflags=$($pkg_config --cflags libusb-1.0)
4540        libusb_libs=$($pkg_config --libs libusb-1.0)
4541    else
4542        if test "$libusb" = "yes"; then
4543            feature_not_found "libusb" "Install libusb devel >= 1.0.13"
4544        fi
4545        libusb="no"
4546    fi
4547fi
4548
4549# check for usbredirparser for usb network redirection support
4550if test "$usb_redir" != "no" ; then
4551    if $pkg_config --atleast-version=0.6 libusbredirparser-0.5; then
4552        usb_redir="yes"
4553        usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5)
4554        usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5)
4555    else
4556        if test "$usb_redir" = "yes"; then
4557            feature_not_found "usb-redir" "Install usbredir devel"
4558        fi
4559        usb_redir="no"
4560    fi
4561fi
4562
4563##########################################
4564# check if we have VSS SDK headers for win
4565
4566if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
4567        test "$vss_win32_sdk" != "no" ; then
4568  case "$vss_win32_sdk" in
4569    "")   vss_win32_include="-isystem $source_path" ;;
4570    *\ *) # The SDK is installed in "Program Files" by default, but we cannot
4571          # handle path with spaces. So we symlink the headers into ".sdk/vss".
4572          vss_win32_include="-isystem $source_path/.sdk/vss"
4573	  symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
4574	  ;;
4575    *)    vss_win32_include="-isystem $vss_win32_sdk"
4576  esac
4577  cat > $TMPC << EOF
4578#define __MIDL_user_allocate_free_DEFINED__
4579#include <inc/win2003/vss.h>
4580int main(void) { return VSS_CTX_BACKUP; }
4581EOF
4582  if compile_prog "$vss_win32_include" "" ; then
4583    guest_agent_with_vss="yes"
4584    QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
4585    libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
4586    qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
4587  else
4588    if test "$vss_win32_sdk" != "" ; then
4589      echo "ERROR: Please download and install Microsoft VSS SDK:"
4590      echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
4591      echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
4592      echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
4593      echo "ERROR: The headers are extracted in the directory \`inc'."
4594      feature_not_found "VSS support"
4595    fi
4596    guest_agent_with_vss="no"
4597  fi
4598fi
4599
4600##########################################
4601# lookup Windows platform SDK (if not specified)
4602# The SDK is needed only to build .tlb (type library) file of guest agent
4603# VSS provider from the source. It is usually unnecessary because the
4604# pre-compiled .tlb file is included.
4605
4606if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
4607        test "$guest_agent_with_vss" = "yes" ; then
4608  if test -z "$win_sdk"; then
4609    programfiles="$PROGRAMFILES"
4610    test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
4611    if test -n "$programfiles"; then
4612      win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
4613    else
4614      feature_not_found "Windows SDK"
4615    fi
4616  elif test "$win_sdk" = "no"; then
4617    win_sdk=""
4618  fi
4619fi
4620
4621##########################################
4622# check if mingw environment provides a recent ntddscsi.h
4623if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
4624  cat > $TMPC << EOF
4625#include <windows.h>
4626#include <ntddscsi.h>
4627int main(void) {
4628#if !defined(IOCTL_SCSI_GET_ADDRESS)
4629#error Missing required ioctl definitions
4630#endif
4631  SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
4632  return addr.Lun;
4633}
4634EOF
4635  if compile_prog "" "" ; then
4636    guest_agent_ntddscsi=yes
4637    libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
4638  fi
4639fi
4640
4641##########################################
4642# virgl renderer probe
4643
4644if test "$virglrenderer" != "no" ; then
4645  cat > $TMPC << EOF
4646#include <virglrenderer.h>
4647int main(void) { virgl_renderer_poll(); return 0; }
4648EOF
4649  virgl_cflags=$($pkg_config --cflags virglrenderer 2>/dev/null)
4650  virgl_libs=$($pkg_config --libs virglrenderer 2>/dev/null)
4651  virgl_version=$($pkg_config --modversion virglrenderer 2>/dev/null)
4652  if $pkg_config virglrenderer >/dev/null 2>&1 && \
4653     compile_prog "$virgl_cflags" "$virgl_libs" ; then
4654    virglrenderer="yes"
4655  else
4656    if test "$virglrenderer" = "yes" ; then
4657      feature_not_found "virglrenderer"
4658    fi
4659    virglrenderer="no"
4660  fi
4661fi
4662
4663##########################################
4664# capstone
4665
4666case "$capstone" in
4667  auto | enabled | internal)
4668    # Simpler to always update submodule, even if not needed.
4669    if test -e "${source_path}/.git" && test $git_update = 'yes' ; then
4670      git_submodules="${git_submodules} capstone"
4671    fi
4672    ;;
4673esac
4674
4675##########################################
4676# check if we have fdatasync
4677
4678fdatasync=no
4679cat > $TMPC << EOF
4680#include <unistd.h>
4681int main(void) {
4682#if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
4683return fdatasync(0);
4684#else
4685#error Not supported
4686#endif
4687}
4688EOF
4689if compile_prog "" "" ; then
4690    fdatasync=yes
4691fi
4692
4693##########################################
4694# check if we have madvise
4695
4696madvise=no
4697cat > $TMPC << EOF
4698#include <sys/types.h>
4699#include <sys/mman.h>
4700#include <stddef.h>
4701int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }
4702EOF
4703if compile_prog "" "" ; then
4704    madvise=yes
4705fi
4706
4707##########################################
4708# check if we have posix_madvise
4709
4710posix_madvise=no
4711cat > $TMPC << EOF
4712#include <sys/mman.h>
4713#include <stddef.h>
4714int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }
4715EOF
4716if compile_prog "" "" ; then
4717    posix_madvise=yes
4718fi
4719
4720##########################################
4721# check if we have posix_memalign()
4722
4723posix_memalign=no
4724cat > $TMPC << EOF
4725#include <stdlib.h>
4726int main(void) {
4727    void *p;
4728    return posix_memalign(&p, 8, 8);
4729}
4730EOF
4731if compile_prog "" "" ; then
4732    posix_memalign=yes
4733fi
4734
4735##########################################
4736# check if we have posix_syslog
4737
4738posix_syslog=no
4739cat > $TMPC << EOF
4740#include <syslog.h>
4741int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; }
4742EOF
4743if compile_prog "" "" ; then
4744    posix_syslog=yes
4745fi
4746
4747##########################################
4748# check if we have sem_timedwait
4749
4750sem_timedwait=no
4751cat > $TMPC << EOF
4752#include <semaphore.h>
4753int main(void) { sem_t s; struct timespec t = {0}; return sem_timedwait(&s, &t); }
4754EOF
4755if compile_prog "" "" ; then
4756    sem_timedwait=yes
4757fi
4758
4759##########################################
4760# check if we have strchrnul
4761
4762strchrnul=no
4763cat > $TMPC << EOF
4764#include <string.h>
4765int main(void);
4766// Use a haystack that the compiler shouldn't be able to constant fold
4767char *haystack = (char*)&main;
4768int main(void) { return strchrnul(haystack, 'x') != &haystack[6]; }
4769EOF
4770if compile_prog "" "" ; then
4771    strchrnul=yes
4772fi
4773
4774#########################################
4775# check if we have st_atim
4776
4777st_atim=no
4778cat > $TMPC << EOF
4779#include <sys/stat.h>
4780#include <stddef.h>
4781int main(void) { return offsetof(struct stat, st_atim); }
4782EOF
4783if compile_prog "" "" ; then
4784    st_atim=yes
4785fi
4786
4787##########################################
4788# check if trace backend exists
4789
4790$python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
4791if test "$?" -ne 0 ; then
4792  error_exit "invalid trace backends" \
4793      "Please choose supported trace backends."
4794fi
4795
4796##########################################
4797# For 'ust' backend, test if ust headers are present
4798if have_backend "ust"; then
4799  cat > $TMPC << EOF
4800#include <lttng/tracepoint.h>
4801int main(void) { return 0; }
4802EOF
4803  if compile_prog "" "-Wl,--no-as-needed -ldl" ; then
4804    if $pkg_config lttng-ust --exists; then
4805      lttng_ust_libs=$($pkg_config --libs lttng-ust)
4806    else
4807      lttng_ust_libs="-llttng-ust -ldl"
4808    fi
4809    if $pkg_config liburcu-bp --exists; then
4810      urcu_bp_libs=$($pkg_config --libs liburcu-bp)
4811    else
4812      urcu_bp_libs="-lurcu-bp"
4813    fi
4814  else
4815    error_exit "Trace backend 'ust' missing lttng-ust header files"
4816  fi
4817fi
4818
4819##########################################
4820# For 'dtrace' backend, test if 'dtrace' command is present
4821if have_backend "dtrace"; then
4822  if ! has 'dtrace' ; then
4823    error_exit "dtrace command is not found in PATH $PATH"
4824  fi
4825  trace_backend_stap="no"
4826  if has 'stap' ; then
4827    trace_backend_stap="yes"
4828  fi
4829fi
4830
4831##########################################
4832# check and set a backend for coroutine
4833
4834# We prefer ucontext, but it's not always possible. The fallback
4835# is sigcontext. On Windows the only valid backend is the Windows
4836# specific one.
4837
4838ucontext_works=no
4839if test "$darwin" != "yes"; then
4840  cat > $TMPC << EOF
4841#include <ucontext.h>
4842#ifdef __stub_makecontext
4843#error Ignoring glibc stub makecontext which will always fail
4844#endif
4845int main(void) { makecontext(0, 0, 0); return 0; }
4846EOF
4847  if compile_prog "" "" ; then
4848    ucontext_works=yes
4849  fi
4850fi
4851
4852if test "$coroutine" = ""; then
4853  if test "$mingw32" = "yes"; then
4854    coroutine=win32
4855  elif test "$ucontext_works" = "yes"; then
4856    coroutine=ucontext
4857  else
4858    coroutine=sigaltstack
4859  fi
4860else
4861  case $coroutine in
4862  windows)
4863    if test "$mingw32" != "yes"; then
4864      error_exit "'windows' coroutine backend only valid for Windows"
4865    fi
4866    # Unfortunately the user visible backend name doesn't match the
4867    # coroutine-*.c filename for this case, so we have to adjust it here.
4868    coroutine=win32
4869    ;;
4870  ucontext)
4871    if test "$ucontext_works" != "yes"; then
4872      feature_not_found "ucontext"
4873    fi
4874    ;;
4875  sigaltstack)
4876    if test "$mingw32" = "yes"; then
4877      error_exit "only the 'windows' coroutine backend is valid for Windows"
4878    fi
4879    ;;
4880  *)
4881    error_exit "unknown coroutine backend $coroutine"
4882    ;;
4883  esac
4884fi
4885
4886if test "$coroutine_pool" = ""; then
4887  coroutine_pool=yes
4888fi
4889
4890if test "$debug_stack_usage" = "yes"; then
4891  if test "$coroutine_pool" = "yes"; then
4892    echo "WARN: disabling coroutine pool for stack usage debugging"
4893    coroutine_pool=no
4894  fi
4895fi
4896
4897##################################################
4898# SafeStack
4899
4900
4901if test "$safe_stack" = "yes"; then
4902cat > $TMPC << EOF
4903int main(int argc, char *argv[])
4904{
4905#if ! __has_feature(safe_stack)
4906#error SafeStack Disabled
4907#endif
4908    return 0;
4909}
4910EOF
4911  flag="-fsanitize=safe-stack"
4912  # Check that safe-stack is supported and enabled.
4913  if compile_prog "-Werror $flag" "$flag"; then
4914    # Flag needed both at compilation and at linking
4915    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
4916    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
4917  else
4918    error_exit "SafeStack not supported by your compiler"
4919  fi
4920  if test "$coroutine" != "ucontext"; then
4921    error_exit "SafeStack is only supported by the coroutine backend ucontext"
4922  fi
4923else
4924cat > $TMPC << EOF
4925int main(int argc, char *argv[])
4926{
4927#if defined(__has_feature)
4928#if __has_feature(safe_stack)
4929#error SafeStack Enabled
4930#endif
4931#endif
4932    return 0;
4933}
4934EOF
4935if test "$safe_stack" = "no"; then
4936  # Make sure that safe-stack is disabled
4937  if ! compile_prog "-Werror" ""; then
4938    # SafeStack was already enabled, try to explicitly remove the feature
4939    flag="-fno-sanitize=safe-stack"
4940    if ! compile_prog "-Werror $flag" "$flag"; then
4941      error_exit "Configure cannot disable SafeStack"
4942    fi
4943    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
4944    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
4945  fi
4946else # "$safe_stack" = ""
4947  # Set safe_stack to yes or no based on pre-existing flags
4948  if compile_prog "-Werror" ""; then
4949    safe_stack="no"
4950  else
4951    safe_stack="yes"
4952    if test "$coroutine" != "ucontext"; then
4953      error_exit "SafeStack is only supported by the coroutine backend ucontext"
4954    fi
4955  fi
4956fi
4957fi
4958
4959##########################################
4960# check if we have open_by_handle_at
4961
4962open_by_handle_at=no
4963cat > $TMPC << EOF
4964#include <fcntl.h>
4965#if !defined(AT_EMPTY_PATH)
4966# error missing definition
4967#else
4968int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
4969#endif
4970EOF
4971if compile_prog "" "" ; then
4972    open_by_handle_at=yes
4973fi
4974
4975########################################
4976# check if we have linux/magic.h
4977
4978linux_magic_h=no
4979cat > $TMPC << EOF
4980#include <linux/magic.h>
4981int main(void) {
4982  return 0;
4983}
4984EOF
4985if compile_prog "" "" ; then
4986    linux_magic_h=yes
4987fi
4988
4989########################################
4990# check if we have valgrind/valgrind.h
4991
4992valgrind_h=no
4993cat > $TMPC << EOF
4994#include <valgrind/valgrind.h>
4995int main(void) {
4996  return 0;
4997}
4998EOF
4999if compile_prog "" "" ; then
5000    valgrind_h=yes
5001fi
5002
5003########################################
5004# check if environ is declared
5005
5006has_environ=no
5007cat > $TMPC << EOF
5008#include <unistd.h>
5009int main(void) {
5010    environ = 0;
5011    return 0;
5012}
5013EOF
5014if compile_prog "" "" ; then
5015    has_environ=yes
5016fi
5017
5018########################################
5019# check if cpuid.h is usable.
5020
5021cat > $TMPC << EOF
5022#include <cpuid.h>
5023int main(void) {
5024    unsigned a, b, c, d;
5025    int max = __get_cpuid_max(0, 0);
5026
5027    if (max >= 1) {
5028        __cpuid(1, a, b, c, d);
5029    }
5030
5031    if (max >= 7) {
5032        __cpuid_count(7, 0, a, b, c, d);
5033    }
5034
5035    return 0;
5036}
5037EOF
5038if compile_prog "" "" ; then
5039    cpuid_h=yes
5040fi
5041
5042##########################################
5043# avx2 optimization requirement check
5044#
5045# There is no point enabling this if cpuid.h is not usable,
5046# since we won't be able to select the new routines.
5047
5048if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
5049  cat > $TMPC << EOF
5050#pragma GCC push_options
5051#pragma GCC target("avx2")
5052#include <cpuid.h>
5053#include <immintrin.h>
5054static int bar(void *a) {
5055    __m256i x = *(__m256i *)a;
5056    return _mm256_testz_si256(x, x);
5057}
5058int main(int argc, char *argv[]) { return bar(argv[0]); }
5059EOF
5060  if compile_object "" ; then
5061    avx2_opt="yes"
5062  else
5063    avx2_opt="no"
5064  fi
5065fi
5066
5067##########################################
5068# avx512f optimization requirement check
5069#
5070# There is no point enabling this if cpuid.h is not usable,
5071# since we won't be able to select the new routines.
5072# by default, it is turned off.
5073# if user explicitly want to enable it, check environment
5074
5075if test "$cpuid_h" = "yes" && test "$avx512f_opt" = "yes"; then
5076  cat > $TMPC << EOF
5077#pragma GCC push_options
5078#pragma GCC target("avx512f")
5079#include <cpuid.h>
5080#include <immintrin.h>
5081static int bar(void *a) {
5082    __m512i x = *(__m512i *)a;
5083    return _mm512_test_epi64_mask(x, x);
5084}
5085int main(int argc, char *argv[])
5086{
5087	return bar(argv[0]);
5088}
5089EOF
5090  if ! compile_object "" ; then
5091    avx512f_opt="no"
5092  fi
5093else
5094  avx512f_opt="no"
5095fi
5096
5097########################################
5098# check if __[u]int128_t is usable.
5099
5100int128=no
5101cat > $TMPC << EOF
5102__int128_t a;
5103__uint128_t b;
5104int main (void) {
5105  a = a + b;
5106  b = a * b;
5107  a = a * a;
5108  return 0;
5109}
5110EOF
5111if compile_prog "" "" ; then
5112    int128=yes
5113fi
5114
5115#########################################
5116# See if 128-bit atomic operations are supported.
5117
5118atomic128=no
5119if test "$int128" = "yes"; then
5120  cat > $TMPC << EOF
5121int main(void)
5122{
5123  unsigned __int128 x = 0, y = 0;
5124  y = __atomic_load_16(&x, 0);
5125  __atomic_store_16(&x, y, 0);
5126  __atomic_compare_exchange_16(&x, &y, x, 0, 0, 0);
5127  return 0;
5128}
5129EOF
5130  if compile_prog "" "" ; then
5131    atomic128=yes
5132  fi
5133fi
5134
5135cmpxchg128=no
5136if test "$int128" = yes && test "$atomic128" = no; then
5137  cat > $TMPC << EOF
5138int main(void)
5139{
5140  unsigned __int128 x = 0, y = 0;
5141  __sync_val_compare_and_swap_16(&x, y, x);
5142  return 0;
5143}
5144EOF
5145  if compile_prog "" "" ; then
5146    cmpxchg128=yes
5147  fi
5148fi
5149
5150#########################################
5151# See if 64-bit atomic operations are supported.
5152# Note that without __atomic builtins, we can only
5153# assume atomic loads/stores max at pointer size.
5154
5155cat > $TMPC << EOF
5156#include <stdint.h>
5157int main(void)
5158{
5159  uint64_t x = 0, y = 0;
5160#ifdef __ATOMIC_RELAXED
5161  y = __atomic_load_n(&x, __ATOMIC_RELAXED);
5162  __atomic_store_n(&x, y, __ATOMIC_RELAXED);
5163  __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
5164  __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
5165  __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
5166#else
5167  typedef char is_host64[sizeof(void *) >= sizeof(uint64_t) ? 1 : -1];
5168  __sync_lock_test_and_set(&x, y);
5169  __sync_val_compare_and_swap(&x, y, 0);
5170  __sync_fetch_and_add(&x, y);
5171#endif
5172  return 0;
5173}
5174EOF
5175if compile_prog "" "" ; then
5176  atomic64=yes
5177fi
5178
5179#########################################
5180# See if --dynamic-list is supported by the linker
5181ld_dynamic_list="no"
5182if test "$static" = "no" ; then
5183    cat > $TMPTXT <<EOF
5184{
5185  foo;
5186};
5187EOF
5188
5189    cat > $TMPC <<EOF
5190#include <stdio.h>
5191void foo(void);
5192
5193void foo(void)
5194{
5195  printf("foo\n");
5196}
5197
5198int main(void)
5199{
5200  foo();
5201  return 0;
5202}
5203EOF
5204
5205    if compile_prog "" "-Wl,--dynamic-list=$TMPTXT" ; then
5206        ld_dynamic_list="yes"
5207    fi
5208fi
5209
5210#########################################
5211# See if -exported_symbols_list is supported by the linker
5212
5213ld_exported_symbols_list="no"
5214if test "$static" = "no" ; then
5215    cat > $TMPTXT <<EOF
5216  _foo
5217EOF
5218
5219    if compile_prog "" "-Wl,-exported_symbols_list,$TMPTXT" ; then
5220        ld_exported_symbols_list="yes"
5221    fi
5222fi
5223
5224if  test "$plugins" = "yes" &&
5225    test "$ld_dynamic_list" = "no" &&
5226    test "$ld_exported_symbols_list" = "no" ; then
5227  error_exit \
5228      "Plugin support requires dynamic linking and specifying a set of symbols " \
5229      "that are exported to plugins. Unfortunately your linker doesn't " \
5230      "support the flag (--dynamic-list or -exported_symbols_list) used " \
5231      "for this purpose. You can't build with --static."
5232fi
5233
5234########################################
5235# See if __attribute__((alias)) is supported.
5236# This false for Xcode 9, but has been remedied for Xcode 10.
5237# Unfortunately, travis uses Xcode 9 by default.
5238
5239attralias=no
5240cat > $TMPC << EOF
5241int x = 1;
5242extern const int y __attribute__((alias("x")));
5243int main(void) { return 0; }
5244EOF
5245if compile_prog "" "" ; then
5246    attralias=yes
5247fi
5248
5249########################################
5250# check if getauxval is available.
5251
5252getauxval=no
5253cat > $TMPC << EOF
5254#include <sys/auxv.h>
5255int main(void) {
5256  return getauxval(AT_HWCAP) == 0;
5257}
5258EOF
5259if compile_prog "" "" ; then
5260    getauxval=yes
5261fi
5262
5263########################################
5264# check if ccache is interfering with
5265# semantic analysis of macros
5266
5267unset CCACHE_CPP2
5268ccache_cpp2=no
5269cat > $TMPC << EOF
5270static const int Z = 1;
5271#define fn() ({ Z; })
5272#define TAUT(X) ((X) == Z)
5273#define PAREN(X, Y) (X == Y)
5274#define ID(X) (X)
5275int main(int argc, char *argv[])
5276{
5277    int x = 0, y = 0;
5278    x = ID(x);
5279    x = fn();
5280    fn();
5281    if (PAREN(x, y)) return 0;
5282    if (TAUT(Z)) return 0;
5283    return 0;
5284}
5285EOF
5286
5287if ! compile_object "-Werror"; then
5288    ccache_cpp2=yes
5289fi
5290
5291#################################################
5292# clang does not support glibc + FORTIFY_SOURCE.
5293
5294if test "$fortify_source" != "no"; then
5295  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
5296    fortify_source="no";
5297  elif test -n "$cxx" && has $cxx &&
5298       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
5299    fortify_source="no";
5300  else
5301    fortify_source="yes"
5302  fi
5303fi
5304
5305###############################################
5306# Check if copy_file_range is provided by glibc
5307have_copy_file_range=no
5308cat > $TMPC << EOF
5309#include <unistd.h>
5310int main(void) {
5311  copy_file_range(0, NULL, 0, NULL, 0, 0);
5312  return 0;
5313}
5314EOF
5315if compile_prog "" "" ; then
5316    have_copy_file_range=yes
5317fi
5318
5319##########################################
5320# check if struct fsxattr is available via linux/fs.h
5321
5322have_fsxattr=no
5323cat > $TMPC << EOF
5324#include <linux/fs.h>
5325struct fsxattr foo;
5326int main(void) {
5327  return 0;
5328}
5329EOF
5330if compile_prog "" "" ; then
5331    have_fsxattr=yes
5332fi
5333
5334##########################################
5335# check for usable membarrier system call
5336if test "$membarrier" = "yes"; then
5337    have_membarrier=no
5338    if test "$mingw32" = "yes" ; then
5339        have_membarrier=yes
5340    elif test "$linux" = "yes" ; then
5341        cat > $TMPC << EOF
5342    #include <linux/membarrier.h>
5343    #include <sys/syscall.h>
5344    #include <unistd.h>
5345    #include <stdlib.h>
5346    int main(void) {
5347        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
5348        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
5349	exit(0);
5350    }
5351EOF
5352        if compile_prog "" "" ; then
5353            have_membarrier=yes
5354        fi
5355    fi
5356    if test "$have_membarrier" = "no"; then
5357      feature_not_found "membarrier" "membarrier system call not available"
5358    fi
5359else
5360    # Do not enable it by default even for Mingw32, because it doesn't
5361    # work on Wine.
5362    membarrier=no
5363fi
5364
5365##########################################
5366# check if rtnetlink.h exists and is useful
5367have_rtnetlink=no
5368cat > $TMPC << EOF
5369#include <linux/rtnetlink.h>
5370int main(void) {
5371  return IFLA_PROTO_DOWN;
5372}
5373EOF
5374if compile_prog "" "" ; then
5375    have_rtnetlink=yes
5376fi
5377
5378##########################################
5379# check for usable AF_VSOCK environment
5380have_af_vsock=no
5381cat > $TMPC << EOF
5382#include <errno.h>
5383#include <sys/types.h>
5384#include <sys/socket.h>
5385#if !defined(AF_VSOCK)
5386# error missing AF_VSOCK flag
5387#endif
5388#include <linux/vm_sockets.h>
5389int main(void) {
5390    int sock, ret;
5391    struct sockaddr_vm svm;
5392    socklen_t len = sizeof(svm);
5393    sock = socket(AF_VSOCK, SOCK_STREAM, 0);
5394    ret = getpeername(sock, (struct sockaddr *)&svm, &len);
5395    if ((ret == -1) && (errno == ENOTCONN)) {
5396        return 0;
5397    }
5398    return -1;
5399}
5400EOF
5401if compile_prog "" "" ; then
5402    have_af_vsock=yes
5403fi
5404
5405##########################################
5406# check for usable AF_ALG environment
5407have_afalg=no
5408cat > $TMPC << EOF
5409#include <errno.h>
5410#include <sys/types.h>
5411#include <sys/socket.h>
5412#include <linux/if_alg.h>
5413int main(void) {
5414    int sock;
5415    sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
5416    return sock;
5417}
5418EOF
5419if compile_prog "" "" ; then
5420    have_afalg=yes
5421fi
5422if test "$crypto_afalg" = "yes"
5423then
5424    if test "$have_afalg" != "yes"
5425    then
5426	error_exit "AF_ALG requested but could not be detected"
5427    fi
5428fi
5429
5430
5431#################################################
5432# check for sysmacros.h
5433
5434have_sysmacros=no
5435cat > $TMPC << EOF
5436#include <sys/sysmacros.h>
5437int main(void) {
5438    return makedev(0, 0);
5439}
5440EOF
5441if compile_prog "" "" ; then
5442    have_sysmacros=yes
5443fi
5444
5445##########################################
5446# check for _Static_assert()
5447
5448have_static_assert=no
5449cat > $TMPC << EOF
5450_Static_assert(1, "success");
5451int main(void) {
5452    return 0;
5453}
5454EOF
5455if compile_prog "" "" ; then
5456    have_static_assert=yes
5457fi
5458
5459##########################################
5460# check for utmpx.h, it is missing e.g. on OpenBSD
5461
5462have_utmpx=no
5463cat > $TMPC << EOF
5464#include <utmpx.h>
5465struct utmpx user_info;
5466int main(void) {
5467    return 0;
5468}
5469EOF
5470if compile_prog "" "" ; then
5471    have_utmpx=yes
5472fi
5473
5474##########################################
5475# check for getrandom()
5476
5477have_getrandom=no
5478cat > $TMPC << EOF
5479#include <sys/random.h>
5480int main(void) {
5481    return getrandom(0, 0, GRND_NONBLOCK);
5482}
5483EOF
5484if compile_prog "" "" ; then
5485    have_getrandom=yes
5486fi
5487
5488##########################################
5489# checks for sanitizers
5490
5491have_asan=no
5492have_ubsan=no
5493have_asan_iface_h=no
5494have_asan_iface_fiber=no
5495
5496if test "$sanitizers" = "yes" ; then
5497  write_c_skeleton
5498  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
5499      have_asan=yes
5500  fi
5501
5502  # we could use a simple skeleton for flags checks, but this also
5503  # detect the static linking issue of ubsan, see also:
5504  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
5505  cat > $TMPC << EOF
5506#include <stdlib.h>
5507int main(void) {
5508    void *tmp = malloc(10);
5509    if (tmp != NULL) {
5510        return *(int *)(tmp + 2);
5511    }
5512    return 1;
5513}
5514EOF
5515  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
5516      have_ubsan=yes
5517  fi
5518
5519  if check_include "sanitizer/asan_interface.h" ; then
5520      have_asan_iface_h=yes
5521  fi
5522
5523  cat > $TMPC << EOF
5524#include <sanitizer/asan_interface.h>
5525int main(void) {
5526  __sanitizer_start_switch_fiber(0, 0, 0);
5527  return 0;
5528}
5529EOF
5530  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
5531      have_asan_iface_fiber=yes
5532  fi
5533fi
5534
5535##########################################
5536# checks for fuzzer
5537if test "$fuzzing" = "yes" && test -z "${LIB_FUZZING_ENGINE+xxx}"; then
5538  write_c_fuzzer_skeleton
5539  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=fuzzer" ""; then
5540    have_fuzzer=yes
5541  else
5542    error_exit "Your compiler doesn't support -fsanitize=fuzzer"
5543    exit 1
5544  fi
5545fi
5546
5547# Thread sanitizer is, for now, much noisier than the other sanitizers;
5548# keep it separate until that is not the case.
5549if test "$tsan" = "yes" && test "$sanitizers" = "yes"; then
5550  error_exit "TSAN is not supported with other sanitiziers."
5551fi
5552have_tsan=no
5553have_tsan_iface_fiber=no
5554if test "$tsan" = "yes" ; then
5555  write_c_skeleton
5556  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
5557      have_tsan=yes
5558  fi
5559  cat > $TMPC << EOF
5560#include <sanitizer/tsan_interface.h>
5561int main(void) {
5562  __tsan_create_fiber(0);
5563  return 0;
5564}
5565EOF
5566  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
5567      have_tsan_iface_fiber=yes
5568  fi
5569fi
5570
5571##########################################
5572# check for libpmem
5573
5574if test "$libpmem" != "no"; then
5575	if $pkg_config --exists "libpmem"; then
5576		libpmem="yes"
5577		libpmem_libs=$($pkg_config --libs libpmem)
5578		libpmem_cflags=$($pkg_config --cflags libpmem)
5579	else
5580		if test "$libpmem" = "yes" ; then
5581			feature_not_found "libpmem" "Install nvml or pmdk"
5582		fi
5583		libpmem="no"
5584	fi
5585fi
5586
5587##########################################
5588# check for libdaxctl
5589
5590if test "$libdaxctl" != "no"; then
5591	if $pkg_config --atleast-version=57 "libdaxctl"; then
5592		libdaxctl="yes"
5593		libdaxctl_libs=$($pkg_config --libs libdaxctl)
5594		libdaxctl_cflags=$($pkg_config --cflags libdaxctl)
5595	else
5596		if test "$libdaxctl" = "yes" ; then
5597			feature_not_found "libdaxctl" "Install libdaxctl"
5598		fi
5599		libdaxctl="no"
5600	fi
5601fi
5602
5603##########################################
5604# check for slirp
5605
5606case "$slirp" in
5607  auto | enabled | internal)
5608    # Simpler to always update submodule, even if not needed.
5609    if test -e "${source_path}/.git" && test $git_update = 'yes' ; then
5610      git_submodules="${git_submodules} slirp"
5611    fi
5612    ;;
5613esac
5614
5615##########################################
5616# check for usable __NR_keyctl syscall
5617
5618if test "$linux" = "yes" ; then
5619
5620    have_keyring=no
5621    cat > $TMPC << EOF
5622#include <errno.h>
5623#include <asm/unistd.h>
5624#include <linux/keyctl.h>
5625#include <unistd.h>
5626int main(void) {
5627    return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
5628}
5629EOF
5630    if compile_prog "" "" ; then
5631        have_keyring=yes
5632    fi
5633fi
5634if test "$secret_keyring" != "no"
5635then
5636    if test "$have_keyring" = "yes"
5637    then
5638	secret_keyring=yes
5639    else
5640	if test "$secret_keyring" = "yes"
5641	then
5642	    error_exit "syscall __NR_keyctl requested, \
5643but not implemented on your system"
5644	else
5645	    secret_keyring=no
5646	fi
5647    fi
5648fi
5649
5650##########################################
5651# End of CC checks
5652# After here, no more $cc or $ld runs
5653
5654write_c_skeleton
5655
5656if test "$gcov" = "yes" ; then
5657  :
5658elif test "$fortify_source" = "yes" ; then
5659  QEMU_CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $QEMU_CFLAGS"
5660  debug=no
5661fi
5662
5663case "$ARCH" in
5664alpha)
5665  # Ensure there's only a single GP
5666  QEMU_CFLAGS="-msmall-data $QEMU_CFLAGS"
5667;;
5668esac
5669
5670if test "$gprof" = "yes" ; then
5671  QEMU_CFLAGS="-p $QEMU_CFLAGS"
5672  QEMU_LDFLAGS="-p $QEMU_LDFLAGS"
5673fi
5674
5675if test "$have_asan" = "yes"; then
5676  QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
5677  QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
5678  if test "$have_asan_iface_h" = "no" ; then
5679      echo "ASAN build enabled, but ASAN header missing." \
5680           "Without code annotation, the report may be inferior."
5681  elif test "$have_asan_iface_fiber" = "no" ; then
5682      echo "ASAN build enabled, but ASAN header is too old." \
5683           "Without code annotation, the report may be inferior."
5684  fi
5685fi
5686if test "$have_tsan" = "yes" ; then
5687  if test "$have_tsan_iface_fiber" = "yes" ; then
5688    QEMU_CFLAGS="-fsanitize=thread $QEMU_CFLAGS"
5689    QEMU_LDFLAGS="-fsanitize=thread $QEMU_LDFLAGS"
5690  else
5691    error_exit "Cannot enable TSAN due to missing fiber annotation interface."
5692  fi
5693elif test "$tsan" = "yes" ; then
5694  error_exit "Cannot enable TSAN due to missing sanitize thread interface."
5695fi
5696if test "$have_ubsan" = "yes"; then
5697  QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS"
5698  QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
5699fi
5700
5701##########################################
5702# Do we have libnfs
5703if test "$libnfs" != "no" ; then
5704  if $pkg_config --atleast-version=1.9.3 libnfs; then
5705    libnfs="yes"
5706    libnfs_libs=$($pkg_config --libs libnfs)
5707  else
5708    if test "$libnfs" = "yes" ; then
5709      feature_not_found "libnfs" "Install libnfs devel >= 1.9.3"
5710    fi
5711    libnfs="no"
5712  fi
5713fi
5714
5715##########################################
5716
5717# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
5718if test "$solaris" = "no" && test "$tsan" = "no"; then
5719    if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
5720        QEMU_LDFLAGS="-Wl,--warn-common $QEMU_LDFLAGS"
5721    fi
5722fi
5723
5724# Use ASLR, no-SEH and DEP if available
5725if test "$mingw32" = "yes" ; then
5726    flags="--no-seh --nxcompat"
5727
5728    # Disable ASLR for debug builds to allow debugging with gdb
5729    if test "$debug" = "no" ; then
5730        flags="--dynamicbase $flags"
5731    fi
5732
5733    for flag in $flags; do
5734        if ld_has $flag ; then
5735            QEMU_LDFLAGS="-Wl,$flag $QEMU_LDFLAGS"
5736        fi
5737    done
5738fi
5739
5740# We can only support ivshmem if we have eventfd
5741if [ "$eventfd" = "yes" ]; then
5742  ivshmem=yes
5743fi
5744
5745if test "$softmmu" = yes ; then
5746  if test "$linux" = yes; then
5747    if test "$virtfs" != no && test "$cap_ng" = yes && test "$attr" = yes ; then
5748      virtfs=yes
5749    else
5750      if test "$virtfs" = yes; then
5751        error_exit "VirtFS requires libcap-ng devel and libattr devel"
5752      fi
5753      virtfs=no
5754    fi
5755  else
5756    if test "$virtfs" = yes; then
5757      error_exit "VirtFS is supported only on Linux"
5758    fi
5759    virtfs=no
5760  fi
5761fi
5762
5763# Probe for guest agent support/options
5764
5765if [ "$guest_agent" != "no" ]; then
5766  if [ "$softmmu" = no -a "$want_tools" = no ] ; then
5767      guest_agent=no
5768  elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
5769      guest_agent=yes
5770  elif [ "$guest_agent" != yes ]; then
5771      guest_agent=no
5772  else
5773      error_exit "Guest agent is not supported on this platform"
5774  fi
5775fi
5776
5777# Guest agent Window MSI  package
5778
5779if test "$guest_agent" != yes; then
5780  if test "$guest_agent_msi" = yes; then
5781    error_exit "MSI guest agent package requires guest agent enabled"
5782  fi
5783  guest_agent_msi=no
5784elif test "$mingw32" != "yes"; then
5785  if test "$guest_agent_msi" = "yes"; then
5786    error_exit "MSI guest agent package is available only for MinGW Windows cross-compilation"
5787  fi
5788  guest_agent_msi=no
5789elif ! has wixl; then
5790  if test "$guest_agent_msi" = "yes"; then
5791    error_exit "MSI guest agent package requires wixl tool installed ( usually from msitools package )"
5792  fi
5793  guest_agent_msi=no
5794else
5795  # we support qemu-ga, mingw32, and wixl: default to MSI enabled if it wasn't
5796  # disabled explicitly
5797  if test "$guest_agent_msi" != "no"; then
5798    guest_agent_msi=yes
5799  fi
5800fi
5801
5802if test "$guest_agent_msi" = "yes"; then
5803  if test "$guest_agent_with_vss" = "yes"; then
5804    QEMU_GA_MSI_WITH_VSS="-D InstallVss"
5805  fi
5806
5807  if test "$QEMU_GA_MANUFACTURER" = ""; then
5808    QEMU_GA_MANUFACTURER=QEMU
5809  fi
5810
5811  if test "$QEMU_GA_DISTRO" = ""; then
5812    QEMU_GA_DISTRO=Linux
5813  fi
5814
5815  if test "$QEMU_GA_VERSION" = ""; then
5816      QEMU_GA_VERSION=$(cat $source_path/VERSION)
5817  fi
5818
5819  QEMU_GA_MSI_MINGW_DLL_PATH="-D Mingw_dlls=$($pkg_config --variable=prefix glib-2.0)/bin"
5820
5821  case "$cpu" in
5822  x86_64)
5823    QEMU_GA_MSI_ARCH="-a x64 -D Arch=64"
5824    ;;
5825  i386)
5826    QEMU_GA_MSI_ARCH="-D Arch=32"
5827    ;;
5828  *)
5829    error_exit "CPU $cpu not supported for building installation package"
5830    ;;
5831  esac
5832fi
5833
5834# Mac OS X ships with a broken assembler
5835roms=
5836if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
5837        test "$targetos" != "Darwin" && test "$targetos" != "SunOS" && \
5838        test "$softmmu" = yes ; then
5839    # Different host OS linkers have different ideas about the name of the ELF
5840    # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
5841    # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
5842    for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
5843        if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
5844            ld_i386_emulation="$emu"
5845            roms="optionrom"
5846            break
5847        fi
5848    done
5849fi
5850
5851# Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
5852if test "$cpu" = "s390x" ; then
5853  write_c_skeleton
5854  if compile_prog "-march=z900" ""; then
5855    roms="$roms s390-ccw"
5856    # SLOF is required for building the s390-ccw firmware on s390x,
5857    # since it is using the libnet code from SLOF for network booting.
5858    if test -e "${source_path}/.git" ; then
5859      git_submodules="${git_submodules} roms/SLOF"
5860    fi
5861  fi
5862fi
5863
5864# Check that the C++ compiler exists and works with the C compiler.
5865# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
5866if has $cxx; then
5867    cat > $TMPC <<EOF
5868int c_function(void);
5869int main(void) { return c_function(); }
5870EOF
5871
5872    compile_object
5873
5874    cat > $TMPCXX <<EOF
5875extern "C" {
5876   int c_function(void);
5877}
5878int c_function(void) { return 42; }
5879EOF
5880
5881    update_cxxflags
5882
5883    if do_cxx $CXXFLAGS $CONFIGURE_CXXFLAGS $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
5884        # C++ compiler $cxx works ok with C compiler $cc
5885        :
5886    else
5887        echo "C++ compiler $cxx does not work with C compiler $cc"
5888        echo "Disabling C++ specific optional code"
5889        cxx=
5890    fi
5891else
5892    echo "No C++ compiler available; disabling C++ specific optional code"
5893    cxx=
5894fi
5895
5896if test $git_update = 'yes' ; then
5897    (cd "${source_path}" && GIT="$git" "./scripts/git-submodule.sh" update "$git_submodules")
5898fi
5899
5900config_host_mak="config-host.mak"
5901
5902echo "# Automatically generated by configure - do not modify" > $config_host_mak
5903echo >> $config_host_mak
5904
5905echo all: >> $config_host_mak
5906echo "GIT=$git" >> $config_host_mak
5907echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
5908echo "GIT_UPDATE=$git_update" >> $config_host_mak
5909
5910echo "ARCH=$ARCH" >> $config_host_mak
5911
5912if test "$default_devices" = "yes" ; then
5913  echo "CONFIG_MINIKCONF_MODE=--defconfig" >> $config_host_mak
5914else
5915  echo "CONFIG_MINIKCONF_MODE=--allnoconfig" >> $config_host_mak
5916fi
5917if test "$debug_tcg" = "yes" ; then
5918  echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
5919fi
5920if test "$strip_opt" = "yes" ; then
5921  echo "STRIP=${strip}" >> $config_host_mak
5922fi
5923if test "$bigendian" = "yes" ; then
5924  echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
5925fi
5926if test "$mingw32" = "yes" ; then
5927  echo "CONFIG_WIN32=y" >> $config_host_mak
5928  rc_version=$(cat $source_path/VERSION)
5929  version_major=${rc_version%%.*}
5930  rc_version=${rc_version#*.}
5931  version_minor=${rc_version%%.*}
5932  rc_version=${rc_version#*.}
5933  version_subminor=${rc_version%%.*}
5934  version_micro=0
5935  echo "CONFIG_FILEVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
5936  echo "CONFIG_PRODUCTVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
5937  if test "$guest_agent_with_vss" = "yes" ; then
5938    echo "CONFIG_QGA_VSS=y" >> $config_host_mak
5939    echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
5940    echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
5941  fi
5942  if test "$guest_agent_ntddscsi" = "yes" ; then
5943    echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
5944  fi
5945  if test "$guest_agent_msi" = "yes"; then
5946    echo "CONFIG_QGA_MSI=y" >> $config_host_mak
5947    echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
5948    echo "QEMU_GA_MSI_WITH_VSS=${QEMU_GA_MSI_WITH_VSS}" >> $config_host_mak
5949    echo "QEMU_GA_MSI_ARCH=${QEMU_GA_MSI_ARCH}" >> $config_host_mak
5950    echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
5951    echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
5952    echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
5953  fi
5954else
5955  echo "CONFIG_POSIX=y" >> $config_host_mak
5956fi
5957
5958if test "$linux" = "yes" ; then
5959  echo "CONFIG_LINUX=y" >> $config_host_mak
5960fi
5961
5962if test "$darwin" = "yes" ; then
5963  echo "CONFIG_DARWIN=y" >> $config_host_mak
5964fi
5965
5966if test "$solaris" = "yes" ; then
5967  echo "CONFIG_SOLARIS=y" >> $config_host_mak
5968fi
5969if test "$haiku" = "yes" ; then
5970  echo "CONFIG_HAIKU=y" >> $config_host_mak
5971fi
5972if test "$static" = "yes" ; then
5973  echo "CONFIG_STATIC=y" >> $config_host_mak
5974fi
5975if test "$profiler" = "yes" ; then
5976  echo "CONFIG_PROFILER=y" >> $config_host_mak
5977fi
5978if test "$want_tools" = "yes" ; then
5979  echo "CONFIG_TOOLS=y" >> $config_host_mak
5980fi
5981if test "$guest_agent" = "yes" ; then
5982  echo "CONFIG_GUEST_AGENT=y" >> $config_host_mak
5983fi
5984echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
5985if test "$vde" = "yes" ; then
5986  echo "CONFIG_VDE=y" >> $config_host_mak
5987  echo "VDE_LIBS=$vde_libs" >> $config_host_mak
5988fi
5989if test "$netmap" = "yes" ; then
5990  echo "CONFIG_NETMAP=y" >> $config_host_mak
5991fi
5992if test "$l2tpv3" = "yes" ; then
5993  echo "CONFIG_L2TPV3=y" >> $config_host_mak
5994fi
5995if test "$gprof" = "yes" ; then
5996  echo "CONFIG_GPROF=y" >> $config_host_mak
5997fi
5998if test "$cap_ng" = "yes" ; then
5999  echo "CONFIG_LIBCAP_NG=y" >> $config_host_mak
6000  echo "LIBCAP_NG_LIBS=$cap_libs" >> $config_host_mak
6001fi
6002echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
6003for drv in $audio_drv_list; do
6004    def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
6005    echo "$def=y" >> $config_host_mak
6006done
6007if test "$alsa" = "yes" ; then
6008    echo "CONFIG_ALSA=y" >> $config_host_mak
6009fi
6010echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak
6011echo "ALSA_CFLAGS=$alsa_cflags" >> $config_host_mak
6012if test "$libpulse" = "yes" ; then
6013    echo "CONFIG_LIBPULSE=y" >> $config_host_mak
6014fi
6015echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
6016echo "PULSE_CFLAGS=$pulse_cflags" >> $config_host_mak
6017echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak
6018echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak
6019echo "OSS_LIBS=$oss_libs" >> $config_host_mak
6020if test "$libjack" = "yes" ; then
6021    echo "CONFIG_LIBJACK=y" >> $config_host_mak
6022fi
6023echo "JACK_LIBS=$jack_libs" >> $config_host_mak
6024if test "$audio_win_int" = "yes" ; then
6025  echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
6026fi
6027echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
6028echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
6029if test "$xfs" = "yes" ; then
6030  echo "CONFIG_XFS=y" >> $config_host_mak
6031fi
6032qemu_version=$(head $source_path/VERSION)
6033echo "PKGVERSION=$pkgversion" >>$config_host_mak
6034echo "SRC_PATH=$source_path" >> $config_host_mak
6035echo "TARGET_DIRS=$target_list" >> $config_host_mak
6036if test "$modules" = "yes"; then
6037  # $shacmd can generate a hash started with digit, which the compiler doesn't
6038  # like as an symbol. So prefix it with an underscore
6039  echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
6040  echo "CONFIG_MODULES=y" >> $config_host_mak
6041fi
6042if test "$module_upgrades" = "yes"; then
6043  echo "CONFIG_MODULE_UPGRADES=y" >> $config_host_mak
6044fi
6045if test "$have_x11" = "yes" && test "$need_x11" = "yes"; then
6046  echo "CONFIG_X11=y" >> $config_host_mak
6047  echo "X11_CFLAGS=$x11_cflags" >> $config_host_mak
6048  echo "X11_LIBS=$x11_libs" >> $config_host_mak
6049fi
6050if test "$pipe2" = "yes" ; then
6051  echo "CONFIG_PIPE2=y" >> $config_host_mak
6052fi
6053if test "$accept4" = "yes" ; then
6054  echo "CONFIG_ACCEPT4=y" >> $config_host_mak
6055fi
6056if test "$splice" = "yes" ; then
6057  echo "CONFIG_SPLICE=y" >> $config_host_mak
6058fi
6059if test "$eventfd" = "yes" ; then
6060  echo "CONFIG_EVENTFD=y" >> $config_host_mak
6061fi
6062if test "$memfd" = "yes" ; then
6063  echo "CONFIG_MEMFD=y" >> $config_host_mak
6064fi
6065if test "$have_usbfs" = "yes" ; then
6066  echo "CONFIG_USBFS=y" >> $config_host_mak
6067fi
6068if test "$fallocate" = "yes" ; then
6069  echo "CONFIG_FALLOCATE=y" >> $config_host_mak
6070fi
6071if test "$fallocate_punch_hole" = "yes" ; then
6072  echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
6073fi
6074if test "$fallocate_zero_range" = "yes" ; then
6075  echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak
6076fi
6077if test "$posix_fallocate" = "yes" ; then
6078  echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
6079fi
6080if test "$sync_file_range" = "yes" ; then
6081  echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
6082fi
6083if test "$fiemap" = "yes" ; then
6084  echo "CONFIG_FIEMAP=y" >> $config_host_mak
6085fi
6086if test "$dup3" = "yes" ; then
6087  echo "CONFIG_DUP3=y" >> $config_host_mak
6088fi
6089if test "$ppoll" = "yes" ; then
6090  echo "CONFIG_PPOLL=y" >> $config_host_mak
6091fi
6092if test "$prctl_pr_set_timerslack" = "yes" ; then
6093  echo "CONFIG_PRCTL_PR_SET_TIMERSLACK=y" >> $config_host_mak
6094fi
6095if test "$epoll" = "yes" ; then
6096  echo "CONFIG_EPOLL=y" >> $config_host_mak
6097fi
6098if test "$epoll_create1" = "yes" ; then
6099  echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
6100fi
6101if test "$sendfile" = "yes" ; then
6102  echo "CONFIG_SENDFILE=y" >> $config_host_mak
6103fi
6104if test "$timerfd" = "yes" ; then
6105  echo "CONFIG_TIMERFD=y" >> $config_host_mak
6106fi
6107if test "$setns" = "yes" ; then
6108  echo "CONFIG_SETNS=y" >> $config_host_mak
6109fi
6110if test "$clock_adjtime" = "yes" ; then
6111  echo "CONFIG_CLOCK_ADJTIME=y" >> $config_host_mak
6112fi
6113if test "$syncfs" = "yes" ; then
6114  echo "CONFIG_SYNCFS=y" >> $config_host_mak
6115fi
6116if test "$kcov" = "yes" ; then
6117  echo "CONFIG_KCOV=y" >> $config_host_mak
6118fi
6119if test "$btrfs" = "yes" ; then
6120  echo "CONFIG_BTRFS=y" >> $config_host_mak
6121fi
6122if test "$inotify" = "yes" ; then
6123  echo "CONFIG_INOTIFY=y" >> $config_host_mak
6124fi
6125if test "$inotify1" = "yes" ; then
6126  echo "CONFIG_INOTIFY1=y" >> $config_host_mak
6127fi
6128if test "$sem_timedwait" = "yes" ; then
6129  echo "CONFIG_SEM_TIMEDWAIT=y" >> $config_host_mak
6130fi
6131if test "$strchrnul" = "yes" ; then
6132  echo "HAVE_STRCHRNUL=y" >> $config_host_mak
6133fi
6134if test "$st_atim" = "yes" ; then
6135  echo "HAVE_STRUCT_STAT_ST_ATIM=y" >> $config_host_mak
6136fi
6137if test "$byteswap_h" = "yes" ; then
6138  echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
6139fi
6140if test "$bswap_h" = "yes" ; then
6141  echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
6142fi
6143if test "$curl" = "yes" ; then
6144  echo "CONFIG_CURL=y" >> $config_host_mak
6145  echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak
6146  echo "CURL_LIBS=$curl_libs" >> $config_host_mak
6147fi
6148if test "$brlapi" = "yes" ; then
6149  echo "CONFIG_BRLAPI=y" >> $config_host_mak
6150  echo "BRLAPI_LIBS=$brlapi_libs" >> $config_host_mak
6151fi
6152if test "$gtk" = "yes" ; then
6153  echo "CONFIG_GTK=y" >> $config_host_mak
6154  echo "GTK_CFLAGS=$gtk_cflags" >> $config_host_mak
6155  echo "GTK_LIBS=$gtk_libs" >> $config_host_mak
6156  if test "$gtk_gl" = "yes" ; then
6157    echo "CONFIG_GTK_GL=y" >> $config_host_mak
6158  fi
6159fi
6160if test "$gio" = "yes" ; then
6161    echo "CONFIG_GIO=y" >> $config_host_mak
6162    echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
6163    echo "GIO_LIBS=$gio_libs" >> $config_host_mak
6164    echo "GDBUS_CODEGEN=$gdbus_codegen" >> $config_host_mak
6165fi
6166echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
6167if test "$gnutls" = "yes" ; then
6168  echo "CONFIG_GNUTLS=y" >> $config_host_mak
6169  echo "GNUTLS_CFLAGS=$gnutls_cflags" >> $config_host_mak
6170  echo "GNUTLS_LIBS=$gnutls_libs" >> $config_host_mak
6171fi
6172if test "$gcrypt" = "yes" ; then
6173  echo "CONFIG_GCRYPT=y" >> $config_host_mak
6174  if test "$gcrypt_hmac" = "yes" ; then
6175    echo "CONFIG_GCRYPT_HMAC=y" >> $config_host_mak
6176  fi
6177  echo "GCRYPT_CFLAGS=$gcrypt_cflags" >> $config_host_mak
6178  echo "GCRYPT_LIBS=$gcrypt_libs" >> $config_host_mak
6179fi
6180if test "$nettle" = "yes" ; then
6181  echo "CONFIG_NETTLE=y" >> $config_host_mak
6182  echo "CONFIG_NETTLE_VERSION_MAJOR=${nettle_version%%.*}" >> $config_host_mak
6183  echo "NETTLE_CFLAGS=$nettle_cflags" >> $config_host_mak
6184  echo "NETTLE_LIBS=$nettle_libs" >> $config_host_mak
6185fi
6186if test "$qemu_private_xts" = "yes" ; then
6187  echo "CONFIG_QEMU_PRIVATE_XTS=y" >> $config_host_mak
6188fi
6189if test "$tasn1" = "yes" ; then
6190  echo "CONFIG_TASN1=y" >> $config_host_mak
6191fi
6192if test "$auth_pam" = "yes" ; then
6193    echo "CONFIG_AUTH_PAM=y" >> $config_host_mak
6194fi
6195if test "$have_ifaddrs_h" = "yes" ; then
6196    echo "HAVE_IFADDRS_H=y" >> $config_host_mak
6197fi
6198if test "$have_drm_h" = "yes" ; then
6199  echo "HAVE_DRM_H=y" >> $config_host_mak
6200fi
6201if test "$have_broken_size_max" = "yes" ; then
6202    echo "HAVE_BROKEN_SIZE_MAX=y" >> $config_host_mak
6203fi
6204if test "$have_openpty" = "yes" ; then
6205    echo "HAVE_OPENPTY=y" >> $config_host_mak
6206fi
6207if test "$have_sys_signal_h" = "yes" ; then
6208    echo "HAVE_SYS_SIGNAL_H=y" >> $config_host_mak
6209fi
6210
6211# Work around a system header bug with some kernel/XFS header
6212# versions where they both try to define 'struct fsxattr':
6213# xfs headers will not try to redefine structs from linux headers
6214# if this macro is set.
6215if test "$have_fsxattr" = "yes" ; then
6216    echo "HAVE_FSXATTR=y" >> $config_host_mak
6217fi
6218if test "$have_copy_file_range" = "yes" ; then
6219    echo "HAVE_COPY_FILE_RANGE=y" >> $config_host_mak
6220fi
6221if test "$vte" = "yes" ; then
6222  echo "CONFIG_VTE=y" >> $config_host_mak
6223  echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak
6224  echo "VTE_LIBS=$vte_libs" >> $config_host_mak
6225fi
6226if test "$virglrenderer" = "yes" ; then
6227  echo "CONFIG_VIRGL=y" >> $config_host_mak
6228  echo "VIRGL_CFLAGS=$virgl_cflags" >> $config_host_mak
6229  echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak
6230fi
6231if test "$xen" = "enabled" ; then
6232  echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
6233  echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
6234  echo "XEN_CFLAGS=$xen_cflags" >> $config_host_mak
6235  echo "XEN_LIBS=$xen_libs" >> $config_host_mak
6236fi
6237if test "$linux_aio" = "yes" ; then
6238  echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
6239fi
6240if test "$linux_io_uring" = "yes" ; then
6241  echo "CONFIG_LINUX_IO_URING=y" >> $config_host_mak
6242  echo "LINUX_IO_URING_CFLAGS=$linux_io_uring_cflags" >> $config_host_mak
6243  echo "LINUX_IO_URING_LIBS=$linux_io_uring_libs" >> $config_host_mak
6244fi
6245if test "$attr" = "yes" ; then
6246  echo "CONFIG_ATTR=y" >> $config_host_mak
6247  echo "LIBATTR_LIBS=$libattr_libs" >> $config_host_mak
6248fi
6249if test "$libattr" = "yes" ; then
6250  echo "CONFIG_LIBATTR=y" >> $config_host_mak
6251fi
6252if test "$virtfs" = "yes" ; then
6253  echo "CONFIG_VIRTFS=y" >> $config_host_mak
6254fi
6255if test "$vhost_scsi" = "yes" ; then
6256  echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
6257fi
6258if test "$vhost_net" = "yes" ; then
6259  echo "CONFIG_VHOST_NET=y" >> $config_host_mak
6260fi
6261if test "$vhost_net_user" = "yes" ; then
6262  echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
6263fi
6264if test "$vhost_net_vdpa" = "yes" ; then
6265  echo "CONFIG_VHOST_NET_VDPA=y" >> $config_host_mak
6266fi
6267if test "$vhost_crypto" = "yes" ; then
6268  echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
6269fi
6270if test "$vhost_vsock" = "yes" ; then
6271  echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
6272  if test "$vhost_user" = "yes" ; then
6273    echo "CONFIG_VHOST_USER_VSOCK=y" >> $config_host_mak
6274  fi
6275fi
6276if test "$vhost_kernel" = "yes" ; then
6277  echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
6278fi
6279if test "$vhost_user" = "yes" ; then
6280  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
6281fi
6282if test "$vhost_vdpa" = "yes" ; then
6283  echo "CONFIG_VHOST_VDPA=y" >> $config_host_mak
6284fi
6285if test "$vhost_user_fs" = "yes" ; then
6286  echo "CONFIG_VHOST_USER_FS=y" >> $config_host_mak
6287fi
6288if test "$iovec" = "yes" ; then
6289  echo "CONFIG_IOVEC=y" >> $config_host_mak
6290fi
6291if test "$preadv" = "yes" ; then
6292  echo "CONFIG_PREADV=y" >> $config_host_mak
6293fi
6294if test "$membarrier" = "yes" ; then
6295  echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
6296fi
6297if test "$signalfd" = "yes" ; then
6298  echo "CONFIG_SIGNALFD=y" >> $config_host_mak
6299fi
6300if test "$optreset" = "yes" ; then
6301  echo "HAVE_OPTRESET=y" >> $config_host_mak
6302fi
6303if test "$tcg" = "enabled"; then
6304  if test "$tcg_interpreter" = "yes" ; then
6305    echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
6306  fi
6307fi
6308if test "$fdatasync" = "yes" ; then
6309  echo "CONFIG_FDATASYNC=y" >> $config_host_mak
6310fi
6311if test "$madvise" = "yes" ; then
6312  echo "CONFIG_MADVISE=y" >> $config_host_mak
6313fi
6314if test "$posix_madvise" = "yes" ; then
6315  echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak
6316fi
6317if test "$posix_memalign" = "yes" ; then
6318  echo "CONFIG_POSIX_MEMALIGN=y" >> $config_host_mak
6319fi
6320if test "$spice" = "yes" ; then
6321  echo "CONFIG_SPICE=y" >> $config_host_mak
6322  echo "SPICE_CFLAGS=$spice_cflags" >> $config_host_mak
6323  echo "SPICE_LIBS=$spice_libs" >> $config_host_mak
6324fi
6325
6326if test "$smartcard" = "yes" ; then
6327  echo "CONFIG_SMARTCARD=y" >> $config_host_mak
6328  echo "SMARTCARD_CFLAGS=$libcacard_cflags" >> $config_host_mak
6329  echo "SMARTCARD_LIBS=$libcacard_libs" >> $config_host_mak
6330fi
6331
6332if test "$libusb" = "yes" ; then
6333  echo "CONFIG_USB_LIBUSB=y" >> $config_host_mak
6334  echo "LIBUSB_CFLAGS=$libusb_cflags" >> $config_host_mak
6335  echo "LIBUSB_LIBS=$libusb_libs" >> $config_host_mak
6336fi
6337
6338if test "$usb_redir" = "yes" ; then
6339  echo "CONFIG_USB_REDIR=y" >> $config_host_mak
6340  echo "USB_REDIR_CFLAGS=$usb_redir_cflags" >> $config_host_mak
6341  echo "USB_REDIR_LIBS=$usb_redir_libs" >> $config_host_mak
6342fi
6343
6344if test "$opengl" = "yes" ; then
6345  echo "CONFIG_OPENGL=y" >> $config_host_mak
6346  echo "OPENGL_CFLAGS=$opengl_cflags" >> $config_host_mak
6347  echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
6348  if test "$opengl_dmabuf" = "yes" ; then
6349    echo "CONFIG_OPENGL_DMABUF=y" >> $config_host_mak
6350  fi
6351fi
6352
6353if test "$gbm" = "yes" ; then
6354    echo "CONFIG_GBM=y" >> $config_host_mak
6355    echo "GBM_LIBS=$gbm_libs" >> $config_host_mak
6356    echo "GBM_CFLAGS=$gbm_cflags" >> $config_host_mak
6357fi
6358
6359
6360if test "$avx2_opt" = "yes" ; then
6361  echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
6362fi
6363
6364if test "$avx512f_opt" = "yes" ; then
6365  echo "CONFIG_AVX512F_OPT=y" >> $config_host_mak
6366fi
6367
6368if test "$lzo" = "yes" ; then
6369  echo "CONFIG_LZO=y" >> $config_host_mak
6370  echo "LZO_LIBS=$lzo_libs" >> $config_host_mak
6371fi
6372
6373if test "$snappy" = "yes" ; then
6374  echo "CONFIG_SNAPPY=y" >> $config_host_mak
6375  echo "SNAPPY_LIBS=$snappy_libs" >> $config_host_mak
6376fi
6377
6378if test "$bzip2" = "yes" ; then
6379  echo "CONFIG_BZIP2=y" >> $config_host_mak
6380  echo "BZIP2_LIBS=-lbz2" >> $config_host_mak
6381fi
6382
6383if test "$lzfse" = "yes" ; then
6384  echo "CONFIG_LZFSE=y" >> $config_host_mak
6385  echo "LZFSE_LIBS=-llzfse" >> $config_host_mak
6386fi
6387
6388if test "$zstd" = "yes" ; then
6389  echo "CONFIG_ZSTD=y" >> $config_host_mak
6390  echo "ZSTD_CFLAGS=$zstd_cflags" >> $config_host_mak
6391  echo "ZSTD_LIBS=$zstd_libs" >> $config_host_mak
6392fi
6393
6394if test "$libiscsi" = "yes" ; then
6395  echo "CONFIG_LIBISCSI=y" >> $config_host_mak
6396  echo "LIBISCSI_CFLAGS=$libiscsi_cflags" >> $config_host_mak
6397  echo "LIBISCSI_LIBS=$libiscsi_libs" >> $config_host_mak
6398fi
6399
6400if test "$libnfs" = "yes" ; then
6401  echo "CONFIG_LIBNFS=y" >> $config_host_mak
6402  echo "LIBNFS_LIBS=$libnfs_libs" >> $config_host_mak
6403fi
6404
6405if test "$seccomp" = "yes"; then
6406  echo "CONFIG_SECCOMP=y" >> $config_host_mak
6407  echo "SECCOMP_CFLAGS=$seccomp_cflags" >> $config_host_mak
6408  echo "SECCOMP_LIBS=$seccomp_libs" >> $config_host_mak
6409fi
6410
6411# XXX: suppress that
6412if [ "$bsd" = "yes" ] ; then
6413  echo "CONFIG_BSD=y" >> $config_host_mak
6414fi
6415
6416if test "$qom_cast_debug" = "yes" ; then
6417  echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
6418fi
6419if test "$rbd" = "yes" ; then
6420  echo "CONFIG_RBD=y" >> $config_host_mak
6421  echo "RBD_LIBS=$rbd_libs" >> $config_host_mak
6422fi
6423
6424echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
6425if test "$coroutine_pool" = "yes" ; then
6426  echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
6427else
6428  echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
6429fi
6430
6431if test "$debug_stack_usage" = "yes" ; then
6432  echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
6433fi
6434
6435if test "$crypto_afalg" = "yes" ; then
6436  echo "CONFIG_AF_ALG=y" >> $config_host_mak
6437fi
6438
6439if test "$open_by_handle_at" = "yes" ; then
6440  echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
6441fi
6442
6443if test "$linux_magic_h" = "yes" ; then
6444  echo "CONFIG_LINUX_MAGIC_H=y" >> $config_host_mak
6445fi
6446
6447if test "$valgrind_h" = "yes" ; then
6448  echo "CONFIG_VALGRIND_H=y" >> $config_host_mak
6449fi
6450
6451if test "$have_asan_iface_fiber" = "yes" ; then
6452    echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
6453fi
6454
6455if test "$have_tsan" = "yes" && test "$have_tsan_iface_fiber" = "yes" ; then
6456    echo "CONFIG_TSAN=y" >> $config_host_mak
6457fi
6458
6459if test "$has_environ" = "yes" ; then
6460  echo "CONFIG_HAS_ENVIRON=y" >> $config_host_mak
6461fi
6462
6463if test "$cpuid_h" = "yes" ; then
6464  echo "CONFIG_CPUID_H=y" >> $config_host_mak
6465fi
6466
6467if test "$int128" = "yes" ; then
6468  echo "CONFIG_INT128=y" >> $config_host_mak
6469fi
6470
6471if test "$atomic128" = "yes" ; then
6472  echo "CONFIG_ATOMIC128=y" >> $config_host_mak
6473fi
6474
6475if test "$cmpxchg128" = "yes" ; then
6476  echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
6477fi
6478
6479if test "$atomic64" = "yes" ; then
6480  echo "CONFIG_ATOMIC64=y" >> $config_host_mak
6481fi
6482
6483if test "$attralias" = "yes" ; then
6484  echo "CONFIG_ATTRIBUTE_ALIAS=y" >> $config_host_mak
6485fi
6486
6487if test "$getauxval" = "yes" ; then
6488  echo "CONFIG_GETAUXVAL=y" >> $config_host_mak
6489fi
6490
6491if test "$glusterfs" = "yes" ; then
6492  echo "CONFIG_GLUSTERFS=y" >> $config_host_mak
6493  echo "GLUSTERFS_CFLAGS=$glusterfs_cflags" >> $config_host_mak
6494  echo "GLUSTERFS_LIBS=$glusterfs_libs" >> $config_host_mak
6495fi
6496
6497if test "$glusterfs_xlator_opt" = "yes" ; then
6498  echo "CONFIG_GLUSTERFS_XLATOR_OPT=y" >> $config_host_mak
6499fi
6500
6501if test "$glusterfs_discard" = "yes" ; then
6502  echo "CONFIG_GLUSTERFS_DISCARD=y" >> $config_host_mak
6503fi
6504
6505if test "$glusterfs_fallocate" = "yes" ; then
6506  echo "CONFIG_GLUSTERFS_FALLOCATE=y" >> $config_host_mak
6507fi
6508
6509if test "$glusterfs_zerofill" = "yes" ; then
6510  echo "CONFIG_GLUSTERFS_ZEROFILL=y" >> $config_host_mak
6511fi
6512
6513if test "$glusterfs_ftruncate_has_stat" = "yes" ; then
6514  echo "CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT=y" >> $config_host_mak
6515fi
6516
6517if test "$glusterfs_iocb_has_stat" = "yes" ; then
6518  echo "CONFIG_GLUSTERFS_IOCB_HAS_STAT=y" >> $config_host_mak
6519fi
6520
6521if test "$libssh" = "yes" ; then
6522  echo "CONFIG_LIBSSH=y" >> $config_host_mak
6523  echo "LIBSSH_CFLAGS=$libssh_cflags" >> $config_host_mak
6524  echo "LIBSSH_LIBS=$libssh_libs" >> $config_host_mak
6525fi
6526
6527if test "$live_block_migration" = "yes" ; then
6528  echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
6529fi
6530
6531if test "$tpm" = "yes"; then
6532  echo 'CONFIG_TPM=y' >> $config_host_mak
6533fi
6534
6535echo "TRACE_BACKENDS=$trace_backends" >> $config_host_mak
6536if have_backend "nop"; then
6537  echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
6538fi
6539if have_backend "simple"; then
6540  echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
6541  # Set the appropriate trace file.
6542  trace_file="\"$trace_file-\" FMT_pid"
6543fi
6544if have_backend "log"; then
6545  echo "CONFIG_TRACE_LOG=y" >> $config_host_mak
6546fi
6547if have_backend "ust"; then
6548  echo "CONFIG_TRACE_UST=y" >> $config_host_mak
6549  echo "LTTNG_UST_LIBS=$lttng_ust_libs" >> $config_host_mak
6550  echo "URCU_BP_LIBS=$urcu_bp_libs" >> $config_host_mak
6551fi
6552if have_backend "dtrace"; then
6553  echo "CONFIG_TRACE_DTRACE=y" >> $config_host_mak
6554  if test "$trace_backend_stap" = "yes" ; then
6555    echo "CONFIG_TRACE_SYSTEMTAP=y" >> $config_host_mak
6556  fi
6557fi
6558if have_backend "ftrace"; then
6559  if test "$linux" = "yes" ; then
6560    echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak
6561  else
6562    feature_not_found "ftrace(trace backend)" "ftrace requires Linux"
6563  fi
6564fi
6565if have_backend "syslog"; then
6566  if test "$posix_syslog" = "yes" ; then
6567    echo "CONFIG_TRACE_SYSLOG=y" >> $config_host_mak
6568  else
6569    feature_not_found "syslog(trace backend)" "syslog not available"
6570  fi
6571fi
6572echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
6573
6574if test "$rdma" = "yes" ; then
6575  echo "CONFIG_RDMA=y" >> $config_host_mak
6576  echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
6577fi
6578
6579if test "$pvrdma" = "yes" ; then
6580  echo "CONFIG_PVRDMA=y" >> $config_host_mak
6581fi
6582
6583if test "$have_rtnetlink" = "yes" ; then
6584  echo "CONFIG_RTNETLINK=y" >> $config_host_mak
6585fi
6586
6587if test "$libxml2" = "yes" ; then
6588  echo "CONFIG_LIBXML2=y" >> $config_host_mak
6589  echo "LIBXML2_CFLAGS=$libxml2_cflags" >> $config_host_mak
6590  echo "LIBXML2_LIBS=$libxml2_libs" >> $config_host_mak
6591fi
6592
6593if test "$replication" = "yes" ; then
6594  echo "CONFIG_REPLICATION=y" >> $config_host_mak
6595fi
6596
6597if test "$have_af_vsock" = "yes" ; then
6598  echo "CONFIG_AF_VSOCK=y" >> $config_host_mak
6599fi
6600
6601if test "$have_sysmacros" = "yes" ; then
6602  echo "CONFIG_SYSMACROS=y" >> $config_host_mak
6603fi
6604
6605if test "$have_static_assert" = "yes" ; then
6606  echo "CONFIG_STATIC_ASSERT=y" >> $config_host_mak
6607fi
6608
6609if test "$have_utmpx" = "yes" ; then
6610  echo "HAVE_UTMPX=y" >> $config_host_mak
6611fi
6612if test "$have_getrandom" = "yes" ; then
6613  echo "CONFIG_GETRANDOM=y" >> $config_host_mak
6614fi
6615if test "$ivshmem" = "yes" ; then
6616  echo "CONFIG_IVSHMEM=y" >> $config_host_mak
6617fi
6618if test "$debug_mutex" = "yes" ; then
6619  echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
6620fi
6621
6622# Hold two types of flag:
6623#   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
6624#                                     a thread we have a handle to
6625#   CONFIG_PTHREAD_SETNAME_NP_W_TID - A way of doing it on a particular
6626#                                     platform
6627if test "$pthread_setname_np_w_tid" = "yes" ; then
6628  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
6629  echo "CONFIG_PTHREAD_SETNAME_NP_W_TID=y" >> $config_host_mak
6630elif test "$pthread_setname_np_wo_tid" = "yes" ; then
6631  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
6632  echo "CONFIG_PTHREAD_SETNAME_NP_WO_TID=y" >> $config_host_mak
6633fi
6634
6635if test "$libpmem" = "yes" ; then
6636  echo "CONFIG_LIBPMEM=y" >> $config_host_mak
6637  echo "LIBPMEM_LIBS=$libpmem_libs" >> $config_host_mak
6638  echo "LIBPMEM_CFLAGS=$libpmem_cflags" >> $config_host_mak
6639fi
6640
6641if test "$libdaxctl" = "yes" ; then
6642  echo "CONFIG_LIBDAXCTL=y" >> $config_host_mak
6643  echo "LIBDAXCTL_LIBS=$libdaxctl_libs" >> $config_host_mak
6644fi
6645
6646if test "$bochs" = "yes" ; then
6647  echo "CONFIG_BOCHS=y" >> $config_host_mak
6648fi
6649if test "$cloop" = "yes" ; then
6650  echo "CONFIG_CLOOP=y" >> $config_host_mak
6651fi
6652if test "$dmg" = "yes" ; then
6653  echo "CONFIG_DMG=y" >> $config_host_mak
6654fi
6655if test "$qcow1" = "yes" ; then
6656  echo "CONFIG_QCOW1=y" >> $config_host_mak
6657fi
6658if test "$vdi" = "yes" ; then
6659  echo "CONFIG_VDI=y" >> $config_host_mak
6660fi
6661if test "$vvfat" = "yes" ; then
6662  echo "CONFIG_VVFAT=y" >> $config_host_mak
6663fi
6664if test "$qed" = "yes" ; then
6665  echo "CONFIG_QED=y" >> $config_host_mak
6666fi
6667if test "$parallels" = "yes" ; then
6668  echo "CONFIG_PARALLELS=y" >> $config_host_mak
6669fi
6670if test "$sheepdog" = "yes" ; then
6671  add_to deprecated_features "sheepdog"
6672  echo "CONFIG_SHEEPDOG=y" >> $config_host_mak
6673fi
6674if test "$pty_h" = "yes" ; then
6675  echo "HAVE_PTY_H=y" >> $config_host_mak
6676fi
6677if test "$have_mlockall" = "yes" ; then
6678  echo "HAVE_MLOCKALL=y" >> $config_host_mak
6679fi
6680if test "$fuzzing" = "yes" ; then
6681  # If LIB_FUZZING_ENGINE is set, assume we are running on OSS-Fuzz, and the
6682  # needed CFLAGS have already been provided
6683  if test -z "${LIB_FUZZING_ENGINE+xxx}" ; then
6684    QEMU_CFLAGS="$QEMU_CFLAGS -fsanitize=fuzzer-no-link"
6685    FUZZ_EXE_LDFLAGS="-fsanitize=fuzzer"
6686  else
6687    FUZZ_EXE_LDFLAGS="$LIB_FUZZING_ENGINE"
6688  fi
6689fi
6690
6691if test "$plugins" = "yes" ; then
6692    echo "CONFIG_PLUGIN=y" >> $config_host_mak
6693    # Copy the export object list to the build dir
6694    if test "$ld_dynamic_list" = "yes" ; then
6695	echo "CONFIG_HAS_LD_DYNAMIC_LIST=yes" >> $config_host_mak
6696	ld_symbols=qemu-plugins-ld.symbols
6697	cp "$source_path/plugins/qemu-plugins.symbols" $ld_symbols
6698    elif test "$ld_exported_symbols_list" = "yes" ; then
6699	echo "CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST=yes" >> $config_host_mak
6700	ld64_symbols=qemu-plugins-ld64.symbols
6701	echo "# Automatically generated by configure - do not modify" > $ld64_symbols
6702	grep 'qemu_' "$source_path/plugins/qemu-plugins.symbols" | sed 's/;//g' | \
6703	    sed -E 's/^[[:space:]]*(.*)/_\1/' >> $ld64_symbols
6704    else
6705	error_exit \
6706	    "If \$plugins=yes, either \$ld_dynamic_list or " \
6707	    "\$ld_exported_symbols_list should have been set to 'yes'."
6708    fi
6709fi
6710
6711if test -n "$gdb_bin" ; then
6712    echo "HAVE_GDB_BIN=$gdb_bin" >> $config_host_mak
6713fi
6714
6715if test "$secret_keyring" = "yes" ; then
6716  echo "CONFIG_SECRET_KEYRING=y" >> $config_host_mak
6717fi
6718
6719echo "ROMS=$roms" >> $config_host_mak
6720echo "MAKE=$make" >> $config_host_mak
6721echo "PYTHON=$python" >> $config_host_mak
6722echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
6723echo "MESON=$meson" >> $config_host_mak
6724echo "NINJA=$ninja" >> $config_host_mak
6725echo "CC=$cc" >> $config_host_mak
6726if $iasl -h > /dev/null 2>&1; then
6727  echo "CONFIG_IASL=$iasl" >> $config_host_mak
6728fi
6729echo "CXX=$cxx" >> $config_host_mak
6730echo "OBJCC=$objcc" >> $config_host_mak
6731echo "AR=$ar" >> $config_host_mak
6732echo "ARFLAGS=$ARFLAGS" >> $config_host_mak
6733echo "AS=$as" >> $config_host_mak
6734echo "CCAS=$ccas" >> $config_host_mak
6735echo "CPP=$cpp" >> $config_host_mak
6736echo "OBJCOPY=$objcopy" >> $config_host_mak
6737echo "LD=$ld" >> $config_host_mak
6738echo "RANLIB=$ranlib" >> $config_host_mak
6739echo "NM=$nm" >> $config_host_mak
6740echo "PKG_CONFIG=$pkg_config_exe" >> $config_host_mak
6741echo "WINDRES=$windres" >> $config_host_mak
6742echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
6743echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
6744echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
6745echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
6746echo "GLIB_LIBS=$glib_libs" >> $config_host_mak
6747echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
6748echo "LDFLAGS_NOPIE=$LDFLAGS_NOPIE" >> $config_host_mak
6749echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
6750echo "EXESUF=$EXESUF" >> $config_host_mak
6751echo "HOST_DSOSUF=$HOST_DSOSUF" >> $config_host_mak
6752echo "LIBS_QGA=$libs_qga" >> $config_host_mak
6753echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak
6754echo "TASN1_CFLAGS=$tasn1_cflags" >> $config_host_mak
6755if test "$gcov" = "yes" ; then
6756  echo "CONFIG_GCOV=y" >> $config_host_mak
6757fi
6758
6759if test "$fuzzing" != "no"; then
6760    echo "CONFIG_FUZZ=y" >> $config_host_mak
6761fi
6762echo "FUZZ_EXE_LDFLAGS=$FUZZ_EXE_LDFLAGS" >> $config_host_mak
6763
6764if test "$rng_none" = "yes"; then
6765  echo "CONFIG_RNG_NONE=y" >> $config_host_mak
6766fi
6767
6768# use included Linux headers
6769if test "$linux" = "yes" ; then
6770  mkdir -p linux-headers
6771  case "$cpu" in
6772  i386|x86_64|x32)
6773    linux_arch=x86
6774    ;;
6775  ppc|ppc64|ppc64le)
6776    linux_arch=powerpc
6777    ;;
6778  s390x)
6779    linux_arch=s390
6780    ;;
6781  aarch64)
6782    linux_arch=arm64
6783    ;;
6784  mips64)
6785    linux_arch=mips
6786    ;;
6787  *)
6788    # For most CPUs the kernel architecture name and QEMU CPU name match.
6789    linux_arch="$cpu"
6790    ;;
6791  esac
6792    # For non-KVM architectures we will not have asm headers
6793    if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
6794      symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
6795    fi
6796fi
6797
6798for target in $target_list; do
6799    target_dir="$target"
6800    target_name=$(echo $target | cut -d '-' -f 1)
6801    mkdir -p $target_dir
6802    case $target in
6803        *-user) symlink "../qemu-$target_name" "$target_dir/qemu-$target_name" ;;
6804        *) symlink "../qemu-system-$target_name" "$target_dir/qemu-system-$target_name" ;;
6805    esac
6806done
6807
6808echo "CONFIG_QEMU_INTERP_PREFIX=$interp_prefix" | sed 's/%M/@0@/' >> $config_host_mak
6809if test "$default_targets" = "yes"; then
6810  echo "CONFIG_DEFAULT_TARGETS=y" >> $config_host_mak
6811fi
6812
6813if test "$numa" = "yes"; then
6814  echo "CONFIG_NUMA=y" >> $config_host_mak
6815  echo "NUMA_LIBS=$numa_libs" >> $config_host_mak
6816fi
6817
6818if test "$ccache_cpp2" = "yes"; then
6819  echo "export CCACHE_CPP2=y" >> $config_host_mak
6820fi
6821
6822if test "$safe_stack" = "yes"; then
6823  echo "CONFIG_SAFESTACK=y" >> $config_host_mak
6824fi
6825
6826# If we're using a separate build tree, set it up now.
6827# DIRS are directories which we simply mkdir in the build tree;
6828# LINKS are things to symlink back into the source tree
6829# (these can be both files and directories).
6830# Caution: do not add files or directories here using wildcards. This
6831# will result in problems later if a new file matching the wildcard is
6832# added to the source tree -- nothing will cause configure to be rerun
6833# so the build tree will be missing the link back to the new file, and
6834# tests might fail. Prefer to keep the relevant files in their own
6835# directory and symlink the directory instead.
6836# UNLINK is used to remove symlinks from older development versions
6837# that might get into the way when doing "git update" without doing
6838# a "make distclean" in between.
6839DIRS="tests tests/tcg tests/tcg/lm32 tests/qapi-schema tests/qtest/libqos"
6840DIRS="$DIRS tests/qtest tests/qemu-iotests tests/vm tests/fp tests/qgraph"
6841DIRS="$DIRS docs docs/interop fsdev scsi"
6842DIRS="$DIRS pc-bios/optionrom pc-bios/s390-ccw"
6843DIRS="$DIRS roms/seabios"
6844DIRS="$DIRS contrib/plugins/"
6845LINKS="Makefile"
6846LINKS="$LINKS tests/tcg/lm32/Makefile"
6847LINKS="$LINKS tests/tcg/Makefile.target"
6848LINKS="$LINKS pc-bios/optionrom/Makefile"
6849LINKS="$LINKS pc-bios/s390-ccw/Makefile"
6850LINKS="$LINKS roms/seabios/Makefile"
6851LINKS="$LINKS pc-bios/qemu-icon.bmp"
6852LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
6853LINKS="$LINKS tests/acceptance tests/data"
6854LINKS="$LINKS tests/qemu-iotests/check"
6855LINKS="$LINKS python"
6856LINKS="$LINKS contrib/plugins/Makefile "
6857UNLINK="pc-bios/keymaps"
6858for bios_file in \
6859    $source_path/pc-bios/*.bin \
6860    $source_path/pc-bios/*.elf \
6861    $source_path/pc-bios/*.lid \
6862    $source_path/pc-bios/*.rom \
6863    $source_path/pc-bios/*.dtb \
6864    $source_path/pc-bios/*.img \
6865    $source_path/pc-bios/openbios-* \
6866    $source_path/pc-bios/u-boot.* \
6867    $source_path/pc-bios/edk2-*.fd.bz2 \
6868    $source_path/pc-bios/palcode-*
6869do
6870    LINKS="$LINKS pc-bios/$(basename $bios_file)"
6871done
6872mkdir -p $DIRS
6873for f in $LINKS ; do
6874    if [ -e "$source_path/$f" ]; then
6875        symlink "$source_path/$f" "$f"
6876    fi
6877done
6878for f in $UNLINK ; do
6879    if [ -L "$f" ]; then
6880        rm -f "$f"
6881    fi
6882done
6883
6884(for i in $cross_cc_vars; do
6885  export $i
6886done
6887export target_list source_path use_containers
6888$source_path/tests/tcg/configure.sh)
6889
6890# temporary config to build submodules
6891for rom in seabios; do
6892    config_mak=roms/$rom/config.mak
6893    echo "# Automatically generated by configure - do not modify" > $config_mak
6894    echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
6895    echo "AS=$as" >> $config_mak
6896    echo "CCAS=$ccas" >> $config_mak
6897    echo "CC=$cc" >> $config_mak
6898    echo "BCC=bcc" >> $config_mak
6899    echo "CPP=$cpp" >> $config_mak
6900    echo "OBJCOPY=objcopy" >> $config_mak
6901    echo "IASL=$iasl" >> $config_mak
6902    echo "LD=$ld" >> $config_mak
6903    echo "RANLIB=$ranlib" >> $config_mak
6904done
6905
6906# set up qemu-iotests in this build directory
6907iotests_common_env="tests/qemu-iotests/common.env"
6908
6909echo "# Automatically generated by configure - do not modify" > "$iotests_common_env"
6910echo >> "$iotests_common_env"
6911echo "export PYTHON='$python'" >> "$iotests_common_env"
6912
6913if test "$skip_meson" = no; then
6914cross="config-meson.cross.new"
6915meson_quote() {
6916    echo "'$(echo $* | sed "s/ /','/g")'"
6917}
6918
6919echo "# Automatically generated by configure - do not modify" > $cross
6920echo "[properties]" >> $cross
6921test -z "$cxx" && echo "link_language = 'c'" >> $cross
6922echo "[built-in options]" >> $cross
6923echo "c_args = [${CFLAGS:+$(meson_quote $CFLAGS)}]" >> $cross
6924echo "cpp_args = [${CXXFLAGS:+$(meson_quote $CXXFLAGS)}]" >> $cross
6925echo "c_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
6926echo "cpp_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
6927echo "[binaries]" >> $cross
6928echo "c = [$(meson_quote $cc)]" >> $cross
6929test -n "$cxx" && echo "cpp = [$(meson_quote $cxx)]" >> $cross
6930echo "ar = [$(meson_quote $ar)]" >> $cross
6931echo "nm = [$(meson_quote $nm)]" >> $cross
6932echo "pkgconfig = [$(meson_quote $pkg_config_exe)]" >> $cross
6933echo "ranlib = [$(meson_quote $ranlib)]" >> $cross
6934if has $sdl2_config; then
6935  echo "sdl2-config = [$(meson_quote $sdl2_config)]" >> $cross
6936fi
6937echo "strip = [$(meson_quote $strip)]" >> $cross
6938echo "windres = [$(meson_quote $windres)]" >> $cross
6939if test -n "$cross_prefix"; then
6940    cross_arg="--cross-file config-meson.cross"
6941    echo "[host_machine]" >> $cross
6942    if test "$mingw32" = "yes" ; then
6943        echo "system = 'windows'" >> $cross
6944    fi
6945    if test "$linux" = "yes" ; then
6946        echo "system = 'linux'" >> $cross
6947    fi
6948    case "$ARCH" in
6949        i386|x86_64)
6950            echo "cpu_family = 'x86'" >> $cross
6951            ;;
6952        ppc64le)
6953            echo "cpu_family = 'ppc64'" >> $cross
6954            ;;
6955        *)
6956            echo "cpu_family = '$ARCH'" >> $cross
6957            ;;
6958    esac
6959    echo "cpu = '$cpu'" >> $cross
6960    if test "$bigendian" = "yes" ; then
6961        echo "endian = 'big'" >> $cross
6962    else
6963        echo "endian = 'little'" >> $cross
6964    fi
6965else
6966    cross_arg="--native-file config-meson.cross"
6967fi
6968mv $cross config-meson.cross
6969
6970rm -rf meson-private meson-info meson-logs
6971unset staticpic
6972if ! version_ge "$($meson --version)" 0.56.0; then
6973  staticpic=$(if test "$pie" = yes; then echo true; else echo false; fi)
6974fi
6975NINJA=$ninja $meson setup \
6976        --prefix "$prefix" \
6977        --libdir "$libdir" \
6978        --libexecdir "$libexecdir" \
6979        --bindir "$bindir" \
6980        --includedir "$includedir" \
6981        --datadir "$datadir" \
6982        --mandir "$mandir" \
6983        --sysconfdir "$sysconfdir" \
6984        --localedir "$localedir" \
6985        --localstatedir "$local_statedir" \
6986        -Ddocdir="$docdir" \
6987        -Dqemu_firmwarepath="$firmwarepath" \
6988        -Dqemu_suffix="$qemu_suffix" \
6989        -Doptimization=$(if test "$debug" = yes; then echo 0; else echo 2; fi) \
6990        -Ddebug=$(if test "$debug_info" = yes; then echo true; else echo false; fi) \
6991        -Dwerror=$(if test "$werror" = yes; then echo true; else echo false; fi) \
6992        -Dstrip=$(if test "$strip_opt" = yes; then echo true; else echo false; fi) \
6993        -Db_pie=$(if test "$pie" = yes; then echo true; else echo false; fi) \
6994        ${staticpic:+-Db_staticpic=$staticpic} \
6995        -Db_coverage=$(if test "$gcov" = yes; then echo true; else echo false; fi) \
6996        -Dmalloc=$malloc -Dmalloc_trim=$malloc_trim -Dsparse=$sparse \
6997        -Dkvm=$kvm -Dhax=$hax -Dwhpx=$whpx -Dhvf=$hvf \
6998        -Dxen=$xen -Dxen_pci_passthrough=$xen_pci_passthrough -Dtcg=$tcg \
6999        -Dcocoa=$cocoa -Dmpath=$mpath -Dsdl=$sdl -Dsdl_image=$sdl_image \
7000        -Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg -Dvnc_png=$vnc_png \
7001        -Dgettext=$gettext -Dxkbcommon=$xkbcommon -Du2f=$u2f -Dvirtiofsd=$virtiofsd \
7002        -Dcapstone=$capstone -Dslirp=$slirp -Dfdt=$fdt \
7003        -Diconv=$iconv -Dcurses=$curses -Dlibudev=$libudev\
7004        -Ddocs=$docs -Dsphinx_build=$sphinx_build -Dinstall_blobs=$blobs \
7005        -Dvhost_user_blk_server=$vhost_user_blk_server \
7006        $cross_arg \
7007        "$PWD" "$source_path"
7008
7009if test "$?" -ne 0 ; then
7010    error_exit "meson setup failed"
7011fi
7012fi
7013
7014if test -n "${deprecated_features}"; then
7015    echo "Warning, deprecated features enabled."
7016    echo "Please see docs/system/deprecated.rst"
7017    echo "  features: ${deprecated_features}"
7018fi
7019
7020# Save the configure command line for later reuse.
7021cat <<EOD >config.status
7022#!/bin/sh
7023# Generated by configure.
7024# Run this file to recreate the current configuration.
7025# Compiler output produced by configure, useful for debugging
7026# configure, is in config.log if it exists.
7027EOD
7028
7029preserve_env() {
7030    envname=$1
7031
7032    eval envval=\$$envname
7033
7034    if test -n "$envval"
7035    then
7036	echo "$envname='$envval'" >> config.status
7037	echo "export $envname" >> config.status
7038    else
7039	echo "unset $envname" >> config.status
7040    fi
7041}
7042
7043# Preserve various env variables that influence what
7044# features/build target configure will detect
7045preserve_env AR
7046preserve_env AS
7047preserve_env CC
7048preserve_env CPP
7049preserve_env CXX
7050preserve_env INSTALL
7051preserve_env LD
7052preserve_env LD_LIBRARY_PATH
7053preserve_env LIBTOOL
7054preserve_env MAKE
7055preserve_env NM
7056preserve_env OBJCOPY
7057preserve_env PATH
7058preserve_env PKG_CONFIG
7059preserve_env PKG_CONFIG_LIBDIR
7060preserve_env PKG_CONFIG_PATH
7061preserve_env PYTHON
7062preserve_env SDL2_CONFIG
7063preserve_env SMBD
7064preserve_env STRIP
7065preserve_env WINDRES
7066
7067printf "exec" >>config.status
7068for i in "$0" "$@"; do
7069  test "$i" = --skip-meson || printf " '%s'" "$i" >>config.status
7070done
7071echo ' "$@"' >>config.status
7072chmod +x config.status
7073
7074rm -r "$TMPDIR1"
7075