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