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