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