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