xref: /openbmc/qemu/configure (revision e865b97ff4d924a81c28b9d9f3d6fe3e198bcdb9)
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# libdrm check
3199have_drm_h=no
3200if check_include "libdrm/drm.h" ; then
3201    have_drm_h=yes
3202fi
3203
3204##########################################
3205# VTE probe
3206
3207if test "$vte" != "no"; then
3208    vteminversion="0.32.0"
3209    if $pkg_config --exists "vte-2.91"; then
3210      vtepackage="vte-2.91"
3211    else
3212      vtepackage="vte-2.90"
3213    fi
3214    if $pkg_config --exists "$vtepackage >= $vteminversion"; then
3215        vte_cflags=$($pkg_config --cflags $vtepackage)
3216        vte_libs=$($pkg_config --libs $vtepackage)
3217        vteversion=$($pkg_config --modversion $vtepackage)
3218        vte="yes"
3219    elif test "$vte" = "yes"; then
3220        feature_not_found "vte" "Install libvte-2.90/2.91 devel"
3221    else
3222        vte="no"
3223    fi
3224fi
3225
3226##########################################
3227# SDL probe
3228
3229# Look for sdl configuration program (pkg-config or sdl2-config).  Try
3230# sdl2-config even without cross prefix, and favour pkg-config over sdl2-config.
3231
3232sdl_probe ()
3233{
3234  if $pkg_config sdl2 --exists; then
3235    sdlconfig="$pkg_config sdl2"
3236    sdlversion=$($sdlconfig --modversion 2>/dev/null)
3237  elif has "$sdl2_config"; then
3238    sdlconfig="$sdl2_config"
3239    sdlversion=$($sdlconfig --version)
3240  else
3241    if test "$sdl" = "yes" ; then
3242      feature_not_found "sdl" "Install SDL2-devel"
3243    fi
3244    sdl=no
3245    # no need to do the rest
3246    return
3247  fi
3248  if test -n "$cross_prefix" && test "$(basename "$sdlconfig")" = sdl2-config; then
3249    echo warning: using "\"$sdlconfig\"" to detect cross-compiled sdl >&2
3250  fi
3251
3252  cat > $TMPC << EOF
3253#include <SDL.h>
3254#undef main /* We don't want SDL to override our main() */
3255int main( void ) { return SDL_Init (SDL_INIT_VIDEO); }
3256EOF
3257  sdl_cflags=$($sdlconfig --cflags 2>/dev/null)
3258  sdl_cflags="$sdl_cflags -Wno-undef"  # workaround 2.0.8 bug
3259  if test "$static" = "yes" ; then
3260    if $pkg_config sdl2 --exists; then
3261      sdl_libs=$($pkg_config sdl2 --static --libs 2>/dev/null)
3262    else
3263      sdl_libs=$($sdlconfig --static-libs 2>/dev/null)
3264    fi
3265  else
3266    sdl_libs=$($sdlconfig --libs 2>/dev/null)
3267  fi
3268  if compile_prog "$sdl_cflags" "$sdl_libs" ; then
3269    sdl=yes
3270
3271    # static link with sdl ? (note: sdl.pc's --static --libs is broken)
3272    if test "$sdl" = "yes" && test "$static" = "yes" ; then
3273      if test $? = 0 && echo $sdl_libs | grep -- -laa > /dev/null; then
3274         sdl_libs="$sdl_libs $(aalib-config --static-libs 2>/dev/null)"
3275         sdl_cflags="$sdl_cflags $(aalib-config --cflags 2>/dev/null)"
3276      fi
3277      if compile_prog "$sdl_cflags" "$sdl_libs" ; then
3278	:
3279      else
3280        sdl=no
3281      fi
3282    fi # static link
3283  else # sdl not found
3284    if test "$sdl" = "yes" ; then
3285      feature_not_found "sdl" "Install SDL2 devel"
3286    fi
3287    sdl=no
3288  fi # sdl compile test
3289}
3290
3291sdl_image_probe ()
3292{
3293    if test "$sdl_image" != "no" ; then
3294        if $pkg_config SDL2_image --exists; then
3295            if test "$static" = "yes"; then
3296                sdl_image_libs=$($pkg_config SDL2_image --libs --static 2>/dev/null)
3297            else
3298                sdl_image_libs=$($pkg_config SDL2_image --libs 2>/dev/null)
3299            fi
3300            sdl_image_cflags=$($pkg_config SDL2_image --cflags 2>/dev/null)
3301            sdl_image=yes
3302
3303            sdl_cflags="$sdl_cflags $sdl_image_cflags"
3304            sdl_libs="$sdl_libs $sdl_image_libs"
3305        else
3306            if test "$sdl_image" = "yes" ; then
3307                feature_not_found "sdl_image" "Install SDL Image devel"
3308            else
3309                sdl_image=no
3310            fi
3311        fi
3312    fi
3313}
3314
3315if test "$sdl" != "no" ; then
3316  sdl_probe
3317fi
3318
3319if test "$sdl" = "yes" ; then
3320  sdl_image_probe
3321else
3322  if test "$sdl_image" = "yes"; then
3323    echo "warning: SDL Image requested, but SDL is not available, disabling"
3324  fi
3325  sdl_image=no
3326fi
3327
3328if test "$sdl" = "yes" ; then
3329  cat > $TMPC <<EOF
3330#include <SDL.h>
3331#if defined(SDL_VIDEO_DRIVER_X11)
3332#include <X11/XKBlib.h>
3333#else
3334#error No x11 support
3335#endif
3336int main(void) { return 0; }
3337EOF
3338  if compile_prog "$sdl_cflags $x11_cflags" "$sdl_libs $x11_libs" ; then
3339    need_x11=yes
3340    sdl_cflags="$sdl_cflags $x11_cflags"
3341    sdl_libs="$sdl_libs $x11_libs"
3342  fi
3343fi
3344
3345##########################################
3346# RDMA needs OpenFabrics libraries
3347if test "$rdma" != "no" ; then
3348  cat > $TMPC <<EOF
3349#include <rdma/rdma_cma.h>
3350int main(void) { return 0; }
3351EOF
3352  rdma_libs="-lrdmacm -libverbs -libumad"
3353  if compile_prog "" "$rdma_libs" ; then
3354    rdma="yes"
3355    libs_softmmu="$libs_softmmu $rdma_libs"
3356  else
3357    if test "$rdma" = "yes" ; then
3358        error_exit \
3359            " OpenFabrics librdmacm/libibverbs/libibumad not present." \
3360            " Your options:" \
3361            "  (1) Fast: Install infiniband packages (devel) from your distro." \
3362            "  (2) Cleanest: Install libraries from www.openfabrics.org" \
3363            "  (3) Also: Install softiwarp if you don't have RDMA hardware"
3364    fi
3365    rdma="no"
3366  fi
3367fi
3368
3369##########################################
3370# PVRDMA detection
3371
3372cat > $TMPC <<EOF &&
3373#include <sys/mman.h>
3374
3375int
3376main(void)
3377{
3378    char buf = 0;
3379    void *addr = &buf;
3380    addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
3381
3382    return 0;
3383}
3384EOF
3385
3386if test "$rdma" = "yes" ; then
3387    case "$pvrdma" in
3388    "")
3389        if compile_prog "" ""; then
3390            pvrdma="yes"
3391        else
3392            pvrdma="no"
3393        fi
3394        ;;
3395    "yes")
3396        if ! compile_prog "" ""; then
3397            error_exit "PVRDMA is not supported since mremap is not implemented"
3398        fi
3399        pvrdma="yes"
3400        ;;
3401    "no")
3402        pvrdma="no"
3403        ;;
3404    esac
3405else
3406    if test "$pvrdma" = "yes" ; then
3407        error_exit "PVRDMA requires rdma suppport"
3408    fi
3409    pvrdma="no"
3410fi
3411
3412# Let's see if enhanced reg_mr is supported
3413if test "$pvrdma" = "yes" ; then
3414
3415cat > $TMPC <<EOF &&
3416#include <infiniband/verbs.h>
3417
3418int
3419main(void)
3420{
3421    struct ibv_mr *mr;
3422    struct ibv_pd *pd = NULL;
3423    size_t length = 10;
3424    uint64_t iova = 0;
3425    int access = 0;
3426    void *addr = NULL;
3427
3428    mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
3429
3430    ibv_dereg_mr(mr);
3431
3432    return 0;
3433}
3434EOF
3435    if ! compile_prog "" "-libverbs"; then
3436        QEMU_CFLAGS="$QEMU_CFLAGS -DLEGACY_RDMA_REG_MR"
3437    fi
3438fi
3439
3440##########################################
3441# VNC SASL detection
3442if test "$vnc" = "yes" && test "$vnc_sasl" != "no" ; then
3443  cat > $TMPC <<EOF
3444#include <sasl/sasl.h>
3445#include <stdio.h>
3446int main(void) { sasl_server_init(NULL, "qemu"); return 0; }
3447EOF
3448  # Assuming Cyrus-SASL installed in /usr prefix
3449  # QEMU defines struct iovec in "qemu/osdep.h",
3450  # we don't want libsasl to redefine it in <sasl/sasl.h>.
3451  vnc_sasl_cflags="-DSTRUCT_IOVEC_DEFINED"
3452  vnc_sasl_libs="-lsasl2"
3453  if compile_prog "$vnc_sasl_cflags" "$vnc_sasl_libs" ; then
3454    vnc_sasl=yes
3455    libs_softmmu="$vnc_sasl_libs $libs_softmmu"
3456    QEMU_CFLAGS="$QEMU_CFLAGS $vnc_sasl_cflags"
3457  else
3458    if test "$vnc_sasl" = "yes" ; then
3459      feature_not_found "vnc-sasl" "Install Cyrus SASL devel"
3460    fi
3461    vnc_sasl=no
3462  fi
3463fi
3464
3465##########################################
3466# VNC JPEG detection
3467if test "$vnc" = "yes" && test "$vnc_jpeg" != "no" ; then
3468cat > $TMPC <<EOF
3469#include <stdio.h>
3470#include <jpeglib.h>
3471int main(void) { struct jpeg_compress_struct s; jpeg_create_compress(&s); return 0; }
3472EOF
3473    vnc_jpeg_cflags=""
3474    vnc_jpeg_libs="-ljpeg"
3475  if compile_prog "$vnc_jpeg_cflags" "$vnc_jpeg_libs" ; then
3476    vnc_jpeg=yes
3477    libs_softmmu="$vnc_jpeg_libs $libs_softmmu"
3478    QEMU_CFLAGS="$QEMU_CFLAGS $vnc_jpeg_cflags"
3479  else
3480    if test "$vnc_jpeg" = "yes" ; then
3481      feature_not_found "vnc-jpeg" "Install libjpeg-turbo devel"
3482    fi
3483    vnc_jpeg=no
3484  fi
3485fi
3486
3487##########################################
3488# VNC PNG detection
3489if test "$vnc" = "yes" && test "$vnc_png" != "no" ; then
3490cat > $TMPC <<EOF
3491//#include <stdio.h>
3492#include <png.h>
3493#include <stddef.h>
3494int main(void) {
3495    png_structp png_ptr;
3496    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
3497    return png_ptr != 0;
3498}
3499EOF
3500  if $pkg_config libpng --exists; then
3501    vnc_png_cflags=$($pkg_config libpng --cflags)
3502    vnc_png_libs=$($pkg_config libpng --libs)
3503  else
3504    vnc_png_cflags=""
3505    vnc_png_libs="-lpng"
3506  fi
3507  if compile_prog "$vnc_png_cflags" "$vnc_png_libs" ; then
3508    vnc_png=yes
3509    libs_softmmu="$vnc_png_libs $libs_softmmu"
3510    QEMU_CFLAGS="$QEMU_CFLAGS $vnc_png_cflags"
3511  else
3512    if test "$vnc_png" = "yes" ; then
3513      feature_not_found "vnc-png" "Install libpng devel"
3514    fi
3515    vnc_png=no
3516  fi
3517fi
3518
3519##########################################
3520# xkbcommon probe
3521if test "$xkbcommon" != "no" ; then
3522  if $pkg_config xkbcommon --exists; then
3523    xkbcommon_cflags=$($pkg_config xkbcommon --cflags)
3524    xkbcommon_libs=$($pkg_config xkbcommon --libs)
3525    xkbcommon=yes
3526  else
3527    if test "$xkbcommon" = "yes" ; then
3528      feature_not_found "xkbcommon" "Install libxkbcommon-devel"
3529    fi
3530    xkbcommon=no
3531  fi
3532fi
3533
3534
3535##########################################
3536# xfsctl() probe, used for file-posix.c
3537if test "$xfs" != "no" ; then
3538  cat > $TMPC << EOF
3539#include <stddef.h>  /* NULL */
3540#include <xfs/xfs.h>
3541int main(void)
3542{
3543    xfsctl(NULL, 0, 0, NULL);
3544    return 0;
3545}
3546EOF
3547  if compile_prog "" "" ; then
3548    xfs="yes"
3549  else
3550    if test "$xfs" = "yes" ; then
3551      feature_not_found "xfs" "Instal xfsprogs/xfslibs devel"
3552    fi
3553    xfs=no
3554  fi
3555fi
3556
3557##########################################
3558# vde libraries probe
3559if test "$vde" != "no" ; then
3560  vde_libs="-lvdeplug"
3561  cat > $TMPC << EOF
3562#include <libvdeplug.h>
3563int main(void)
3564{
3565    struct vde_open_args a = {0, 0, 0};
3566    char s[] = "";
3567    vde_open(s, s, &a);
3568    return 0;
3569}
3570EOF
3571  if compile_prog "" "$vde_libs" ; then
3572    vde=yes
3573  else
3574    if test "$vde" = "yes" ; then
3575      feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
3576    fi
3577    vde=no
3578  fi
3579fi
3580
3581##########################################
3582# netmap support probe
3583# Apart from looking for netmap headers, we make sure that the host API version
3584# supports the netmap backend (>=11). The upper bound (15) is meant to simulate
3585# a minor/major version number. Minor new features will be marked with values up
3586# to 15, and if something happens that requires a change to the backend we will
3587# move above 15, submit the backend fixes and modify this two bounds.
3588if test "$netmap" != "no" ; then
3589  cat > $TMPC << EOF
3590#include <inttypes.h>
3591#include <net/if.h>
3592#include <net/netmap.h>
3593#include <net/netmap_user.h>
3594#if (NETMAP_API < 11) || (NETMAP_API > 15)
3595#error
3596#endif
3597int main(void) { return 0; }
3598EOF
3599  if compile_prog "" "" ; then
3600    netmap=yes
3601  else
3602    if test "$netmap" = "yes" ; then
3603      feature_not_found "netmap"
3604    fi
3605    netmap=no
3606  fi
3607fi
3608
3609##########################################
3610# libcap-ng library probe
3611if test "$cap_ng" != "no" ; then
3612  cap_libs="-lcap-ng"
3613  cat > $TMPC << EOF
3614#include <cap-ng.h>
3615int main(void)
3616{
3617    capng_capability_to_name(CAPNG_EFFECTIVE);
3618    return 0;
3619}
3620EOF
3621  if compile_prog "" "$cap_libs" ; then
3622    cap_ng=yes
3623    libs_tools="$cap_libs $libs_tools"
3624  else
3625    if test "$cap_ng" = "yes" ; then
3626      feature_not_found "cap_ng" "Install libcap-ng devel"
3627    fi
3628    cap_ng=no
3629  fi
3630fi
3631
3632##########################################
3633# Sound support libraries probe
3634
3635audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
3636for drv in $audio_drv_list; do
3637    case $drv in
3638    alsa | try-alsa)
3639    if $pkg_config alsa --exists; then
3640        alsa_libs=$($pkg_config alsa --libs)
3641        if test "$drv" = "try-alsa"; then
3642            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa/alsa/')
3643        fi
3644    else
3645        if test "$drv" = "try-alsa"; then
3646            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa//')
3647        else
3648            error_exit "$drv check failed" \
3649                "Make sure to have the $drv libs and headers installed."
3650        fi
3651    fi
3652    ;;
3653
3654    pa | try-pa)
3655    if $pkg_config libpulse --exists; then
3656        pulse_libs=$($pkg_config libpulse --libs)
3657        if test "$drv" = "try-pa"; then
3658            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa/pa/')
3659        fi
3660    else
3661        if test "$drv" = "try-pa"; then
3662            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa//')
3663        else
3664            error_exit "$drv check failed" \
3665                "Make sure to have the $drv libs and headers installed."
3666        fi
3667    fi
3668    ;;
3669
3670    sdl)
3671    if test "$sdl" = "no"; then
3672        error_exit "sdl not found or disabled, can not use sdl audio driver"
3673    fi
3674    ;;
3675
3676    try-sdl)
3677    if test "$sdl" = "no"; then
3678        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl//')
3679    else
3680        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl/sdl/')
3681    fi
3682    ;;
3683
3684    coreaudio)
3685      coreaudio_libs="-framework CoreAudio"
3686    ;;
3687
3688    dsound)
3689      dsound_libs="-lole32 -ldxguid"
3690      audio_win_int="yes"
3691    ;;
3692
3693    oss)
3694      oss_libs="$oss_lib"
3695    ;;
3696
3697    jack | try-jack)
3698    if $pkg_config jack --exists; then
3699        jack_libs=$($pkg_config jack --libs)
3700        if test "$drv" = "try-jack"; then
3701            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack/jack/')
3702        fi
3703    else
3704        if test "$drv" = "try-jack"; then
3705            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack//')
3706        else
3707            error_exit "$drv check failed" \
3708                "Make sure to have the $drv libs and headers installed."
3709        fi
3710    fi
3711    ;;
3712
3713    *)
3714    echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
3715        error_exit "Unknown driver '$drv' selected" \
3716            "Possible drivers are: $audio_possible_drivers"
3717    }
3718    ;;
3719    esac
3720done
3721
3722##########################################
3723# BrlAPI probe
3724
3725if test "$brlapi" != "no" ; then
3726  brlapi_libs="-lbrlapi"
3727  cat > $TMPC << EOF
3728#include <brlapi.h>
3729#include <stddef.h>
3730int main( void ) { return brlapi__openConnection (NULL, NULL, NULL); }
3731EOF
3732  if compile_prog "" "$brlapi_libs" ; then
3733    brlapi=yes
3734  else
3735    if test "$brlapi" = "yes" ; then
3736      feature_not_found "brlapi" "Install brlapi devel"
3737    fi
3738    brlapi=no
3739  fi
3740fi
3741
3742##########################################
3743# iconv probe
3744if test "$iconv" != "no" ; then
3745  cat > $TMPC << EOF
3746#include <iconv.h>
3747int main(void) {
3748  iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
3749  return conv != (iconv_t) -1;
3750}
3751EOF
3752  iconv_prefix_list="/usr/local:/usr"
3753  iconv_lib_list=":-liconv"
3754  IFS=:
3755  for iconv_prefix in $iconv_prefix_list; do
3756    IFS=:
3757    iconv_cflags="-I$iconv_prefix/include"
3758    iconv_ldflags="-L$iconv_prefix/lib"
3759    for iconv_link in $iconv_lib_list; do
3760      unset IFS
3761      iconv_lib="$iconv_ldflags $iconv_link"
3762      echo "looking at iconv in '$iconv_cflags' '$iconv_lib'" >> config.log
3763      if compile_prog "$iconv_cflags" "$iconv_lib" ; then
3764        iconv_found=yes
3765        break
3766      fi
3767    done
3768    if test "$iconv_found" = yes ; then
3769      break
3770    fi
3771  done
3772  if test "$iconv_found" = "yes" ; then
3773    iconv=yes
3774  else
3775    if test "$iconv" = "yes" ; then
3776      feature_not_found "iconv" "Install iconv devel"
3777    fi
3778    iconv=no
3779  fi
3780fi
3781
3782##########################################
3783# curses probe
3784if test "$iconv" = "no" ; then
3785  # curses will need iconv
3786  curses=no
3787fi
3788if test "$curses" != "no" ; then
3789  if test "$mingw32" = "yes" ; then
3790    curses_inc_list="$($pkg_config --cflags ncurses 2>/dev/null):"
3791    curses_lib_list="$($pkg_config --libs ncurses 2>/dev/null):-lpdcurses"
3792  else
3793    curses_inc_list="$($pkg_config --cflags ncursesw 2>/dev/null):-I/usr/include/ncursesw:"
3794    curses_lib_list="$($pkg_config --libs ncursesw 2>/dev/null):-lncursesw:-lcursesw"
3795  fi
3796  curses_found=no
3797  cat > $TMPC << EOF
3798#include <locale.h>
3799#include <curses.h>
3800#include <wchar.h>
3801#include <langinfo.h>
3802int main(void) {
3803  const char *codeset;
3804  wchar_t wch = L'w';
3805  setlocale(LC_ALL, "");
3806  resize_term(0, 0);
3807  addwstr(L"wide chars\n");
3808  addnwstr(&wch, 1);
3809  add_wch(WACS_DEGREE);
3810  codeset = nl_langinfo(CODESET);
3811  return codeset != 0;
3812}
3813EOF
3814  IFS=:
3815  for curses_inc in $curses_inc_list; do
3816    # Make sure we get the wide character prototypes
3817    curses_inc="-DNCURSES_WIDECHAR $curses_inc"
3818    IFS=:
3819    for curses_lib in $curses_lib_list; do
3820      unset IFS
3821      if compile_prog "$curses_inc" "$curses_lib" ; then
3822        curses_found=yes
3823        break
3824      fi
3825    done
3826    if test "$curses_found" = yes ; then
3827      break
3828    fi
3829  done
3830  unset IFS
3831  if test "$curses_found" = "yes" ; then
3832    curses=yes
3833  else
3834    if test "$curses" = "yes" ; then
3835      feature_not_found "curses" "Install ncurses devel"
3836    fi
3837    curses=no
3838  fi
3839fi
3840
3841##########################################
3842# curl probe
3843if test "$curl" != "no" ; then
3844  if $pkg_config libcurl --exists; then
3845    curlconfig="$pkg_config libcurl"
3846  else
3847    curlconfig=curl-config
3848  fi
3849  cat > $TMPC << EOF
3850#include <curl/curl.h>
3851int main(void) { curl_easy_init(); curl_multi_setopt(0, 0, 0); return 0; }
3852EOF
3853  curl_cflags=$($curlconfig --cflags 2>/dev/null)
3854  curl_libs=$($curlconfig --libs 2>/dev/null)
3855  if compile_prog "$curl_cflags" "$curl_libs" ; then
3856    curl=yes
3857  else
3858    if test "$curl" = "yes" ; then
3859      feature_not_found "curl" "Install libcurl devel"
3860    fi
3861    curl=no
3862  fi
3863fi # test "$curl"
3864
3865##########################################
3866# glib support probe
3867
3868glib_req_ver=2.48
3869glib_modules=gthread-2.0
3870if test "$modules" = yes; then
3871    glib_modules="$glib_modules gmodule-export-2.0"
3872fi
3873if test "$plugins" = yes; then
3874    glib_modules="$glib_modules gmodule-2.0"
3875fi
3876
3877# This workaround is required due to a bug in pkg-config file for glib as it
3878# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
3879
3880if test "$static" = yes && test "$mingw32" = yes; then
3881    QEMU_CFLAGS="-DGLIB_STATIC_COMPILATION $QEMU_CFLAGS"
3882fi
3883
3884for i in $glib_modules; do
3885    if $pkg_config --atleast-version=$glib_req_ver $i; then
3886        glib_cflags=$($pkg_config --cflags $i)
3887        glib_libs=$($pkg_config --libs $i)
3888        QEMU_CFLAGS="$glib_cflags $QEMU_CFLAGS"
3889        LIBS="$glib_libs $LIBS"
3890        libs_qga="$glib_libs $libs_qga"
3891    else
3892        error_exit "glib-$glib_req_ver $i is required to compile QEMU"
3893    fi
3894done
3895
3896if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
3897    gio=yes
3898    gio_cflags=$($pkg_config --cflags gio-2.0)
3899    gio_libs=$($pkg_config --libs gio-2.0)
3900    gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
3901    if [ ! -x "$gdbus_codegen" ]; then
3902        gdbus_codegen=
3903    fi
3904else
3905    gio=no
3906fi
3907
3908if $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
3909    gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
3910    gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
3911fi
3912
3913# Sanity check that the current size_t matches the
3914# size that glib thinks it should be. This catches
3915# problems on multi-arch where people try to build
3916# 32-bit QEMU while pointing at 64-bit glib headers
3917cat > $TMPC <<EOF
3918#include <glib.h>
3919#include <unistd.h>
3920
3921#define QEMU_BUILD_BUG_ON(x) \
3922  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
3923
3924int main(void) {
3925   QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
3926   return 0;
3927}
3928EOF
3929
3930if ! compile_prog "$CFLAGS" "$LIBS" ; then
3931    error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
3932               "You probably need to set PKG_CONFIG_LIBDIR"\
3933	       "to point to the right pkg-config files for your"\
3934	       "build target"
3935fi
3936
3937# Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
3938cat > $TMPC << EOF
3939#include <glib.h>
3940int main(void) { return 0; }
3941EOF
3942if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3943    if cc_has_warning_flag "-Wno-unknown-attributes"; then
3944        glib_cflags="-Wno-unknown-attributes $glib_cflags"
3945        CFLAGS="-Wno-unknown-attributes $CFLAGS"
3946    fi
3947fi
3948
3949# Silence clang warnings triggered by glib < 2.57.2
3950cat > $TMPC << EOF
3951#include <glib.h>
3952typedef struct Foo {
3953    int i;
3954} Foo;
3955static void foo_free(Foo *f)
3956{
3957    g_free(f);
3958}
3959G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free);
3960int main(void) { return 0; }
3961EOF
3962if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3963    if cc_has_warning_flag "-Wno-unused-function"; then
3964        glib_cflags="$glib_cflags -Wno-unused-function"
3965        CFLAGS="$CFLAGS -Wno-unused-function"
3966    fi
3967fi
3968
3969#########################################
3970# zlib check
3971
3972if test "$zlib" != "no" ; then
3973    if $pkg_config --exists zlib; then
3974        zlib_cflags=$($pkg_config --cflags zlib)
3975        zlib_libs=$($pkg_config --libs zlib)
3976        QEMU_CFLAGS="$zlib_cflags $QEMU_CFLAGS"
3977        LIBS="$zlib_libs $LIBS"
3978    else
3979        cat > $TMPC << EOF
3980#include <zlib.h>
3981int main(void) { zlibVersion(); return 0; }
3982EOF
3983        if compile_prog "" "-lz" ; then
3984            LIBS="$LIBS -lz"
3985        else
3986            error_exit "zlib check failed" \
3987                "Make sure to have the zlib libs and headers installed."
3988        fi
3989    fi
3990fi
3991
3992##########################################
3993# SHA command probe for modules
3994if test "$modules" = yes; then
3995    shacmd_probe="sha1sum sha1 shasum"
3996    for c in $shacmd_probe; do
3997        if has $c; then
3998            shacmd="$c"
3999            break
4000        fi
4001    done
4002    if test "$shacmd" = ""; then
4003        error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
4004    fi
4005fi
4006
4007##########################################
4008# pixman support probe
4009
4010if test "$want_tools" = "no" && test "$softmmu" = "no"; then
4011  pixman_cflags=
4012  pixman_libs=
4013elif $pkg_config --atleast-version=0.21.8 pixman-1 > /dev/null 2>&1; then
4014  pixman_cflags=$($pkg_config --cflags pixman-1)
4015  pixman_libs=$($pkg_config --libs pixman-1)
4016else
4017  error_exit "pixman >= 0.21.8 not present." \
4018      "Please install the pixman devel package."
4019fi
4020
4021##########################################
4022# libmpathpersist probe
4023
4024if test "$mpath" != "no" ; then
4025  # probe for the new API
4026  cat > $TMPC <<EOF
4027#include <libudev.h>
4028#include <mpath_persist.h>
4029unsigned mpath_mx_alloc_len = 1024;
4030int logsink;
4031static struct config *multipath_conf;
4032extern struct udev *udev;
4033extern struct config *get_multipath_config(void);
4034extern void put_multipath_config(struct config *conf);
4035struct udev *udev;
4036struct config *get_multipath_config(void) { return multipath_conf; }
4037void put_multipath_config(struct config *conf) { }
4038
4039int main(void) {
4040    udev = udev_new();
4041    multipath_conf = mpath_lib_init();
4042    return 0;
4043}
4044EOF
4045  if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
4046    mpathpersist=yes
4047    mpathpersist_new_api=yes
4048  else
4049    # probe for the old API
4050    cat > $TMPC <<EOF
4051#include <libudev.h>
4052#include <mpath_persist.h>
4053unsigned mpath_mx_alloc_len = 1024;
4054int logsink;
4055int main(void) {
4056    struct udev *udev = udev_new();
4057    mpath_lib_init(udev);
4058    return 0;
4059}
4060EOF
4061    if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
4062      mpathpersist=yes
4063      mpathpersist_new_api=no
4064    else
4065      mpathpersist=no
4066    fi
4067  fi
4068else
4069  mpathpersist=no
4070fi
4071
4072##########################################
4073# pthread probe
4074PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
4075
4076pthread=no
4077cat > $TMPC << EOF
4078#include <pthread.h>
4079static void *f(void *p) { return NULL; }
4080int main(void) {
4081  pthread_t thread;
4082  pthread_create(&thread, 0, f, 0);
4083  return 0;
4084}
4085EOF
4086if compile_prog "" "" ; then
4087  pthread=yes
4088else
4089  for pthread_lib in $PTHREADLIBS_LIST; do
4090    if compile_prog "" "$pthread_lib" ; then
4091      pthread=yes
4092      found=no
4093      for lib_entry in $LIBS; do
4094        if test "$lib_entry" = "$pthread_lib"; then
4095          found=yes
4096          break
4097        fi
4098      done
4099      if test "$found" = "no"; then
4100        LIBS="$pthread_lib $LIBS"
4101        libs_qga="$pthread_lib $libs_qga"
4102      fi
4103      PTHREAD_LIB="$pthread_lib"
4104      break
4105    fi
4106  done
4107fi
4108
4109if test "$mingw32" != yes && test "$pthread" = no; then
4110  error_exit "pthread check failed" \
4111      "Make sure to have the pthread libs and headers installed."
4112fi
4113
4114# check for pthread_setname_np with thread id
4115pthread_setname_np_w_tid=no
4116cat > $TMPC << EOF
4117#include <pthread.h>
4118
4119static void *f(void *p) { return NULL; }
4120int main(void)
4121{
4122    pthread_t thread;
4123    pthread_create(&thread, 0, f, 0);
4124    pthread_setname_np(thread, "QEMU");
4125    return 0;
4126}
4127EOF
4128if compile_prog "" "$pthread_lib" ; then
4129  pthread_setname_np_w_tid=yes
4130fi
4131
4132# check for pthread_setname_np without thread id
4133pthread_setname_np_wo_tid=no
4134cat > $TMPC << EOF
4135#include <pthread.h>
4136
4137static void *f(void *p) { pthread_setname_np("QEMU"); }
4138int main(void)
4139{
4140    pthread_t thread;
4141    pthread_create(&thread, 0, f, 0);
4142    return 0;
4143}
4144EOF
4145if compile_prog "" "$pthread_lib" ; then
4146  pthread_setname_np_wo_tid=yes
4147fi
4148
4149##########################################
4150# rbd probe
4151if test "$rbd" != "no" ; then
4152  cat > $TMPC <<EOF
4153#include <stdio.h>
4154#include <rbd/librbd.h>
4155int main(void) {
4156    rados_t cluster;
4157    rados_create(&cluster, NULL);
4158    return 0;
4159}
4160EOF
4161  rbd_libs="-lrbd -lrados"
4162  if compile_prog "" "$rbd_libs" ; then
4163    rbd=yes
4164  else
4165    if test "$rbd" = "yes" ; then
4166      feature_not_found "rados block device" "Install librbd/ceph devel"
4167    fi
4168    rbd=no
4169  fi
4170fi
4171
4172##########################################
4173# libssh probe
4174if test "$libssh" != "no" ; then
4175  if $pkg_config --exists libssh; then
4176    libssh_cflags=$($pkg_config libssh --cflags)
4177    libssh_libs=$($pkg_config libssh --libs)
4178    libssh=yes
4179  else
4180    if test "$libssh" = "yes" ; then
4181      error_exit "libssh required for --enable-libssh"
4182    fi
4183    libssh=no
4184  fi
4185fi
4186
4187##########################################
4188# Check for libssh 0.8
4189# This is done like this instead of using the LIBSSH_VERSION_* and
4190# SSH_VERSION_* macros because some distributions in the past shipped
4191# snapshots of the future 0.8 from Git, and those snapshots did not
4192# have updated version numbers (still referring to 0.7.0).
4193
4194if test "$libssh" = "yes"; then
4195  cat > $TMPC <<EOF
4196#include <libssh/libssh.h>
4197int main(void) { return ssh_get_server_publickey(NULL, NULL); }
4198EOF
4199  if compile_prog "$libssh_cflags" "$libssh_libs"; then
4200    libssh_cflags="-DHAVE_LIBSSH_0_8 $libssh_cflags"
4201  fi
4202fi
4203
4204##########################################
4205# linux-aio probe
4206
4207if test "$linux_aio" != "no" ; then
4208  cat > $TMPC <<EOF
4209#include <libaio.h>
4210#include <sys/eventfd.h>
4211#include <stddef.h>
4212int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
4213EOF
4214  if compile_prog "" "-laio" ; then
4215    linux_aio=yes
4216  else
4217    if test "$linux_aio" = "yes" ; then
4218      feature_not_found "linux AIO" "Install libaio devel"
4219    fi
4220    linux_aio=no
4221  fi
4222fi
4223##########################################
4224# linux-io-uring probe
4225
4226if test "$linux_io_uring" != "no" ; then
4227  if $pkg_config liburing; then
4228    linux_io_uring_cflags=$($pkg_config --cflags liburing)
4229    linux_io_uring_libs=$($pkg_config --libs liburing)
4230    linux_io_uring=yes
4231
4232    # io_uring is used in libqemuutil.a where per-file -libs variables are not
4233    # seen by programs linking the archive.  It's not ideal, but just add the
4234    # library dependency globally.
4235    LIBS="$linux_io_uring_libs $LIBS"
4236  else
4237    if test "$linux_io_uring" = "yes" ; then
4238      feature_not_found "linux io_uring" "Install liburing devel"
4239    fi
4240    linux_io_uring=no
4241  fi
4242fi
4243
4244##########################################
4245# TPM emulation is only on POSIX
4246
4247if test "$tpm" = ""; then
4248  if test "$mingw32" = "yes"; then
4249    tpm=no
4250  else
4251    tpm=yes
4252  fi
4253elif test "$tpm" = "yes"; then
4254  if test "$mingw32" = "yes" ; then
4255    error_exit "TPM emulation only available on POSIX systems"
4256  fi
4257fi
4258
4259##########################################
4260# attr probe
4261
4262if test "$attr" != "no" ; then
4263  cat > $TMPC <<EOF
4264#include <stdio.h>
4265#include <sys/types.h>
4266#ifdef CONFIG_LIBATTR
4267#include <attr/xattr.h>
4268#else
4269#include <sys/xattr.h>
4270#endif
4271int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }
4272EOF
4273  if compile_prog "" "" ; then
4274    attr=yes
4275  # Older distros have <attr/xattr.h>, and need -lattr:
4276  elif compile_prog "-DCONFIG_LIBATTR" "-lattr" ; then
4277    attr=yes
4278    LIBS="-lattr $LIBS"
4279    libattr=yes
4280  else
4281    if test "$attr" = "yes" ; then
4282      feature_not_found "ATTR" "Install libc6 or libattr devel"
4283    fi
4284    attr=no
4285  fi
4286fi
4287
4288##########################################
4289# iovec probe
4290cat > $TMPC <<EOF
4291#include <sys/types.h>
4292#include <sys/uio.h>
4293#include <unistd.h>
4294int main(void) { return sizeof(struct iovec); }
4295EOF
4296iovec=no
4297if compile_prog "" "" ; then
4298  iovec=yes
4299fi
4300
4301##########################################
4302# preadv probe
4303cat > $TMPC <<EOF
4304#include <sys/types.h>
4305#include <sys/uio.h>
4306#include <unistd.h>
4307int main(void) { return preadv(0, 0, 0, 0); }
4308EOF
4309preadv=no
4310if compile_prog "" "" ; then
4311  preadv=yes
4312fi
4313
4314##########################################
4315# fdt probe
4316# fdt support is mandatory for at least some target architectures,
4317# so insist on it if we're building those system emulators.
4318fdt_required=no
4319for target in $target_list; do
4320  case $target in
4321    aarch64*-softmmu|arm*-softmmu|ppc*-softmmu|microblaze*-softmmu|mips64el-softmmu|riscv*-softmmu|rx-softmmu)
4322      fdt_required=yes
4323    ;;
4324  esac
4325done
4326
4327if test "$fdt_required" = "yes"; then
4328  if test "$fdt" = "no"; then
4329    error_exit "fdt disabled but some requested targets require it." \
4330      "You can turn off fdt only if you also disable all the system emulation" \
4331      "targets which need it (by specifying a cut down --target-list)."
4332  fi
4333  fdt=yes
4334elif test "$fdt" != "yes" ; then
4335  fdt=no
4336fi
4337
4338# fdt is only required when building softmmu targets
4339if test -z "$fdt" -a "$softmmu" != "yes" ; then
4340    fdt="no"
4341fi
4342
4343if test "$fdt" != "no" ; then
4344  fdt_libs="-lfdt"
4345  # explicitly check for libfdt_env.h as it is missing in some stable installs
4346  # and test for required functions to make sure we are on a version >= 1.4.2
4347  cat > $TMPC << EOF
4348#include <libfdt.h>
4349#include <libfdt_env.h>
4350int main(void) { fdt_check_full(NULL, 0); return 0; }
4351EOF
4352  if compile_prog "" "$fdt_libs" ; then
4353    # system DTC is good - use it
4354    fdt=system
4355  else
4356      # have GIT checkout, so activate dtc submodule
4357      if test -e "${source_path}/.git" ; then
4358          git_submodules="${git_submodules} dtc"
4359      fi
4360      if test -d "${source_path}/dtc/libfdt" || test -e "${source_path}/.git" ; then
4361          fdt=git
4362          mkdir -p dtc
4363          if [ "$pwd_is_source_path" != "y" ] ; then
4364              symlink "$source_path/dtc/Makefile" "dtc/Makefile"
4365          fi
4366          fdt_cflags="-I\$(SRC_PATH)/dtc/libfdt"
4367          fdt_ldflags="-L\$(BUILD_DIR)/dtc/libfdt"
4368          fdt_libs="$fdt_libs"
4369      elif test "$fdt" = "yes" ; then
4370          # Not a git build & no libfdt found, prompt for system install
4371          error_exit "DTC (libfdt) version >= 1.4.2 not present." \
4372                     "Please install the DTC (libfdt) devel package"
4373      else
4374          # don't have and don't want
4375          fdt_libs=
4376          fdt=no
4377      fi
4378  fi
4379fi
4380
4381libs_softmmu="$libs_softmmu $fdt_libs"
4382
4383##########################################
4384# opengl probe (for sdl2, gtk, milkymist-tmu2)
4385
4386gbm="no"
4387if $pkg_config gbm; then
4388    gbm_cflags="$($pkg_config --cflags gbm)"
4389    gbm_libs="$($pkg_config --libs gbm)"
4390    gbm="yes"
4391fi
4392
4393if test "$opengl" != "no" ; then
4394  opengl_pkgs="epoxy gbm"
4395  if $pkg_config $opengl_pkgs; then
4396    opengl_cflags="$($pkg_config --cflags $opengl_pkgs)"
4397    opengl_libs="$($pkg_config --libs $opengl_pkgs)"
4398    opengl=yes
4399    if test "$gtk" = "yes" && $pkg_config --exists "$gtkpackage >= 3.16"; then
4400        gtk_gl="yes"
4401    fi
4402    QEMU_CFLAGS="$QEMU_CFLAGS $opengl_cflags"
4403  else
4404    if test "$opengl" = "yes" ; then
4405      feature_not_found "opengl" "Please install opengl (mesa) devel pkgs: $opengl_pkgs"
4406    fi
4407    opengl_cflags=""
4408    opengl_libs=""
4409    opengl=no
4410  fi
4411fi
4412
4413if test "$opengl" = "yes"; then
4414  cat > $TMPC << EOF
4415#include <epoxy/egl.h>
4416#ifndef EGL_MESA_image_dma_buf_export
4417# error mesa/epoxy lacks support for dmabufs (mesa 10.6+)
4418#endif
4419int main(void) { return 0; }
4420EOF
4421  if compile_prog "" "" ; then
4422    opengl_dmabuf=yes
4423  fi
4424fi
4425
4426if test "$opengl" = "yes" && test "$have_x11" = "yes"; then
4427  for target in $target_list; do
4428    case $target in
4429      lm32-softmmu) # milkymist-tmu2 requires X11 and OpenGL
4430        need_x11=yes
4431      ;;
4432    esac
4433  done
4434fi
4435
4436##########################################
4437# libxml2 probe
4438if test "$libxml2" != "no" ; then
4439    if $pkg_config --exists libxml-2.0; then
4440        libxml2="yes"
4441        libxml2_cflags=$($pkg_config --cflags libxml-2.0)
4442        libxml2_libs=$($pkg_config --libs libxml-2.0)
4443    else
4444        if test "$libxml2" = "yes"; then
4445            feature_not_found "libxml2" "Install libxml2 devel"
4446        fi
4447        libxml2="no"
4448    fi
4449fi
4450
4451##########################################
4452# glusterfs probe
4453if test "$glusterfs" != "no" ; then
4454  if $pkg_config --atleast-version=3 glusterfs-api; then
4455    glusterfs="yes"
4456    glusterfs_cflags=$($pkg_config --cflags glusterfs-api)
4457    glusterfs_libs=$($pkg_config --libs glusterfs-api)
4458    if $pkg_config --atleast-version=4 glusterfs-api; then
4459      glusterfs_xlator_opt="yes"
4460    fi
4461    if $pkg_config --atleast-version=5 glusterfs-api; then
4462      glusterfs_discard="yes"
4463    fi
4464    if $pkg_config --atleast-version=6 glusterfs-api; then
4465      glusterfs_fallocate="yes"
4466      glusterfs_zerofill="yes"
4467    fi
4468    cat > $TMPC << EOF
4469#include <glusterfs/api/glfs.h>
4470
4471int
4472main(void)
4473{
4474	/* new glfs_ftruncate() passes two additional args */
4475	return glfs_ftruncate(NULL, 0, NULL, NULL);
4476}
4477EOF
4478    if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
4479      glusterfs_ftruncate_has_stat="yes"
4480    fi
4481    cat > $TMPC << EOF
4482#include <glusterfs/api/glfs.h>
4483
4484/* new glfs_io_cbk() passes two additional glfs_stat structs */
4485static void
4486glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
4487{}
4488
4489int
4490main(void)
4491{
4492	glfs_io_cbk iocb = &glusterfs_iocb;
4493	iocb(NULL, 0 , NULL, NULL, NULL);
4494	return 0;
4495}
4496EOF
4497    if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then
4498      glusterfs_iocb_has_stat="yes"
4499    fi
4500  else
4501    if test "$glusterfs" = "yes" ; then
4502      feature_not_found "GlusterFS backend support" \
4503          "Install glusterfs-api devel >= 3"
4504    fi
4505    glusterfs="no"
4506  fi
4507fi
4508
4509# Check for inotify functions when we are building linux-user
4510# emulator.  This is done because older glibc versions don't
4511# have syscall stubs for these implemented.  In that case we
4512# don't provide them even if kernel supports them.
4513#
4514inotify=no
4515cat > $TMPC << EOF
4516#include <sys/inotify.h>
4517
4518int
4519main(void)
4520{
4521	/* try to start inotify */
4522	return inotify_init();
4523}
4524EOF
4525if compile_prog "" "" ; then
4526  inotify=yes
4527fi
4528
4529inotify1=no
4530cat > $TMPC << EOF
4531#include <sys/inotify.h>
4532
4533int
4534main(void)
4535{
4536    /* try to start inotify */
4537    return inotify_init1(0);
4538}
4539EOF
4540if compile_prog "" "" ; then
4541  inotify1=yes
4542fi
4543
4544# check if pipe2 is there
4545pipe2=no
4546cat > $TMPC << EOF
4547#include <unistd.h>
4548#include <fcntl.h>
4549
4550int main(void)
4551{
4552    int pipefd[2];
4553    return pipe2(pipefd, O_CLOEXEC);
4554}
4555EOF
4556if compile_prog "" "" ; then
4557  pipe2=yes
4558fi
4559
4560# check if accept4 is there
4561accept4=no
4562cat > $TMPC << EOF
4563#include <sys/socket.h>
4564#include <stddef.h>
4565
4566int main(void)
4567{
4568    accept4(0, NULL, NULL, SOCK_CLOEXEC);
4569    return 0;
4570}
4571EOF
4572if compile_prog "" "" ; then
4573  accept4=yes
4574fi
4575
4576# check if tee/splice is there. vmsplice was added same time.
4577splice=no
4578cat > $TMPC << EOF
4579#include <unistd.h>
4580#include <fcntl.h>
4581#include <limits.h>
4582
4583int main(void)
4584{
4585    int len, fd = 0;
4586    len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
4587    splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
4588    return 0;
4589}
4590EOF
4591if compile_prog "" "" ; then
4592  splice=yes
4593fi
4594
4595##########################################
4596# libnuma probe
4597
4598if test "$numa" != "no" ; then
4599  cat > $TMPC << EOF
4600#include <numa.h>
4601int main(void) { return numa_available(); }
4602EOF
4603
4604  if compile_prog "" "-lnuma" ; then
4605    numa=yes
4606    libs_softmmu="-lnuma $libs_softmmu"
4607  else
4608    if test "$numa" = "yes" ; then
4609      feature_not_found "numa" "install numactl devel"
4610    fi
4611    numa=no
4612  fi
4613fi
4614
4615if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
4616    echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
4617    exit 1
4618fi
4619
4620# Even if malloc_trim() is available, these non-libc memory allocators
4621# do not support it.
4622if test "$tcmalloc" = "yes" || test "$jemalloc" = "yes" ; then
4623    if test "$malloc_trim" = "yes" ; then
4624        echo "Disabling malloc_trim with non-libc memory allocator"
4625    fi
4626    malloc_trim="no"
4627fi
4628
4629#######################################
4630# malloc_trim
4631
4632if test "$malloc_trim" != "no" ; then
4633    cat > $TMPC << EOF
4634#include <malloc.h>
4635int main(void) { malloc_trim(0); return 0; }
4636EOF
4637    if compile_prog "" "" ; then
4638        malloc_trim="yes"
4639    else
4640        malloc_trim="no"
4641    fi
4642fi
4643
4644##########################################
4645# tcmalloc probe
4646
4647if test "$tcmalloc" = "yes" ; then
4648  cat > $TMPC << EOF
4649#include <stdlib.h>
4650int main(void) {
4651    void *tmp = malloc(1);
4652    if (tmp != NULL) {
4653        return 0;
4654    }
4655    return 1;
4656}
4657EOF
4658
4659  if compile_prog "" "-ltcmalloc" ; then
4660    LIBS="-ltcmalloc $LIBS"
4661  else
4662    feature_not_found "tcmalloc" "install gperftools devel"
4663  fi
4664fi
4665
4666##########################################
4667# jemalloc probe
4668
4669if test "$jemalloc" = "yes" ; then
4670  cat > $TMPC << EOF
4671#include <stdlib.h>
4672int main(void) {
4673    void *tmp = malloc(1);
4674    if (tmp != NULL) {
4675        return 0;
4676    }
4677    return 1;
4678}
4679EOF
4680
4681  if compile_prog "" "-ljemalloc" ; then
4682    LIBS="-ljemalloc $LIBS"
4683  else
4684    feature_not_found "jemalloc" "install jemalloc devel"
4685  fi
4686fi
4687
4688##########################################
4689# signalfd probe
4690signalfd="no"
4691cat > $TMPC << EOF
4692#include <unistd.h>
4693#include <sys/syscall.h>
4694#include <signal.h>
4695int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }
4696EOF
4697
4698if compile_prog "" "" ; then
4699  signalfd=yes
4700fi
4701
4702# check if optreset global is declared by <getopt.h>
4703optreset="no"
4704cat > $TMPC << EOF
4705#include <getopt.h>
4706int main(void) { return optreset; }
4707EOF
4708
4709if compile_prog "" "" ; then
4710  optreset=yes
4711fi
4712
4713# check if eventfd is supported
4714eventfd=no
4715cat > $TMPC << EOF
4716#include <sys/eventfd.h>
4717
4718int main(void)
4719{
4720    return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
4721}
4722EOF
4723if compile_prog "" "" ; then
4724  eventfd=yes
4725fi
4726
4727# check if memfd is supported
4728memfd=no
4729cat > $TMPC << EOF
4730#include <sys/mman.h>
4731
4732int main(void)
4733{
4734    return memfd_create("foo", MFD_ALLOW_SEALING);
4735}
4736EOF
4737if compile_prog "" "" ; then
4738  memfd=yes
4739fi
4740
4741# check for usbfs
4742have_usbfs=no
4743if test "$linux_user" = "yes"; then
4744  cat > $TMPC << EOF
4745#include <linux/usbdevice_fs.h>
4746
4747#ifndef USBDEVFS_GET_CAPABILITIES
4748#error "USBDEVFS_GET_CAPABILITIES undefined"
4749#endif
4750
4751#ifndef USBDEVFS_DISCONNECT_CLAIM
4752#error "USBDEVFS_DISCONNECT_CLAIM undefined"
4753#endif
4754
4755int main(void)
4756{
4757    return 0;
4758}
4759EOF
4760  if compile_prog "" ""; then
4761    have_usbfs=yes
4762  fi
4763fi
4764
4765# check for fallocate
4766fallocate=no
4767cat > $TMPC << EOF
4768#include <fcntl.h>
4769
4770int main(void)
4771{
4772    fallocate(0, 0, 0, 0);
4773    return 0;
4774}
4775EOF
4776if compile_prog "" "" ; then
4777  fallocate=yes
4778fi
4779
4780# check for fallocate hole punching
4781fallocate_punch_hole=no
4782cat > $TMPC << EOF
4783#include <fcntl.h>
4784#include <linux/falloc.h>
4785
4786int main(void)
4787{
4788    fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
4789    return 0;
4790}
4791EOF
4792if compile_prog "" "" ; then
4793  fallocate_punch_hole=yes
4794fi
4795
4796# check that fallocate supports range zeroing inside the file
4797fallocate_zero_range=no
4798cat > $TMPC << EOF
4799#include <fcntl.h>
4800#include <linux/falloc.h>
4801
4802int main(void)
4803{
4804    fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0);
4805    return 0;
4806}
4807EOF
4808if compile_prog "" "" ; then
4809  fallocate_zero_range=yes
4810fi
4811
4812# check for posix_fallocate
4813posix_fallocate=no
4814cat > $TMPC << EOF
4815#include <fcntl.h>
4816
4817int main(void)
4818{
4819    posix_fallocate(0, 0, 0);
4820    return 0;
4821}
4822EOF
4823if compile_prog "" "" ; then
4824    posix_fallocate=yes
4825fi
4826
4827# check for sync_file_range
4828sync_file_range=no
4829cat > $TMPC << EOF
4830#include <fcntl.h>
4831
4832int main(void)
4833{
4834    sync_file_range(0, 0, 0, 0);
4835    return 0;
4836}
4837EOF
4838if compile_prog "" "" ; then
4839  sync_file_range=yes
4840fi
4841
4842# check for linux/fiemap.h and FS_IOC_FIEMAP
4843fiemap=no
4844cat > $TMPC << EOF
4845#include <sys/ioctl.h>
4846#include <linux/fs.h>
4847#include <linux/fiemap.h>
4848
4849int main(void)
4850{
4851    ioctl(0, FS_IOC_FIEMAP, 0);
4852    return 0;
4853}
4854EOF
4855if compile_prog "" "" ; then
4856  fiemap=yes
4857fi
4858
4859# check for dup3
4860dup3=no
4861cat > $TMPC << EOF
4862#include <unistd.h>
4863
4864int main(void)
4865{
4866    dup3(0, 0, 0);
4867    return 0;
4868}
4869EOF
4870if compile_prog "" "" ; then
4871  dup3=yes
4872fi
4873
4874# check for ppoll support
4875ppoll=no
4876cat > $TMPC << EOF
4877#include <poll.h>
4878
4879int main(void)
4880{
4881    struct pollfd pfd = { .fd = 0, .events = 0, .revents = 0 };
4882    ppoll(&pfd, 1, 0, 0);
4883    return 0;
4884}
4885EOF
4886if compile_prog "" "" ; then
4887  ppoll=yes
4888fi
4889
4890# check for prctl(PR_SET_TIMERSLACK , ... ) support
4891prctl_pr_set_timerslack=no
4892cat > $TMPC << EOF
4893#include <sys/prctl.h>
4894
4895int main(void)
4896{
4897    prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0);
4898    return 0;
4899}
4900EOF
4901if compile_prog "" "" ; then
4902  prctl_pr_set_timerslack=yes
4903fi
4904
4905# check for epoll support
4906epoll=no
4907cat > $TMPC << EOF
4908#include <sys/epoll.h>
4909
4910int main(void)
4911{
4912    epoll_create(0);
4913    return 0;
4914}
4915EOF
4916if compile_prog "" "" ; then
4917  epoll=yes
4918fi
4919
4920# epoll_create1 is a later addition
4921# so we must check separately for its presence
4922epoll_create1=no
4923cat > $TMPC << EOF
4924#include <sys/epoll.h>
4925
4926int main(void)
4927{
4928    /* Note that we use epoll_create1 as a value, not as
4929     * a function being called. This is necessary so that on
4930     * old SPARC glibc versions where the function was present in
4931     * the library but not declared in the header file we will
4932     * fail the configure check. (Otherwise we will get a compiler
4933     * warning but not an error, and will proceed to fail the
4934     * qemu compile where we compile with -Werror.)
4935     */
4936    return (int)(uintptr_t)&epoll_create1;
4937}
4938EOF
4939if compile_prog "" "" ; then
4940  epoll_create1=yes
4941fi
4942
4943# check for sendfile support
4944sendfile=no
4945cat > $TMPC << EOF
4946#include <sys/sendfile.h>
4947
4948int main(void)
4949{
4950    return sendfile(0, 0, 0, 0);
4951}
4952EOF
4953if compile_prog "" "" ; then
4954  sendfile=yes
4955fi
4956
4957# check for timerfd support (glibc 2.8 and newer)
4958timerfd=no
4959cat > $TMPC << EOF
4960#include <sys/timerfd.h>
4961
4962int main(void)
4963{
4964    return(timerfd_create(CLOCK_REALTIME, 0));
4965}
4966EOF
4967if compile_prog "" "" ; then
4968  timerfd=yes
4969fi
4970
4971# check for setns and unshare support
4972setns=no
4973cat > $TMPC << EOF
4974#include <sched.h>
4975
4976int main(void)
4977{
4978    int ret;
4979    ret = setns(0, 0);
4980    ret = unshare(0);
4981    return ret;
4982}
4983EOF
4984if compile_prog "" "" ; then
4985  setns=yes
4986fi
4987
4988# clock_adjtime probe
4989clock_adjtime=no
4990cat > $TMPC <<EOF
4991#include <time.h>
4992
4993int main(void)
4994{
4995    return clock_adjtime(0, 0);
4996}
4997EOF
4998clock_adjtime=no
4999if compile_prog "" "" ; then
5000  clock_adjtime=yes
5001fi
5002
5003# syncfs probe
5004syncfs=no
5005cat > $TMPC <<EOF
5006#include <unistd.h>
5007
5008int main(void)
5009{
5010    return syncfs(0);
5011}
5012EOF
5013syncfs=no
5014if compile_prog "" "" ; then
5015  syncfs=yes
5016fi
5017
5018# check for kcov support (kernel must be 4.4+, compiled with certain options)
5019kcov=no
5020if check_include sys/kcov.h ; then
5021    kcov=yes
5022fi
5023
5024# If we're making warnings fatal, apply this to Sphinx runs as well
5025sphinx_werror=""
5026if test "$werror" = "yes"; then
5027    sphinx_werror="-W"
5028fi
5029
5030# Check we have a new enough version of sphinx-build
5031has_sphinx_build() {
5032    # This is a bit awkward but works: create a trivial document and
5033    # try to run it with our configuration file (which enforces a
5034    # version requirement). This will fail if either
5035    # sphinx-build doesn't exist at all or if it is too old.
5036    mkdir -p "$TMPDIR1/sphinx"
5037    touch "$TMPDIR1/sphinx/index.rst"
5038    "$sphinx_build" $sphinx_werror -c "$source_path/docs" \
5039                    -b html "$TMPDIR1/sphinx" \
5040                    "$TMPDIR1/sphinx/out"  >> config.log 2>&1
5041}
5042
5043# Check if tools are available to build documentation.
5044if test "$docs" != "no" ; then
5045  if has_sphinx_build; then
5046    sphinx_ok=yes
5047  else
5048    sphinx_ok=no
5049  fi
5050  if has makeinfo && has pod2man && test "$sphinx_ok" = "yes"; then
5051    docs=yes
5052  else
5053    if test "$docs" = "yes" ; then
5054      if has $sphinx_build && test "$sphinx_ok" != "yes"; then
5055        echo "Warning: $sphinx_build exists but it is either too old or uses too old a Python version" >&2
5056      fi
5057      feature_not_found "docs" "Install texinfo, Perl/perl-podlators and a Python 3 version of python-sphinx"
5058    fi
5059    docs=no
5060  fi
5061fi
5062
5063# Search for bswap_32 function
5064byteswap_h=no
5065cat > $TMPC << EOF
5066#include <byteswap.h>
5067int main(void) { return bswap_32(0); }
5068EOF
5069if compile_prog "" "" ; then
5070  byteswap_h=yes
5071fi
5072
5073# Search for bswap32 function
5074bswap_h=no
5075cat > $TMPC << EOF
5076#include <sys/endian.h>
5077#include <sys/types.h>
5078#include <machine/bswap.h>
5079int main(void) { return bswap32(0); }
5080EOF
5081if compile_prog "" "" ; then
5082  bswap_h=yes
5083fi
5084
5085##########################################
5086# Do we have libiscsi >= 1.9.0
5087if test "$libiscsi" != "no" ; then
5088  if $pkg_config --atleast-version=1.9.0 libiscsi; then
5089    libiscsi="yes"
5090    libiscsi_cflags=$($pkg_config --cflags libiscsi)
5091    libiscsi_libs=$($pkg_config --libs libiscsi)
5092  else
5093    if test "$libiscsi" = "yes" ; then
5094      feature_not_found "libiscsi" "Install libiscsi >= 1.9.0"
5095    fi
5096    libiscsi="no"
5097  fi
5098fi
5099
5100##########################################
5101# Do we need libm
5102cat > $TMPC << EOF
5103#include <math.h>
5104int main(int argc, char **argv) { return isnan(sin((double)argc)); }
5105EOF
5106if compile_prog "" "" ; then
5107  :
5108elif compile_prog "" "-lm" ; then
5109  LIBS="-lm $LIBS"
5110  libs_qga="-lm $libs_qga"
5111else
5112  error_exit "libm check failed"
5113fi
5114
5115##########################################
5116# Do we need librt
5117# uClibc provides 2 versions of clock_gettime(), one with realtime
5118# support and one without. This means that the clock_gettime() don't
5119# need -lrt. We still need it for timer_create() so we check for this
5120# function in addition.
5121cat > $TMPC <<EOF
5122#include <signal.h>
5123#include <time.h>
5124int main(void) {
5125  timer_create(CLOCK_REALTIME, NULL, NULL);
5126  return clock_gettime(CLOCK_REALTIME, NULL);
5127}
5128EOF
5129
5130if compile_prog "" "" ; then
5131  :
5132# we need pthread for static linking. use previous pthread test result
5133elif compile_prog "" "$pthread_lib -lrt" ; then
5134  LIBS="$LIBS -lrt"
5135  libs_qga="$libs_qga -lrt"
5136fi
5137
5138# Check whether we need to link libutil for openpty()
5139cat > $TMPC << EOF
5140extern int openpty(int *am, int *as, char *name, void *termp, void *winp);
5141int main(void) { return openpty(0, 0, 0, 0, 0); }
5142EOF
5143
5144if ! compile_prog "" "" ; then
5145  if compile_prog "" "-lutil" ; then
5146    libs_softmmu="-lutil $libs_softmmu"
5147    libs_tools="-lutil $libs_tools"
5148  fi
5149fi
5150
5151##########################################
5152# spice probe
5153if test "$spice" != "no" ; then
5154  cat > $TMPC << EOF
5155#include <spice.h>
5156int main(void) { spice_server_new(); return 0; }
5157EOF
5158  spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
5159  spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
5160  if $pkg_config --atleast-version=0.12.5 spice-server && \
5161     $pkg_config --atleast-version=0.12.3 spice-protocol && \
5162     compile_prog "$spice_cflags" "$spice_libs" ; then
5163    spice="yes"
5164    libs_softmmu="$libs_softmmu $spice_libs"
5165    QEMU_CFLAGS="$QEMU_CFLAGS $spice_cflags"
5166    spice_protocol_version=$($pkg_config --modversion spice-protocol)
5167    spice_server_version=$($pkg_config --modversion spice-server)
5168  else
5169    if test "$spice" = "yes" ; then
5170      feature_not_found "spice" \
5171          "Install spice-server(>=0.12.5) and spice-protocol(>=0.12.3) devel"
5172    fi
5173    spice="no"
5174  fi
5175fi
5176
5177# check for smartcard support
5178if test "$smartcard" != "no"; then
5179    if $pkg_config --atleast-version=2.5.1 libcacard; then
5180        libcacard_cflags=$($pkg_config --cflags libcacard)
5181        libcacard_libs=$($pkg_config --libs libcacard)
5182        smartcard="yes"
5183    else
5184        if test "$smartcard" = "yes"; then
5185            feature_not_found "smartcard" "Install libcacard devel"
5186        fi
5187        smartcard="no"
5188    fi
5189fi
5190
5191# check for libusb
5192if test "$libusb" != "no" ; then
5193    if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
5194        libusb="yes"
5195        libusb_cflags=$($pkg_config --cflags libusb-1.0)
5196        libusb_libs=$($pkg_config --libs libusb-1.0)
5197    else
5198        if test "$libusb" = "yes"; then
5199            feature_not_found "libusb" "Install libusb devel >= 1.0.13"
5200        fi
5201        libusb="no"
5202    fi
5203fi
5204
5205# check for usbredirparser for usb network redirection support
5206if test "$usb_redir" != "no" ; then
5207    if $pkg_config --atleast-version=0.6 libusbredirparser-0.5; then
5208        usb_redir="yes"
5209        usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5)
5210        usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5)
5211    else
5212        if test "$usb_redir" = "yes"; then
5213            feature_not_found "usb-redir" "Install usbredir devel"
5214        fi
5215        usb_redir="no"
5216    fi
5217fi
5218
5219##########################################
5220# check if we have VSS SDK headers for win
5221
5222if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
5223        test "$vss_win32_sdk" != "no" ; then
5224  case "$vss_win32_sdk" in
5225    "")   vss_win32_include="-isystem $source_path" ;;
5226    *\ *) # The SDK is installed in "Program Files" by default, but we cannot
5227          # handle path with spaces. So we symlink the headers into ".sdk/vss".
5228          vss_win32_include="-isystem $source_path/.sdk/vss"
5229	  symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
5230	  ;;
5231    *)    vss_win32_include="-isystem $vss_win32_sdk"
5232  esac
5233  cat > $TMPC << EOF
5234#define __MIDL_user_allocate_free_DEFINED__
5235#include <inc/win2003/vss.h>
5236int main(void) { return VSS_CTX_BACKUP; }
5237EOF
5238  if compile_prog "$vss_win32_include" "" ; then
5239    guest_agent_with_vss="yes"
5240    QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
5241    libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
5242    qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
5243  else
5244    if test "$vss_win32_sdk" != "" ; then
5245      echo "ERROR: Please download and install Microsoft VSS SDK:"
5246      echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
5247      echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
5248      echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
5249      echo "ERROR: The headers are extracted in the directory \`inc'."
5250      feature_not_found "VSS support"
5251    fi
5252    guest_agent_with_vss="no"
5253  fi
5254fi
5255
5256##########################################
5257# lookup Windows platform SDK (if not specified)
5258# The SDK is needed only to build .tlb (type library) file of guest agent
5259# VSS provider from the source. It is usually unnecessary because the
5260# pre-compiled .tlb file is included.
5261
5262if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
5263        test "$guest_agent_with_vss" = "yes" ; then
5264  if test -z "$win_sdk"; then
5265    programfiles="$PROGRAMFILES"
5266    test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
5267    if test -n "$programfiles"; then
5268      win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
5269    else
5270      feature_not_found "Windows SDK"
5271    fi
5272  elif test "$win_sdk" = "no"; then
5273    win_sdk=""
5274  fi
5275fi
5276
5277##########################################
5278# check if mingw environment provides a recent ntddscsi.h
5279if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
5280  cat > $TMPC << EOF
5281#include <windows.h>
5282#include <ntddscsi.h>
5283int main(void) {
5284#if !defined(IOCTL_SCSI_GET_ADDRESS)
5285#error Missing required ioctl definitions
5286#endif
5287  SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
5288  return addr.Lun;
5289}
5290EOF
5291  if compile_prog "" "" ; then
5292    guest_agent_ntddscsi=yes
5293    libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
5294  fi
5295fi
5296
5297##########################################
5298# virgl renderer probe
5299
5300if test "$virglrenderer" != "no" ; then
5301  cat > $TMPC << EOF
5302#include <virglrenderer.h>
5303int main(void) { virgl_renderer_poll(); return 0; }
5304EOF
5305  virgl_cflags=$($pkg_config --cflags virglrenderer 2>/dev/null)
5306  virgl_libs=$($pkg_config --libs virglrenderer 2>/dev/null)
5307  virgl_version=$($pkg_config --modversion virglrenderer 2>/dev/null)
5308  if $pkg_config virglrenderer >/dev/null 2>&1 && \
5309     compile_prog "$virgl_cflags" "$virgl_libs" ; then
5310    virglrenderer="yes"
5311  else
5312    if test "$virglrenderer" = "yes" ; then
5313      feature_not_found "virglrenderer"
5314    fi
5315    virglrenderer="no"
5316  fi
5317fi
5318
5319##########################################
5320# capstone
5321
5322case "$capstone" in
5323  "" | yes)
5324    if $pkg_config capstone; then
5325      capstone=system
5326    elif test -e "${source_path}/.git" && test $git_update = 'yes' ; then
5327      capstone=git
5328    elif test -e "${source_path}/capstone/Makefile" ; then
5329      capstone=internal
5330    elif test -z "$capstone" ; then
5331      capstone=no
5332    else
5333      feature_not_found "capstone" "Install capstone devel or git submodule"
5334    fi
5335    ;;
5336
5337  system)
5338    if ! $pkg_config capstone; then
5339      feature_not_found "capstone" "Install capstone devel"
5340    fi
5341    ;;
5342esac
5343
5344case "$capstone" in
5345  git | internal)
5346    if test "$capstone" = git; then
5347      git_submodules="${git_submodules} capstone"
5348    fi
5349    mkdir -p capstone
5350    QEMU_CFLAGS="$QEMU_CFLAGS -I\$(SRC_PATH)/capstone/include"
5351    if test "$mingw32" = "yes"; then
5352      LIBCAPSTONE=capstone.lib
5353    else
5354      LIBCAPSTONE=libcapstone.a
5355    fi
5356    libs_cpu="-L\$(BUILD_DIR)/capstone -lcapstone $libs_cpu"
5357    ;;
5358
5359  system)
5360    QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags capstone)"
5361    libs_cpu="$($pkg_config --libs capstone) $libs_cpu"
5362    ;;
5363
5364  no)
5365    ;;
5366  *)
5367    error_exit "Unknown state for capstone: $capstone"
5368    ;;
5369esac
5370
5371##########################################
5372# check if we have fdatasync
5373
5374fdatasync=no
5375cat > $TMPC << EOF
5376#include <unistd.h>
5377int main(void) {
5378#if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
5379return fdatasync(0);
5380#else
5381#error Not supported
5382#endif
5383}
5384EOF
5385if compile_prog "" "" ; then
5386    fdatasync=yes
5387fi
5388
5389##########################################
5390# check if we have madvise
5391
5392madvise=no
5393cat > $TMPC << EOF
5394#include <sys/types.h>
5395#include <sys/mman.h>
5396#include <stddef.h>
5397int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }
5398EOF
5399if compile_prog "" "" ; then
5400    madvise=yes
5401fi
5402
5403##########################################
5404# check if we have posix_madvise
5405
5406posix_madvise=no
5407cat > $TMPC << EOF
5408#include <sys/mman.h>
5409#include <stddef.h>
5410int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }
5411EOF
5412if compile_prog "" "" ; then
5413    posix_madvise=yes
5414fi
5415
5416##########################################
5417# check if we have posix_memalign()
5418
5419posix_memalign=no
5420cat > $TMPC << EOF
5421#include <stdlib.h>
5422int main(void) {
5423    void *p;
5424    return posix_memalign(&p, 8, 8);
5425}
5426EOF
5427if compile_prog "" "" ; then
5428    posix_memalign=yes
5429fi
5430
5431##########################################
5432# check if we have posix_syslog
5433
5434posix_syslog=no
5435cat > $TMPC << EOF
5436#include <syslog.h>
5437int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; }
5438EOF
5439if compile_prog "" "" ; then
5440    posix_syslog=yes
5441fi
5442
5443##########################################
5444# check if we have sem_timedwait
5445
5446sem_timedwait=no
5447cat > $TMPC << EOF
5448#include <semaphore.h>
5449int main(void) { sem_t s; struct timespec t = {0}; return sem_timedwait(&s, &t); }
5450EOF
5451if compile_prog "" "" ; then
5452    sem_timedwait=yes
5453fi
5454
5455##########################################
5456# check if we have strchrnul
5457
5458strchrnul=no
5459cat > $TMPC << EOF
5460#include <string.h>
5461int main(void);
5462// Use a haystack that the compiler shouldn't be able to constant fold
5463char *haystack = (char*)&main;
5464int main(void) { return strchrnul(haystack, 'x') != &haystack[6]; }
5465EOF
5466if compile_prog "" "" ; then
5467    strchrnul=yes
5468fi
5469
5470#########################################
5471# check if we have st_atim
5472
5473st_atim=no
5474cat > $TMPC << EOF
5475#include <sys/stat.h>
5476#include <stddef.h>
5477int main(void) { return offsetof(struct stat, st_atim); }
5478EOF
5479if compile_prog "" "" ; then
5480    st_atim=yes
5481fi
5482
5483##########################################
5484# check if trace backend exists
5485
5486$python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
5487if test "$?" -ne 0 ; then
5488  error_exit "invalid trace backends" \
5489      "Please choose supported trace backends."
5490fi
5491
5492##########################################
5493# For 'ust' backend, test if ust headers are present
5494if have_backend "ust"; then
5495  cat > $TMPC << EOF
5496#include <lttng/tracepoint.h>
5497int main(void) { return 0; }
5498EOF
5499  if compile_prog "" "-Wl,--no-as-needed -ldl" ; then
5500    if $pkg_config lttng-ust --exists; then
5501      lttng_ust_libs=$($pkg_config --libs lttng-ust)
5502    else
5503      lttng_ust_libs="-llttng-ust -ldl"
5504    fi
5505    if $pkg_config liburcu-bp --exists; then
5506      urcu_bp_libs=$($pkg_config --libs liburcu-bp)
5507    else
5508      urcu_bp_libs="-lurcu-bp"
5509    fi
5510
5511    LIBS="$lttng_ust_libs $urcu_bp_libs $LIBS"
5512    libs_qga="$lttng_ust_libs $urcu_bp_libs $libs_qga"
5513  else
5514    error_exit "Trace backend 'ust' missing lttng-ust header files"
5515  fi
5516fi
5517
5518##########################################
5519# For 'dtrace' backend, test if 'dtrace' command is present
5520if have_backend "dtrace"; then
5521  if ! has 'dtrace' ; then
5522    error_exit "dtrace command is not found in PATH $PATH"
5523  fi
5524  trace_backend_stap="no"
5525  if has 'stap' ; then
5526    trace_backend_stap="yes"
5527  fi
5528fi
5529
5530##########################################
5531# check and set a backend for coroutine
5532
5533# We prefer ucontext, but it's not always possible. The fallback
5534# is sigcontext. On Windows the only valid backend is the Windows
5535# specific one.
5536
5537ucontext_works=no
5538if test "$darwin" != "yes"; then
5539  cat > $TMPC << EOF
5540#include <ucontext.h>
5541#ifdef __stub_makecontext
5542#error Ignoring glibc stub makecontext which will always fail
5543#endif
5544int main(void) { makecontext(0, 0, 0); return 0; }
5545EOF
5546  if compile_prog "" "" ; then
5547    ucontext_works=yes
5548  fi
5549fi
5550
5551if test "$coroutine" = ""; then
5552  if test "$mingw32" = "yes"; then
5553    coroutine=win32
5554  elif test "$ucontext_works" = "yes"; then
5555    coroutine=ucontext
5556  else
5557    coroutine=sigaltstack
5558  fi
5559else
5560  case $coroutine in
5561  windows)
5562    if test "$mingw32" != "yes"; then
5563      error_exit "'windows' coroutine backend only valid for Windows"
5564    fi
5565    # Unfortunately the user visible backend name doesn't match the
5566    # coroutine-*.c filename for this case, so we have to adjust it here.
5567    coroutine=win32
5568    ;;
5569  ucontext)
5570    if test "$ucontext_works" != "yes"; then
5571      feature_not_found "ucontext"
5572    fi
5573    ;;
5574  sigaltstack)
5575    if test "$mingw32" = "yes"; then
5576      error_exit "only the 'windows' coroutine backend is valid for Windows"
5577    fi
5578    ;;
5579  *)
5580    error_exit "unknown coroutine backend $coroutine"
5581    ;;
5582  esac
5583fi
5584
5585if test "$coroutine_pool" = ""; then
5586  coroutine_pool=yes
5587fi
5588
5589if test "$debug_stack_usage" = "yes"; then
5590  if test "$coroutine_pool" = "yes"; then
5591    echo "WARN: disabling coroutine pool for stack usage debugging"
5592    coroutine_pool=no
5593  fi
5594fi
5595
5596##################################################
5597# SafeStack
5598
5599
5600if test "$safe_stack" = "yes"; then
5601cat > $TMPC << EOF
5602int main(int argc, char *argv[])
5603{
5604#if ! __has_feature(safe_stack)
5605#error SafeStack Disabled
5606#endif
5607    return 0;
5608}
5609EOF
5610  flag="-fsanitize=safe-stack"
5611  # Check that safe-stack is supported and enabled.
5612  if compile_prog "-Werror $flag" "$flag"; then
5613    # Flag needed both at compilation and at linking
5614    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
5615    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
5616  else
5617    error_exit "SafeStack not supported by your compiler"
5618  fi
5619  if test "$coroutine" != "ucontext"; then
5620    error_exit "SafeStack is only supported by the coroutine backend ucontext"
5621  fi
5622else
5623cat > $TMPC << EOF
5624int main(int argc, char *argv[])
5625{
5626#if defined(__has_feature)
5627#if __has_feature(safe_stack)
5628#error SafeStack Enabled
5629#endif
5630#endif
5631    return 0;
5632}
5633EOF
5634if test "$safe_stack" = "no"; then
5635  # Make sure that safe-stack is disabled
5636  if ! compile_prog "-Werror" ""; then
5637    # SafeStack was already enabled, try to explicitly remove the feature
5638    flag="-fno-sanitize=safe-stack"
5639    if ! compile_prog "-Werror $flag" "$flag"; then
5640      error_exit "Configure cannot disable SafeStack"
5641    fi
5642    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
5643    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
5644  fi
5645else # "$safe_stack" = ""
5646  # Set safe_stack to yes or no based on pre-existing flags
5647  if compile_prog "-Werror" ""; then
5648    safe_stack="no"
5649  else
5650    safe_stack="yes"
5651    if test "$coroutine" != "ucontext"; then
5652      error_exit "SafeStack is only supported by the coroutine backend ucontext"
5653    fi
5654  fi
5655fi
5656fi
5657
5658##########################################
5659# check if we have open_by_handle_at
5660
5661open_by_handle_at=no
5662cat > $TMPC << EOF
5663#include <fcntl.h>
5664#if !defined(AT_EMPTY_PATH)
5665# error missing definition
5666#else
5667int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
5668#endif
5669EOF
5670if compile_prog "" "" ; then
5671    open_by_handle_at=yes
5672fi
5673
5674########################################
5675# check if we have linux/magic.h
5676
5677linux_magic_h=no
5678cat > $TMPC << EOF
5679#include <linux/magic.h>
5680int main(void) {
5681  return 0;
5682}
5683EOF
5684if compile_prog "" "" ; then
5685    linux_magic_h=yes
5686fi
5687
5688########################################
5689# check whether we can disable warning option with a pragma (this is needed
5690# to silence warnings in the headers of some versions of external libraries).
5691# This test has to be compiled with -Werror as otherwise an unknown pragma is
5692# only a warning.
5693#
5694# If we can't selectively disable warning in the code, disable -Werror so that
5695# the build doesn't fail anyway.
5696
5697pragma_disable_unused_but_set=no
5698cat > $TMPC << EOF
5699#pragma GCC diagnostic push
5700#pragma GCC diagnostic ignored "-Wstrict-prototypes"
5701#pragma GCC diagnostic pop
5702
5703int main(void) {
5704    return 0;
5705}
5706EOF
5707if compile_prog "-Werror" "" ; then
5708    pragma_diagnostic_available=yes
5709else
5710    werror=no
5711fi
5712
5713########################################
5714# check if we have valgrind/valgrind.h
5715
5716valgrind_h=no
5717cat > $TMPC << EOF
5718#include <valgrind/valgrind.h>
5719int main(void) {
5720  return 0;
5721}
5722EOF
5723if compile_prog "" "" ; then
5724    valgrind_h=yes
5725fi
5726
5727########################################
5728# check if environ is declared
5729
5730has_environ=no
5731cat > $TMPC << EOF
5732#include <unistd.h>
5733int main(void) {
5734    environ = 0;
5735    return 0;
5736}
5737EOF
5738if compile_prog "" "" ; then
5739    has_environ=yes
5740fi
5741
5742########################################
5743# check if cpuid.h is usable.
5744
5745cat > $TMPC << EOF
5746#include <cpuid.h>
5747int main(void) {
5748    unsigned a, b, c, d;
5749    int max = __get_cpuid_max(0, 0);
5750
5751    if (max >= 1) {
5752        __cpuid(1, a, b, c, d);
5753    }
5754
5755    if (max >= 7) {
5756        __cpuid_count(7, 0, a, b, c, d);
5757    }
5758
5759    return 0;
5760}
5761EOF
5762if compile_prog "" "" ; then
5763    cpuid_h=yes
5764fi
5765
5766##########################################
5767# avx2 optimization requirement check
5768#
5769# There is no point enabling this if cpuid.h is not usable,
5770# since we won't be able to select the new routines.
5771
5772if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
5773  cat > $TMPC << EOF
5774#pragma GCC push_options
5775#pragma GCC target("avx2")
5776#include <cpuid.h>
5777#include <immintrin.h>
5778static int bar(void *a) {
5779    __m256i x = *(__m256i *)a;
5780    return _mm256_testz_si256(x, x);
5781}
5782int main(int argc, char *argv[]) { return bar(argv[0]); }
5783EOF
5784  if compile_object "" ; then
5785    avx2_opt="yes"
5786  else
5787    avx2_opt="no"
5788  fi
5789fi
5790
5791##########################################
5792# avx512f optimization requirement check
5793#
5794# There is no point enabling this if cpuid.h is not usable,
5795# since we won't be able to select the new routines.
5796# by default, it is turned off.
5797# if user explicitly want to enable it, check environment
5798
5799if test "$cpuid_h" = "yes" && test "$avx512f_opt" = "yes"; then
5800  cat > $TMPC << EOF
5801#pragma GCC push_options
5802#pragma GCC target("avx512f")
5803#include <cpuid.h>
5804#include <immintrin.h>
5805static int bar(void *a) {
5806    __m512i x = *(__m512i *)a;
5807    return _mm512_test_epi64_mask(x, x);
5808}
5809int main(int argc, char *argv[])
5810{
5811	return bar(argv[0]);
5812}
5813EOF
5814  if ! compile_object "" ; then
5815    avx512f_opt="no"
5816  fi
5817else
5818  avx512f_opt="no"
5819fi
5820
5821########################################
5822# check if __[u]int128_t is usable.
5823
5824int128=no
5825cat > $TMPC << EOF
5826__int128_t a;
5827__uint128_t b;
5828int main (void) {
5829  a = a + b;
5830  b = a * b;
5831  a = a * a;
5832  return 0;
5833}
5834EOF
5835if compile_prog "" "" ; then
5836    int128=yes
5837fi
5838
5839#########################################
5840# See if 128-bit atomic operations are supported.
5841
5842atomic128=no
5843if test "$int128" = "yes"; then
5844  cat > $TMPC << EOF
5845int main(void)
5846{
5847  unsigned __int128 x = 0, y = 0;
5848  y = __atomic_load_16(&x, 0);
5849  __atomic_store_16(&x, y, 0);
5850  __atomic_compare_exchange_16(&x, &y, x, 0, 0, 0);
5851  return 0;
5852}
5853EOF
5854  if compile_prog "" "" ; then
5855    atomic128=yes
5856  fi
5857fi
5858
5859cmpxchg128=no
5860if test "$int128" = yes && test "$atomic128" = no; then
5861  cat > $TMPC << EOF
5862int main(void)
5863{
5864  unsigned __int128 x = 0, y = 0;
5865  __sync_val_compare_and_swap_16(&x, y, x);
5866  return 0;
5867}
5868EOF
5869  if compile_prog "" "" ; then
5870    cmpxchg128=yes
5871  fi
5872fi
5873
5874#########################################
5875# See if 64-bit atomic operations are supported.
5876# Note that without __atomic builtins, we can only
5877# assume atomic loads/stores max at pointer size.
5878
5879cat > $TMPC << EOF
5880#include <stdint.h>
5881int main(void)
5882{
5883  uint64_t x = 0, y = 0;
5884#ifdef __ATOMIC_RELAXED
5885  y = __atomic_load_8(&x, 0);
5886  __atomic_store_8(&x, y, 0);
5887  __atomic_compare_exchange_8(&x, &y, x, 0, 0, 0);
5888  __atomic_exchange_8(&x, y, 0);
5889  __atomic_fetch_add_8(&x, y, 0);
5890#else
5891  typedef char is_host64[sizeof(void *) >= sizeof(uint64_t) ? 1 : -1];
5892  __sync_lock_test_and_set(&x, y);
5893  __sync_val_compare_and_swap(&x, y, 0);
5894  __sync_fetch_and_add(&x, y);
5895#endif
5896  return 0;
5897}
5898EOF
5899if compile_prog "" "" ; then
5900  atomic64=yes
5901fi
5902
5903#########################################
5904# See if --dynamic-list is supported by the linker
5905ld_dynamic_list="no"
5906if test "$static" = "no" ; then
5907    cat > $TMPTXT <<EOF
5908{
5909  foo;
5910};
5911EOF
5912
5913    cat > $TMPC <<EOF
5914#include <stdio.h>
5915void foo(void);
5916
5917void foo(void)
5918{
5919  printf("foo\n");
5920}
5921
5922int main(void)
5923{
5924  foo();
5925  return 0;
5926}
5927EOF
5928
5929    if compile_prog "" "-Wl,--dynamic-list=$TMPTXT" ; then
5930        ld_dynamic_list="yes"
5931    fi
5932fi
5933
5934#########################################
5935# See if -exported_symbols_list is supported by the linker
5936
5937ld_exported_symbols_list="no"
5938if test "$static" = "no" ; then
5939    cat > $TMPTXT <<EOF
5940  _foo
5941EOF
5942
5943    if compile_prog "" "-Wl,-exported_symbols_list,$TMPTXT" ; then
5944        ld_exported_symbols_list="yes"
5945    fi
5946fi
5947
5948if  test "$plugins" = "yes" &&
5949    test "$ld_dynamic_list" = "no" &&
5950    test "$ld_exported_symbols_list" = "no" ; then
5951  error_exit \
5952      "Plugin support requires dynamic linking and specifying a set of symbols " \
5953      "that are exported to plugins. Unfortunately your linker doesn't " \
5954      "support the flag (--dynamic-list or -exported_symbols_list) used " \
5955      "for this purpose. You can't build with --static."
5956fi
5957
5958########################################
5959# See if __attribute__((alias)) is supported.
5960# This false for Xcode 9, but has been remedied for Xcode 10.
5961# Unfortunately, travis uses Xcode 9 by default.
5962
5963attralias=no
5964cat > $TMPC << EOF
5965int x = 1;
5966extern const int y __attribute__((alias("x")));
5967int main(void) { return 0; }
5968EOF
5969if compile_prog "" "" ; then
5970    attralias=yes
5971fi
5972
5973########################################
5974# check if getauxval is available.
5975
5976getauxval=no
5977cat > $TMPC << EOF
5978#include <sys/auxv.h>
5979int main(void) {
5980  return getauxval(AT_HWCAP) == 0;
5981}
5982EOF
5983if compile_prog "" "" ; then
5984    getauxval=yes
5985fi
5986
5987########################################
5988# check if ccache is interfering with
5989# semantic analysis of macros
5990
5991unset CCACHE_CPP2
5992ccache_cpp2=no
5993cat > $TMPC << EOF
5994static const int Z = 1;
5995#define fn() ({ Z; })
5996#define TAUT(X) ((X) == Z)
5997#define PAREN(X, Y) (X == Y)
5998#define ID(X) (X)
5999int main(int argc, char *argv[])
6000{
6001    int x = 0, y = 0;
6002    x = ID(x);
6003    x = fn();
6004    fn();
6005    if (PAREN(x, y)) return 0;
6006    if (TAUT(Z)) return 0;
6007    return 0;
6008}
6009EOF
6010
6011if ! compile_object "-Werror"; then
6012    ccache_cpp2=yes
6013fi
6014
6015#################################################
6016# clang does not support glibc + FORTIFY_SOURCE.
6017
6018if test "$fortify_source" != "no"; then
6019  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
6020    fortify_source="no";
6021  elif test -n "$cxx" && has $cxx &&
6022       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
6023    fortify_source="no";
6024  else
6025    fortify_source="yes"
6026  fi
6027fi
6028
6029###############################################
6030# Check if copy_file_range is provided by glibc
6031have_copy_file_range=no
6032cat > $TMPC << EOF
6033#include <unistd.h>
6034int main(void) {
6035  copy_file_range(0, NULL, 0, NULL, 0, 0);
6036  return 0;
6037}
6038EOF
6039if compile_prog "" "" ; then
6040    have_copy_file_range=yes
6041fi
6042
6043##########################################
6044# check if struct fsxattr is available via linux/fs.h
6045
6046have_fsxattr=no
6047cat > $TMPC << EOF
6048#include <linux/fs.h>
6049struct fsxattr foo;
6050int main(void) {
6051  return 0;
6052}
6053EOF
6054if compile_prog "" "" ; then
6055    have_fsxattr=yes
6056fi
6057
6058##########################################
6059# check for usable membarrier system call
6060if test "$membarrier" = "yes"; then
6061    have_membarrier=no
6062    if test "$mingw32" = "yes" ; then
6063        have_membarrier=yes
6064    elif test "$linux" = "yes" ; then
6065        cat > $TMPC << EOF
6066    #include <linux/membarrier.h>
6067    #include <sys/syscall.h>
6068    #include <unistd.h>
6069    #include <stdlib.h>
6070    int main(void) {
6071        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
6072        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
6073	exit(0);
6074    }
6075EOF
6076        if compile_prog "" "" ; then
6077            have_membarrier=yes
6078        fi
6079    fi
6080    if test "$have_membarrier" = "no"; then
6081      feature_not_found "membarrier" "membarrier system call not available"
6082    fi
6083else
6084    # Do not enable it by default even for Mingw32, because it doesn't
6085    # work on Wine.
6086    membarrier=no
6087fi
6088
6089##########################################
6090# check if rtnetlink.h exists and is useful
6091have_rtnetlink=no
6092cat > $TMPC << EOF
6093#include <linux/rtnetlink.h>
6094int main(void) {
6095  return IFLA_PROTO_DOWN;
6096}
6097EOF
6098if compile_prog "" "" ; then
6099    have_rtnetlink=yes
6100fi
6101
6102##########################################
6103# check for usable AF_VSOCK environment
6104have_af_vsock=no
6105cat > $TMPC << EOF
6106#include <errno.h>
6107#include <sys/types.h>
6108#include <sys/socket.h>
6109#if !defined(AF_VSOCK)
6110# error missing AF_VSOCK flag
6111#endif
6112#include <linux/vm_sockets.h>
6113int main(void) {
6114    int sock, ret;
6115    struct sockaddr_vm svm;
6116    socklen_t len = sizeof(svm);
6117    sock = socket(AF_VSOCK, SOCK_STREAM, 0);
6118    ret = getpeername(sock, (struct sockaddr *)&svm, &len);
6119    if ((ret == -1) && (errno == ENOTCONN)) {
6120        return 0;
6121    }
6122    return -1;
6123}
6124EOF
6125if compile_prog "" "" ; then
6126    have_af_vsock=yes
6127fi
6128
6129##########################################
6130# check for usable AF_ALG environment
6131have_afalg=no
6132cat > $TMPC << EOF
6133#include <errno.h>
6134#include <sys/types.h>
6135#include <sys/socket.h>
6136#include <linux/if_alg.h>
6137int main(void) {
6138    int sock;
6139    sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
6140    return sock;
6141}
6142EOF
6143if compile_prog "" "" ; then
6144    have_afalg=yes
6145fi
6146if test "$crypto_afalg" = "yes"
6147then
6148    if test "$have_afalg" != "yes"
6149    then
6150	error_exit "AF_ALG requested but could not be detected"
6151    fi
6152fi
6153
6154
6155#################################################
6156# Check to see if we have the Hypervisor framework
6157if [ "$darwin" = "yes" ] ; then
6158  cat > $TMPC << EOF
6159#include <Hypervisor/hv.h>
6160int main() { return 0;}
6161EOF
6162  if ! compile_object ""; then
6163    hvf='no'
6164  else
6165    hvf='yes'
6166    QEMU_LDFLAGS="-framework Hypervisor $QEMU_LDFLAGS"
6167  fi
6168fi
6169
6170#################################################
6171# Sparc implicitly links with --relax, which is
6172# incompatible with -r, so --no-relax should be
6173# given. It does no harm to give it on other
6174# platforms too.
6175
6176# Note: the prototype is needed since QEMU_CFLAGS
6177#       contains -Wmissing-prototypes
6178cat > $TMPC << EOF
6179extern int foo(void);
6180int foo(void) { return 0; }
6181EOF
6182if ! compile_object ""; then
6183  error_exit "Failed to compile object file for LD_REL_FLAGS test"
6184fi
6185for i in '-Wl,-r -Wl,--no-relax' -Wl,-r -r; do
6186  if do_cc -nostdlib $i -o $TMPMO $TMPO; then
6187    LD_REL_FLAGS=$i
6188    break
6189  fi
6190done
6191if test "$modules" = "yes" && test "$LD_REL_FLAGS" = ""; then
6192  feature_not_found "modules" "Cannot find how to build relocatable objects"
6193fi
6194
6195##########################################
6196# check for sysmacros.h
6197
6198have_sysmacros=no
6199cat > $TMPC << EOF
6200#include <sys/sysmacros.h>
6201int main(void) {
6202    return makedev(0, 0);
6203}
6204EOF
6205if compile_prog "" "" ; then
6206    have_sysmacros=yes
6207fi
6208
6209##########################################
6210# Veritas HyperScale block driver VxHS
6211# Check if libvxhs is installed
6212
6213if test "$vxhs" != "no" ; then
6214  cat > $TMPC <<EOF
6215#include <stdint.h>
6216#include <qnio/qnio_api.h>
6217
6218void *vxhs_callback;
6219
6220int main(void) {
6221    iio_init(QNIO_VERSION, vxhs_callback);
6222    return 0;
6223}
6224EOF
6225  vxhs_libs="-lvxhs -lssl"
6226  if compile_prog "" "$vxhs_libs" ; then
6227    vxhs=yes
6228  else
6229    if test "$vxhs" = "yes" ; then
6230      feature_not_found "vxhs block device" "Install libvxhs See github"
6231    fi
6232    vxhs=no
6233  fi
6234fi
6235
6236##########################################
6237# check for _Static_assert()
6238
6239have_static_assert=no
6240cat > $TMPC << EOF
6241_Static_assert(1, "success");
6242int main(void) {
6243    return 0;
6244}
6245EOF
6246if compile_prog "" "" ; then
6247    have_static_assert=yes
6248fi
6249
6250##########################################
6251# check for utmpx.h, it is missing e.g. on OpenBSD
6252
6253have_utmpx=no
6254cat > $TMPC << EOF
6255#include <utmpx.h>
6256struct utmpx user_info;
6257int main(void) {
6258    return 0;
6259}
6260EOF
6261if compile_prog "" "" ; then
6262    have_utmpx=yes
6263fi
6264
6265##########################################
6266# check for getrandom()
6267
6268have_getrandom=no
6269cat > $TMPC << EOF
6270#include <sys/random.h>
6271int main(void) {
6272    return getrandom(0, 0, GRND_NONBLOCK);
6273}
6274EOF
6275if compile_prog "" "" ; then
6276    have_getrandom=yes
6277fi
6278
6279##########################################
6280# checks for sanitizers
6281
6282have_asan=no
6283have_ubsan=no
6284have_asan_iface_h=no
6285have_asan_iface_fiber=no
6286
6287if test "$sanitizers" = "yes" ; then
6288  write_c_skeleton
6289  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
6290      have_asan=yes
6291  fi
6292
6293  # we could use a simple skeleton for flags checks, but this also
6294  # detect the static linking issue of ubsan, see also:
6295  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
6296  cat > $TMPC << EOF
6297#include <stdlib.h>
6298int main(void) {
6299    void *tmp = malloc(10);
6300    if (tmp != NULL) {
6301        return *(int *)(tmp + 2);
6302    }
6303}
6304EOF
6305  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
6306      have_ubsan=yes
6307  fi
6308
6309  if check_include "sanitizer/asan_interface.h" ; then
6310      have_asan_iface_h=yes
6311  fi
6312
6313  cat > $TMPC << EOF
6314#include <sanitizer/asan_interface.h>
6315int main(void) {
6316  __sanitizer_start_switch_fiber(0, 0, 0);
6317  return 0;
6318}
6319EOF
6320  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
6321      have_asan_iface_fiber=yes
6322  fi
6323fi
6324
6325##########################################
6326# checks for fuzzer
6327if test "$fuzzing" = "yes" ; then
6328  write_c_fuzzer_skeleton
6329  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address,fuzzer" ""; then
6330      have_fuzzer=yes
6331  fi
6332fi
6333
6334# Thread sanitizer is, for now, much noisier than the other sanitizers;
6335# keep it separate until that is not the case.
6336if test "$tsan" = "yes" && test "$sanitizers" = "yes"; then
6337  error_exit "TSAN is not supported with other sanitiziers."
6338fi
6339have_tsan=no
6340have_tsan_iface_fiber=no
6341if test "$tsan" = "yes" ; then
6342  write_c_skeleton
6343  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
6344      have_tsan=yes
6345  fi
6346  cat > $TMPC << EOF
6347#include <sanitizer/tsan_interface.h>
6348int main(void) {
6349  __tsan_create_fiber(0);
6350  return 0;
6351}
6352EOF
6353  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
6354      have_tsan_iface_fiber=yes
6355  fi
6356fi
6357
6358##########################################
6359# check for libpmem
6360
6361if test "$libpmem" != "no"; then
6362	if $pkg_config --exists "libpmem"; then
6363		libpmem="yes"
6364		libpmem_libs=$($pkg_config --libs libpmem)
6365		libpmem_cflags=$($pkg_config --cflags libpmem)
6366		libs_softmmu="$libs_softmmu $libpmem_libs"
6367		QEMU_CFLAGS="$QEMU_CFLAGS $libpmem_cflags"
6368	else
6369		if test "$libpmem" = "yes" ; then
6370			feature_not_found "libpmem" "Install nvml or pmdk"
6371		fi
6372		libpmem="no"
6373	fi
6374fi
6375
6376##########################################
6377# check for libdaxctl
6378
6379if test "$libdaxctl" != "no"; then
6380	if $pkg_config --atleast-version=57 "libdaxctl"; then
6381		libdaxctl="yes"
6382		libdaxctl_libs=$($pkg_config --libs libdaxctl)
6383		libdaxctl_cflags=$($pkg_config --cflags libdaxctl)
6384		libs_softmmu="$libs_softmmu $libdaxctl_libs"
6385		QEMU_CFLAGS="$QEMU_CFLAGS $libdaxctl_cflags"
6386	else
6387		if test "$libdaxctl" = "yes" ; then
6388			feature_not_found "libdaxctl" "Install libdaxctl"
6389		fi
6390		libdaxctl="no"
6391	fi
6392fi
6393
6394##########################################
6395# check for slirp
6396
6397# slirp is only required when building softmmu targets
6398if test -z "$slirp" -a "$softmmu" != "yes" ; then
6399    slirp="no"
6400fi
6401
6402case "$slirp" in
6403  "" | yes)
6404    if $pkg_config slirp; then
6405      slirp=system
6406    elif test -e "${source_path}/.git" && test $git_update = 'yes' ; then
6407      slirp=git
6408    elif test -e "${source_path}/slirp/Makefile" ; then
6409      slirp=internal
6410    elif test -z "$slirp" ; then
6411      slirp=no
6412    else
6413      feature_not_found "slirp" "Install slirp devel or git submodule"
6414    fi
6415    ;;
6416
6417  system)
6418    if ! $pkg_config slirp; then
6419      feature_not_found "slirp" "Install slirp devel"
6420    fi
6421    ;;
6422esac
6423
6424case "$slirp" in
6425  git | internal)
6426    if test "$slirp" = git; then
6427      git_submodules="${git_submodules} slirp"
6428    fi
6429    mkdir -p slirp
6430    slirp_cflags="-I\$(SRC_PATH)/slirp/src -I\$(BUILD_DIR)/slirp/src"
6431    slirp_libs="-L\$(BUILD_DIR)/slirp -lslirp"
6432    if test "$mingw32" = "yes" ; then
6433      slirp_libs="$slirp_libs -lws2_32 -liphlpapi"
6434    fi
6435    ;;
6436
6437  system)
6438    slirp_version=$($pkg_config --modversion slirp 2>/dev/null)
6439    slirp_cflags=$($pkg_config --cflags slirp 2>/dev/null)
6440    slirp_libs=$($pkg_config --libs slirp 2>/dev/null)
6441    ;;
6442
6443  no)
6444    ;;
6445  *)
6446    error_exit "Unknown state for slirp: $slirp"
6447    ;;
6448esac
6449
6450##########################################
6451# check for usable __NR_keyctl syscall
6452
6453if test "$linux" = "yes" ; then
6454
6455    have_keyring=no
6456    cat > $TMPC << EOF
6457#include <errno.h>
6458#include <asm/unistd.h>
6459#include <linux/keyctl.h>
6460#include <unistd.h>
6461int main(void) {
6462    return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
6463}
6464EOF
6465    if compile_prog "" "" ; then
6466        have_keyring=yes
6467    fi
6468fi
6469if test "$secret_keyring" != "no"
6470then
6471    if test "$have_keyring" == "yes"
6472    then
6473	secret_keyring=yes
6474    else
6475	if test "$secret_keyring" = "yes"
6476	then
6477	    error_exit "syscall __NR_keyctl requested, \
6478but not implemented on your system"
6479	else
6480	    secret_keyring=no
6481	fi
6482    fi
6483fi
6484
6485##########################################
6486# check for usable keyutils.h
6487
6488if test "$linux" = "yes" ; then
6489
6490    have_keyutils=no
6491    cat > $TMPC << EOF
6492#include <errno.h>
6493#include <asm/unistd.h>
6494#include <unistd.h>
6495#include <sys/types.h>
6496#include <keyutils.h>
6497int main(void) {
6498    return request_key("user", NULL, NULL, 0);
6499}
6500EOF
6501    if compile_prog "" "-lkeyutils"; then
6502        have_keyutils=yes
6503    fi
6504fi
6505
6506
6507##########################################
6508# End of CC checks
6509# After here, no more $cc or $ld runs
6510
6511write_c_skeleton
6512
6513if test "$gcov" = "yes" ; then
6514  QEMU_CFLAGS="-fprofile-arcs -ftest-coverage -g $QEMU_CFLAGS"
6515  QEMU_LDFLAGS="-fprofile-arcs -ftest-coverage $QEMU_LDFLAGS"
6516elif test "$fortify_source" = "yes" ; then
6517  CFLAGS="-O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $CFLAGS"
6518elif test "$debug" = "no"; then
6519  CFLAGS="-O2 $CFLAGS"
6520fi
6521
6522if test "$have_asan" = "yes"; then
6523  QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
6524  QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
6525  if test "$have_asan_iface_h" = "no" ; then
6526      echo "ASAN build enabled, but ASAN header missing." \
6527           "Without code annotation, the report may be inferior."
6528  elif test "$have_asan_iface_fiber" = "no" ; then
6529      echo "ASAN build enabled, but ASAN header is too old." \
6530           "Without code annotation, the report may be inferior."
6531  fi
6532fi
6533if test "$have_tsan" = "yes" ; then
6534  if test "$have_tsan_iface_fiber" = "yes" ; then
6535    QEMU_CFLAGS="-fsanitize=thread $QEMU_CFLAGS"
6536    QEMU_LDFLAGS="-fsanitize=thread $QEMU_LDFLAGS"
6537  else
6538    error_exit "Cannot enable TSAN due to missing fiber annotation interface."
6539  fi
6540elif test "$tsan" = "yes" ; then
6541  error_exit "Cannot enable TSAN due to missing sanitize thread interface."
6542fi
6543if test "$have_ubsan" = "yes"; then
6544  QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS"
6545  QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
6546fi
6547
6548##########################################
6549# Do we have libnfs
6550if test "$libnfs" != "no" ; then
6551  if $pkg_config --atleast-version=1.9.3 libnfs; then
6552    libnfs="yes"
6553    libnfs_libs=$($pkg_config --libs libnfs)
6554  else
6555    if test "$libnfs" = "yes" ; then
6556      feature_not_found "libnfs" "Install libnfs devel >= 1.9.3"
6557    fi
6558    libnfs="no"
6559  fi
6560fi
6561
6562##########################################
6563# Do we have libudev
6564if test "$libudev" != "no" ; then
6565  if $pkg_config libudev && test "$static" != "yes"; then
6566    libudev="yes"
6567    libudev_libs=$($pkg_config --libs libudev)
6568  else
6569    libudev="no"
6570  fi
6571fi
6572
6573# Now we've finished running tests it's OK to add -Werror to the compiler flags
6574if test "$werror" = "yes"; then
6575    QEMU_CFLAGS="-Werror $QEMU_CFLAGS"
6576fi
6577
6578# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
6579if test "$solaris" = "no" && test "$tsan" = "no"; then
6580    if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
6581        QEMU_LDFLAGS="-Wl,--warn-common $QEMU_LDFLAGS"
6582    fi
6583fi
6584
6585# test if pod2man has --utf8 option
6586if pod2man --help | grep -q utf8; then
6587    POD2MAN="pod2man --utf8"
6588else
6589    POD2MAN="pod2man"
6590fi
6591
6592# Use ASLR, no-SEH and DEP if available
6593if test "$mingw32" = "yes" ; then
6594    for flag in --dynamicbase --no-seh --nxcompat; do
6595        if ld_has $flag ; then
6596            QEMU_LDFLAGS="-Wl,$flag $QEMU_LDFLAGS"
6597        fi
6598    done
6599fi
6600
6601# Disable OpenBSD W^X if available
6602if test "$tcg" = "yes" && test "$targetos" = "OpenBSD"; then
6603    cat > $TMPC <<EOF
6604    int main(void) { return 0; }
6605EOF
6606    wx_ldflags="-Wl,-z,wxneeded"
6607    if compile_prog "" "$wx_ldflags"; then
6608        QEMU_LDFLAGS="$QEMU_LDFLAGS $wx_ldflags"
6609    fi
6610fi
6611
6612qemu_confdir=$sysconfdir$confsuffix
6613qemu_moddir=$libdir$confsuffix
6614qemu_datadir=$datadir$confsuffix
6615qemu_localedir="$datadir/locale"
6616qemu_icondir="$datadir/icons"
6617qemu_desktopdir="$datadir/applications"
6618
6619# We can only support ivshmem if we have eventfd
6620if [ "$eventfd" = "yes" ]; then
6621  ivshmem=yes
6622fi
6623
6624tools=""
6625if test "$want_tools" = "yes" ; then
6626  tools="qemu-img\$(EXESUF) qemu-io\$(EXESUF) qemu-edid\$(EXESUF) $tools"
6627  if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" ] ; then
6628    tools="qemu-nbd\$(EXESUF) qemu-storage-daemon\$(EXESUF) $tools"
6629  fi
6630  if [ "$ivshmem" = "yes" ]; then
6631    tools="ivshmem-client\$(EXESUF) ivshmem-server\$(EXESUF) $tools"
6632  fi
6633  if [ "$curl" = "yes" ]; then
6634      tools="elf2dmp\$(EXESUF) $tools"
6635  fi
6636fi
6637if test "$softmmu" = yes ; then
6638  if test "$linux" = yes; then
6639    if test "$virtfs" != no && test "$cap_ng" = yes && test "$attr" = yes ; then
6640      virtfs=yes
6641      helpers="$helpers fsdev/virtfs-proxy-helper\$(EXESUF)"
6642    else
6643      if test "$virtfs" = yes; then
6644        error_exit "VirtFS requires libcap-ng devel and libattr devel"
6645      fi
6646      virtfs=no
6647    fi
6648    if test "$mpath" != no && test "$mpathpersist" = yes ; then
6649      mpath=yes
6650    else
6651      if test "$mpath" = yes; then
6652        error_exit "Multipath requires libmpathpersist devel"
6653      fi
6654      mpath=no
6655    fi
6656    helpers="$helpers scsi/qemu-pr-helper\$(EXESUF)"
6657  else
6658    if test "$virtfs" = yes; then
6659      error_exit "VirtFS is supported only on Linux"
6660    fi
6661    virtfs=no
6662    if test "$mpath" = yes; then
6663      error_exit "Multipath is supported only on Linux"
6664    fi
6665    mpath=no
6666  fi
6667  if test "$xkbcommon" = "yes"; then
6668    tools="qemu-keymap\$(EXESUF) $tools"
6669  fi
6670fi
6671
6672# Probe for guest agent support/options
6673
6674if [ "$guest_agent" != "no" ]; then
6675  if [ "$softmmu" = no -a "$want_tools" = no ] ; then
6676      guest_agent=no
6677  elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
6678      tools="qemu-ga\$(EXESUF) $tools"
6679      guest_agent=yes
6680  elif [ "$guest_agent" != yes ]; then
6681      guest_agent=no
6682  else
6683      error_exit "Guest agent is not supported on this platform"
6684  fi
6685fi
6686
6687# Guest agent Window MSI  package
6688
6689if test "$guest_agent" != yes; then
6690  if test "$guest_agent_msi" = yes; then
6691    error_exit "MSI guest agent package requires guest agent enabled"
6692  fi
6693  guest_agent_msi=no
6694elif test "$mingw32" != "yes"; then
6695  if test "$guest_agent_msi" = "yes"; then
6696    error_exit "MSI guest agent package is available only for MinGW Windows cross-compilation"
6697  fi
6698  guest_agent_msi=no
6699elif ! has wixl; then
6700  if test "$guest_agent_msi" = "yes"; then
6701    error_exit "MSI guest agent package requires wixl tool installed ( usually from msitools package )"
6702  fi
6703  guest_agent_msi=no
6704else
6705  # we support qemu-ga, mingw32, and wixl: default to MSI enabled if it wasn't
6706  # disabled explicitly
6707  if test "$guest_agent_msi" != "no"; then
6708    guest_agent_msi=yes
6709  fi
6710fi
6711
6712if test "$guest_agent_msi" = "yes"; then
6713  if test "$guest_agent_with_vss" = "yes"; then
6714    QEMU_GA_MSI_WITH_VSS="-D InstallVss"
6715  fi
6716
6717  if test "$QEMU_GA_MANUFACTURER" = ""; then
6718    QEMU_GA_MANUFACTURER=QEMU
6719  fi
6720
6721  if test "$QEMU_GA_DISTRO" = ""; then
6722    QEMU_GA_DISTRO=Linux
6723  fi
6724
6725  if test "$QEMU_GA_VERSION" = ""; then
6726      QEMU_GA_VERSION=$(cat $source_path/VERSION)
6727  fi
6728
6729  QEMU_GA_MSI_MINGW_DLL_PATH="-D Mingw_dlls=$($pkg_config --variable=prefix glib-2.0)/bin"
6730
6731  case "$cpu" in
6732  x86_64)
6733    QEMU_GA_MSI_ARCH="-a x64 -D Arch=64"
6734    ;;
6735  i386)
6736    QEMU_GA_MSI_ARCH="-D Arch=32"
6737    ;;
6738  *)
6739    error_exit "CPU $cpu not supported for building installation package"
6740    ;;
6741  esac
6742fi
6743
6744# Mac OS X ships with a broken assembler
6745roms=
6746if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
6747        test "$targetos" != "Darwin" && test "$targetos" != "SunOS" && \
6748        test "$softmmu" = yes ; then
6749    # Different host OS linkers have different ideas about the name of the ELF
6750    # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
6751    # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
6752    for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
6753        if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
6754            ld_i386_emulation="$emu"
6755            roms="optionrom"
6756            break
6757        fi
6758    done
6759fi
6760
6761# Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
6762if test "$cpu" = "s390x" ; then
6763  write_c_skeleton
6764  if compile_prog "-march=z900" ""; then
6765    roms="$roms s390-ccw"
6766    # SLOF is required for building the s390-ccw firmware on s390x,
6767    # since it is using the libnet code from SLOF for network booting.
6768    if test -e "${source_path}/.git" ; then
6769      git_submodules="${git_submodules} roms/SLOF"
6770    fi
6771  fi
6772fi
6773
6774# Check that the C++ compiler exists and works with the C compiler.
6775# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
6776if has $cxx; then
6777    cat > $TMPC <<EOF
6778int c_function(void);
6779int main(void) { return c_function(); }
6780EOF
6781
6782    compile_object
6783
6784    cat > $TMPCXX <<EOF
6785extern "C" {
6786   int c_function(void);
6787}
6788int c_function(void) { return 42; }
6789EOF
6790
6791    update_cxxflags
6792
6793    if do_cxx $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
6794        # C++ compiler $cxx works ok with C compiler $cc
6795        :
6796    else
6797        echo "C++ compiler $cxx does not work with C compiler $cc"
6798        echo "Disabling C++ specific optional code"
6799        cxx=
6800    fi
6801else
6802    echo "No C++ compiler available; disabling C++ specific optional code"
6803    cxx=
6804fi
6805
6806echo_version() {
6807    if test "$1" = "yes" ; then
6808        echo "($2)"
6809    fi
6810}
6811
6812# prepend pixman and ftd flags after all config tests are done
6813QEMU_CFLAGS="$pixman_cflags $fdt_cflags $QEMU_CFLAGS"
6814QEMU_LDFLAGS="$fdt_ldflags $QEMU_LDFLAGS"
6815libs_softmmu="$pixman_libs $libs_softmmu"
6816
6817echo "Install prefix    $prefix"
6818echo "BIOS directory    $(eval echo $qemu_datadir)"
6819echo "firmware path     $(eval echo $firmwarepath)"
6820echo "binary directory  $(eval echo $bindir)"
6821echo "library directory $(eval echo $libdir)"
6822echo "module directory  $(eval echo $qemu_moddir)"
6823echo "libexec directory $(eval echo $libexecdir)"
6824echo "include directory $(eval echo $includedir)"
6825echo "config directory  $(eval echo $sysconfdir)"
6826if test "$mingw32" = "no" ; then
6827echo "local state directory   $(eval echo $local_statedir)"
6828echo "Manual directory  $(eval echo $mandir)"
6829echo "ELF interp prefix $interp_prefix"
6830else
6831echo "local state directory   queried at runtime"
6832echo "Windows SDK       $win_sdk"
6833fi
6834echo "Build directory   $(pwd)"
6835echo "Source path       $source_path"
6836echo "GIT binary        $git"
6837echo "GIT submodules    $git_submodules"
6838echo "C compiler        $cc"
6839echo "Host C compiler   $host_cc"
6840echo "C++ compiler      $cxx"
6841echo "Objective-C compiler $objcc"
6842echo "ARFLAGS           $ARFLAGS"
6843echo "CFLAGS            $CFLAGS"
6844echo "QEMU_CFLAGS       $QEMU_CFLAGS"
6845echo "QEMU_LDFLAGS      $QEMU_LDFLAGS"
6846echo "make              $make"
6847echo "install           $install"
6848echo "python            $python ($python_version)"
6849if test "$docs" != "no"; then
6850    echo "sphinx-build      $sphinx_build"
6851fi
6852echo "genisoimage       $genisoimage"
6853echo "slirp support     $slirp $(echo_version $slirp $slirp_version)"
6854if test "$slirp" != "no" ; then
6855    echo "smbd              $smbd"
6856fi
6857echo "module support    $modules"
6858echo "alt path mod load $module_upgrades"
6859echo "host CPU          $cpu"
6860echo "host big endian   $bigendian"
6861echo "target list       $target_list"
6862echo "gprof enabled     $gprof"
6863echo "sparse enabled    $sparse"
6864echo "strip binaries    $strip_opt"
6865echo "profiler          $profiler"
6866echo "static build      $static"
6867echo "safe stack        $safe_stack"
6868if test "$darwin" = "yes" ; then
6869    echo "Cocoa support     $cocoa"
6870fi
6871echo "SDL support       $sdl $(echo_version $sdl $sdlversion)"
6872echo "SDL image support $sdl_image"
6873echo "GTK support       $gtk $(echo_version $gtk $gtk_version)"
6874echo "GTK GL support    $gtk_gl"
6875echo "VTE support       $vte $(echo_version $vte $vteversion)"
6876echo "TLS priority      $tls_priority"
6877echo "GNUTLS support    $gnutls"
6878echo "libgcrypt         $gcrypt"
6879if test "$gcrypt" = "yes"
6880then
6881   echo "  hmac            $gcrypt_hmac"
6882   echo "  XTS             $gcrypt_xts"
6883fi
6884echo "nettle            $nettle $(echo_version $nettle $nettle_version)"
6885if test "$nettle" = "yes"
6886then
6887   echo "  XTS             $nettle_xts"
6888fi
6889echo "libtasn1          $tasn1"
6890echo "PAM               $auth_pam"
6891echo "iconv support     $iconv"
6892echo "curses support    $curses"
6893echo "virgl support     $virglrenderer $(echo_version $virglrenderer $virgl_version)"
6894echo "curl support      $curl"
6895echo "mingw32 support   $mingw32"
6896echo "Audio drivers     $audio_drv_list"
6897echo "Block whitelist (rw) $block_drv_rw_whitelist"
6898echo "Block whitelist (ro) $block_drv_ro_whitelist"
6899echo "VirtFS support    $virtfs"
6900echo "Multipath support $mpath"
6901echo "VNC support       $vnc"
6902if test "$vnc" = "yes" ; then
6903    echo "VNC SASL support  $vnc_sasl"
6904    echo "VNC JPEG support  $vnc_jpeg"
6905    echo "VNC PNG support   $vnc_png"
6906fi
6907echo "xen support       $xen"
6908if test "$xen" = "yes" ; then
6909  echo "xen ctrl version  $xen_ctrl_version"
6910fi
6911echo "brlapi support    $brlapi"
6912echo "Documentation     $docs"
6913echo "PIE               $pie"
6914echo "vde support       $vde"
6915echo "netmap support    $netmap"
6916echo "Linux AIO support $linux_aio"
6917echo "Linux io_uring support $linux_io_uring"
6918echo "ATTR/XATTR support $attr"
6919echo "Install blobs     $blobs"
6920echo "KVM support       $kvm"
6921echo "HAX support       $hax"
6922echo "HVF support       $hvf"
6923echo "WHPX support      $whpx"
6924echo "TCG support       $tcg"
6925if test "$tcg" = "yes" ; then
6926    echo "TCG debug enabled $debug_tcg"
6927    echo "TCG interpreter   $tcg_interpreter"
6928fi
6929echo "malloc trim support $malloc_trim"
6930echo "RDMA support      $rdma"
6931echo "PVRDMA support    $pvrdma"
6932echo "fdt support       $fdt"
6933echo "membarrier        $membarrier"
6934echo "preadv support    $preadv"
6935echo "fdatasync         $fdatasync"
6936echo "madvise           $madvise"
6937echo "posix_madvise     $posix_madvise"
6938echo "posix_memalign    $posix_memalign"
6939echo "libcap-ng support $cap_ng"
6940echo "vhost-net support $vhost_net"
6941echo "vhost-crypto support $vhost_crypto"
6942echo "vhost-scsi support $vhost_scsi"
6943echo "vhost-vsock support $vhost_vsock"
6944echo "vhost-user support $vhost_user"
6945echo "vhost-user-fs support $vhost_user_fs"
6946echo "Trace backends    $trace_backends"
6947if have_backend "simple"; then
6948echo "Trace output file $trace_file-<pid>"
6949fi
6950echo "spice support     $spice $(echo_version $spice $spice_protocol_version/$spice_server_version)"
6951echo "rbd support       $rbd"
6952echo "xfsctl support    $xfs"
6953echo "smartcard support $smartcard"
6954echo "libusb            $libusb"
6955echo "usb net redir     $usb_redir"
6956echo "OpenGL support    $opengl"
6957echo "OpenGL dmabufs    $opengl_dmabuf"
6958echo "libiscsi support  $libiscsi"
6959echo "libnfs support    $libnfs"
6960echo "build guest agent $guest_agent"
6961echo "QGA VSS support   $guest_agent_with_vss"
6962echo "QGA w32 disk info $guest_agent_ntddscsi"
6963echo "QGA MSI support   $guest_agent_msi"
6964echo "seccomp support   $seccomp"
6965echo "coroutine backend $coroutine"
6966echo "coroutine pool    $coroutine_pool"
6967echo "debug stack usage $debug_stack_usage"
6968echo "mutex debugging   $debug_mutex"
6969echo "crypto afalg      $crypto_afalg"
6970echo "GlusterFS support $glusterfs"
6971echo "gcov              $gcov_tool"
6972echo "gcov enabled      $gcov"
6973echo "TPM support       $tpm"
6974echo "libssh support    $libssh"
6975echo "QOM debugging     $qom_cast_debug"
6976echo "Live block migration $live_block_migration"
6977echo "lzo support       $lzo"
6978echo "snappy support    $snappy"
6979echo "bzip2 support     $bzip2"
6980echo "lzfse support     $lzfse"
6981echo "zstd support      $zstd"
6982echo "NUMA host support $numa"
6983echo "libxml2           $libxml2"
6984echo "tcmalloc support  $tcmalloc"
6985echo "jemalloc support  $jemalloc"
6986echo "avx2 optimization $avx2_opt"
6987echo "avx512f optimization $avx512f_opt"
6988echo "replication support $replication"
6989echo "VxHS block device $vxhs"
6990echo "bochs support     $bochs"
6991echo "cloop support     $cloop"
6992echo "dmg support       $dmg"
6993echo "qcow v1 support   $qcow1"
6994echo "vdi support       $vdi"
6995echo "vvfat support     $vvfat"
6996echo "qed support       $qed"
6997echo "parallels support $parallels"
6998echo "sheepdog support  $sheepdog"
6999echo "capstone          $capstone"
7000echo "libpmem support   $libpmem"
7001echo "libdaxctl support $libdaxctl"
7002echo "libudev           $libudev"
7003echo "default devices   $default_devices"
7004echo "plugin support    $plugins"
7005echo "fuzzing support   $fuzzing"
7006echo "gdb               $gdb_bin"
7007echo "rng-none          $rng_none"
7008echo "Linux keyring     $secret_keyring"
7009
7010if test "$supported_cpu" = "no"; then
7011    echo
7012    echo "WARNING: SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!"
7013    echo
7014    echo "CPU host architecture $cpu support is not currently maintained."
7015    echo "The QEMU project intends to remove support for this host CPU in"
7016    echo "a future release if nobody volunteers to maintain it and to"
7017    echo "provide a build host for our continuous integration setup."
7018    echo "configure has succeeded and you can continue to build, but"
7019    echo "if you care about QEMU on this platform you should contact"
7020    echo "us upstream at qemu-devel@nongnu.org."
7021fi
7022
7023if test "$supported_os" = "no"; then
7024    echo
7025    echo "WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!"
7026    echo
7027    echo "Host OS $targetos support is not currently maintained."
7028    echo "The QEMU project intends to remove support for this host OS in"
7029    echo "a future release if nobody volunteers to maintain it and to"
7030    echo "provide a build host for our continuous integration setup."
7031    echo "configure has succeeded and you can continue to build, but"
7032    echo "if you care about QEMU on this platform you should contact"
7033    echo "us upstream at qemu-devel@nongnu.org."
7034fi
7035
7036config_host_mak="config-host.mak"
7037
7038echo "# Automatically generated by configure - do not modify" >config-all-disas.mak
7039
7040echo "# Automatically generated by configure - do not modify" > $config_host_mak
7041echo >> $config_host_mak
7042
7043echo all: >> $config_host_mak
7044echo "prefix=$prefix" >> $config_host_mak
7045echo "bindir=$bindir" >> $config_host_mak
7046echo "libdir=$libdir" >> $config_host_mak
7047echo "libexecdir=$libexecdir" >> $config_host_mak
7048echo "includedir=$includedir" >> $config_host_mak
7049echo "mandir=$mandir" >> $config_host_mak
7050echo "sysconfdir=$sysconfdir" >> $config_host_mak
7051echo "qemu_confdir=$qemu_confdir" >> $config_host_mak
7052echo "qemu_datadir=$qemu_datadir" >> $config_host_mak
7053echo "qemu_firmwarepath=$firmwarepath" >> $config_host_mak
7054echo "qemu_docdir=$qemu_docdir" >> $config_host_mak
7055echo "qemu_moddir=$qemu_moddir" >> $config_host_mak
7056if test "$mingw32" = "no" ; then
7057  echo "qemu_localstatedir=$local_statedir" >> $config_host_mak
7058fi
7059echo "qemu_helperdir=$libexecdir" >> $config_host_mak
7060echo "qemu_localedir=$qemu_localedir" >> $config_host_mak
7061echo "qemu_icondir=$qemu_icondir" >> $config_host_mak
7062echo "qemu_desktopdir=$qemu_desktopdir" >> $config_host_mak
7063echo "libs_cpu=$libs_cpu" >> $config_host_mak
7064echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
7065echo "GIT=$git" >> $config_host_mak
7066echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
7067echo "GIT_UPDATE=$git_update" >> $config_host_mak
7068
7069echo "ARCH=$ARCH" >> $config_host_mak
7070
7071if test "$default_devices" = "yes" ; then
7072  echo "CONFIG_MINIKCONF_MODE=--defconfig" >> $config_host_mak
7073else
7074  echo "CONFIG_MINIKCONF_MODE=--allnoconfig" >> $config_host_mak
7075fi
7076if test "$debug_tcg" = "yes" ; then
7077  echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
7078fi
7079if test "$strip_opt" = "yes" ; then
7080  echo "STRIP=${strip}" >> $config_host_mak
7081fi
7082if test "$bigendian" = "yes" ; then
7083  echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
7084fi
7085if test "$mingw32" = "yes" ; then
7086  echo "CONFIG_WIN32=y" >> $config_host_mak
7087  rc_version=$(cat $source_path/VERSION)
7088  version_major=${rc_version%%.*}
7089  rc_version=${rc_version#*.}
7090  version_minor=${rc_version%%.*}
7091  rc_version=${rc_version#*.}
7092  version_subminor=${rc_version%%.*}
7093  version_micro=0
7094  echo "CONFIG_FILEVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
7095  echo "CONFIG_PRODUCTVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
7096  if test "$guest_agent_with_vss" = "yes" ; then
7097    echo "CONFIG_QGA_VSS=y" >> $config_host_mak
7098    echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
7099    echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
7100  fi
7101  if test "$guest_agent_ntddscsi" = "yes" ; then
7102    echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
7103  fi
7104  if test "$guest_agent_msi" = "yes"; then
7105    echo "QEMU_GA_MSI_ENABLED=yes" >> $config_host_mak
7106    echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
7107    echo "QEMU_GA_MSI_WITH_VSS=${QEMU_GA_MSI_WITH_VSS}" >> $config_host_mak
7108    echo "QEMU_GA_MSI_ARCH=${QEMU_GA_MSI_ARCH}" >> $config_host_mak
7109    echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
7110    echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
7111    echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
7112  fi
7113else
7114  echo "CONFIG_POSIX=y" >> $config_host_mak
7115fi
7116
7117if test "$linux" = "yes" ; then
7118  echo "CONFIG_LINUX=y" >> $config_host_mak
7119fi
7120
7121if test "$darwin" = "yes" ; then
7122  echo "CONFIG_DARWIN=y" >> $config_host_mak
7123fi
7124
7125if test "$solaris" = "yes" ; then
7126  echo "CONFIG_SOLARIS=y" >> $config_host_mak
7127fi
7128if test "$haiku" = "yes" ; then
7129  echo "CONFIG_HAIKU=y" >> $config_host_mak
7130fi
7131if test "$static" = "yes" ; then
7132  echo "CONFIG_STATIC=y" >> $config_host_mak
7133fi
7134if test "$profiler" = "yes" ; then
7135  echo "CONFIG_PROFILER=y" >> $config_host_mak
7136fi
7137if test "$want_tools" = "yes" ; then
7138  echo "CONFIG_TOOLS=y" >> $config_host_mak
7139fi
7140if test "$slirp" != "no"; then
7141  echo "CONFIG_SLIRP=y" >> $config_host_mak
7142  echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
7143  echo "SLIRP_CFLAGS=$slirp_cflags" >> $config_host_mak
7144  echo "SLIRP_LIBS=$slirp_libs" >> $config_host_mak
7145fi
7146if [ "$slirp" = "git" -o "$slirp" = "internal" ]; then
7147    echo "config-host.h: slirp/all" >> $config_host_mak
7148fi
7149if test "$vde" = "yes" ; then
7150  echo "CONFIG_VDE=y" >> $config_host_mak
7151  echo "VDE_LIBS=$vde_libs" >> $config_host_mak
7152fi
7153if test "$netmap" = "yes" ; then
7154  echo "CONFIG_NETMAP=y" >> $config_host_mak
7155fi
7156if test "$l2tpv3" = "yes" ; then
7157  echo "CONFIG_L2TPV3=y" >> $config_host_mak
7158fi
7159if test "$gprof" = "yes" ; then
7160  echo "CONFIG_GPROF=y" >> $config_host_mak
7161fi
7162if test "$cap_ng" = "yes" ; then
7163  echo "CONFIG_LIBCAP_NG=y" >> $config_host_mak
7164fi
7165echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
7166for drv in $audio_drv_list; do
7167    def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
7168    case "$drv" in
7169	alsa | oss | pa | sdl)
7170	    echo "$def=m" >> $config_host_mak ;;
7171	*)
7172	    echo "$def=y" >> $config_host_mak ;;
7173    esac
7174done
7175echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak
7176echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
7177echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak
7178echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak
7179echo "OSS_LIBS=$oss_libs" >> $config_host_mak
7180echo "JACK_LIBS=$jack_libs" >> $config_host_mak
7181if test "$audio_win_int" = "yes" ; then
7182  echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
7183fi
7184echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
7185echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
7186if test "$vnc" = "yes" ; then
7187  echo "CONFIG_VNC=y" >> $config_host_mak
7188fi
7189if test "$vnc_sasl" = "yes" ; then
7190  echo "CONFIG_VNC_SASL=y" >> $config_host_mak
7191fi
7192if test "$vnc_jpeg" = "yes" ; then
7193  echo "CONFIG_VNC_JPEG=y" >> $config_host_mak
7194fi
7195if test "$vnc_png" = "yes" ; then
7196  echo "CONFIG_VNC_PNG=y" >> $config_host_mak
7197fi
7198if test "$xkbcommon" = "yes" ; then
7199  echo "XKBCOMMON_CFLAGS=$xkbcommon_cflags" >> $config_host_mak
7200  echo "XKBCOMMON_LIBS=$xkbcommon_libs" >> $config_host_mak
7201fi
7202if test "$xfs" = "yes" ; then
7203  echo "CONFIG_XFS=y" >> $config_host_mak
7204fi
7205qemu_version=$(head $source_path/VERSION)
7206echo "VERSION=$qemu_version" >>$config_host_mak
7207echo "PKGVERSION=$pkgversion" >>$config_host_mak
7208echo "SRC_PATH=$source_path" >> $config_host_mak
7209echo "TARGET_DIRS=$target_list" >> $config_host_mak
7210if [ "$docs" = "yes" ] ; then
7211  echo "BUILD_DOCS=yes" >> $config_host_mak
7212fi
7213if test "$modules" = "yes"; then
7214  # $shacmd can generate a hash started with digit, which the compiler doesn't
7215  # like as an symbol. So prefix it with an underscore
7216  echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
7217  echo "CONFIG_MODULES=y" >> $config_host_mak
7218fi
7219if test "$module_upgrades" = "yes"; then
7220  echo "CONFIG_MODULE_UPGRADES=y" >> $config_host_mak
7221fi
7222if test "$have_x11" = "yes" && test "$need_x11" = "yes"; then
7223  echo "CONFIG_X11=y" >> $config_host_mak
7224  echo "X11_CFLAGS=$x11_cflags" >> $config_host_mak
7225  echo "X11_LIBS=$x11_libs" >> $config_host_mak
7226fi
7227if test "$sdl" = "yes" ; then
7228  echo "CONFIG_SDL=m" >> $config_host_mak
7229  echo "SDL_CFLAGS=$sdl_cflags" >> $config_host_mak
7230  echo "SDL_LIBS=$sdl_libs" >> $config_host_mak
7231  if test "$sdl_image" = "yes" ; then
7232      echo "CONFIG_SDL_IMAGE=y" >> $config_host_mak
7233  fi
7234fi
7235if test "$cocoa" = "yes" ; then
7236  echo "CONFIG_COCOA=y" >> $config_host_mak
7237fi
7238if test "$iconv" = "yes" ; then
7239  echo "CONFIG_ICONV=y" >> $config_host_mak
7240  echo "ICONV_CFLAGS=$iconv_cflags" >> $config_host_mak
7241  echo "ICONV_LIBS=$iconv_lib" >> $config_host_mak
7242fi
7243if test "$curses" = "yes" ; then
7244  echo "CONFIG_CURSES=m" >> $config_host_mak
7245  echo "CURSES_CFLAGS=$curses_inc" >> $config_host_mak
7246  echo "CURSES_LIBS=$curses_lib" >> $config_host_mak
7247fi
7248if test "$pipe2" = "yes" ; then
7249  echo "CONFIG_PIPE2=y" >> $config_host_mak
7250fi
7251if test "$accept4" = "yes" ; then
7252  echo "CONFIG_ACCEPT4=y" >> $config_host_mak
7253fi
7254if test "$splice" = "yes" ; then
7255  echo "CONFIG_SPLICE=y" >> $config_host_mak
7256fi
7257if test "$eventfd" = "yes" ; then
7258  echo "CONFIG_EVENTFD=y" >> $config_host_mak
7259fi
7260if test "$memfd" = "yes" ; then
7261  echo "CONFIG_MEMFD=y" >> $config_host_mak
7262fi
7263if test "$have_usbfs" = "yes" ; then
7264  echo "CONFIG_USBFS=y" >> $config_host_mak
7265fi
7266if test "$fallocate" = "yes" ; then
7267  echo "CONFIG_FALLOCATE=y" >> $config_host_mak
7268fi
7269if test "$fallocate_punch_hole" = "yes" ; then
7270  echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
7271fi
7272if test "$fallocate_zero_range" = "yes" ; then
7273  echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak
7274fi
7275if test "$posix_fallocate" = "yes" ; then
7276  echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
7277fi
7278if test "$sync_file_range" = "yes" ; then
7279  echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
7280fi
7281if test "$fiemap" = "yes" ; then
7282  echo "CONFIG_FIEMAP=y" >> $config_host_mak
7283fi
7284if test "$dup3" = "yes" ; then
7285  echo "CONFIG_DUP3=y" >> $config_host_mak
7286fi
7287if test "$ppoll" = "yes" ; then
7288  echo "CONFIG_PPOLL=y" >> $config_host_mak
7289fi
7290if test "$prctl_pr_set_timerslack" = "yes" ; then
7291  echo "CONFIG_PRCTL_PR_SET_TIMERSLACK=y" >> $config_host_mak
7292fi
7293if test "$epoll" = "yes" ; then
7294  echo "CONFIG_EPOLL=y" >> $config_host_mak
7295fi
7296if test "$epoll_create1" = "yes" ; then
7297  echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
7298fi
7299if test "$sendfile" = "yes" ; then
7300  echo "CONFIG_SENDFILE=y" >> $config_host_mak
7301fi
7302if test "$timerfd" = "yes" ; then
7303  echo "CONFIG_TIMERFD=y" >> $config_host_mak
7304fi
7305if test "$setns" = "yes" ; then
7306  echo "CONFIG_SETNS=y" >> $config_host_mak
7307fi
7308if test "$clock_adjtime" = "yes" ; then
7309  echo "CONFIG_CLOCK_ADJTIME=y" >> $config_host_mak
7310fi
7311if test "$syncfs" = "yes" ; then
7312  echo "CONFIG_SYNCFS=y" >> $config_host_mak
7313fi
7314if test "$kcov" = "yes" ; then
7315  echo "CONFIG_KCOV=y" >> $config_host_mak
7316fi
7317if test "$inotify" = "yes" ; then
7318  echo "CONFIG_INOTIFY=y" >> $config_host_mak
7319fi
7320if test "$inotify1" = "yes" ; then
7321  echo "CONFIG_INOTIFY1=y" >> $config_host_mak
7322fi
7323if test "$sem_timedwait" = "yes" ; then
7324  echo "CONFIG_SEM_TIMEDWAIT=y" >> $config_host_mak
7325fi
7326if test "$strchrnul" = "yes" ; then
7327  echo "HAVE_STRCHRNUL=y" >> $config_host_mak
7328fi
7329if test "$st_atim" = "yes" ; then
7330  echo "HAVE_STRUCT_STAT_ST_ATIM=y" >> $config_host_mak
7331fi
7332if test "$byteswap_h" = "yes" ; then
7333  echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
7334fi
7335if test "$bswap_h" = "yes" ; then
7336  echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
7337fi
7338if test "$curl" = "yes" ; then
7339  echo "CONFIG_CURL=m" >> $config_host_mak
7340  echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak
7341  echo "CURL_LIBS=$curl_libs" >> $config_host_mak
7342fi
7343if test "$brlapi" = "yes" ; then
7344  echo "CONFIG_BRLAPI=y" >> $config_host_mak
7345  echo "BRLAPI_LIBS=$brlapi_libs" >> $config_host_mak
7346fi
7347if test "$gtk" = "yes" ; then
7348  echo "CONFIG_GTK=m" >> $config_host_mak
7349  echo "GTK_CFLAGS=$gtk_cflags" >> $config_host_mak
7350  echo "GTK_LIBS=$gtk_libs" >> $config_host_mak
7351  if test "$gtk_gl" = "yes" ; then
7352    echo "CONFIG_GTK_GL=y" >> $config_host_mak
7353  fi
7354fi
7355if test "$gio" = "yes" ; then
7356    echo "CONFIG_GIO=y" >> $config_host_mak
7357    echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
7358    echo "GIO_LIBS=$gio_libs" >> $config_host_mak
7359    echo "GDBUS_CODEGEN=$gdbus_codegen" >> $config_host_mak
7360fi
7361echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
7362if test "$gnutls" = "yes" ; then
7363  echo "CONFIG_GNUTLS=y" >> $config_host_mak
7364fi
7365if test "$gcrypt" = "yes" ; then
7366  echo "CONFIG_GCRYPT=y" >> $config_host_mak
7367  if test "$gcrypt_hmac" = "yes" ; then
7368    echo "CONFIG_GCRYPT_HMAC=y" >> $config_host_mak
7369  fi
7370fi
7371if test "$nettle" = "yes" ; then
7372  echo "CONFIG_NETTLE=y" >> $config_host_mak
7373  echo "CONFIG_NETTLE_VERSION_MAJOR=${nettle_version%%.*}" >> $config_host_mak
7374fi
7375if test "$qemu_private_xts" = "yes" ; then
7376  echo "CONFIG_QEMU_PRIVATE_XTS=y" >> $config_host_mak
7377fi
7378if test "$tasn1" = "yes" ; then
7379  echo "CONFIG_TASN1=y" >> $config_host_mak
7380fi
7381if test "$auth_pam" = "yes" ; then
7382    echo "CONFIG_AUTH_PAM=y" >> $config_host_mak
7383fi
7384if test "$have_ifaddrs_h" = "yes" ; then
7385    echo "HAVE_IFADDRS_H=y" >> $config_host_mak
7386fi
7387if test "$have_drm_h" = "yes" ; then
7388  echo "HAVE_DRM_H=y" >> $config_host_mak
7389fi
7390if test "$have_broken_size_max" = "yes" ; then
7391    echo "HAVE_BROKEN_SIZE_MAX=y" >> $config_host_mak
7392fi
7393
7394# Work around a system header bug with some kernel/XFS header
7395# versions where they both try to define 'struct fsxattr':
7396# xfs headers will not try to redefine structs from linux headers
7397# if this macro is set.
7398if test "$have_fsxattr" = "yes" ; then
7399    echo "HAVE_FSXATTR=y" >> $config_host_mak
7400fi
7401if test "$have_copy_file_range" = "yes" ; then
7402    echo "HAVE_COPY_FILE_RANGE=y" >> $config_host_mak
7403fi
7404if test "$vte" = "yes" ; then
7405  echo "CONFIG_VTE=y" >> $config_host_mak
7406  echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak
7407  echo "VTE_LIBS=$vte_libs" >> $config_host_mak
7408fi
7409if test "$virglrenderer" = "yes" ; then
7410  echo "CONFIG_VIRGL=y" >> $config_host_mak
7411  echo "VIRGL_CFLAGS=$virgl_cflags" >> $config_host_mak
7412  echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak
7413fi
7414if test "$xen" = "yes" ; then
7415  echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
7416  echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
7417fi
7418if test "$linux_aio" = "yes" ; then
7419  echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
7420fi
7421if test "$linux_io_uring" = "yes" ; then
7422  echo "CONFIG_LINUX_IO_URING=y" >> $config_host_mak
7423  echo "LINUX_IO_URING_CFLAGS=$linux_io_uring_cflags" >> $config_host_mak
7424  echo "LINUX_IO_URING_LIBS=$linux_io_uring_libs" >> $config_host_mak
7425fi
7426if test "$attr" = "yes" ; then
7427  echo "CONFIG_ATTR=y" >> $config_host_mak
7428fi
7429if test "$libattr" = "yes" ; then
7430  echo "CONFIG_LIBATTR=y" >> $config_host_mak
7431fi
7432if test "$virtfs" = "yes" ; then
7433  echo "CONFIG_VIRTFS=y" >> $config_host_mak
7434fi
7435if test "$mpath" = "yes" ; then
7436  echo "CONFIG_MPATH=y" >> $config_host_mak
7437  if test "$mpathpersist_new_api" = "yes"; then
7438    echo "CONFIG_MPATH_NEW_API=y" >> $config_host_mak
7439  fi
7440fi
7441if test "$vhost_scsi" = "yes" ; then
7442  echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
7443fi
7444if test "$vhost_net" = "yes" ; then
7445  echo "CONFIG_VHOST_NET=y" >> $config_host_mak
7446fi
7447if test "$vhost_net_user" = "yes" ; then
7448  echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
7449fi
7450if test "$vhost_crypto" = "yes" ; then
7451  echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
7452fi
7453if test "$vhost_vsock" = "yes" ; then
7454  echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
7455  if test "$vhost_user" = "yes" ; then
7456    echo "CONFIG_VHOST_USER_VSOCK=y" >> $config_host_mak
7457  fi
7458fi
7459if test "$vhost_kernel" = "yes" ; then
7460  echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
7461fi
7462if test "$vhost_user" = "yes" ; then
7463  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
7464fi
7465if test "$vhost_user_fs" = "yes" ; then
7466  echo "CONFIG_VHOST_USER_FS=y" >> $config_host_mak
7467fi
7468if test "$blobs" = "yes" ; then
7469  echo "INSTALL_BLOBS=yes" >> $config_host_mak
7470fi
7471if test "$iovec" = "yes" ; then
7472  echo "CONFIG_IOVEC=y" >> $config_host_mak
7473fi
7474if test "$preadv" = "yes" ; then
7475  echo "CONFIG_PREADV=y" >> $config_host_mak
7476fi
7477if test "$fdt" != "no" ; then
7478  echo "CONFIG_FDT=y" >> $config_host_mak
7479fi
7480if test "$membarrier" = "yes" ; then
7481  echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
7482fi
7483if test "$signalfd" = "yes" ; then
7484  echo "CONFIG_SIGNALFD=y" >> $config_host_mak
7485fi
7486if test "$optreset" = "yes" ; then
7487  echo "HAVE_OPTRESET=y" >> $config_host_mak
7488fi
7489if test "$tcg" = "yes"; then
7490  echo "CONFIG_TCG=y" >> $config_host_mak
7491  if test "$tcg_interpreter" = "yes" ; then
7492    echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
7493  fi
7494fi
7495if test "$fdatasync" = "yes" ; then
7496  echo "CONFIG_FDATASYNC=y" >> $config_host_mak
7497fi
7498if test "$madvise" = "yes" ; then
7499  echo "CONFIG_MADVISE=y" >> $config_host_mak
7500fi
7501if test "$posix_madvise" = "yes" ; then
7502  echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak
7503fi
7504if test "$posix_memalign" = "yes" ; then
7505  echo "CONFIG_POSIX_MEMALIGN=y" >> $config_host_mak
7506fi
7507
7508if test "$spice" = "yes" ; then
7509  echo "CONFIG_SPICE=y" >> $config_host_mak
7510fi
7511
7512if test "$smartcard" = "yes" ; then
7513  echo "CONFIG_SMARTCARD=y" >> $config_host_mak
7514  echo "SMARTCARD_CFLAGS=$libcacard_cflags" >> $config_host_mak
7515  echo "SMARTCARD_LIBS=$libcacard_libs" >> $config_host_mak
7516fi
7517
7518if test "$libusb" = "yes" ; then
7519  echo "CONFIG_USB_LIBUSB=y" >> $config_host_mak
7520  echo "LIBUSB_CFLAGS=$libusb_cflags" >> $config_host_mak
7521  echo "LIBUSB_LIBS=$libusb_libs" >> $config_host_mak
7522fi
7523
7524if test "$usb_redir" = "yes" ; then
7525  echo "CONFIG_USB_REDIR=y" >> $config_host_mak
7526  echo "USB_REDIR_CFLAGS=$usb_redir_cflags" >> $config_host_mak
7527  echo "USB_REDIR_LIBS=$usb_redir_libs" >> $config_host_mak
7528fi
7529
7530if test "$opengl" = "yes" ; then
7531  echo "CONFIG_OPENGL=y" >> $config_host_mak
7532  echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
7533  if test "$opengl_dmabuf" = "yes" ; then
7534    echo "CONFIG_OPENGL_DMABUF=y" >> $config_host_mak
7535  fi
7536fi
7537
7538if test "$gbm" = "yes" ; then
7539    echo "CONFIG_GBM=y" >> $config_host_mak
7540    echo "GBM_LIBS=$gbm_libs" >> $config_host_mak
7541    echo "GBM_CFLAGS=$gbm_cflags" >> $config_host_mak
7542fi
7543
7544
7545if test "$malloc_trim" = "yes" ; then
7546  echo "CONFIG_MALLOC_TRIM=y" >> $config_host_mak
7547fi
7548
7549if test "$avx2_opt" = "yes" ; then
7550  echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
7551fi
7552
7553if test "$avx512f_opt" = "yes" ; then
7554  echo "CONFIG_AVX512F_OPT=y" >> $config_host_mak
7555fi
7556
7557if test "$lzo" = "yes" ; then
7558  echo "CONFIG_LZO=y" >> $config_host_mak
7559fi
7560
7561if test "$snappy" = "yes" ; then
7562  echo "CONFIG_SNAPPY=y" >> $config_host_mak
7563fi
7564
7565if test "$bzip2" = "yes" ; then
7566  echo "CONFIG_BZIP2=y" >> $config_host_mak
7567  echo "BZIP2_LIBS=-lbz2" >> $config_host_mak
7568fi
7569
7570if test "$lzfse" = "yes" ; then
7571  echo "CONFIG_LZFSE=y" >> $config_host_mak
7572  echo "LZFSE_LIBS=-llzfse" >> $config_host_mak
7573fi
7574
7575if test "$zstd" = "yes" ; then
7576  echo "CONFIG_ZSTD=y" >> $config_host_mak
7577fi
7578
7579if test "$libiscsi" = "yes" ; then
7580  echo "CONFIG_LIBISCSI=m" >> $config_host_mak
7581  echo "LIBISCSI_CFLAGS=$libiscsi_cflags" >> $config_host_mak
7582  echo "LIBISCSI_LIBS=$libiscsi_libs" >> $config_host_mak
7583fi
7584
7585if test "$libnfs" = "yes" ; then
7586  echo "CONFIG_LIBNFS=m" >> $config_host_mak
7587  echo "LIBNFS_LIBS=$libnfs_libs" >> $config_host_mak
7588fi
7589
7590if test "$seccomp" = "yes"; then
7591  echo "CONFIG_SECCOMP=y" >> $config_host_mak
7592  echo "SECCOMP_CFLAGS=$seccomp_cflags" >> $config_host_mak
7593  echo "SECCOMP_LIBS=$seccomp_libs" >> $config_host_mak
7594fi
7595
7596# XXX: suppress that
7597if [ "$bsd" = "yes" ] ; then
7598  echo "CONFIG_BSD=y" >> $config_host_mak
7599fi
7600
7601if test "$localtime_r" = "yes" ; then
7602  echo "CONFIG_LOCALTIME_R=y" >> $config_host_mak
7603fi
7604if test "$qom_cast_debug" = "yes" ; then
7605  echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
7606fi
7607if test "$rbd" = "yes" ; then
7608  echo "CONFIG_RBD=m" >> $config_host_mak
7609  echo "RBD_CFLAGS=$rbd_cflags" >> $config_host_mak
7610  echo "RBD_LIBS=$rbd_libs" >> $config_host_mak
7611fi
7612
7613echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
7614if test "$coroutine_pool" = "yes" ; then
7615  echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
7616else
7617  echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
7618fi
7619
7620if test "$debug_stack_usage" = "yes" ; then
7621  echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
7622fi
7623
7624if test "$crypto_afalg" = "yes" ; then
7625  echo "CONFIG_AF_ALG=y" >> $config_host_mak
7626fi
7627
7628if test "$open_by_handle_at" = "yes" ; then
7629  echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
7630fi
7631
7632if test "$linux_magic_h" = "yes" ; then
7633  echo "CONFIG_LINUX_MAGIC_H=y" >> $config_host_mak
7634fi
7635
7636if test "$pragma_diagnostic_available" = "yes" ; then
7637  echo "CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE=y" >> $config_host_mak
7638fi
7639
7640if test "$valgrind_h" = "yes" ; then
7641  echo "CONFIG_VALGRIND_H=y" >> $config_host_mak
7642fi
7643
7644if test "$have_asan_iface_fiber" = "yes" ; then
7645    echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
7646fi
7647
7648if test "$have_tsan" = "yes" && test "$have_tsan_iface_fiber" = "yes" ; then
7649    echo "CONFIG_TSAN=y" >> $config_host_mak
7650fi
7651
7652if test "$has_environ" = "yes" ; then
7653  echo "CONFIG_HAS_ENVIRON=y" >> $config_host_mak
7654fi
7655
7656if test "$cpuid_h" = "yes" ; then
7657  echo "CONFIG_CPUID_H=y" >> $config_host_mak
7658fi
7659
7660if test "$int128" = "yes" ; then
7661  echo "CONFIG_INT128=y" >> $config_host_mak
7662fi
7663
7664if test "$atomic128" = "yes" ; then
7665  echo "CONFIG_ATOMIC128=y" >> $config_host_mak
7666fi
7667
7668if test "$cmpxchg128" = "yes" ; then
7669  echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
7670fi
7671
7672if test "$atomic64" = "yes" ; then
7673  echo "CONFIG_ATOMIC64=y" >> $config_host_mak
7674fi
7675
7676if test "$attralias" = "yes" ; then
7677  echo "CONFIG_ATTRIBUTE_ALIAS=y" >> $config_host_mak
7678fi
7679
7680if test "$getauxval" = "yes" ; then
7681  echo "CONFIG_GETAUXVAL=y" >> $config_host_mak
7682fi
7683
7684if test "$glusterfs" = "yes" ; then
7685  echo "CONFIG_GLUSTERFS=m" >> $config_host_mak
7686  echo "GLUSTERFS_CFLAGS=$glusterfs_cflags" >> $config_host_mak
7687  echo "GLUSTERFS_LIBS=$glusterfs_libs" >> $config_host_mak
7688fi
7689
7690if test "$glusterfs_xlator_opt" = "yes" ; then
7691  echo "CONFIG_GLUSTERFS_XLATOR_OPT=y" >> $config_host_mak
7692fi
7693
7694if test "$glusterfs_discard" = "yes" ; then
7695  echo "CONFIG_GLUSTERFS_DISCARD=y" >> $config_host_mak
7696fi
7697
7698if test "$glusterfs_fallocate" = "yes" ; then
7699  echo "CONFIG_GLUSTERFS_FALLOCATE=y" >> $config_host_mak
7700fi
7701
7702if test "$glusterfs_zerofill" = "yes" ; then
7703  echo "CONFIG_GLUSTERFS_ZEROFILL=y" >> $config_host_mak
7704fi
7705
7706if test "$glusterfs_ftruncate_has_stat" = "yes" ; then
7707  echo "CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT=y" >> $config_host_mak
7708fi
7709
7710if test "$glusterfs_iocb_has_stat" = "yes" ; then
7711  echo "CONFIG_GLUSTERFS_IOCB_HAS_STAT=y" >> $config_host_mak
7712fi
7713
7714if test "$libssh" = "yes" ; then
7715  echo "CONFIG_LIBSSH=m" >> $config_host_mak
7716  echo "LIBSSH_CFLAGS=$libssh_cflags" >> $config_host_mak
7717  echo "LIBSSH_LIBS=$libssh_libs" >> $config_host_mak
7718fi
7719
7720if test "$live_block_migration" = "yes" ; then
7721  echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
7722fi
7723
7724if test "$tpm" = "yes"; then
7725  echo 'CONFIG_TPM=y' >> $config_host_mak
7726fi
7727
7728echo "TRACE_BACKENDS=$trace_backends" >> $config_host_mak
7729if have_backend "nop"; then
7730  echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
7731fi
7732if have_backend "simple"; then
7733  echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
7734  # Set the appropriate trace file.
7735  trace_file="\"$trace_file-\" FMT_pid"
7736fi
7737if have_backend "log"; then
7738  echo "CONFIG_TRACE_LOG=y" >> $config_host_mak
7739fi
7740if have_backend "ust"; then
7741  echo "CONFIG_TRACE_UST=y" >> $config_host_mak
7742fi
7743if have_backend "dtrace"; then
7744  echo "CONFIG_TRACE_DTRACE=y" >> $config_host_mak
7745  if test "$trace_backend_stap" = "yes" ; then
7746    echo "CONFIG_TRACE_SYSTEMTAP=y" >> $config_host_mak
7747  fi
7748fi
7749if have_backend "ftrace"; then
7750  if test "$linux" = "yes" ; then
7751    echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak
7752  else
7753    feature_not_found "ftrace(trace backend)" "ftrace requires Linux"
7754  fi
7755fi
7756if have_backend "syslog"; then
7757  if test "$posix_syslog" = "yes" ; then
7758    echo "CONFIG_TRACE_SYSLOG=y" >> $config_host_mak
7759  else
7760    feature_not_found "syslog(trace backend)" "syslog not available"
7761  fi
7762fi
7763echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
7764
7765if test "$rdma" = "yes" ; then
7766  echo "CONFIG_RDMA=y" >> $config_host_mak
7767  echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
7768fi
7769
7770if test "$pvrdma" = "yes" ; then
7771  echo "CONFIG_PVRDMA=y" >> $config_host_mak
7772fi
7773
7774if test "$have_rtnetlink" = "yes" ; then
7775  echo "CONFIG_RTNETLINK=y" >> $config_host_mak
7776fi
7777
7778if test "$libxml2" = "yes" ; then
7779  echo "CONFIG_LIBXML2=y" >> $config_host_mak
7780  echo "LIBXML2_CFLAGS=$libxml2_cflags" >> $config_host_mak
7781  echo "LIBXML2_LIBS=$libxml2_libs" >> $config_host_mak
7782fi
7783
7784if test "$replication" = "yes" ; then
7785  echo "CONFIG_REPLICATION=y" >> $config_host_mak
7786fi
7787
7788if test "$have_af_vsock" = "yes" ; then
7789  echo "CONFIG_AF_VSOCK=y" >> $config_host_mak
7790fi
7791
7792if test "$have_sysmacros" = "yes" ; then
7793  echo "CONFIG_SYSMACROS=y" >> $config_host_mak
7794fi
7795
7796if test "$have_static_assert" = "yes" ; then
7797  echo "CONFIG_STATIC_ASSERT=y" >> $config_host_mak
7798fi
7799
7800if test "$have_utmpx" = "yes" ; then
7801  echo "HAVE_UTMPX=y" >> $config_host_mak
7802fi
7803if test "$have_getrandom" = "yes" ; then
7804  echo "CONFIG_GETRANDOM=y" >> $config_host_mak
7805fi
7806if test "$ivshmem" = "yes" ; then
7807  echo "CONFIG_IVSHMEM=y" >> $config_host_mak
7808fi
7809if test "$capstone" != "no" ; then
7810  echo "CONFIG_CAPSTONE=y" >> $config_host_mak
7811fi
7812if test "$debug_mutex" = "yes" ; then
7813  echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
7814fi
7815
7816# Hold two types of flag:
7817#   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
7818#                                     a thread we have a handle to
7819#   CONFIG_PTHREAD_SETNAME_NP_W_TID - A way of doing it on a particular
7820#                                     platform
7821if test "$pthread_setname_np_w_tid" = "yes" ; then
7822  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
7823  echo "CONFIG_PTHREAD_SETNAME_NP_W_TID=y" >> $config_host_mak
7824elif test "$pthread_setname_np_wo_tid" = "yes" ; then
7825  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
7826  echo "CONFIG_PTHREAD_SETNAME_NP_WO_TID=y" >> $config_host_mak
7827fi
7828
7829if test "$vxhs" = "yes" ; then
7830  echo "CONFIG_VXHS=y" >> $config_host_mak
7831  echo "VXHS_LIBS=$vxhs_libs" >> $config_host_mak
7832fi
7833
7834if test "$libpmem" = "yes" ; then
7835  echo "CONFIG_LIBPMEM=y" >> $config_host_mak
7836fi
7837
7838if test "$libdaxctl" = "yes" ; then
7839  echo "CONFIG_LIBDAXCTL=y" >> $config_host_mak
7840fi
7841
7842if test "$bochs" = "yes" ; then
7843  echo "CONFIG_BOCHS=y" >> $config_host_mak
7844fi
7845if test "$cloop" = "yes" ; then
7846  echo "CONFIG_CLOOP=y" >> $config_host_mak
7847fi
7848if test "$dmg" = "yes" ; then
7849  echo "CONFIG_DMG=y" >> $config_host_mak
7850fi
7851if test "$qcow1" = "yes" ; then
7852  echo "CONFIG_QCOW1=y" >> $config_host_mak
7853fi
7854if test "$vdi" = "yes" ; then
7855  echo "CONFIG_VDI=y" >> $config_host_mak
7856fi
7857if test "$vvfat" = "yes" ; then
7858  echo "CONFIG_VVFAT=y" >> $config_host_mak
7859fi
7860if test "$qed" = "yes" ; then
7861  echo "CONFIG_QED=y" >> $config_host_mak
7862fi
7863if test "$parallels" = "yes" ; then
7864  echo "CONFIG_PARALLELS=y" >> $config_host_mak
7865fi
7866if test "$sheepdog" = "yes" ; then
7867  echo "CONFIG_SHEEPDOG=y" >> $config_host_mak
7868fi
7869if test "$fuzzing" = "yes" ; then
7870  if test "$have_fuzzer" = "yes"; then
7871    FUZZ_LDFLAGS=" -fsanitize=address,fuzzer"
7872    FUZZ_CFLAGS=" -fsanitize=address,fuzzer"
7873    CFLAGS=" -fsanitize=address,fuzzer-no-link"
7874  else
7875    error_exit "Your compiler doesn't support -fsanitize=address,fuzzer"
7876    exit 1
7877  fi
7878fi
7879
7880if test "$plugins" = "yes" ; then
7881    echo "CONFIG_PLUGIN=y" >> $config_host_mak
7882    LIBS="-ldl $LIBS"
7883    # Copy the export object list to the build dir
7884    if test "$ld_dynamic_list" = "yes" ; then
7885	echo "CONFIG_HAS_LD_DYNAMIC_LIST=yes" >> $config_host_mak
7886	ld_symbols=qemu-plugins-ld.symbols
7887	cp "$source_path/plugins/qemu-plugins.symbols" $ld_symbols
7888    elif test "$ld_exported_symbols_list" = "yes" ; then
7889	echo "CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST=yes" >> $config_host_mak
7890	ld64_symbols=qemu-plugins-ld64.symbols
7891	echo "# Automatically generated by configure - do not modify" > $ld64_symbols
7892	grep 'qemu_' "$source_path/plugins/qemu-plugins.symbols" | sed 's/;//g' | \
7893	    sed -E 's/^[[:space:]]*(.*)/_\1/' >> $ld64_symbols
7894    else
7895	error_exit \
7896	    "If \$plugins=yes, either \$ld_dynamic_list or " \
7897	    "\$ld_exported_symbols_list should have been set to 'yes'."
7898    fi
7899fi
7900
7901if test -n "$gdb_bin" ; then
7902    echo "HAVE_GDB_BIN=$gdb_bin" >> $config_host_mak
7903fi
7904
7905if test "$secret_keyring" = "yes" ; then
7906  echo "CONFIG_SECRET_KEYRING=y" >> $config_host_mak
7907  if test "$have_keyutils" = "yes" ; then
7908    echo "CONFIG_TEST_SECRET_KEYRING=y" >> $config_host_mak
7909  fi
7910fi
7911
7912if test "$tcg_interpreter" = "yes"; then
7913  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/tci $QEMU_INCLUDES"
7914elif test "$ARCH" = "sparc64" ; then
7915  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/sparc $QEMU_INCLUDES"
7916elif test "$ARCH" = "s390x" ; then
7917  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/s390 $QEMU_INCLUDES"
7918elif test "$ARCH" = "x86_64" || test "$ARCH" = "x32" ; then
7919  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/i386 $QEMU_INCLUDES"
7920elif test "$ARCH" = "ppc64" ; then
7921  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/ppc $QEMU_INCLUDES"
7922elif test "$ARCH" = "riscv32" || test "$ARCH" = "riscv64" ; then
7923  QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/riscv $QEMU_INCLUDES"
7924else
7925  QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/\$(ARCH) $QEMU_INCLUDES"
7926fi
7927
7928echo "HELPERS=$helpers" >> $config_host_mak
7929echo "TOOLS=$tools" >> $config_host_mak
7930echo "ROMS=$roms" >> $config_host_mak
7931echo "MAKE=$make" >> $config_host_mak
7932echo "INSTALL=$install" >> $config_host_mak
7933echo "INSTALL_DIR=$install -d -m 0755" >> $config_host_mak
7934echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
7935echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
7936echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
7937echo "PYTHON=$python" >> $config_host_mak
7938echo "SPHINX_BUILD=$sphinx_build" >> $config_host_mak
7939echo "SPHINX_WERROR=$sphinx_werror" >> $config_host_mak
7940echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
7941echo "CC=$cc" >> $config_host_mak
7942if $iasl -h > /dev/null 2>&1; then
7943  echo "IASL=$iasl" >> $config_host_mak
7944fi
7945echo "HOST_CC=$host_cc" >> $config_host_mak
7946echo "CXX=$cxx" >> $config_host_mak
7947echo "OBJCC=$objcc" >> $config_host_mak
7948echo "AR=$ar" >> $config_host_mak
7949echo "ARFLAGS=$ARFLAGS" >> $config_host_mak
7950echo "AS=$as" >> $config_host_mak
7951echo "CCAS=$ccas" >> $config_host_mak
7952echo "CPP=$cpp" >> $config_host_mak
7953echo "OBJCOPY=$objcopy" >> $config_host_mak
7954echo "LD=$ld" >> $config_host_mak
7955echo "RANLIB=$ranlib" >> $config_host_mak
7956echo "NM=$nm" >> $config_host_mak
7957echo "PKG_CONFIG=$pkg_config_exe" >> $config_host_mak
7958echo "WINDRES=$windres" >> $config_host_mak
7959echo "CFLAGS=$CFLAGS" >> $config_host_mak
7960echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
7961echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
7962echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
7963echo "QEMU_INCLUDES=$QEMU_INCLUDES" >> $config_host_mak
7964if test "$sparse" = "yes" ; then
7965  echo "CC           := REAL_CC=\"\$(CC)\" cgcc"       >> $config_host_mak
7966  echo "CPP          := REAL_CC=\"\$(CPP)\" cgcc"      >> $config_host_mak
7967  echo "CXX          := REAL_CC=\"\$(CXX)\" cgcc"      >> $config_host_mak
7968  echo "HOST_CC      := REAL_CC=\"\$(HOST_CC)\" cgcc"  >> $config_host_mak
7969  echo "QEMU_CFLAGS  += -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-non-pointer-null" >> $config_host_mak
7970fi
7971echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
7972echo "LDFLAGS_NOPIE=$LDFLAGS_NOPIE" >> $config_host_mak
7973echo "LD_REL_FLAGS=$LD_REL_FLAGS" >> $config_host_mak
7974echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
7975echo "LIBS+=$LIBS" >> $config_host_mak
7976echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak
7977echo "PTHREAD_LIB=$PTHREAD_LIB" >> $config_host_mak
7978echo "EXESUF=$EXESUF" >> $config_host_mak
7979echo "DSOSUF=$DSOSUF" >> $config_host_mak
7980echo "LDFLAGS_SHARED=$LDFLAGS_SHARED" >> $config_host_mak
7981echo "LIBS_QGA+=$libs_qga" >> $config_host_mak
7982echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak
7983echo "TASN1_CFLAGS=$tasn1_cflags" >> $config_host_mak
7984echo "POD2MAN=$POD2MAN" >> $config_host_mak
7985if test "$gcov" = "yes" ; then
7986  echo "CONFIG_GCOV=y" >> $config_host_mak
7987  echo "GCOV=$gcov_tool" >> $config_host_mak
7988fi
7989
7990if test "$libudev" != "no"; then
7991    echo "CONFIG_LIBUDEV=y" >> $config_host_mak
7992    echo "LIBUDEV_LIBS=$libudev_libs" >> $config_host_mak
7993fi
7994if test "$fuzzing" != "no"; then
7995    echo "CONFIG_FUZZ=y" >> $config_host_mak
7996    echo "FUZZ_CFLAGS=$FUZZ_CFLAGS" >> $config_host_mak
7997    echo "FUZZ_LDFLAGS=$FUZZ_LDFLAGS" >> $config_host_mak
7998fi
7999
8000if test "$edk2_blobs" = "yes" ; then
8001  echo "DECOMPRESS_EDK2_BLOBS=y" >> $config_host_mak
8002fi
8003
8004if test "$rng_none" = "yes"; then
8005  echo "CONFIG_RNG_NONE=y" >> $config_host_mak
8006fi
8007
8008# use included Linux headers
8009if test "$linux" = "yes" ; then
8010  mkdir -p linux-headers
8011  case "$cpu" in
8012  i386|x86_64|x32)
8013    linux_arch=x86
8014    ;;
8015  ppc|ppc64|ppc64le)
8016    linux_arch=powerpc
8017    ;;
8018  s390x)
8019    linux_arch=s390
8020    ;;
8021  aarch64)
8022    linux_arch=arm64
8023    ;;
8024  mips64)
8025    linux_arch=mips
8026    ;;
8027  *)
8028    # For most CPUs the kernel architecture name and QEMU CPU name match.
8029    linux_arch="$cpu"
8030    ;;
8031  esac
8032    # For non-KVM architectures we will not have asm headers
8033    if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
8034      symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
8035    fi
8036fi
8037
8038for target in $target_list; do
8039target_dir="$target"
8040config_target_mak=$target_dir/config-target.mak
8041target_name=$(echo $target | cut -d '-' -f 1)
8042target_aligned_only="no"
8043case "$target_name" in
8044  alpha|hppa|mips64el|mips64|mipsel|mips|mipsn32|mipsn32el|sh4|sh4eb|sparc|sparc64|sparc32plus|xtensa|xtensaeb)
8045  target_aligned_only="yes"
8046  ;;
8047esac
8048target_bigendian="no"
8049case "$target_name" in
8050  armeb|aarch64_be|hppa|lm32|m68k|microblaze|mips|mipsn32|mips64|moxie|or1k|ppc|ppc64|ppc64abi32|s390x|sh4eb|sparc|sparc64|sparc32plus|xtensaeb)
8051  target_bigendian="yes"
8052  ;;
8053esac
8054target_softmmu="no"
8055target_user_only="no"
8056target_linux_user="no"
8057target_bsd_user="no"
8058case "$target" in
8059  ${target_name}-softmmu)
8060    target_softmmu="yes"
8061    ;;
8062  ${target_name}-linux-user)
8063    target_user_only="yes"
8064    target_linux_user="yes"
8065    ;;
8066  ${target_name}-bsd-user)
8067    target_user_only="yes"
8068    target_bsd_user="yes"
8069    ;;
8070  *)
8071    error_exit "Target '$target' not recognised"
8072    exit 1
8073    ;;
8074esac
8075
8076mkdir -p $target_dir
8077echo "# Automatically generated by configure - do not modify" > $config_target_mak
8078
8079bflt="no"
8080mttcg="no"
8081interp_prefix1=$(echo "$interp_prefix" | sed "s/%M/$target_name/g")
8082gdb_xml_files=""
8083
8084TARGET_ARCH="$target_name"
8085TARGET_BASE_ARCH=""
8086TARGET_ABI_DIR=""
8087
8088case "$target_name" in
8089  i386)
8090    mttcg="yes"
8091	gdb_xml_files="i386-32bit.xml"
8092    TARGET_SYSTBL_ABI=i386
8093  ;;
8094  x86_64)
8095    TARGET_BASE_ARCH=i386
8096    TARGET_SYSTBL_ABI=common,64
8097    mttcg="yes"
8098	gdb_xml_files="i386-64bit.xml"
8099  ;;
8100  alpha)
8101    mttcg="yes"
8102    TARGET_SYSTBL_ABI=common
8103  ;;
8104  arm|armeb)
8105    TARGET_ARCH=arm
8106    TARGET_SYSTBL_ABI=common,oabi
8107    bflt="yes"
8108    mttcg="yes"
8109    gdb_xml_files="arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml arm-m-profile.xml"
8110  ;;
8111  aarch64|aarch64_be)
8112    TARGET_ARCH=aarch64
8113    TARGET_BASE_ARCH=arm
8114    bflt="yes"
8115    mttcg="yes"
8116    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"
8117  ;;
8118  cris)
8119  ;;
8120  hppa)
8121    mttcg="yes"
8122    TARGET_SYSTBL_ABI=common,32
8123  ;;
8124  lm32)
8125  ;;
8126  m68k)
8127    bflt="yes"
8128    gdb_xml_files="cf-core.xml cf-fp.xml m68k-core.xml m68k-fp.xml"
8129    TARGET_SYSTBL_ABI=common
8130  ;;
8131  microblaze|microblazeel)
8132    TARGET_ARCH=microblaze
8133    TARGET_SYSTBL_ABI=common
8134    bflt="yes"
8135    echo "TARGET_ABI32=y" >> $config_target_mak
8136  ;;
8137  mips|mipsel)
8138    mttcg="yes"
8139    TARGET_ARCH=mips
8140    echo "TARGET_ABI_MIPSO32=y" >> $config_target_mak
8141    TARGET_SYSTBL_ABI=o32
8142  ;;
8143  mipsn32|mipsn32el)
8144    mttcg="yes"
8145    TARGET_ARCH=mips64
8146    TARGET_BASE_ARCH=mips
8147    echo "TARGET_ABI_MIPSN32=y" >> $config_target_mak
8148    echo "TARGET_ABI32=y" >> $config_target_mak
8149    TARGET_SYSTBL_ABI=n32
8150  ;;
8151  mips64|mips64el)
8152    mttcg="no"
8153    TARGET_ARCH=mips64
8154    TARGET_BASE_ARCH=mips
8155    echo "TARGET_ABI_MIPSN64=y" >> $config_target_mak
8156    TARGET_SYSTBL_ABI=n64
8157  ;;
8158  moxie)
8159  ;;
8160  nios2)
8161  ;;
8162  or1k)
8163    TARGET_ARCH=openrisc
8164    TARGET_BASE_ARCH=openrisc
8165  ;;
8166  ppc)
8167    gdb_xml_files="power-core.xml power-fpu.xml power-altivec.xml power-spe.xml"
8168    TARGET_SYSTBL_ABI=common,nospu,32
8169  ;;
8170  ppc64)
8171    TARGET_BASE_ARCH=ppc
8172    TARGET_ABI_DIR=ppc
8173    TARGET_SYSTBL_ABI=common,nospu,64
8174    mttcg=yes
8175    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
8176  ;;
8177  ppc64le)
8178    TARGET_ARCH=ppc64
8179    TARGET_BASE_ARCH=ppc
8180    TARGET_ABI_DIR=ppc
8181    TARGET_SYSTBL_ABI=common,nospu,64
8182    mttcg=yes
8183    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
8184  ;;
8185  ppc64abi32)
8186    TARGET_ARCH=ppc64
8187    TARGET_BASE_ARCH=ppc
8188    TARGET_ABI_DIR=ppc
8189    TARGET_SYSTBL_ABI=common,nospu,32
8190    echo "TARGET_ABI32=y" >> $config_target_mak
8191    gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
8192  ;;
8193  riscv32)
8194    TARGET_BASE_ARCH=riscv
8195    TARGET_ABI_DIR=riscv
8196    mttcg=yes
8197    gdb_xml_files="riscv-32bit-cpu.xml riscv-32bit-fpu.xml riscv-64bit-fpu.xml riscv-32bit-csr.xml riscv-32bit-virtual.xml"
8198  ;;
8199  riscv64)
8200    TARGET_BASE_ARCH=riscv
8201    TARGET_ABI_DIR=riscv
8202    mttcg=yes
8203    gdb_xml_files="riscv-64bit-cpu.xml riscv-32bit-fpu.xml riscv-64bit-fpu.xml riscv-64bit-csr.xml riscv-64bit-virtual.xml"
8204  ;;
8205  rx)
8206    TARGET_ARCH=rx
8207    bflt="yes"
8208    target_compiler=$cross_cc_rx
8209    gdb_xml_files="rx-core.xml"
8210  ;;
8211  sh4|sh4eb)
8212    TARGET_ARCH=sh4
8213    TARGET_SYSTBL_ABI=common
8214    bflt="yes"
8215  ;;
8216  sparc)
8217    TARGET_SYSTBL_ABI=common,32
8218  ;;
8219  sparc64)
8220    TARGET_BASE_ARCH=sparc
8221    TARGET_SYSTBL_ABI=common,64
8222  ;;
8223  sparc32plus)
8224    TARGET_ARCH=sparc64
8225    TARGET_BASE_ARCH=sparc
8226    TARGET_ABI_DIR=sparc
8227    TARGET_SYSTBL_ABI=common,32
8228    echo "TARGET_ABI32=y" >> $config_target_mak
8229  ;;
8230  s390x)
8231    TARGET_SYSTBL_ABI=common,64
8232    mttcg=yes
8233    gdb_xml_files="s390x-core64.xml s390-acr.xml s390-fpr.xml s390-vx.xml s390-cr.xml s390-virt.xml s390-gs.xml"
8234  ;;
8235  tilegx)
8236  ;;
8237  tricore)
8238  ;;
8239  unicore32)
8240  ;;
8241  xtensa|xtensaeb)
8242    TARGET_ARCH=xtensa
8243    TARGET_SYSTBL_ABI=common
8244    bflt="yes"
8245    mttcg="yes"
8246  ;;
8247  *)
8248    error_exit "Unsupported target CPU"
8249  ;;
8250esac
8251# TARGET_BASE_ARCH needs to be defined after TARGET_ARCH
8252if [ "$TARGET_BASE_ARCH" = "" ]; then
8253  TARGET_BASE_ARCH=$TARGET_ARCH
8254fi
8255
8256symlink "$source_path/Makefile.target" "$target_dir/Makefile"
8257
8258upper() {
8259    echo "$@"| LC_ALL=C tr '[a-z]' '[A-Z]'
8260}
8261
8262target_arch_name="$(upper $TARGET_ARCH)"
8263echo "TARGET_$target_arch_name=y" >> $config_target_mak
8264echo "TARGET_NAME=$target_name" >> $config_target_mak
8265echo "TARGET_BASE_ARCH=$TARGET_BASE_ARCH" >> $config_target_mak
8266if [ "$TARGET_ABI_DIR" = "" ]; then
8267  TARGET_ABI_DIR=$TARGET_ARCH
8268fi
8269echo "TARGET_ABI_DIR=$TARGET_ABI_DIR" >> $config_target_mak
8270if [ "$HOST_VARIANT_DIR" != "" ]; then
8271    echo "HOST_VARIANT_DIR=$HOST_VARIANT_DIR" >> $config_target_mak
8272fi
8273if [ "$TARGET_SYSTBL_ABI" != "" ]; then
8274    echo "TARGET_SYSTBL_ABI=$TARGET_SYSTBL_ABI" >> $config_target_mak
8275fi
8276
8277if supported_xen_target $target; then
8278    echo "CONFIG_XEN=y" >> $config_target_mak
8279    echo "$target/config-devices.mak: CONFIG_XEN=y" >> $config_host_mak
8280    if test "$xen_pci_passthrough" = yes; then
8281        echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak"
8282    fi
8283else
8284    echo "$target/config-devices.mak: CONFIG_XEN=n" >> $config_host_mak
8285fi
8286if supported_kvm_target $target; then
8287    echo "CONFIG_KVM=y" >> $config_target_mak
8288    echo "$target/config-devices.mak: CONFIG_KVM=y" >> $config_host_mak
8289else
8290    echo "$target/config-devices.mak: CONFIG_KVM=n" >> $config_host_mak
8291fi
8292if supported_hax_target $target; then
8293    echo "CONFIG_HAX=y" >> $config_target_mak
8294fi
8295if supported_hvf_target $target; then
8296    echo "CONFIG_HVF=y" >> $config_target_mak
8297fi
8298if supported_whpx_target $target; then
8299    echo "CONFIG_WHPX=y" >> $config_target_mak
8300fi
8301if test "$target_aligned_only" = "yes" ; then
8302  echo "TARGET_ALIGNED_ONLY=y" >> $config_target_mak
8303fi
8304if test "$target_bigendian" = "yes" ; then
8305  echo "TARGET_WORDS_BIGENDIAN=y" >> $config_target_mak
8306fi
8307if test "$target_softmmu" = "yes" ; then
8308  echo "CONFIG_SOFTMMU=y" >> $config_target_mak
8309  if test "$mttcg" = "yes" ; then
8310    echo "TARGET_SUPPORTS_MTTCG=y" >> $config_target_mak
8311  fi
8312fi
8313if test "$target_user_only" = "yes" ; then
8314  echo "CONFIG_USER_ONLY=y" >> $config_target_mak
8315  echo "CONFIG_QEMU_INTERP_PREFIX=\"$interp_prefix1\"" >> $config_target_mak
8316fi
8317if test "$target_linux_user" = "yes" ; then
8318  echo "CONFIG_LINUX_USER=y" >> $config_target_mak
8319fi
8320list=""
8321if test ! -z "$gdb_xml_files" ; then
8322  for x in $gdb_xml_files; do
8323    list="$list $source_path/gdb-xml/$x"
8324  done
8325  echo "TARGET_XML_FILES=$list" >> $config_target_mak
8326fi
8327
8328if test "$target_user_only" = "yes" && test "$bflt" = "yes"; then
8329  echo "TARGET_HAS_BFLT=y" >> $config_target_mak
8330fi
8331if test "$target_bsd_user" = "yes" ; then
8332  echo "CONFIG_BSD_USER=y" >> $config_target_mak
8333fi
8334
8335
8336# generate QEMU_CFLAGS/QEMU_LDFLAGS for targets
8337
8338cflags=""
8339ldflags=""
8340
8341disas_config() {
8342  echo "CONFIG_${1}_DIS=y" >> $config_target_mak
8343  echo "CONFIG_${1}_DIS=y" >> config-all-disas.mak
8344}
8345
8346for i in $ARCH $TARGET_BASE_ARCH ; do
8347  case "$i" in
8348  alpha)
8349    disas_config "ALPHA"
8350  ;;
8351  aarch64)
8352    if test -n "${cxx}"; then
8353      disas_config "ARM_A64"
8354    fi
8355  ;;
8356  arm)
8357    disas_config "ARM"
8358    if test -n "${cxx}"; then
8359      disas_config "ARM_A64"
8360    fi
8361  ;;
8362  cris)
8363    disas_config "CRIS"
8364  ;;
8365  hppa)
8366    disas_config "HPPA"
8367  ;;
8368  i386|x86_64|x32)
8369    disas_config "I386"
8370  ;;
8371  lm32)
8372    disas_config "LM32"
8373  ;;
8374  m68k)
8375    disas_config "M68K"
8376  ;;
8377  microblaze*)
8378    disas_config "MICROBLAZE"
8379  ;;
8380  mips*)
8381    disas_config "MIPS"
8382    if test -n "${cxx}"; then
8383      disas_config "NANOMIPS"
8384    fi
8385  ;;
8386  moxie*)
8387    disas_config "MOXIE"
8388  ;;
8389  nios2)
8390    disas_config "NIOS2"
8391  ;;
8392  or1k)
8393    disas_config "OPENRISC"
8394  ;;
8395  ppc*)
8396    disas_config "PPC"
8397  ;;
8398  riscv*)
8399    disas_config "RISCV"
8400  ;;
8401  rx)
8402    disas_config "RX"
8403  ;;
8404  s390*)
8405    disas_config "S390"
8406  ;;
8407  sh4)
8408    disas_config "SH4"
8409  ;;
8410  sparc*)
8411    disas_config "SPARC"
8412  ;;
8413  xtensa*)
8414    disas_config "XTENSA"
8415  ;;
8416  esac
8417done
8418if test "$tcg_interpreter" = "yes" ; then
8419  disas_config "TCI"
8420fi
8421
8422case "$ARCH" in
8423alpha)
8424  # Ensure there's only a single GP
8425  cflags="-msmall-data $cflags"
8426;;
8427esac
8428
8429if test "$gprof" = "yes" ; then
8430  if test "$target_linux_user" = "yes" ; then
8431    cflags="-p $cflags"
8432    ldflags="-p $ldflags"
8433  fi
8434  if test "$target_softmmu" = "yes" ; then
8435    ldflags="-p $ldflags"
8436    echo "GPROF_CFLAGS=-p" >> $config_target_mak
8437  fi
8438fi
8439
8440# Newer kernels on s390 check for an S390_PGSTE program header and
8441# enable the pgste page table extensions in that case. This makes
8442# the vm.allocate_pgste sysctl unnecessary. We enable this program
8443# header if
8444#  - we build on s390x
8445#  - we build the system emulation for s390x (qemu-system-s390x)
8446#  - KVM is enabled
8447#  - the linker supports --s390-pgste
8448if test "$TARGET_ARCH" = "s390x" && test "$target_softmmu" = "yes" && \
8449        test "$ARCH" = "s390x" && test "$kvm" = "yes"; then
8450    if ld_has --s390-pgste ; then
8451        ldflags="-Wl,--s390-pgste $ldflags"
8452    fi
8453fi
8454
8455echo "QEMU_LDFLAGS+=$ldflags" >> $config_target_mak
8456echo "QEMU_CFLAGS+=$cflags" >> $config_target_mak
8457
8458done # for target in $targets
8459
8460echo "PIXMAN_CFLAGS=$pixman_cflags" >> $config_host_mak
8461echo "PIXMAN_LIBS=$pixman_libs" >> $config_host_mak
8462
8463if [ "$fdt" = "git" ]; then
8464  echo "config-host.h: dtc/all" >> $config_host_mak
8465fi
8466if [ "$capstone" = "git" -o "$capstone" = "internal" ]; then
8467  echo "config-host.h: capstone/all" >> $config_host_mak
8468fi
8469if test -n "$LIBCAPSTONE"; then
8470  echo "LIBCAPSTONE=$LIBCAPSTONE" >> $config_host_mak
8471fi
8472
8473if test "$numa" = "yes"; then
8474  echo "CONFIG_NUMA=y" >> $config_host_mak
8475fi
8476
8477if test "$ccache_cpp2" = "yes"; then
8478  echo "export CCACHE_CPP2=y" >> $config_host_mak
8479fi
8480
8481if test "$safe_stack" = "yes"; then
8482  echo "CONFIG_SAFESTACK=y" >> $config_host_mak
8483fi
8484
8485# If we're using a separate build tree, set it up now.
8486# DIRS are directories which we simply mkdir in the build tree;
8487# LINKS are things to symlink back into the source tree
8488# (these can be both files and directories).
8489# Caution: do not add files or directories here using wildcards. This
8490# will result in problems later if a new file matching the wildcard is
8491# added to the source tree -- nothing will cause configure to be rerun
8492# so the build tree will be missing the link back to the new file, and
8493# tests might fail. Prefer to keep the relevant files in their own
8494# directory and symlink the directory instead.
8495DIRS="tests tests/tcg tests/tcg/lm32 tests/qapi-schema tests/qtest/libqos"
8496DIRS="$DIRS tests/qtest tests/qemu-iotests tests/vm tests/fp tests/qgraph"
8497DIRS="$DIRS docs docs/interop fsdev scsi"
8498DIRS="$DIRS pc-bios/optionrom pc-bios/s390-ccw"
8499DIRS="$DIRS roms/seabios roms/vgabios"
8500LINKS="Makefile"
8501LINKS="$LINKS tests/tcg/lm32/Makefile po/Makefile"
8502LINKS="$LINKS tests/tcg/Makefile.target tests/fp/Makefile"
8503LINKS="$LINKS tests/plugin/Makefile"
8504LINKS="$LINKS pc-bios/optionrom/Makefile pc-bios/keymaps"
8505LINKS="$LINKS pc-bios/s390-ccw/Makefile"
8506LINKS="$LINKS roms/seabios/Makefile roms/vgabios/Makefile"
8507LINKS="$LINKS pc-bios/qemu-icon.bmp"
8508LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
8509LINKS="$LINKS tests/acceptance tests/data"
8510LINKS="$LINKS tests/qemu-iotests/check"
8511LINKS="$LINKS python"
8512for bios_file in \
8513    $source_path/pc-bios/*.bin \
8514    $source_path/pc-bios/*.lid \
8515    $source_path/pc-bios/*.rom \
8516    $source_path/pc-bios/*.dtb \
8517    $source_path/pc-bios/*.img \
8518    $source_path/pc-bios/openbios-* \
8519    $source_path/pc-bios/u-boot.* \
8520    $source_path/pc-bios/edk2-*.fd.bz2 \
8521    $source_path/pc-bios/palcode-*
8522do
8523    LINKS="$LINKS pc-bios/$(basename $bios_file)"
8524done
8525mkdir -p $DIRS
8526for f in $LINKS ; do
8527    if [ -e "$source_path/$f" ] && [ "$pwd_is_source_path" != "y" ]; then
8528        symlink "$source_path/$f" "$f"
8529    fi
8530done
8531
8532(for i in $cross_cc_vars; do
8533  export $i
8534done
8535export target_list source_path use_containers
8536$source_path/tests/tcg/configure.sh)
8537
8538# temporary config to build submodules
8539for rom in seabios vgabios ; do
8540    config_mak=roms/$rom/config.mak
8541    echo "# Automatically generated by configure - do not modify" > $config_mak
8542    echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
8543    echo "AS=$as" >> $config_mak
8544    echo "CCAS=$ccas" >> $config_mak
8545    echo "CC=$cc" >> $config_mak
8546    echo "BCC=bcc" >> $config_mak
8547    echo "CPP=$cpp" >> $config_mak
8548    echo "OBJCOPY=objcopy" >> $config_mak
8549    echo "IASL=$iasl" >> $config_mak
8550    echo "LD=$ld" >> $config_mak
8551    echo "RANLIB=$ranlib" >> $config_mak
8552done
8553
8554# set up qemu-iotests in this build directory
8555iotests_common_env="tests/qemu-iotests/common.env"
8556
8557echo "# Automatically generated by configure - do not modify" > "$iotests_common_env"
8558echo >> "$iotests_common_env"
8559echo "export PYTHON='$python'" >> "$iotests_common_env"
8560
8561# Save the configure command line for later reuse.
8562cat <<EOD >config.status
8563#!/bin/sh
8564# Generated by configure.
8565# Run this file to recreate the current configuration.
8566# Compiler output produced by configure, useful for debugging
8567# configure, is in config.log if it exists.
8568EOD
8569
8570preserve_env() {
8571    envname=$1
8572
8573    eval envval=\$$envname
8574
8575    if test -n "$envval"
8576    then
8577	echo "$envname='$envval'" >> config.status
8578	echo "export $envname" >> config.status
8579    else
8580	echo "unset $envname" >> config.status
8581    fi
8582}
8583
8584# Preserve various env variables that influence what
8585# features/build target configure will detect
8586preserve_env AR
8587preserve_env AS
8588preserve_env CC
8589preserve_env CPP
8590preserve_env CXX
8591preserve_env INSTALL
8592preserve_env LD
8593preserve_env LD_LIBRARY_PATH
8594preserve_env LIBTOOL
8595preserve_env MAKE
8596preserve_env NM
8597preserve_env OBJCOPY
8598preserve_env PATH
8599preserve_env PKG_CONFIG
8600preserve_env PKG_CONFIG_LIBDIR
8601preserve_env PKG_CONFIG_PATH
8602preserve_env PYTHON
8603preserve_env SDL2_CONFIG
8604preserve_env SMBD
8605preserve_env STRIP
8606preserve_env WINDRES
8607
8608printf "exec" >>config.status
8609printf " '%s'" "$0" "$@" >>config.status
8610echo ' "$@"' >>config.status
8611chmod +x config.status
8612
8613rm -r "$TMPDIR1"
8614