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