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# make source path absolute
  15source_path=$(cd "$(dirname -- "$0")"; pwd)
  16
  17if test "$PWD" = "$source_path"
  18then
  19    echo "Using './build' as the directory for build output"
  20
  21    MARKER=build/auto-created-by-configure
  22
  23    if test -e build
  24    then
  25        if test -f $MARKER
  26        then
  27           rm -rf build
  28        else
  29            echo "ERROR: ./build dir already exists and was not previously created by configure"
  30            exit 1
  31        fi
  32    fi
  33
  34    mkdir build
  35    touch $MARKER
  36
  37    cat > GNUmakefile <<'EOF'
  38# This file is auto-generated by configure to support in-source tree
  39# 'make' command invocation
  40
  41ifeq ($(MAKECMDGOALS),)
  42recurse: all
  43endif
  44
  45.NOTPARALLEL: %
  46%: force
  47        @echo 'changing dir to build for $(MAKE) "$(MAKECMDGOALS)"...'
  48        @$(MAKE) -C build -f Makefile $(MAKECMDGOALS)
  49        @if test "$(MAKECMDGOALS)" = "distclean" && \
  50            test -e build/auto-created-by-configure ; \
  51        then \
  52            rm -rf build GNUmakefile ; \
  53        fi
  54force: ;
  55.PHONY: force
  56GNUmakefile: ;
  57
  58EOF
  59    cd build
  60    exec $source_path/configure "$@"
  61fi
  62
  63# Temporary directory used for files created while
  64# configure runs. Since it is in the build directory
  65# we can safely blow away any previous version of it
  66# (and we need not jump through hoops to try to delete
  67# it when configure exits.)
  68TMPDIR1="config-temp"
  69rm -rf "${TMPDIR1}"
  70mkdir -p "${TMPDIR1}"
  71if [ $? -ne 0 ]; then
  72    echo "ERROR: failed to create temporary directory"
  73    exit 1
  74fi
  75
  76TMPB="qemu-conf"
  77TMPC="${TMPDIR1}/${TMPB}.c"
  78TMPO="${TMPDIR1}/${TMPB}.o"
  79TMPCXX="${TMPDIR1}/${TMPB}.cxx"
  80TMPE="${TMPDIR1}/${TMPB}.exe"
  81TMPTXT="${TMPDIR1}/${TMPB}.txt"
  82
  83rm -f config.log
  84
  85# Print a helpful header at the top of config.log
  86echo "# QEMU configure log $(date)" >> config.log
  87printf "# Configured with:" >> config.log
  88printf " '%s'" "$0" "$@" >> config.log
  89echo >> config.log
  90echo "#" >> config.log
  91
  92quote_sh() {
  93    printf "%s" "$1" | sed "s,','\\\\'',g; s,.*,'&',"
  94}
  95
  96print_error() {
  97    (echo
  98    echo "ERROR: $1"
  99    while test -n "$2"; do
 100        echo "       $2"
 101        shift
 102    done
 103    echo) >&2
 104}
 105
 106error_exit() {
 107    print_error "$@"
 108    exit 1
 109}
 110
 111do_compiler() {
 112    # Run the compiler, capturing its output to the log. First argument
 113    # is compiler binary to execute.
 114    compiler="$1"
 115    shift
 116    if test -n "$BASH_VERSION"; then eval '
 117        echo >>config.log "
 118funcs: ${FUNCNAME[*]}
 119lines: ${BASH_LINENO[*]}"
 120    '; fi
 121    echo $compiler "$@" >> config.log
 122    $compiler "$@" >> config.log 2>&1 || return $?
 123    # Test passed. If this is an --enable-werror build, rerun
 124    # the test with -Werror and bail out if it fails. This
 125    # makes warning-generating-errors in configure test code
 126    # obvious to developers.
 127    if test "$werror" != "yes"; then
 128        return 0
 129    fi
 130    # Don't bother rerunning the compile if we were already using -Werror
 131    case "$*" in
 132        *-Werror*)
 133           return 0
 134        ;;
 135    esac
 136    echo $compiler -Werror "$@" >> config.log
 137    $compiler -Werror "$@" >> config.log 2>&1 && return $?
 138    error_exit "configure test passed without -Werror but failed with -Werror." \
 139        "This is probably a bug in the configure script. The failing command" \
 140        "will be at the bottom of config.log." \
 141        "You can run configure with --disable-werror to bypass this check."
 142}
 143
 144do_cc() {
 145    do_compiler "$cc" "$@"
 146}
 147
 148do_cxx() {
 149    do_compiler "$cxx" "$@"
 150}
 151
 152# Append $2 to the variable named $1, with space separation
 153add_to() {
 154    eval $1=\${$1:+\"\$$1 \"}\$2
 155}
 156
 157update_cxxflags() {
 158    # Set QEMU_CXXFLAGS from QEMU_CFLAGS by filtering out those
 159    # options which some versions of GCC's C++ compiler complain about
 160    # because they only make sense for C programs.
 161    QEMU_CXXFLAGS="$QEMU_CXXFLAGS -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"
 162    CONFIGURE_CXXFLAGS=$(echo "$CONFIGURE_CFLAGS" | sed s/-std=gnu99/-std=gnu++11/)
 163    for arg in $QEMU_CFLAGS; do
 164        case $arg in
 165            -Wstrict-prototypes|-Wmissing-prototypes|-Wnested-externs|\
 166            -Wold-style-declaration|-Wold-style-definition|-Wredundant-decls)
 167                ;;
 168            *)
 169                QEMU_CXXFLAGS=${QEMU_CXXFLAGS:+$QEMU_CXXFLAGS }$arg
 170                ;;
 171        esac
 172    done
 173}
 174
 175compile_object() {
 176  local_cflags="$1"
 177  do_cc $CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
 178}
 179
 180compile_prog() {
 181  local_cflags="$1"
 182  local_ldflags="$2"
 183  do_cc $CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC \
 184      $LDFLAGS $CONFIGURE_LDFLAGS $QEMU_LDFLAGS $local_ldflags
 185}
 186
 187# symbolically link $1 to $2.  Portable version of "ln -sf".
 188symlink() {
 189  rm -rf "$2"
 190  mkdir -p "$(dirname "$2")"
 191  ln -s "$1" "$2"
 192}
 193
 194# check whether a command is available to this shell (may be either an
 195# executable or a builtin)
 196has() {
 197    type "$1" >/dev/null 2>&1
 198}
 199
 200version_ge () {
 201    local_ver1=$(expr "$1" : '\([0-9.]*\)' | tr . ' ')
 202    local_ver2=$(echo "$2" | tr . ' ')
 203    while true; do
 204        set x $local_ver1
 205        local_first=${2-0}
 206        # 'shift 2' if $2 is set, or 'shift' if $2 is not set
 207        shift ${2:+2}
 208        local_ver1=$*
 209        set x $local_ver2
 210        # the second argument finished, the first must be greater or equal
 211        test $# = 1 && return 0
 212        test $local_first -lt $2 && return 1
 213        test $local_first -gt $2 && return 0
 214        shift ${2:+2}
 215        local_ver2=$*
 216    done
 217}
 218
 219have_backend () {
 220    echo "$trace_backends" | grep "$1" >/dev/null
 221}
 222
 223glob() {
 224    eval test -z '"${1#'"$2"'}"'
 225}
 226
 227ld_has() {
 228    $ld --help 2>/dev/null | grep ".$1" >/dev/null 2>&1
 229}
 230
 231if printf %s\\n "$source_path" "$PWD" | grep -q "[[:space:]:]";
 232then
 233  error_exit "main directory cannot contain spaces nor colons"
 234fi
 235
 236# default parameters
 237cpu=""
 238iasl="iasl"
 239interp_prefix="/usr/gnemul/qemu-%M"
 240static="no"
 241cross_compile="no"
 242cross_prefix=""
 243audio_drv_list=""
 244block_drv_rw_whitelist=""
 245block_drv_ro_whitelist=""
 246host_cc="cc"
 247audio_win_int=""
 248libs_qga=""
 249debug_info="yes"
 250lto="false"
 251stack_protector=""
 252safe_stack=""
 253use_containers="yes"
 254gdb_bin=$(command -v "gdb-multiarch" || command -v "gdb")
 255
 256if test -e "$source_path/.git"
 257then
 258    git_submodules_action="update"
 259    git_submodules="ui/keycodemapdb"
 260    git_submodules="$git_submodules tests/fp/berkeley-testfloat-3"
 261    git_submodules="$git_submodules tests/fp/berkeley-softfloat-3"
 262else
 263    git_submodules_action="ignore"
 264    git_submodules=""
 265
 266    if ! test -f "$source_path/ui/keycodemapdb/README"
 267    then
 268        echo
 269        echo "ERROR: missing file $source_path/ui/keycodemapdb/README"
 270        echo
 271        echo "This is not a GIT checkout but module content appears to"
 272        echo "be missing. Do not use 'git archive' or GitHub download links"
 273        echo "to acquire QEMU source archives. Non-GIT builds are only"
 274        echo "supported with source archives linked from:"
 275        echo
 276        echo "  https://www.qemu.org/download/#source"
 277        echo
 278        echo "Developers working with GIT can use scripts/archive-source.sh"
 279        echo "if they need to create valid source archives."
 280        echo
 281        exit 1
 282    fi
 283fi
 284git="git"
 285
 286# Don't accept a target_list environment variable.
 287unset target_list
 288unset target_list_exclude
 289
 290# Default value for a variable defining feature "foo".
 291#  * foo="no"  feature will only be used if --enable-foo arg is given
 292#  * foo=""    feature will be searched for, and if found, will be used
 293#              unless --disable-foo is given
 294#  * foo="yes" this value will only be set by --enable-foo flag.
 295#              feature will searched for,
 296#              if not found, configure exits with error
 297#
 298# Always add --enable-foo and --disable-foo command line args.
 299# Distributions want to ensure that several features are compiled in, and it
 300# is impossible without a --enable-foo that exits if a feature is not found.
 301
 302default_feature=""
 303# parse CC options second
 304for opt do
 305  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
 306  case "$opt" in
 307      --without-default-features)
 308          default_feature="no"
 309  ;;
 310  esac
 311done
 312
 313brlapi="auto"
 314curl="auto"
 315iconv="auto"
 316curses="auto"
 317docs="auto"
 318fdt="auto"
 319netmap="no"
 320sdl="auto"
 321sdl_image="auto"
 322coreaudio="auto"
 323virtiofsd="auto"
 324virtfs="auto"
 325libudev="auto"
 326mpath="auto"
 327vnc="enabled"
 328sparse="auto"
 329vde="$default_feature"
 330vnc_sasl="auto"
 331vnc_jpeg="auto"
 332vnc_png="auto"
 333xkbcommon="auto"
 334xen="$default_feature"
 335xen_ctrl_version="$default_feature"
 336xen_pci_passthrough="auto"
 337linux_aio="$default_feature"
 338linux_io_uring="$default_feature"
 339cap_ng="auto"
 340attr="auto"
 341xfs="$default_feature"
 342tcg="enabled"
 343membarrier="$default_feature"
 344vhost_net="$default_feature"
 345vhost_crypto="$default_feature"
 346vhost_scsi="$default_feature"
 347vhost_vsock="$default_feature"
 348vhost_user="no"
 349vhost_user_blk_server="auto"
 350vhost_user_fs="$default_feature"
 351kvm="auto"
 352hax="auto"
 353hvf="auto"
 354whpx="auto"
 355rdma="$default_feature"
 356pvrdma="$default_feature"
 357gprof="no"
 358debug_tcg="no"
 359debug="no"
 360sanitizers="no"
 361tsan="no"
 362fortify_source="$default_feature"
 363strip_opt="yes"
 364tcg_interpreter="false"
 365bigendian="no"
 366mingw32="no"
 367gcov="no"
 368EXESUF=""
 369HOST_DSOSUF=".so"
 370modules="no"
 371module_upgrades="no"
 372prefix="/usr/local"
 373qemu_suffix="qemu"
 374slirp="auto"
 375oss_lib=""
 376bsd="no"
 377linux="no"
 378solaris="no"
 379profiler="no"
 380cocoa="auto"
 381softmmu="yes"
 382linux_user="no"
 383bsd_user="no"
 384blobs="true"
 385pkgversion=""
 386pie=""
 387qom_cast_debug="yes"
 388trace_backends="log"
 389trace_file="trace"
 390spice="$default_feature"
 391rbd="auto"
 392smartcard="$default_feature"
 393u2f="auto"
 394libusb="$default_feature"
 395usb_redir="$default_feature"
 396opengl="$default_feature"
 397cpuid_h="no"
 398avx2_opt="$default_feature"
 399capstone="auto"
 400lzo="auto"
 401snappy="auto"
 402bzip2="auto"
 403lzfse="auto"
 404zstd="auto"
 405guest_agent="$default_feature"
 406guest_agent_with_vss="no"
 407guest_agent_ntddscsi="no"
 408guest_agent_msi="auto"
 409vss_win32_sdk="$default_feature"
 410win_sdk="no"
 411want_tools="$default_feature"
 412libiscsi="auto"
 413libnfs="auto"
 414coroutine=""
 415coroutine_pool="$default_feature"
 416debug_stack_usage="no"
 417crypto_afalg="no"
 418cfi="false"
 419cfi_debug="false"
 420seccomp="auto"
 421glusterfs="auto"
 422gtk="auto"
 423tls_priority="NORMAL"
 424gnutls="$default_feature"
 425nettle="$default_feature"
 426nettle_xts="no"
 427gcrypt="$default_feature"
 428gcrypt_hmac="no"
 429gcrypt_xts="no"
 430qemu_private_xts="yes"
 431auth_pam="$default_feature"
 432vte="$default_feature"
 433virglrenderer="$default_feature"
 434tpm="$default_feature"
 435libssh="$default_feature"
 436live_block_migration=${default_feature:-yes}
 437numa="$default_feature"
 438tcmalloc="no"
 439jemalloc="no"
 440replication=${default_feature:-yes}
 441bochs=${default_feature:-yes}
 442cloop=${default_feature:-yes}
 443dmg=${default_feature:-yes}
 444qcow1=${default_feature:-yes}
 445vdi=${default_feature:-yes}
 446vvfat=${default_feature:-yes}
 447qed=${default_feature:-yes}
 448parallels=${default_feature:-yes}
 449sheepdog="no"
 450libxml2="$default_feature"
 451debug_mutex="no"
 452libpmem="$default_feature"
 453default_devices="true"
 454plugins="no"
 455fuzzing="no"
 456rng_none="no"
 457secret_keyring="$default_feature"
 458libdaxctl="$default_feature"
 459meson=""
 460ninja=""
 461skip_meson=no
 462gettext="auto"
 463fuse="auto"
 464fuse_lseek="auto"
 465multiprocess="auto"
 466
 467malloc_trim="auto"
 468gio="$default_feature"
 469
 470# parse CC options second
 471for opt do
 472  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
 473  case "$opt" in
 474  --cross-prefix=*) cross_prefix="$optarg"
 475                    cross_compile="yes"
 476  ;;
 477  --cc=*) CC="$optarg"
 478  ;;
 479  --cxx=*) CXX="$optarg"
 480  ;;
 481  --cpu=*) cpu="$optarg"
 482  ;;
 483  --extra-cflags=*) QEMU_CFLAGS="$QEMU_CFLAGS $optarg"
 484                    QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg"
 485  ;;
 486  --extra-cxxflags=*) QEMU_CXXFLAGS="$QEMU_CXXFLAGS $optarg"
 487  ;;
 488  --extra-ldflags=*) QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg"
 489                     EXTRA_LDFLAGS="$optarg"
 490  ;;
 491  --enable-debug-info) debug_info="yes"
 492  ;;
 493  --disable-debug-info) debug_info="no"
 494  ;;
 495  --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"
 496  ;;
 497  --cross-cc-cflags-*) cc_arch=${opt#--cross-cc-flags-}; cc_arch=${cc_arch%%=*}
 498                      eval "cross_cc_cflags_${cc_arch}=\$optarg"
 499                      cross_cc_vars="$cross_cc_vars cross_cc_cflags_${cc_arch}"
 500  ;;
 501  --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}
 502                cc_archs="$cc_archs $cc_arch"
 503                eval "cross_cc_${cc_arch}=\$optarg"
 504                cross_cc_vars="$cross_cc_vars cross_cc_${cc_arch}"
 505  ;;
 506  esac
 507done
 508# OS specific
 509# Using uname is really, really broken.  Once we have the right set of checks
 510# we can eliminate its usage altogether.
 511
 512# Preferred compiler:
 513#  ${CC} (if set)
 514#  ${cross_prefix}gcc (if cross-prefix specified)
 515#  system compiler
 516if test -z "${CC}${cross_prefix}"; then
 517  cc="$host_cc"
 518else
 519  cc="${CC-${cross_prefix}gcc}"
 520fi
 521
 522if test -z "${CXX}${cross_prefix}"; then
 523  cxx="c++"
 524else
 525  cxx="${CXX-${cross_prefix}g++}"
 526fi
 527
 528ar="${AR-${cross_prefix}ar}"
 529as="${AS-${cross_prefix}as}"
 530ccas="${CCAS-$cc}"
 531cpp="${CPP-$cc -E}"
 532objcopy="${OBJCOPY-${cross_prefix}objcopy}"
 533ld="${LD-${cross_prefix}ld}"
 534ranlib="${RANLIB-${cross_prefix}ranlib}"
 535nm="${NM-${cross_prefix}nm}"
 536strip="${STRIP-${cross_prefix}strip}"
 537windres="${WINDRES-${cross_prefix}windres}"
 538pkg_config_exe="${PKG_CONFIG-${cross_prefix}pkg-config}"
 539query_pkg_config() {
 540    "${pkg_config_exe}" ${QEMU_PKG_CONFIG_FLAGS} "$@"
 541}
 542pkg_config=query_pkg_config
 543sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
 544
 545# If the user hasn't specified ARFLAGS, default to 'rv', just as make does.
 546ARFLAGS="${ARFLAGS-rv}"
 547
 548# default flags for all hosts
 549# We use -fwrapv to tell the compiler that we require a C dialect where
 550# left shift of signed integers is well defined and has the expected
 551# 2s-complement style results. (Both clang and gcc agree that it
 552# provides these semantics.)
 553QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv $QEMU_CFLAGS"
 554QEMU_CFLAGS="-Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS"
 555QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS"
 556QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
 557
 558# Flags that are needed during configure but later taken care of by Meson
 559CONFIGURE_CFLAGS="-std=gnu99 -Wall"
 560CONFIGURE_LDFLAGS=
 561
 562
 563check_define() {
 564cat > $TMPC <<EOF
 565#if !defined($1)
 566#error $1 not defined
 567#endif
 568int main(void) { return 0; }
 569EOF
 570  compile_object
 571}
 572
 573check_include() {
 574cat > $TMPC <<EOF
 575#include <$1>
 576int main(void) { return 0; }
 577EOF
 578  compile_object
 579}
 580
 581write_c_skeleton() {
 582    cat > $TMPC <<EOF
 583int main(void) { return 0; }
 584EOF
 585}
 586
 587write_c_fuzzer_skeleton() {
 588    cat > $TMPC <<EOF
 589#include <stdint.h>
 590#include <sys/types.h>
 591int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
 592int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
 593EOF
 594}
 595
 596if check_define __linux__ ; then
 597  targetos="Linux"
 598elif check_define _WIN32 ; then
 599  targetos='MINGW32'
 600elif check_define __OpenBSD__ ; then
 601  targetos='OpenBSD'
 602elif check_define __sun__ ; then
 603  targetos='SunOS'
 604elif check_define __HAIKU__ ; then
 605  targetos='Haiku'
 606elif check_define __FreeBSD__ ; then
 607  targetos='FreeBSD'
 608elif check_define __FreeBSD_kernel__ && check_define __GLIBC__; then
 609  targetos='GNU/kFreeBSD'
 610elif check_define __DragonFly__ ; then
 611  targetos='DragonFly'
 612elif check_define __NetBSD__; then
 613  targetos='NetBSD'
 614elif check_define __APPLE__; then
 615  targetos='Darwin'
 616else
 617  # This is a fatal error, but don't report it yet, because we
 618  # might be going to just print the --help text, or it might
 619  # be the result of a missing compiler.
 620  targetos='bogus'
 621fi
 622
 623# Some host OSes need non-standard checks for which CPU to use.
 624# Note that these checks are broken for cross-compilation: if you're
 625# cross-compiling to one of these OSes then you'll need to specify
 626# the correct CPU with the --cpu option.
 627case $targetos in
 628Darwin)
 629  HOST_DSOSUF=".dylib"
 630  ;;
 631SunOS)
 632  # $(uname -m) returns i86pc even on an x86_64 box, so default based on isainfo
 633  if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then
 634    cpu="x86_64"
 635  fi
 636esac
 637
 638if test ! -z "$cpu" ; then
 639  # command line argument
 640  :
 641elif check_define __i386__ ; then
 642  cpu="i386"
 643elif check_define __x86_64__ ; then
 644  if check_define __ILP32__ ; then
 645    cpu="x32"
 646  else
 647    cpu="x86_64"
 648  fi
 649elif check_define __sparc__ ; then
 650  if check_define __arch64__ ; then
 651    cpu="sparc64"
 652  else
 653    cpu="sparc"
 654  fi
 655elif check_define _ARCH_PPC ; then
 656  if check_define _ARCH_PPC64 ; then
 657    if check_define _LITTLE_ENDIAN ; then
 658      cpu="ppc64le"
 659    else
 660      cpu="ppc64"
 661    fi
 662  else
 663    cpu="ppc"
 664  fi
 665elif check_define __mips__ ; then
 666  cpu="mips"
 667elif check_define __s390__ ; then
 668  if check_define __s390x__ ; then
 669    cpu="s390x"
 670  else
 671    cpu="s390"
 672  fi
 673elif check_define __riscv ; then
 674  if check_define _LP64 ; then
 675    cpu="riscv64"
 676  else
 677    cpu="riscv32"
 678  fi
 679elif check_define __arm__ ; then
 680  cpu="arm"
 681elif check_define __aarch64__ ; then
 682  cpu="aarch64"
 683else
 684  cpu=$(uname -m)
 685fi
 686
 687ARCH=
 688# Normalise host CPU name and set ARCH.
 689# Note that this case should only have supported host CPUs, not guests.
 690case "$cpu" in
 691  ppc|ppc64|s390x|sparc64|x32|riscv32|riscv64)
 692  ;;
 693  ppc64le)
 694    ARCH="ppc64"
 695  ;;
 696  i386|i486|i586|i686|i86pc|BePC)
 697    cpu="i386"
 698  ;;
 699  x86_64|amd64)
 700    cpu="x86_64"
 701  ;;
 702  armv*b|armv*l|arm)
 703    cpu="arm"
 704  ;;
 705  aarch64)
 706    cpu="aarch64"
 707  ;;
 708  mips*)
 709    cpu="mips"
 710  ;;
 711  sparc|sun4[cdmuv])
 712    cpu="sparc"
 713  ;;
 714  *)
 715    # This will result in either an error or falling back to TCI later
 716    ARCH=unknown
 717  ;;
 718esac
 719if test -z "$ARCH"; then
 720  ARCH="$cpu"
 721fi
 722
 723# OS specific
 724
 725case $targetos in
 726MINGW32*)
 727  mingw32="yes"
 728  audio_possible_drivers="dsound sdl"
 729  if check_include dsound.h; then
 730    audio_drv_list="dsound"
 731  else
 732    audio_drv_list=""
 733  fi
 734  supported_os="yes"
 735  pie="no"
 736;;
 737GNU/kFreeBSD)
 738  bsd="yes"
 739  audio_drv_list="oss try-sdl"
 740  audio_possible_drivers="oss sdl pa"
 741;;
 742FreeBSD)
 743  bsd="yes"
 744  make="${MAKE-gmake}"
 745  audio_drv_list="oss try-sdl"
 746  audio_possible_drivers="oss sdl pa"
 747  # needed for kinfo_getvmmap(3) in libutil.h
 748  netmap=""  # enable netmap autodetect
 749;;
 750DragonFly)
 751  bsd="yes"
 752  make="${MAKE-gmake}"
 753  audio_drv_list="oss try-sdl"
 754  audio_possible_drivers="oss sdl pa"
 755;;
 756NetBSD)
 757  bsd="yes"
 758  make="${MAKE-gmake}"
 759  audio_drv_list="oss try-sdl"
 760  audio_possible_drivers="oss sdl"
 761  oss_lib="-lossaudio"
 762;;
 763OpenBSD)
 764  bsd="yes"
 765  make="${MAKE-gmake}"
 766  audio_drv_list="try-sdl"
 767  audio_possible_drivers="sdl"
 768;;
 769Darwin)
 770  bsd="yes"
 771  darwin="yes"
 772  audio_drv_list="try-coreaudio try-sdl"
 773  audio_possible_drivers="coreaudio sdl"
 774  # Disable attempts to use ObjectiveC features in os/object.h since they
 775  # won't work when we're compiling with gcc as a C compiler.
 776  QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS"
 777;;
 778SunOS)
 779  solaris="yes"
 780  make="${MAKE-gmake}"
 781  smbd="${SMBD-/usr/sfw/sbin/smbd}"
 782  if test -f /usr/include/sys/soundcard.h ; then
 783    audio_drv_list="oss try-sdl"
 784  fi
 785  audio_possible_drivers="oss sdl"
 786# needed for CMSG_ macros in sys/socket.h
 787  QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS"
 788# needed for TIOCWIN* defines in termios.h
 789  QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
 790;;
 791Haiku)
 792  haiku="yes"
 793  QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS -D_BSD_SOURCE $QEMU_CFLAGS"
 794;;
 795Linux)
 796  audio_drv_list="try-pa oss"
 797  audio_possible_drivers="oss alsa sdl pa"
 798  linux="yes"
 799  linux_user="yes"
 800  vhost_user=${default_feature:-yes}
 801;;
 802esac
 803
 804if [ "$bsd" = "yes" ] ; then
 805  if [ "$darwin" != "yes" ] ; then
 806    bsd_user="yes"
 807  fi
 808fi
 809
 810: ${make=${MAKE-make}}
 811
 812# We prefer python 3.x. A bare 'python' is traditionally
 813# python 2.x, but some distros have it as python 3.x, so
 814# we check that too
 815python=
 816explicit_python=no
 817for binary in "${PYTHON-python3}" python
 818do
 819    if has "$binary"
 820    then
 821        python=$(command -v "$binary")
 822        break
 823    fi
 824done
 825
 826
 827# Check for ancillary tools used in testing
 828genisoimage=
 829for binary in genisoimage mkisofs
 830do
 831    if has $binary
 832    then
 833        genisoimage=$(command -v "$binary")
 834        break
 835    fi
 836done
 837
 838: ${smbd=${SMBD-/usr/sbin/smbd}}
 839
 840# Default objcc to clang if available, otherwise use CC
 841if has clang; then
 842  objcc=clang
 843else
 844  objcc="$cc"
 845fi
 846
 847if test "$mingw32" = "yes" ; then
 848  EXESUF=".exe"
 849  HOST_DSOSUF=".dll"
 850  # MinGW needs -mthreads for TLS and macro _MT.
 851  CONFIGURE_CFLAGS="-mthreads $CONFIGURE_CFLAGS"
 852  write_c_skeleton;
 853  prefix="/qemu"
 854  qemu_suffix=""
 855  libs_qga="-lws2_32 -lwinmm -lpowrprof -lwtsapi32 -lwininet -liphlpapi -lnetapi32 $libs_qga"
 856fi
 857
 858werror=""
 859
 860for opt do
 861  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
 862  case "$opt" in
 863  --help|-h) show_help=yes
 864  ;;
 865  --version|-V) exec cat $source_path/VERSION
 866  ;;
 867  --prefix=*) prefix="$optarg"
 868  ;;
 869  --interp-prefix=*) interp_prefix="$optarg"
 870  ;;
 871  --cross-prefix=*)
 872  ;;
 873  --cc=*)
 874  ;;
 875  --host-cc=*) host_cc="$optarg"
 876  ;;
 877  --cxx=*)
 878  ;;
 879  --iasl=*) iasl="$optarg"
 880  ;;
 881  --objcc=*) objcc="$optarg"
 882  ;;
 883  --make=*) make="$optarg"
 884  ;;
 885  --install=*)
 886  ;;
 887  --python=*) python="$optarg" ; explicit_python=yes
 888  ;;
 889  --sphinx-build=*) sphinx_build="$optarg"
 890  ;;
 891  --skip-meson) skip_meson=yes
 892  ;;
 893  --meson=*) meson="$optarg"
 894  ;;
 895  --ninja=*) ninja="$optarg"
 896  ;;
 897  --smbd=*) smbd="$optarg"
 898  ;;
 899  --extra-cflags=*)
 900  ;;
 901  --extra-cxxflags=*)
 902  ;;
 903  --extra-ldflags=*)
 904  ;;
 905  --enable-debug-info)
 906  ;;
 907  --disable-debug-info)
 908  ;;
 909  --cross-cc-*)
 910  ;;
 911  --enable-modules)
 912      modules="yes"
 913  ;;
 914  --disable-modules)
 915      modules="no"
 916  ;;
 917  --disable-module-upgrades) module_upgrades="no"
 918  ;;
 919  --enable-module-upgrades) module_upgrades="yes"
 920  ;;
 921  --cpu=*)
 922  ;;
 923  --target-list=*) target_list="$optarg"
 924                   if test "$target_list_exclude"; then
 925                       error_exit "Can't mix --target-list with --target-list-exclude"
 926                   fi
 927  ;;
 928  --target-list-exclude=*) target_list_exclude="$optarg"
 929                   if test "$target_list"; then
 930                       error_exit "Can't mix --target-list-exclude with --target-list"
 931                   fi
 932  ;;
 933  --enable-trace-backends=*) trace_backends="$optarg"
 934  ;;
 935  # XXX: backwards compatibility
 936  --enable-trace-backend=*) trace_backends="$optarg"
 937  ;;
 938  --with-trace-file=*) trace_file="$optarg"
 939  ;;
 940  --with-default-devices) default_devices="true"
 941  ;;
 942  --without-default-devices) default_devices="false"
 943  ;;
 944  --without-default-features) # processed above
 945  ;;
 946  --enable-gprof) gprof="yes"
 947  ;;
 948  --enable-gcov) gcov="yes"
 949  ;;
 950  --static)
 951    static="yes"
 952    QEMU_PKG_CONFIG_FLAGS="--static $QEMU_PKG_CONFIG_FLAGS"
 953  ;;
 954  --mandir=*) mandir="$optarg"
 955  ;;
 956  --bindir=*) bindir="$optarg"
 957  ;;
 958  --libdir=*) libdir="$optarg"
 959  ;;
 960  --libexecdir=*) libexecdir="$optarg"
 961  ;;
 962  --includedir=*) includedir="$optarg"
 963  ;;
 964  --datadir=*) datadir="$optarg"
 965  ;;
 966  --with-suffix=*) qemu_suffix="$optarg"
 967  ;;
 968  --docdir=*) docdir="$optarg"
 969  ;;
 970  --localedir=*) localedir="$optarg"
 971  ;;
 972  --sysconfdir=*) sysconfdir="$optarg"
 973  ;;
 974  --localstatedir=*) local_statedir="$optarg"
 975  ;;
 976  --firmwarepath=*) firmwarepath="$optarg"
 977  ;;
 978  --host=*|--build=*|\
 979  --disable-dependency-tracking|\
 980  --sbindir=*|--sharedstatedir=*|\
 981  --oldincludedir=*|--datarootdir=*|--infodir=*|\
 982  --htmldir=*|--dvidir=*|--pdfdir=*|--psdir=*)
 983    # These switches are silently ignored, for compatibility with
 984    # autoconf-generated configure scripts. This allows QEMU's
 985    # configure to be used by RPM and similar macros that set
 986    # lots of directory switches by default.
 987  ;;
 988  --disable-sdl) sdl="disabled"
 989  ;;
 990  --enable-sdl) sdl="enabled"
 991  ;;
 992  --disable-sdl-image) sdl_image="disabled"
 993  ;;
 994  --enable-sdl-image) sdl_image="enabled"
 995  ;;
 996  --disable-qom-cast-debug) qom_cast_debug="no"
 997  ;;
 998  --enable-qom-cast-debug) qom_cast_debug="yes"
 999  ;;
