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