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