1000  --disable-virtfs) virtfs="disabled"
1001  ;;
1002  --enable-virtfs) virtfs="enabled"
1003  ;;
1004  --disable-libudev) libudev="disabled"
1005  ;;
1006  --enable-libudev) libudev="enabled"
1007  ;;
1008  --disable-virtiofsd) virtiofsd="disabled"
1009  ;;
1010  --enable-virtiofsd) virtiofsd="enabled"
1011  ;;
1012  --disable-mpath) mpath="disabled"
1013  ;;
1014  --enable-mpath) mpath="enabled"
1015  ;;
1016  --disable-vnc) vnc="disabled"
1017  ;;
1018  --enable-vnc) vnc="enabled"
1019  ;;
1020  --disable-gettext) gettext="disabled"
1021  ;;
1022  --enable-gettext) gettext="enabled"
1023  ;;
1024  --oss-lib=*) oss_lib="$optarg"
1025  ;;
1026  --audio-drv-list=*) audio_drv_list="$optarg"
1027  ;;
1028  --block-drv-rw-whitelist=*|--block-drv-whitelist=*) block_drv_rw_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
1029  ;;
1030  --block-drv-ro-whitelist=*) block_drv_ro_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
1031  ;;
1032  --enable-debug-tcg) debug_tcg="yes"
1033  ;;
1034  --disable-debug-tcg) debug_tcg="no"
1035  ;;
1036  --enable-debug)
1037      # Enable debugging options that aren't excessively noisy
1038      debug_tcg="yes"
1039      debug_mutex="yes"
1040      debug="yes"
1041      strip_opt="no"
1042      fortify_source="no"
1043  ;;
1044  --enable-sanitizers) sanitizers="yes"
1045  ;;
1046  --disable-sanitizers) sanitizers="no"
1047  ;;
1048  --enable-tsan) tsan="yes"
1049  ;;
1050  --disable-tsan) tsan="no"
1051  ;;
1052  --enable-sparse) sparse="enabled"
1053  ;;
1054  --disable-sparse) sparse="disabled"
1055  ;;
1056  --disable-strip) strip_opt="no"
1057  ;;
1058  --disable-vnc-sasl) vnc_sasl="disabled"
1059  ;;
1060  --enable-vnc-sasl) vnc_sasl="enabled"
1061  ;;
1062  --disable-vnc-jpeg) vnc_jpeg="disabled"
1063  ;;
1064  --enable-vnc-jpeg) vnc_jpeg="enabled"
1065  ;;
1066  --disable-vnc-png) vnc_png="disabled"
1067  ;;
1068  --enable-vnc-png) vnc_png="enabled"
1069  ;;
1070  --disable-slirp) slirp="disabled"
1071  ;;
1072  --enable-slirp) slirp="enabled"
1073  ;;
1074  --enable-slirp=git) slirp="internal"
1075  ;;
1076  --enable-slirp=system) slirp="system"
1077  ;;
1078  --disable-vde) vde="no"
1079  ;;
1080  --enable-vde) vde="yes"
1081  ;;
1082  --disable-netmap) netmap="no"
1083  ;;
1084  --enable-netmap) netmap="yes"
1085  ;;
1086  --disable-xen) xen="disabled"
1087  ;;
1088  --enable-xen) xen="enabled"
1089  ;;
1090  --disable-xen-pci-passthrough) xen_pci_passthrough="disabled"
1091  ;;
1092  --enable-xen-pci-passthrough) xen_pci_passthrough="enabled"
1093  ;;
1094  --disable-brlapi) brlapi="disabled"
1095  ;;
1096  --enable-brlapi) brlapi="enabled"
1097  ;;
1098  --disable-kvm) kvm="disabled"
1099  ;;
1100  --enable-kvm) kvm="enabled"
1101  ;;
1102  --disable-hax) hax="disabled"
1103  ;;
1104  --enable-hax) hax="enabled"
1105  ;;
1106  --disable-hvf) hvf="disabled"
1107  ;;
1108  --enable-hvf) hvf="enabled"
1109  ;;
1110  --disable-whpx) whpx="disabled"
1111  ;;
1112  --enable-whpx) whpx="enabled"
1113  ;;
1114  --disable-tcg-interpreter) tcg_interpreter="false"
1115  ;;
1116  --enable-tcg-interpreter) tcg_interpreter="true"
1117  ;;
1118  --disable-cap-ng)  cap_ng="disabled"
1119  ;;
1120  --enable-cap-ng) cap_ng="enabled"
1121  ;;
1122  --disable-tcg) tcg="disabled"
1123  ;;
1124  --enable-tcg) tcg="enabled"
1125  ;;
1126  --disable-malloc-trim) malloc_trim="disabled"
1127  ;;
1128  --enable-malloc-trim) malloc_trim="enabled"
1129  ;;
1130  --disable-spice) spice="no"
1131  ;;
1132  --enable-spice) spice="yes"
1133  ;;
1134  --disable-libiscsi) libiscsi="disabled"
1135  ;;
1136  --enable-libiscsi) libiscsi="enabled"
1137  ;;
1138  --disable-libnfs) libnfs="disabled"
1139  ;;
1140  --enable-libnfs) libnfs="enabled"
1141  ;;
1142  --enable-profiler) profiler="yes"
1143  ;;
1144  --disable-cocoa) cocoa="disabled"
1145  ;;
1146  --enable-cocoa) cocoa="enabled"
1147  ;;
1148  --disable-system) softmmu="no"
1149  ;;
1150  --enable-system) softmmu="yes"
1151  ;;
1152  --disable-user)
1153      linux_user="no" ;
1154      bsd_user="no" ;
1155  ;;
1156  --enable-user) ;;
1157  --disable-linux-user) linux_user="no"
1158  ;;
1159  --enable-linux-user) linux_user="yes"
1160  ;;
1161  --disable-bsd-user) bsd_user="no"
1162  ;;
1163  --enable-bsd-user) bsd_user="yes"
1164  ;;
1165  --enable-pie) pie="yes"
1166  ;;
1167  --disable-pie) pie="no"
1168  ;;
1169  --enable-werror) werror="yes"
1170  ;;
1171  --disable-werror) werror="no"
1172  ;;
1173  --enable-lto) lto="true"
1174  ;;
1175  --disable-lto) lto="false"
1176  ;;
1177  --enable-stack-protector) stack_protector="yes"
1178  ;;
1179  --disable-stack-protector) stack_protector="no"
1180  ;;
1181  --enable-safe-stack) safe_stack="yes"
1182  ;;
1183  --disable-safe-stack) safe_stack="no"
1184  ;;
1185  --enable-cfi)
1186      cfi="true";
1187      lto="true";
1188  ;;
1189  --disable-cfi) cfi="false"
1190  ;;
1191  --enable-cfi-debug) cfi_debug="true"
1192  ;;
1193  --disable-cfi-debug) cfi_debug="false"
1194  ;;
1195  --disable-curses) curses="disabled"
1196  ;;
1197  --enable-curses) curses="enabled"
1198  ;;
1199  --disable-iconv) iconv="disabled"
1200  ;;
1201  --enable-iconv) iconv="enabled"
1202  ;;
1203  --disable-curl) curl="disabled"
1204  ;;
1205  --enable-curl) curl="enabled"
1206  ;;
1207  --disable-fdt) fdt="disabled"
1208  ;;
1209  --enable-fdt) fdt="enabled"
1210  ;;
1211  --enable-fdt=git) fdt="internal"
1212  ;;
1213  --enable-fdt=system) fdt="system"
1214  ;;
1215  --disable-linux-aio) linux_aio="no"
1216  ;;
1217  --enable-linux-aio) linux_aio="yes"
1218  ;;
1219  --disable-linux-io-uring) linux_io_uring="no"
1220  ;;
1221  --enable-linux-io-uring) linux_io_uring="yes"
1222  ;;
1223  --disable-attr) attr="disabled"
1224  ;;
1225  --enable-attr) attr="enabled"
1226  ;;
1227  --disable-membarrier) membarrier="no"
1228  ;;
1229  --enable-membarrier) membarrier="yes"
1230  ;;
1231  --disable-blobs) blobs="false"
1232  ;;
1233  --with-pkgversion=*) pkgversion="$optarg"
1234  ;;
1235  --with-coroutine=*) coroutine="$optarg"
1236  ;;
1237  --disable-coroutine-pool) coroutine_pool="no"
1238  ;;
1239  --enable-coroutine-pool) coroutine_pool="yes"
1240  ;;
1241  --enable-debug-stack-usage) debug_stack_usage="yes"
1242  ;;
1243  --enable-crypto-afalg) crypto_afalg="yes"
1244  ;;
1245  --disable-crypto-afalg) crypto_afalg="no"
1246  ;;
1247  --disable-docs) docs="disabled"
1248  ;;
1249  --enable-docs) docs="enabled"
1250  ;;
1251  --disable-vhost-net) vhost_net="no"
1252  ;;
1253  --enable-vhost-net) vhost_net="yes"
1254  ;;
1255  --disable-vhost-crypto) vhost_crypto="no"
1256  ;;
1257  --enable-vhost-crypto) vhost_crypto="yes"
1258  ;;
1259  --disable-vhost-scsi) vhost_scsi="no"
1260  ;;
1261  --enable-vhost-scsi) vhost_scsi="yes"
1262  ;;
1263  --disable-vhost-vsock) vhost_vsock="no"
1264  ;;
1265  --enable-vhost-vsock) vhost_vsock="yes"
1266  ;;
1267  --disable-vhost-user-blk-server) vhost_user_blk_server="disabled"
1268  ;;
1269  --enable-vhost-user-blk-server) vhost_user_blk_server="enabled"
1270  ;;
1271  --disable-vhost-user-fs) vhost_user_fs="no"
1272  ;;
1273  --enable-vhost-user-fs) vhost_user_fs="yes"
1274  ;;
1275  --disable-opengl) opengl="no"
1276  ;;
1277  --enable-opengl) opengl="yes"
1278  ;;
1279  --disable-rbd) rbd="disabled"
1280  ;;
1281  --enable-rbd) rbd="enabled"
1282  ;;
1283  --disable-xfsctl) xfs="no"
1284  ;;
1285  --enable-xfsctl) xfs="yes"
1286  ;;
1287  --disable-smartcard) smartcard="no"
1288  ;;
1289  --enable-smartcard) smartcard="yes"
1290  ;;
1291  --disable-u2f) u2f="disabled"
1292  ;;
1293  --enable-u2f) u2f="enabled"
1294  ;;
1295  --disable-libusb) libusb="no"
1296  ;;
1297  --enable-libusb) libusb="yes"
1298  ;;
1299  --disable-usb-redir) usb_redir="no"
1300  ;;
1301  --enable-usb-redir) usb_redir="yes"
1302  ;;
1303  --disable-zlib-test)
1304  ;;
1305  --disable-lzo) lzo="disabled"
1306  ;;
1307  --enable-lzo) lzo="enabled"
1308  ;;
1309  --disable-snappy) snappy="disabled"
1310  ;;
1311  --enable-snappy) snappy="enabled"
1312  ;;
1313  --disable-bzip2) bzip2="disabled"
1314  ;;
1315  --enable-bzip2) bzip2="enabled"
1316  ;;
1317  --enable-lzfse) lzfse="enabled"
1318  ;;
1319  --disable-lzfse) lzfse="disabled"
1320  ;;
1321  --disable-zstd) zstd="disabled"
1322  ;;
1323  --enable-zstd) zstd="enabled"
1324  ;;
1325  --enable-guest-agent) guest_agent="yes"
1326  ;;
1327  --disable-guest-agent) guest_agent="no"
1328  ;;
1329  --enable-guest-agent-msi) guest_agent_msi="enabled"
1330  ;;
1331  --disable-guest-agent-msi) guest_agent_msi="disabled"
1332  ;;
1333  --with-vss-sdk) vss_win32_sdk=""
1334  ;;
1335  --with-vss-sdk=*) vss_win32_sdk="$optarg"
1336  ;;
1337  --without-vss-sdk) vss_win32_sdk="no"
1338  ;;
1339  --with-win-sdk) win_sdk=""
1340  ;;
1341  --with-win-sdk=*) win_sdk="$optarg"
1342  ;;
1343  --without-win-sdk) win_sdk="no"
1344  ;;
1345  --enable-tools) want_tools="yes"
1346  ;;
1347  --disable-tools) want_tools="no"
1348  ;;
1349  --enable-seccomp) seccomp="enabled"
1350  ;;
1351  --disable-seccomp) seccomp="disabled"
1352  ;;
1353  --disable-glusterfs) glusterfs="disabled"
1354  ;;
1355  --disable-avx2) avx2_opt="no"
1356  ;;
1357  --enable-avx2) avx2_opt="yes"
1358  ;;
1359  --disable-avx512f) avx512f_opt="no"
1360  ;;
1361  --enable-avx512f) avx512f_opt="yes"
1362  ;;
1363
1364  --enable-glusterfs) glusterfs="enabled"
1365  ;;
1366  --disable-virtio-blk-data-plane|--enable-virtio-blk-data-plane)
1367      echo "$0: $opt is obsolete, virtio-blk data-plane is always on" >&2
1368  ;;
1369  --enable-vhdx|--disable-vhdx)
1370      echo "$0: $opt is obsolete, VHDX driver is always built" >&2
1371  ;;
1372  --enable-uuid|--disable-uuid)
1373      echo "$0: $opt is obsolete, UUID support is always built" >&2
1374  ;;
1375  --disable-gtk) gtk="disabled"
1376  ;;
1377  --enable-gtk) gtk="enabled"
1378  ;;
1379  --tls-priority=*) tls_priority="$optarg"
1380  ;;
1381  --disable-gnutls) gnutls="no"
1382  ;;
1383  --enable-gnutls) gnutls="yes"
1384  ;;
1385  --disable-nettle) nettle="no"
1386  ;;
1387  --enable-nettle) nettle="yes"
1388  ;;
1389  --disable-gcrypt) gcrypt="no"
1390  ;;
1391  --enable-gcrypt) gcrypt="yes"
1392  ;;
1393  --disable-auth-pam) auth_pam="no"
1394  ;;
1395  --enable-auth-pam) auth_pam="yes"
1396  ;;
1397  --enable-rdma) rdma="yes"
1398  ;;
1399  --disable-rdma) rdma="no"
1400  ;;
1401  --enable-pvrdma) pvrdma="yes"
1402  ;;
1403  --disable-pvrdma) pvrdma="no"
1404  ;;
1405  --disable-vte) vte="no"
1406  ;;
1407  --enable-vte) vte="yes"
1408  ;;
1409  --disable-virglrenderer) virglrenderer="no"
1410  ;;
1411  --enable-virglrenderer) virglrenderer="yes"
1412  ;;
1413  --disable-tpm) tpm="no"
1414  ;;
1415  --enable-tpm) tpm="yes"
1416  ;;
1417  --disable-libssh) libssh="no"
1418  ;;
1419  --enable-libssh) libssh="yes"
1420  ;;
1421  --disable-live-block-migration) live_block_migration="no"
1422  ;;
1423  --enable-live-block-migration) live_block_migration="yes"
1424  ;;
1425  --disable-numa) numa="no"
1426  ;;
1427  --enable-numa) numa="yes"
1428  ;;
1429  --disable-libxml2) libxml2="no"
1430  ;;
1431  --enable-libxml2) libxml2="yes"
1432  ;;
1433  --disable-tcmalloc) tcmalloc="no"
1434  ;;
1435  --enable-tcmalloc) tcmalloc="yes"
1436  ;;
1437  --disable-jemalloc) jemalloc="no"
1438  ;;
1439  --enable-jemalloc) jemalloc="yes"
1440  ;;
1441  --disable-replication) replication="no"
1442  ;;
1443  --enable-replication) replication="yes"
1444  ;;
1445  --disable-bochs) bochs="no"
1446  ;;
1447  --enable-bochs) bochs="yes"
1448  ;;
1449  --disable-cloop) cloop="no"
1450  ;;
1451  --enable-cloop) cloop="yes"
1452  ;;
1453  --disable-dmg) dmg="no"
1454  ;;
1455  --enable-dmg) dmg="yes"
1456  ;;
1457  --disable-qcow1) qcow1="no"
1458  ;;
1459  --enable-qcow1) qcow1="yes"
1460  ;;
1461  --disable-vdi) vdi="no"
1462  ;;
1463  --enable-vdi) vdi="yes"
1464  ;;
1465  --disable-vvfat) vvfat="no"
1466  ;;
1467  --enable-vvfat) vvfat="yes"
1468  ;;
1469  --disable-qed) qed="no"
1470  ;;
1471  --enable-qed) qed="yes"
1472  ;;
1473  --disable-parallels) parallels="no"
1474  ;;
1475  --enable-parallels) parallels="yes"
1476  ;;
1477  --disable-sheepdog) sheepdog="no"
1478  ;;
1479  --enable-sheepdog) sheepdog="yes"
1480  ;;
1481  --disable-vhost-user) vhost_user="no"
1482  ;;
1483  --enable-vhost-user) vhost_user="yes"
1484  ;;
1485  --disable-vhost-vdpa) vhost_vdpa="no"
1486  ;;
1487  --enable-vhost-vdpa) vhost_vdpa="yes"
1488  ;;
1489  --disable-vhost-kernel) vhost_kernel="no"
1490  ;;
1491  --enable-vhost-kernel) vhost_kernel="yes"
1492  ;;
1493  --disable-capstone) capstone="disabled"
1494  ;;
1495  --enable-capstone) capstone="enabled"
1496  ;;
1497  --enable-capstone=git) capstone="internal"
1498  ;;
1499  --enable-capstone=system) capstone="system"
1500  ;;
1501  --with-git=*) git="$optarg"
1502  ;;
1503  --enable-git-update)
1504      git_submodules_action="update"
1505      echo "--enable-git-update deprecated, use --with-git-submodules=update"
1506  ;;
1507  --disable-git-update)
1508      git_submodules_action="validate"
1509      echo "--disable-git-update deprecated, use --with-git-submodules=validate"
1510  ;;
1511  --with-git-submodules=*)
1512      git_submodules_action="$optarg"
1513  ;;
1514  --enable-debug-mutex) debug_mutex=yes
1515  ;;
1516  --disable-debug-mutex) debug_mutex=no
1517  ;;
1518  --enable-libpmem) libpmem=yes
1519  ;;
1520  --disable-libpmem) libpmem=no
1521  ;;
1522  --enable-xkbcommon) xkbcommon="enabled"
1523  ;;
1524  --disable-xkbcommon) xkbcommon="disabled"
1525  ;;
1526  --enable-plugins) plugins="yes"
1527  ;;
1528  --disable-plugins) plugins="no"
1529  ;;
1530  --enable-containers) use_containers="yes"
1531  ;;
1532  --disable-containers) use_containers="no"
1533  ;;
1534  --enable-fuzzing) fuzzing=yes
1535  ;;
1536  --disable-fuzzing) fuzzing=no
1537  ;;
1538  --gdb=*) gdb_bin="$optarg"
1539  ;;
1540  --enable-rng-none) rng_none=yes
1541  ;;
1542  --disable-rng-none) rng_none=no
1543  ;;
1544  --enable-keyring) secret_keyring="yes"
1545  ;;
1546  --disable-keyring) secret_keyring="no"
1547  ;;
1548  --enable-libdaxctl) libdaxctl=yes
1549  ;;
1550  --disable-libdaxctl) libdaxctl=no
1551  ;;
1552  --enable-fuse) fuse="enabled"
1553  ;;
1554  --disable-fuse) fuse="disabled"
1555  ;;
1556  --enable-fuse-lseek) fuse_lseek="enabled"
1557  ;;
1558  --disable-fuse-lseek) fuse_lseek="disabled"
1559  ;;
1560  --enable-multiprocess) multiprocess="enabled"
1561  ;;
1562  --disable-multiprocess) multiprocess="disabled"
1563  ;;
1564  --enable-gio) gio=yes
1565  ;;
1566  --disable-gio) gio=no
1567  ;;
1568  *)
1569      echo "ERROR: unknown option $opt"
1570      echo "Try '$0 --help' for more information"
1571      exit 1
1572  ;;
1573  esac
1574done
1575
1576case $git_submodules_action in
1577    update|validate)
1578        if test ! -e "$source_path/.git"; then
1579            echo "ERROR: cannot $git_submodules_action git submodules without .git"
1580            exit 1
1581        fi
1582    ;;
1583    ignore)
1584    ;;
1585    *)
1586        echo "ERROR: invalid --with-git-submodules= value '$git_submodules_action'"
1587        exit 1
1588    ;;
1589esac
1590
1591libdir="${libdir:-$prefix/lib}"
1592libexecdir="${libexecdir:-$prefix/libexec}"
1593includedir="${includedir:-$prefix/include}"
1594
1595if test "$mingw32" = "yes" ; then
1596    bindir="${bindir:-$prefix}"
1597else
1598    bindir="${bindir:-$prefix/bin}"
1599fi
1600mandir="${mandir:-$prefix/share/man}"
1601datadir="${datadir:-$prefix/share}"
1602docdir="${docdir:-$prefix/share/doc}"
1603sysconfdir="${sysconfdir:-$prefix/etc}"
1604local_statedir="${local_statedir:-$prefix/var}"
1605firmwarepath="${firmwarepath:-$datadir/qemu-firmware}"
1606localedir="${localedir:-$datadir/locale}"
1607
1608case "$cpu" in
1609    ppc)
1610           CPU_CFLAGS="-m32"
1611           QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS"
1612           ;;
1613    ppc64)
1614           CPU_CFLAGS="-m64"
1615           QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1616           ;;
1617    sparc)
1618           CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc"
1619           QEMU_LDFLAGS="-m32 -mv8plus $QEMU_LDFLAGS"
1620           ;;
1621    sparc64)
1622           CPU_CFLAGS="-m64 -mcpu=ultrasparc"
1623           QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1624           ;;
1625    s390)
1626           CPU_CFLAGS="-m31"
1627           QEMU_LDFLAGS="-m31 $QEMU_LDFLAGS"
1628           ;;
1629    s390x)
1630           CPU_CFLAGS="-m64"
1631           QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1632           ;;
1633    i386)
1634           CPU_CFLAGS="-m32"
1635           QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS"
1636           ;;
1637    x86_64)
1638           # ??? Only extremely old AMD cpus do not have cmpxchg16b.
1639           # If we truly care, we should simply detect this case at
1640           # runtime and generate the fallback to serial emulation.
1641           CPU_CFLAGS="-m64 -mcx16"
1642           QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
1643           ;;
1644    x32)
1645           CPU_CFLAGS="-mx32"
1646           QEMU_LDFLAGS="-mx32 $QEMU_LDFLAGS"
1647           ;;
1648    # No special flags required for other host CPUs
1649esac
1650
1651eval "cross_cc_${cpu}=\$host_cc"
1652cross_cc_vars="$cross_cc_vars cross_cc_${cpu}"
1653QEMU_CFLAGS="$CPU_CFLAGS $QEMU_CFLAGS"
1654
1655# For user-mode emulation the host arch has to be one we explicitly
1656# support, even if we're using TCI.
1657if [ "$ARCH" = "unknown" ]; then
1658  bsd_user="no"
1659  linux_user="no"
1660fi
1661
1662default_target_list=""
1663deprecated_targets_list=ppc64abi32-linux-user,lm32-softmmu,unicore32-softmmu
1664deprecated_features=""
1665mak_wilds=""
1666
1667if [ "$softmmu" = "yes" ]; then
1668    mak_wilds="${mak_wilds} $source_path/default-configs/targets/*-softmmu.mak"
1669fi
1670if [ "$linux_user" = "yes" ]; then
1671    mak_wilds="${mak_wilds} $source_path/default-configs/targets/*-linux-user.mak"
1672fi
1673if [ "$bsd_user" = "yes" ]; then
1674    mak_wilds="${mak_wilds} $source_path/default-configs/targets/*-bsd-user.mak"
1675fi
1676
1677# If the user doesn't explicitly specify a deprecated target we will
1678# skip it.
1679if test -z "$target_list"; then
1680    if test -z "$target_list_exclude"; then
1681        target_list_exclude="$deprecated_targets_list"
1682    else
1683        target_list_exclude="$target_list_exclude,$deprecated_targets_list"
1684    fi
1685fi
1686
1687for config in $mak_wilds; do
1688    target="$(basename "$config" .mak)"
1689    if echo "$target_list_exclude" | grep -vq "$target"; then
1690        default_target_list="${default_target_list} $target"
1691    fi
1692done
1693
1694# Enumerate public trace backends for --help output
1695trace_backend_list=$(echo $(grep -le '^PUBLIC = True$' "$source_path"/scripts/tracetool/backend/*.py | sed -e 's/^.*\/\(.*\)\.py$/\1/'))
1696
1697if test x"$show_help" = x"yes" ; then
1698cat << EOF
1699
1700Usage: configure [options]
1701Options: [defaults in brackets after descriptions]
1702
1703Standard options:
1704  --help                   print this message
1705  --prefix=PREFIX          install in PREFIX [$prefix]
1706  --interp-prefix=PREFIX   where to find shared libraries, etc.
1707                           use %M for cpu name [$interp_prefix]
1708  --target-list=LIST       set target list (default: build all non-deprecated)
1709$(echo Available targets: $default_target_list | \
1710  fold -s -w 53 | sed -e 's/^/                           /')
1711$(echo Deprecated targets: $deprecated_targets_list | \
1712  fold -s -w 53 | sed -e 's/^/                           /')
1713  --target-list-exclude=LIST exclude a set of targets from the default target-list
1714
1715Advanced options (experts only):
1716  --cross-prefix=PREFIX    use PREFIX for compile tools, PREFIX can be blank [$cross_prefix]
1717  --cc=CC                  use C compiler CC [$cc]
1718  --iasl=IASL              use ACPI compiler IASL [$iasl]
1719  --host-cc=CC             use C compiler CC [$host_cc] for code run at
1720                           build time
1721  --cxx=CXX                use C++ compiler CXX [$cxx]
1722  --objcc=OBJCC            use Objective-C compiler OBJCC [$objcc]
1723  --extra-cflags=CFLAGS    append extra C compiler flags QEMU_CFLAGS
1724  --extra-cxxflags=CXXFLAGS append extra C++ compiler flags QEMU_CXXFLAGS
1725  --extra-ldflags=LDFLAGS  append extra linker flags LDFLAGS
1726  --cross-cc-ARCH=CC       use compiler when building ARCH guest test cases
1727  --cross-cc-flags-ARCH=   use compiler flags when building ARCH guest tests
1728  --make=MAKE              use specified make [$make]
1729  --python=PYTHON          use specified python [$python]
1730  --sphinx-build=SPHINX    use specified sphinx-build [$sphinx_build]
1731  --meson=MESON            use specified meson [$meson]
1732  --ninja=NINJA            use specified ninja [$ninja]
1733  --smbd=SMBD              use specified smbd [$smbd]
1734  --with-git=GIT           use specified git [$git]
1735  --with-git-submodules=update   update git submodules (default if .git dir exists)
1736  --with-git-submodules=validate fail if git submodules are not up to date
1737  --with-git-submodules=ignore   do not update or check git submodules (default if no .git dir)
1738  --static                 enable static build [$static]
1739  --mandir=PATH            install man pages in PATH
1740  --datadir=PATH           install firmware in PATH/$qemu_suffix
1741  --localedir=PATH         install translation in PATH/$qemu_suffix
1742  --docdir=PATH            install documentation in PATH/$qemu_suffix
1743  --bindir=PATH            install binaries in PATH
1744  --libdir=PATH            install libraries in PATH
1745  --libexecdir=PATH        install helper binaries in PATH
1746  --sysconfdir=PATH        install config in PATH/$qemu_suffix
1747  --localstatedir=PATH     install local state in PATH (set at runtime on win32)
1748  --firmwarepath=PATH      search PATH for firmware files
1749  --efi-aarch64=PATH       PATH of efi file to use for aarch64 VMs.
1750  --with-suffix=SUFFIX     suffix for QEMU data inside datadir/libdir/sysconfdir/docdir [$qemu_suffix]
1751  --with-pkgversion=VERS   use specified string as sub-version of the package
1752  --without-default-features default all --enable-* options to "disabled"
1753  --without-default-devices  do not include any device that is not needed to
1754                           start the emulator (only use if you are including
1755                           desired devices in default-configs/devices/)
1756  --enable-debug           enable common debug build options
1757  --enable-sanitizers      enable default sanitizers
1758  --enable-tsan            enable thread sanitizer
1759  --disable-strip          disable stripping binaries
1760  --disable-werror         disable compilation abort on warning
1761  --disable-stack-protector disable compiler-provided stack protection
1762  --audio-drv-list=LIST    set audio drivers list:
1763                           Available drivers: $audio_possible_drivers
1764  --block-drv-whitelist=L  Same as --block-drv-rw-whitelist=L
1765  --block-drv-rw-whitelist=L
1766                           set block driver read-write whitelist
1767                           (affects only QEMU, not qemu-img)
1768  --block-drv-ro-whitelist=L
1769                           set block driver read-only whitelist
1770                           (affects only QEMU, not qemu-img)
1771  --enable-trace-backends=B Set trace backend
1772                           Available backends: $trace_backend_list
1773  --with-trace-file=NAME   Full PATH,NAME of file to store traces
1774                           Default:trace-<pid>
1775  --disable-slirp          disable SLIRP userspace network connectivity
1776  --enable-tcg-interpreter enable TCI (TCG with bytecode interpreter, experimental and slow)
1777  --enable-malloc-trim     enable libc malloc_trim() for memory optimization
1778  --oss-lib                path to OSS library
1779  --cpu=CPU                Build for host CPU [$cpu]
1780  --with-coroutine=BACKEND coroutine backend. Supported options:
1781                           ucontext, sigaltstack, windows
1782  --enable-gcov            enable test coverage analysis with gcov
1783  --disable-blobs          disable installing provided firmware blobs
1784  --with-vss-sdk=SDK-path  enable Windows VSS support in QEMU Guest Agent
1785  --with-win-sdk=SDK-path  path to Windows Platform SDK (to build VSS .tlb)
1786  --tls-priority           default TLS protocol/cipher priority string
1787  --enable-gprof           QEMU profiling with gprof
1788  --enable-profiler        profiler support
1789  --enable-debug-stack-usage
1790                           track the maximum stack usage of stacks created by qemu_alloc_stack
1791  --enable-plugins
1792                           enable plugins via shared library loading
1793  --disable-containers     don't use containers for cross-building
1794  --gdb=GDB-path           gdb to use for gdbstub tests [$gdb_bin]
1795
1796Optional features, enabled with --enable-FEATURE and
1797disabled with --disable-FEATURE, default is enabled if available
1798(unless built with --without-default-features):
1799
1800  system          all system emulation targets
1801  user            supported user emulation targets
1802  linux-user      all linux usermode emulation targets
1803  bsd-user        all BSD usermode emulation targets
1804  docs            build documentation
1805  guest-agent     build the QEMU Guest Agent
1806  guest-agent-msi build guest agent Windows MSI installation package
1807  pie             Position Independent Executables
1808  modules         modules support (non-Windows)
1809  module-upgrades try to load modules from alternate paths for upgrades
1810  debug-tcg       TCG debugging (default is disabled)
1811  debug-info      debugging information
1812  lto             Enable Link-Time Optimization.
1813  sparse          sparse checker
1814  safe-stack      SafeStack Stack Smash Protection. Depends on
1815                  clang/llvm >= 3.7 and requires coroutine backend ucontext.
1816  cfi             Enable Control-Flow Integrity for indirect function calls.
1817                  In case of a cfi violation, QEMU is terminated with SIGILL
1818                  Depends on lto and is incompatible with modules
1819                  Automatically enables Link-Time Optimization (lto)
1820  cfi-debug       In case of a cfi violation, a message containing the line that
1821                  triggered the error is written to stderr. After the error,
1822                  QEMU is still terminated with SIGILL
1823  gnutls          GNUTLS cryptography support
1824  nettle          nettle cryptography support
1825  gcrypt          libgcrypt cryptography support
1826  auth-pam        PAM access control
1827  sdl             SDL UI
1828  sdl-image       SDL Image support for icons
1829  gtk             gtk UI
1830  vte             vte support for the gtk UI
1831  curses          curses UI
1832  iconv           font glyph conversion support
1833  vnc             VNC UI support
1834  vnc-sasl        SASL encryption for VNC server
1835  vnc-jpeg        JPEG lossy compression for VNC server
1836  vnc-png         PNG compression for VNC server
1837  cocoa           Cocoa UI (Mac OS X only)
1838  virtfs          VirtFS
1839  virtiofsd       build virtiofs daemon (virtiofsd)
1840  libudev         Use libudev to enumerate host devices
1841  mpath           Multipath persistent reservation passthrough
1842  xen             xen backend driver support
1843  xen-pci-passthrough    PCI passthrough support for Xen
1844  brlapi          BrlAPI (Braile)
1845  curl            curl connectivity
1846  membarrier      membarrier system call (for Linux 4.14+ or Windows)
1847  fdt             fdt device tree
1848  kvm             KVM acceleration support
1849  hax             HAX acceleration support
1850  hvf             Hypervisor.framework acceleration support
1851  whpx            Windows Hypervisor Platform acceleration support
1852  rdma            Enable RDMA-based migration
1853  pvrdma          Enable PVRDMA support
1854  vde             support for vde network
1855  netmap          support for netmap network
1856  linux-aio       Linux AIO support
1857  linux-io-uring  Linux io_uring support
1858  cap-ng          libcap-ng support
1859  attr            attr and xattr support
1860  vhost-net       vhost-net kernel acceleration support
1861  vhost-vsock     virtio sockets device support
1862  vhost-scsi      vhost-scsi kernel target support
1863  vhost-crypto    vhost-user-crypto backend support
1864  vhost-kernel    vhost kernel backend support
1865  vhost-user      vhost-user backend support
1866  vhost-user-blk-server    vhost-user-blk server support
1867  vhost-vdpa      vhost-vdpa kernel backend support
1868  spice           spice
1869  rbd             rados block device (rbd)
1870  libiscsi        iscsi support
1871  libnfs          nfs support
1872  smartcard       smartcard support (libcacard)
1873  u2f             U2F support (u2f-emu)
1874  libusb          libusb (for usb passthrough)
1875  live-block-migration   Block migration in the main migration stream
1876  usb-redir       usb network redirection support
1877  lzo             support of lzo compression library
1878  snappy          support of snappy compression library
1879  bzip2           support of bzip2 compression library
1880                  (for reading bzip2-compressed dmg images)
1881  lzfse           support of lzfse compression library
1882                  (for reading lzfse-compressed dmg images)
1883  zstd            support for zstd compression library
1884                  (for migration compression and qcow2 cluster compression)
1885  seccomp         seccomp support
1886  coroutine-pool  coroutine freelist (better performance)
1887  glusterfs       GlusterFS backend
1888  tpm             TPM support
1889  libssh          ssh block device support
1890  numa            libnuma support
1891  libxml2         for Parallels image format
1892  tcmalloc        tcmalloc support
1893  jemalloc        jemalloc support
1894  avx2            AVX2 optimization support
1895  avx512f         AVX512F optimization support
1896  replication     replication support
1897  opengl          opengl support
1898  virglrenderer   virgl rendering support
1899  xfsctl          xfsctl support
1900  qom-cast-debug  cast debugging support
1901  tools           build qemu-io, qemu-nbd and qemu-img tools
1902  bochs           bochs image format support
1903  cloop           cloop image format support
1904  dmg             dmg image format support
1905  qcow1           qcow v1 image format support
1906  vdi             vdi image format support
1907  vvfat           vvfat image format support
1908  qed             qed image format support
1909  parallels       parallels image format support
1910  sheepdog        sheepdog block driver support (deprecated)
1911  crypto-afalg    Linux AF_ALG crypto backend driver
1912  capstone        capstone disassembler support
1913  debug-mutex     mutex debugging support
1914  libpmem         libpmem support
1915  xkbcommon       xkbcommon support
1916  rng-none        dummy RNG, avoid using /dev/(u)random and getrandom()
1917  libdaxctl       libdaxctl support
1918  fuse            FUSE block device export
1919  fuse-lseek      SEEK_HOLE/SEEK_DATA support for FUSE exports
1920  multiprocess    Out of process device emulation support
1921  gio             libgio support
1922
1923NOTE: The object files are built at the place where configure is launched
1924EOF
1925exit 0
1926fi
1927
1928# Remove old dependency files to make sure that they get properly regenerated
1929rm -f */config-devices.mak.d
1930
1931if test -z "$python"
1932then
1933    error_exit "Python not found. Use --python=/path/to/python"
1934fi
1935if ! has "$make"
1936then
1937    error_exit "GNU make ($make) not found"
1938fi
1939
1940# Note that if the Python conditional here evaluates True we will exit
1941# with status 1 which is a shell 'false' value.
1942if ! $python -c 'import sys; sys.exit(sys.version_info < (3,6))'; then
1943  error_exit "Cannot use '$python', Python >= 3.6 is required." \
1944      "Use --python=/path/to/python to specify a supported Python."
1945fi
1946
1947# Preserve python version since some functionality is dependent on it
1948python_version=$($python -c 'import sys; print("%d.%d.%d" % (sys.version_info[0], sys.version_info[1], sys.version_info[2]))' 2>/dev/null)
1949
1950# Suppress writing compiled files
1951python="$python -B"
1952
1953if test -z "$meson"; then
1954    if test "$explicit_python" = no && has meson && version_ge "$(meson --version)" 0.55.3; then
1955        meson=meson
1956    elif test $git_submodules_action != 'ignore' ; then
1957        meson=git
1958    elif test -e "${source_path}/meson/meson.py" ; then
1959        meson=internal
1960    else
1961        if test "$explicit_python" = yes; then
1962            error_exit "--python requires using QEMU's embedded Meson distribution, but it was not found."
1963        else
1964            error_exit "Meson not found.  Use --meson=/path/to/meson"
1965        fi
1966    fi
1967else
1968    # Meson uses its own Python interpreter to invoke other Python scripts,
1969    # but the user wants to use the one they specified with --python.
1970    #
1971    # We do not want to override the distro Python interpreter (and sometimes
1972    # cannot: for example in Homebrew /usr/bin/meson is a bash script), so
1973    # just require --meson=git|internal together with --python.
1974    if test "$explicit_python" = yes; then
1975        case "$meson" in
1976            git | internal) ;;
1977            *) error_exit "--python requires using QEMU's embedded Meson distribution." ;;
1978        esac
1979    fi
1980fi
1981
1982if test "$meson" = git; then
1983    git_submodules="${git_submodules} meson"
1984fi
1985
1986case "$meson" in
1987    git | internal)
1988        meson="$python ${source_path}/meson/meson.py"
1989        ;;
1990    *) meson=$(command -v "$meson") ;;
1991esac
1992
1993# Probe for ninja
1994
1995if test -z "$ninja"; then
1996    for c in ninja ninja-build samu; do
1997        if has $c; then
1998            ninja=$(command -v "$c")
1999            break
2000        fi
2001    done
2002    if test -z "$ninja"; then
2003      error_exit "Cannot find Ninja"
2004    fi
2005fi
2006
2007# Check that the C compiler works. Doing this here before testing
2008# the host CPU ensures that we had a valid CC to autodetect the
2009# $cpu var (and we should bail right here if that's not the case).
2010# It also allows the help message to be printed without a CC.
2011write_c_skeleton;
2012if compile_object ; then
2013  : C compiler works ok
2014else
2015    error_exit "\"$cc\" either does not exist or does not work"
2016fi
2017if ! compile_prog ; then
2018    error_exit "\"$cc\" cannot build an executable (is your linker broken?)"
2019fi
2020
2021# Consult white-list to determine whether to enable werror
2022# by default.  Only enable by default for git builds
2023if test -z "$werror" ; then
2024    if test "$git_submodules_action" != "ignore" && \
2025        { test "$linux" = "yes" || test "$mingw32" = "yes"; }; then
2026        werror="yes"
2027    else
2028        werror="no"
2029    fi
2030fi
2031
2032if test "$targetos" = "bogus"; then
2033    # Now that we know that we're not printing the help and that
2034    # the compiler works (so the results of the check_defines we used
2035    # to identify the OS are reliable), if we didn't recognize the
2036    # host OS we should stop now.
2037    error_exit "Unrecognized host OS (uname -s reports '$(uname -s)')"
2038fi
2039
2040# Check whether the compiler matches our minimum requirements:
2041cat > $TMPC << EOF
2042#if defined(__clang_major__) && defined(__clang_minor__)
2043# ifdef __apple_build_version__
2044#  if __clang_major__ < 5 || (__clang_major__ == 5 && __clang_minor__ < 1)
2045#   error You need at least XCode Clang v5.1 to compile QEMU
2046#  endif
2047# else
2048#  if __clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ < 4)
2049#   error You need at least Clang v3.4 to compile QEMU
2050#  endif
2051# endif
2052#elif defined(__GNUC__) && defined(__GNUC_MINOR__)
2053# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8)
2054#  error You need at least GCC v4.8 to compile QEMU
2055# endif
2056#else
2057# error You either need GCC or Clang to compiler QEMU
2058#endif
2059int main (void) { return 0; }
2060EOF
2061if ! compile_prog "" "" ; then
2062    error_exit "You need at least GCC v4.8 or Clang v3.4 (or XCode Clang v5.1)"
2063fi
2064
2065# Accumulate -Wfoo and -Wno-bar separately.
2066# We will list all of the enable flags first, and the disable flags second.
2067# Note that we do not add -Werror, because that would enable it for all
2068# configure tests. If a configure test failed due to -Werror this would
2069# just silently disable some features, so it's too error prone.
2070
2071warn_flags=
2072add_to warn_flags -Wold-style-declaration
2073add_to warn_flags -Wold-style-definition
2074add_to warn_flags -Wtype-limits
2075add_to warn_flags -Wformat-security
2076add_to warn_flags -Wformat-y2k
2077add_to warn_flags -Winit-self
2078add_to warn_flags -Wignored-qualifiers
2079add_to warn_flags -Wempty-body
2080add_to warn_flags -Wnested-externs
2081add_to warn_flags -Wendif-labels
2082add_to warn_flags -Wexpansion-to-defined
2083add_to warn_flags -Wimplicit-fallthrough=2
2084
2085nowarn_flags=
2086add_to nowarn_flags -Wno-initializer-overrides
2087add_to nowarn_flags -Wno-missing-include-dirs
2088add_to nowarn_flags -Wno-shift-negative-value
2089add_to nowarn_flags -Wno-string-plus-int
2090add_to nowarn_flags -Wno-typedef-redefinition
2091add_to nowarn_flags -Wno-tautological-type-limit-compare
2092add_to nowarn_flags -Wno-psabi
2093
2094gcc_flags="$warn_flags $nowarn_flags"
2095
2096cc_has_warning_flag() {
2097    write_c_skeleton;
2098
2099    # Use the positive sense of the flag when testing for -Wno-wombat
2100    # support (gcc will happily accept the -Wno- form of unknown
2101    # warning options).
2102    optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
2103    compile_prog "-Werror $optflag" ""
2104}
2105
2106for flag in $gcc_flags; do
2107    if cc_has_warning_flag $flag ; then
2108        QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2109    fi
2110done
2111
2112if test "$stack_protector" != "no"; then
2113  cat > $TMPC << EOF
2114int main(int argc, char *argv[])
2115{
2116    char arr[64], *p = arr, *c = argv[0];
2117    while (*c) {
2118        *p++ = *c++;
2119    }
2120    return 0;
2121}
2122EOF
2123  gcc_flags="-fstack-protector-strong -fstack-protector-all"
2124  sp_on=0
2125  for flag in $gcc_flags; do
2126    # We need to check both a compile and a link, since some compiler
2127    # setups fail only on a .c->.o compile and some only at link time
2128    if compile_object "-Werror $flag" &&
2129       compile_prog "-Werror $flag" ""; then
2130      QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2131      QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
2132      sp_on=1
2133      break
2134    fi
2135  done
2136  if test "$stack_protector" = yes; then
2137    if test $sp_on = 0; then
2138      error_exit "Stack protector not supported"
2139    fi
2140  fi
2141fi
2142
2143# Disable -Wmissing-braces on older compilers that warn even for
2144# the "universal" C zero initializer {0}.
2145cat > $TMPC << EOF
2146struct {
2147  int a[2];
2148} x = {0};
2149EOF
2150if compile_object "-Werror" "" ; then
2151  :
2152else
2153  QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces"
2154fi
2155
2156# Our module code doesn't support Windows
2157if test "$modules" = "yes" && test "$mingw32" = "yes" ; then
2158  error_exit "Modules are not available for Windows"
2159fi
2160
2161# module_upgrades is only reasonable if modules are enabled
2162if test "$modules" = "no" && test "$module_upgrades" = "yes" ; then
2163  error_exit "Can't enable module-upgrades as Modules are not enabled"
2164fi
2165
2166# Static linking is not possible with modules or PIE
2167if test "$static" = "yes" ; then
2168  if test "$modules" = "yes" ; then
2169    error_exit "static and modules are mutually incompatible"
2170  fi
2171fi
2172
2173# Unconditional check for compiler __thread support
2174  cat > $TMPC << EOF
2175static __thread int tls_var;
2176int main(void) { return tls_var; }
2177EOF
2178
2179if ! compile_prog "-Werror" "" ; then
2180    error_exit "Your compiler does not support the __thread specifier for " \
2181        "Thread-Local Storage (TLS). Please upgrade to a version that does."
2182fi
2183
2184cat > $TMPC << EOF
2185
2186#ifdef __linux__
2187#  define THREAD __thread
2188#else
2189#  define THREAD
2190#endif
2191static THREAD int tls_var;
2192int main(void) { return tls_var; }
2193EOF
2194
2195# Check we support --no-pie first; we will need this for building ROMs.
2196if compile_prog "-Werror -fno-pie" "-no-pie"; then
2197  CFLAGS_NOPIE="-fno-pie"
2198fi
2199
2200if test "$static" = "yes"; then
2201  if test "$pie" != "no" && compile_prog "-Werror -fPIE -DPIE" "-static-pie"; then
2202    CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
2203    QEMU_LDFLAGS="-static-pie $QEMU_LDFLAGS"
2204    pie="yes"
2205  elif test "$pie" = "yes"; then
2206    error_exit "-static-pie not available due to missing toolchain support"
2207  else
2208    QEMU_LDFLAGS="-static $QEMU_LDFLAGS"
2209    pie="no"
2210  fi
2211elif test "$pie" = "no"; then
2212  CONFIGURE_CFLAGS="$CFLAGS_NOPIE $CONFIGURE_CFLAGS"
2213elif compile_prog "-Werror -fPIE -DPIE" "-pie"; then
2214  CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
2215  CONFIGURE_LDFLAGS="-pie $CONFIGURE_LDFLAGS"
2216  pie="yes"
2217elif test "$pie" = "yes"; then
2218  error_exit "PIE not available due to missing toolchain support"
2219else
2220  echo "Disabling PIE due to missing toolchain support"
2221  pie="no"
2222fi
2223
2224# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
2225# The combination is known as "full relro", because .got.plt is read-only too.
2226if compile_prog "" "-Wl,-z,relro -Wl,-z,now" ; then
2227  QEMU_LDFLAGS="-Wl,-z,relro -Wl,-z,now $QEMU_LDFLAGS"
2228fi
2229
2230##########################################
2231# __sync_fetch_and_and requires at least -march=i486. Many toolchains
2232# use i686 as default anyway, but for those that don't, an explicit
2233# specification is necessary
2234
2235if test "$cpu" = "i386"; then
2236  cat > $TMPC << EOF
2237static int sfaa(int *ptr)
2238{
2239  return __sync_fetch_and_and(ptr, 0);
2240}
2241
2242int main(void)
2243{
2244  int val = 42;
2245  val = __sync_val_compare_and_swap(&val, 0, 1);
2246  sfaa(&val);
2247  return val;
2248}
2249EOF
2250  if ! compile_prog "" "" ; then
2251    QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS"
2252  fi
2253fi
2254
2255#########################################
2256# Solaris specific configure tool chain decisions
2257
2258if test "$solaris" = "yes" ; then
2259  if has ar; then
2260    :
2261  else
2262    if test -f /usr/ccs/bin/ar ; then
2263      error_exit "No path includes ar" \
2264          "Add /usr/ccs/bin to your path and rerun configure"
2265    fi
2266    error_exit "No path includes ar"
2267  fi
2268fi
2269
2270if test -z "${target_list+xxx}" ; then
2271    default_targets=yes
2272    for target in $default_target_list; do
2273        target_list="$target_list $target"
2274    done
2275    target_list="${target_list# }"
2276else
2277    default_targets=no
2278    target_list=$(echo "$target_list" | sed -e 's/,/ /g')
2279    for target in $target_list; do
2280        # Check that we recognised the target name; this allows a more
2281        # friendly error message than if we let it fall through.
2282        case " $default_target_list " in
2283            *" $target "*)
2284                ;;
2285            *)
2286                error_exit "Unknown target name '$target'"
2287                ;;
2288        esac
2289    done
2290fi
2291
2292for target in $target_list; do
2293    # if a deprecated target is enabled we note it here
2294    if echo "$deprecated_targets_list" | grep -q "$target"; then
2295        add_to deprecated_features $target
2296    fi
2297done
2298
2299# see if system emulation was really requested
2300case " $target_list " in
2301  *"-softmmu "*) softmmu=yes
2302  ;;
2303  *) softmmu=no
2304  ;;
2305esac
2306
2307feature_not_found() {
2308  feature=$1
2309  remedy=$2
2310
2311  error_exit "User requested feature $feature" \
2312      "configure was not able to find it." \
2313      "$remedy"
2314}
2315
2316# ---
2317# big/little endian test
2318cat > $TMPC << EOF
2319short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, };
2320short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, };
2321extern int foo(short *, short *);
2322int main(int argc, char *argv[]) {
2323    return foo(big_endian, little_endian);
2324}
2325EOF
2326
2327if compile_object ; then
2328    if strings -a $TMPO | grep -q BiGeNdIaN ; then
2329        bigendian="yes"
2330    elif strings -a $TMPO | grep -q LiTtLeEnDiAn ; then
2331        bigendian="no"
2332    else
2333        echo big/little test failed
2334    fi
2335else
2336    echo big/little test failed
2337fi
2338
2339##########################################
2340# system tools
2341if test -z "$want_tools"; then
2342    if test "$softmmu" = "no"; then
2343        want_tools=no
2344    else
2345        want_tools=yes
2346    fi
2347fi
2348
2349##########################################
2350# Disable features only meaningful for system-mode emulation
2351if test "$softmmu" = "no"; then
2352    audio_drv_list=""
2353fi
2354
2355##########################################
2356# Some versions of Mac OS X incorrectly define SIZE_MAX
2357cat > $TMPC << EOF
2358#include <stdint.h>
2359#include <stdio.h>
2360int main(int argc, char *argv[]) {
2361    return printf("%zu", SIZE_MAX);
2362}
2363EOF
2364have_broken_size_max=no
2365if ! compile_object -Werror ; then
2366    have_broken_size_max=yes
2367fi
2368
2369##########################################
2370# L2TPV3 probe
2371
2372cat > $TMPC <<EOF
2373#include <sys/socket.h>
2374#include <linux/ip.h>
2375int main(void) { return sizeof(struct mmsghdr); }
2376EOF
2377if compile_prog "" "" ; then
2378  l2tpv3=yes
2379else
2380  l2tpv3=no
2381fi
2382
2383cat > $TMPC <<EOF
2384#include <sys/mman.h>
2385int main(int argc, char *argv[]) {
2386    return mlockall(MCL_FUTURE);
2387}
2388EOF
2389if compile_prog "" "" ; then
2390  have_mlockall=yes
2391else
2392  have_mlockall=no
2393fi
2394
2395#########################################
2396# vhost interdependencies and host support
2397
2398# vhost backends
2399if test "$vhost_user" = "yes" && test "$linux" != "yes"; then
2400  error_exit "vhost-user is only available on Linux"
2401fi
2402test "$vhost_vdpa" = "" && vhost_vdpa=$linux
2403if test "$vhost_vdpa" = "yes" && test "$linux" != "yes"; then
2404  error_exit "vhost-vdpa is only available on Linux"
2405fi
2406test "$vhost_kernel" = "" && vhost_kernel=$linux
2407if test "$vhost_kernel" = "yes" && test "$linux" != "yes"; then
2408  error_exit "vhost-kernel is only available on Linux"
2409fi
2410
2411# vhost-kernel devices
2412test "$vhost_scsi" = "" && vhost_scsi=$vhost_kernel
2413if test "$vhost_scsi" = "yes" && test "$vhost_kernel" != "yes"; then
2414  error_exit "--enable-vhost-scsi requires --enable-vhost-kernel"
2415fi
2416test "$vhost_vsock" = "" && vhost_vsock=$vhost_kernel
2417if test "$vhost_vsock" = "yes" && test "$vhost_kernel" != "yes"; then
2418  error_exit "--enable-vhost-vsock requires --enable-vhost-kernel"
2419fi
2420
2421# vhost-user backends
2422test "$vhost_net_user" = "" && vhost_net_user=$vhost_user
2423if test "$vhost_net_user" = "yes" && test "$vhost_user" = "no"; then
2424  error_exit "--enable-vhost-net-user requires --enable-vhost-user"
2425fi
2426test "$vhost_crypto" = "" && vhost_crypto=$vhost_user
2427if test "$vhost_crypto" = "yes" && test "$vhost_user" = "no"; then
2428  error_exit "--enable-vhost-crypto requires --enable-vhost-user"
2429fi
2430test "$vhost_user_fs" = "" && vhost_user_fs=$vhost_user
2431if test "$vhost_user_fs" = "yes" && test "$vhost_user" = "no"; then
2432  error_exit "--enable-vhost-user-fs requires --enable-vhost-user"
2433fi
2434#vhost-vdpa backends
2435test "$vhost_net_vdpa" = "" && vhost_net_vdpa=$vhost_vdpa
2436if test "$vhost_net_vdpa" = "yes" && test "$vhost_vdpa" = "no"; then
2437  error_exit "--enable-vhost-net-vdpa requires --enable-vhost-vdpa"
2438fi
2439
2440# OR the vhost-kernel, vhost-vdpa and vhost-user values for simplicity
2441if test "$vhost_net" = ""; then
2442  test "$vhost_net_user" = "yes" && vhost_net=yes
2443  test "$vhost_net_vdpa" = "yes" && vhost_net=yes
2444  test "$vhost_kernel" = "yes" && vhost_net=yes
2445fi
2446
2447##########################################
2448# pkg-config probe
2449
2450if ! has "$pkg_config_exe"; then
2451  error_exit "pkg-config binary '$pkg_config_exe' not found"
2452fi
2453
2454##########################################
2455# NPTL probe
2456
2457if test "$linux_user" = "yes"; then
2458  cat > $TMPC <<EOF
2459#include <sched.h>
2460#include <linux/futex.h>
2461int main(void) {
2462#if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
2463#error bork
2464#endif
2465  return 0;
2466}
2467EOF
2468  if ! compile_object ; then
2469    feature_not_found "nptl" "Install glibc and linux kernel headers."
2470  fi
2471fi
2472
2473##########################################
2474# xen probe
2475
2476if test "$xen" != "disabled" ; then
2477  # Check whether Xen library path is specified via --extra-ldflags to avoid
2478  # overriding this setting with pkg-config output. If not, try pkg-config
2479  # to obtain all needed flags.
2480
2481  if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
2482     $pkg_config --exists xencontrol ; then
2483    xen_ctrl_version="$(printf '%d%02d%02d' \
2484      $($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
2485    xen=enabled
2486    xen_pc="xencontrol xenstore xenforeignmemory xengnttab"
2487    xen_pc="$xen_pc xenevtchn xendevicemodel"
2488    if $pkg_config --exists xentoolcore; then
2489      xen_pc="$xen_pc xentoolcore"
2490    fi
2491    xen_cflags="$($pkg_config --cflags $xen_pc)"
2492    xen_libs="$($pkg_config --libs $xen_pc)"
2493  else
2494
2495    xen_libs="-lxenstore -lxenctrl"
2496    xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
2497
2498    # First we test whether Xen headers and libraries are available.
2499    # If no, we are done and there is no Xen support.
2500    # If yes, more tests are run to detect the Xen version.
2501
2502    # Xen (any)
2503    cat > $TMPC <<EOF
2504#include <xenctrl.h>
2505int main(void) {
2506  return 0;
2507}
2508EOF
2509    if ! compile_prog "" "$xen_libs" ; then
2510      # Xen not found
2511      if test "$xen" = "enabled" ; then
2512        feature_not_found "xen" "Install xen devel"
2513      fi
2514      xen=disabled
2515
2516    # Xen unstable
2517    elif
2518        cat > $TMPC <<EOF &&
2519#undef XC_WANT_COMPAT_DEVICEMODEL_API
2520#define __XEN_TOOLS__
2521#include <xendevicemodel.h>
2522#include <xenforeignmemory.h>
2523int main(void) {
2524  xendevicemodel_handle *xd;
2525  xenforeignmemory_handle *xfmem;
2526
2527  xd = xendevicemodel_open(0, 0);
2528  xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
2529
2530  xfmem = xenforeignmemory_open(0, 0);
2531  xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
2532
2533  return 0;
2534}
2535EOF
2536        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2537      then
2538      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2539      xen_ctrl_version=41100
2540      xen=enabled
2541    elif
2542        cat > $TMPC <<EOF &&
2543#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2544#include <xenforeignmemory.h>
2545#include <xentoolcore.h>
2546int main(void) {
2547  xenforeignmemory_handle *xfmem;
2548
2549  xfmem = xenforeignmemory_open(0, 0);
2550  xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
2551  xentoolcore_restrict_all(0);
2552
2553  return 0;
2554}
2555EOF
2556        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2557      then
2558      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2559      xen_ctrl_version=41000
2560      xen=enabled
2561    elif
2562        cat > $TMPC <<EOF &&
2563#undef XC_WANT_COMPAT_DEVICEMODEL_API
2564#define __XEN_TOOLS__
2565#include <xendevicemodel.h>
2566int main(void) {
2567  xendevicemodel_handle *xd;
2568
2569  xd = xendevicemodel_open(0, 0);
2570  xendevicemodel_close(xd);
2571
2572  return 0;
2573}
2574EOF
2575        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
2576      then
2577      xen_stable_libs="-lxendevicemodel $xen_stable_libs"
2578      xen_ctrl_version=40900
2579      xen=enabled
2580    elif
2581        cat > $TMPC <<EOF &&
2582/*
2583 * If we have stable libs the we don't want the libxc compat
2584 * layers, regardless of what CFLAGS we may have been given.
2585 *
2586 * Also, check if xengnttab_grant_copy_segment_t is defined and
2587 * grant copy operation is implemented.
2588 */
2589#undef XC_WANT_COMPAT_EVTCHN_API
2590#undef XC_WANT_COMPAT_GNTTAB_API
2591#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2592#include <xenctrl.h>
2593#include <xenstore.h>
2594#include <xenevtchn.h>
2595#include <xengnttab.h>
2596#include <xenforeignmemory.h>
2597#include <stdint.h>
2598#include <xen/hvm/hvm_info_table.h>
2599#if !defined(HVM_MAX_VCPUS)
2600# error HVM_MAX_VCPUS not defined
2601#endif
2602int main(void) {
2603  xc_interface *xc = NULL;
2604  xenforeignmemory_handle *xfmem;
2605  xenevtchn_handle *xe;
2606  xengnttab_handle *xg;
2607  xengnttab_grant_copy_segment_t* seg = NULL;
2608
2609  xs_daemon_open();
2610
2611  xc = xc_interface_open(0, 0, 0);
2612  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2613  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2614  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2615  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2616
2617  xfmem = xenforeignmemory_open(0, 0);
2618  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2619
2620  xe = xenevtchn_open(0, 0);
2621  xenevtchn_fd(xe);
2622
2623  xg = xengnttab_open(0, 0);
2624  xengnttab_grant_copy(xg, 0, seg);
2625
2626  return 0;
2627}
2628EOF
2629        compile_prog "" "$xen_libs $xen_stable_libs"
2630      then
2631      xen_ctrl_version=40800
2632      xen=enabled
2633    elif
2634        cat > $TMPC <<EOF &&
2635/*
2636 * If we have stable libs the we don't want the libxc compat
2637 * layers, regardless of what CFLAGS we may have been given.
2638 */
2639#undef XC_WANT_COMPAT_EVTCHN_API
2640#undef XC_WANT_COMPAT_GNTTAB_API
2641#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2642#include <xenctrl.h>
2643#include <xenstore.h>
2644#include <xenevtchn.h>
2645#include <xengnttab.h>
2646#include <xenforeignmemory.h>
2647#include <stdint.h>
2648#include <xen/hvm/hvm_info_table.h>
2649#if !defined(HVM_MAX_VCPUS)
2650# error HVM_MAX_VCPUS not defined
2651#endif
2652int main(void) {
2653  xc_interface *xc = NULL;
2654  xenforeignmemory_handle *xfmem;
2655  xenevtchn_handle *xe;
2656  xengnttab_handle *xg;
2657
2658  xs_daemon_open();
2659
2660  xc = xc_interface_open(0, 0, 0);
2661  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2662  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2663  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2664  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2665
2666  xfmem = xenforeignmemory_open(0, 0);
2667  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2668
2669  xe = xenevtchn_open(0, 0);
2670  xenevtchn_fd(xe);
2671
2672  xg = xengnttab_open(0, 0);
2673  xengnttab_map_grant_ref(xg, 0, 0, 0);
2674
2675  return 0;
2676}
2677EOF
2678        compile_prog "" "$xen_libs $xen_stable_libs"
2679      then
2680      xen_ctrl_version=40701
2681      xen=enabled
2682
2683    # Xen 4.6
2684    elif
2685        cat > $TMPC <<EOF &&
2686#include <xenctrl.h>
2687#include <xenstore.h>
2688#include <stdint.h>
2689#include <xen/hvm/hvm_info_table.h>
2690#if !defined(HVM_MAX_VCPUS)
2691# error HVM_MAX_VCPUS not defined
2692#endif
2693int main(void) {
2694  xc_interface *xc;
2695  xs_daemon_open();
2696  xc = xc_interface_open(0, 0, 0);
2697  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2698  xc_gnttab_open(NULL, 0);
2699  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2700  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2701  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2702  xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
2703  return 0;
2704}
2705EOF
2706        compile_prog "" "$xen_libs"
2707      then
2708      xen_ctrl_version=40600
2709      xen=enabled
2710
2711    # Xen 4.5
2712    elif
2713        cat > $TMPC <<EOF &&
2714#include <xenctrl.h>
2715#include <xenstore.h>
2716#include <stdint.h>
2717#include <xen/hvm/hvm_info_table.h>
2718#if !defined(HVM_MAX_VCPUS)
2719# error HVM_MAX_VCPUS not defined
2720#endif
2721int main(void) {
2722  xc_interface *xc;
2723  xs_daemon_open();
2724  xc = xc_interface_open(0, 0, 0);
2725  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2726  xc_gnttab_open(NULL, 0);
2727  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2728  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2729  xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
2730  return 0;
2731}
2732EOF
2733        compile_prog "" "$xen_libs"
2734      then
2735      xen_ctrl_version=40500
2736      xen=enabled
2737
2738    elif
2739        cat > $TMPC <<EOF &&
2740#include <xenctrl.h>
2741#include <xenstore.h>
2742#include <stdint.h>
2743#include <xen/hvm/hvm_info_table.h>
2744#if !defined(HVM_MAX_VCPUS)
2745# error HVM_MAX_VCPUS not defined
2746#endif
2747int main(void) {
2748  xc_interface *xc;
2749  xs_daemon_open();
2750  xc = xc_interface_open(0, 0, 0);
2751  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2752  xc_gnttab_open(NULL, 0);
2753  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2754  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2755  return 0;
2756}
2757EOF
2758        compile_prog "" "$xen_libs"
2759      then
2760      xen_ctrl_version=40200
2761      xen=enabled
2762
2763    else
2764      if test "$xen" = "enabled" ; then
2765        feature_not_found "xen (unsupported version)" \
2766                          "Install a supported xen (xen 4.2 or newer)"
2767      fi
2768      xen=disabled
2769    fi
2770
2771    if test "$xen" = enabled; then
2772      if test $xen_ctrl_version -ge 40701  ; then
2773        xen_libs="$xen_libs $xen_stable_libs "
2774      fi
2775    fi
2776  fi
2777fi
2778
2779##########################################
2780# GNUTLS probe
2781
2782if test "$gnutls" != "no"; then
2783    pass="no"
2784    if $pkg_config --exists "gnutls >= 3.1.18"; then
2785        gnutls_cflags=$($pkg_config --cflags gnutls)
2786        gnutls_libs=$($pkg_config --libs gnutls)
2787        # Packaging for the static libraries is not always correct.
2788        # At least ubuntu 18.04 ships only shared libraries.
2789        write_c_skeleton
2790        if compile_prog "" "$gnutls_libs" ; then
2791            pass="yes"
2792        fi
2793    fi
2794    if test "$pass" = "no" && test "$gnutls" = "yes"; then
2795        feature_not_found "gnutls" "Install gnutls devel >= 3.1.18"
2796    else
2797        gnutls="$pass"
2798    fi
2799fi
2800
2801
2802# If user didn't give a --disable/enable-gcrypt flag,
2803# then mark as disabled if user requested nettle
2804# explicitly
2805if test -z "$gcrypt"
2806then
2807    if test "$nettle" = "yes"
2808    then
2809        gcrypt="no"
2810    fi
2811fi
2812
2813# If user didn't give a --disable/enable-nettle flag,
2814# then mark as disabled if user requested gcrypt
2815# explicitly
2816if test -z "$nettle"
2817then
2818    if test "$gcrypt" = "yes"
2819    then
2820        nettle="no"
2821    fi
2822fi
2823
2824has_libgcrypt() {
2825    if ! has "libgcrypt-config"
2826    then
2827        return 1
2828    fi
2829
2830    if test -n "$cross_prefix"
2831    then
2832        host=$(libgcrypt-config --host)
2833        if test "$host-" != $cross_prefix
2834        then
2835            return 1
2836        fi
2837    fi
2838
2839    maj=`libgcrypt-config --version | awk -F . '{print $1}'`
2840    min=`libgcrypt-config --version | awk -F . '{print $2}'`
2841
2842    if test $maj != 1 || test $min -lt 5
2843    then
2844       return 1
2845    fi
2846
2847    return 0
2848}
2849
2850
2851if test "$nettle" != "no"; then
2852    pass="no"
2853    if $pkg_config --exists "nettle >= 2.7.1"; then
2854        nettle_cflags=$($pkg_config --cflags nettle)
2855        nettle_libs=$($pkg_config --libs nettle)
2856        nettle_version=$($pkg_config --modversion nettle)
2857        # Link test to make sure the given libraries work (e.g for static).
2858        write_c_skeleton
2859        if compile_prog "" "$nettle_libs" ; then
2860            if test -z "$gcrypt"; then
2861               gcrypt="no"
2862            fi
2863            pass="yes"
2864        fi
2865    fi
2866    if test "$pass" = "yes"
2867    then
2868        cat > $TMPC << EOF
2869#include <nettle/xts.h>
2870int main(void) {
2871  return 0;
2872}
2873EOF
2874        if compile_prog "$nettle_cflags" "$nettle_libs" ; then
2875            nettle_xts=yes
2876            qemu_private_xts=no
2877        fi
2878    fi
2879    if test "$pass" = "no" && test "$nettle" = "yes"; then
2880        feature_not_found "nettle" "Install nettle devel >= 2.7.1"
2881    else
2882        nettle="$pass"
2883    fi
2884fi
2885
2886if test "$gcrypt" != "no"; then
2887    pass="no"
2888    if has_libgcrypt; then
2889        gcrypt_cflags=$(libgcrypt-config --cflags)
2890        gcrypt_libs=$(libgcrypt-config --libs)
2891        # Debian has removed -lgpg-error from libgcrypt-config
2892        # as it "spreads unnecessary dependencies" which in
2893        # turn breaks static builds...
2894        if test "$static" = "yes"
2895        then
2896            gcrypt_libs="$gcrypt_libs -lgpg-error"
2897        fi
2898
2899        # Link test to make sure the given libraries work (e.g for static).
2900        write_c_skeleton
2901        if compile_prog "" "$gcrypt_libs" ; then
2902            pass="yes"
2903        fi
2904    fi
2905    if test "$pass" = "yes"; then
2906        gcrypt="yes"
2907        cat > $TMPC << EOF
2908#include <gcrypt.h>
2909int main(void) {
2910  gcry_mac_hd_t handle;
2911  gcry_mac_open(&handle, GCRY_MAC_HMAC_MD5,
2912                GCRY_MAC_FLAG_SECURE, NULL);
2913  return 0;
2914}
2915EOF
2916        if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
2917            gcrypt_hmac=yes
2918        fi
2919        cat > $TMPC << EOF
2920#include <gcrypt.h>
2921int main(void) {
2922  gcry_cipher_hd_t handle;
2923  gcry_cipher_open(&handle, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_XTS, 0);
2924  return 0;
2925}
2926EOF
2927        if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
2928            gcrypt_xts=yes
2929            qemu_private_xts=no
2930        fi
2931    elif test "$gcrypt" = "yes"; then
2932        feature_not_found "gcrypt" "Install gcrypt devel >= 1.5.0"
2933    else
2934        gcrypt="no"
2935    fi
2936fi
2937
2938
2939if test "$gcrypt" = "yes" && test "$nettle" = "yes"
2940then
2941    error_exit "Only one of gcrypt & nettle can be enabled"
2942fi
2943
2944##########################################
2945# libtasn1 - only for the TLS creds/session test suite
2946
2947tasn1=yes
2948tasn1_cflags=""
2949tasn1_libs=""
2950if $pkg_config --exists "libtasn1"; then
2951    tasn1_cflags=$($pkg_config --cflags libtasn1)
2952    tasn1_libs=$($pkg_config --libs libtasn1)
2953else
2954    tasn1=no
2955fi
2956
2957
2958##########################################
2959# PAM probe
2960
2961if test "$auth_pam" != "no"; then
2962    cat > $TMPC <<EOF
2963#include <security/pam_appl.h>
2964#include <stdio.h>
2965int main(void) {
2966   const char *service_name = "qemu";
2967   const char *user = "frank";
2968   const struct pam_conv pam_conv = { 0 };
2969   pam_handle_t *pamh = NULL;
2970   pam_start(service_name, user, &pam_conv, &pamh);
2971   return 0;
2972}
2973EOF
2974    if compile_prog "" "-lpam" ; then
2975        auth_pam=yes
2976    else
2977        if test "$auth_pam" = "yes"; then
2978            feature_not_found "PAM" "Install PAM development package"
2979        else
2980            auth_pam=no
2981        fi
2982    fi
2983fi
2984
2985##########################################
2986# VTE probe
2987
2988if test "$vte" != "no"; then
2989    vteminversion="0.32.0"
2990    if $pkg_config --exists "vte-2.91"; then
2991      vtepackage="vte-2.91"
2992    else
2993      vtepackage="vte-2.90"
2994    fi
2995    if $pkg_config --exists "$vtepackage >= $vteminversion"; then
2996        vte_cflags=$($pkg_config --cflags $vtepackage)
2997        vte_libs=$($pkg_config --libs $vtepackage)
2998        vteversion=$($pkg_config --modversion $vtepackage)
2999        vte="yes"
3000    elif test "$vte" = "yes"; then
3001        feature_not_found "vte" "Install libvte-2.90/2.91 devel"
3002    else
3003        vte="no"
3004    fi
3005fi
3006
3007##########################################
3008# RDMA needs OpenFabrics libraries
3009if test "$rdma" != "no" ; then
3010  cat > $TMPC <<EOF
3011#include <rdma/rdma_cma.h>
3012int main(void) { return 0; }
3013EOF
3014  rdma_libs="-lrdmacm -libverbs -libumad"
3015  if compile_prog "" "$rdma_libs" ; then
3016    rdma="yes"
3017  else
3018    if test "$rdma" = "yes" ; then
3019        error_exit \
3020            " OpenFabrics librdmacm/libibverbs/libibumad not present." \
3021            " Your options:" \
3022            "  (1) Fast: Install infiniband packages (devel) from your distro." \
3023            "  (2) Cleanest: Install libraries from www.openfabrics.org" \
3024            "  (3) Also: Install softiwarp if you don't have RDMA hardware"
3025    fi
3026    rdma="no"
3027  fi
3028fi
3029
3030##########################################
3031# PVRDMA detection
3032
3033cat > $TMPC <<EOF &&
3034#include <sys/mman.h>
3035
3036int
3037main(void)
3038{
3039    char buf = 0;
3040    void *addr = &buf;
3041    addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
3042
3043    return 0;
3044}
3045EOF
3046
3047if test "$rdma" = "yes" ; then
3048    case "$pvrdma" in
3049    "")
3050        if compile_prog "" ""; then
3051            pvrdma="yes"
3052        else
3053            pvrdma="no"
3054        fi
3055        ;;
3056    "yes")
3057        if ! compile_prog "" ""; then
3058            error_exit "PVRDMA is not supported since mremap is not implemented"
3059        fi
3060        pvrdma="yes"
3061        ;;
3062    "no")
3063        pvrdma="no"
3064        ;;
3065    esac
3066else
3067    if test "$pvrdma" = "yes" ; then
3068        error_exit "PVRDMA requires rdma suppport"
3069    fi
3070    pvrdma="no"
3071fi
3072
3073# Let's see if enhanced reg_mr is supported
3074if test "$pvrdma" = "yes" ; then
3075
3076cat > $TMPC <<EOF &&
3077#include <infiniband/verbs.h>
3078
3079int
3080main(void)
3081{
3082    struct ibv_mr *mr;
3083    struct ibv_pd *pd = NULL;
3084    size_t length = 10;
3085    uint64_t iova = 0;
3086    int access = 0;
3087    void *addr = NULL;
3088
3089    mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
3090
3091    ibv_dereg_mr(mr);
3092
3093    return 0;
3094}
3095EOF
3096    if ! compile_prog "" "-libverbs"; then
3097        QEMU_CFLAGS="$QEMU_CFLAGS -DLEGACY_RDMA_REG_MR"
3098    fi
3099fi
3100
3101##########################################
3102# xfsctl() probe, used for file-posix.c
3103if test "$xfs" != "no" ; then
3104  cat > $TMPC << EOF
3105#include <stddef.h>  /* NULL */
3106#include <xfs/xfs.h>
3107int main(void)
3108{
3109    xfsctl(NULL, 0, 0, NULL);
3110    return 0;
3111}
3112EOF
3113  if compile_prog "" "" ; then
3114    xfs="yes"
3115  else
3116    if test "$xfs" = "yes" ; then
3117      feature_not_found "xfs" "Install xfsprogs/xfslibs devel"
3118    fi
3119    xfs=no
3120  fi
3121fi
3122
3123##########################################
3124# vde libraries probe
3125if test "$vde" != "no" ; then
3126  vde_libs="-lvdeplug"
3127  cat > $TMPC << EOF
3128#include <libvdeplug.h>
3129int main(void)
3130{
3131    struct vde_open_args a = {0, 0, 0};
3132    char s[] = "";
3133    vde_open(s, s, &a);
3134    return 0;
3135}
3136EOF
3137  if compile_prog "" "$vde_libs" ; then
3138    vde=yes
3139  else
3140    if test "$vde" = "yes" ; then
3141      feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
3142    fi
3143    vde=no
3144  fi
3145fi
3146
3147##########################################
3148# netmap support probe
3149# Apart from looking for netmap headers, we make sure that the host API version
3150# supports the netmap backend (>=11). The upper bound (15) is meant to simulate
3151# a minor/major version number. Minor new features will be marked with values up
3152# to 15, and if something happens that requires a change to the backend we will
3153# move above 15, submit the backend fixes and modify this two bounds.
3154if test "$netmap" != "no" ; then
3155  cat > $TMPC << EOF
3156#include <inttypes.h>
3157#include <net/if.h>
3158#include <net/netmap.h>
3159#include <net/netmap_user.h>
3160#if (NETMAP_API < 11) || (NETMAP_API > 15)
3161#error
3162#endif
3163int main(void) { return 0; }
3164EOF
3165  if compile_prog "" "" ; then
3166    netmap=yes
3167  else
3168    if test "$netmap" = "yes" ; then
3169      feature_not_found "netmap"
3170    fi
3171    netmap=no
3172  fi
3173fi
3174
3175##########################################
3176# detect CoreAudio
3177if test "$coreaudio" != "no" ; then
3178  coreaudio_libs="-framework CoreAudio"
3179  cat > $TMPC << EOF
3180#include <CoreAudio/CoreAudio.h>
3181int main(void)
3182{
3183  return (int)AudioGetCurrentHostTime();
3184}
3185EOF
3186  if compile_prog "" "$coreaudio_libs" ; then
3187    coreaudio=yes
3188  else
3189    coreaudio=no
3190  fi
3191fi
3192
3193##########################################
3194# Sound support libraries probe
3195
3196audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
3197for drv in $audio_drv_list; do
3198    case $drv in
3199    alsa | try-alsa)
3200    if $pkg_config alsa --exists; then
3201        alsa_libs=$($pkg_config alsa --libs)
3202        alsa_cflags=$($pkg_config alsa --cflags)
3203        alsa=yes
3204        if test "$drv" = "try-alsa"; then
3205            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa/alsa/')
3206        fi
3207    else
3208        if test "$drv" = "try-alsa"; then
3209            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa//')
3210        else
3211            error_exit "$drv check failed" \
3212                "Make sure to have the $drv libs and headers installed."
3213        fi
3214    fi
3215    ;;
3216
3217    pa | try-pa)
3218    if $pkg_config libpulse --exists; then
3219        libpulse=yes
3220        pulse_libs=$($pkg_config libpulse --libs)
3221        pulse_cflags=$($pkg_config libpulse --cflags)
3222        if test "$drv" = "try-pa"; then
3223            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa/pa/')
3224        fi
3225    else
3226        if test "$drv" = "try-pa"; then
3227            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa//')
3228        else
3229            error_exit "$drv check failed" \
3230                "Make sure to have the $drv libs and headers installed."
3231        fi
3232    fi
3233    ;;
3234
3235    sdl)
3236    if test "$sdl" = "no"; then
3237        error_exit "sdl not found or disabled, can not use sdl audio driver"
3238    fi
3239    ;;
3240
3241    try-sdl)
3242    if test "$sdl" = "no"; then
3243        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl//')
3244    else
3245        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl/sdl/')
3246    fi
3247    ;;
3248
3249    coreaudio | try-coreaudio)
3250    if test "$coreaudio" = "no"; then
3251      if test "$drv" = "try-coreaudio"; then
3252        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-coreaudio//')
3253      else
3254        error_exit "$drv check failed" \
3255                "Make sure to have the $drv is available."
3256      fi
3257    else
3258      coreaudio_libs="-framework CoreAudio"
3259      if test "$drv" = "try-coreaudio"; then
3260        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-coreaudio/coreaudio/')
3261      fi
3262    fi
3263    ;;
3264
3265    dsound)
3266      dsound_libs="-lole32 -ldxguid"
3267      audio_win_int="yes"
3268    ;;
3269
3270    oss)
3271      oss_libs="$oss_lib"
3272    ;;
3273
3274    jack | try-jack)
3275    if $pkg_config jack --exists; then
3276        libjack=yes
3277        jack_libs=$($pkg_config jack --libs)
3278        if test "$drv" = "try-jack"; then
3279            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack/jack/')
3280        fi
3281    else
3282        if test "$drv" = "try-jack"; then
3283            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack//')
3284        else
3285            error_exit "$drv check failed" \
3286                "Make sure to have the $drv libs and headers installed."
3287        fi
3288    fi
3289    ;;
3290
3291    *)
3292    echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
3293        error_exit "Unknown driver '$drv' selected" \
3294            "Possible drivers are: $audio_possible_drivers"
3295    }
3296    ;;
3297    esac
3298done
3299
3300##########################################
3301# glib support probe
3302
3303glib_req_ver=2.48
3304glib_modules=gthread-2.0
3305if test "$modules" = yes; then
3306    glib_modules="$glib_modules gmodule-export-2.0"
3307fi
3308if test "$plugins" = yes; then
3309    glib_modules="$glib_modules gmodule-2.0"
3310fi
3311
3312for i in $glib_modules; do
3313    if $pkg_config --atleast-version=$glib_req_ver $i; then
3314        glib_cflags=$($pkg_config --cflags $i)
3315        glib_libs=$($pkg_config --libs $i)
3316    else
3317        error_exit "glib-$glib_req_ver $i is required to compile QEMU"
3318    fi
3319done
3320
3321# This workaround is required due to a bug in pkg-config file for glib as it
3322# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
3323
3324if test "$static" = yes && test "$mingw32" = yes; then
3325    glib_cflags="-DGLIB_STATIC_COMPILATION $glib_cflags"
3326fi
3327
3328if ! test "$gio" = "no"; then
3329    pass=no
3330    if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
3331        gio_cflags=$($pkg_config --cflags gio-2.0)
3332        gio_libs=$($pkg_config --libs gio-2.0)
3333        gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
3334        if [ ! -x "$gdbus_codegen" ]; then
3335            gdbus_codegen=
3336        fi
3337        # Check that the libraries actually work -- Ubuntu 18.04 ships
3338        # with pkg-config --static --libs data for gio-2.0 that is missing
3339        # -lblkid and will give a link error.
3340        cat > $TMPC <<EOF
3341#include <gio/gio.h>
3342int main(void)
3343{
3344    g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
3345    return 0;
3346}
3347EOF
3348        if compile_prog "$gio_cflags" "$gio_libs" ; then
3349            pass=yes
3350        else
3351            pass=no
3352        fi
3353
3354        if test "$pass" = "yes" &&
3355            $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
3356            gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
3357            gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
3358        fi
3359    fi
3360
3361    if test "$pass" = "no"; then
3362        if test "$gio" = "yes"; then
3363            feature_not_found "gio" "Install libgio >= 2.0"
3364        else
3365            gio=no
3366        fi
3367    else
3368        gio=yes
3369    fi
3370fi
3371
3372# Sanity check that the current size_t matches the
3373# size that glib thinks it should be. This catches
3374# problems on multi-arch where people try to build
3375# 32-bit QEMU while pointing at 64-bit glib headers
3376cat > $TMPC <<EOF
3377#include <glib.h>
3378#include <unistd.h>
3379
3380#define QEMU_BUILD_BUG_ON(x) \
3381  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
3382
3383int main(void) {
3384   QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
3385   return 0;
3386}
3387EOF
3388
3389if ! compile_prog "$glib_cflags" "$glib_libs" ; then
3390    error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
3391               "You probably need to set PKG_CONFIG_LIBDIR"\
3392               "to point to the right pkg-config files for your"\
3393               "build target"
3394fi
3395
3396# Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
3397cat > $TMPC << EOF
3398#include <glib.h>
3399int main(void) { return 0; }
3400EOF
3401if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3402    if cc_has_warning_flag "-Wno-unknown-attributes"; then
3403        glib_cflags="-Wno-unknown-attributes $glib_cflags"
3404        CONFIGURE_CFLAGS="-Wno-unknown-attributes $CONFIGURE_CFLAGS"
3405    fi
3406fi
3407
3408# Silence clang warnings triggered by glib < 2.57.2
3409cat > $TMPC << EOF
3410#include <glib.h>
3411typedef struct Foo {
3412    int i;
3413} Foo;
3414static void foo_free(Foo *f)
3415{
3416    g_free(f);
3417}
3418G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free);
3419int main(void) { return 0; }
3420EOF
3421if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
3422    if cc_has_warning_flag "-Wno-unused-function"; then
3423        glib_cflags="$glib_cflags -Wno-unused-function"
3424        CONFIGURE_CFLAGS="$CONFIGURE_CFLAGS -Wno-unused-function"
3425    fi
3426fi
3427
3428##########################################
3429# SHA command probe for modules
3430if test "$modules" = yes; then
3431    shacmd_probe="sha1sum sha1 shasum"
3432    for c in $shacmd_probe; do
3433        if has $c; then
3434            shacmd="$c"
3435            break
3436        fi
3437    done
3438    if test "$shacmd" = ""; then
3439        error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
3440    fi
3441fi
3442
3443##########################################
3444# pthread probe
3445PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
3446
3447pthread=no
3448cat > $TMPC << EOF
3449#include <pthread.h>
3450static void *f(void *p) { return NULL; }
3451int main(void) {
3452  pthread_t thread;
3453  pthread_create(&thread, 0, f, 0);
3454  return 0;
3455}
3456EOF
3457if compile_prog "" "" ; then
3458  pthread=yes
3459else
3460  for pthread_lib in $PTHREADLIBS_LIST; do
3461    if compile_prog "" "$pthread_lib" ; then
3462      pthread=yes
3463      break
3464    fi
3465  done
3466fi
3467
3468if test "$mingw32" != yes && test "$pthread" = no; then
3469  error_exit "pthread check failed" \
3470      "Make sure to have the pthread libs and headers installed."
3471fi
3472
3473# check for pthread_setname_np with thread id
3474pthread_setname_np_w_tid=no
3475cat > $TMPC << EOF
3476#include <pthread.h>
3477
3478static void *f(void *p) { return NULL; }
3479int main(void)
3480{
3481    pthread_t thread;
3482    pthread_create(&thread, 0, f, 0);
3483    pthread_setname_np(thread, "QEMU");
3484    return 0;
3485}
3486EOF
3487if compile_prog "" "$pthread_lib" ; then
3488  pthread_setname_np_w_tid=yes
3489fi
3490
3491# check for pthread_setname_np without thread id
3492pthread_setname_np_wo_tid=no
3493cat > $TMPC << EOF
3494#include <pthread.h>
3495
3496static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
3497int main(void)
3498{
3499    pthread_t thread;
3500    pthread_create(&thread, 0, f, 0);
3501    return 0;
3502}
3503EOF
3504if compile_prog "" "$pthread_lib" ; then
3505  pthread_setname_np_wo_tid=yes
3506fi
3507
3508##########################################
3509# libssh probe
3510if test "$libssh" != "no" ; then
3511  if $pkg_config --exists libssh; then
3512    libssh_cflags=$($pkg_config libssh --cflags)
3513    libssh_libs=$($pkg_config libssh --libs)
3514    libssh=yes
3515  else
3516    if test "$libssh" = "yes" ; then
3517      error_exit "libssh required for --enable-libssh"
3518    fi
3519    libssh=no
3520  fi
3521fi
3522
3523##########################################
3524# Check for libssh 0.8
3525# This is done like this instead of using the LIBSSH_VERSION_* and
3526# SSH_VERSION_* macros because some distributions in the past shipped
3527# snapshots of the future 0.8 from Git, and those snapshots did not
3528# have updated version numbers (still referring to 0.7.0).
3529
3530if test "$libssh" = "yes"; then
3531  cat > $TMPC <<EOF
3532#include <libssh/libssh.h>
3533int main(void) { return ssh_get_server_publickey(NULL, NULL); }
3534EOF
3535  if compile_prog "$libssh_cflags" "$libssh_libs"; then
3536    libssh_cflags="-DHAVE_LIBSSH_0_8 $libssh_cflags"
3537  fi
3538fi
3539
3540##########################################
3541# linux-aio probe
3542
3543if test "$linux_aio" != "no" ; then
3544  cat > $TMPC <<EOF
3545#include <libaio.h>
3546#include <sys/eventfd.h>
3547#include <stddef.h>
3548int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
3549EOF
3550  if compile_prog "" "-laio" ; then
3551    linux_aio=yes
3552  else
3553    if test "$linux_aio" = "yes" ; then
3554      feature_not_found "linux AIO" "Install libaio devel"
3555    fi
3556    linux_aio=no
3557  fi
3558fi
3559##########################################
3560# linux-io-uring probe
3561
3562if test "$linux_io_uring" != "no" ; then
3563  if $pkg_config liburing; then
3564    linux_io_uring_cflags=$($pkg_config --cflags liburing)
3565    linux_io_uring_libs=$($pkg_config --libs liburing)
3566    linux_io_uring=yes
3567  else
3568    if test "$linux_io_uring" = "yes" ; then
3569      feature_not_found "linux io_uring" "Install liburing devel"
3570    fi
3571    linux_io_uring=no
3572  fi
3573fi
3574
3575##########################################
3576# TPM emulation is only on POSIX
3577
3578if test "$tpm" = ""; then
3579  if test "$mingw32" = "yes"; then
3580    tpm=no
3581  else
3582    tpm=yes
3583  fi
3584elif test "$tpm" = "yes"; then
3585  if test "$mingw32" = "yes" ; then
3586    error_exit "TPM emulation only available on POSIX systems"
3587  fi
3588fi
3589
3590##########################################
3591# iovec probe
3592cat > $TMPC <<EOF
3593#include <sys/types.h>
3594#include <sys/uio.h>
3595#include <unistd.h>
3596int main(void) { return sizeof(struct iovec); }
3597EOF
3598iovec=no
3599if compile_prog "" "" ; then
3600  iovec=yes
3601fi
3602
3603##########################################
3604# fdt probe
3605
3606case "$fdt" in
3607  auto | enabled | internal)
3608    # Simpler to always update submodule, even if not needed.
3609    if test "$git_submodules_action" != "ignore"; then
3610      git_submodules="${git_submodules} dtc"
3611    fi
3612    ;;
3613esac
3614
3615##########################################
3616# opengl probe (for sdl2, gtk, milkymist-tmu2)
3617
3618gbm="no"
3619if $pkg_config gbm; then
3620    gbm_cflags="$($pkg_config --cflags gbm)"
3621    gbm_libs="$($pkg_config --libs gbm)"
3622    gbm="yes"
3623fi
3624
3625if test "$opengl" != "no" ; then
3626  epoxy=no
3627  if $pkg_config epoxy; then
3628    cat > $TMPC << EOF
3629#include <epoxy/egl.h>
3630int main(void) { return 0; }
3631EOF
3632    if compile_prog "" "" ; then
3633      epoxy=yes
3634    fi
3635  fi
3636
3637  if test "$epoxy" = "yes" ; then
3638    opengl_cflags="$($pkg_config --cflags epoxy)"
3639    opengl_libs="$($pkg_config --libs epoxy)"
3640    opengl=yes
3641  else
3642    if test "$opengl" = "yes" ; then
3643      feature_not_found "opengl" "Please install epoxy with EGL"
3644    fi
3645    opengl_cflags=""
3646    opengl_libs=""
3647    opengl=no
3648  fi
3649fi
3650
3651##########################################
3652# libxml2 probe
3653if test "$libxml2" != "no" ; then
3654    if $pkg_config --exists libxml-2.0; then
3655        libxml2="yes"
3656        libxml2_cflags=$($pkg_config --cflags libxml-2.0)
3657        libxml2_libs=$($pkg_config --libs libxml-2.0)
3658    else
3659        if test "$libxml2" = "yes"; then
3660            feature_not_found "libxml2" "Install libxml2 devel"
3661        fi
3662        libxml2="no"
3663    fi
3664fi
3665
3666# Check for inotify functions when we are building linux-user
3667# emulator.  This is done because older glibc versions don't
3668# have syscall stubs for these implemented.  In that case we
3669# don't provide them even if kernel supports them.
3670#
3671inotify=no
3672cat > $TMPC << EOF
3673#include <sys/inotify.h>
3674
3675int
3676main(void)
3677{
3678        /* try to start inotify */
3679        return inotify_init();
3680}
3681EOF
3682if compile_prog "" "" ; then
3683  inotify=yes
3684fi
3685
3686inotify1=no
3687cat > $TMPC << EOF
3688#include <sys/inotify.h>
3689
3690int
3691main(void)
3692{
3693    /* try to start inotify */
3694    return inotify_init1(0);
3695}
3696EOF
3697if compile_prog "" "" ; then
3698  inotify1=yes
3699fi
3700
3701# check if pipe2 is there
3702pipe2=no
3703cat > $TMPC << EOF
3704#include <unistd.h>
3705#include <fcntl.h>
3706
3707int main(void)
3708{
3709    int pipefd[2];
3710    return pipe2(pipefd, O_CLOEXEC);
3711}
3712EOF
3713if compile_prog "" "" ; then
3714  pipe2=yes
3715fi
3716
3717# check if accept4 is there
3718accept4=no
3719cat > $TMPC << EOF
3720#include <sys/socket.h>
3721#include <stddef.h>
3722
3723int main(void)
3724{
3725    accept4(0, NULL, NULL, SOCK_CLOEXEC);
3726    return 0;
3727}
3728EOF
3729if compile_prog "" "" ; then
3730  accept4=yes
3731fi
3732
3733# check if tee/splice is there. vmsplice was added same time.
3734splice=no
3735cat > $TMPC << EOF
3736#include <unistd.h>
3737#include <fcntl.h>
3738#include <limits.h>
3739
3740int main(void)
3741{
3742    int len, fd = 0;
3743    len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
3744    splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
3745    return 0;
3746}
3747EOF
3748if compile_prog "" "" ; then
3749  splice=yes
3750fi
3751
3752##########################################
3753# libnuma probe
3754
3755if test "$numa" != "no" ; then
3756  cat > $TMPC << EOF
3757#include <numa.h>
3758int main(void) { return numa_available(); }
3759EOF
3760
3761  if compile_prog "" "-lnuma" ; then
3762    numa=yes
3763    numa_libs="-lnuma"
3764  else
3765    if test "$numa" = "yes" ; then
3766      feature_not_found "numa" "install numactl devel"
3767    fi
3768    numa=no
3769  fi
3770fi
3771
3772malloc=system
3773if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
3774    echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
3775    exit 1
3776elif test "$tcmalloc" = "yes" ; then
3777    malloc=tcmalloc
3778elif test "$jemalloc" = "yes" ; then
3779    malloc=jemalloc
3780fi
3781
3782##########################################
3783# signalfd probe
3784signalfd="no"
3785cat > $TMPC << EOF
3786#include <unistd.h>
3787#include <sys/syscall.h>
3788#include <signal.h>
3789int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }
3790EOF
3791
3792if compile_prog "" "" ; then
3793  signalfd=yes
3794fi
3795
3796# check if optreset global is declared by <getopt.h>
3797optreset="no"
3798cat > $TMPC << EOF
3799#include <getopt.h>
3800int main(void) { return optreset; }
3801EOF
3802
3803if compile_prog "" "" ; then
3804  optreset=yes
3805fi
3806
3807# check if eventfd is supported
3808eventfd=no
3809cat > $TMPC << EOF
3810#include <sys/eventfd.h>
3811
3812int main(void)
3813{
3814    return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
3815}
3816EOF
3817if compile_prog "" "" ; then
3818  eventfd=yes
3819fi
3820
3821# check if memfd is supported
3822memfd=no
3823cat > $TMPC << EOF
3824#include <sys/mman.h>
3825
3826int main(void)
3827{
3828    return memfd_create("foo", MFD_ALLOW_SEALING);
3829}
3830EOF
3831if compile_prog "" "" ; then
3832  memfd=yes
3833fi
3834
3835# check for usbfs
3836have_usbfs=no
3837if test "$linux_user" = "yes"; then
3838  cat > $TMPC << EOF
3839#include <linux/usbdevice_fs.h>
3840
3841#ifndef USBDEVFS_GET_CAPABILITIES
3842#error "USBDEVFS_GET_CAPABILITIES undefined"
3843#endif
3844
3845#ifndef USBDEVFS_DISCONNECT_CLAIM
3846#error "USBDEVFS_DISCONNECT_CLAIM undefined"
3847#endif
3848
3849int main(void)
3850{
3851    return 0;
3852}
3853EOF
3854  if compile_prog "" ""; then
3855    have_usbfs=yes
3856  fi
3857fi
3858
3859# check for fallocate
3860fallocate=no
3861cat > $TMPC << EOF
3862#include <fcntl.h>
3863
3864int main(void)
3865{
3866    fallocate(0, 0, 0, 0);
3867    return 0;
3868}
3869EOF
3870if compile_prog "" "" ; then
3871  fallocate=yes
3872fi
3873
3874# check for fallocate hole punching
3875fallocate_punch_hole=no
3876cat > $TMPC << EOF
3877#include <fcntl.h>
3878#include <linux/falloc.h>
3879
3880int main(void)
3881{
3882    fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
3883    return 0;
3884}
3885EOF
3886if compile_prog "" "" ; then
3887  fallocate_punch_hole=yes
3888fi
3889
3890# check that fallocate supports range zeroing inside the file
3891fallocate_zero_range=no
3892cat > $TMPC << EOF
3893#include <fcntl.h>
3894#include <linux/falloc.h>
3895
3896int main(void)
3897{
3898    fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0);
3899    return 0;
3900}
3901EOF
3902if compile_prog "" "" ; then
3903  fallocate_zero_range=yes
3904fi
3905
3906# check for posix_fallocate
3907posix_fallocate=no
3908cat > $TMPC << EOF
3909#include <fcntl.h>
3910
3911int main(void)
3912{
3913    posix_fallocate(0, 0, 0);
3914    return 0;
3915}
3916EOF
3917if compile_prog "" "" ; then
3918    posix_fallocate=yes
3919fi
3920
3921# check for sync_file_range
3922sync_file_range=no
3923cat > $TMPC << EOF
3924#include <fcntl.h>
3925
3926int main(void)
3927{
3928    sync_file_range(0, 0, 0, 0);
3929    return 0;
3930}
3931EOF
3932if compile_prog "" "" ; then
3933  sync_file_range=yes
3934fi
3935
3936# check for linux/fiemap.h and FS_IOC_FIEMAP
3937fiemap=no
3938cat > $TMPC << EOF
3939#include <sys/ioctl.h>
3940#include <linux/fs.h>
3941#include <linux/fiemap.h>
3942
3943int main(void)
3944{
3945    ioctl(0, FS_IOC_FIEMAP, 0);
3946    return 0;
3947}
3948EOF
3949if compile_prog "" "" ; then
3950  fiemap=yes
3951fi
3952
3953# check for dup3
3954dup3=no
3955cat > $TMPC << EOF
3956#include <unistd.h>
3957
3958int main(void)
3959{
3960    dup3(0, 0, 0);
3961    return 0;
3962}
3963EOF
3964if compile_prog "" "" ; then
3965  dup3=yes
3966fi
3967
3968# check for ppoll support
3969ppoll=no
3970cat > $TMPC << EOF
3971#include <poll.h>
3972
3973int main(void)
3974{
3975    struct pollfd pfd = { .fd = 0, .events = 0, .revents = 0 };
3976    ppoll(&pfd, 1, 0, 0);
3977    return 0;
3978}
3979EOF
3980if compile_prog "" "" ; then
3981  ppoll=yes
3982fi
3983
3984# check for prctl(PR_SET_TIMERSLACK , ... ) support
3985prctl_pr_set_timerslack=no
3986cat > $TMPC << EOF
3987#include <sys/prctl.h>
3988
3989int main(void)
3990{
3991    prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0);
3992    return 0;
3993}
3994EOF
3995if compile_prog "" "" ; then
3996  prctl_pr_set_timerslack=yes
3997fi
3998
3999# check for epoll support
4000epoll=no
4001cat > $TMPC << EOF
4002#include <sys/epoll.h>
4003
4004int main(void)
4005{
4006    epoll_create(0);
4007    return 0;
4008}
4009EOF
4010if compile_prog "" "" ; then
4011  epoll=yes
4012fi
4013
4014# epoll_create1 is a later addition
4015# so we must check separately for its presence
4016epoll_create1=no
4017cat > $TMPC << EOF
4018#include <sys/epoll.h>
4019
4020int main(void)
4021{
4022    /* Note that we use epoll_create1 as a value, not as
4023     * a function being called. This is necessary so that on
4024     * old SPARC glibc versions where the function was present in
4025     * the library but not declared in the header file we will
4026     * fail the configure check. (Otherwise we will get a compiler
4027     * warning but not an error, and will proceed to fail the
4028     * qemu compile where we compile with -Werror.)
4029     */
4030    return (int)(uintptr_t)&epoll_create1;
4031}
4032EOF
4033if compile_prog "" "" ; then
4034  epoll_create1=yes
4035fi
4036
4037# check for sendfile support
4038sendfile=no
4039cat > $TMPC << EOF
4040#include <sys/sendfile.h>
4041
4042int main(void)
4043{
4044    return sendfile(0, 0, 0, 0);
4045}
4046EOF
4047if compile_prog "" "" ; then
4048  sendfile=yes
4049fi
4050
4051# check for timerfd support (glibc 2.8 and newer)
4052timerfd=no
4053cat > $TMPC << EOF
4054#include <sys/timerfd.h>
4055
4056int main(void)
4057{
4058    return(timerfd_create(CLOCK_REALTIME, 0));
4059}
4060EOF
4061if compile_prog "" "" ; then
4062  timerfd=yes
4063fi
4064
4065# check for setns and unshare support
4066setns=no
4067cat > $TMPC << EOF
4068#include <sched.h>
4069
4070int main(void)
4071{
4072    int ret;
4073    ret = setns(0, 0);
4074    ret = unshare(0);
4075    return ret;
4076}
4077EOF
4078if compile_prog "" "" ; then
4079  setns=yes
4080fi
4081
4082# clock_adjtime probe
4083clock_adjtime=no
4084cat > $TMPC <<EOF
4085#include <time.h>
4086#include <sys/timex.h>
4087
4088int main(void)
4089{
4090    return clock_adjtime(0, 0);
4091}
4092EOF
4093clock_adjtime=no
4094if compile_prog "" "" ; then
4095  clock_adjtime=yes
4096fi
4097
4098# syncfs probe
4099syncfs=no
4100cat > $TMPC <<EOF
4101#include <unistd.h>
4102
4103int main(void)
4104{
4105    return syncfs(0);
4106}
4107EOF
4108syncfs=no
4109if compile_prog "" "" ; then
4110  syncfs=yes
4111fi
4112
4113# Search for bswap_32 function
4114byteswap_h=no
4115cat > $TMPC << EOF
4116#include <byteswap.h>
4117int main(void) { return bswap_32(0); }
4118EOF
4119if compile_prog "" "" ; then
4120  byteswap_h=yes
4121fi
4122
4123# Search for bswap32 function
4124bswap_h=no
4125cat > $TMPC << EOF
4126#include <sys/endian.h>
4127#include <sys/types.h>
4128#include <machine/bswap.h>
4129int main(void) { return bswap32(0); }
4130EOF
4131if compile_prog "" "" ; then
4132  bswap_h=yes
4133fi
4134
4135# Check whether we have openpty() in either libc or libutil
4136cat > $TMPC << EOF
4137extern int openpty(int *am, int *as, char *name, void *termp, void *winp);
4138int main(void) { return openpty(0, 0, 0, 0, 0); }
4139EOF
4140
4141have_openpty="no"
4142if compile_prog "" "" ; then
4143  have_openpty="yes"
4144else
4145  if compile_prog "" "-lutil" ; then
4146    have_openpty="yes"
4147  fi
4148fi
4149
4150##########################################
4151# spice probe
4152if test "$spice" != "no" ; then
4153  cat > $TMPC << EOF
4154#include <spice.h>
4155int main(void) { spice_server_new(); return 0; }
4156EOF
4157  spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
4158  spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
4159  if $pkg_config --atleast-version=0.12.5 spice-server && \
4160     $pkg_config --atleast-version=0.12.3 spice-protocol && \
4161     compile_prog "$spice_cflags" "$spice_libs" ; then
4162    spice="yes"
4163  else
4164    if test "$spice" = "yes" ; then
4165      feature_not_found "spice" \
4166          "Install spice-server(>=0.12.5) and spice-protocol(>=0.12.3) devel"
4167    fi
4168    spice="no"
4169  fi
4170fi
4171
4172# check for smartcard support
4173if test "$smartcard" != "no"; then
4174    if $pkg_config --atleast-version=2.5.1 libcacard; then
4175        libcacard_cflags=$($pkg_config --cflags libcacard)
4176        libcacard_libs=$($pkg_config --libs libcacard)
4177        smartcard="yes"
4178    else
4179        if test "$smartcard" = "yes"; then
4180            feature_not_found "smartcard" "Install libcacard devel"
4181        fi
4182        smartcard="no"
4183    fi
4184fi
4185
4186# check for libusb
4187if test "$libusb" != "no" ; then
4188    if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
4189        libusb="yes"
4190        libusb_cflags=$($pkg_config --cflags libusb-1.0)
4191        libusb_libs=$($pkg_config --libs libusb-1.0)
4192    else
4193        if test "$libusb" = "yes"; then
4194            feature_not_found "libusb" "Install libusb devel >= 1.0.13"
4195        fi
4196        libusb="no"
4197    fi
4198fi
4199
4200# check for usbredirparser for usb network redirection support
4201if test "$usb_redir" != "no" ; then
4202    if $pkg_config --atleast-version=0.6 libusbredirparser-0.5; then
4203        usb_redir="yes"
4204        usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5)
4205        usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5)
4206    else
4207        if test "$usb_redir" = "yes"; then
4208            feature_not_found "usb-redir" "Install usbredir devel"
4209        fi
4210        usb_redir="no"
4211    fi
4212fi
4213
4214##########################################
4215# check if we have VSS SDK headers for win
4216
4217if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
4218        test "$vss_win32_sdk" != "no" ; then
4219  case "$vss_win32_sdk" in
4220    "")   vss_win32_include="-isystem $source_path" ;;
4221    *\ *) # The SDK is installed in "Program Files" by default, but we cannot
4222          # handle path with spaces. So we symlink the headers into ".sdk/vss".
4223          vss_win32_include="-isystem $source_path/.sdk/vss"
4224          symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
4225          ;;
4226    *)    vss_win32_include="-isystem $vss_win32_sdk"
4227  esac
4228  cat > $TMPC << EOF
4229#define __MIDL_user_allocate_free_DEFINED__
4230#include <inc/win2003/vss.h>
4231int main(void) { return VSS_CTX_BACKUP; }
4232EOF
4233  if compile_prog "$vss_win32_include" "" ; then
4234    guest_agent_with_vss="yes"
4235    QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
4236    libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
4237    qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
4238  else
4239    if test "$vss_win32_sdk" != "" ; then
4240      echo "ERROR: Please download and install Microsoft VSS SDK:"
4241      echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
4242      echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
4243      echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
4244      echo "ERROR: The headers are extracted in the directory \`inc'."
4245      feature_not_found "VSS support"
4246    fi
4247    guest_agent_with_vss="no"
4248  fi
4249fi
4250
4251##########################################
4252# lookup Windows platform SDK (if not specified)
4253# The SDK is needed only to build .tlb (type library) file of guest agent
4254# VSS provider from the source. It is usually unnecessary because the
4255# pre-compiled .tlb file is included.
4256
4257if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
4258        test "$guest_agent_with_vss" = "yes" ; then
4259  if test -z "$win_sdk"; then
4260    programfiles="$PROGRAMFILES"
4261    test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
4262    if test -n "$programfiles"; then
4263      win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
4264    else
4265      feature_not_found "Windows SDK"
4266    fi
4267  elif test "$win_sdk" = "no"; then
4268    win_sdk=""
4269  fi
4270fi
4271
4272##########################################
4273# check if mingw environment provides a recent ntddscsi.h
4274if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
4275  cat > $TMPC << EOF
4276#include <windows.h>
4277#include <ntddscsi.h>
4278int main(void) {
4279#if !defined(IOCTL_SCSI_GET_ADDRESS)
4280#error Missing required ioctl definitions
4281#endif
4282  SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
4283  return addr.Lun;
4284}
4285EOF
4286  if compile_prog "" "" ; then
4287    guest_agent_ntddscsi=yes
4288    libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
4289  fi
4290fi
4291
4292##########################################
4293# virgl renderer probe
4294
4295if test "$virglrenderer" != "no" ; then
4296  cat > $TMPC << EOF
4297#include <virglrenderer.h>
4298int main(void) { virgl_renderer_poll(); return 0; }
4299EOF
4300  virgl_cflags=$($pkg_config --cflags virglrenderer 2>/dev/null)
4301  virgl_libs=$($pkg_config --libs virglrenderer 2>/dev/null)
4302  virgl_version=$($pkg_config --modversion virglrenderer 2>/dev/null)
4303  if $pkg_config virglrenderer >/dev/null 2>&1 && \
4304     compile_prog "$virgl_cflags" "$virgl_libs" ; then
4305    virglrenderer="yes"
4306  else
4307    if test "$virglrenderer" = "yes" ; then
4308      feature_not_found "virglrenderer"
4309    fi
4310    virglrenderer="no"
4311  fi
4312fi
4313
4314##########################################
4315# capstone
4316
4317case "$capstone" in
4318  auto | enabled | internal)
4319    # Simpler to always update submodule, even if not needed.
4320    if test "$git_submodules_action" != "ignore"; then
4321      git_submodules="${git_submodules} capstone"
4322    fi
4323    ;;
4324esac
4325
4326##########################################
4327# check if we have fdatasync
4328
4329fdatasync=no
4330cat > $TMPC << EOF
4331#include <unistd.h>
4332int main(void) {
4333#if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
4334return fdatasync(0);
4335#else
4336#error Not supported
4337#endif
4338}
4339EOF
4340if compile_prog "" "" ; then
4341    fdatasync=yes
4342fi
4343
4344##########################################
4345# check if we have madvise
4346
4347madvise=no
4348cat > $TMPC << EOF
4349#include <sys/types.h>
4350#include <sys/mman.h>
4351#include <stddef.h>
4352int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }
4353EOF
4354if compile_prog "" "" ; then
4355    madvise=yes
4356fi
4357
4358##########################################
4359# check if we have posix_madvise
4360
4361posix_madvise=no
4362cat > $TMPC << EOF
4363#include <sys/mman.h>
4364#include <stddef.h>
4365int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }
4366EOF
4367if compile_prog "" "" ; then
4368    posix_madvise=yes
4369fi
4370
4371##########################################
4372# check if we have posix_memalign()
4373
4374posix_memalign=no
4375cat > $TMPC << EOF
4376#include <stdlib.h>
4377int main(void) {
4378    void *p;
4379    return posix_memalign(&p, 8, 8);
4380}
4381EOF
4382if compile_prog "" "" ; then
4383    posix_memalign=yes
4384fi
4385
4386##########################################
4387# check if we have posix_syslog
4388
4389posix_syslog=no
4390cat > $TMPC << EOF
4391#include <syslog.h>
4392int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; }
4393EOF
4394if compile_prog "" "" ; then
4395    posix_syslog=yes
4396fi
4397
4398##########################################
4399# check if we have sem_timedwait
4400
4401sem_timedwait=no
4402cat > $TMPC << EOF
4403#include <semaphore.h>
4404int main(void) { sem_t s; struct timespec t = {0}; return sem_timedwait(&s, &t); }
4405EOF
4406if compile_prog "" "" ; then
4407    sem_timedwait=yes
4408fi
4409
4410##########################################
4411# check if we have strchrnul
4412
4413strchrnul=no
4414cat > $TMPC << EOF
4415#include <string.h>
4416int main(void);
4417// Use a haystack that the compiler shouldn't be able to constant fold
4418char *haystack = (char*)&main;
4419int main(void) { return strchrnul(haystack, 'x') != &haystack[6]; }
4420EOF
4421if compile_prog "" "" ; then
4422    strchrnul=yes
4423fi
4424
4425#########################################
4426# check if we have st_atim
4427
4428st_atim=no
4429cat > $TMPC << EOF
4430#include <sys/stat.h>
4431#include <stddef.h>
4432int main(void) { return offsetof(struct stat, st_atim); }
4433EOF
4434if compile_prog "" "" ; then
4435    st_atim=yes
4436fi
4437
4438##########################################
4439# check if trace backend exists
4440
4441$python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
4442if test "$?" -ne 0 ; then
4443  error_exit "invalid trace backends" \
4444      "Please choose supported trace backends."
4445fi
4446
4447##########################################
4448# For 'ust' backend, test if ust headers are present
4449if have_backend "ust"; then
4450  cat > $TMPC << EOF
4451#include <lttng/tracepoint.h>
4452int main(void) { return 0; }
4453EOF
4454  if compile_prog "" "-Wl,--no-as-needed -ldl" ; then
4455    if $pkg_config lttng-ust --exists; then
4456      lttng_ust_libs=$($pkg_config --libs lttng-ust)
4457    else
4458      lttng_ust_libs="-llttng-ust -ldl"
4459    fi
4460    if $pkg_config liburcu-bp --exists; then
4461      urcu_bp_libs=$($pkg_config --libs liburcu-bp)
4462    else
4463      urcu_bp_libs="-lurcu-bp"
4464    fi
4465  else
4466    error_exit "Trace backend 'ust' missing lttng-ust header files"
4467  fi
4468fi
4469
4470##########################################
4471# For 'dtrace' backend, test if 'dtrace' command is present
4472if have_backend "dtrace"; then
4473  if ! has 'dtrace' ; then
4474    error_exit "dtrace command is not found in PATH $PATH"
4475  fi
4476  trace_backend_stap="no"
4477  if has 'stap' ; then
4478    trace_backend_stap="yes"
4479
4480    # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
4481    # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
4482    # instead. QEMU --enable-modules depends on this because the SystemTap
4483    # semaphores are linked into the main binary and not the module's shared
4484    # object.
4485    QEMU_CFLAGS="$QEMU_CFLAGS -DSTAP_SDT_V2"
4486  fi
4487fi
4488
4489##########################################
4490# check and set a backend for coroutine
4491
4492# We prefer ucontext, but it's not always possible. The fallback
4493# is sigcontext. On Windows the only valid backend is the Windows
4494# specific one.
4495
4496ucontext_works=no
4497if test "$darwin" != "yes"; then
4498  cat > $TMPC << EOF
4499#include <ucontext.h>
4500#ifdef __stub_makecontext
4501#error Ignoring glibc stub makecontext which will always fail
4502#endif
4503int main(void) { makecontext(0, 0, 0); return 0; }
4504EOF
4505  if compile_prog "" "" ; then
4506    ucontext_works=yes
4507  fi
4508fi
4509
4510if test "$coroutine" = ""; then
4511  if test "$mingw32" = "yes"; then
4512    coroutine=win32
4513  elif test "$ucontext_works" = "yes"; then
4514    coroutine=ucontext
4515  else
4516    coroutine=sigaltstack
4517  fi
4518else
4519  case $coroutine in
4520  windows)
4521    if test "$mingw32" != "yes"; then
4522      error_exit "'windows' coroutine backend only valid for Windows"
4523    fi
4524    # Unfortunately the user visible backend name doesn't match the
4525    # coroutine-*.c filename for this case, so we have to adjust it here.
4526    coroutine=win32
4527    ;;
4528  ucontext)
4529    if test "$ucontext_works" != "yes"; then
4530      feature_not_found "ucontext"
4531    fi
4532    ;;
4533  sigaltstack)
4534    if test "$mingw32" = "yes"; then
4535      error_exit "only the 'windows' coroutine backend is valid for Windows"
4536    fi
4537    ;;
4538  *)
4539    error_exit "unknown coroutine backend $coroutine"
4540    ;;
4541  esac
4542fi
4543
4544if test "$coroutine_pool" = ""; then
4545  coroutine_pool=yes
4546fi
4547
4548if test "$debug_stack_usage" = "yes"; then
4549  if test "$coroutine_pool" = "yes"; then
4550    echo "WARN: disabling coroutine pool for stack usage debugging"
4551    coroutine_pool=no
4552  fi
4553fi
4554
4555##################################################
4556# SafeStack
4557
4558
4559if test "$safe_stack" = "yes"; then
4560cat > $TMPC << EOF
4561int main(int argc, char *argv[])
4562{
4563#if ! __has_feature(safe_stack)
4564#error SafeStack Disabled
4565#endif
4566    return 0;
4567}
4568EOF
4569  flag="-fsanitize=safe-stack"
4570  # Check that safe-stack is supported and enabled.
4571  if compile_prog "-Werror $flag" "$flag"; then
4572    # Flag needed both at compilation and at linking
4573    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
4574    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
4575  else
4576    error_exit "SafeStack not supported by your compiler"
4577  fi
4578  if test "$coroutine" != "ucontext"; then
4579    error_exit "SafeStack is only supported by the coroutine backend ucontext"
4580  fi
4581else
4582cat > $TMPC << EOF
4583int main(int argc, char *argv[])
4584{
4585#if defined(__has_feature)
4586#if __has_feature(safe_stack)
4587#error SafeStack Enabled
4588#endif
4589#endif
4590    return 0;
4591}
4592EOF
4593if test "$safe_stack" = "no"; then
4594  # Make sure that safe-stack is disabled
4595  if ! compile_prog "-Werror" ""; then
4596    # SafeStack was already enabled, try to explicitly remove the feature
4597    flag="-fno-sanitize=safe-stack"
4598    if ! compile_prog "-Werror $flag" "$flag"; then
4599      error_exit "Configure cannot disable SafeStack"
4600    fi
4601    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
4602    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
4603  fi
4604else # "$safe_stack" = ""
4605  # Set safe_stack to yes or no based on pre-existing flags
4606  if compile_prog "-Werror" ""; then
4607    safe_stack="no"
4608  else
4609    safe_stack="yes"
4610    if test "$coroutine" != "ucontext"; then
4611      error_exit "SafeStack is only supported by the coroutine backend ucontext"
4612    fi
4613  fi
4614fi
4615fi
4616
4617##########################################
4618# check if we have open_by_handle_at
4619
4620open_by_handle_at=no
4621cat > $TMPC << EOF
4622#include <fcntl.h>
4623#if !defined(AT_EMPTY_PATH)
4624# error missing definition
4625#else
4626int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
4627#endif
4628EOF
4629if compile_prog "" "" ; then
4630    open_by_handle_at=yes
4631fi
4632
4633########################################
4634# check if we have linux/magic.h
4635
4636linux_magic_h=no
4637cat > $TMPC << EOF
4638#include <linux/magic.h>
4639int main(void) {
4640  return 0;
4641}
4642EOF
4643if compile_prog "" "" ; then
4644    linux_magic_h=yes
4645fi
4646
4647########################################
4648# check if we have valgrind/valgrind.h
4649
4650valgrind_h=no
4651cat > $TMPC << EOF
4652#include <valgrind/valgrind.h>
4653int main(void) {
4654  return 0;
4655}
4656EOF
4657if compile_prog "" "" ; then
4658    valgrind_h=yes
4659fi
4660
4661########################################
4662# check if environ is declared
4663
4664has_environ=no
4665cat > $TMPC << EOF
4666#include <unistd.h>
4667int main(void) {
4668    environ = 0;
4669    return 0;
4670}
4671EOF
4672if compile_prog "" "" ; then
4673    has_environ=yes
4674fi
4675
4676########################################
4677# check if cpuid.h is usable.
4678
4679cat > $TMPC << EOF
4680#include <cpuid.h>
4681int main(void) {
4682    unsigned a, b, c, d;
4683    int max = __get_cpuid_max(0, 0);
4684
4685    if (max >= 1) {
4686        __cpuid(1, a, b, c, d);
4687    }
4688
4689    if (max >= 7) {
4690        __cpuid_count(7, 0, a, b, c, d);
4691    }
4692
4693    return 0;
4694}
4695EOF
4696if compile_prog "" "" ; then
4697    cpuid_h=yes
4698fi
4699
4700##########################################
4701# avx2 optimization requirement check
4702#
4703# There is no point enabling this if cpuid.h is not usable,
4704# since we won't be able to select the new routines.
4705
4706if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
4707  cat > $TMPC << EOF
4708#pragma GCC push_options
4709#pragma GCC target("avx2")
4710#include <cpuid.h>
4711#include <immintrin.h>
4712static int bar(void *a) {
4713    __m256i x = *(__m256i *)a;
4714    return _mm256_testz_si256(x, x);
4715}
4716int main(int argc, char *argv[]) { return bar(argv[0]); }
4717EOF
4718  if compile_object "" ; then
4719    avx2_opt="yes"
4720  else
4721    avx2_opt="no"
4722  fi
4723fi
4724
4725##########################################
4726# avx512f optimization requirement check
4727#
4728# There is no point enabling this if cpuid.h is not usable,
4729# since we won't be able to select the new routines.
4730# by default, it is turned off.
4731# if user explicitly want to enable it, check environment
4732
4733if test "$cpuid_h" = "yes" && test "$avx512f_opt" = "yes"; then
4734  cat > $TMPC << EOF
4735#pragma GCC push_options
4736#pragma GCC target("avx512f")
4737#include <cpuid.h>
4738#include <immintrin.h>
4739static int bar(void *a) {
4740    __m512i x = *(__m512i *)a;
4741    return _mm512_test_epi64_mask(x, x);
4742}
4743int main(int argc, char *argv[])
4744{
4745        return bar(argv[0]);
4746}
4747EOF
4748  if ! compile_object "" ; then
4749    avx512f_opt="no"
4750  fi
4751else
4752  avx512f_opt="no"
4753fi
4754
4755########################################
4756# check if __[u]int128_t is usable.
4757
4758int128=no
4759cat > $TMPC << EOF
4760__int128_t a;
4761__uint128_t b;
4762int main (void) {
4763  a = a + b;
4764  b = a * b;
4765  a = a * a;
4766  return 0;
4767}
4768EOF
4769if compile_prog "" "" ; then
4770    int128=yes
4771fi
4772
4773#########################################
4774# See if 128-bit atomic operations are supported.
4775
4776atomic128=no
4777if test "$int128" = "yes"; then
4778  cat > $TMPC << EOF
4779int main(void)
4780{
4781  unsigned __int128 x = 0, y = 0;
4782  y = __atomic_load(&x, 0);
4783  __atomic_store(&x, y, 0);
4784  __atomic_compare_exchange(&x, &y, x, 0, 0, 0);
4785  return 0;
4786}
4787EOF
4788  if compile_prog "" "" ; then
4789    atomic128=yes
4790  fi
4791fi
4792
4793cmpxchg128=no
4794if test "$int128" = yes && test "$atomic128" = no; then
4795  cat > $TMPC << EOF
4796int main(void)
4797{
4798  unsigned __int128 x = 0, y = 0;
4799  __sync_val_compare_and_swap_16(&x, y, x);
4800  return 0;
4801}
4802EOF
4803  if compile_prog "" "" ; then
4804    cmpxchg128=yes
4805  fi
4806fi
4807
4808#########################################
4809# See if 64-bit atomic operations are supported.
4810# Note that without __atomic builtins, we can only
4811# assume atomic loads/stores max at pointer size.
4812
4813cat > $TMPC << EOF
4814#include <stdint.h>
4815int main(void)
4816{
4817  uint64_t x = 0, y = 0;
4818#ifdef __ATOMIC_RELAXED
4819  y = __atomic_load_n(&x, __ATOMIC_RELAXED);
4820  __atomic_store_n(&x, y, __ATOMIC_RELAXED);
4821  __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
4822  __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
4823  __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
4824#else
4825  typedef char is_host64[sizeof(void *) >= sizeof(uint64_t) ? 1 : -1];
4826  __sync_lock_test_and_set(&x, y);
4827  __sync_val_compare_and_swap(&x, y, 0);
4828  __sync_fetch_and_add(&x, y);
4829#endif
4830  return 0;
4831}
4832EOF
4833if compile_prog "" "" ; then
4834  atomic64=yes
4835fi
4836
4837#########################################
4838# See if --dynamic-list is supported by the linker
4839ld_dynamic_list="no"
4840if test "$static" = "no" ; then
4841    cat > $TMPTXT <<EOF
4842{
4843  foo;
4844};
4845EOF
4846
4847    cat > $TMPC <<EOF
4848#include <stdio.h>
4849void foo(void);
4850
4851void foo(void)
4852{
4853  printf("foo\n");
4854}
4855
4856int main(void)
4857{
4858  foo();
4859  return 0;
4860}
4861EOF
4862
4863    if compile_prog "" "-Wl,--dynamic-list=$TMPTXT" ; then
4864        ld_dynamic_list="yes"
4865    fi
4866fi
4867
4868#########################################
4869# See if -exported_symbols_list is supported by the linker
4870
4871ld_exported_symbols_list="no"
4872if test "$static" = "no" ; then
4873    cat > $TMPTXT <<EOF
4874  _foo
4875EOF
4876
4877    if compile_prog "" "-Wl,-exported_symbols_list,$TMPTXT" ; then
4878        ld_exported_symbols_list="yes"
4879    fi
4880fi
4881
4882if  test "$plugins" = "yes" &&
4883    test "$ld_dynamic_list" = "no" &&
4884    test "$ld_exported_symbols_list" = "no" ; then
4885  error_exit \
4886      "Plugin support requires dynamic linking and specifying a set of symbols " \
4887      "that are exported to plugins. Unfortunately your linker doesn't " \
4888      "support the flag (--dynamic-list or -exported_symbols_list) used " \
4889      "for this purpose. You can't build with --static."
4890fi
4891
4892########################################
4893# check if getauxval is available.
4894
4895getauxval=no
4896cat > $TMPC << EOF
4897#include <sys/auxv.h>
4898int main(void) {
4899  return getauxval(AT_HWCAP) == 0;
4900}
4901EOF
4902if compile_prog "" "" ; then
4903    getauxval=yes
4904fi
4905
4906########################################
4907# check if ccache is interfering with
4908# semantic analysis of macros
4909
4910unset CCACHE_CPP2
4911ccache_cpp2=no
4912cat > $TMPC << EOF
4913static const int Z = 1;
4914#define fn() ({ Z; })
4915#define TAUT(X) ((X) == Z)
4916#define PAREN(X, Y) (X == Y)
4917#define ID(X) (X)
4918int main(int argc, char *argv[])
4919{
4920    int x = 0, y = 0;
4921    x = ID(x);
4922    x = fn();
4923    fn();
4924    if (PAREN(x, y)) return 0;
4925    if (TAUT(Z)) return 0;
4926    return 0;
4927}
4928EOF
4929
4930if ! compile_object "-Werror"; then
4931    ccache_cpp2=yes
4932fi
4933
4934#################################################
4935# clang does not support glibc + FORTIFY_SOURCE.
4936
4937if test "$fortify_source" != "no"; then
4938  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
4939    fortify_source="no";
4940  elif test -n "$cxx" && has $cxx &&
4941       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
4942    fortify_source="no";
4943  else
4944    fortify_source="yes"
4945  fi
4946fi
4947
4948###############################################
4949# Check if copy_file_range is provided by glibc
4950have_copy_file_range=no
4951cat > $TMPC << EOF
4952#include <unistd.h>
4953int main(void) {
4954  copy_file_range(0, NULL, 0, NULL, 0, 0);
4955  return 0;
4956}
4957EOF
4958if compile_prog "" "" ; then
4959    have_copy_file_range=yes
4960fi
4961
4962##########################################
4963# check if struct fsxattr is available via linux/fs.h
4964
4965have_fsxattr=no
4966cat > $TMPC << EOF
4967#include <linux/fs.h>
4968struct fsxattr foo;
4969int main(void) {
4970  return 0;
4971}
4972EOF
4973if compile_prog "" "" ; then
4974    have_fsxattr=yes
4975fi
4976
4977##########################################
4978# check for usable membarrier system call
4979if test "$membarrier" = "yes"; then
4980    have_membarrier=no
4981    if test "$mingw32" = "yes" ; then
4982        have_membarrier=yes
4983    elif test "$linux" = "yes" ; then
4984        cat > $TMPC << EOF
4985    #include <linux/membarrier.h>
4986    #include <sys/syscall.h>
4987    #include <unistd.h>
4988    #include <stdlib.h>
4989    int main(void) {
4990        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
4991        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
4992        exit(0);
4993    }
4994EOF
4995        if compile_prog "" "" ; then
4996            have_membarrier=yes
4997        fi
4998    fi
4999    if test "$have_membarrier" = "no"; then
5000      feature_not_found "membarrier" "membarrier system call not available"
5001    fi
5002else
5003    # Do not enable it by default even for Mingw32, because it doesn't
5004    # work on Wine.
5005    membarrier=no
5006fi
5007
5008##########################################
5009# check if rtnetlink.h exists and is useful
5010have_rtnetlink=no
5011cat > $TMPC << EOF
5012#include <linux/rtnetlink.h>
5013int main(void) {
5014  return IFLA_PROTO_DOWN;
5015}
5016EOF
5017if compile_prog "" "" ; then
5018    have_rtnetlink=yes
5019fi
5020
5021##########################################
5022# check for usable AF_VSOCK environment
5023have_af_vsock=no
5024cat > $TMPC << EOF
5025#include <errno.h>
5026#include <sys/types.h>
5027#include <sys/socket.h>
5028#if !defined(AF_VSOCK)
5029# error missing AF_VSOCK flag
5030#endif
5031#include <linux/vm_sockets.h>
5032int main(void) {
5033    int sock, ret;
5034    struct sockaddr_vm svm;
5035    socklen_t len = sizeof(svm);
5036    sock = socket(AF_VSOCK, SOCK_STREAM, 0);
5037    ret = getpeername(sock, (struct sockaddr *)&svm, &len);
5038    if ((ret == -1) && (errno == ENOTCONN)) {
5039        return 0;
5040    }
5041    return -1;
5042}
5043EOF
5044if compile_prog "" "" ; then
5045    have_af_vsock=yes
5046fi
5047
5048##########################################
5049# check for usable AF_ALG environment
5050have_afalg=no
5051cat > $TMPC << EOF
5052#include <errno.h>
5053#include <sys/types.h>
5054#include <sys/socket.h>
5055#include <linux/if_alg.h>
5056int main(void) {
5057    int sock;
5058    sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
5059    return sock;
5060}
5061EOF
5062if compile_prog "" "" ; then
5063    have_afalg=yes
5064fi
5065if test "$crypto_afalg" = "yes"
5066then
5067    if test "$have_afalg" != "yes"
5068    then
5069        error_exit "AF_ALG requested but could not be detected"
5070    fi
5071fi
5072
5073
5074#################################################
5075# check for sysmacros.h
5076
5077have_sysmacros=no
5078cat > $TMPC << EOF
5079#include <sys/sysmacros.h>
5080int main(void) {
5081    return makedev(0, 0);
5082}
5083EOF
5084if compile_prog "" "" ; then
5085    have_sysmacros=yes
5086fi
5087
5088##########################################
5089# check for _Static_assert()
5090
5091have_static_assert=no
5092cat > $TMPC << EOF
5093_Static_assert(1, "success");
5094int main(void) {
5095    return 0;
5096}
5097EOF
5098if compile_prog "" "" ; then
5099    have_static_assert=yes
5100fi
5101
5102##########################################
5103# check for utmpx.h, it is missing e.g. on OpenBSD
5104
5105have_utmpx=no
5106cat > $TMPC << EOF
5107#include <utmpx.h>
5108struct utmpx user_info;
5109int main(void) {
5110    return 0;
5111}
5112EOF
5113if compile_prog "" "" ; then
5114    have_utmpx=yes
5115fi
5116
5117##########################################
5118# check for getrandom()
5119
5120have_getrandom=no
5121cat > $TMPC << EOF
5122#include <sys/random.h>
5123int main(void) {
5124    return getrandom(0, 0, GRND_NONBLOCK);
5125}
5126EOF
5127if compile_prog "" "" ; then
5128    have_getrandom=yes
5129fi
5130
5131##########################################
5132# checks for sanitizers
5133
5134have_asan=no
5135have_ubsan=no
5136have_asan_iface_h=no
5137have_asan_iface_fiber=no
5138
5139if test "$sanitizers" = "yes" ; then
5140  write_c_skeleton
5141  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
5142      have_asan=yes
5143  fi
5144
5145  # we could use a simple skeleton for flags checks, but this also
5146  # detect the static linking issue of ubsan, see also:
5147  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
5148  cat > $TMPC << EOF
5149#include <stdlib.h>
5150int main(void) {
5151    void *tmp = malloc(10);
5152    if (tmp != NULL) {
5153        return *(int *)(tmp + 2);
5154    }
5155    return 1;
5156}
5157EOF
5158  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
5159      have_ubsan=yes
5160  fi
5161
5162  if check_include "sanitizer/asan_interface.h" ; then
5163      have_asan_iface_h=yes
5164  fi
5165
5166  cat > $TMPC << EOF
5167#include <sanitizer/asan_interface.h>
5168int main(void) {
5169  __sanitizer_start_switch_fiber(0, 0, 0);
5170  return 0;
5171}
5172EOF
5173  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
5174      have_asan_iface_fiber=yes
5175  fi
5176fi
5177
5178##########################################
5179# checks for fuzzer
5180if test "$fuzzing" = "yes" && test -z "${LIB_FUZZING_ENGINE+xxx}"; then
5181  write_c_fuzzer_skeleton
5182  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=fuzzer" ""; then
5183    have_fuzzer=yes
5184  else
5185    error_exit "Your compiler doesn't support -fsanitize=fuzzer"
5186    exit 1
5187  fi
5188fi
5189
5190# Thread sanitizer is, for now, much noisier than the other sanitizers;
5191# keep it separate until that is not the case.
5192if test "$tsan" = "yes" && test "$sanitizers" = "yes"; then
5193  error_exit "TSAN is not supported with other sanitiziers."
5194fi
5195have_tsan=no
5196have_tsan_iface_fiber=no
5197if test "$tsan" = "yes" ; then
5198  write_c_skeleton
5199  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
5200      have_tsan=yes
5201  fi
5202  cat > $TMPC << EOF
5203#include <sanitizer/tsan_interface.h>
5204int main(void) {
5205  __tsan_create_fiber(0);
5206  return 0;
5207}
5208EOF
5209  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
5210      have_tsan_iface_fiber=yes
5211  fi
5212fi
5213
5214##########################################
5215# check for libpmem
5216
5217if test "$libpmem" != "no"; then
5218        if $pkg_config --exists "libpmem"; then
5219                libpmem="yes"
5220                libpmem_libs=$($pkg_config --libs libpmem)
5221                libpmem_cflags=$($pkg_config --cflags libpmem)
5222        else
5223                if test "$libpmem" = "yes" ; then
5224                        feature_not_found "libpmem" "Install nvml or pmdk"
5225                fi
5226                libpmem="no"
5227        fi
5228fi
5229
5230##########################################
5231# check for libdaxctl
5232
5233if test "$libdaxctl" != "no"; then
5234        if $pkg_config --atleast-version=57 "libdaxctl"; then
5235                libdaxctl="yes"
5236                libdaxctl_libs=$($pkg_config --libs libdaxctl)
5237                libdaxctl_cflags=$($pkg_config --cflags libdaxctl)
5238        else
5239                if test "$libdaxctl" = "yes" ; then
5240                        feature_not_found "libdaxctl" "Install libdaxctl"
5241                fi
5242                libdaxctl="no"
5243        fi
5244fi
5245
5246##########################################
5247# check for slirp
5248
5249case "$slirp" in
5250  auto | enabled | internal)
5251    # Simpler to always update submodule, even if not needed.
5252    if test "$git_submodules_action" != "ignore"; then
5253      git_submodules="${git_submodules} slirp"
5254    fi
5255    ;;
5256esac
5257
5258##########################################
5259# check for usable __NR_keyctl syscall
5260
5261if test "$linux" = "yes" ; then
5262
5263    have_keyring=no
5264    cat > $TMPC << EOF
5265#include <errno.h>
5266#include <asm/unistd.h>
5267#include <linux/keyctl.h>
5268#include <unistd.h>
5269int main(void) {
5270    return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
5271}
5272EOF
5273    if compile_prog "" "" ; then
5274        have_keyring=yes
5275    fi
5276fi
5277if test "$secret_keyring" != "no"
5278then
5279    if test "$have_keyring" = "yes"
5280    then
5281        secret_keyring=yes
5282    else
5283        if test "$secret_keyring" = "yes"
5284        then
5285            error_exit "syscall __NR_keyctl requested, \
5286but not implemented on your system"
5287        else
5288            secret_keyring=no
5289        fi
5290    fi
5291fi
5292
5293##########################################
5294# End of CC checks
5295# After here, no more $cc or $ld runs
5296
5297write_c_skeleton
5298
5299if test "$gcov" = "yes" ; then
5300  :
5301elif test "$fortify_source" = "yes" ; then
5302  QEMU_CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $QEMU_CFLAGS"
5303  debug=no
5304fi
5305
5306case "$ARCH" in
5307alpha)
5308  # Ensure there's only a single GP
5309  QEMU_CFLAGS="-msmall-data $QEMU_CFLAGS"
5310;;
5311esac
5312
5313if test "$gprof" = "yes" ; then
5314  QEMU_CFLAGS="-p $QEMU_CFLAGS"
5315  QEMU_LDFLAGS="-p $QEMU_LDFLAGS"
5316fi
5317
5318if test "$have_asan" = "yes"; then
5319  QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
5320  QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
5321  if test "$have_asan_iface_h" = "no" ; then
5322      echo "ASAN build enabled, but ASAN header missing." \
5323           "Without code annotation, the report may be inferior."
5324  elif test "$have_asan_iface_fiber" = "no" ; then
5325      echo "ASAN build enabled, but ASAN header is too old." \
5326           "Without code annotation, the report may be inferior."
5327  fi
5328fi
5329if test "$have_tsan" = "yes" ; then
5330  if test "$have_tsan_iface_fiber" = "yes" ; then
5331    QEMU_CFLAGS="-fsanitize=thread $QEMU_CFLAGS"
5332    QEMU_LDFLAGS="-fsanitize=thread $QEMU_LDFLAGS"
5333  else
5334    error_exit "Cannot enable TSAN due to missing fiber annotation interface."
5335  fi
5336elif test "$tsan" = "yes" ; then
5337  error_exit "Cannot enable TSAN due to missing sanitize thread interface."
5338fi
5339if test "$have_ubsan" = "yes"; then
5340  QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS"
5341  QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
5342fi
5343
5344##########################################
5345
5346# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
5347if test "$solaris" = "no" && test "$tsan" = "no"; then
5348    if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
5349        QEMU_LDFLAGS="-Wl,--warn-common $QEMU_LDFLAGS"
5350    fi
5351fi
5352
5353# Use ASLR, no-SEH and DEP if available
5354if test "$mingw32" = "yes" ; then
5355    flags="--no-seh --nxcompat"
5356
5357    # Disable ASLR for debug builds to allow debugging with gdb
5358    if test "$debug" = "no" ; then
5359        flags="--dynamicbase $flags"
5360    fi
5361
5362    for flag in $flags; do
5363        if ld_has $flag ; then
5364            QEMU_LDFLAGS="-Wl,$flag $QEMU_LDFLAGS"
5365        fi
5366    done
5367fi
5368
5369# We can only support ivshmem if we have eventfd
5370if [ "$eventfd" = "yes" ]; then
5371  ivshmem=yes
5372fi
5373
5374# Probe for guest agent support/options
5375
5376if [ "$guest_agent" != "no" ]; then
5377  if [ "$softmmu" = no -a "$want_tools" = no ] ; then
5378      guest_agent=no
5379  elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
5380      guest_agent=yes
5381  elif [ "$guest_agent" != yes ]; then
5382      guest_agent=no
5383  else
5384      error_exit "Guest agent is not supported on this platform"
5385  fi
5386fi
5387
5388# Guest agent Windows MSI package
5389
5390if test "$QEMU_GA_MANUFACTURER" = ""; then
5391  QEMU_GA_MANUFACTURER=QEMU
5392fi
5393if test "$QEMU_GA_DISTRO" = ""; then
5394  QEMU_GA_DISTRO=Linux
5395fi
5396if test "$QEMU_GA_VERSION" = ""; then
5397    QEMU_GA_VERSION=$(cat $source_path/VERSION)
5398fi
5399
5400QEMU_GA_MSI_MINGW_DLL_PATH="$($pkg_config --variable=prefix glib-2.0)/bin"
5401
5402# Mac OS X ships with a broken assembler
5403roms=
5404if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
5405        test "$targetos" != "Darwin" && test "$targetos" != "SunOS" && \
5406        test "$targetos" != "Haiku" && test "$softmmu" = yes ; then
5407    # Different host OS linkers have different ideas about the name of the ELF
5408    # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
5409    # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
5410    for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
5411        if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
5412            ld_i386_emulation="$emu"
5413            roms="optionrom"
5414            break
5415        fi
5416    done
5417fi
5418
5419# Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
5420if test "$cpu" = "s390x" ; then
5421  write_c_skeleton
5422  if compile_prog "-march=z900" ""; then
5423    roms="$roms s390-ccw"
5424    # SLOF is required for building the s390-ccw firmware on s390x,
5425    # since it is using the libnet code from SLOF for network booting.
5426    if test "$git_submodules_action" != "ignore"; then
5427      git_submodules="${git_submodules} roms/SLOF"
5428    fi
5429  fi
5430fi
5431
5432# Check that the C++ compiler exists and works with the C compiler.
5433# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
5434if has $cxx; then
5435    cat > $TMPC <<EOF
5436int c_function(void);
5437int main(void) { return c_function(); }
5438EOF
5439
5440    compile_object
5441
5442    cat > $TMPCXX <<EOF
5443extern "C" {
5444   int c_function(void);
5445}
5446int c_function(void) { return 42; }
5447EOF
5448
5449    update_cxxflags
5450
5451    if do_cxx $CXXFLAGS $CONFIGURE_CXXFLAGS $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
5452        # C++ compiler $cxx works ok with C compiler $cc
5453        :
5454    else
5455        echo "C++ compiler $cxx does not work with C compiler $cc"
5456        echo "Disabling C++ specific optional code"
5457        cxx=
5458    fi
5459else
5460    echo "No C++ compiler available; disabling C++ specific optional code"
5461    cxx=
5462fi
5463
5464if !(GIT="$git" "$source_path/scripts/git-submodule.sh" "$git_submodules_action" "$git_submodules"); then
5465    exit 1
5466fi
5467
5468config_host_mak="config-host.mak"
5469
5470echo "# Automatically generated by configure - do not modify" > $config_host_mak
5471echo >> $config_host_mak
5472
5473echo all: >> $config_host_mak
5474echo "GIT=$git" >> $config_host_mak
5475echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
5476echo "GIT_SUBMODULES_ACTION=$git_submodules_action" >> $config_host_mak
5477
5478echo "ARCH=$ARCH" >> $config_host_mak
5479
5480if test "$debug_tcg" = "yes" ; then
5481  echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
5482fi
5483if test "$strip_opt" = "yes" ; then
5484  echo "STRIP=${strip}" >> $config_host_mak
5485fi
5486if test "$bigendian" = "yes" ; then
5487  echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
5488fi
5489if test "$mingw32" = "yes" ; then
5490  echo "CONFIG_WIN32=y" >> $config_host_mak
5491  if test "$guest_agent_with_vss" = "yes" ; then
5492    echo "CONFIG_QGA_VSS=y" >> $config_host_mak
5493    echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
5494    echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
5495  fi
5496  if test "$guest_agent_ntddscsi" = "yes" ; then
5497    echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
5498  fi
5499  echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
5500  echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
5501  echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
5502  echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
5503else
5504  echo "CONFIG_POSIX=y" >> $config_host_mak
5505fi
5506
5507if test "$linux" = "yes" ; then
5508  echo "CONFIG_LINUX=y" >> $config_host_mak
5509fi
5510
5511if test "$darwin" = "yes" ; then
5512  echo "CONFIG_DARWIN=y" >> $config_host_mak
5513fi
5514
5515if test "$solaris" = "yes" ; then
5516  echo "CONFIG_SOLARIS=y" >> $config_host_mak
5517fi
5518if test "$haiku" = "yes" ; then
5519  echo "CONFIG_HAIKU=y" >> $config_host_mak
5520fi
5521if test "$static" = "yes" ; then
5522  echo "CONFIG_STATIC=y" >> $config_host_mak
5523fi
5524if test "$profiler" = "yes" ; then
5525  echo "CONFIG_PROFILER=y" >> $config_host_mak
5526fi
5527if test "$want_tools" = "yes" ; then
5528  echo "CONFIG_TOOLS=y" >> $config_host_mak
5529fi
5530if test "$guest_agent" = "yes" ; then
5531  echo "CONFIG_GUEST_AGENT=y" >> $config_host_mak
5532fi
5533echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
5534if test "$vde" = "yes" ; then
5535  echo "CONFIG_VDE=y" >> $config_host_mak
5536  echo "VDE_LIBS=$vde_libs" >> $config_host_mak
5537fi
5538if test "$netmap" = "yes" ; then
5539  echo "CONFIG_NETMAP=y" >> $config_host_mak
5540fi
5541if test "$l2tpv3" = "yes" ; then
5542  echo "CONFIG_L2TPV3=y" >> $config_host_mak
5543fi
5544if test "$gprof" = "yes" ; then
5545  echo "CONFIG_GPROF=y" >> $config_host_mak
5546fi
5547echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
5548for drv in $audio_drv_list; do
5549    def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
5550    echo "$def=y" >> $config_host_mak
5551done
5552if test "$alsa" = "yes" ; then
5553    echo "CONFIG_ALSA=y" >> $config_host_mak
5554fi
5555echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak
5556echo "ALSA_CFLAGS=$alsa_cflags" >> $config_host_mak
5557if test "$libpulse" = "yes" ; then
5558    echo "CONFIG_LIBPULSE=y" >> $config_host_mak
5559fi
5560echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
5561echo "PULSE_CFLAGS=$pulse_cflags" >> $config_host_mak
5562echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak
5563echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak
5564echo "OSS_LIBS=$oss_libs" >> $config_host_mak
5565if test "$libjack" = "yes" ; then
5566    echo "CONFIG_LIBJACK=y" >> $config_host_mak
5567fi
5568echo "JACK_LIBS=$jack_libs" >> $config_host_mak
5569if test "$audio_win_int" = "yes" ; then
5570  echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
5571fi
5572echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
5573echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
5574if test "$xfs" = "yes" ; then
5575  echo "CONFIG_XFS=y" >> $config_host_mak
5576fi
5577qemu_version=$(head $source_path/VERSION)
5578echo "PKGVERSION=$pkgversion" >>$config_host_mak
5579echo "SRC_PATH=$source_path" >> $config_host_mak
5580echo "TARGET_DIRS=$target_list" >> $config_host_mak
5581if test "$modules" = "yes"; then
5582  # $shacmd can generate a hash started with digit, which the compiler doesn't
5583  # like as an symbol. So prefix it with an underscore
5584  echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
5585  echo "CONFIG_MODULES=y" >> $config_host_mak
5586fi
5587if test "$module_upgrades" = "yes"; then
5588  echo "CONFIG_MODULE_UPGRADES=y" >> $config_host_mak
5589fi
5590if test "$pipe2" = "yes" ; then
5591  echo "CONFIG_PIPE2=y" >> $config_host_mak
5592fi
5593if test "$accept4" = "yes" ; then
5594  echo "CONFIG_ACCEPT4=y" >> $config_host_mak
5595fi
5596if test "$splice" = "yes" ; then
5597  echo "CONFIG_SPLICE=y" >> $config_host_mak
5598fi
5599if test "$eventfd" = "yes" ; then
5600  echo "CONFIG_EVENTFD=y" >> $config_host_mak
5601fi
5602if test "$memfd" = "yes" ; then
5603  echo "CONFIG_MEMFD=y" >> $config_host_mak
5604fi
5605if test "$have_usbfs" = "yes" ; then
5606  echo "CONFIG_USBFS=y" >> $config_host_mak
5607fi
5608if test "$fallocate" = "yes" ; then
5609  echo "CONFIG_FALLOCATE=y" >> $config_host_mak
5610fi
5611if test "$fallocate_punch_hole" = "yes" ; then
5612  echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
5613fi
5614if test "$fallocate_zero_range" = "yes" ; then
5615  echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak
5616fi
5617if test "$posix_fallocate" = "yes" ; then
5618  echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
5619fi
5620if test "$sync_file_range" = "yes" ; then
5621  echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
5622fi
5623if test "$fiemap" = "yes" ; then
5624  echo "CONFIG_FIEMAP=y" >> $config_host_mak
5625fi
5626if test "$dup3" = "yes" ; then
5627  echo "CONFIG_DUP3=y" >> $config_host_mak
5628fi
5629if test "$ppoll" = "yes" ; then
5630  echo "CONFIG_PPOLL=y" >> $config_host_mak
5631fi
5632if test "$prctl_pr_set_timerslack" = "yes" ; then
5633  echo "CONFIG_PRCTL_PR_SET_TIMERSLACK=y" >> $config_host_mak
5634fi
5635if test "$epoll" = "yes" ; then
5636  echo "CONFIG_EPOLL=y" >> $config_host_mak
5637fi
5638if test "$epoll_create1" = "yes" ; then
5639  echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
5640fi
5641if test "$sendfile" = "yes" ; then
5642  echo "CONFIG_SENDFILE=y" >> $config_host_mak
5643fi
5644if test "$timerfd" = "yes" ; then
5645  echo "CONFIG_TIMERFD=y" >> $config_host_mak
5646fi
5647if test "$setns" = "yes" ; then
5648  echo "CONFIG_SETNS=y" >> $config_host_mak
5649fi
5650if test "$clock_adjtime" = "yes" ; then
5651  echo "CONFIG_CLOCK_ADJTIME=y" >> $config_host_mak
5652fi
5653if test "$syncfs" = "yes" ; then
5654  echo "CONFIG_SYNCFS=y" >> $config_host_mak
5655fi
5656if test "$inotify" = "yes" ; then
5657  echo "CONFIG_INOTIFY=y" >> $config_host_mak
5658fi
5659if test "$inotify1" = "yes" ; then
5660  echo "CONFIG_INOTIFY1=y" >> $config_host_mak
5661fi
5662if test "$sem_timedwait" = "yes" ; then
5663  echo "CONFIG_SEM_TIMEDWAIT=y" >> $config_host_mak
5664fi
5665if test "$strchrnul" = "yes" ; then
5666  echo "HAVE_STRCHRNUL=y" >> $config_host_mak
5667fi
5668if test "$st_atim" = "yes" ; then
5669  echo "HAVE_STRUCT_STAT_ST_ATIM=y" >> $config_host_mak
5670fi
5671if test "$byteswap_h" = "yes" ; then
5672  echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
5673fi
5674if test "$bswap_h" = "yes" ; then
5675  echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
5676fi
5677if test "$gio" = "yes" ; then
5678    echo "CONFIG_GIO=y" >> $config_host_mak
5679    echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
5680    echo "GIO_LIBS=$gio_libs" >> $config_host_mak
5681    echo "GDBUS_CODEGEN=$gdbus_codegen" >> $config_host_mak
5682fi
5683echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
5684if test "$gnutls" = "yes" ; then
5685  echo "CONFIG_GNUTLS=y" >> $config_host_mak
5686  echo "GNUTLS_CFLAGS=$gnutls_cflags" >> $config_host_mak
5687  echo "GNUTLS_LIBS=$gnutls_libs" >> $config_host_mak
5688fi
5689if test "$gcrypt" = "yes" ; then
5690  echo "CONFIG_GCRYPT=y" >> $config_host_mak
5691  if test "$gcrypt_hmac" = "yes" ; then
5692    echo "CONFIG_GCRYPT_HMAC=y" >> $config_host_mak
5693  fi
5694  echo "GCRYPT_CFLAGS=$gcrypt_cflags" >> $config_host_mak
5695  echo "GCRYPT_LIBS=$gcrypt_libs" >> $config_host_mak
5696fi
5697if test "$nettle" = "yes" ; then
5698  echo "CONFIG_NETTLE=y" >> $config_host_mak
5699  echo "CONFIG_NETTLE_VERSION_MAJOR=${nettle_version%%.*}" >> $config_host_mak
5700  echo "NETTLE_CFLAGS=$nettle_cflags" >> $config_host_mak
5701  echo "NETTLE_LIBS=$nettle_libs" >> $config_host_mak
5702fi
5703if test "$qemu_private_xts" = "yes" ; then
5704  echo "CONFIG_QEMU_PRIVATE_XTS=y" >> $config_host_mak
5705fi
5706if test "$tasn1" = "yes" ; then
5707  echo "CONFIG_TASN1=y" >> $config_host_mak
5708fi
5709if test "$auth_pam" = "yes" ; then
5710    echo "CONFIG_AUTH_PAM=y" >> $config_host_mak
5711fi
5712if test "$have_broken_size_max" = "yes" ; then
5713    echo "HAVE_BROKEN_SIZE_MAX=y" >> $config_host_mak
5714fi
5715if test "$have_openpty" = "yes" ; then
5716    echo "HAVE_OPENPTY=y" >> $config_host_mak
5717fi
5718
5719# Work around a system header bug with some kernel/XFS header
5720# versions where they both try to define 'struct fsxattr':
5721# xfs headers will not try to redefine structs from linux headers
5722# if this macro is set.
5723if test "$have_fsxattr" = "yes" ; then
5724    echo "HAVE_FSXATTR=y" >> $config_host_mak
5725fi
5726if test "$have_copy_file_range" = "yes" ; then
5727    echo "HAVE_COPY_FILE_RANGE=y" >> $config_host_mak
5728fi
5729if test "$vte" = "yes" ; then
5730  echo "CONFIG_VTE=y" >> $config_host_mak
5731  echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak
5732  echo "VTE_LIBS=$vte_libs" >> $config_host_mak
5733fi
5734if test "$virglrenderer" = "yes" ; then
5735  echo "CONFIG_VIRGL=y" >> $config_host_mak
5736  echo "VIRGL_CFLAGS=$virgl_cflags" >> $config_host_mak
5737  echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak
5738fi
5739if test "$xen" = "enabled" ; then
5740  echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
5741  echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
5742  echo "XEN_CFLAGS=$xen_cflags" >> $config_host_mak
5743  echo "XEN_LIBS=$xen_libs" >> $config_host_mak
5744fi
5745if test "$linux_aio" = "yes" ; then
5746  echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
5747fi
5748if test "$linux_io_uring" = "yes" ; then
5749  echo "CONFIG_LINUX_IO_URING=y" >> $config_host_mak
5750  echo "LINUX_IO_URING_CFLAGS=$linux_io_uring_cflags" >> $config_host_mak
5751  echo "LINUX_IO_URING_LIBS=$linux_io_uring_libs" >> $config_host_mak
5752fi
5753if test "$vhost_scsi" = "yes" ; then
5754  echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
5755fi
5756if test "$vhost_net" = "yes" ; then
5757  echo "CONFIG_VHOST_NET=y" >> $config_host_mak
5758fi
5759if test "$vhost_net_user" = "yes" ; then
5760  echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
5761fi
5762if test "$vhost_net_vdpa" = "yes" ; then
5763  echo "CONFIG_VHOST_NET_VDPA=y" >> $config_host_mak
5764fi
5765if test "$vhost_crypto" = "yes" ; then
5766  echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
5767fi
5768if test "$vhost_vsock" = "yes" ; then
5769  echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
5770  if test "$vhost_user" = "yes" ; then
5771    echo "CONFIG_VHOST_USER_VSOCK=y" >> $config_host_mak
5772  fi
5773fi
5774if test "$vhost_kernel" = "yes" ; then
5775  echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
5776fi
5777if test "$vhost_user" = "yes" ; then
5778  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
5779fi
5780if test "$vhost_vdpa" = "yes" ; then
5781  echo "CONFIG_VHOST_VDPA=y" >> $config_host_mak
5782fi
5783if test "$vhost_user_fs" = "yes" ; then
5784  echo "CONFIG_VHOST_USER_FS=y" >> $config_host_mak
5785fi
5786if test "$iovec" = "yes" ; then
5787  echo "CONFIG_IOVEC=y" >> $config_host_mak
5788fi
5789if test "$membarrier" = "yes" ; then
5790  echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
5791fi
5792if test "$signalfd" = "yes" ; then
5793  echo "CONFIG_SIGNALFD=y" >> $config_host_mak
5794fi
5795if test "$optreset" = "yes" ; then
5796  echo "HAVE_OPTRESET=y" >> $config_host_mak
5797fi
5798if test "$fdatasync" = "yes" ; then
5799  echo "CONFIG_FDATASYNC=y" >> $config_host_mak
5800fi
5801if test "$madvise" = "yes" ; then
5802  echo "CONFIG_MADVISE=y" >> $config_host_mak
5803fi
5804if test "$posix_madvise" = "yes" ; then
5805  echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak
5806fi
5807if test "$posix_memalign" = "yes" ; then
5808  echo "CONFIG_POSIX_MEMALIGN=y" >> $config_host_mak
5809fi
5810if test "$spice" = "yes" ; then
5811  echo "CONFIG_SPICE=y" >> $config_host_mak
5812  echo "SPICE_CFLAGS=$spice_cflags" >> $config_host_mak
5813  echo "SPICE_LIBS=$spice_libs" >> $config_host_mak
5814fi
5815
5816if test "$smartcard" = "yes" ; then
5817  echo "CONFIG_SMARTCARD=y" >> $config_host_mak
5818  echo "SMARTCARD_CFLAGS=$libcacard_cflags" >> $config_host_mak
5819  echo "SMARTCARD_LIBS=$libcacard_libs" >> $config_host_mak
5820fi
5821
5822if test "$libusb" = "yes" ; then
5823  echo "CONFIG_USB_LIBUSB=y" >> $config_host_mak
5824  echo "LIBUSB_CFLAGS=$libusb_cflags" >> $config_host_mak
5825  echo "LIBUSB_LIBS=$libusb_libs" >> $config_host_mak
5826fi
5827
5828if test "$usb_redir" = "yes" ; then
5829  echo "CONFIG_USB_REDIR=y" >> $config_host_mak
5830  echo "USB_REDIR_CFLAGS=$usb_redir_cflags" >> $config_host_mak
5831  echo "USB_REDIR_LIBS=$usb_redir_libs" >> $config_host_mak
5832fi
5833
5834if test "$opengl" = "yes" ; then
5835  echo "CONFIG_OPENGL=y" >> $config_host_mak
5836  echo "OPENGL_CFLAGS=$opengl_cflags" >> $config_host_mak
5837  echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
5838fi
5839
5840if test "$gbm" = "yes" ; then
5841    echo "CONFIG_GBM=y" >> $config_host_mak
5842    echo "GBM_LIBS=$gbm_libs" >> $config_host_mak
5843    echo "GBM_CFLAGS=$gbm_cflags" >> $config_host_mak
5844fi
5845
5846
5847if test "$avx2_opt" = "yes" ; then
5848  echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
5849fi
5850
5851if test "$avx512f_opt" = "yes" ; then
5852  echo "CONFIG_AVX512F_OPT=y" >> $config_host_mak
5853fi
5854
5855# XXX: suppress that
5856if [ "$bsd" = "yes" ] ; then
5857  echo "CONFIG_BSD=y" >> $config_host_mak
5858fi
5859
5860if test "$qom_cast_debug" = "yes" ; then
5861  echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
5862fi
5863
5864echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
5865if test "$coroutine_pool" = "yes" ; then
5866  echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
5867else
5868  echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
5869fi
5870
5871if test "$debug_stack_usage" = "yes" ; then
5872  echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
5873fi
5874
5875if test "$crypto_afalg" = "yes" ; then
5876  echo "CONFIG_AF_ALG=y" >> $config_host_mak
5877fi
5878
5879if test "$open_by_handle_at" = "yes" ; then
5880  echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
5881fi
5882
5883if test "$linux_magic_h" = "yes" ; then
5884  echo "CONFIG_LINUX_MAGIC_H=y" >> $config_host_mak
5885fi
5886
5887if test "$valgrind_h" = "yes" ; then
5888  echo "CONFIG_VALGRIND_H=y" >> $config_host_mak
5889fi
5890
5891if test "$have_asan_iface_fiber" = "yes" ; then
5892    echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
5893fi
5894
5895if test "$have_tsan" = "yes" && test "$have_tsan_iface_fiber" = "yes" ; then
5896    echo "CONFIG_TSAN=y" >> $config_host_mak
5897fi
5898
5899if test "$has_environ" = "yes" ; then
5900  echo "CONFIG_HAS_ENVIRON=y" >> $config_host_mak
5901fi
5902
5903if test "$cpuid_h" = "yes" ; then
5904  echo "CONFIG_CPUID_H=y" >> $config_host_mak
5905fi
5906
5907if test "$int128" = "yes" ; then
5908  echo "CONFIG_INT128=y" >> $config_host_mak
5909fi
5910
5911if test "$atomic128" = "yes" ; then
5912  echo "CONFIG_ATOMIC128=y" >> $config_host_mak
5913fi
5914
5915if test "$cmpxchg128" = "yes" ; then
5916  echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
5917fi
5918
5919if test "$atomic64" = "yes" ; then
5920  echo "CONFIG_ATOMIC64=y" >> $config_host_mak
5921fi
5922
5923if test "$getauxval" = "yes" ; then
5924  echo "CONFIG_GETAUXVAL=y" >> $config_host_mak
5925fi
5926
5927if test "$libssh" = "yes" ; then
5928  echo "CONFIG_LIBSSH=y" >> $config_host_mak
5929  echo "LIBSSH_CFLAGS=$libssh_cflags" >> $config_host_mak
5930  echo "LIBSSH_LIBS=$libssh_libs" >> $config_host_mak
5931fi
5932
5933if test "$live_block_migration" = "yes" ; then
5934  echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
5935fi
5936
5937if test "$tpm" = "yes"; then
5938  echo 'CONFIG_TPM=y' >> $config_host_mak
5939fi
5940
5941echo "TRACE_BACKENDS=$trace_backends" >> $config_host_mak
5942if have_backend "nop"; then
5943  echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
5944fi
5945if have_backend "simple"; then
5946  echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
5947  # Set the appropriate trace file.
5948  trace_file="\"$trace_file-\" FMT_pid"
5949fi
5950if have_backend "log"; then
5951  echo "CONFIG_TRACE_LOG=y" >> $config_host_mak
5952fi
5953if have_backend "ust"; then
5954  echo "CONFIG_TRACE_UST=y" >> $config_host_mak
5955  echo "LTTNG_UST_LIBS=$lttng_ust_libs" >> $config_host_mak
5956  echo "URCU_BP_LIBS=$urcu_bp_libs" >> $config_host_mak
5957fi
5958if have_backend "dtrace"; then
5959  echo "CONFIG_TRACE_DTRACE=y" >> $config_host_mak
5960  if test "$trace_backend_stap" = "yes" ; then
5961    echo "CONFIG_TRACE_SYSTEMTAP=y" >> $config_host_mak
5962  fi
5963fi
5964if have_backend "ftrace"; then
5965  if test "$linux" = "yes" ; then
5966    echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak
5967  else
5968    feature_not_found "ftrace(trace backend)" "ftrace requires Linux"
5969  fi
5970fi
5971if have_backend "syslog"; then
5972  if test "$posix_syslog" = "yes" ; then
5973    echo "CONFIG_TRACE_SYSLOG=y" >> $config_host_mak
5974  else
5975    feature_not_found "syslog(trace backend)" "syslog not available"
5976  fi
5977fi
5978echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
5979
5980if test "$rdma" = "yes" ; then
5981  echo "CONFIG_RDMA=y" >> $config_host_mak
5982  echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
5983fi
5984
5985if test "$pvrdma" = "yes" ; then
5986  echo "CONFIG_PVRDMA=y" >> $config_host_mak
5987fi
5988
5989if test "$have_rtnetlink" = "yes" ; then
5990  echo "CONFIG_RTNETLINK=y" >> $config_host_mak
5991fi
5992
5993if test "$libxml2" = "yes" ; then
5994  echo "CONFIG_LIBXML2=y" >> $config_host_mak
5995  echo "LIBXML2_CFLAGS=$libxml2_cflags" >> $config_host_mak
5996  echo "LIBXML2_LIBS=$libxml2_libs" >> $config_host_mak
5997fi
5998
5999if test "$replication" = "yes" ; then
6000  echo "CONFIG_REPLICATION=y" >> $config_host_mak
6001fi
6002
6003if test "$have_af_vsock" = "yes" ; then
6004  echo "CONFIG_AF_VSOCK=y" >> $config_host_mak
6005fi
6006
6007if test "$have_sysmacros" = "yes" ; then
6008  echo "CONFIG_SYSMACROS=y" >> $config_host_mak
6009fi
6010
6011if test "$have_static_assert" = "yes" ; then
6012  echo "CONFIG_STATIC_ASSERT=y" >> $config_host_mak
6013fi
6014
6015if test "$have_utmpx" = "yes" ; then
6016  echo "HAVE_UTMPX=y" >> $config_host_mak
6017fi
6018if test "$have_getrandom" = "yes" ; then
6019  echo "CONFIG_GETRANDOM=y" >> $config_host_mak
6020fi
6021if test "$ivshmem" = "yes" ; then
6022  echo "CONFIG_IVSHMEM=y" >> $config_host_mak
6023fi
6024if test "$debug_mutex" = "yes" ; then
6025  echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
6026fi
6027
6028# Hold two types of flag:
6029#   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
6030#                                     a thread we have a handle to
6031#   CONFIG_PTHREAD_SETNAME_NP_W_TID - A way of doing it on a particular
6032#                                     platform
6033if test "$pthread_setname_np_w_tid" = "yes" ; then
6034  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
6035  echo "CONFIG_PTHREAD_SETNAME_NP_W_TID=y" >> $config_host_mak
6036elif test "$pthread_setname_np_wo_tid" = "yes" ; then
6037  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
6038  echo "CONFIG_PTHREAD_SETNAME_NP_WO_TID=y" >> $config_host_mak
6039fi
6040
6041if test "$libpmem" = "yes" ; then
6042  echo "CONFIG_LIBPMEM=y" >> $config_host_mak
6043  echo "LIBPMEM_LIBS=$libpmem_libs" >> $config_host_mak
6044  echo "LIBPMEM_CFLAGS=$libpmem_cflags" >> $config_host_mak
6045fi
6046
6047if test "$libdaxctl" = "yes" ; then
6048  echo "CONFIG_LIBDAXCTL=y" >> $config_host_mak
6049  echo "LIBDAXCTL_LIBS=$libdaxctl_libs" >> $config_host_mak
6050fi
6051
6052if test "$bochs" = "yes" ; then
6053  echo "CONFIG_BOCHS=y" >> $config_host_mak
6054fi
6055if test "$cloop" = "yes" ; then
6056  echo "CONFIG_CLOOP=y" >> $config_host_mak
6057fi
6058if test "$dmg" = "yes" ; then
6059  echo "CONFIG_DMG=y" >> $config_host_mak
6060fi
6061if test "$qcow1" = "yes" ; then
6062  echo "CONFIG_QCOW1=y" >> $config_host_mak
6063fi
6064if test "$vdi" = "yes" ; then
6065  echo "CONFIG_VDI=y" >> $config_host_mak
6066fi
6067if test "$vvfat" = "yes" ; then
6068  echo "CONFIG_VVFAT=y" >> $config_host_mak
6069fi
6070if test "$qed" = "yes" ; then
6071  echo "CONFIG_QED=y" >> $config_host_mak
6072fi
6073if test "$parallels" = "yes" ; then
6074  echo "CONFIG_PARALLELS=y" >> $config_host_mak
6075fi
6076if test "$sheepdog" = "yes" ; then
6077  add_to deprecated_features "sheepdog"
6078  echo "CONFIG_SHEEPDOG=y" >> $config_host_mak
6079fi
6080if test "$have_mlockall" = "yes" ; then
6081  echo "HAVE_MLOCKALL=y" >> $config_host_mak
6082fi
6083if test "$fuzzing" = "yes" ; then
6084  # If LIB_FUZZING_ENGINE is set, assume we are running on OSS-Fuzz, and the
6085  # needed CFLAGS have already been provided
6086  if test -z "${LIB_FUZZING_ENGINE+xxx}" ; then
6087    # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
6088    # compiled code.
6089    QEMU_CFLAGS="$QEMU_CFLAGS -fsanitize=fuzzer-no-link"
6090    # To build non-fuzzer binaries with --enable-fuzzing, link everything with
6091    # fsanitize=fuzzer-no-link. Otherwise, the linker will be unable to bind
6092    # the fuzzer-related callbacks added by instrumentation.
6093    QEMU_LDFLAGS="$QEMU_LDFLAGS -fsanitize=fuzzer-no-link"
6094    # For the actual fuzzer binaries, we need to link against the libfuzzer
6095    # library. Provide the flags for doing this in FUZZ_EXE_LDFLAGS. The meson
6096    # rule for the fuzzer adds these to the link_args. They need to be
6097    # configurable, to support OSS-Fuzz
6098    FUZZ_EXE_LDFLAGS="-fsanitize=fuzzer"
6099  else
6100    FUZZ_EXE_LDFLAGS="$LIB_FUZZING_ENGINE"
6101  fi
6102fi
6103
6104if test "$plugins" = "yes" ; then
6105    echo "CONFIG_PLUGIN=y" >> $config_host_mak
6106    # Copy the export object list to the build dir
6107    if test "$ld_dynamic_list" = "yes" ; then
6108        echo "CONFIG_HAS_LD_DYNAMIC_LIST=yes" >> $config_host_mak
6109        ld_symbols=qemu-plugins-ld.symbols
6110        cp "$source_path/plugins/qemu-plugins.symbols" $ld_symbols
6111    elif test "$ld_exported_symbols_list" = "yes" ; then
6112        echo "CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST=yes" >> $config_host_mak
6113        ld64_symbols=qemu-plugins-ld64.symbols
6114        echo "# Automatically generated by configure - do not modify" > $ld64_symbols
6115        grep 'qemu_' "$source_path/plugins/qemu-plugins.symbols" | sed 's/;//g' | \
6116            sed -E 's/^[[:space:]]*(.*)/_\1/' >> $ld64_symbols
6117    else
6118        error_exit \
6119            "If \$plugins=yes, either \$ld_dynamic_list or " \
6120            "\$ld_exported_symbols_list should have been set to 'yes'."
6121    fi
6122fi
6123
6124if test -n "$gdb_bin"; then
6125    gdb_version=$($gdb_bin --version | head -n 1)
6126    if version_ge ${gdb_version##* } 9.1; then
6127        echo "HAVE_GDB_BIN=$gdb_bin" >> $config_host_mak
6128    fi
6129fi
6130
6131if test "$secret_keyring" = "yes" ; then
6132  echo "CONFIG_SECRET_KEYRING=y" >> $config_host_mak
6133fi
6134
6135echo "ROMS=$roms" >> $config_host_mak
6136echo "MAKE=$make" >> $config_host_mak
6137echo "PYTHON=$python" >> $config_host_mak
6138echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
6139echo "MESON=$meson" >> $config_host_mak
6140echo "NINJA=$ninja" >> $config_host_mak
6141echo "CC=$cc" >> $config_host_mak
6142if $iasl -h > /dev/null 2>&1; then
6143  echo "CONFIG_IASL=$iasl" >> $config_host_mak
6144fi
6145echo "CXX=$cxx" >> $config_host_mak
6146echo "OBJCC=$objcc" >> $config_host_mak
6147echo "AR=$ar" >> $config_host_mak
6148echo "ARFLAGS=$ARFLAGS" >> $config_host_mak
6149echo "AS=$as" >> $config_host_mak
6150echo "CCAS=$ccas" >> $config_host_mak
6151echo "CPP=$cpp" >> $config_host_mak
6152echo "OBJCOPY=$objcopy" >> $config_host_mak
6153echo "LD=$ld" >> $config_host_mak
6154echo "RANLIB=$ranlib" >> $config_host_mak
6155echo "NM=$nm" >> $config_host_mak
6156echo "PKG_CONFIG=$pkg_config_exe" >> $config_host_mak
6157echo "WINDRES=$windres" >> $config_host_mak
6158echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
6159echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
6160echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
6161echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
6162echo "GLIB_LIBS=$glib_libs" >> $config_host_mak
6163echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
6164echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
6165echo "EXESUF=$EXESUF" >> $config_host_mak
6166echo "HOST_DSOSUF=$HOST_DSOSUF" >> $config_host_mak
6167echo "LIBS_QGA=$libs_qga" >> $config_host_mak
6168echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak
6169echo "TASN1_CFLAGS=$tasn1_cflags" >> $config_host_mak
6170if test "$gcov" = "yes" ; then
6171  echo "CONFIG_GCOV=y" >> $config_host_mak
6172fi
6173
6174if test "$fuzzing" != "no"; then
6175    echo "CONFIG_FUZZ=y" >> $config_host_mak
6176fi
6177echo "FUZZ_EXE_LDFLAGS=$FUZZ_EXE_LDFLAGS" >> $config_host_mak
6178
6179if test "$rng_none" = "yes"; then
6180  echo "CONFIG_RNG_NONE=y" >> $config_host_mak
6181fi
6182
6183# use included Linux headers
6184if test "$linux" = "yes" ; then
6185  mkdir -p linux-headers
6186  case "$cpu" in
6187  i386|x86_64|x32)
6188    linux_arch=x86
6189    ;;
6190  ppc|ppc64|ppc64le)
6191    linux_arch=powerpc
6192    ;;
6193  s390x)
6194    linux_arch=s390
6195    ;;
6196  aarch64)
6197    linux_arch=arm64
6198    ;;
6199  mips64)
6200    linux_arch=mips
6201    ;;
6202  *)
6203    # For most CPUs the kernel architecture name and QEMU CPU name match.
6204    linux_arch="$cpu"
6205    ;;
6206  esac
6207    # For non-KVM architectures we will not have asm headers
6208    if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
6209      symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
6210    fi
6211fi
6212
6213for target in $target_list; do
6214    target_dir="$target"
6215    target_name=$(echo $target | cut -d '-' -f 1)
6216    mkdir -p $target_dir
6217    case $target in
6218        *-user) symlink "../qemu-$target_name" "$target_dir/qemu-$target_name" ;;
6219        *) symlink "../qemu-system-$target_name" "$target_dir/qemu-system-$target_name" ;;
6220    esac
6221done
6222
6223echo "CONFIG_QEMU_INTERP_PREFIX=$interp_prefix" | sed 's/%M/@0@/' >> $config_host_mak
6224if test "$default_targets" = "yes"; then
6225  echo "CONFIG_DEFAULT_TARGETS=y" >> $config_host_mak
6226fi
6227
6228if test "$numa" = "yes"; then
6229  echo "CONFIG_NUMA=y" >> $config_host_mak
6230  echo "NUMA_LIBS=$numa_libs" >> $config_host_mak
6231fi
6232
6233if test "$ccache_cpp2" = "yes"; then
6234  echo "export CCACHE_CPP2=y" >> $config_host_mak
6235fi
6236
6237if test "$safe_stack" = "yes"; then
6238  echo "CONFIG_SAFESTACK=y" >> $config_host_mak
6239fi
6240
6241# If we're using a separate build tree, set it up now.
6242# DIRS are directories which we simply mkdir in the build tree;
6243# LINKS are things to symlink back into the source tree
6244# (these can be both files and directories).
6245# Caution: do not add files or directories here using wildcards. This
6246# will result in problems later if a new file matching the wildcard is
6247# added to the source tree -- nothing will cause configure to be rerun
6248# so the build tree will be missing the link back to the new file, and
6249# tests might fail. Prefer to keep the relevant files in their own
6250# directory and symlink the directory instead.
6251# UNLINK is used to remove symlinks from older development versions
6252# that might get into the way when doing "git update" without doing
6253# a "make distclean" in between.
6254DIRS="tests tests/tcg tests/tcg/lm32 tests/qapi-schema tests/qtest/libqos"
6255DIRS="$DIRS tests/qtest tests/qemu-iotests tests/vm tests/fp tests/qgraph"
6256DIRS="$DIRS docs docs/interop fsdev scsi"
6257DIRS="$DIRS pc-bios/optionrom pc-bios/s390-ccw"
6258DIRS="$DIRS roms/seabios"
6259DIRS="$DIRS contrib/plugins/"
6260LINKS="Makefile"
6261LINKS="$LINKS tests/tcg/lm32/Makefile"
6262LINKS="$LINKS tests/tcg/Makefile.target"
6263LINKS="$LINKS pc-bios/optionrom/Makefile"
6264LINKS="$LINKS pc-bios/s390-ccw/Makefile"
6265LINKS="$LINKS roms/seabios/Makefile"
6266LINKS="$LINKS pc-bios/qemu-icon.bmp"
6267LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
6268LINKS="$LINKS tests/acceptance tests/data"
6269LINKS="$LINKS tests/qemu-iotests/check"
6270LINKS="$LINKS python"
6271LINKS="$LINKS contrib/plugins/Makefile "
6272UNLINK="pc-bios/keymaps"
6273for bios_file in \
6274    $source_path/pc-bios/*.bin \
6275    $source_path/pc-bios/*.elf \
6276    $source_path/pc-bios/*.lid \
6277    $source_path/pc-bios/*.rom \
6278    $source_path/pc-bios/*.dtb \
6279    $source_path/pc-bios/*.img \
6280    $source_path/pc-bios/openbios-* \
6281    $source_path/pc-bios/u-boot.* \
6282    $source_path/pc-bios/edk2-*.fd.bz2 \
6283    $source_path/pc-bios/palcode-*
6284do
6285    LINKS="$LINKS pc-bios/$(basename $bios_file)"
6286done
6287mkdir -p $DIRS
6288for f in $LINKS ; do
6289    if [ -e "$source_path/$f" ]; then
6290        symlink "$source_path/$f" "$f"
6291    fi
6292done
6293for f in $UNLINK ; do
6294    if [ -L "$f" ]; then
6295        rm -f "$f"
6296    fi
6297done
6298
6299(for i in $cross_cc_vars; do
6300  export $i
6301done
6302export target_list source_path use_containers ARCH
6303$source_path/tests/tcg/configure.sh)
6304
6305# temporary config to build submodules
6306for rom in seabios; do
6307    config_mak=roms/$rom/config.mak
6308    echo "# Automatically generated by configure - do not modify" > $config_mak
6309    echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
6310    echo "AS=$as" >> $config_mak
6311    echo "CCAS=$ccas" >> $config_mak
6312    echo "CC=$cc" >> $config_mak
6313    echo "BCC=bcc" >> $config_mak
6314    echo "CPP=$cpp" >> $config_mak
6315    echo "OBJCOPY=objcopy" >> $config_mak
6316    echo "IASL=$iasl" >> $config_mak
6317    echo "LD=$ld" >> $config_mak
6318    echo "RANLIB=$ranlib" >> $config_mak
6319done
6320
6321if test "$skip_meson" = no; then
6322cross="config-meson.cross.new"
6323meson_quote() {
6324    echo "'$(echo $* | sed "s/ /','/g")'"
6325}
6326
6327echo "# Automatically generated by configure - do not modify" > $cross
6328echo "[properties]" >> $cross
6329test -z "$cxx" && echo "link_language = 'c'" >> $cross
6330echo "[built-in options]" >> $cross
6331echo "c_args = [${CFLAGS:+$(meson_quote $CFLAGS)}]" >> $cross
6332echo "cpp_args = [${CXXFLAGS:+$(meson_quote $CXXFLAGS)}]" >> $cross
6333echo "c_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
6334echo "cpp_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
6335echo "[binaries]" >> $cross
6336echo "c = [$(meson_quote $cc)]" >> $cross
6337test -n "$cxx" && echo "cpp = [$(meson_quote $cxx)]" >> $cross
6338test -n "$objcc" && echo "objc = [$(meson_quote $objcc)]" >> $cross
6339echo "ar = [$(meson_quote $ar)]" >> $cross
6340echo "nm = [$(meson_quote $nm)]" >> $cross
6341echo "pkgconfig = [$(meson_quote $pkg_config_exe)]" >> $cross
6342echo "ranlib = [$(meson_quote $ranlib)]" >> $cross
6343if has $sdl2_config; then
6344  echo "sdl2-config = [$(meson_quote $sdl2_config)]" >> $cross
6345fi
6346echo "strip = [$(meson_quote $strip)]" >> $cross
6347echo "windres = [$(meson_quote $windres)]" >> $cross
6348if test "$cross_compile" = "yes"; then
6349    cross_arg="--cross-file config-meson.cross"
6350    echo "[host_machine]" >> $cross
6351    if test "$mingw32" = "yes" ; then
6352        echo "system = 'windows'" >> $cross
6353    fi
6354    if test "$linux" = "yes" ; then
6355        echo "system = 'linux'" >> $cross
6356    fi
6357    if test "$darwin" = "yes" ; then
6358        echo "system = 'darwin'" >> $cross
6359    fi
6360    case "$ARCH" in
6361        i386)
6362            echo "cpu_family = 'x86'" >> $cross
6363            ;;
6364        x86_64)
6365            echo "cpu_family = 'x86_64'" >> $cross
6366            ;;
6367        ppc64le)
6368            echo "cpu_family = 'ppc64'" >> $cross
6369            ;;
6370        *)
6371            echo "cpu_family = '$ARCH'" >> $cross
6372            ;;
6373    esac
6374    echo "cpu = '$cpu'" >> $cross
6375    if test "$bigendian" = "yes" ; then
6376        echo "endian = 'big'" >> $cross
6377    else
6378        echo "endian = 'little'" >> $cross
6379    fi
6380else
6381    cross_arg="--native-file config-meson.cross"
6382fi
6383mv $cross config-meson.cross
6384
6385rm -rf meson-private meson-info meson-logs
6386unset staticpic
6387if ! version_ge "$($meson --version)" 0.56.0; then
6388  staticpic=$(if test "$pie" = yes; then echo true; else echo false; fi)
6389fi
6390NINJA=$ninja $meson setup \
6391        --prefix "$prefix" \
6392        --libdir "$libdir" \
6393        --libexecdir "$libexecdir" \
6394        --bindir "$bindir" \
6395        --includedir "$includedir" \
6396        --datadir "$datadir" \
6397        --mandir "$mandir" \
6398        --sysconfdir "$sysconfdir" \
6399        --localedir "$localedir" \
6400        --localstatedir "$local_statedir" \
6401        -Ddocdir="$docdir" \
6402        -Dqemu_firmwarepath="$firmwarepath" \
6403        -Dqemu_suffix="$qemu_suffix" \
6404        -Doptimization=$(if test "$debug" = yes; then echo 0; else echo 2; fi) \
6405        -Ddebug=$(if test "$debug_info" = yes; then echo true; else echo false; fi) \
6406        -Dwerror=$(if test "$werror" = yes; then echo true; else echo false; fi) \
6407        -Dstrip=$(if test "$strip_opt" = yes; then echo true; else echo false; fi) \
6408        -Db_pie=$(if test "$pie" = yes; then echo true; else echo false; fi) \
6409        ${staticpic:+-Db_staticpic=$staticpic} \
6410        -Db_coverage=$(if test "$gcov" = yes; then echo true; else echo false; fi) \
6411        -Db_lto=$lto -Dcfi=$cfi -Dcfi_debug=$cfi_debug \
6412        -Dmalloc=$malloc -Dmalloc_trim=$malloc_trim -Dsparse=$sparse \
6413        -Dkvm=$kvm -Dhax=$hax -Dwhpx=$whpx -Dhvf=$hvf \
6414        -Dxen=$xen -Dxen_pci_passthrough=$xen_pci_passthrough -Dtcg=$tcg \
6415        -Dcocoa=$cocoa -Dgtk=$gtk -Dmpath=$mpath -Dsdl=$sdl -Dsdl_image=$sdl_image \
6416        -Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg -Dvnc_png=$vnc_png \
6417        -Dgettext=$gettext -Dxkbcommon=$xkbcommon -Du2f=$u2f -Dvirtiofsd=$virtiofsd \
6418        -Dcapstone=$capstone -Dslirp=$slirp -Dfdt=$fdt -Dbrlapi=$brlapi \
6419        -Dcurl=$curl -Dglusterfs=$glusterfs -Dbzip2=$bzip2 -Dlibiscsi=$libiscsi \
6420        -Dlibnfs=$libnfs -Diconv=$iconv -Dcurses=$curses -Dlibudev=$libudev\
6421        -Drbd=$rbd -Dlzo=$lzo -Dsnappy=$snappy -Dlzfse=$lzfse \
6422        -Dzstd=$zstd -Dseccomp=$seccomp -Dvirtfs=$virtfs -Dcap_ng=$cap_ng \
6423        -Dattr=$attr -Ddefault_devices=$default_devices \
6424        -Ddocs=$docs -Dsphinx_build=$sphinx_build -Dinstall_blobs=$blobs \
6425        -Dvhost_user_blk_server=$vhost_user_blk_server -Dmultiprocess=$multiprocess \
6426        -Dfuse=$fuse -Dfuse_lseek=$fuse_lseek -Dguest_agent_msi=$guest_agent_msi \
6427        $(if test "$default_features" = no; then echo "-Dauto_features=disabled"; fi) \
6428        -Dtcg_interpreter=$tcg_interpreter \
6429        $cross_arg \
6430        "$PWD" "$source_path"
6431
6432if test "$?" -ne 0 ; then
6433    error_exit "meson setup failed"
6434fi
6435fi
6436
6437if test -n "${deprecated_features}"; then
6438    echo "Warning, deprecated features enabled."
6439    echo "Please see docs/system/deprecated.rst"
6440    echo "  features: ${deprecated_features}"
6441fi
6442
6443# Save the configure command line for later reuse.
6444cat <<EOD >config.status
6445#!/bin/sh
6446# Generated by configure.
6447# Run this file to recreate the current configuration.
6448# Compiler output produced by configure, useful for debugging
6449# configure, is in config.log if it exists.
6450EOD
6451
6452preserve_env() {
6453    envname=$1
6454
6455    eval envval=\$$envname
6456
6457    if test -n "$envval"
6458    then
6459        echo "$envname='$envval'" >> config.status
6460        echo "export $envname" >> config.status
6461    else
6462        echo "unset $envname" >> config.status
6463    fi
6464}
6465
6466# Preserve various env variables that influence what
6467# features/build target configure will detect
6468preserve_env AR
6469preserve_env AS
6470preserve_env CC
6471preserve_env CPP
6472preserve_env CXX
6473preserve_env INSTALL
6474preserve_env LD
6475preserve_env LD_LIBRARY_PATH
6476preserve_env LIBTOOL
6477preserve_env MAKE
6478preserve_env NM
6479preserve_env OBJCOPY
6480preserve_env PATH
6481preserve_env PKG_CONFIG
6482preserve_env PKG_CONFIG_LIBDIR
6483preserve_env PKG_CONFIG_PATH
6484preserve_env PYTHON
6485preserve_env SDL2_CONFIG
6486preserve_env SMBD
6487preserve_env STRIP
6488preserve_env WINDRES
6489
6490printf "exec" >>config.status
6491for i in "$0" "$@"; do
6492  test "$i" = --skip-meson || printf " %s" "$(quote_sh "$i")" >>config.status
6493done
6494echo ' "$@"' >>config.status
6495chmod +x config.status
6496
6497rm -r "$TMPDIR1"
6498