cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

configure (147139B)


      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" $CPU_CFLAGS "$@"
    146}
    147
    148do_cxx() {
    149    do_compiler "$cxx" $CPU_CFLAGS "$@"
    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=gnu11/-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=""
    246block_drv_whitelist_tools="no"
    247host_cc="cc"
    248audio_win_int=""
    249libs_qga=""
    250debug_info="yes"
    251lto="false"
    252stack_protector=""
    253safe_stack=""
    254use_containers="yes"
    255gdb_bin=$(command -v "gdb-multiarch" || command -v "gdb")
    256
    257if test -e "$source_path/.git"
    258then
    259    git_submodules_action="update"
    260else
    261    git_submodules_action="ignore"
    262fi
    263
    264git_submodules="ui/keycodemapdb"
    265git="git"
    266
    267# Don't accept a target_list environment variable.
    268unset target_list
    269unset target_list_exclude
    270
    271# Default value for a variable defining feature "foo".
    272#  * foo="no"  feature will only be used if --enable-foo arg is given
    273#  * foo=""    feature will be searched for, and if found, will be used
    274#              unless --disable-foo is given
    275#  * foo="yes" this value will only be set by --enable-foo flag.
    276#              feature will searched for,
    277#              if not found, configure exits with error
    278#
    279# Always add --enable-foo and --disable-foo command line args.
    280# Distributions want to ensure that several features are compiled in, and it
    281# is impossible without a --enable-foo that exits if a feature is not found.
    282
    283default_feature=""
    284# parse CC options second
    285for opt do
    286  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
    287  case "$opt" in
    288      --without-default-features)
    289          default_feature="no"
    290  ;;
    291  esac
    292done
    293
    294brlapi="auto"
    295curl="auto"
    296iconv="auto"
    297curses="auto"
    298docs="auto"
    299fdt="auto"
    300netmap="no"
    301sdl="auto"
    302sdl_image="auto"
    303coreaudio="auto"
    304virtiofsd="auto"
    305virtfs="auto"
    306libudev="auto"
    307mpath="auto"
    308vnc="auto"
    309sparse="auto"
    310vde="$default_feature"
    311vnc_sasl="auto"
    312vnc_jpeg="auto"
    313vnc_png="auto"
    314xkbcommon="auto"
    315xen=${default_feature:+disabled}
    316xen_ctrl_version="$default_feature"
    317xen_pci_passthrough="auto"
    318linux_aio="$default_feature"
    319linux_io_uring="auto"
    320cap_ng="auto"
    321attr="auto"
    322xfs="$default_feature"
    323tcg="enabled"
    324membarrier="$default_feature"
    325vhost_kernel="$default_feature"
    326vhost_net="$default_feature"
    327vhost_crypto="$default_feature"
    328vhost_scsi="$default_feature"
    329vhost_vsock="$default_feature"
    330vhost_user="no"
    331vhost_user_blk_server="auto"
    332vhost_user_fs="$default_feature"
    333vhost_vdpa="$default_feature"
    334bpf="auto"
    335kvm="auto"
    336hax="auto"
    337hvf="auto"
    338whpx="auto"
    339nvmm="auto"
    340rdma="$default_feature"
    341pvrdma="$default_feature"
    342gprof="no"
    343debug_tcg="no"
    344debug="no"
    345sanitizers="no"
    346tsan="no"
    347fortify_source="$default_feature"
    348strip_opt="yes"
    349tcg_interpreter="false"
    350bigendian="no"
    351mingw32="no"
    352gcov="no"
    353EXESUF=""
    354HOST_DSOSUF=".so"
    355modules="no"
    356module_upgrades="no"
    357prefix="/usr/local"
    358qemu_suffix="qemu"
    359slirp="auto"
    360oss_lib=""
    361bsd="no"
    362linux="no"
    363solaris="no"
    364profiler="no"
    365cocoa="auto"
    366softmmu="yes"
    367linux_user="no"
    368bsd_user="no"
    369blobs="true"
    370pkgversion=""
    371pie=""
    372qom_cast_debug="yes"
    373trace_backends="log"
    374trace_file="trace"
    375spice="$default_feature"
    376spice_protocol="auto"
    377rbd="auto"
    378smartcard="auto"
    379u2f="auto"
    380libusb="auto"
    381usb_redir="auto"
    382opengl="$default_feature"
    383cpuid_h="no"
    384avx2_opt="$default_feature"
    385capstone="auto"
    386lzo="auto"
    387snappy="auto"
    388bzip2="auto"
    389lzfse="auto"
    390zstd="auto"
    391guest_agent="$default_feature"
    392guest_agent_with_vss="no"
    393guest_agent_ntddscsi="no"
    394guest_agent_msi="auto"
    395vss_win32_sdk="$default_feature"
    396win_sdk="no"
    397want_tools="$default_feature"
    398libiscsi="auto"
    399libnfs="auto"
    400coroutine=""
    401coroutine_pool="$default_feature"
    402debug_stack_usage="no"
    403crypto_afalg="no"
    404cfi="false"
    405cfi_debug="false"
    406seccomp="auto"
    407glusterfs="auto"
    408gtk="auto"
    409tls_priority="NORMAL"
    410gnutls="auto"
    411nettle="auto"
    412gcrypt="auto"
    413auth_pam="auto"
    414vte="auto"
    415virglrenderer="auto"
    416tpm="$default_feature"
    417libssh="$default_feature"
    418live_block_migration=${default_feature:-yes}
    419numa="$default_feature"
    420tcmalloc="no"
    421jemalloc="no"
    422replication=${default_feature:-yes}
    423bochs=${default_feature:-yes}
    424cloop=${default_feature:-yes}
    425dmg=${default_feature:-yes}
    426qcow1=${default_feature:-yes}
    427vdi=${default_feature:-yes}
    428vvfat=${default_feature:-yes}
    429qed=${default_feature:-yes}
    430parallels=${default_feature:-yes}
    431libxml2="auto"
    432debug_mutex="no"
    433libpmem="auto"
    434default_devices="true"
    435plugins="$default_feature"
    436fuzzing="no"
    437rng_none="no"
    438secret_keyring="$default_feature"
    439libdaxctl="auto"
    440meson=""
    441ninja=""
    442skip_meson=no
    443gettext="auto"
    444fuse="auto"
    445fuse_lseek="auto"
    446multiprocess="auto"
    447slirp_smbd="$default_feature"
    448
    449malloc_trim="auto"
    450gio="$default_feature"
    451
    452# parse CC options second
    453for opt do
    454  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
    455  case "$opt" in
    456  --cross-prefix=*) cross_prefix="$optarg"
    457                    cross_compile="yes"
    458  ;;
    459  --cc=*) CC="$optarg"
    460  ;;
    461  --cxx=*) CXX="$optarg"
    462  ;;
    463  --cpu=*) cpu="$optarg"
    464  ;;
    465  --extra-cflags=*) QEMU_CFLAGS="$QEMU_CFLAGS $optarg"
    466                    QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg"
    467  ;;
    468  --extra-cxxflags=*) QEMU_CXXFLAGS="$QEMU_CXXFLAGS $optarg"
    469  ;;
    470  --extra-ldflags=*) QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg"
    471                     EXTRA_LDFLAGS="$optarg"
    472  ;;
    473  --enable-debug-info) debug_info="yes"
    474  ;;
    475  --disable-debug-info) debug_info="no"
    476  ;;
    477  --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"
    478  ;;
    479  --cross-cc-cflags-*) cc_arch=${opt#--cross-cc-flags-}; cc_arch=${cc_arch%%=*}
    480                      eval "cross_cc_cflags_${cc_arch}=\$optarg"
    481                      cross_cc_vars="$cross_cc_vars cross_cc_cflags_${cc_arch}"
    482  ;;
    483  --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}
    484                cc_archs="$cc_archs $cc_arch"
    485                eval "cross_cc_${cc_arch}=\$optarg"
    486                cross_cc_vars="$cross_cc_vars cross_cc_${cc_arch}"
    487  ;;
    488  esac
    489done
    490# OS specific
    491# Using uname is really, really broken.  Once we have the right set of checks
    492# we can eliminate its usage altogether.
    493
    494# Preferred compiler:
    495#  ${CC} (if set)
    496#  ${cross_prefix}gcc (if cross-prefix specified)
    497#  system compiler
    498if test -z "${CC}${cross_prefix}"; then
    499  cc="$host_cc"
    500else
    501  cc="${CC-${cross_prefix}gcc}"
    502fi
    503
    504if test -z "${CXX}${cross_prefix}"; then
    505  cxx="c++"
    506else
    507  cxx="${CXX-${cross_prefix}g++}"
    508fi
    509
    510ar="${AR-${cross_prefix}ar}"
    511as="${AS-${cross_prefix}as}"
    512ccas="${CCAS-$cc}"
    513cpp="${CPP-$cc -E}"
    514objcopy="${OBJCOPY-${cross_prefix}objcopy}"
    515ld="${LD-${cross_prefix}ld}"
    516ranlib="${RANLIB-${cross_prefix}ranlib}"
    517nm="${NM-${cross_prefix}nm}"
    518strip="${STRIP-${cross_prefix}strip}"
    519windres="${WINDRES-${cross_prefix}windres}"
    520pkg_config_exe="${PKG_CONFIG-${cross_prefix}pkg-config}"
    521query_pkg_config() {
    522    "${pkg_config_exe}" ${QEMU_PKG_CONFIG_FLAGS} "$@"
    523}
    524pkg_config=query_pkg_config
    525sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
    526
    527# default flags for all hosts
    528# We use -fwrapv to tell the compiler that we require a C dialect where
    529# left shift of signed integers is well defined and has the expected
    530# 2s-complement style results. (Both clang and gcc agree that it
    531# provides these semantics.)
    532QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv $QEMU_CFLAGS"
    533QEMU_CFLAGS="-Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS"
    534QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS"
    535QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
    536
    537# Flags that are needed during configure but later taken care of by Meson
    538CONFIGURE_CFLAGS="-std=gnu11 -Wall"
    539CONFIGURE_LDFLAGS=
    540
    541
    542check_define() {
    543cat > $TMPC <<EOF
    544#if !defined($1)
    545#error $1 not defined
    546#endif
    547int main(void) { return 0; }
    548EOF
    549  compile_object
    550}
    551
    552check_include() {
    553cat > $TMPC <<EOF
    554#include <$1>
    555int main(void) { return 0; }
    556EOF
    557  compile_object
    558}
    559
    560write_c_skeleton() {
    561    cat > $TMPC <<EOF
    562int main(void) { return 0; }
    563EOF
    564}
    565
    566write_c_fuzzer_skeleton() {
    567    cat > $TMPC <<EOF
    568#include <stdint.h>
    569#include <sys/types.h>
    570int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
    571int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
    572EOF
    573}
    574
    575if check_define __linux__ ; then
    576  targetos="Linux"
    577elif check_define _WIN32 ; then
    578  targetos='MINGW32'
    579elif check_define __OpenBSD__ ; then
    580  targetos='OpenBSD'
    581elif check_define __sun__ ; then
    582  targetos='SunOS'
    583elif check_define __HAIKU__ ; then
    584  targetos='Haiku'
    585elif check_define __FreeBSD__ ; then
    586  targetos='FreeBSD'
    587elif check_define __FreeBSD_kernel__ && check_define __GLIBC__; then
    588  targetos='GNU/kFreeBSD'
    589elif check_define __DragonFly__ ; then
    590  targetos='DragonFly'
    591elif check_define __NetBSD__; then
    592  targetos='NetBSD'
    593elif check_define __APPLE__; then
    594  targetos='Darwin'
    595else
    596  # This is a fatal error, but don't report it yet, because we
    597  # might be going to just print the --help text, or it might
    598  # be the result of a missing compiler.
    599  targetos='bogus'
    600fi
    601
    602# Some host OSes need non-standard checks for which CPU to use.
    603# Note that these checks are broken for cross-compilation: if you're
    604# cross-compiling to one of these OSes then you'll need to specify
    605# the correct CPU with the --cpu option.
    606case $targetos in
    607Darwin)
    608  HOST_DSOSUF=".dylib"
    609  ;;
    610SunOS)
    611  # $(uname -m) returns i86pc even on an x86_64 box, so default based on isainfo
    612  if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then
    613    cpu="x86_64"
    614  fi
    615esac
    616
    617if test ! -z "$cpu" ; then
    618  # command line argument
    619  :
    620elif check_define __i386__ ; then
    621  cpu="i386"
    622elif check_define __x86_64__ ; then
    623  if check_define __ILP32__ ; then
    624    cpu="x32"
    625  else
    626    cpu="x86_64"
    627  fi
    628elif check_define __sparc__ ; then
    629  if check_define __arch64__ ; then
    630    cpu="sparc64"
    631  else
    632    cpu="sparc"
    633  fi
    634elif check_define _ARCH_PPC ; then
    635  if check_define _ARCH_PPC64 ; then
    636    if check_define _LITTLE_ENDIAN ; then
    637      cpu="ppc64le"
    638    else
    639      cpu="ppc64"
    640    fi
    641  else
    642    cpu="ppc"
    643  fi
    644elif check_define __mips__ ; then
    645  cpu="mips"
    646elif check_define __s390__ ; then
    647  if check_define __s390x__ ; then
    648    cpu="s390x"
    649  else
    650    cpu="s390"
    651  fi
    652elif check_define __riscv ; then
    653  if check_define _LP64 ; then
    654    cpu="riscv64"
    655  else
    656    cpu="riscv32"
    657  fi
    658elif check_define __arm__ ; then
    659  cpu="arm"
    660elif check_define __aarch64__ ; then
    661  cpu="aarch64"
    662else
    663  cpu=$(uname -m)
    664fi
    665
    666ARCH=
    667# Normalise host CPU name and set ARCH.
    668# Note that this case should only have supported host CPUs, not guests.
    669case "$cpu" in
    670  ppc|ppc64|s390x|sparc64|x32|riscv32|riscv64)
    671  ;;
    672  ppc64le)
    673    ARCH="ppc64"
    674  ;;
    675  i386|i486|i586|i686|i86pc|BePC)
    676    cpu="i386"
    677  ;;
    678  x86_64|amd64)
    679    cpu="x86_64"
    680  ;;
    681  armv*b|armv*l|arm)
    682    cpu="arm"
    683  ;;
    684  aarch64)
    685    cpu="aarch64"
    686  ;;
    687  mips*)
    688    cpu="mips"
    689  ;;
    690  sparc|sun4[cdmuv])
    691    cpu="sparc"
    692  ;;
    693  *)
    694    # This will result in either an error or falling back to TCI later
    695    ARCH=unknown
    696  ;;
    697esac
    698if test -z "$ARCH"; then
    699  ARCH="$cpu"
    700fi
    701
    702# OS specific
    703
    704case $targetos in
    705MINGW32*)
    706  mingw32="yes"
    707  audio_possible_drivers="dsound sdl"
    708  if check_include dsound.h; then
    709    audio_drv_list="dsound"
    710  else
    711    audio_drv_list=""
    712  fi
    713  supported_os="yes"
    714  plugins="no"
    715  pie="no"
    716;;
    717GNU/kFreeBSD)
    718  bsd="yes"
    719  audio_drv_list="oss try-sdl"
    720  audio_possible_drivers="oss sdl pa"
    721;;
    722FreeBSD)
    723  bsd="yes"
    724  bsd_user="yes"
    725  make="${MAKE-gmake}"
    726  audio_drv_list="oss try-sdl"
    727  audio_possible_drivers="oss sdl pa"
    728  # needed for kinfo_getvmmap(3) in libutil.h
    729  netmap=""  # enable netmap autodetect
    730;;
    731DragonFly)
    732  bsd="yes"
    733  make="${MAKE-gmake}"
    734  audio_drv_list="oss try-sdl"
    735  audio_possible_drivers="oss sdl pa"
    736;;
    737NetBSD)
    738  bsd="yes"
    739  make="${MAKE-gmake}"
    740  audio_drv_list="oss try-sdl"
    741  audio_possible_drivers="oss sdl"
    742  oss_lib="-lossaudio"
    743;;
    744OpenBSD)
    745  bsd="yes"
    746  make="${MAKE-gmake}"
    747  audio_drv_list="try-sdl"
    748  audio_possible_drivers="sdl"
    749;;
    750Darwin)
    751  bsd="yes"
    752  darwin="yes"
    753  audio_drv_list="try-coreaudio try-sdl"
    754  audio_possible_drivers="coreaudio sdl"
    755  # Disable attempts to use ObjectiveC features in os/object.h since they
    756  # won't work when we're compiling with gcc as a C compiler.
    757  QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS"
    758;;
    759SunOS)
    760  solaris="yes"
    761  make="${MAKE-gmake}"
    762  smbd="${SMBD-/usr/sfw/sbin/smbd}"
    763  if test -f /usr/include/sys/soundcard.h ; then
    764    audio_drv_list="oss try-sdl"
    765  fi
    766  audio_possible_drivers="oss sdl"
    767# needed for CMSG_ macros in sys/socket.h
    768  QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS"
    769# needed for TIOCWIN* defines in termios.h
    770  QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
    771;;
    772Haiku)
    773  haiku="yes"
    774  pie="no"
    775  QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS -D_BSD_SOURCE -fPIC $QEMU_CFLAGS"
    776;;
    777Linux)
    778  audio_drv_list="try-pa oss"
    779  audio_possible_drivers="oss alsa sdl pa"
    780  linux="yes"
    781  linux_user="yes"
    782  vhost_user=${default_feature:-yes}
    783;;
    784esac
    785
    786: ${make=${MAKE-make}}
    787
    788# We prefer python 3.x. A bare 'python' is traditionally
    789# python 2.x, but some distros have it as python 3.x, so
    790# we check that too
    791python=
    792explicit_python=no
    793for binary in "${PYTHON-python3}" python
    794do
    795    if has "$binary"
    796    then
    797        python=$(command -v "$binary")
    798        break
    799    fi
    800done
    801
    802
    803# Check for ancillary tools used in testing
    804genisoimage=
    805for binary in genisoimage mkisofs
    806do
    807    if has $binary
    808    then
    809        genisoimage=$(command -v "$binary")
    810        break
    811    fi
    812done
    813
    814# Default objcc to clang if available, otherwise use CC
    815if has clang; then
    816  objcc=clang
    817else
    818  objcc="$cc"
    819fi
    820
    821if test "$mingw32" = "yes" ; then
    822  EXESUF=".exe"
    823  HOST_DSOSUF=".dll"
    824  # MinGW needs -mthreads for TLS and macro _MT.
    825  CONFIGURE_CFLAGS="-mthreads $CONFIGURE_CFLAGS"
    826  write_c_skeleton;
    827  prefix="/qemu"
    828  qemu_suffix=""
    829  libs_qga="-lws2_32 -lwinmm -lpowrprof -lwtsapi32 -lwininet -liphlpapi -lnetapi32 $libs_qga"
    830fi
    831
    832werror=""
    833
    834for opt do
    835  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
    836  case "$opt" in
    837  --help|-h) show_help=yes
    838  ;;
    839  --version|-V) exec cat $source_path/VERSION
    840  ;;
    841  --prefix=*) prefix="$optarg"
    842  ;;
    843  --interp-prefix=*) interp_prefix="$optarg"
    844  ;;
    845  --cross-prefix=*)
    846  ;;
    847  --cc=*)
    848  ;;
    849  --host-cc=*) host_cc="$optarg"
    850  ;;
    851  --cxx=*)
    852  ;;
    853  --iasl=*) iasl="$optarg"
    854  ;;
    855  --objcc=*) objcc="$optarg"
    856  ;;
    857  --make=*) make="$optarg"
    858  ;;
    859  --install=*)
    860  ;;
    861  --python=*) python="$optarg" ; explicit_python=yes
    862  ;;
    863  --sphinx-build=*) sphinx_build="$optarg"
    864  ;;
    865  --skip-meson) skip_meson=yes
    866  ;;
    867  --meson=*) meson="$optarg"
    868  ;;
    869  --ninja=*) ninja="$optarg"
    870  ;;
    871  --smbd=*) smbd="$optarg"
    872  ;;
    873  --extra-cflags=*)
    874  ;;
    875  --extra-cxxflags=*)
    876  ;;
    877  --extra-ldflags=*)
    878  ;;
    879  --enable-debug-info)
    880  ;;
    881  --disable-debug-info)
    882  ;;
    883  --cross-cc-*)
    884  ;;
    885  --enable-modules)
    886      modules="yes"
    887  ;;
    888  --disable-modules)
    889      modules="no"
    890  ;;
    891  --disable-module-upgrades) module_upgrades="no"
    892  ;;
    893  --enable-module-upgrades) module_upgrades="yes"
    894  ;;
    895  --cpu=*)
    896  ;;
    897  --target-list=*) target_list="$optarg"
    898                   if test "$target_list_exclude"; then
    899                       error_exit "Can't mix --target-list with --target-list-exclude"
    900                   fi
    901  ;;
    902  --target-list-exclude=*) target_list_exclude="$optarg"
    903                   if test "$target_list"; then
    904                       error_exit "Can't mix --target-list-exclude with --target-list"
    905                   fi
    906  ;;
    907  --enable-trace-backends=*) trace_backends="$optarg"
    908  ;;
    909  # XXX: backwards compatibility
    910  --enable-trace-backend=*) trace_backends="$optarg"
    911  ;;
    912  --with-trace-file=*) trace_file="$optarg"
    913  ;;
    914  --with-default-devices) default_devices="true"
    915  ;;
    916  --without-default-devices) default_devices="false"
    917  ;;
    918  --with-devices-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --with-devices-FOO option"
    919  ;;
    920  --with-devices-*) device_arch=${opt#--with-devices-};
    921                    device_arch=${device_arch%%=*}
    922                    cf=$source_path/configs/devices/$device_arch-softmmu/$optarg.mak
    923                    if test -f "$cf"; then
    924                        device_archs="$device_archs $device_arch"
    925                        eval "devices_${device_arch}=\$optarg"
    926                    else
    927                        error_exit "File $cf does not exist"
    928                    fi
    929  ;;
    930  --without-default-features) # processed above
    931  ;;
    932  --enable-gprof) gprof="yes"
    933  ;;
    934  --enable-gcov) gcov="yes"
    935  ;;
    936  --static)
    937    static="yes"
    938    QEMU_PKG_CONFIG_FLAGS="--static $QEMU_PKG_CONFIG_FLAGS"
    939  ;;
    940  --mandir=*) mandir="$optarg"
    941  ;;
    942  --bindir=*) bindir="$optarg"
    943  ;;
    944  --libdir=*) libdir="$optarg"
    945  ;;
    946  --libexecdir=*) libexecdir="$optarg"
    947  ;;
    948  --includedir=*) includedir="$optarg"
    949  ;;
    950  --datadir=*) datadir="$optarg"
    951  ;;
    952  --with-suffix=*) qemu_suffix="$optarg"
    953  ;;
    954  --docdir=*) docdir="$optarg"
    955  ;;
    956  --localedir=*) localedir="$optarg"
    957  ;;
    958  --sysconfdir=*) sysconfdir="$optarg"
    959  ;;
    960  --localstatedir=*) local_statedir="$optarg"
    961  ;;
    962  --firmwarepath=*) firmwarepath="$optarg"
    963  ;;
    964  --host=*|--build=*|\
    965  --disable-dependency-tracking|\
    966  --sbindir=*|--sharedstatedir=*|\
    967  --oldincludedir=*|--datarootdir=*|--infodir=*|\
    968  --htmldir=*|--dvidir=*|--pdfdir=*|--psdir=*)
    969    # These switches are silently ignored, for compatibility with
    970    # autoconf-generated configure scripts. This allows QEMU's
    971    # configure to be used by RPM and similar macros that set
    972    # lots of directory switches by default.
    973  ;;
    974  --disable-sdl) sdl="disabled"
    975  ;;
    976  --enable-sdl) sdl="enabled"
    977  ;;
    978  --disable-sdl-image) sdl_image="disabled"
    979  ;;
    980  --enable-sdl-image) sdl_image="enabled"
    981  ;;
    982  --disable-qom-cast-debug) qom_cast_debug="no"
    983  ;;
    984  --enable-qom-cast-debug) qom_cast_debug="yes"
    985  ;;
    986  --disable-virtfs) virtfs="disabled"
    987  ;;
    988  --enable-virtfs) virtfs="enabled"
    989  ;;
    990  --disable-libudev) libudev="disabled"
    991  ;;
    992  --enable-libudev) libudev="enabled"
    993  ;;
    994  --disable-virtiofsd) virtiofsd="disabled"
    995  ;;
    996  --enable-virtiofsd) virtiofsd="enabled"
    997  ;;
    998  --disable-mpath) mpath="disabled"
    999  ;;
   1000  --enable-mpath) mpath="enabled"
   1001  ;;
   1002  --disable-vnc) vnc="disabled"
   1003  ;;
   1004  --enable-vnc) vnc="enabled"
   1005  ;;
   1006  --disable-gettext) gettext="disabled"
   1007  ;;
   1008  --enable-gettext) gettext="enabled"
   1009  ;;
   1010  --oss-lib=*) oss_lib="$optarg"
   1011  ;;
   1012  --audio-drv-list=*) audio_drv_list="$optarg"
   1013  ;;
   1014  --block-drv-rw-whitelist=*|--block-drv-whitelist=*) block_drv_rw_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
   1015  ;;
   1016  --block-drv-ro-whitelist=*) block_drv_ro_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
   1017  ;;
   1018  --enable-block-drv-whitelist-in-tools) block_drv_whitelist_tools="yes"
   1019  ;;
   1020  --disable-block-drv-whitelist-in-tools) block_drv_whitelist_tools="no"
   1021  ;;
   1022  --enable-debug-tcg) debug_tcg="yes"
   1023  ;;
   1024  --disable-debug-tcg) debug_tcg="no"
   1025  ;;
   1026  --enable-debug)
   1027      # Enable debugging options that aren't excessively noisy
   1028      debug_tcg="yes"
   1029      debug_mutex="yes"
   1030      debug="yes"
   1031      strip_opt="no"
   1032      fortify_source="no"
   1033  ;;
   1034  --enable-sanitizers) sanitizers="yes"
   1035  ;;
   1036  --disable-sanitizers) sanitizers="no"
   1037  ;;
   1038  --enable-tsan) tsan="yes"
   1039  ;;
   1040  --disable-tsan) tsan="no"
   1041  ;;
   1042  --enable-sparse) sparse="enabled"
   1043  ;;
   1044  --disable-sparse) sparse="disabled"
   1045  ;;
   1046  --disable-strip) strip_opt="no"
   1047  ;;
   1048  --disable-vnc-sasl) vnc_sasl="disabled"
   1049  ;;
   1050  --enable-vnc-sasl) vnc_sasl="enabled"
   1051  ;;
   1052  --disable-vnc-jpeg) vnc_jpeg="disabled"
   1053  ;;
   1054  --enable-vnc-jpeg) vnc_jpeg="enabled"
   1055  ;;
   1056  --disable-vnc-png) vnc_png="disabled"
   1057  ;;
   1058  --enable-vnc-png) vnc_png="enabled"
   1059  ;;
   1060  --disable-slirp) slirp="disabled"
   1061  ;;
   1062  --enable-slirp) slirp="enabled"
   1063  ;;
   1064  --enable-slirp=git) slirp="internal"
   1065  ;;
   1066  --enable-slirp=system) slirp="system"
   1067  ;;
   1068  --disable-vde) vde="no"
   1069  ;;
   1070  --enable-vde) vde="yes"
   1071  ;;
   1072  --disable-netmap) netmap="no"
   1073  ;;
   1074  --enable-netmap) netmap="yes"
   1075  ;;
   1076  --disable-xen) xen="disabled"
   1077  ;;
   1078  --enable-xen) xen="enabled"
   1079  ;;
   1080  --disable-xen-pci-passthrough) xen_pci_passthrough="disabled"
   1081  ;;
   1082  --enable-xen-pci-passthrough) xen_pci_passthrough="enabled"
   1083  ;;
   1084  --disable-brlapi) brlapi="disabled"
   1085  ;;
   1086  --enable-brlapi) brlapi="enabled"
   1087  ;;
   1088  --disable-kvm) kvm="disabled"
   1089  ;;
   1090  --enable-kvm) kvm="enabled"
   1091  ;;
   1092  --disable-hax) hax="disabled"
   1093  ;;
   1094  --enable-hax) hax="enabled"
   1095  ;;
   1096  --disable-hvf) hvf="disabled"
   1097  ;;
   1098  --enable-hvf) hvf="enabled"
   1099  ;;
   1100  --disable-nvmm) nvmm="disabled"
   1101  ;;
   1102  --enable-nvmm) nvmm="enabled"
   1103  ;;
   1104  --disable-whpx) whpx="disabled"
   1105  ;;
   1106  --enable-whpx) whpx="enabled"
   1107  ;;
   1108  --disable-tcg-interpreter) tcg_interpreter="false"
   1109  ;;
   1110  --enable-tcg-interpreter) tcg_interpreter="true"
   1111  ;;
   1112  --disable-cap-ng)  cap_ng="disabled"
   1113  ;;
   1114  --enable-cap-ng) cap_ng="enabled"
   1115  ;;
   1116  --disable-tcg) tcg="disabled"
   1117                 plugins="no"
   1118  ;;
   1119  --enable-tcg) tcg="enabled"
   1120  ;;
   1121  --disable-malloc-trim) malloc_trim="disabled"
   1122  ;;
   1123  --enable-malloc-trim) malloc_trim="enabled"
   1124  ;;
   1125  --disable-spice) spice="no"
   1126  ;;
   1127  --enable-spice)
   1128      spice_protocol="yes"
   1129      spice="yes"
   1130  ;;
   1131  --disable-spice-protocol)
   1132      spice_protocol="no"
   1133      spice="no"
   1134  ;;
   1135  --enable-spice-protocol) spice_protocol="yes"
   1136  ;;
   1137  --disable-libiscsi) libiscsi="disabled"
   1138  ;;
   1139  --enable-libiscsi) libiscsi="enabled"
   1140  ;;
   1141  --disable-libnfs) libnfs="disabled"
   1142  ;;
   1143  --enable-libnfs) libnfs="enabled"
   1144  ;;
   1145  --enable-profiler) profiler="yes"
   1146  ;;
   1147  --disable-cocoa) cocoa="disabled"
   1148  ;;
   1149  --enable-cocoa) cocoa="enabled"
   1150  ;;
   1151  --disable-system) softmmu="no"
   1152  ;;
   1153  --enable-system) softmmu="yes"
   1154  ;;
   1155  --disable-user)
   1156      linux_user="no" ;
   1157      bsd_user="no" ;
   1158  ;;
   1159  --enable-user) ;;
   1160  --disable-linux-user) linux_user="no"
   1161  ;;
   1162  --enable-linux-user) linux_user="yes"
   1163  ;;
   1164  --disable-bsd-user) bsd_user="no"
   1165  ;;
   1166  --enable-bsd-user) bsd_user="yes"
   1167  ;;
   1168  --enable-pie) pie="yes"
   1169  ;;
   1170  --disable-pie) pie="no"
   1171  ;;
   1172  --enable-werror) werror="yes"
   1173  ;;
   1174  --disable-werror) werror="no"
   1175  ;;
   1176  --enable-lto) lto="true"
   1177  ;;
   1178  --disable-lto) lto="false"
   1179  ;;
   1180  --enable-stack-protector) stack_protector="yes"
   1181  ;;
   1182  --disable-stack-protector) stack_protector="no"
   1183  ;;
   1184  --enable-safe-stack) safe_stack="yes"
   1185  ;;
   1186  --disable-safe-stack) safe_stack="no"
   1187  ;;
   1188  --enable-cfi)
   1189      cfi="true";
   1190      lto="true";
   1191  ;;
   1192  --disable-cfi) cfi="false"
   1193  ;;
   1194  --enable-cfi-debug) cfi_debug="true"
   1195  ;;
   1196  --disable-cfi-debug) cfi_debug="false"
   1197  ;;
   1198  --disable-curses) curses="disabled"
   1199  ;;
   1200  --enable-curses) curses="enabled"
   1201  ;;
   1202  --disable-iconv) iconv="disabled"
   1203  ;;
   1204  --enable-iconv) iconv="enabled"
   1205  ;;
   1206  --disable-curl) curl="disabled"
   1207  ;;
   1208  --enable-curl) curl="enabled"
   1209  ;;
   1210  --disable-fdt) fdt="disabled"
   1211  ;;
   1212  --enable-fdt) fdt="enabled"
   1213  ;;
   1214  --enable-fdt=git) fdt="internal"
   1215  ;;
   1216  --enable-fdt=system) fdt="system"
   1217  ;;
   1218  --disable-linux-aio) linux_aio="no"
   1219  ;;
   1220  --enable-linux-aio) linux_aio="yes"
   1221  ;;
   1222  --disable-linux-io-uring) linux_io_uring="disabled"
   1223  ;;
   1224  --enable-linux-io-uring) linux_io_uring="enabled"
   1225  ;;
   1226  --disable-attr) attr="disabled"
   1227  ;;
   1228  --enable-attr) attr="enabled"
   1229  ;;
   1230  --disable-membarrier) membarrier="no"
   1231  ;;
   1232  --enable-membarrier) membarrier="yes"
   1233  ;;
   1234  --disable-bpf) bpf="disabled"
   1235  ;;
   1236  --enable-bpf) bpf="enabled"
   1237  ;;
   1238  --disable-blobs) blobs="false"
   1239  ;;
   1240  --with-pkgversion=*) pkgversion="$optarg"
   1241  ;;
   1242  --with-coroutine=*) coroutine="$optarg"
   1243  ;;
   1244  --disable-coroutine-pool) coroutine_pool="no"
   1245  ;;
   1246  --enable-coroutine-pool) coroutine_pool="yes"
   1247  ;;
   1248  --enable-debug-stack-usage) debug_stack_usage="yes"
   1249  ;;
   1250  --enable-crypto-afalg) crypto_afalg="yes"
   1251  ;;
   1252  --disable-crypto-afalg) crypto_afalg="no"
   1253  ;;
   1254  --disable-docs) docs="disabled"
   1255  ;;
   1256  --enable-docs) docs="enabled"
   1257  ;;
   1258  --disable-vhost-net) vhost_net="no"
   1259  ;;
   1260  --enable-vhost-net) vhost_net="yes"
   1261  ;;
   1262  --disable-vhost-crypto) vhost_crypto="no"
   1263  ;;
   1264  --enable-vhost-crypto) vhost_crypto="yes"
   1265  ;;
   1266  --disable-vhost-scsi) vhost_scsi="no"
   1267  ;;
   1268  --enable-vhost-scsi) vhost_scsi="yes"
   1269  ;;
   1270  --disable-vhost-vsock) vhost_vsock="no"
   1271  ;;
   1272  --enable-vhost-vsock) vhost_vsock="yes"
   1273  ;;
   1274  --disable-vhost-user-blk-server) vhost_user_blk_server="disabled"
   1275  ;;
   1276  --enable-vhost-user-blk-server) vhost_user_blk_server="enabled"
   1277  ;;
   1278  --disable-vhost-user-fs) vhost_user_fs="no"
   1279  ;;
   1280  --enable-vhost-user-fs) vhost_user_fs="yes"
   1281  ;;
   1282  --disable-opengl) opengl="no"
   1283  ;;
   1284  --enable-opengl) opengl="yes"
   1285  ;;
   1286  --disable-rbd) rbd="disabled"
   1287  ;;
   1288  --enable-rbd) rbd="enabled"
   1289  ;;
   1290  --disable-xfsctl) xfs="no"
   1291  ;;
   1292  --enable-xfsctl) xfs="yes"
   1293  ;;
   1294  --disable-smartcard) smartcard="disabled"
   1295  ;;
   1296  --enable-smartcard) smartcard="enabled"
   1297  ;;
   1298  --disable-u2f) u2f="disabled"
   1299  ;;
   1300  --enable-u2f) u2f="enabled"
   1301  ;;
   1302  --disable-libusb) libusb="disabled"
   1303  ;;
   1304  --enable-libusb) libusb="enabled"
   1305  ;;
   1306  --disable-usb-redir) usb_redir="disabled"
   1307  ;;
   1308  --enable-usb-redir) usb_redir="enabled"
   1309  ;;
   1310  --disable-zlib-test)
   1311  ;;
   1312  --disable-lzo) lzo="disabled"
   1313  ;;
   1314  --enable-lzo) lzo="enabled"
   1315  ;;
   1316  --disable-snappy) snappy="disabled"
   1317  ;;
   1318  --enable-snappy) snappy="enabled"
   1319  ;;
   1320  --disable-bzip2) bzip2="disabled"
   1321  ;;
   1322  --enable-bzip2) bzip2="enabled"
   1323  ;;
   1324  --enable-lzfse) lzfse="enabled"
   1325  ;;
   1326  --disable-lzfse) lzfse="disabled"
   1327  ;;
   1328  --disable-zstd) zstd="disabled"
   1329  ;;
   1330  --enable-zstd) zstd="enabled"
   1331  ;;
   1332  --enable-guest-agent) guest_agent="yes"
   1333  ;;
   1334  --disable-guest-agent) guest_agent="no"
   1335  ;;
   1336  --enable-guest-agent-msi) guest_agent_msi="enabled"
   1337  ;;
   1338  --disable-guest-agent-msi) guest_agent_msi="disabled"
   1339  ;;
   1340  --with-vss-sdk) vss_win32_sdk=""
   1341  ;;
   1342  --with-vss-sdk=*) vss_win32_sdk="$optarg"
   1343  ;;
   1344  --without-vss-sdk) vss_win32_sdk="no"
   1345  ;;
   1346  --with-win-sdk) win_sdk=""
   1347  ;;
   1348  --with-win-sdk=*) win_sdk="$optarg"
   1349  ;;
   1350  --without-win-sdk) win_sdk="no"
   1351  ;;
   1352  --enable-tools) want_tools="yes"
   1353  ;;
   1354  --disable-tools) want_tools="no"
   1355  ;;
   1356  --enable-seccomp) seccomp="enabled"
   1357  ;;
   1358  --disable-seccomp) seccomp="disabled"
   1359  ;;
   1360  --disable-glusterfs) glusterfs="disabled"
   1361  ;;
   1362  --disable-avx2) avx2_opt="no"
   1363  ;;
   1364  --enable-avx2) avx2_opt="yes"
   1365  ;;
   1366  --disable-avx512f) avx512f_opt="no"
   1367  ;;
   1368  --enable-avx512f) avx512f_opt="yes"
   1369  ;;
   1370
   1371  --enable-glusterfs) glusterfs="enabled"
   1372  ;;
   1373  --disable-virtio-blk-data-plane|--enable-virtio-blk-data-plane)
   1374      echo "$0: $opt is obsolete, virtio-blk data-plane is always on" >&2
   1375  ;;
   1376  --enable-vhdx|--disable-vhdx)
   1377      echo "$0: $opt is obsolete, VHDX driver is always built" >&2
   1378  ;;
   1379  --enable-uuid|--disable-uuid)
   1380      echo "$0: $opt is obsolete, UUID support is always built" >&2
   1381  ;;
   1382  --disable-gtk) gtk="disabled"
   1383  ;;
   1384  --enable-gtk) gtk="enabled"
   1385  ;;
   1386  --tls-priority=*) tls_priority="$optarg"
   1387  ;;
   1388  --disable-gnutls) gnutls="disabled"
   1389  ;;
   1390  --enable-gnutls) gnutls="enabled"
   1391  ;;
   1392  --disable-nettle) nettle="disabled"
   1393  ;;
   1394  --enable-nettle) nettle="enabled"
   1395  ;;
   1396  --disable-gcrypt) gcrypt="disabled"
   1397  ;;
   1398  --enable-gcrypt) gcrypt="enabled"
   1399  ;;
   1400  --disable-auth-pam) auth_pam="disabled"
   1401  ;;
   1402  --enable-auth-pam) auth_pam="enabled"
   1403  ;;
   1404  --enable-rdma) rdma="yes"
   1405  ;;
   1406  --disable-rdma) rdma="no"
   1407  ;;
   1408  --enable-pvrdma) pvrdma="yes"
   1409  ;;
   1410  --disable-pvrdma) pvrdma="no"
   1411  ;;
   1412  --disable-vte) vte="disabled"
   1413  ;;
   1414  --enable-vte) vte="enabled"
   1415  ;;
   1416  --disable-virglrenderer) virglrenderer="disabled"
   1417  ;;
   1418  --enable-virglrenderer) virglrenderer="enabled"
   1419  ;;
   1420  --disable-tpm) tpm="no"
   1421  ;;
   1422  --enable-tpm) tpm="yes"
   1423  ;;
   1424  --disable-libssh) libssh="no"
   1425  ;;
   1426  --enable-libssh) libssh="yes"
   1427  ;;
   1428  --disable-live-block-migration) live_block_migration="no"
   1429  ;;
   1430  --enable-live-block-migration) live_block_migration="yes"
   1431  ;;
   1432  --disable-numa) numa="no"
   1433  ;;
   1434  --enable-numa) numa="yes"
   1435  ;;
   1436  --disable-libxml2) libxml2="disabled"
   1437  ;;
   1438  --enable-libxml2) libxml2="enabled"
   1439  ;;
   1440  --disable-tcmalloc) tcmalloc="no"
   1441  ;;
   1442  --enable-tcmalloc) tcmalloc="yes"
   1443  ;;
   1444  --disable-jemalloc) jemalloc="no"
   1445  ;;
   1446  --enable-jemalloc) jemalloc="yes"
   1447  ;;
   1448  --disable-replication) replication="no"
   1449  ;;
   1450  --enable-replication) replication="yes"
   1451  ;;
   1452  --disable-bochs) bochs="no"
   1453  ;;
   1454  --enable-bochs) bochs="yes"
   1455  ;;
   1456  --disable-cloop) cloop="no"
   1457  ;;
   1458  --enable-cloop) cloop="yes"
   1459  ;;
   1460  --disable-dmg) dmg="no"
   1461  ;;
   1462  --enable-dmg) dmg="yes"
   1463  ;;
   1464  --disable-qcow1) qcow1="no"
   1465  ;;
   1466  --enable-qcow1) qcow1="yes"
   1467  ;;
   1468  --disable-vdi) vdi="no"
   1469  ;;
   1470  --enable-vdi) vdi="yes"
   1471  ;;
   1472  --disable-vvfat) vvfat="no"
   1473  ;;
   1474  --enable-vvfat) vvfat="yes"
   1475  ;;
   1476  --disable-qed) qed="no"
   1477  ;;
   1478  --enable-qed) qed="yes"
   1479  ;;
   1480  --disable-parallels) parallels="no"
   1481  ;;
   1482  --enable-parallels) parallels="yes"
   1483  ;;
   1484  --disable-vhost-user) vhost_user="no"
   1485  ;;
   1486  --enable-vhost-user) vhost_user="yes"
   1487  ;;
   1488  --disable-vhost-vdpa) vhost_vdpa="no"
   1489  ;;
   1490  --enable-vhost-vdpa) vhost_vdpa="yes"
   1491  ;;
   1492  --disable-vhost-kernel) vhost_kernel="no"
   1493  ;;
   1494  --enable-vhost-kernel) vhost_kernel="yes"
   1495  ;;
   1496  --disable-capstone) capstone="disabled"
   1497  ;;
   1498  --enable-capstone) capstone="enabled"
   1499  ;;
   1500  --enable-capstone=git) capstone="internal"
   1501  ;;
   1502  --enable-capstone=system) capstone="system"
   1503  ;;
   1504  --with-git=*) git="$optarg"
   1505  ;;
   1506  --enable-git-update)
   1507      git_submodules_action="update"
   1508      echo "--enable-git-update deprecated, use --with-git-submodules=update"
   1509  ;;
   1510  --disable-git-update)
   1511      git_submodules_action="validate"
   1512      echo "--disable-git-update deprecated, use --with-git-submodules=validate"
   1513  ;;
   1514  --with-git-submodules=*)
   1515      git_submodules_action="$optarg"
   1516  ;;
   1517  --enable-debug-mutex) debug_mutex=yes
   1518  ;;
   1519  --disable-debug-mutex) debug_mutex=no
   1520  ;;
   1521  --enable-libpmem) libpmem="enabled"
   1522  ;;
   1523  --disable-libpmem) libpmem="disabled"
   1524  ;;
   1525  --enable-xkbcommon) xkbcommon="enabled"
   1526  ;;
   1527  --disable-xkbcommon) xkbcommon="disabled"
   1528  ;;
   1529  --enable-plugins) if test "$mingw32" = "yes"; then
   1530                        error_exit "TCG plugins not currently supported on Windows platforms"
   1531                    else
   1532                        plugins="yes"
   1533                    fi
   1534  ;;
   1535  --disable-plugins) plugins="no"
   1536  ;;
   1537  --enable-containers) use_containers="yes"
   1538  ;;
   1539  --disable-containers) use_containers="no"
   1540  ;;
   1541  --enable-fuzzing) fuzzing=yes
   1542  ;;
   1543  --disable-fuzzing) fuzzing=no
   1544  ;;
   1545  --gdb=*) gdb_bin="$optarg"
   1546  ;;
   1547  --enable-rng-none) rng_none=yes
   1548  ;;
   1549  --disable-rng-none) rng_none=no
   1550  ;;
   1551  --enable-keyring) secret_keyring="yes"
   1552  ;;
   1553  --disable-keyring) secret_keyring="no"
   1554  ;;
   1555  --enable-libdaxctl) libdaxctl="enabled"
   1556  ;;
   1557  --disable-libdaxctl) libdaxctl="disabled"
   1558  ;;
   1559  --enable-fuse) fuse="enabled"
   1560  ;;
   1561  --disable-fuse) fuse="disabled"
   1562  ;;
   1563  --enable-fuse-lseek) fuse_lseek="enabled"
   1564  ;;
   1565  --disable-fuse-lseek) fuse_lseek="disabled"
   1566  ;;
   1567  --enable-multiprocess) multiprocess="enabled"
   1568  ;;
   1569  --disable-multiprocess) multiprocess="disabled"
   1570  ;;
   1571  --enable-gio) gio=yes
   1572  ;;
   1573  --disable-gio) gio=no
   1574  ;;
   1575  --enable-slirp-smbd) slirp_smbd=yes
   1576  ;;
   1577  --disable-slirp-smbd) slirp_smbd=no
   1578  ;;
   1579  *)
   1580      echo "ERROR: unknown option $opt"
   1581      echo "Try '$0 --help' for more information"
   1582      exit 1
   1583  ;;
   1584  esac
   1585done
   1586
   1587# test for any invalid configuration combinations
   1588if test "$plugins" = "yes" -a "$tcg" = "disabled"; then
   1589    error_exit "Can't enable plugins on non-TCG builds"
   1590fi
   1591
   1592case $git_submodules_action in
   1593    update|validate)
   1594        if test ! -e "$source_path/.git"; then
   1595            echo "ERROR: cannot $git_submodules_action git submodules without .git"
   1596            exit 1
   1597        fi
   1598    ;;
   1599    ignore)
   1600        if ! test -f "$source_path/ui/keycodemapdb/README"
   1601        then
   1602            echo
   1603            echo "ERROR: missing GIT submodules"
   1604            echo
   1605            if test -e "$source_path/.git"; then
   1606                echo "--with-git-submodules=ignore specified but submodules were not"
   1607                echo "checked out.  Please initialize and update submodules."
   1608            else
   1609                echo "This is not a GIT checkout but module content appears to"
   1610                echo "be missing. Do not use 'git archive' or GitHub download links"
   1611                echo "to acquire QEMU source archives. Non-GIT builds are only"
   1612                echo "supported with source archives linked from:"
   1613                echo
   1614                echo "  https://www.qemu.org/download/#source"
   1615                echo
   1616                echo "Developers working with GIT can use scripts/archive-source.sh"
   1617                echo "if they need to create valid source archives."
   1618            fi
   1619            echo
   1620            exit 1
   1621        fi
   1622    ;;
   1623    *)
   1624        echo "ERROR: invalid --with-git-submodules= value '$git_submodules_action'"
   1625        exit 1
   1626    ;;
   1627esac
   1628
   1629libdir="${libdir:-$prefix/lib}"
   1630libexecdir="${libexecdir:-$prefix/libexec}"
   1631includedir="${includedir:-$prefix/include}"
   1632
   1633if test "$mingw32" = "yes" ; then
   1634    bindir="${bindir:-$prefix}"
   1635else
   1636    bindir="${bindir:-$prefix/bin}"
   1637fi
   1638mandir="${mandir:-$prefix/share/man}"
   1639datadir="${datadir:-$prefix/share}"
   1640docdir="${docdir:-$prefix/share/doc}"
   1641sysconfdir="${sysconfdir:-$prefix/etc}"
   1642local_statedir="${local_statedir:-$prefix/var}"
   1643firmwarepath="${firmwarepath:-$datadir/qemu-firmware}"
   1644localedir="${localedir:-$datadir/locale}"
   1645
   1646case "$cpu" in
   1647    ppc)
   1648           CPU_CFLAGS="-m32"
   1649           QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS"
   1650           ;;
   1651    ppc64)
   1652           CPU_CFLAGS="-m64"
   1653           QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
   1654           ;;
   1655    sparc)
   1656           CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc"
   1657           QEMU_LDFLAGS="-m32 -mv8plus $QEMU_LDFLAGS"
   1658           ;;
   1659    sparc64)
   1660           CPU_CFLAGS="-m64 -mcpu=ultrasparc"
   1661           QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
   1662           ;;
   1663    s390)
   1664           CPU_CFLAGS="-m31"
   1665           QEMU_LDFLAGS="-m31 $QEMU_LDFLAGS"
   1666           ;;
   1667    s390x)
   1668           CPU_CFLAGS="-m64"
   1669           QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
   1670           ;;
   1671    i386)
   1672           CPU_CFLAGS="-m32"
   1673           QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS"
   1674           ;;
   1675    x86_64)
   1676           # ??? Only extremely old AMD cpus do not have cmpxchg16b.
   1677           # If we truly care, we should simply detect this case at
   1678           # runtime and generate the fallback to serial emulation.
   1679           CPU_CFLAGS="-m64 -mcx16"
   1680           QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
   1681           ;;
   1682    x32)
   1683           CPU_CFLAGS="-mx32"
   1684           QEMU_LDFLAGS="-mx32 $QEMU_LDFLAGS"
   1685           ;;
   1686    # No special flags required for other host CPUs
   1687esac
   1688
   1689if eval test -z "\${cross_cc_$cpu}"; then
   1690    eval "cross_cc_${cpu}=\$cc"
   1691    cross_cc_vars="$cross_cc_vars cross_cc_${cpu}"
   1692fi
   1693
   1694# For user-mode emulation the host arch has to be one we explicitly
   1695# support, even if we're using TCI.
   1696if [ "$ARCH" = "unknown" ]; then
   1697  bsd_user="no"
   1698  linux_user="no"
   1699fi
   1700
   1701default_target_list=""
   1702deprecated_targets_list=ppc64abi32-linux-user
   1703deprecated_features=""
   1704mak_wilds=""
   1705
   1706if [ "$softmmu" = "yes" ]; then
   1707    mak_wilds="${mak_wilds} $source_path/configs/targets/*-softmmu.mak"
   1708fi
   1709if [ "$linux_user" = "yes" ]; then
   1710    mak_wilds="${mak_wilds} $source_path/configs/targets/*-linux-user.mak"
   1711fi
   1712if [ "$bsd_user" = "yes" ]; then
   1713    mak_wilds="${mak_wilds} $source_path/configs/targets/*-bsd-user.mak"
   1714fi
   1715
   1716# If the user doesn't explicitly specify a deprecated target we will
   1717# skip it.
   1718if test -z "$target_list"; then
   1719    if test -z "$target_list_exclude"; then
   1720        target_list_exclude="$deprecated_targets_list"
   1721    else
   1722        target_list_exclude="$target_list_exclude,$deprecated_targets_list"
   1723    fi
   1724fi
   1725
   1726for config in $mak_wilds; do
   1727    target="$(basename "$config" .mak)"
   1728    if echo "$target_list_exclude" | grep -vq "$target"; then
   1729        default_target_list="${default_target_list} $target"
   1730    fi
   1731done
   1732
   1733# Enumerate public trace backends for --help output
   1734trace_backend_list=$(echo $(grep -le '^PUBLIC = True$' "$source_path"/scripts/tracetool/backend/*.py | sed -e 's/^.*\/\(.*\)\.py$/\1/'))
   1735
   1736if test x"$show_help" = x"yes" ; then
   1737cat << EOF
   1738
   1739Usage: configure [options]
   1740Options: [defaults in brackets after descriptions]
   1741
   1742Standard options:
   1743  --help                   print this message
   1744  --prefix=PREFIX          install in PREFIX [$prefix]
   1745  --interp-prefix=PREFIX   where to find shared libraries, etc.
   1746                           use %M for cpu name [$interp_prefix]
   1747  --target-list=LIST       set target list (default: build all non-deprecated)
   1748$(echo Available targets: $default_target_list | \
   1749  fold -s -w 53 | sed -e 's/^/                           /')
   1750$(echo Deprecated targets: $deprecated_targets_list | \
   1751  fold -s -w 53 | sed -e 's/^/                           /')
   1752  --target-list-exclude=LIST exclude a set of targets from the default target-list
   1753
   1754Advanced options (experts only):
   1755  --cross-prefix=PREFIX    use PREFIX for compile tools, PREFIX can be blank [$cross_prefix]
   1756  --cc=CC                  use C compiler CC [$cc]
   1757  --iasl=IASL              use ACPI compiler IASL [$iasl]
   1758  --host-cc=CC             use C compiler CC [$host_cc] for code run at
   1759                           build time
   1760  --cxx=CXX                use C++ compiler CXX [$cxx]
   1761  --objcc=OBJCC            use Objective-C compiler OBJCC [$objcc]
   1762  --extra-cflags=CFLAGS    append extra C compiler flags QEMU_CFLAGS
   1763  --extra-cxxflags=CXXFLAGS append extra C++ compiler flags QEMU_CXXFLAGS
   1764  --extra-ldflags=LDFLAGS  append extra linker flags LDFLAGS
   1765  --cross-cc-ARCH=CC       use compiler when building ARCH guest test cases
   1766  --cross-cc-flags-ARCH=   use compiler flags when building ARCH guest tests
   1767  --make=MAKE              use specified make [$make]
   1768  --python=PYTHON          use specified python [$python]
   1769  --sphinx-build=SPHINX    use specified sphinx-build [$sphinx_build]
   1770  --meson=MESON            use specified meson [$meson]
   1771  --ninja=NINJA            use specified ninja [$ninja]
   1772  --smbd=SMBD              use specified smbd [$smbd]
   1773  --with-git=GIT           use specified git [$git]
   1774  --with-git-submodules=update   update git submodules (default if .git dir exists)
   1775  --with-git-submodules=validate fail if git submodules are not up to date
   1776  --with-git-submodules=ignore   do not update or check git submodules (default if no .git dir)
   1777  --static                 enable static build [$static]
   1778  --mandir=PATH            install man pages in PATH
   1779  --datadir=PATH           install firmware in PATH/$qemu_suffix
   1780  --localedir=PATH         install translation in PATH/$qemu_suffix
   1781  --docdir=PATH            install documentation in PATH/$qemu_suffix
   1782  --bindir=PATH            install binaries in PATH
   1783  --libdir=PATH            install libraries in PATH
   1784  --libexecdir=PATH        install helper binaries in PATH
   1785  --sysconfdir=PATH        install config in PATH/$qemu_suffix
   1786  --localstatedir=PATH     install local state in PATH (set at runtime on win32)
   1787  --firmwarepath=PATH      search PATH for firmware files
   1788  --efi-aarch64=PATH       PATH of efi file to use for aarch64 VMs.
   1789  --with-suffix=SUFFIX     suffix for QEMU data inside datadir/libdir/sysconfdir/docdir [$qemu_suffix]
   1790  --with-pkgversion=VERS   use specified string as sub-version of the package
   1791  --without-default-features default all --enable-* options to "disabled"
   1792  --without-default-devices  do not include any device that is not needed to
   1793                           start the emulator (only use if you are including
   1794                           desired devices in configs/devices/)
   1795  --with-devices-ARCH=NAME override default configs/devices
   1796  --enable-debug           enable common debug build options
   1797  --enable-sanitizers      enable default sanitizers
   1798  --enable-tsan            enable thread sanitizer
   1799  --disable-strip          disable stripping binaries
   1800  --disable-werror         disable compilation abort on warning
   1801  --disable-stack-protector disable compiler-provided stack protection
   1802  --audio-drv-list=LIST    set audio drivers list:
   1803                           Available drivers: $audio_possible_drivers
   1804  --block-drv-whitelist=L  Same as --block-drv-rw-whitelist=L
   1805  --block-drv-rw-whitelist=L
   1806                           set block driver read-write whitelist
   1807                           (by default affects only QEMU, not tools like qemu-img)
   1808  --block-drv-ro-whitelist=L
   1809                           set block driver read-only whitelist
   1810                           (by default affects only QEMU, not tools like qemu-img)
   1811  --enable-block-drv-whitelist-in-tools
   1812                           use block whitelist also in tools instead of only QEMU
   1813  --enable-trace-backends=B Set trace backend
   1814                           Available backends: $trace_backend_list
   1815  --with-trace-file=NAME   Full PATH,NAME of file to store traces
   1816                           Default:trace-<pid>
   1817  --disable-slirp          disable SLIRP userspace network connectivity
   1818  --enable-tcg-interpreter enable TCI (TCG with bytecode interpreter, experimental and slow)
   1819  --enable-malloc-trim     enable libc malloc_trim() for memory optimization
   1820  --oss-lib                path to OSS library
   1821  --cpu=CPU                Build for host CPU [$cpu]
   1822  --with-coroutine=BACKEND coroutine backend. Supported options:
   1823                           ucontext, sigaltstack, windows
   1824  --enable-gcov            enable test coverage analysis with gcov
   1825  --disable-blobs          disable installing provided firmware blobs
   1826  --with-vss-sdk=SDK-path  enable Windows VSS support in QEMU Guest Agent
   1827  --with-win-sdk=SDK-path  path to Windows Platform SDK (to build VSS .tlb)
   1828  --tls-priority           default TLS protocol/cipher priority string
   1829  --enable-gprof           QEMU profiling with gprof
   1830  --enable-profiler        profiler support
   1831  --enable-debug-stack-usage
   1832                           track the maximum stack usage of stacks created by qemu_alloc_stack
   1833  --enable-plugins
   1834                           enable plugins via shared library loading
   1835  --disable-containers     don't use containers for cross-building
   1836  --gdb=GDB-path           gdb to use for gdbstub tests [$gdb_bin]
   1837
   1838Optional features, enabled with --enable-FEATURE and
   1839disabled with --disable-FEATURE, default is enabled if available
   1840(unless built with --without-default-features):
   1841
   1842  system          all system emulation targets
   1843  user            supported user emulation targets
   1844  linux-user      all linux usermode emulation targets
   1845  bsd-user        all BSD usermode emulation targets
   1846  docs            build documentation
   1847  guest-agent     build the QEMU Guest Agent
   1848  guest-agent-msi build guest agent Windows MSI installation package
   1849  pie             Position Independent Executables
   1850  modules         modules support (non-Windows)
   1851  module-upgrades try to load modules from alternate paths for upgrades
   1852  debug-tcg       TCG debugging (default is disabled)
   1853  debug-info      debugging information
   1854  lto             Enable Link-Time Optimization.
   1855  sparse          sparse checker
   1856  safe-stack      SafeStack Stack Smash Protection. Depends on
   1857                  clang/llvm >= 3.7 and requires coroutine backend ucontext.
   1858  cfi             Enable Control-Flow Integrity for indirect function calls.
   1859                  In case of a cfi violation, QEMU is terminated with SIGILL
   1860                  Depends on lto and is incompatible with modules
   1861                  Automatically enables Link-Time Optimization (lto)
   1862  cfi-debug       In case of a cfi violation, a message containing the line that
   1863                  triggered the error is written to stderr. After the error,
   1864                  QEMU is still terminated with SIGILL
   1865  gnutls          GNUTLS cryptography support
   1866  nettle          nettle cryptography support
   1867  gcrypt          libgcrypt cryptography support
   1868  auth-pam        PAM access control
   1869  sdl             SDL UI
   1870  sdl-image       SDL Image support for icons
   1871  gtk             gtk UI
   1872  vte             vte support for the gtk UI
   1873  curses          curses UI
   1874  iconv           font glyph conversion support
   1875  vnc             VNC UI support
   1876  vnc-sasl        SASL encryption for VNC server
   1877  vnc-jpeg        JPEG lossy compression for VNC server
   1878  vnc-png         PNG compression for VNC server
   1879  cocoa           Cocoa UI (Mac OS X only)
   1880  virtfs          VirtFS
   1881  virtiofsd       build virtiofs daemon (virtiofsd)
   1882  libudev         Use libudev to enumerate host devices
   1883  mpath           Multipath persistent reservation passthrough
   1884  xen             xen backend driver support
   1885  xen-pci-passthrough    PCI passthrough support for Xen
   1886  brlapi          BrlAPI (Braile)
   1887  curl            curl connectivity
   1888  membarrier      membarrier system call (for Linux 4.14+ or Windows)
   1889  fdt             fdt device tree
   1890  kvm             KVM acceleration support
   1891  hax             HAX acceleration support
   1892  hvf             Hypervisor.framework acceleration support
   1893  nvmm            NVMM acceleration support
   1894  whpx            Windows Hypervisor Platform acceleration support
   1895  rdma            Enable RDMA-based migration
   1896  pvrdma          Enable PVRDMA support
   1897  vde             support for vde network
   1898  netmap          support for netmap network
   1899  linux-aio       Linux AIO support
   1900  linux-io-uring  Linux io_uring support
   1901  cap-ng          libcap-ng support
   1902  attr            attr and xattr support
   1903  vhost-net       vhost-net kernel acceleration support
   1904  vhost-vsock     virtio sockets device support
   1905  vhost-scsi      vhost-scsi kernel target support
   1906  vhost-crypto    vhost-user-crypto backend support
   1907  vhost-kernel    vhost kernel backend support
   1908  vhost-user      vhost-user backend support
   1909  vhost-user-blk-server    vhost-user-blk server support
   1910  vhost-vdpa      vhost-vdpa kernel backend support
   1911  bpf             BPF kernel support
   1912  spice           spice
   1913  spice-protocol  spice-protocol
   1914  rbd             rados block device (rbd)
   1915  libiscsi        iscsi support
   1916  libnfs          nfs support
   1917  smartcard       smartcard support (libcacard)
   1918  u2f             U2F support (u2f-emu)
   1919  libusb          libusb (for usb passthrough)
   1920  live-block-migration   Block migration in the main migration stream
   1921  usb-redir       usb network redirection support
   1922  lzo             support of lzo compression library
   1923  snappy          support of snappy compression library
   1924  bzip2           support of bzip2 compression library
   1925                  (for reading bzip2-compressed dmg images)
   1926  lzfse           support of lzfse compression library
   1927                  (for reading lzfse-compressed dmg images)
   1928  zstd            support for zstd compression library
   1929                  (for migration compression and qcow2 cluster compression)
   1930  seccomp         seccomp support
   1931  coroutine-pool  coroutine freelist (better performance)
   1932  glusterfs       GlusterFS backend
   1933  tpm             TPM support
   1934  libssh          ssh block device support
   1935  numa            libnuma support
   1936  libxml2         for Parallels image format
   1937  tcmalloc        tcmalloc support
   1938  jemalloc        jemalloc support
   1939  avx2            AVX2 optimization support
   1940  avx512f         AVX512F optimization support
   1941  replication     replication support
   1942  opengl          opengl support
   1943  virglrenderer   virgl rendering support
   1944  xfsctl          xfsctl support
   1945  qom-cast-debug  cast debugging support
   1946  tools           build qemu-io, qemu-nbd and qemu-img tools
   1947  bochs           bochs image format support
   1948  cloop           cloop image format support
   1949  dmg             dmg image format support
   1950  qcow1           qcow v1 image format support
   1951  vdi             vdi image format support
   1952  vvfat           vvfat image format support
   1953  qed             qed image format support
   1954  parallels       parallels image format support
   1955  crypto-afalg    Linux AF_ALG crypto backend driver
   1956  capstone        capstone disassembler support
   1957  debug-mutex     mutex debugging support
   1958  libpmem         libpmem support
   1959  xkbcommon       xkbcommon support
   1960  rng-none        dummy RNG, avoid using /dev/(u)random and getrandom()
   1961  libdaxctl       libdaxctl support
   1962  fuse            FUSE block device export
   1963  fuse-lseek      SEEK_HOLE/SEEK_DATA support for FUSE exports
   1964  multiprocess    Out of process device emulation support
   1965  gio             libgio support
   1966  slirp-smbd      use smbd (at path --smbd=*) in slirp networking
   1967
   1968NOTE: The object files are built at the place where configure is launched
   1969EOF
   1970exit 0
   1971fi
   1972
   1973# Remove old dependency files to make sure that they get properly regenerated
   1974rm -f */config-devices.mak.d
   1975
   1976if test -z "$python"
   1977then
   1978    error_exit "Python not found. Use --python=/path/to/python"
   1979fi
   1980if ! has "$make"
   1981then
   1982    error_exit "GNU make ($make) not found"
   1983fi
   1984
   1985# Note that if the Python conditional here evaluates True we will exit
   1986# with status 1 which is a shell 'false' value.
   1987if ! $python -c 'import sys; sys.exit(sys.version_info < (3,6))'; then
   1988  error_exit "Cannot use '$python', Python >= 3.6 is required." \
   1989      "Use --python=/path/to/python to specify a supported Python."
   1990fi
   1991
   1992# Preserve python version since some functionality is dependent on it
   1993python_version=$($python -c 'import sys; print("%d.%d.%d" % (sys.version_info[0], sys.version_info[1], sys.version_info[2]))' 2>/dev/null)
   1994
   1995# Suppress writing compiled files
   1996python="$python -B"
   1997
   1998if test -z "$meson"; then
   1999    if test "$explicit_python" = no && has meson && version_ge "$(meson --version)" 0.59.2; then
   2000        meson=meson
   2001    elif test $git_submodules_action != 'ignore' ; then
   2002        meson=git
   2003    elif test -e "${source_path}/meson/meson.py" ; then
   2004        meson=internal
   2005    else
   2006        if test "$explicit_python" = yes; then
   2007            error_exit "--python requires using QEMU's embedded Meson distribution, but it was not found."
   2008        else
   2009            error_exit "Meson not found.  Use --meson=/path/to/meson"
   2010        fi
   2011    fi
   2012else
   2013    # Meson uses its own Python interpreter to invoke other Python scripts,
   2014    # but the user wants to use the one they specified with --python.
   2015    #
   2016    # We do not want to override the distro Python interpreter (and sometimes
   2017    # cannot: for example in Homebrew /usr/bin/meson is a bash script), so
   2018    # just require --meson=git|internal together with --python.
   2019    if test "$explicit_python" = yes; then
   2020        case "$meson" in
   2021            git | internal) ;;
   2022            *) error_exit "--python requires using QEMU's embedded Meson distribution." ;;
   2023        esac
   2024    fi
   2025fi
   2026
   2027if test "$meson" = git; then
   2028    git_submodules="${git_submodules} meson"
   2029fi
   2030
   2031case "$meson" in
   2032    git | internal)
   2033        meson="$python ${source_path}/meson/meson.py"
   2034        ;;
   2035    *) meson=$(command -v "$meson") ;;
   2036esac
   2037
   2038# Probe for ninja
   2039
   2040if test -z "$ninja"; then
   2041    for c in ninja ninja-build samu; do
   2042        if has $c; then
   2043            ninja=$(command -v "$c")
   2044            break
   2045        fi
   2046    done
   2047    if test -z "$ninja"; then
   2048      error_exit "Cannot find Ninja"
   2049    fi
   2050fi
   2051
   2052# Check that the C compiler works. Doing this here before testing
   2053# the host CPU ensures that we had a valid CC to autodetect the
   2054# $cpu var (and we should bail right here if that's not the case).
   2055# It also allows the help message to be printed without a CC.
   2056write_c_skeleton;
   2057if compile_object ; then
   2058  : C compiler works ok
   2059else
   2060    error_exit "\"$cc\" either does not exist or does not work"
   2061fi
   2062if ! compile_prog ; then
   2063    error_exit "\"$cc\" cannot build an executable (is your linker broken?)"
   2064fi
   2065
   2066# Consult white-list to determine whether to enable werror
   2067# by default.  Only enable by default for git builds
   2068if test -z "$werror" ; then
   2069    if test "$git_submodules_action" != "ignore" && \
   2070        { test "$linux" = "yes" || test "$mingw32" = "yes"; }; then
   2071        werror="yes"
   2072    else
   2073        werror="no"
   2074    fi
   2075fi
   2076
   2077if test "$targetos" = "bogus"; then
   2078    # Now that we know that we're not printing the help and that
   2079    # the compiler works (so the results of the check_defines we used
   2080    # to identify the OS are reliable), if we didn't recognize the
   2081    # host OS we should stop now.
   2082    error_exit "Unrecognized host OS (uname -s reports '$(uname -s)')"
   2083fi
   2084
   2085# Check whether the compiler matches our minimum requirements:
   2086cat > $TMPC << EOF
   2087#if defined(__clang_major__) && defined(__clang_minor__)
   2088# ifdef __apple_build_version__
   2089#  if __clang_major__ < 10 || (__clang_major__ == 10 && __clang_minor__ < 0)
   2090#   error You need at least XCode Clang v10.0 to compile QEMU
   2091#  endif
   2092# else
   2093#  if __clang_major__ < 6 || (__clang_major__ == 6 && __clang_minor__ < 0)
   2094#   error You need at least Clang v6.0 to compile QEMU
   2095#  endif
   2096# endif
   2097#elif defined(__GNUC__) && defined(__GNUC_MINOR__)
   2098# if __GNUC__ < 7 || (__GNUC__ == 7 && __GNUC_MINOR__ < 4)
   2099#  error You need at least GCC v7.4.0 to compile QEMU
   2100# endif
   2101#else
   2102# error You either need GCC or Clang to compiler QEMU
   2103#endif
   2104int main (void) { return 0; }
   2105EOF
   2106if ! compile_prog "" "" ; then
   2107    error_exit "You need at least GCC v7.4 or Clang v6.0 (or XCode Clang v10.0)"
   2108fi
   2109
   2110# Accumulate -Wfoo and -Wno-bar separately.
   2111# We will list all of the enable flags first, and the disable flags second.
   2112# Note that we do not add -Werror, because that would enable it for all
   2113# configure tests. If a configure test failed due to -Werror this would
   2114# just silently disable some features, so it's too error prone.
   2115
   2116warn_flags=
   2117add_to warn_flags -Wold-style-declaration
   2118add_to warn_flags -Wold-style-definition
   2119add_to warn_flags -Wtype-limits
   2120add_to warn_flags -Wformat-security
   2121add_to warn_flags -Wformat-y2k
   2122add_to warn_flags -Winit-self
   2123add_to warn_flags -Wignored-qualifiers
   2124add_to warn_flags -Wempty-body
   2125add_to warn_flags -Wnested-externs
   2126add_to warn_flags -Wendif-labels
   2127add_to warn_flags -Wexpansion-to-defined
   2128add_to warn_flags -Wimplicit-fallthrough=2
   2129
   2130nowarn_flags=
   2131add_to nowarn_flags -Wno-initializer-overrides
   2132add_to nowarn_flags -Wno-missing-include-dirs
   2133add_to nowarn_flags -Wno-shift-negative-value
   2134add_to nowarn_flags -Wno-string-plus-int
   2135add_to nowarn_flags -Wno-typedef-redefinition
   2136add_to nowarn_flags -Wno-tautological-type-limit-compare
   2137add_to nowarn_flags -Wno-psabi
   2138
   2139gcc_flags="$warn_flags $nowarn_flags"
   2140
   2141cc_has_warning_flag() {
   2142    write_c_skeleton;
   2143
   2144    # Use the positive sense of the flag when testing for -Wno-wombat
   2145    # support (gcc will happily accept the -Wno- form of unknown
   2146    # warning options).
   2147    optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
   2148    compile_prog "-Werror $optflag" ""
   2149}
   2150
   2151for flag in $gcc_flags; do
   2152    if cc_has_warning_flag $flag ; then
   2153        QEMU_CFLAGS="$QEMU_CFLAGS $flag"
   2154    fi
   2155done
   2156
   2157if test "$stack_protector" != "no"; then
   2158  cat > $TMPC << EOF
   2159int main(int argc, char *argv[])
   2160{
   2161    char arr[64], *p = arr, *c = argv[0];
   2162    while (*c) {
   2163        *p++ = *c++;
   2164    }
   2165    return 0;
   2166}
   2167EOF
   2168  gcc_flags="-fstack-protector-strong -fstack-protector-all"
   2169  sp_on=0
   2170  for flag in $gcc_flags; do
   2171    # We need to check both a compile and a link, since some compiler
   2172    # setups fail only on a .c->.o compile and some only at link time
   2173    if compile_object "-Werror $flag" &&
   2174       compile_prog "-Werror $flag" ""; then
   2175      QEMU_CFLAGS="$QEMU_CFLAGS $flag"
   2176      QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
   2177      sp_on=1
   2178      break
   2179    fi
   2180  done
   2181  if test "$stack_protector" = yes; then
   2182    if test $sp_on = 0; then
   2183      error_exit "Stack protector not supported"
   2184    fi
   2185  fi
   2186fi
   2187
   2188# Disable -Wmissing-braces on older compilers that warn even for
   2189# the "universal" C zero initializer {0}.
   2190cat > $TMPC << EOF
   2191struct {
   2192  int a[2];
   2193} x = {0};
   2194EOF
   2195if compile_object "-Werror" "" ; then
   2196  :
   2197else
   2198  QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces"
   2199fi
   2200
   2201# Our module code doesn't support Windows
   2202if test "$modules" = "yes" && test "$mingw32" = "yes" ; then
   2203  error_exit "Modules are not available for Windows"
   2204fi
   2205
   2206# module_upgrades is only reasonable if modules are enabled
   2207if test "$modules" = "no" && test "$module_upgrades" = "yes" ; then
   2208  error_exit "Can't enable module-upgrades as Modules are not enabled"
   2209fi
   2210
   2211# Static linking is not possible with plugins, modules or PIE
   2212if test "$static" = "yes" ; then
   2213  if test "$modules" = "yes" ; then
   2214    error_exit "static and modules are mutually incompatible"
   2215  fi
   2216  if test "$plugins" = "yes"; then
   2217    error_exit "static and plugins are mutually incompatible"
   2218  else
   2219    plugins="no"
   2220  fi
   2221fi
   2222
   2223# Unconditional check for compiler __thread support
   2224  cat > $TMPC << EOF
   2225static __thread int tls_var;
   2226int main(void) { return tls_var; }
   2227EOF
   2228
   2229if ! compile_prog "-Werror" "" ; then
   2230    error_exit "Your compiler does not support the __thread specifier for " \
   2231	"Thread-Local Storage (TLS). Please upgrade to a version that does."
   2232fi
   2233
   2234cat > $TMPC << EOF
   2235
   2236#ifdef __linux__
   2237#  define THREAD __thread
   2238#else
   2239#  define THREAD
   2240#endif
   2241static THREAD int tls_var;
   2242int main(void) { return tls_var; }
   2243EOF
   2244
   2245# Check we support --no-pie first; we will need this for building ROMs.
   2246if compile_prog "-Werror -fno-pie" "-no-pie"; then
   2247  CFLAGS_NOPIE="-fno-pie"
   2248fi
   2249
   2250if test "$static" = "yes"; then
   2251  if test "$pie" != "no" && compile_prog "-Werror -fPIE -DPIE" "-static-pie"; then
   2252    CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
   2253    QEMU_LDFLAGS="-static-pie $QEMU_LDFLAGS"
   2254    pie="yes"
   2255  elif test "$pie" = "yes"; then
   2256    error_exit "-static-pie not available due to missing toolchain support"
   2257  else
   2258    QEMU_LDFLAGS="-static $QEMU_LDFLAGS"
   2259    pie="no"
   2260  fi
   2261elif test "$pie" = "no"; then
   2262  CONFIGURE_CFLAGS="$CFLAGS_NOPIE $CONFIGURE_CFLAGS"
   2263elif compile_prog "-Werror -fPIE -DPIE" "-pie"; then
   2264  CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
   2265  CONFIGURE_LDFLAGS="-pie $CONFIGURE_LDFLAGS"
   2266  pie="yes"
   2267elif test "$pie" = "yes"; then
   2268  error_exit "PIE not available due to missing toolchain support"
   2269else
   2270  echo "Disabling PIE due to missing toolchain support"
   2271  pie="no"
   2272fi
   2273
   2274# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
   2275# The combination is known as "full relro", because .got.plt is read-only too.
   2276if compile_prog "" "-Wl,-z,relro -Wl,-z,now" ; then
   2277  QEMU_LDFLAGS="-Wl,-z,relro -Wl,-z,now $QEMU_LDFLAGS"
   2278fi
   2279
   2280##########################################
   2281# __sync_fetch_and_and requires at least -march=i486. Many toolchains
   2282# use i686 as default anyway, but for those that don't, an explicit
   2283# specification is necessary
   2284
   2285if test "$cpu" = "i386"; then
   2286  cat > $TMPC << EOF
   2287static int sfaa(int *ptr)
   2288{
   2289  return __sync_fetch_and_and(ptr, 0);
   2290}
   2291
   2292int main(void)
   2293{
   2294  int val = 42;
   2295  val = __sync_val_compare_and_swap(&val, 0, 1);
   2296  sfaa(&val);
   2297  return val;
   2298}
   2299EOF
   2300  if ! compile_prog "" "" ; then
   2301    QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS"
   2302  fi
   2303fi
   2304
   2305#########################################
   2306# Solaris specific configure tool chain decisions
   2307
   2308if test "$solaris" = "yes" ; then
   2309  if has ar; then
   2310    :
   2311  else
   2312    if test -f /usr/ccs/bin/ar ; then
   2313      error_exit "No path includes ar" \
   2314          "Add /usr/ccs/bin to your path and rerun configure"
   2315    fi
   2316    error_exit "No path includes ar"
   2317  fi
   2318fi
   2319
   2320if test "$tcg" = "enabled"; then
   2321    git_submodules="$git_submodules tests/fp/berkeley-testfloat-3"
   2322    git_submodules="$git_submodules tests/fp/berkeley-softfloat-3"
   2323fi
   2324
   2325if test -z "${target_list+xxx}" ; then
   2326    default_targets=yes
   2327    for target in $default_target_list; do
   2328        target_list="$target_list $target"
   2329    done
   2330    target_list="${target_list# }"
   2331else
   2332    default_targets=no
   2333    target_list=$(echo "$target_list" | sed -e 's/,/ /g')
   2334    for target in $target_list; do
   2335        # Check that we recognised the target name; this allows a more
   2336        # friendly error message than if we let it fall through.
   2337        case " $default_target_list " in
   2338            *" $target "*)
   2339                ;;
   2340            *)
   2341                error_exit "Unknown target name '$target'"
   2342                ;;
   2343        esac
   2344    done
   2345fi
   2346
   2347for target in $target_list; do
   2348    # if a deprecated target is enabled we note it here
   2349    if echo "$deprecated_targets_list" | grep -q "$target"; then
   2350        add_to deprecated_features $target
   2351    fi
   2352done
   2353
   2354# see if system emulation was really requested
   2355case " $target_list " in
   2356  *"-softmmu "*) softmmu=yes
   2357  ;;
   2358  *) softmmu=no
   2359  ;;
   2360esac
   2361
   2362feature_not_found() {
   2363  feature=$1
   2364  remedy=$2
   2365
   2366  error_exit "User requested feature $feature" \
   2367      "configure was not able to find it." \
   2368      "$remedy"
   2369}
   2370
   2371# ---
   2372# big/little endian test
   2373cat > $TMPC << EOF
   2374#include <stdio.h>
   2375short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, };
   2376short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, };
   2377int main(int argc, char *argv[])
   2378{
   2379    return printf("%s %s\n", (char *)big_endian, (char *)little_endian);
   2380}
   2381EOF
   2382
   2383if compile_prog ; then
   2384    if strings -a $TMPE | grep -q BiGeNdIaN ; then
   2385        bigendian="yes"
   2386    elif strings -a $TMPE | grep -q LiTtLeEnDiAn ; then
   2387        bigendian="no"
   2388    else
   2389        echo big/little test failed
   2390        exit 1
   2391    fi
   2392else
   2393    echo big/little test failed
   2394    exit 1
   2395fi
   2396
   2397##########################################
   2398# system tools
   2399if test -z "$want_tools"; then
   2400    if test "$softmmu" = "no"; then
   2401        want_tools=no
   2402    else
   2403        want_tools=yes
   2404    fi
   2405fi
   2406
   2407##########################################
   2408# Disable features only meaningful for system-mode emulation
   2409if test "$softmmu" = "no"; then
   2410    audio_drv_list=""
   2411fi
   2412
   2413##########################################
   2414# L2TPV3 probe
   2415
   2416cat > $TMPC <<EOF
   2417#include <sys/socket.h>
   2418#include <linux/ip.h>
   2419int main(void) { return sizeof(struct mmsghdr); }
   2420EOF
   2421if compile_prog "" "" ; then
   2422  l2tpv3=yes
   2423else
   2424  l2tpv3=no
   2425fi
   2426
   2427cat > $TMPC <<EOF
   2428#include <sys/mman.h>
   2429int main(int argc, char *argv[]) {
   2430    return mlockall(MCL_FUTURE);
   2431}
   2432EOF
   2433if compile_prog "" "" ; then
   2434  have_mlockall=yes
   2435else
   2436  have_mlockall=no
   2437fi
   2438
   2439#########################################
   2440# vhost interdependencies and host support
   2441
   2442# vhost backends
   2443if test "$vhost_user" = "yes" && test "$linux" != "yes"; then
   2444  error_exit "vhost-user is only available on Linux"
   2445fi
   2446test "$vhost_vdpa" = "" && vhost_vdpa=$linux
   2447if test "$vhost_vdpa" = "yes" && test "$linux" != "yes"; then
   2448  error_exit "vhost-vdpa is only available on Linux"
   2449fi
   2450test "$vhost_kernel" = "" && vhost_kernel=$linux
   2451if test "$vhost_kernel" = "yes" && test "$linux" != "yes"; then
   2452  error_exit "vhost-kernel is only available on Linux"
   2453fi
   2454
   2455# vhost-kernel devices
   2456test "$vhost_scsi" = "" && vhost_scsi=$vhost_kernel
   2457if test "$vhost_scsi" = "yes" && test "$vhost_kernel" != "yes"; then
   2458  error_exit "--enable-vhost-scsi requires --enable-vhost-kernel"
   2459fi
   2460test "$vhost_vsock" = "" && vhost_vsock=$vhost_kernel
   2461if test "$vhost_vsock" = "yes" && test "$vhost_kernel" != "yes"; then
   2462  error_exit "--enable-vhost-vsock requires --enable-vhost-kernel"
   2463fi
   2464
   2465# vhost-user backends
   2466test "$vhost_net_user" = "" && vhost_net_user=$vhost_user
   2467if test "$vhost_net_user" = "yes" && test "$vhost_user" = "no"; then
   2468  error_exit "--enable-vhost-net-user requires --enable-vhost-user"
   2469fi
   2470test "$vhost_crypto" = "" && vhost_crypto=$vhost_user
   2471if test "$vhost_crypto" = "yes" && test "$vhost_user" = "no"; then
   2472  error_exit "--enable-vhost-crypto requires --enable-vhost-user"
   2473fi
   2474test "$vhost_user_fs" = "" && vhost_user_fs=$vhost_user
   2475if test "$vhost_user_fs" = "yes" && test "$vhost_user" = "no"; then
   2476  error_exit "--enable-vhost-user-fs requires --enable-vhost-user"
   2477fi
   2478#vhost-vdpa backends
   2479test "$vhost_net_vdpa" = "" && vhost_net_vdpa=$vhost_vdpa
   2480if test "$vhost_net_vdpa" = "yes" && test "$vhost_vdpa" = "no"; then
   2481  error_exit "--enable-vhost-net-vdpa requires --enable-vhost-vdpa"
   2482fi
   2483
   2484# OR the vhost-kernel, vhost-vdpa and vhost-user values for simplicity
   2485if test "$vhost_net" = ""; then
   2486  test "$vhost_net_user" = "yes" && vhost_net=yes
   2487  test "$vhost_net_vdpa" = "yes" && vhost_net=yes
   2488  test "$vhost_kernel" = "yes" && vhost_net=yes
   2489fi
   2490
   2491##########################################
   2492# pkg-config probe
   2493
   2494if ! has "$pkg_config_exe"; then
   2495  error_exit "pkg-config binary '$pkg_config_exe' not found"
   2496fi
   2497
   2498##########################################
   2499# NPTL probe
   2500
   2501if test "$linux_user" = "yes"; then
   2502  cat > $TMPC <<EOF
   2503#include <sched.h>
   2504#include <linux/futex.h>
   2505int main(void) {
   2506#if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
   2507#error bork
   2508#endif
   2509  return 0;
   2510}
   2511EOF
   2512  if ! compile_object ; then
   2513    feature_not_found "nptl" "Install glibc and linux kernel headers."
   2514  fi
   2515fi
   2516
   2517##########################################
   2518# xen probe
   2519
   2520if test "$xen" != "disabled" ; then
   2521  # Check whether Xen library path is specified via --extra-ldflags to avoid
   2522  # overriding this setting with pkg-config output. If not, try pkg-config
   2523  # to obtain all needed flags.
   2524
   2525  if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
   2526     $pkg_config --exists xencontrol ; then
   2527    xen_ctrl_version="$(printf '%d%02d%02d' \
   2528      $($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
   2529    xen=enabled
   2530    xen_pc="xencontrol xenstore xenforeignmemory xengnttab"
   2531    xen_pc="$xen_pc xenevtchn xendevicemodel"
   2532    if $pkg_config --exists xentoolcore; then
   2533      xen_pc="$xen_pc xentoolcore"
   2534    fi
   2535    xen_cflags="$($pkg_config --cflags $xen_pc)"
   2536    xen_libs="$($pkg_config --libs $xen_pc)"
   2537  else
   2538
   2539    xen_libs="-lxenstore -lxenctrl"
   2540    xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
   2541
   2542    # First we test whether Xen headers and libraries are available.
   2543    # If no, we are done and there is no Xen support.
   2544    # If yes, more tests are run to detect the Xen version.
   2545
   2546    # Xen (any)
   2547    cat > $TMPC <<EOF
   2548#include <xenctrl.h>
   2549int main(void) {
   2550  return 0;
   2551}
   2552EOF
   2553    if ! compile_prog "" "$xen_libs" ; then
   2554      # Xen not found
   2555      if test "$xen" = "enabled" ; then
   2556        feature_not_found "xen" "Install xen devel"
   2557      fi
   2558      xen=disabled
   2559
   2560    # Xen unstable
   2561    elif
   2562        cat > $TMPC <<EOF &&
   2563#undef XC_WANT_COMPAT_DEVICEMODEL_API
   2564#define __XEN_TOOLS__
   2565#include <xendevicemodel.h>
   2566#include <xenforeignmemory.h>
   2567int main(void) {
   2568  xendevicemodel_handle *xd;
   2569  xenforeignmemory_handle *xfmem;
   2570
   2571  xd = xendevicemodel_open(0, 0);
   2572  xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
   2573
   2574  xfmem = xenforeignmemory_open(0, 0);
   2575  xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
   2576
   2577  return 0;
   2578}
   2579EOF
   2580        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
   2581      then
   2582      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
   2583      xen_ctrl_version=41100
   2584      xen=enabled
   2585    elif
   2586        cat > $TMPC <<EOF &&
   2587#undef XC_WANT_COMPAT_MAP_FOREIGN_API
   2588#include <xenforeignmemory.h>
   2589#include <xentoolcore.h>
   2590int main(void) {
   2591  xenforeignmemory_handle *xfmem;
   2592
   2593  xfmem = xenforeignmemory_open(0, 0);
   2594  xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
   2595  xentoolcore_restrict_all(0);
   2596
   2597  return 0;
   2598}
   2599EOF
   2600        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
   2601      then
   2602      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
   2603      xen_ctrl_version=41000
   2604      xen=enabled
   2605    elif
   2606        cat > $TMPC <<EOF &&
   2607#undef XC_WANT_COMPAT_DEVICEMODEL_API
   2608#define __XEN_TOOLS__
   2609#include <xendevicemodel.h>
   2610int main(void) {
   2611  xendevicemodel_handle *xd;
   2612
   2613  xd = xendevicemodel_open(0, 0);
   2614  xendevicemodel_close(xd);
   2615
   2616  return 0;
   2617}
   2618EOF
   2619        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
   2620      then
   2621      xen_stable_libs="-lxendevicemodel $xen_stable_libs"
   2622      xen_ctrl_version=40900
   2623      xen=enabled
   2624    elif
   2625        cat > $TMPC <<EOF &&
   2626/*
   2627 * If we have stable libs the we don't want the libxc compat
   2628 * layers, regardless of what CFLAGS we may have been given.
   2629 *
   2630 * Also, check if xengnttab_grant_copy_segment_t is defined and
   2631 * grant copy operation is implemented.
   2632 */
   2633#undef XC_WANT_COMPAT_EVTCHN_API
   2634#undef XC_WANT_COMPAT_GNTTAB_API
   2635#undef XC_WANT_COMPAT_MAP_FOREIGN_API
   2636#include <xenctrl.h>
   2637#include <xenstore.h>
   2638#include <xenevtchn.h>
   2639#include <xengnttab.h>
   2640#include <xenforeignmemory.h>
   2641#include <stdint.h>
   2642#include <xen/hvm/hvm_info_table.h>
   2643#if !defined(HVM_MAX_VCPUS)
   2644# error HVM_MAX_VCPUS not defined
   2645#endif
   2646int main(void) {
   2647  xc_interface *xc = NULL;
   2648  xenforeignmemory_handle *xfmem;
   2649  xenevtchn_handle *xe;
   2650  xengnttab_handle *xg;
   2651  xengnttab_grant_copy_segment_t* seg = NULL;
   2652
   2653  xs_daemon_open();
   2654
   2655  xc = xc_interface_open(0, 0, 0);
   2656  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
   2657  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
   2658  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
   2659  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
   2660
   2661  xfmem = xenforeignmemory_open(0, 0);
   2662  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
   2663
   2664  xe = xenevtchn_open(0, 0);
   2665  xenevtchn_fd(xe);
   2666
   2667  xg = xengnttab_open(0, 0);
   2668  xengnttab_grant_copy(xg, 0, seg);
   2669
   2670  return 0;
   2671}
   2672EOF
   2673        compile_prog "" "$xen_libs $xen_stable_libs"
   2674      then
   2675      xen_ctrl_version=40800
   2676      xen=enabled
   2677    elif
   2678        cat > $TMPC <<EOF &&
   2679/*
   2680 * If we have stable libs the we don't want the libxc compat
   2681 * layers, regardless of what CFLAGS we may have been given.
   2682 */
   2683#undef XC_WANT_COMPAT_EVTCHN_API
   2684#undef XC_WANT_COMPAT_GNTTAB_API
   2685#undef XC_WANT_COMPAT_MAP_FOREIGN_API
   2686#include <xenctrl.h>
   2687#include <xenstore.h>
   2688#include <xenevtchn.h>
   2689#include <xengnttab.h>
   2690#include <xenforeignmemory.h>
   2691#include <stdint.h>
   2692#include <xen/hvm/hvm_info_table.h>
   2693#if !defined(HVM_MAX_VCPUS)
   2694# error HVM_MAX_VCPUS not defined
   2695#endif
   2696int main(void) {
   2697  xc_interface *xc = NULL;
   2698  xenforeignmemory_handle *xfmem;
   2699  xenevtchn_handle *xe;
   2700  xengnttab_handle *xg;
   2701
   2702  xs_daemon_open();
   2703
   2704  xc = xc_interface_open(0, 0, 0);
   2705  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
   2706  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
   2707  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
   2708  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
   2709
   2710  xfmem = xenforeignmemory_open(0, 0);
   2711  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
   2712
   2713  xe = xenevtchn_open(0, 0);
   2714  xenevtchn_fd(xe);
   2715
   2716  xg = xengnttab_open(0, 0);
   2717  xengnttab_map_grant_ref(xg, 0, 0, 0);
   2718
   2719  return 0;
   2720}
   2721EOF
   2722        compile_prog "" "$xen_libs $xen_stable_libs"
   2723      then
   2724      xen_ctrl_version=40701
   2725      xen=enabled
   2726
   2727    # Xen 4.6
   2728    elif
   2729        cat > $TMPC <<EOF &&
   2730#include <xenctrl.h>
   2731#include <xenstore.h>
   2732#include <stdint.h>
   2733#include <xen/hvm/hvm_info_table.h>
   2734#if !defined(HVM_MAX_VCPUS)
   2735# error HVM_MAX_VCPUS not defined
   2736#endif
   2737int main(void) {
   2738  xc_interface *xc;
   2739  xs_daemon_open();
   2740  xc = xc_interface_open(0, 0, 0);
   2741  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
   2742  xc_gnttab_open(NULL, 0);
   2743  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
   2744  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
   2745  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
   2746  xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
   2747  return 0;
   2748}
   2749EOF
   2750        compile_prog "" "$xen_libs"
   2751      then
   2752      xen_ctrl_version=40600
   2753      xen=enabled
   2754
   2755    # Xen 4.5
   2756    elif
   2757        cat > $TMPC <<EOF &&
   2758#include <xenctrl.h>
   2759#include <xenstore.h>
   2760#include <stdint.h>
   2761#include <xen/hvm/hvm_info_table.h>
   2762#if !defined(HVM_MAX_VCPUS)
   2763# error HVM_MAX_VCPUS not defined
   2764#endif
   2765int main(void) {
   2766  xc_interface *xc;
   2767  xs_daemon_open();
   2768  xc = xc_interface_open(0, 0, 0);
   2769  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
   2770  xc_gnttab_open(NULL, 0);
   2771  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
   2772  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
   2773  xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
   2774  return 0;
   2775}
   2776EOF
   2777        compile_prog "" "$xen_libs"
   2778      then
   2779      xen_ctrl_version=40500
   2780      xen=enabled
   2781
   2782    elif
   2783        cat > $TMPC <<EOF &&
   2784#include <xenctrl.h>
   2785#include <xenstore.h>
   2786#include <stdint.h>
   2787#include <xen/hvm/hvm_info_table.h>
   2788#if !defined(HVM_MAX_VCPUS)
   2789# error HVM_MAX_VCPUS not defined
   2790#endif
   2791int main(void) {
   2792  xc_interface *xc;
   2793  xs_daemon_open();
   2794  xc = xc_interface_open(0, 0, 0);
   2795  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
   2796  xc_gnttab_open(NULL, 0);
   2797  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
   2798  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
   2799  return 0;
   2800}
   2801EOF
   2802        compile_prog "" "$xen_libs"
   2803      then
   2804      xen_ctrl_version=40200
   2805      xen=enabled
   2806
   2807    else
   2808      if test "$xen" = "enabled" ; then
   2809        feature_not_found "xen (unsupported version)" \
   2810                          "Install a supported xen (xen 4.2 or newer)"
   2811      fi
   2812      xen=disabled
   2813    fi
   2814
   2815    if test "$xen" = enabled; then
   2816      if test $xen_ctrl_version -ge 40701  ; then
   2817        xen_libs="$xen_libs $xen_stable_libs "
   2818      fi
   2819    fi
   2820  fi
   2821fi
   2822
   2823##########################################
   2824# RDMA needs OpenFabrics libraries
   2825if test "$rdma" != "no" ; then
   2826  cat > $TMPC <<EOF
   2827#include <rdma/rdma_cma.h>
   2828int main(void) { return 0; }
   2829EOF
   2830  rdma_libs="-lrdmacm -libverbs -libumad"
   2831  if compile_prog "" "$rdma_libs" ; then
   2832    rdma="yes"
   2833  else
   2834    if test "$rdma" = "yes" ; then
   2835        error_exit \
   2836            " OpenFabrics librdmacm/libibverbs/libibumad not present." \
   2837            " Your options:" \
   2838            "  (1) Fast: Install infiniband packages (devel) from your distro." \
   2839            "  (2) Cleanest: Install libraries from www.openfabrics.org" \
   2840            "  (3) Also: Install softiwarp if you don't have RDMA hardware"
   2841    fi
   2842    rdma="no"
   2843  fi
   2844fi
   2845
   2846##########################################
   2847# PVRDMA detection
   2848
   2849cat > $TMPC <<EOF &&
   2850#include <sys/mman.h>
   2851
   2852int
   2853main(void)
   2854{
   2855    char buf = 0;
   2856    void *addr = &buf;
   2857    addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
   2858
   2859    return 0;
   2860}
   2861EOF
   2862
   2863if test "$rdma" = "yes" ; then
   2864    case "$pvrdma" in
   2865    "")
   2866        if compile_prog "" ""; then
   2867            pvrdma="yes"
   2868        else
   2869            pvrdma="no"
   2870        fi
   2871        ;;
   2872    "yes")
   2873        if ! compile_prog "" ""; then
   2874            error_exit "PVRDMA is not supported since mremap is not implemented"
   2875        fi
   2876        pvrdma="yes"
   2877        ;;
   2878    "no")
   2879        pvrdma="no"
   2880        ;;
   2881    esac
   2882else
   2883    if test "$pvrdma" = "yes" ; then
   2884        error_exit "PVRDMA requires rdma suppport"
   2885    fi
   2886    pvrdma="no"
   2887fi
   2888
   2889# Let's see if enhanced reg_mr is supported
   2890if test "$pvrdma" = "yes" ; then
   2891
   2892cat > $TMPC <<EOF &&
   2893#include <infiniband/verbs.h>
   2894
   2895int
   2896main(void)
   2897{
   2898    struct ibv_mr *mr;
   2899    struct ibv_pd *pd = NULL;
   2900    size_t length = 10;
   2901    uint64_t iova = 0;
   2902    int access = 0;
   2903    void *addr = NULL;
   2904
   2905    mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
   2906
   2907    ibv_dereg_mr(mr);
   2908
   2909    return 0;
   2910}
   2911EOF
   2912    if ! compile_prog "" "-libverbs"; then
   2913        QEMU_CFLAGS="$QEMU_CFLAGS -DLEGACY_RDMA_REG_MR"
   2914    fi
   2915fi
   2916
   2917##########################################
   2918# xfsctl() probe, used for file-posix.c
   2919if test "$xfs" != "no" ; then
   2920  cat > $TMPC << EOF
   2921#include <stddef.h>  /* NULL */
   2922#include <xfs/xfs.h>
   2923int main(void)
   2924{
   2925    xfsctl(NULL, 0, 0, NULL);
   2926    return 0;
   2927}
   2928EOF
   2929  if compile_prog "" "" ; then
   2930    xfs="yes"
   2931  else
   2932    if test "$xfs" = "yes" ; then
   2933      feature_not_found "xfs" "Install xfsprogs/xfslibs devel"
   2934    fi
   2935    xfs=no
   2936  fi
   2937fi
   2938
   2939##########################################
   2940# vde libraries probe
   2941if test "$vde" != "no" ; then
   2942  vde_libs="-lvdeplug"
   2943  cat > $TMPC << EOF
   2944#include <libvdeplug.h>
   2945int main(void)
   2946{
   2947    struct vde_open_args a = {0, 0, 0};
   2948    char s[] = "";
   2949    vde_open(s, s, &a);
   2950    return 0;
   2951}
   2952EOF
   2953  if compile_prog "" "$vde_libs" ; then
   2954    vde=yes
   2955  else
   2956    if test "$vde" = "yes" ; then
   2957      feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
   2958    fi
   2959    vde=no
   2960  fi
   2961fi
   2962
   2963##########################################
   2964# netmap support probe
   2965# Apart from looking for netmap headers, we make sure that the host API version
   2966# supports the netmap backend (>=11). The upper bound (15) is meant to simulate
   2967# a minor/major version number. Minor new features will be marked with values up
   2968# to 15, and if something happens that requires a change to the backend we will
   2969# move above 15, submit the backend fixes and modify this two bounds.
   2970if test "$netmap" != "no" ; then
   2971  cat > $TMPC << EOF
   2972#include <inttypes.h>
   2973#include <net/if.h>
   2974#include <net/netmap.h>
   2975#include <net/netmap_user.h>
   2976#if (NETMAP_API < 11) || (NETMAP_API > 15)
   2977#error
   2978#endif
   2979int main(void) { return 0; }
   2980EOF
   2981  if compile_prog "" "" ; then
   2982    netmap=yes
   2983  else
   2984    if test "$netmap" = "yes" ; then
   2985      feature_not_found "netmap"
   2986    fi
   2987    netmap=no
   2988  fi
   2989fi
   2990
   2991##########################################
   2992# detect CoreAudio
   2993if test "$coreaudio" != "no" ; then
   2994  coreaudio_libs="-framework CoreAudio"
   2995  cat > $TMPC << EOF
   2996#include <CoreAudio/CoreAudio.h>
   2997int main(void)
   2998{
   2999  return (int)AudioGetCurrentHostTime();
   3000}
   3001EOF
   3002  if compile_prog "" "$coreaudio_libs" ; then
   3003    coreaudio=yes
   3004  else
   3005    coreaudio=no
   3006  fi
   3007fi
   3008
   3009##########################################
   3010# Sound support libraries probe
   3011
   3012audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
   3013for drv in $audio_drv_list; do
   3014    case $drv in
   3015    alsa | try-alsa)
   3016    if $pkg_config alsa --exists; then
   3017        alsa_libs=$($pkg_config alsa --libs)
   3018        alsa_cflags=$($pkg_config alsa --cflags)
   3019        alsa=yes
   3020        if test "$drv" = "try-alsa"; then
   3021            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa/alsa/')
   3022        fi
   3023    else
   3024        if test "$drv" = "try-alsa"; then
   3025            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-alsa//')
   3026        else
   3027            error_exit "$drv check failed" \
   3028                "Make sure to have the $drv libs and headers installed."
   3029        fi
   3030    fi
   3031    ;;
   3032
   3033    pa | try-pa)
   3034    if $pkg_config libpulse --exists; then
   3035        libpulse=yes
   3036        pulse_libs=$($pkg_config libpulse --libs)
   3037        pulse_cflags=$($pkg_config libpulse --cflags)
   3038        if test "$drv" = "try-pa"; then
   3039            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa/pa/')
   3040        fi
   3041    else
   3042        if test "$drv" = "try-pa"; then
   3043            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa//')
   3044        else
   3045            error_exit "$drv check failed" \
   3046                "Make sure to have the $drv libs and headers installed."
   3047        fi
   3048    fi
   3049    ;;
   3050
   3051    sdl)
   3052    if test "$sdl" = "no"; then
   3053        error_exit "sdl not found or disabled, can not use sdl audio driver"
   3054    fi
   3055    ;;
   3056
   3057    try-sdl)
   3058    if test "$sdl" = "no"; then
   3059        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl//')
   3060    else
   3061        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl/sdl/')
   3062    fi
   3063    ;;
   3064
   3065    coreaudio | try-coreaudio)
   3066    if test "$coreaudio" = "no"; then
   3067      if test "$drv" = "try-coreaudio"; then
   3068        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-coreaudio//')
   3069      else
   3070        error_exit "$drv check failed" \
   3071                "Make sure to have the $drv is available."
   3072      fi
   3073    else
   3074      coreaudio_libs="-framework CoreAudio"
   3075      if test "$drv" = "try-coreaudio"; then
   3076        audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-coreaudio/coreaudio/')
   3077      fi
   3078    fi
   3079    ;;
   3080
   3081    dsound)
   3082      dsound_libs="-lole32 -ldxguid"
   3083      audio_win_int="yes"
   3084    ;;
   3085
   3086    oss)
   3087      oss_libs="$oss_lib"
   3088    ;;
   3089
   3090    jack | try-jack)
   3091    if $pkg_config jack --exists; then
   3092        libjack=yes
   3093        jack_libs=$($pkg_config jack --libs)
   3094        if test "$drv" = "try-jack"; then
   3095            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack/jack/')
   3096        fi
   3097    else
   3098        if test "$drv" = "try-jack"; then
   3099            audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-jack//')
   3100        else
   3101            error_exit "$drv check failed" \
   3102                "Make sure to have the $drv libs and headers installed."
   3103        fi
   3104    fi
   3105    ;;
   3106
   3107    *)
   3108    echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
   3109        error_exit "Unknown driver '$drv' selected" \
   3110            "Possible drivers are: $audio_possible_drivers"
   3111    }
   3112    ;;
   3113    esac
   3114done
   3115
   3116##########################################
   3117# plugin linker support probe
   3118
   3119if test "$plugins" != "no"; then
   3120
   3121    #########################################
   3122    # See if --dynamic-list is supported by the linker
   3123
   3124    ld_dynamic_list="no"
   3125    cat > $TMPTXT <<EOF
   3126{
   3127  foo;
   3128};
   3129EOF
   3130
   3131        cat > $TMPC <<EOF
   3132#include <stdio.h>
   3133void foo(void);
   3134
   3135void foo(void)
   3136{
   3137  printf("foo\n");
   3138}
   3139
   3140int main(void)
   3141{
   3142  foo();
   3143  return 0;
   3144}
   3145EOF
   3146
   3147    if compile_prog "" "-Wl,--dynamic-list=$TMPTXT" ; then
   3148        ld_dynamic_list="yes"
   3149    fi
   3150
   3151    #########################################
   3152    # See if -exported_symbols_list is supported by the linker
   3153
   3154    ld_exported_symbols_list="no"
   3155    cat > $TMPTXT <<EOF
   3156  _foo
   3157EOF
   3158
   3159    if compile_prog "" "-Wl,-exported_symbols_list,$TMPTXT" ; then
   3160        ld_exported_symbols_list="yes"
   3161    fi
   3162
   3163    if test "$ld_dynamic_list" = "no" &&
   3164       test "$ld_exported_symbols_list" = "no" ; then
   3165        if test "$plugins" = "yes"; then
   3166            error_exit \
   3167                "Plugin support requires dynamic linking and specifying a set of symbols " \
   3168                "that are exported to plugins. Unfortunately your linker doesn't " \
   3169                "support the flag (--dynamic-list or -exported_symbols_list) used " \
   3170                "for this purpose."
   3171        else
   3172            plugins="no"
   3173        fi
   3174    else
   3175        plugins="yes"
   3176    fi
   3177fi
   3178
   3179##########################################
   3180# glib support probe
   3181
   3182glib_req_ver=2.56
   3183glib_modules=gthread-2.0
   3184if test "$modules" = yes; then
   3185    glib_modules="$glib_modules gmodule-export-2.0"
   3186elif test "$plugins" = "yes"; then
   3187    glib_modules="$glib_modules gmodule-no-export-2.0"
   3188fi
   3189
   3190for i in $glib_modules; do
   3191    if $pkg_config --atleast-version=$glib_req_ver $i; then
   3192        glib_cflags=$($pkg_config --cflags $i)
   3193        glib_libs=$($pkg_config --libs $i)
   3194    else
   3195        error_exit "glib-$glib_req_ver $i is required to compile QEMU"
   3196    fi
   3197done
   3198
   3199# This workaround is required due to a bug in pkg-config file for glib as it
   3200# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
   3201
   3202if test "$static" = yes && test "$mingw32" = yes; then
   3203    glib_cflags="-DGLIB_STATIC_COMPILATION $glib_cflags"
   3204fi
   3205
   3206if ! test "$gio" = "no"; then
   3207    pass=no
   3208    if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
   3209        gio_cflags=$($pkg_config --cflags gio-2.0)
   3210        gio_libs=$($pkg_config --libs gio-2.0)
   3211        gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
   3212        if ! has "$gdbus_codegen"; then
   3213            gdbus_codegen=
   3214        fi
   3215        # Check that the libraries actually work -- Ubuntu 18.04 ships
   3216        # with pkg-config --static --libs data for gio-2.0 that is missing
   3217        # -lblkid and will give a link error.
   3218        cat > $TMPC <<EOF
   3219#include <gio/gio.h>
   3220int main(void)
   3221{
   3222    g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
   3223    return 0;
   3224}
   3225EOF
   3226        if compile_prog "$gio_cflags" "$gio_libs" ; then
   3227            pass=yes
   3228        else
   3229            pass=no
   3230        fi
   3231
   3232        if test "$pass" = "yes" &&
   3233            $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
   3234            gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
   3235            gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
   3236        fi
   3237    fi
   3238
   3239    if test "$pass" = "no"; then
   3240        if test "$gio" = "yes"; then
   3241            feature_not_found "gio" "Install libgio >= 2.0"
   3242        else
   3243            gio=no
   3244        fi
   3245    else
   3246        gio=yes
   3247    fi
   3248fi
   3249
   3250# Sanity check that the current size_t matches the
   3251# size that glib thinks it should be. This catches
   3252# problems on multi-arch where people try to build
   3253# 32-bit QEMU while pointing at 64-bit glib headers
   3254cat > $TMPC <<EOF
   3255#include <glib.h>
   3256#include <unistd.h>
   3257
   3258#define QEMU_BUILD_BUG_ON(x) \
   3259  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
   3260
   3261int main(void) {
   3262   QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
   3263   return 0;
   3264}
   3265EOF
   3266
   3267if ! compile_prog "$glib_cflags" "$glib_libs" ; then
   3268    error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
   3269               "You probably need to set PKG_CONFIG_LIBDIR"\
   3270	       "to point to the right pkg-config files for your"\
   3271	       "build target"
   3272fi
   3273
   3274# Silence clang warnings triggered by glib < 2.57.2
   3275cat > $TMPC << EOF
   3276#include <glib.h>
   3277typedef struct Foo {
   3278    int i;
   3279} Foo;
   3280static void foo_free(Foo *f)
   3281{
   3282    g_free(f);
   3283}
   3284G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free);
   3285int main(void) { return 0; }
   3286EOF
   3287if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
   3288    if cc_has_warning_flag "-Wno-unused-function"; then
   3289        glib_cflags="$glib_cflags -Wno-unused-function"
   3290        CONFIGURE_CFLAGS="$CONFIGURE_CFLAGS -Wno-unused-function"
   3291    fi
   3292fi
   3293
   3294##########################################
   3295# SHA command probe for modules
   3296if test "$modules" = yes; then
   3297    shacmd_probe="sha1sum sha1 shasum"
   3298    for c in $shacmd_probe; do
   3299        if has $c; then
   3300            shacmd="$c"
   3301            break
   3302        fi
   3303    done
   3304    if test "$shacmd" = ""; then
   3305        error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
   3306    fi
   3307fi
   3308
   3309##########################################
   3310# pthread probe
   3311PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
   3312
   3313pthread=no
   3314cat > $TMPC << EOF
   3315#include <pthread.h>
   3316static void *f(void *p) { return NULL; }
   3317int main(void) {
   3318  pthread_t thread;
   3319  pthread_create(&thread, 0, f, 0);
   3320  return 0;
   3321}
   3322EOF
   3323if compile_prog "" "" ; then
   3324  pthread=yes
   3325else
   3326  for pthread_lib in $PTHREADLIBS_LIST; do
   3327    if compile_prog "" "$pthread_lib" ; then
   3328      pthread=yes
   3329      break
   3330    fi
   3331  done
   3332fi
   3333
   3334if test "$mingw32" != yes && test "$pthread" = no; then
   3335  error_exit "pthread check failed" \
   3336      "Make sure to have the pthread libs and headers installed."
   3337fi
   3338
   3339# check for pthread_setname_np with thread id
   3340pthread_setname_np_w_tid=no
   3341cat > $TMPC << EOF
   3342#include <pthread.h>
   3343
   3344static void *f(void *p) { return NULL; }
   3345int main(void)
   3346{
   3347    pthread_t thread;
   3348    pthread_create(&thread, 0, f, 0);
   3349    pthread_setname_np(thread, "QEMU");
   3350    return 0;
   3351}
   3352EOF
   3353if compile_prog "" "$pthread_lib" ; then
   3354  pthread_setname_np_w_tid=yes
   3355fi
   3356
   3357# check for pthread_setname_np without thread id
   3358pthread_setname_np_wo_tid=no
   3359cat > $TMPC << EOF
   3360#include <pthread.h>
   3361
   3362static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
   3363int main(void)
   3364{
   3365    pthread_t thread;
   3366    pthread_create(&thread, 0, f, 0);
   3367    return 0;
   3368}
   3369EOF
   3370if compile_prog "" "$pthread_lib" ; then
   3371  pthread_setname_np_wo_tid=yes
   3372fi
   3373
   3374##########################################
   3375# libssh probe
   3376if test "$libssh" != "no" ; then
   3377  if $pkg_config --exists "libssh >= 0.8.7"; then
   3378    libssh_cflags=$($pkg_config libssh --cflags)
   3379    libssh_libs=$($pkg_config libssh --libs)
   3380    libssh=yes
   3381  else
   3382    if test "$libssh" = "yes" ; then
   3383      error_exit "libssh required for --enable-libssh"
   3384    fi
   3385    libssh=no
   3386  fi
   3387fi
   3388
   3389##########################################
   3390# linux-aio probe
   3391
   3392if test "$linux_aio" != "no" ; then
   3393  cat > $TMPC <<EOF
   3394#include <libaio.h>
   3395#include <sys/eventfd.h>
   3396#include <stddef.h>
   3397int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
   3398EOF
   3399  if compile_prog "" "-laio" ; then
   3400    linux_aio=yes
   3401  else
   3402    if test "$linux_aio" = "yes" ; then
   3403      feature_not_found "linux AIO" "Install libaio devel"
   3404    fi
   3405    linux_aio=no
   3406  fi
   3407fi
   3408
   3409##########################################
   3410# TPM emulation is only on POSIX
   3411
   3412if test "$tpm" = ""; then
   3413  if test "$mingw32" = "yes"; then
   3414    tpm=no
   3415  else
   3416    tpm=yes
   3417  fi
   3418elif test "$tpm" = "yes"; then
   3419  if test "$mingw32" = "yes" ; then
   3420    error_exit "TPM emulation only available on POSIX systems"
   3421  fi
   3422fi
   3423
   3424##########################################
   3425# iovec probe
   3426cat > $TMPC <<EOF
   3427#include <sys/types.h>
   3428#include <sys/uio.h>
   3429#include <unistd.h>
   3430int main(void) { return sizeof(struct iovec); }
   3431EOF
   3432iovec=no
   3433if compile_prog "" "" ; then
   3434  iovec=yes
   3435fi
   3436
   3437##########################################
   3438# fdt probe
   3439
   3440case "$fdt" in
   3441  auto | enabled | internal)
   3442    # Simpler to always update submodule, even if not needed.
   3443    git_submodules="${git_submodules} dtc"
   3444    ;;
   3445esac
   3446
   3447##########################################
   3448# opengl probe (for sdl2, gtk)
   3449
   3450if test "$opengl" != "no" ; then
   3451  epoxy=no
   3452  if $pkg_config epoxy; then
   3453    cat > $TMPC << EOF
   3454#include <epoxy/egl.h>
   3455int main(void) { return 0; }
   3456EOF
   3457    if compile_prog "" "" ; then
   3458      epoxy=yes
   3459    fi
   3460  fi
   3461
   3462  if test "$epoxy" = "yes" ; then
   3463    opengl_cflags="$($pkg_config --cflags epoxy)"
   3464    opengl_libs="$($pkg_config --libs epoxy)"
   3465    opengl=yes
   3466  else
   3467    if test "$opengl" = "yes" ; then
   3468      feature_not_found "opengl" "Please install epoxy with EGL"
   3469    fi
   3470    opengl_cflags=""
   3471    opengl_libs=""
   3472    opengl=no
   3473  fi
   3474fi
   3475
   3476##########################################
   3477# libnuma probe
   3478
   3479if test "$numa" != "no" ; then
   3480  cat > $TMPC << EOF
   3481#include <numa.h>
   3482int main(void) { return numa_available(); }
   3483EOF
   3484
   3485  if compile_prog "" "-lnuma" ; then
   3486    numa=yes
   3487    numa_libs="-lnuma"
   3488  else
   3489    if test "$numa" = "yes" ; then
   3490      feature_not_found "numa" "install numactl devel"
   3491    fi
   3492    numa=no
   3493  fi
   3494fi
   3495
   3496malloc=system
   3497if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
   3498    echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
   3499    exit 1
   3500elif test "$tcmalloc" = "yes" ; then
   3501    malloc=tcmalloc
   3502elif test "$jemalloc" = "yes" ; then
   3503    malloc=jemalloc
   3504fi
   3505
   3506# check for usbfs
   3507have_usbfs=no
   3508if test "$linux_user" = "yes"; then
   3509  cat > $TMPC << EOF
   3510#include <linux/usbdevice_fs.h>
   3511
   3512#ifndef USBDEVFS_GET_CAPABILITIES
   3513#error "USBDEVFS_GET_CAPABILITIES undefined"
   3514#endif
   3515
   3516#ifndef USBDEVFS_DISCONNECT_CLAIM
   3517#error "USBDEVFS_DISCONNECT_CLAIM undefined"
   3518#endif
   3519
   3520int main(void)
   3521{
   3522    return 0;
   3523}
   3524EOF
   3525  if compile_prog "" ""; then
   3526    have_usbfs=yes
   3527  fi
   3528fi
   3529
   3530##########################################
   3531# spice probe
   3532if test "$spice_protocol" != "no" ; then
   3533  spice_protocol_cflags=$($pkg_config --cflags spice-protocol 2>/dev/null)
   3534  if $pkg_config --atleast-version=0.12.3 spice-protocol; then
   3535    spice_protocol="yes"
   3536  else
   3537    if test "$spice_protocol" = "yes" ; then
   3538      feature_not_found "spice_protocol" \
   3539          "Install spice-protocol(>=0.12.3) devel"
   3540    fi
   3541    spice_protocol="no"
   3542  fi
   3543fi
   3544
   3545if test "$spice" != "no" ; then
   3546  cat > $TMPC << EOF
   3547#include <spice.h>
   3548int main(void) { spice_server_new(); return 0; }
   3549EOF
   3550  spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
   3551  spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
   3552  if $pkg_config --atleast-version=0.12.5 spice-server && \
   3553     test "$spice_protocol" = "yes" && \
   3554     compile_prog "$spice_cflags" "$spice_libs" ; then
   3555    spice="yes"
   3556  else
   3557    if test "$spice" = "yes" ; then
   3558      feature_not_found "spice" \
   3559          "Install spice-server(>=0.12.5) devel"
   3560    fi
   3561    spice="no"
   3562  fi
   3563fi
   3564
   3565##########################################
   3566# check if we have VSS SDK headers for win
   3567
   3568if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
   3569        test "$vss_win32_sdk" != "no" ; then
   3570  case "$vss_win32_sdk" in
   3571    "")   vss_win32_include="-isystem $source_path" ;;
   3572    *\ *) # The SDK is installed in "Program Files" by default, but we cannot
   3573          # handle path with spaces. So we symlink the headers into ".sdk/vss".
   3574          vss_win32_include="-isystem $source_path/.sdk/vss"
   3575	  symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
   3576	  ;;
   3577    *)    vss_win32_include="-isystem $vss_win32_sdk"
   3578  esac
   3579  cat > $TMPC << EOF
   3580#define __MIDL_user_allocate_free_DEFINED__
   3581#include <inc/win2003/vss.h>
   3582int main(void) { return VSS_CTX_BACKUP; }
   3583EOF
   3584  if compile_prog "$vss_win32_include" "" ; then
   3585    guest_agent_with_vss="yes"
   3586    QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
   3587    libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
   3588    qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
   3589  else
   3590    if test "$vss_win32_sdk" != "" ; then
   3591      echo "ERROR: Please download and install Microsoft VSS SDK:"
   3592      echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
   3593      echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
   3594      echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
   3595      echo "ERROR: The headers are extracted in the directory \`inc'."
   3596      feature_not_found "VSS support"
   3597    fi
   3598    guest_agent_with_vss="no"
   3599  fi
   3600fi
   3601
   3602##########################################
   3603# lookup Windows platform SDK (if not specified)
   3604# The SDK is needed only to build .tlb (type library) file of guest agent
   3605# VSS provider from the source. It is usually unnecessary because the
   3606# pre-compiled .tlb file is included.
   3607
   3608if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
   3609        test "$guest_agent_with_vss" = "yes" ; then
   3610  if test -z "$win_sdk"; then
   3611    programfiles="$PROGRAMFILES"
   3612    test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
   3613    if test -n "$programfiles"; then
   3614      win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
   3615    else
   3616      feature_not_found "Windows SDK"
   3617    fi
   3618  elif test "$win_sdk" = "no"; then
   3619    win_sdk=""
   3620  fi
   3621fi
   3622
   3623##########################################
   3624# check if mingw environment provides a recent ntddscsi.h
   3625if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
   3626  cat > $TMPC << EOF
   3627#include <windows.h>
   3628#include <ntddscsi.h>
   3629int main(void) {
   3630#if !defined(IOCTL_SCSI_GET_ADDRESS)
   3631#error Missing required ioctl definitions
   3632#endif
   3633  SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
   3634  return addr.Lun;
   3635}
   3636EOF
   3637  if compile_prog "" "" ; then
   3638    guest_agent_ntddscsi=yes
   3639    libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
   3640  fi
   3641fi
   3642
   3643##########################################
   3644# capstone
   3645
   3646case "$capstone" in
   3647  auto | enabled | internal)
   3648    # Simpler to always update submodule, even if not needed.
   3649    git_submodules="${git_submodules} capstone"
   3650    ;;
   3651esac
   3652
   3653##########################################
   3654# check if we have posix_syslog
   3655
   3656posix_syslog=no
   3657cat > $TMPC << EOF
   3658#include <syslog.h>
   3659int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; }
   3660EOF
   3661if compile_prog "" "" ; then
   3662    posix_syslog=yes
   3663fi
   3664
   3665##########################################
   3666# check if trace backend exists
   3667
   3668$python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
   3669if test "$?" -ne 0 ; then
   3670  error_exit "invalid trace backends" \
   3671      "Please choose supported trace backends."
   3672fi
   3673
   3674##########################################
   3675# For 'ust' backend, test if ust headers are present
   3676if have_backend "ust"; then
   3677  if $pkg_config lttng-ust --exists; then
   3678    lttng_ust_libs=$($pkg_config --libs lttng-ust)
   3679  else
   3680    error_exit "Trace backend 'ust' missing lttng-ust header files"
   3681  fi
   3682fi
   3683
   3684##########################################
   3685# For 'dtrace' backend, test if 'dtrace' command is present
   3686if have_backend "dtrace"; then
   3687  if ! has 'dtrace' ; then
   3688    error_exit "dtrace command is not found in PATH $PATH"
   3689  fi
   3690  trace_backend_stap="no"
   3691  if has 'stap' ; then
   3692    trace_backend_stap="yes"
   3693
   3694    # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
   3695    # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
   3696    # instead. QEMU --enable-modules depends on this because the SystemTap
   3697    # semaphores are linked into the main binary and not the module's shared
   3698    # object.
   3699    QEMU_CFLAGS="$QEMU_CFLAGS -DSTAP_SDT_V2"
   3700  fi
   3701fi
   3702
   3703##########################################
   3704# check and set a backend for coroutine
   3705
   3706# We prefer ucontext, but it's not always possible. The fallback
   3707# is sigcontext. On Windows the only valid backend is the Windows
   3708# specific one.
   3709
   3710ucontext_works=no
   3711if test "$darwin" != "yes"; then
   3712  cat > $TMPC << EOF
   3713#include <ucontext.h>
   3714#ifdef __stub_makecontext
   3715#error Ignoring glibc stub makecontext which will always fail
   3716#endif
   3717int main(void) { makecontext(0, 0, 0); return 0; }
   3718EOF
   3719  if compile_prog "" "" ; then
   3720    ucontext_works=yes
   3721  fi
   3722fi
   3723
   3724if test "$coroutine" = ""; then
   3725  if test "$mingw32" = "yes"; then
   3726    coroutine=win32
   3727  elif test "$ucontext_works" = "yes"; then
   3728    coroutine=ucontext
   3729  else
   3730    coroutine=sigaltstack
   3731  fi
   3732else
   3733  case $coroutine in
   3734  windows)
   3735    if test "$mingw32" != "yes"; then
   3736      error_exit "'windows' coroutine backend only valid for Windows"
   3737    fi
   3738    # Unfortunately the user visible backend name doesn't match the
   3739    # coroutine-*.c filename for this case, so we have to adjust it here.
   3740    coroutine=win32
   3741    ;;
   3742  ucontext)
   3743    if test "$ucontext_works" != "yes"; then
   3744      feature_not_found "ucontext"
   3745    fi
   3746    ;;
   3747  sigaltstack)
   3748    if test "$mingw32" = "yes"; then
   3749      error_exit "only the 'windows' coroutine backend is valid for Windows"
   3750    fi
   3751    ;;
   3752  *)
   3753    error_exit "unknown coroutine backend $coroutine"
   3754    ;;
   3755  esac
   3756fi
   3757
   3758if test "$coroutine_pool" = ""; then
   3759  coroutine_pool=yes
   3760fi
   3761
   3762if test "$debug_stack_usage" = "yes"; then
   3763  if test "$coroutine_pool" = "yes"; then
   3764    echo "WARN: disabling coroutine pool for stack usage debugging"
   3765    coroutine_pool=no
   3766  fi
   3767fi
   3768
   3769##################################################
   3770# SafeStack
   3771
   3772
   3773if test "$safe_stack" = "yes"; then
   3774cat > $TMPC << EOF
   3775int main(int argc, char *argv[])
   3776{
   3777#if ! __has_feature(safe_stack)
   3778#error SafeStack Disabled
   3779#endif
   3780    return 0;
   3781}
   3782EOF
   3783  flag="-fsanitize=safe-stack"
   3784  # Check that safe-stack is supported and enabled.
   3785  if compile_prog "-Werror $flag" "$flag"; then
   3786    # Flag needed both at compilation and at linking
   3787    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
   3788    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
   3789  else
   3790    error_exit "SafeStack not supported by your compiler"
   3791  fi
   3792  if test "$coroutine" != "ucontext"; then
   3793    error_exit "SafeStack is only supported by the coroutine backend ucontext"
   3794  fi
   3795else
   3796cat > $TMPC << EOF
   3797int main(int argc, char *argv[])
   3798{
   3799#if defined(__has_feature)
   3800#if __has_feature(safe_stack)
   3801#error SafeStack Enabled
   3802#endif
   3803#endif
   3804    return 0;
   3805}
   3806EOF
   3807if test "$safe_stack" = "no"; then
   3808  # Make sure that safe-stack is disabled
   3809  if ! compile_prog "-Werror" ""; then
   3810    # SafeStack was already enabled, try to explicitly remove the feature
   3811    flag="-fno-sanitize=safe-stack"
   3812    if ! compile_prog "-Werror $flag" "$flag"; then
   3813      error_exit "Configure cannot disable SafeStack"
   3814    fi
   3815    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
   3816    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
   3817  fi
   3818else # "$safe_stack" = ""
   3819  # Set safe_stack to yes or no based on pre-existing flags
   3820  if compile_prog "-Werror" ""; then
   3821    safe_stack="no"
   3822  else
   3823    safe_stack="yes"
   3824    if test "$coroutine" != "ucontext"; then
   3825      error_exit "SafeStack is only supported by the coroutine backend ucontext"
   3826    fi
   3827  fi
   3828fi
   3829fi
   3830
   3831########################################
   3832# check if cpuid.h is usable.
   3833
   3834cat > $TMPC << EOF
   3835#include <cpuid.h>
   3836int main(void) {
   3837    unsigned a, b, c, d;
   3838    int max = __get_cpuid_max(0, 0);
   3839
   3840    if (max >= 1) {
   3841        __cpuid(1, a, b, c, d);
   3842    }
   3843
   3844    if (max >= 7) {
   3845        __cpuid_count(7, 0, a, b, c, d);
   3846    }
   3847
   3848    return 0;
   3849}
   3850EOF
   3851if compile_prog "" "" ; then
   3852    cpuid_h=yes
   3853fi
   3854
   3855##########################################
   3856# avx2 optimization requirement check
   3857#
   3858# There is no point enabling this if cpuid.h is not usable,
   3859# since we won't be able to select the new routines.
   3860
   3861if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
   3862  cat > $TMPC << EOF
   3863#pragma GCC push_options
   3864#pragma GCC target("avx2")
   3865#include <cpuid.h>
   3866#include <immintrin.h>
   3867static int bar(void *a) {
   3868    __m256i x = *(__m256i *)a;
   3869    return _mm256_testz_si256(x, x);
   3870}
   3871int main(int argc, char *argv[]) { return bar(argv[0]); }
   3872EOF
   3873  if compile_object "-Werror" ; then
   3874    avx2_opt="yes"
   3875  else
   3876    avx2_opt="no"
   3877  fi
   3878fi
   3879
   3880##########################################
   3881# avx512f optimization requirement check
   3882#
   3883# There is no point enabling this if cpuid.h is not usable,
   3884# since we won't be able to select the new routines.
   3885# by default, it is turned off.
   3886# if user explicitly want to enable it, check environment
   3887
   3888if test "$cpuid_h" = "yes" && test "$avx512f_opt" = "yes"; then
   3889  cat > $TMPC << EOF
   3890#pragma GCC push_options
   3891#pragma GCC target("avx512f")
   3892#include <cpuid.h>
   3893#include <immintrin.h>
   3894static int bar(void *a) {
   3895    __m512i x = *(__m512i *)a;
   3896    return _mm512_test_epi64_mask(x, x);
   3897}
   3898int main(int argc, char *argv[])
   3899{
   3900	return bar(argv[0]);
   3901}
   3902EOF
   3903  if ! compile_object "-Werror" ; then
   3904    avx512f_opt="no"
   3905  fi
   3906else
   3907  avx512f_opt="no"
   3908fi
   3909
   3910########################################
   3911# check if __[u]int128_t is usable.
   3912
   3913int128=no
   3914cat > $TMPC << EOF
   3915__int128_t a;
   3916__uint128_t b;
   3917int main (void) {
   3918  a = a + b;
   3919  b = a * b;
   3920  a = a * a;
   3921  return 0;
   3922}
   3923EOF
   3924if compile_prog "" "" ; then
   3925    int128=yes
   3926fi
   3927
   3928#########################################
   3929# See if 128-bit atomic operations are supported.
   3930
   3931atomic128=no
   3932if test "$int128" = "yes"; then
   3933  cat > $TMPC << EOF
   3934int main(void)
   3935{
   3936  unsigned __int128 x = 0, y = 0;
   3937  y = __atomic_load(&x, 0);
   3938  __atomic_store(&x, y, 0);
   3939  __atomic_compare_exchange(&x, &y, x, 0, 0, 0);
   3940  return 0;
   3941}
   3942EOF
   3943  if compile_prog "" "" ; then
   3944    atomic128=yes
   3945  fi
   3946fi
   3947
   3948cmpxchg128=no
   3949if test "$int128" = yes && test "$atomic128" = no; then
   3950  cat > $TMPC << EOF
   3951int main(void)
   3952{
   3953  unsigned __int128 x = 0, y = 0;
   3954  __sync_val_compare_and_swap_16(&x, y, x);
   3955  return 0;
   3956}
   3957EOF
   3958  if compile_prog "" "" ; then
   3959    cmpxchg128=yes
   3960  fi
   3961fi
   3962
   3963#########################################
   3964# See if 64-bit atomic operations are supported.
   3965# Note that without __atomic builtins, we can only
   3966# assume atomic loads/stores max at pointer size.
   3967
   3968cat > $TMPC << EOF
   3969#include <stdint.h>
   3970int main(void)
   3971{
   3972  uint64_t x = 0, y = 0;
   3973  y = __atomic_load_n(&x, __ATOMIC_RELAXED);
   3974  __atomic_store_n(&x, y, __ATOMIC_RELAXED);
   3975  __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
   3976  __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
   3977  __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
   3978  return 0;
   3979}
   3980EOF
   3981if compile_prog "" "" ; then
   3982  atomic64=yes
   3983fi
   3984
   3985########################################
   3986# check if getauxval is available.
   3987
   3988getauxval=no
   3989cat > $TMPC << EOF
   3990#include <sys/auxv.h>
   3991int main(void) {
   3992  return getauxval(AT_HWCAP) == 0;
   3993}
   3994EOF
   3995if compile_prog "" "" ; then
   3996    getauxval=yes
   3997fi
   3998
   3999########################################
   4000# check if ccache is interfering with
   4001# semantic analysis of macros
   4002
   4003unset CCACHE_CPP2
   4004ccache_cpp2=no
   4005cat > $TMPC << EOF
   4006static const int Z = 1;
   4007#define fn() ({ Z; })
   4008#define TAUT(X) ((X) == Z)
   4009#define PAREN(X, Y) (X == Y)
   4010#define ID(X) (X)
   4011int main(int argc, char *argv[])
   4012{
   4013    int x = 0, y = 0;
   4014    x = ID(x);
   4015    x = fn();
   4016    fn();
   4017    if (PAREN(x, y)) return 0;
   4018    if (TAUT(Z)) return 0;
   4019    return 0;
   4020}
   4021EOF
   4022
   4023if ! compile_object "-Werror"; then
   4024    ccache_cpp2=yes
   4025fi
   4026
   4027#################################################
   4028# clang does not support glibc + FORTIFY_SOURCE.
   4029
   4030if test "$fortify_source" != "no"; then
   4031  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
   4032    fortify_source="no";
   4033  elif test -n "$cxx" && has $cxx &&
   4034       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
   4035    fortify_source="no";
   4036  else
   4037    fortify_source="yes"
   4038  fi
   4039fi
   4040
   4041##########################################
   4042# check if struct fsxattr is available via linux/fs.h
   4043
   4044have_fsxattr=no
   4045cat > $TMPC << EOF
   4046#include <linux/fs.h>
   4047struct fsxattr foo;
   4048int main(void) {
   4049  return 0;
   4050}
   4051EOF
   4052if compile_prog "" "" ; then
   4053    have_fsxattr=yes
   4054fi
   4055
   4056##########################################
   4057# check for usable membarrier system call
   4058if test "$membarrier" = "yes"; then
   4059    have_membarrier=no
   4060    if test "$mingw32" = "yes" ; then
   4061        have_membarrier=yes
   4062    elif test "$linux" = "yes" ; then
   4063        cat > $TMPC << EOF
   4064    #include <linux/membarrier.h>
   4065    #include <sys/syscall.h>
   4066    #include <unistd.h>
   4067    #include <stdlib.h>
   4068    int main(void) {
   4069        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
   4070        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
   4071	exit(0);
   4072    }
   4073EOF
   4074        if compile_prog "" "" ; then
   4075            have_membarrier=yes
   4076        fi
   4077    fi
   4078    if test "$have_membarrier" = "no"; then
   4079      feature_not_found "membarrier" "membarrier system call not available"
   4080    fi
   4081else
   4082    # Do not enable it by default even for Mingw32, because it doesn't
   4083    # work on Wine.
   4084    membarrier=no
   4085fi
   4086
   4087##########################################
   4088# check for usable AF_VSOCK environment
   4089have_af_vsock=no
   4090cat > $TMPC << EOF
   4091#include <errno.h>
   4092#include <sys/types.h>
   4093#include <sys/socket.h>
   4094#if !defined(AF_VSOCK)
   4095# error missing AF_VSOCK flag
   4096#endif
   4097#include <linux/vm_sockets.h>
   4098int main(void) {
   4099    int sock, ret;
   4100    struct sockaddr_vm svm;
   4101    socklen_t len = sizeof(svm);
   4102    sock = socket(AF_VSOCK, SOCK_STREAM, 0);
   4103    ret = getpeername(sock, (struct sockaddr *)&svm, &len);
   4104    if ((ret == -1) && (errno == ENOTCONN)) {
   4105        return 0;
   4106    }
   4107    return -1;
   4108}
   4109EOF
   4110if compile_prog "" "" ; then
   4111    have_af_vsock=yes
   4112fi
   4113
   4114##########################################
   4115# check for usable AF_ALG environment
   4116have_afalg=no
   4117cat > $TMPC << EOF
   4118#include <errno.h>
   4119#include <sys/types.h>
   4120#include <sys/socket.h>
   4121#include <linux/if_alg.h>
   4122int main(void) {
   4123    int sock;
   4124    sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
   4125    return sock;
   4126}
   4127EOF
   4128if compile_prog "" "" ; then
   4129    have_afalg=yes
   4130fi
   4131if test "$crypto_afalg" = "yes"
   4132then
   4133    if test "$have_afalg" != "yes"
   4134    then
   4135	error_exit "AF_ALG requested but could not be detected"
   4136    fi
   4137fi
   4138
   4139
   4140##########################################
   4141# checks for sanitizers
   4142
   4143have_asan=no
   4144have_ubsan=no
   4145have_asan_iface_h=no
   4146have_asan_iface_fiber=no
   4147
   4148if test "$sanitizers" = "yes" ; then
   4149  write_c_skeleton
   4150  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
   4151      have_asan=yes
   4152  fi
   4153
   4154  # we could use a simple skeleton for flags checks, but this also
   4155  # detect the static linking issue of ubsan, see also:
   4156  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
   4157  cat > $TMPC << EOF
   4158#include <stdlib.h>
   4159int main(void) {
   4160    void *tmp = malloc(10);
   4161    if (tmp != NULL) {
   4162        return *(int *)(tmp + 2);
   4163    }
   4164    return 1;
   4165}
   4166EOF
   4167  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
   4168      have_ubsan=yes
   4169  fi
   4170
   4171  if check_include "sanitizer/asan_interface.h" ; then
   4172      have_asan_iface_h=yes
   4173  fi
   4174
   4175  cat > $TMPC << EOF
   4176#include <sanitizer/asan_interface.h>
   4177int main(void) {
   4178  __sanitizer_start_switch_fiber(0, 0, 0);
   4179  return 0;
   4180}
   4181EOF
   4182  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
   4183      have_asan_iface_fiber=yes
   4184  fi
   4185fi
   4186
   4187##########################################
   4188# checks for fuzzer
   4189if test "$fuzzing" = "yes" ; then
   4190  write_c_fuzzer_skeleton
   4191  if test -z "${LIB_FUZZING_ENGINE+xxx}"; then
   4192    if compile_prog "$CPU_CFLAGS -Werror -fsanitize=fuzzer" ""; then
   4193      have_fuzzer=yes
   4194    else
   4195      error_exit "Your compiler doesn't support -fsanitize=fuzzer"
   4196      exit 1
   4197    fi
   4198  fi
   4199
   4200  have_clang_coverage_filter=no
   4201  echo > $TMPTXT
   4202  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=fuzzer -fsanitize-coverage-allowlist=$TMPTXT" ""; then
   4203    have_clang_coverage_filter=yes
   4204  fi
   4205fi
   4206
   4207# Thread sanitizer is, for now, much noisier than the other sanitizers;
   4208# keep it separate until that is not the case.
   4209if test "$tsan" = "yes" && test "$sanitizers" = "yes"; then
   4210  error_exit "TSAN is not supported with other sanitiziers."
   4211fi
   4212have_tsan=no
   4213have_tsan_iface_fiber=no
   4214if test "$tsan" = "yes" ; then
   4215  write_c_skeleton
   4216  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
   4217      have_tsan=yes
   4218  fi
   4219  cat > $TMPC << EOF
   4220#include <sanitizer/tsan_interface.h>
   4221int main(void) {
   4222  __tsan_create_fiber(0);
   4223  return 0;
   4224}
   4225EOF
   4226  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
   4227      have_tsan_iface_fiber=yes
   4228  fi
   4229fi
   4230
   4231##########################################
   4232# check for slirp
   4233
   4234case "$slirp" in
   4235  auto | enabled | internal)
   4236    # Simpler to always update submodule, even if not needed.
   4237    git_submodules="${git_submodules} slirp"
   4238    ;;
   4239esac
   4240
   4241# Check for slirp smbd dupport
   4242: ${smbd=${SMBD-/usr/sbin/smbd}}
   4243if test "$slirp_smbd" != "no" ; then
   4244  if test "$mingw32" = "yes" ; then
   4245    if test "$slirp_smbd" = "yes" ; then
   4246      error_exit "Host smbd not supported on this platform."
   4247    fi
   4248    slirp_smbd=no
   4249  else
   4250    slirp_smbd=yes
   4251  fi
   4252fi
   4253
   4254##########################################
   4255# check for usable __NR_keyctl syscall
   4256
   4257if test "$linux" = "yes" ; then
   4258
   4259    have_keyring=no
   4260    cat > $TMPC << EOF
   4261#include <errno.h>
   4262#include <asm/unistd.h>
   4263#include <linux/keyctl.h>
   4264#include <unistd.h>
   4265int main(void) {
   4266    return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
   4267}
   4268EOF
   4269    if compile_prog "" "" ; then
   4270        have_keyring=yes
   4271    fi
   4272fi
   4273if test "$secret_keyring" != "no"
   4274then
   4275    if test "$have_keyring" = "yes"
   4276    then
   4277	secret_keyring=yes
   4278    else
   4279	if test "$secret_keyring" = "yes"
   4280	then
   4281	    error_exit "syscall __NR_keyctl requested, \
   4282but not implemented on your system"
   4283	else
   4284	    secret_keyring=no
   4285	fi
   4286    fi
   4287fi
   4288
   4289##########################################
   4290# End of CC checks
   4291# After here, no more $cc or $ld runs
   4292
   4293write_c_skeleton
   4294
   4295if test "$gcov" = "yes" ; then
   4296  :
   4297elif test "$fortify_source" = "yes" ; then
   4298  QEMU_CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $QEMU_CFLAGS"
   4299  debug=no
   4300fi
   4301
   4302case "$ARCH" in
   4303alpha)
   4304  # Ensure there's only a single GP
   4305  QEMU_CFLAGS="-msmall-data $QEMU_CFLAGS"
   4306;;
   4307esac
   4308
   4309if test "$gprof" = "yes" ; then
   4310  QEMU_CFLAGS="-p $QEMU_CFLAGS"
   4311  QEMU_LDFLAGS="-p $QEMU_LDFLAGS"
   4312fi
   4313
   4314if test "$have_asan" = "yes"; then
   4315  QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
   4316  QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
   4317  if test "$have_asan_iface_h" = "no" ; then
   4318      echo "ASAN build enabled, but ASAN header missing." \
   4319           "Without code annotation, the report may be inferior."
   4320  elif test "$have_asan_iface_fiber" = "no" ; then
   4321      echo "ASAN build enabled, but ASAN header is too old." \
   4322           "Without code annotation, the report may be inferior."
   4323  fi
   4324fi
   4325if test "$have_tsan" = "yes" ; then
   4326  if test "$have_tsan_iface_fiber" = "yes" ; then
   4327    QEMU_CFLAGS="-fsanitize=thread $QEMU_CFLAGS"
   4328    QEMU_LDFLAGS="-fsanitize=thread $QEMU_LDFLAGS"
   4329  else
   4330    error_exit "Cannot enable TSAN due to missing fiber annotation interface."
   4331  fi
   4332elif test "$tsan" = "yes" ; then
   4333  error_exit "Cannot enable TSAN due to missing sanitize thread interface."
   4334fi
   4335if test "$have_ubsan" = "yes"; then
   4336  QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS"
   4337  QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
   4338fi
   4339
   4340##########################################
   4341
   4342# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
   4343if test "$solaris" = "no" && test "$tsan" = "no"; then
   4344    if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
   4345        QEMU_LDFLAGS="-Wl,--warn-common $QEMU_LDFLAGS"
   4346    fi
   4347fi
   4348
   4349# Use ASLR, no-SEH and DEP if available
   4350if test "$mingw32" = "yes" ; then
   4351    flags="--no-seh --nxcompat"
   4352
   4353    # Disable ASLR for debug builds to allow debugging with gdb
   4354    if test "$debug" = "no" ; then
   4355        flags="--dynamicbase $flags"
   4356    fi
   4357
   4358    for flag in $flags; do
   4359        if ld_has $flag ; then
   4360            QEMU_LDFLAGS="-Wl,$flag $QEMU_LDFLAGS"
   4361        fi
   4362    done
   4363fi
   4364
   4365# Probe for guest agent support/options
   4366
   4367if [ "$guest_agent" != "no" ]; then
   4368  if [ "$softmmu" = no -a "$want_tools" = no ] ; then
   4369      guest_agent=no
   4370  elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
   4371      guest_agent=yes
   4372  elif [ "$guest_agent" != yes ]; then
   4373      guest_agent=no
   4374  else
   4375      error_exit "Guest agent is not supported on this platform"
   4376  fi
   4377fi
   4378
   4379# Guest agent Windows MSI package
   4380
   4381if test "$QEMU_GA_MANUFACTURER" = ""; then
   4382  QEMU_GA_MANUFACTURER=QEMU
   4383fi
   4384if test "$QEMU_GA_DISTRO" = ""; then
   4385  QEMU_GA_DISTRO=Linux
   4386fi
   4387if test "$QEMU_GA_VERSION" = ""; then
   4388    QEMU_GA_VERSION=$(cat $source_path/VERSION)
   4389fi
   4390
   4391QEMU_GA_MSI_MINGW_DLL_PATH="$($pkg_config --variable=prefix glib-2.0)/bin"
   4392
   4393# Mac OS X ships with a broken assembler
   4394roms=
   4395if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
   4396        test "$targetos" != "Darwin" && test "$targetos" != "SunOS" && \
   4397        test "$targetos" != "Haiku" && test "$softmmu" = yes ; then
   4398    # Different host OS linkers have different ideas about the name of the ELF
   4399    # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
   4400    # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
   4401    for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
   4402        if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
   4403            ld_i386_emulation="$emu"
   4404            roms="optionrom"
   4405            break
   4406        fi
   4407    done
   4408fi
   4409
   4410# Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
   4411# or -march=z10 (which is the lowest architecture level that Clang supports)
   4412if test "$cpu" = "s390x" ; then
   4413  write_c_skeleton
   4414  compile_prog "-march=z900" ""
   4415  has_z900=$?
   4416  if [ $has_z900 = 0 ] || compile_object "-march=z10 -msoft-float -Werror"; then
   4417    if [ $has_z900 != 0 ]; then
   4418      echo "WARNING: Your compiler does not support the z900!"
   4419      echo "         The s390-ccw bios will only work with guest CPUs >= z10."
   4420    fi
   4421    roms="$roms s390-ccw"
   4422    # SLOF is required for building the s390-ccw firmware on s390x,
   4423    # since it is using the libnet code from SLOF for network booting.
   4424    git_submodules="${git_submodules} roms/SLOF"
   4425  fi
   4426fi
   4427
   4428# Check that the C++ compiler exists and works with the C compiler.
   4429# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
   4430if has $cxx; then
   4431    cat > $TMPC <<EOF
   4432int c_function(void);
   4433int main(void) { return c_function(); }
   4434EOF
   4435
   4436    compile_object
   4437
   4438    cat > $TMPCXX <<EOF
   4439extern "C" {
   4440   int c_function(void);
   4441}
   4442int c_function(void) { return 42; }
   4443EOF
   4444
   4445    update_cxxflags
   4446
   4447    if do_cxx $CXXFLAGS $CONFIGURE_CXXFLAGS $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
   4448        # C++ compiler $cxx works ok with C compiler $cc
   4449        :
   4450    else
   4451        echo "C++ compiler $cxx does not work with C compiler $cc"
   4452        echo "Disabling C++ specific optional code"
   4453        cxx=
   4454    fi
   4455else
   4456    echo "No C++ compiler available; disabling C++ specific optional code"
   4457    cxx=
   4458fi
   4459
   4460if !(GIT="$git" "$source_path/scripts/git-submodule.sh" "$git_submodules_action" "$git_submodules"); then
   4461    exit 1
   4462fi
   4463
   4464config_host_mak="config-host.mak"
   4465
   4466echo "# Automatically generated by configure - do not modify" > $config_host_mak
   4467echo >> $config_host_mak
   4468
   4469echo all: >> $config_host_mak
   4470echo "GIT=$git" >> $config_host_mak
   4471echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
   4472echo "GIT_SUBMODULES_ACTION=$git_submodules_action" >> $config_host_mak
   4473
   4474echo "ARCH=$ARCH" >> $config_host_mak
   4475
   4476if test "$debug_tcg" = "yes" ; then
   4477  echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
   4478fi
   4479if test "$strip_opt" = "yes" ; then
   4480  echo "STRIP=${strip}" >> $config_host_mak
   4481fi
   4482if test "$bigendian" = "yes" ; then
   4483  echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
   4484fi
   4485if test "$mingw32" = "yes" ; then
   4486  echo "CONFIG_WIN32=y" >> $config_host_mak
   4487  if test "$guest_agent_with_vss" = "yes" ; then
   4488    echo "CONFIG_QGA_VSS=y" >> $config_host_mak
   4489    echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
   4490    echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
   4491  fi
   4492  if test "$guest_agent_ntddscsi" = "yes" ; then
   4493    echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
   4494  fi
   4495  echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
   4496  echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
   4497  echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
   4498  echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
   4499else
   4500  echo "CONFIG_POSIX=y" >> $config_host_mak
   4501fi
   4502
   4503if test "$linux" = "yes" ; then
   4504  echo "CONFIG_LINUX=y" >> $config_host_mak
   4505fi
   4506
   4507if test "$darwin" = "yes" ; then
   4508  echo "CONFIG_DARWIN=y" >> $config_host_mak
   4509fi
   4510
   4511if test "$solaris" = "yes" ; then
   4512  echo "CONFIG_SOLARIS=y" >> $config_host_mak
   4513fi
   4514if test "$haiku" = "yes" ; then
   4515  echo "CONFIG_HAIKU=y" >> $config_host_mak
   4516fi
   4517if test "$static" = "yes" ; then
   4518  echo "CONFIG_STATIC=y" >> $config_host_mak
   4519fi
   4520if test "$profiler" = "yes" ; then
   4521  echo "CONFIG_PROFILER=y" >> $config_host_mak
   4522fi
   4523if test "$want_tools" = "yes" ; then
   4524  echo "CONFIG_TOOLS=y" >> $config_host_mak
   4525fi
   4526if test "$guest_agent" = "yes" ; then
   4527  echo "CONFIG_GUEST_AGENT=y" >> $config_host_mak
   4528fi
   4529if test "$slirp_smbd" = "yes" ; then
   4530  echo "CONFIG_SLIRP_SMBD=y" >> $config_host_mak
   4531  echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
   4532fi
   4533if test "$vde" = "yes" ; then
   4534  echo "CONFIG_VDE=y" >> $config_host_mak
   4535  echo "VDE_LIBS=$vde_libs" >> $config_host_mak
   4536fi
   4537if test "$netmap" = "yes" ; then
   4538  echo "CONFIG_NETMAP=y" >> $config_host_mak
   4539fi
   4540if test "$l2tpv3" = "yes" ; then
   4541  echo "CONFIG_L2TPV3=y" >> $config_host_mak
   4542fi
   4543if test "$gprof" = "yes" ; then
   4544  echo "CONFIG_GPROF=y" >> $config_host_mak
   4545fi
   4546echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
   4547for drv in $audio_drv_list; do
   4548    def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
   4549    echo "$def=y" >> $config_host_mak
   4550done
   4551if test "$alsa" = "yes" ; then
   4552    echo "CONFIG_ALSA=y" >> $config_host_mak
   4553fi
   4554echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak
   4555echo "ALSA_CFLAGS=$alsa_cflags" >> $config_host_mak
   4556if test "$libpulse" = "yes" ; then
   4557    echo "CONFIG_LIBPULSE=y" >> $config_host_mak
   4558fi
   4559echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
   4560echo "PULSE_CFLAGS=$pulse_cflags" >> $config_host_mak
   4561echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak
   4562echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak
   4563echo "OSS_LIBS=$oss_libs" >> $config_host_mak
   4564if test "$libjack" = "yes" ; then
   4565    echo "CONFIG_LIBJACK=y" >> $config_host_mak
   4566fi
   4567echo "JACK_LIBS=$jack_libs" >> $config_host_mak
   4568if test "$audio_win_int" = "yes" ; then
   4569  echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
   4570fi
   4571echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
   4572echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
   4573if test "$block_drv_whitelist_tools" = "yes" ; then
   4574  echo "CONFIG_BDRV_WHITELIST_TOOLS=y" >> $config_host_mak
   4575fi
   4576if test "$xfs" = "yes" ; then
   4577  echo "CONFIG_XFS=y" >> $config_host_mak
   4578fi
   4579qemu_version=$(head $source_path/VERSION)
   4580echo "PKGVERSION=$pkgversion" >>$config_host_mak
   4581echo "SRC_PATH=$source_path" >> $config_host_mak
   4582echo "TARGET_DIRS=$target_list" >> $config_host_mak
   4583if test "$modules" = "yes"; then
   4584  # $shacmd can generate a hash started with digit, which the compiler doesn't
   4585  # like as an symbol. So prefix it with an underscore
   4586  echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
   4587  echo "CONFIG_MODULES=y" >> $config_host_mak
   4588fi
   4589if test "$module_upgrades" = "yes"; then
   4590  echo "CONFIG_MODULE_UPGRADES=y" >> $config_host_mak
   4591fi
   4592if test "$have_usbfs" = "yes" ; then
   4593  echo "CONFIG_USBFS=y" >> $config_host_mak
   4594fi
   4595if test "$gio" = "yes" ; then
   4596    echo "CONFIG_GIO=y" >> $config_host_mak
   4597    echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
   4598    echo "GIO_LIBS=$gio_libs" >> $config_host_mak
   4599fi
   4600if test "$gdbus_codegen" != "" ; then
   4601    echo "GDBUS_CODEGEN=$gdbus_codegen" >> $config_host_mak
   4602fi
   4603echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
   4604
   4605# Work around a system header bug with some kernel/XFS header
   4606# versions where they both try to define 'struct fsxattr':
   4607# xfs headers will not try to redefine structs from linux headers
   4608# if this macro is set.
   4609if test "$have_fsxattr" = "yes" ; then
   4610    echo "HAVE_FSXATTR=y" >> $config_host_mak
   4611fi
   4612if test "$xen" = "enabled" ; then
   4613  echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
   4614  echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
   4615  echo "XEN_CFLAGS=$xen_cflags" >> $config_host_mak
   4616  echo "XEN_LIBS=$xen_libs" >> $config_host_mak
   4617fi
   4618if test "$linux_aio" = "yes" ; then
   4619  echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
   4620fi
   4621if test "$vhost_scsi" = "yes" ; then
   4622  echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
   4623fi
   4624if test "$vhost_net" = "yes" ; then
   4625  echo "CONFIG_VHOST_NET=y" >> $config_host_mak
   4626fi
   4627if test "$vhost_net_user" = "yes" ; then
   4628  echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
   4629fi
   4630if test "$vhost_net_vdpa" = "yes" ; then
   4631  echo "CONFIG_VHOST_NET_VDPA=y" >> $config_host_mak
   4632fi
   4633if test "$vhost_crypto" = "yes" ; then
   4634  echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
   4635fi
   4636if test "$vhost_vsock" = "yes" ; then
   4637  echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
   4638  if test "$vhost_user" = "yes" ; then
   4639    echo "CONFIG_VHOST_USER_VSOCK=y" >> $config_host_mak
   4640  fi
   4641fi
   4642if test "$vhost_kernel" = "yes" ; then
   4643  echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
   4644fi
   4645if test "$vhost_user" = "yes" ; then
   4646  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
   4647fi
   4648if test "$vhost_vdpa" = "yes" ; then
   4649  echo "CONFIG_VHOST_VDPA=y" >> $config_host_mak
   4650fi
   4651if test "$vhost_user_fs" = "yes" ; then
   4652  echo "CONFIG_VHOST_USER_FS=y" >> $config_host_mak
   4653fi
   4654if test "$iovec" = "yes" ; then
   4655  echo "CONFIG_IOVEC=y" >> $config_host_mak
   4656fi
   4657if test "$membarrier" = "yes" ; then
   4658  echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
   4659fi
   4660if test "$tcg" = "enabled" -a "$tcg_interpreter" = "true" ; then
   4661  echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
   4662fi
   4663
   4664if test "$spice_protocol" = "yes" ; then
   4665  echo "CONFIG_SPICE_PROTOCOL=y" >> $config_host_mak
   4666  echo "SPICE_PROTOCOL_CFLAGS=$spice_protocol_cflags" >> $config_host_mak
   4667fi
   4668if test "$spice" = "yes" ; then
   4669  echo "CONFIG_SPICE=y" >> $config_host_mak
   4670  echo "SPICE_CFLAGS=$spice_cflags $spice_protocol_cflags" >> $config_host_mak
   4671  echo "SPICE_LIBS=$spice_libs" >> $config_host_mak
   4672fi
   4673
   4674if test "$opengl" = "yes" ; then
   4675  echo "CONFIG_OPENGL=y" >> $config_host_mak
   4676  echo "OPENGL_CFLAGS=$opengl_cflags" >> $config_host_mak
   4677  echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
   4678fi
   4679
   4680if test "$avx2_opt" = "yes" ; then
   4681  echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
   4682fi
   4683
   4684if test "$avx512f_opt" = "yes" ; then
   4685  echo "CONFIG_AVX512F_OPT=y" >> $config_host_mak
   4686fi
   4687
   4688# XXX: suppress that
   4689if [ "$bsd" = "yes" ] ; then
   4690  echo "CONFIG_BSD=y" >> $config_host_mak
   4691fi
   4692
   4693if test "$qom_cast_debug" = "yes" ; then
   4694  echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
   4695fi
   4696
   4697echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
   4698if test "$coroutine_pool" = "yes" ; then
   4699  echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
   4700else
   4701  echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
   4702fi
   4703
   4704if test "$debug_stack_usage" = "yes" ; then
   4705  echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
   4706fi
   4707
   4708if test "$crypto_afalg" = "yes" ; then
   4709  echo "CONFIG_AF_ALG=y" >> $config_host_mak
   4710fi
   4711
   4712if test "$have_asan_iface_fiber" = "yes" ; then
   4713    echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
   4714fi
   4715
   4716if test "$have_tsan" = "yes" && test "$have_tsan_iface_fiber" = "yes" ; then
   4717    echo "CONFIG_TSAN=y" >> $config_host_mak
   4718fi
   4719
   4720if test "$cpuid_h" = "yes" ; then
   4721  echo "CONFIG_CPUID_H=y" >> $config_host_mak
   4722fi
   4723
   4724if test "$int128" = "yes" ; then
   4725  echo "CONFIG_INT128=y" >> $config_host_mak
   4726fi
   4727
   4728if test "$atomic128" = "yes" ; then
   4729  echo "CONFIG_ATOMIC128=y" >> $config_host_mak
   4730fi
   4731
   4732if test "$cmpxchg128" = "yes" ; then
   4733  echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
   4734fi
   4735
   4736if test "$atomic64" = "yes" ; then
   4737  echo "CONFIG_ATOMIC64=y" >> $config_host_mak
   4738fi
   4739
   4740if test "$getauxval" = "yes" ; then
   4741  echo "CONFIG_GETAUXVAL=y" >> $config_host_mak
   4742fi
   4743
   4744if test "$libssh" = "yes" ; then
   4745  echo "CONFIG_LIBSSH=y" >> $config_host_mak
   4746  echo "LIBSSH_CFLAGS=$libssh_cflags" >> $config_host_mak
   4747  echo "LIBSSH_LIBS=$libssh_libs" >> $config_host_mak
   4748fi
   4749
   4750if test "$live_block_migration" = "yes" ; then
   4751  echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
   4752fi
   4753
   4754if test "$tpm" = "yes"; then
   4755  echo 'CONFIG_TPM=y' >> $config_host_mak
   4756fi
   4757
   4758echo "TRACE_BACKENDS=$trace_backends" >> $config_host_mak
   4759if have_backend "nop"; then
   4760  echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
   4761fi
   4762if have_backend "simple"; then
   4763  echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
   4764  # Set the appropriate trace file.
   4765  trace_file="\"$trace_file-\" FMT_pid"
   4766fi
   4767if have_backend "log"; then
   4768  echo "CONFIG_TRACE_LOG=y" >> $config_host_mak
   4769fi
   4770if have_backend "ust"; then
   4771  echo "CONFIG_TRACE_UST=y" >> $config_host_mak
   4772  echo "LTTNG_UST_LIBS=$lttng_ust_libs" >> $config_host_mak
   4773fi
   4774if have_backend "dtrace"; then
   4775  echo "CONFIG_TRACE_DTRACE=y" >> $config_host_mak
   4776  if test "$trace_backend_stap" = "yes" ; then
   4777    echo "CONFIG_TRACE_SYSTEMTAP=y" >> $config_host_mak
   4778  fi
   4779fi
   4780if have_backend "ftrace"; then
   4781  if test "$linux" = "yes" ; then
   4782    echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak
   4783  else
   4784    feature_not_found "ftrace(trace backend)" "ftrace requires Linux"
   4785  fi
   4786fi
   4787if have_backend "syslog"; then
   4788  if test "$posix_syslog" = "yes" ; then
   4789    echo "CONFIG_TRACE_SYSLOG=y" >> $config_host_mak
   4790  else
   4791    feature_not_found "syslog(trace backend)" "syslog not available"
   4792  fi
   4793fi
   4794echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
   4795
   4796if test "$rdma" = "yes" ; then
   4797  echo "CONFIG_RDMA=y" >> $config_host_mak
   4798  echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
   4799fi
   4800
   4801if test "$pvrdma" = "yes" ; then
   4802  echo "CONFIG_PVRDMA=y" >> $config_host_mak
   4803fi
   4804
   4805if test "$replication" = "yes" ; then
   4806  echo "CONFIG_REPLICATION=y" >> $config_host_mak
   4807fi
   4808
   4809if test "$have_af_vsock" = "yes" ; then
   4810  echo "CONFIG_AF_VSOCK=y" >> $config_host_mak
   4811fi
   4812
   4813if test "$debug_mutex" = "yes" ; then
   4814  echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
   4815fi
   4816
   4817# Hold two types of flag:
   4818#   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
   4819#                                     a thread we have a handle to
   4820#   CONFIG_PTHREAD_SETNAME_NP_W_TID - A way of doing it on a particular
   4821#                                     platform
   4822if test "$pthread_setname_np_w_tid" = "yes" ; then
   4823  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
   4824  echo "CONFIG_PTHREAD_SETNAME_NP_W_TID=y" >> $config_host_mak
   4825elif test "$pthread_setname_np_wo_tid" = "yes" ; then
   4826  echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
   4827  echo "CONFIG_PTHREAD_SETNAME_NP_WO_TID=y" >> $config_host_mak
   4828fi
   4829
   4830if test "$bochs" = "yes" ; then
   4831  echo "CONFIG_BOCHS=y" >> $config_host_mak
   4832fi
   4833if test "$cloop" = "yes" ; then
   4834  echo "CONFIG_CLOOP=y" >> $config_host_mak
   4835fi
   4836if test "$dmg" = "yes" ; then
   4837  echo "CONFIG_DMG=y" >> $config_host_mak
   4838fi
   4839if test "$qcow1" = "yes" ; then
   4840  echo "CONFIG_QCOW1=y" >> $config_host_mak
   4841fi
   4842if test "$vdi" = "yes" ; then
   4843  echo "CONFIG_VDI=y" >> $config_host_mak
   4844fi
   4845if test "$vvfat" = "yes" ; then
   4846  echo "CONFIG_VVFAT=y" >> $config_host_mak
   4847fi
   4848if test "$qed" = "yes" ; then
   4849  echo "CONFIG_QED=y" >> $config_host_mak
   4850fi
   4851if test "$parallels" = "yes" ; then
   4852  echo "CONFIG_PARALLELS=y" >> $config_host_mak
   4853fi
   4854if test "$have_mlockall" = "yes" ; then
   4855  echo "HAVE_MLOCKALL=y" >> $config_host_mak
   4856fi
   4857if test "$fuzzing" = "yes" ; then
   4858  # If LIB_FUZZING_ENGINE is set, assume we are running on OSS-Fuzz, and the
   4859  # needed CFLAGS have already been provided
   4860  if test -z "${LIB_FUZZING_ENGINE+xxx}" ; then
   4861    # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
   4862    # compiled code.
   4863    QEMU_CFLAGS="$QEMU_CFLAGS -fsanitize=fuzzer-no-link"
   4864    # To build non-fuzzer binaries with --enable-fuzzing, link everything with
   4865    # fsanitize=fuzzer-no-link. Otherwise, the linker will be unable to bind
   4866    # the fuzzer-related callbacks added by instrumentation.
   4867    QEMU_LDFLAGS="$QEMU_LDFLAGS -fsanitize=fuzzer-no-link"
   4868    # For the actual fuzzer binaries, we need to link against the libfuzzer
   4869    # library. Provide the flags for doing this in FUZZ_EXE_LDFLAGS. The meson
   4870    # rule for the fuzzer adds these to the link_args. They need to be
   4871    # configurable, to support OSS-Fuzz
   4872    FUZZ_EXE_LDFLAGS="-fsanitize=fuzzer"
   4873  else
   4874    FUZZ_EXE_LDFLAGS="$LIB_FUZZING_ENGINE"
   4875  fi
   4876
   4877  # Specify a filter to only instrument code that is directly related to
   4878  # virtual-devices.
   4879  if test "$have_clang_coverage_filter" = "yes" ; then
   4880    cp "$source_path/scripts/oss-fuzz/instrumentation-filter-template" \
   4881       instrumentation-filter
   4882    QEMU_CFLAGS="$QEMU_CFLAGS -fsanitize-coverage-allowlist=instrumentation-filter"
   4883  fi
   4884fi
   4885
   4886if test "$plugins" = "yes" ; then
   4887    echo "CONFIG_PLUGIN=y" >> $config_host_mak
   4888    # Copy the export object list to the build dir
   4889    if test "$ld_dynamic_list" = "yes" ; then
   4890	echo "CONFIG_HAS_LD_DYNAMIC_LIST=yes" >> $config_host_mak
   4891	ld_symbols=qemu-plugins-ld.symbols
   4892	cp "$source_path/plugins/qemu-plugins.symbols" $ld_symbols
   4893    elif test "$ld_exported_symbols_list" = "yes" ; then
   4894	echo "CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST=yes" >> $config_host_mak
   4895	ld64_symbols=qemu-plugins-ld64.symbols
   4896	echo "# Automatically generated by configure - do not modify" > $ld64_symbols
   4897	grep 'qemu_' "$source_path/plugins/qemu-plugins.symbols" | sed 's/;//g' | \
   4898	    sed -E 's/^[[:space:]]*(.*)/_\1/' >> $ld64_symbols
   4899    else
   4900	error_exit \
   4901	    "If \$plugins=yes, either \$ld_dynamic_list or " \
   4902	    "\$ld_exported_symbols_list should have been set to 'yes'."
   4903    fi
   4904fi
   4905
   4906if test -n "$gdb_bin"; then
   4907    gdb_version=$($gdb_bin --version | head -n 1)
   4908    if version_ge ${gdb_version##* } 9.1; then
   4909        echo "HAVE_GDB_BIN=$gdb_bin" >> $config_host_mak
   4910    fi
   4911fi
   4912
   4913if test "$secret_keyring" = "yes" ; then
   4914  echo "CONFIG_SECRET_KEYRING=y" >> $config_host_mak
   4915fi
   4916
   4917echo "ROMS=$roms" >> $config_host_mak
   4918echo "MAKE=$make" >> $config_host_mak
   4919echo "PYTHON=$python" >> $config_host_mak
   4920echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
   4921echo "MESON=$meson" >> $config_host_mak
   4922echo "NINJA=$ninja" >> $config_host_mak
   4923echo "CC=$cc" >> $config_host_mak
   4924echo "HOST_CC=$host_cc" >> $config_host_mak
   4925if $iasl -h > /dev/null 2>&1; then
   4926  echo "CONFIG_IASL=$iasl" >> $config_host_mak
   4927fi
   4928echo "AR=$ar" >> $config_host_mak
   4929echo "AS=$as" >> $config_host_mak
   4930echo "CCAS=$ccas" >> $config_host_mak
   4931echo "CPP=$cpp" >> $config_host_mak
   4932echo "OBJCOPY=$objcopy" >> $config_host_mak
   4933echo "LD=$ld" >> $config_host_mak
   4934echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
   4935echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
   4936echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
   4937echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
   4938echo "GLIB_LIBS=$glib_libs" >> $config_host_mak
   4939echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
   4940echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
   4941echo "EXESUF=$EXESUF" >> $config_host_mak
   4942echo "HOST_DSOSUF=$HOST_DSOSUF" >> $config_host_mak
   4943echo "LIBS_QGA=$libs_qga" >> $config_host_mak
   4944if test "$gcov" = "yes" ; then
   4945  echo "CONFIG_GCOV=y" >> $config_host_mak
   4946fi
   4947
   4948if test "$fuzzing" != "no"; then
   4949    echo "CONFIG_FUZZ=y" >> $config_host_mak
   4950fi
   4951echo "FUZZ_EXE_LDFLAGS=$FUZZ_EXE_LDFLAGS" >> $config_host_mak
   4952
   4953if test "$rng_none" = "yes"; then
   4954  echo "CONFIG_RNG_NONE=y" >> $config_host_mak
   4955fi
   4956
   4957# use included Linux headers
   4958if test "$linux" = "yes" ; then
   4959  mkdir -p linux-headers
   4960  case "$cpu" in
   4961  i386|x86_64|x32)
   4962    linux_arch=x86
   4963    ;;
   4964  ppc|ppc64|ppc64le)
   4965    linux_arch=powerpc
   4966    ;;
   4967  s390x)
   4968    linux_arch=s390
   4969    ;;
   4970  aarch64)
   4971    linux_arch=arm64
   4972    ;;
   4973  mips64)
   4974    linux_arch=mips
   4975    ;;
   4976  *)
   4977    # For most CPUs the kernel architecture name and QEMU CPU name match.
   4978    linux_arch="$cpu"
   4979    ;;
   4980  esac
   4981    # For non-KVM architectures we will not have asm headers
   4982    if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
   4983      symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
   4984    fi
   4985fi
   4986
   4987for target in $target_list; do
   4988    target_dir="$target"
   4989    target_name=$(echo $target | cut -d '-' -f 1)
   4990    mkdir -p $target_dir
   4991    case $target in
   4992        *-user) symlink "../qemu-$target_name" "$target_dir/qemu-$target_name" ;;
   4993        *) symlink "../qemu-system-$target_name" "$target_dir/qemu-system-$target_name" ;;
   4994    esac
   4995done
   4996
   4997echo "CONFIG_QEMU_INTERP_PREFIX=$interp_prefix" | sed 's/%M/@0@/' >> $config_host_mak
   4998if test "$default_targets" = "yes"; then
   4999  echo "CONFIG_DEFAULT_TARGETS=y" >> $config_host_mak
   5000fi
   5001
   5002if test "$numa" = "yes"; then
   5003  echo "CONFIG_NUMA=y" >> $config_host_mak
   5004  echo "NUMA_LIBS=$numa_libs" >> $config_host_mak
   5005fi
   5006
   5007if test "$ccache_cpp2" = "yes"; then
   5008  echo "export CCACHE_CPP2=y" >> $config_host_mak
   5009fi
   5010
   5011if test "$safe_stack" = "yes"; then
   5012  echo "CONFIG_SAFESTACK=y" >> $config_host_mak
   5013fi
   5014
   5015# If we're using a separate build tree, set it up now.
   5016# DIRS are directories which we simply mkdir in the build tree;
   5017# LINKS are things to symlink back into the source tree
   5018# (these can be both files and directories).
   5019# Caution: do not add files or directories here using wildcards. This
   5020# will result in problems later if a new file matching the wildcard is
   5021# added to the source tree -- nothing will cause configure to be rerun
   5022# so the build tree will be missing the link back to the new file, and
   5023# tests might fail. Prefer to keep the relevant files in their own
   5024# directory and symlink the directory instead.
   5025# UNLINK is used to remove symlinks from older development versions
   5026# that might get into the way when doing "git update" without doing
   5027# a "make distclean" in between.
   5028DIRS="tests tests/tcg tests/qapi-schema tests/qtest/libqos"
   5029DIRS="$DIRS tests/qtest tests/qemu-iotests tests/vm tests/fp tests/qgraph"
   5030DIRS="$DIRS docs docs/interop fsdev scsi"
   5031DIRS="$DIRS pc-bios/optionrom pc-bios/s390-ccw"
   5032DIRS="$DIRS roms/seabios"
   5033DIRS="$DIRS contrib/plugins/"
   5034LINKS="Makefile"
   5035LINKS="$LINKS tests/tcg/Makefile.target"
   5036LINKS="$LINKS pc-bios/optionrom/Makefile"
   5037LINKS="$LINKS pc-bios/s390-ccw/Makefile"
   5038LINKS="$LINKS roms/seabios/Makefile"
   5039LINKS="$LINKS pc-bios/qemu-icon.bmp"
   5040LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
   5041LINKS="$LINKS tests/acceptance tests/data"
   5042LINKS="$LINKS tests/qemu-iotests/check"
   5043LINKS="$LINKS python"
   5044LINKS="$LINKS contrib/plugins/Makefile "
   5045UNLINK="pc-bios/keymaps"
   5046for bios_file in \
   5047    $source_path/pc-bios/*.bin \
   5048    $source_path/pc-bios/*.elf \
   5049    $source_path/pc-bios/*.lid \
   5050    $source_path/pc-bios/*.rom \
   5051    $source_path/pc-bios/*.dtb \
   5052    $source_path/pc-bios/*.img \
   5053    $source_path/pc-bios/openbios-* \
   5054    $source_path/pc-bios/u-boot.* \
   5055    $source_path/pc-bios/edk2-*.fd.bz2 \
   5056    $source_path/pc-bios/palcode-* \
   5057    $source_path/pc-bios/qemu_vga.ndrv
   5058
   5059do
   5060    LINKS="$LINKS pc-bios/$(basename $bios_file)"
   5061done
   5062mkdir -p $DIRS
   5063for f in $LINKS ; do
   5064    if [ -e "$source_path/$f" ]; then
   5065        symlink "$source_path/$f" "$f"
   5066    fi
   5067done
   5068for f in $UNLINK ; do
   5069    if [ -L "$f" ]; then
   5070        rm -f "$f"
   5071    fi
   5072done
   5073
   5074(for i in $cross_cc_vars; do
   5075  export $i
   5076done
   5077export target_list source_path use_containers ARCH
   5078$source_path/tests/tcg/configure.sh)
   5079
   5080# temporary config to build submodules
   5081for rom in seabios; do
   5082    config_mak=roms/$rom/config.mak
   5083    echo "# Automatically generated by configure - do not modify" > $config_mak
   5084    echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
   5085    echo "AS=$as" >> $config_mak
   5086    echo "CCAS=$ccas" >> $config_mak
   5087    echo "CC=$cc" >> $config_mak
   5088    echo "BCC=bcc" >> $config_mak
   5089    echo "CPP=$cpp" >> $config_mak
   5090    echo "OBJCOPY=objcopy" >> $config_mak
   5091    echo "IASL=$iasl" >> $config_mak
   5092    echo "LD=$ld" >> $config_mak
   5093    echo "RANLIB=$ranlib" >> $config_mak
   5094done
   5095
   5096if test "$skip_meson" = no; then
   5097  cross="config-meson.cross.new"
   5098  meson_quote() {
   5099    echo "'$(echo $* | sed "s/ /','/g")'"
   5100  }
   5101
   5102  echo "# Automatically generated by configure - do not modify" > $cross
   5103  echo "[properties]" >> $cross
   5104
   5105  # unroll any custom device configs
   5106  for a in $device_archs; do
   5107      eval "c=\$devices_${a}"
   5108      echo "${a}-softmmu = '$c'" >> $cross
   5109  done
   5110
   5111  test -z "$cxx" && echo "link_language = 'c'" >> $cross
   5112  echo "[built-in options]" >> $cross
   5113  echo "c_args = [${CFLAGS:+$(meson_quote $CFLAGS)}]" >> $cross
   5114  echo "cpp_args = [${CXXFLAGS:+$(meson_quote $CXXFLAGS)}]" >> $cross
   5115  echo "c_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
   5116  echo "cpp_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
   5117  echo "[binaries]" >> $cross
   5118  echo "c = [$(meson_quote $cc $CPU_CFLAGS)]" >> $cross
   5119  test -n "$cxx" && echo "cpp = [$(meson_quote $cxx $CPU_CFLAGS)]" >> $cross
   5120  test -n "$objcc" && echo "objc = [$(meson_quote $objcc $CPU_CFLAGS)]" >> $cross
   5121  echo "ar = [$(meson_quote $ar)]" >> $cross
   5122  echo "nm = [$(meson_quote $nm)]" >> $cross
   5123  echo "pkgconfig = [$(meson_quote $pkg_config_exe)]" >> $cross
   5124  echo "ranlib = [$(meson_quote $ranlib)]" >> $cross
   5125  if has $sdl2_config; then
   5126    echo "sdl2-config = [$(meson_quote $sdl2_config)]" >> $cross
   5127  fi
   5128  echo "strip = [$(meson_quote $strip)]" >> $cross
   5129  echo "windres = [$(meson_quote $windres)]" >> $cross
   5130  if test "$cross_compile" = "yes"; then
   5131    cross_arg="--cross-file config-meson.cross"
   5132    echo "[host_machine]" >> $cross
   5133    if test "$mingw32" = "yes" ; then
   5134        echo "system = 'windows'" >> $cross
   5135    fi
   5136    if test "$linux" = "yes" ; then
   5137        echo "system = 'linux'" >> $cross
   5138    fi
   5139    if test "$darwin" = "yes" ; then
   5140        echo "system = 'darwin'" >> $cross
   5141    fi
   5142    case "$ARCH" in
   5143        i386)
   5144            echo "cpu_family = 'x86'" >> $cross
   5145            ;;
   5146        x86_64|x32)
   5147            echo "cpu_family = 'x86_64'" >> $cross
   5148            ;;
   5149        ppc64le)
   5150            echo "cpu_family = 'ppc64'" >> $cross
   5151            ;;
   5152        *)
   5153            echo "cpu_family = '$ARCH'" >> $cross
   5154            ;;
   5155    esac
   5156    echo "cpu = '$cpu'" >> $cross
   5157    if test "$bigendian" = "yes" ; then
   5158        echo "endian = 'big'" >> $cross
   5159    else
   5160        echo "endian = 'little'" >> $cross
   5161    fi
   5162  else
   5163    cross_arg="--native-file config-meson.cross"
   5164  fi
   5165  mv $cross config-meson.cross
   5166
   5167  rm -rf meson-private meson-info meson-logs
   5168  NINJA=$ninja $meson setup \
   5169        --prefix "$prefix" \
   5170        --libdir "$libdir" \
   5171        --libexecdir "$libexecdir" \
   5172        --bindir "$bindir" \
   5173        --includedir "$includedir" \
   5174        --datadir "$datadir" \
   5175        --mandir "$mandir" \
   5176        --sysconfdir "$sysconfdir" \
   5177        --localedir "$localedir" \
   5178        --localstatedir "$local_statedir" \
   5179        -Ddocdir="$docdir" \
   5180        -Dqemu_firmwarepath="$firmwarepath" \
   5181        -Dqemu_suffix="$qemu_suffix" \
   5182        -Doptimization=$(if test "$debug" = yes; then echo 0; else echo 2; fi) \
   5183        -Ddebug=$(if test "$debug_info" = yes; then echo true; else echo false; fi) \
   5184        -Dwerror=$(if test "$werror" = yes; then echo true; else echo false; fi) \
   5185        -Dstrip=$(if test "$strip_opt" = yes; then echo true; else echo false; fi) \
   5186        -Db_pie=$(if test "$pie" = yes; then echo true; else echo false; fi) \
   5187        -Db_coverage=$(if test "$gcov" = yes; then echo true; else echo false; fi) \
   5188        -Db_lto=$lto -Dcfi=$cfi -Dcfi_debug=$cfi_debug \
   5189        -Dmalloc=$malloc -Dmalloc_trim=$malloc_trim -Dsparse=$sparse \
   5190        -Dkvm=$kvm -Dhax=$hax -Dwhpx=$whpx -Dhvf=$hvf -Dnvmm=$nvmm \
   5191        -Dxen=$xen -Dxen_pci_passthrough=$xen_pci_passthrough -Dtcg=$tcg \
   5192        -Dcocoa=$cocoa -Dgtk=$gtk -Dmpath=$mpath -Dsdl=$sdl -Dsdl_image=$sdl_image \
   5193        -Dlibusb=$libusb -Dsmartcard=$smartcard -Dusb_redir=$usb_redir -Dvte=$vte \
   5194        -Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg -Dvnc_png=$vnc_png \
   5195        -Dgettext=$gettext -Dxkbcommon=$xkbcommon -Du2f=$u2f -Dvirtiofsd=$virtiofsd \
   5196        -Dcapstone=$capstone -Dslirp=$slirp -Dfdt=$fdt -Dbrlapi=$brlapi \
   5197        -Dcurl=$curl -Dglusterfs=$glusterfs -Dbzip2=$bzip2 -Dlibiscsi=$libiscsi \
   5198        -Dlibnfs=$libnfs -Diconv=$iconv -Dcurses=$curses -Dlibudev=$libudev\
   5199        -Drbd=$rbd -Dlzo=$lzo -Dsnappy=$snappy -Dlzfse=$lzfse -Dlibxml2=$libxml2 \
   5200        -Dlibdaxctl=$libdaxctl -Dlibpmem=$libpmem -Dlinux_io_uring=$linux_io_uring \
   5201        -Dgnutls=$gnutls -Dnettle=$nettle -Dgcrypt=$gcrypt -Dauth_pam=$auth_pam \
   5202        -Dzstd=$zstd -Dseccomp=$seccomp -Dvirtfs=$virtfs -Dcap_ng=$cap_ng \
   5203        -Dattr=$attr -Ddefault_devices=$default_devices -Dvirglrenderer=$virglrenderer \
   5204        -Ddocs=$docs -Dsphinx_build=$sphinx_build -Dinstall_blobs=$blobs \
   5205        -Dvhost_user_blk_server=$vhost_user_blk_server -Dmultiprocess=$multiprocess \
   5206        -Dfuse=$fuse -Dfuse_lseek=$fuse_lseek -Dguest_agent_msi=$guest_agent_msi -Dbpf=$bpf\
   5207        $(if test "$default_feature" = no; then echo "-Dauto_features=disabled"; fi) \
   5208	-Dtcg_interpreter=$tcg_interpreter \
   5209        $cross_arg \
   5210        "$PWD" "$source_path"
   5211
   5212  if test "$?" -ne 0 ; then
   5213      error_exit "meson setup failed"
   5214  fi
   5215else
   5216  if test -f meson-private/cmd_line.txt; then
   5217    # Adjust old command line options whose type was changed
   5218    # Avoids having to use "setup --wipe" when Meson is upgraded
   5219    perl -i -ne '
   5220      s/^gettext = true$/gettext = auto/;
   5221      s/^gettext = false$/gettext = disabled/;
   5222      /^b_staticpic/ && next;
   5223      print;' meson-private/cmd_line.txt
   5224  fi
   5225fi
   5226
   5227if test -n "${deprecated_features}"; then
   5228    echo "Warning, deprecated features enabled."
   5229    echo "Please see docs/about/deprecated.rst"
   5230    echo "  features: ${deprecated_features}"
   5231fi
   5232
   5233# Create list of config switches that should be poisoned in common code...
   5234# but filter out CONFIG_TCG and CONFIG_USER_ONLY which are special.
   5235target_configs_h=$(ls *-config-devices.h *-config-target.h 2>/dev/null)
   5236if test -n "$target_configs_h" ; then
   5237    sed -n -e '/CONFIG_TCG/d' -e '/CONFIG_USER_ONLY/d' \
   5238        -e '/^#define / { s///; s/ .*//; s/^/#pragma GCC poison /p; }' \
   5239        $target_configs_h | sort -u > config-poison.h
   5240else
   5241    :> config-poison.h
   5242fi
   5243
   5244# Save the configure command line for later reuse.
   5245cat <<EOD >config.status
   5246#!/bin/sh
   5247# Generated by configure.
   5248# Run this file to recreate the current configuration.
   5249# Compiler output produced by configure, useful for debugging
   5250# configure, is in config.log if it exists.
   5251EOD
   5252
   5253preserve_env() {
   5254    envname=$1
   5255
   5256    eval envval=\$$envname
   5257
   5258    if test -n "$envval"
   5259    then
   5260	echo "$envname='$envval'" >> config.status
   5261	echo "export $envname" >> config.status
   5262    else
   5263	echo "unset $envname" >> config.status
   5264    fi
   5265}
   5266
   5267# Preserve various env variables that influence what
   5268# features/build target configure will detect
   5269preserve_env AR
   5270preserve_env AS
   5271preserve_env CC
   5272preserve_env CPP
   5273preserve_env CXX
   5274preserve_env INSTALL
   5275preserve_env LD
   5276preserve_env LD_LIBRARY_PATH
   5277preserve_env LIBTOOL
   5278preserve_env MAKE
   5279preserve_env NM
   5280preserve_env OBJCOPY
   5281preserve_env PATH
   5282preserve_env PKG_CONFIG
   5283preserve_env PKG_CONFIG_LIBDIR
   5284preserve_env PKG_CONFIG_PATH
   5285preserve_env PYTHON
   5286preserve_env SDL2_CONFIG
   5287preserve_env SMBD
   5288preserve_env STRIP
   5289preserve_env WINDRES
   5290
   5291printf "exec" >>config.status
   5292for i in "$0" "$@"; do
   5293  test "$i" = --skip-meson || printf " %s" "$(quote_sh "$i")" >>config.status
   5294done
   5295echo ' "$@"' >>config.status
   5296chmod +x config.status
   5297
   5298rm -r "$TMPDIR1"