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