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