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