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