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