#!/bin/sh
#
# qemu configure script (c) 2003 Fabrice Bellard
# Unset some variables known to interfere with behavior of common tools,
# just as autoconf does.
CLICOLOR_FORCE= GREP_OPTIONS=
unset CLICOLOR_FORCE GREP_OPTIONS
# Don't allow CCACHE, if present, to use cached results of compile tests!
export CCACHE_RECACHE=yes
# Temporary directory used for files created while
# configure runs. Since it is in the build directory
# we can safely blow away any previous version of it
# (and we need not jump through hoops to try to delete
# it when configure exits.)
TMPDIR1="config-temp"
rm -rf "${TMPDIR1}"
mkdir -p "${TMPDIR1}"
if [ $? -ne 0 ]; then
echo "ERROR: failed to create temporary directory"
exit 1
fi
TMPB="qemu-conf"
TMPC="${TMPDIR1}/${TMPB}.c"
TMPO="${TMPDIR1}/${TMPB}.o"
TMPCXX="${TMPDIR1}/${TMPB}.cxx"
TMPE="${TMPDIR1}/${TMPB}.exe"
TMPMO="${TMPDIR1}/${TMPB}.mo"
rm -f config.log
# Print a helpful header at the top of config.log
echo "# QEMU configure log $(date)" >> config.log
printf "# Configured with:" >> config.log
printf " '%s'" "$0" "$@" >> config.log
echo >> config.log
echo "#" >> config.log
print_error() {
(echo
echo "ERROR: $1"
while test -n "$2"; do
echo " $2"
shift
done
echo) >&2
}
error_exit() {
print_error "$@"
do_compiler() {
# Run the compiler, capturing its output to the log. First argument
# is compiler binary to execute.
local compiler="$1"
if test -n "$BASH_VERSION"; then eval '
echo >>config.log "
funcs: ${FUNCNAME[*]}
lines: ${BASH_LINENO[*]}"
'; fi
echo $compiler "$@" >> config.log
$compiler "$@" >> config.log 2>&1 || return $?
# Test passed. If this is an --enable-werror build, rerun
# the test with -Werror and bail out if it fails. This
# makes warning-generating-errors in configure test code
# obvious to developers.
if test "$werror" != "yes"; then
return 0
# Don't bother rerunning the compile if we were already using -Werror
case "$*" in
*-Werror*)
;;
esac
echo $compiler -Werror "$@" >> config.log
$compiler -Werror "$@" >> config.log 2>&1 && return $?
error_exit "configure test passed without -Werror but failed with -Werror." \
"This is probably a bug in the configure script. The failing command" \
"will be at the bottom of config.log." \
"You can run configure with --disable-werror to bypass this check."
do_cc() {
do_compiler "$cc" "$@"
do_cxx() {
do_compiler "$cxx" "$@"
update_cxxflags() {
# Set QEMU_CXXFLAGS from QEMU_CFLAGS by filtering out those
# options which some versions of GCC's C++ compiler complain about
# because they only make sense for C programs.
QEMU_CXXFLAGS="$QEMU_CXXFLAGS -D__STDC_LIMIT_MACROS"
for arg in $QEMU_CFLAGS; do
case $arg in
-Wstrict-prototypes|-Wmissing-prototypes|-Wnested-externs|\
-Wold-style-declaration|-Wold-style-definition|-Wredundant-decls)
*)
QEMU_CXXFLAGS=${QEMU_CXXFLAGS:+$QEMU_CXXFLAGS }$arg
compile_object() {
local_cflags="$1"
do_cc $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
compile_prog() {
local_ldflags="$2"
do_cc $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC $LDFLAGS $local_ldflags
# symbolically link $1 to $2. Portable version of "ln -sf".
symlink() {
rm -rf "$2"
mkdir -p "$(dirname "$2")"
ln -s "$1" "$2"
# check whether a command is available to this shell (may be either an
# executable or a builtin)
has() {
type "$1" >/dev/null 2>&1
# search for an executable in PATH
path_of() {
local_command="$1"
local_ifs="$IFS"
local_dir=""
# pathname has a dir component?
if [ "${local_command#*/}" != "$local_command" ]; then
if [ -x "$local_command" ] && [ ! -d "$local_command" ]; then
echo "$local_command"
if [ -z "$local_command" ]; then
return 1
IFS=:
for local_dir in $PATH; do
if [ -x "$local_dir/$local_command" ] && [ ! -d "$local_dir/$local_command" ]; then
echo "$local_dir/$local_command"
IFS="${local_ifs:-$(printf ' \t\n')}"
# not found
have_backend () {
echo "$trace_backends" | grep "$1" >/dev/null
glob() {
eval test -z '"${1#'"$2"'}"'
supported_hax_target() {
test "$hax" = "yes" || return 1
glob "$1" "*-softmmu" || return 1
case "${1%-softmmu}" in
i386|x86_64)
supported_kvm_target() {
test "$kvm" = "yes" || return 1
case "${1%-softmmu}:$cpu" in
arm:arm | aarch64:aarch64 | \
i386:i386 | i386:x86_64 | i386:x32 | \
x86_64:i386 | x86_64:x86_64 | x86_64:x32 | \
mips:mips | mipsel:mips | \
ppc:ppc | ppc64:ppc | ppc:ppc64 | ppc64:ppc64 | \
s390x:s390x)
supported_xen_target() {
test "$xen" = "yes" || return 1
# Only i386 and x86_64 provide the xenpv machine.
supported_hvf_target() {
test "$hvf" = "yes" || return 1
x86_64)
supported_whpx_target() {
test "$whpx" = "yes" || return 1
supported_target() {
case "$1" in
*-softmmu)
*-linux-user)
if test "$linux" != "yes"; then
print_error "Target '$target' is only available on a Linux host"
*-bsd-user)
if test "$bsd" != "yes"; then
print_error "Target '$target' is only available on a BSD host"
print_error "Invalid target name '$target'"
test "$tcg" = "yes" && return 0
supported_kvm_target "$1" && return 0
supported_xen_target "$1" && return 0
supported_hax_target "$1" && return 0
supported_hvf_target "$1" && return 0
supported_whpx_target "$1" && return 0
print_error "TCG disabled, but hardware accelerator not available for '$target'"
ld_has() {
$ld --help 2>/dev/null | grep ".$1" >/dev/null 2>&1
# default parameters
source_path=$(dirname "$0")
cpu=""
iasl="iasl"
interp_prefix="/usr/gnemul/qemu-%M"
static="no"
cross_prefix=""
audio_drv_list=""
block_drv_rw_whitelist=""
block_drv_ro_whitelist=""
host_cc="cc"
libs_softmmu=""
libs_tools=""
audio_pt_int=""
audio_win_int=""
libs_qga=""
debug_info="yes"
stack_protector=""
if test -e "$source_path/.git"
then
git_update=yes
git_submodules="ui/keycodemapdb"
git_submodules="$git_submodules tests/fp/berkeley-testfloat-3"
git_submodules="$git_submodules tests/fp/berkeley-softfloat-3"
else
git_update=no
git_submodules=""
if ! test -f "$source_path/ui/keycodemapdb/README"
echo
echo "ERROR: missing file $source_path/ui/keycodemapdb/README"
echo "This is not a GIT checkout but module content appears to"
echo "be missing. Do not use 'git archive' or GitHub download links"
echo "to acquire QEMU source archives. Non-GIT builds are only"
echo "supported with source archives linked from:"
echo " https://www.qemu.org/download/"
echo "Developers working with GIT can use scripts/archive-source.sh"
echo "if they need to create valid source archives."
git="git"
# Don't accept a target_list environment variable.
unset target_list
# Default value for a variable defining feature "foo".
# * foo="no" feature will only be used if --enable-foo arg is given
# * foo="" feature will be searched for, and if found, will be used
# unless --disable-foo is given
# * foo="yes" this value will only be set by --enable-foo flag.
# feature will searched for,
# if not found, configure exits with error
# Always add --enable-foo and --disable-foo command line args.
# Distributions want to ensure that several features are compiled in, and it
# is impossible without a --enable-foo that exits if a feature is not found.
bluez=""
brlapi=""
curl=""
curses=""
docs=""
fdt=""
netmap="no"
sdl=""
sdlabi=""
virtfs=""
mpath=""
vnc="yes"
sparse="no"
vde=""
vnc_sasl=""
vnc_jpeg=""
vnc_png=""
xkbcommon=""
xen=""
xen_ctrl_version=""
xen_pv_domain_build="no"
xen_pci_passthrough=""
linux_aio=""
cap_ng=""
attr=""
libattr=""
xfs=""
tcg="yes"
membarrier=""
vhost_net="no"
vhost_crypto="no"
vhost_scsi="no"
vhost_vsock="no"
vhost_user=""
kvm="no"
hax="no"
hvf="no"
whpx="no"
rdma=""
pvrdma=""
gprof="no"
debug_tcg="no"
debug="no"
sanitizers="no"
fortify_source=""
strip_opt="yes"
tcg_interpreter="no"
bigendian="no"
mingw32="no"
gcov="no"
gcov_tool="gcov"
EXESUF=""
DSOSUF=".so"
LDFLAGS_SHARED="-shared"
modules="no"
prefix="/usr/local"
mandir="\${prefix}/share/man"
datadir="\${prefix}/share"
firmwarepath="\${prefix}/share/qemu-firmware"
qemu_docdir="\${prefix}/share/doc/qemu"
bindir="\${prefix}/bin"
libdir="\${prefix}/lib"
libexecdir="\${prefix}/libexec"
includedir="\${prefix}/include"
sysconfdir="\${prefix}/etc"
local_statedir="\${prefix}/var"
confsuffix="/qemu"
slirp="yes"
oss_lib=""
bsd="no"
linux="no"
solaris="no"
profiler="no"
cocoa="no"
softmmu="yes"
linux_user="no"
bsd_user="no"
blobs="yes"
pkgversion=""
pie=""
qom_cast_debug="yes"
trace_backends="log"
trace_file="trace"
spice=""
rbd=""
smartcard=""
libusb=""
usb_redir=""
opengl=""
opengl_dmabuf="no"
cpuid_h="no"
avx2_opt=""
zlib="yes"
capstone=""
lzo=""
snappy=""
bzip2=""
lzfse=""
guest_agent=""
guest_agent_with_vss="no"
guest_agent_ntddscsi="no"
guest_agent_msi=""
vss_win32_sdk=""
win_sdk="no"
want_tools="yes"
libiscsi=""
libnfs=""
coroutine=""
coroutine_pool=""
debug_stack_usage="no"
crypto_afalg="no"
seccomp=""
glusterfs=""
glusterfs_xlator_opt="no"
glusterfs_discard="no"
glusterfs_fallocate="no"
glusterfs_zerofill="no"
gtk=""
gtk_gl="no"
tls_priority="NORMAL"
gnutls=""
nettle=""
gcrypt=""
gcrypt_hmac="no"
vte=""
virglrenderer=""
tpm="yes"
libssh2=""
live_block_migration="yes"
numa=""
tcmalloc="no"
jemalloc="no"
replication="yes"
vxhs=""
bochs="yes"
cloop="yes"
dmg="yes"
qcow1="yes"
vdi="yes"
vvfat="yes"
qed="yes"
parallels="yes"
sheepdog="yes"
libxml2=""
docker="no"
debug_mutex="no"
libpmem=""
libudev="no"
# cross compilers defaults, can be overridden with --cross-cc-ARCH
cross_cc_aarch64="aarch64-linux-gnu-gcc"
cross_cc_aarch64_be="$cross_cc_aarch64"
cross_cc_cflags_aarch64_be="-mbig-endian"
cross_cc_arm="arm-linux-gnueabihf-gcc"
cross_cc_cflags_armeb="-mbig-endian"
cross_cc_i386="i386-pc-linux-gnu-gcc"
cross_cc_cflags_i386=""
cross_cc_powerpc="powerpc-linux-gnu-gcc"
enabled_cross_compilers=""
supported_cpu="no"
supported_os="no"
bogus_os="no"
malloc_trim=""
# parse CC options first
for opt do
optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
case "$opt" in
--cross-prefix=*) cross_prefix="$optarg"
--cc=*) CC="$optarg"
--cxx=*) CXX="$optarg"
--source-path=*) source_path="$optarg"
--cpu=*) cpu="$optarg"
--extra-cflags=*) QEMU_CFLAGS="$QEMU_CFLAGS $optarg"
--extra-cxxflags=*) QEMU_CXXFLAGS="$QEMU_CXXFLAGS $optarg"
--extra-ldflags=*) LDFLAGS="$LDFLAGS $optarg"
EXTRA_LDFLAGS="$optarg"
--enable-debug-info) debug_info="yes"
--disable-debug-info) debug_info="no"
--cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"
--cross-cc-cflags-*) cc_arch=${opt#--cross-cc-flags-}; cc_arch=${cc_arch%%=*}
eval "cross_cc_cflags_${cc_arch}=\$optarg"
--cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}
eval "cross_cc_${cc_arch}=\$optarg"
# OS specific
# Using uname is really, really broken. Once we have the right set of checks
# we can eliminate its usage altogether.
# Preferred compiler:
# ${CC} (if set)
# ${cross_prefix}gcc (if cross-prefix specified)
# system compiler
if test -z "${CC}${cross_prefix}"; then
cc="$host_cc"
cc="${CC-${cross_prefix}gcc}"
if test -z "${CXX}${cross_prefix}"; then
cxx="c++"
cxx="${CXX-${cross_prefix}g++}"
ar="${AR-${cross_prefix}ar}"
as="${AS-${cross_prefix}as}"
ccas="${CCAS-$cc}"
cpp="${CPP-$cc -E}"
objcopy="${OBJCOPY-${cross_prefix}objcopy}"
ld="${LD-${cross_prefix}ld}"
ranlib="${RANLIB-${cross_prefix}ranlib}"
nm="${NM-${cross_prefix}nm}"
strip="${STRIP-${cross_prefix}strip}"
windres="${WINDRES-${cross_prefix}windres}"
pkg_config_exe="${PKG_CONFIG-${cross_prefix}pkg-config}"
query_pkg_config() {
"${pkg_config_exe}" ${QEMU_PKG_CONFIG_FLAGS} "$@"
pkg_config=query_pkg_config
sdl_config="${SDL_CONFIG-${cross_prefix}sdl-config}"
sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
# If the user hasn't specified ARFLAGS, default to 'rv', just as make does.
ARFLAGS="${ARFLAGS-rv}"
# default flags for all hosts
# We use -fwrapv to tell the compiler that we require a C dialect where
# left shift of signed integers is well defined and has the expected
# 2s-complement style results. (Both clang and gcc agree that it
# provides these semantics.)
QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv $QEMU_CFLAGS"
QEMU_CFLAGS="-Wall -Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS"
QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS"
QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
QEMU_INCLUDES="-iquote . -iquote \$(SRC_PATH) -iquote \$(SRC_PATH)/accel/tcg -iquote \$(SRC_PATH)/include"
if test "$debug_info" = "yes"; then
CFLAGS="-g $CFLAGS"
LDFLAGS="-g $LDFLAGS"
# make source path absolute
source_path=$(cd "$source_path"; pwd)
# running configure in the source tree?
# we know that's the case if configure is there.
if test -f "./configure"; then
pwd_is_source_path="y"
pwd_is_source_path="n"
check_define() {
cat > $TMPC <<EOF
#if !defined($1)
#error $1 not defined
#endif
int main(void) { return 0; }
EOF
compile_object
check_include() {
#include <$1>
write_c_skeleton() {
if check_define __linux__ ; then
targetos="Linux"
elif check_define _WIN32 ; then
targetos='MINGW32'
elif check_define __OpenBSD__ ; then
targetos='OpenBSD'
elif check_define __sun__ ; then
targetos='SunOS'
elif check_define __HAIKU__ ; then
targetos='Haiku'
elif check_define __FreeBSD__ ; then
targetos='FreeBSD'
elif check_define __FreeBSD_kernel__ && check_define __GLIBC__; then
targetos='GNU/kFreeBSD'
elif check_define __DragonFly__ ; then
targetos='DragonFly'
elif check_define __NetBSD__; then
targetos='NetBSD'
elif check_define __APPLE__; then
targetos='Darwin'
# This is a fatal error, but don't report it yet, because we
# might be going to just print the --help text, or it might
# be the result of a missing compiler.
targetos='bogus'
bogus_os='yes'
# Some host OSes need non-standard checks for which CPU to use.
# Note that these checks are broken for cross-compilation: if you're
# cross-compiling to one of these OSes then you'll need to specify
# the correct CPU with the --cpu option.
case $targetos in
Darwin)
# on Leopard most of the system is 32-bit, so we have to ask the kernel if we can
# run 64-bit userspace code.
# If the user didn't specify a CPU explicitly and the kernel says this is
# 64 bit hw, then assume x86_64. Otherwise fall through to the usual detection code.
if test -z "$cpu" && test "$(sysctl -n hw.optional.x86_64)" = "1"; then
cpu="x86_64"
SunOS)
# $(uname -m) returns i86pc even on an x86_64 box, so default based on isainfo
if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then
if test ! -z "$cpu" ; then
# command line argument
:
elif check_define __i386__ ; then
cpu="i386"
elif check_define __x86_64__ ; then
if check_define __ILP32__ ; then
cpu="x32"
elif check_define __sparc__ ; then
if check_define __arch64__ ; then
cpu="sparc64"
cpu="sparc"
elif check_define _ARCH_PPC ; then
if check_define _ARCH_PPC64 ; then
cpu="ppc64"
cpu="ppc"
elif check_define __mips__ ; then
cpu="mips"
elif check_define __s390__ ; then
if check_define __s390x__ ; then
cpu="s390x"
cpu="s390"
elif check_define __arm__ ; then
cpu="arm"
elif check_define __aarch64__ ; then
cpu="aarch64"
cpu=$(uname -m)
ARCH=
# Normalise host CPU name and set ARCH.
# Note that this case should only have supported host CPUs, not guests.
case "$cpu" in
ppc|ppc64|s390|s390x|sparc64|x32)
cpu="$cpu"
supported_cpu="yes"
eval "cross_cc_${cpu}=\$host_cc"
i386|i486|i586|i686|i86pc|BePC)
cross_cc_i386=$host_cc
x86_64|amd64)
cross_cc_x86_64=$host_cc
armv*b|armv*l|arm)
cross_cc_arm=$host_cc
aarch64)
cross_cc_aarch64=$host_cc
mips*)
cross_cc_mips=$host_cc
sparc|sun4[cdmuv])
cross_cc_sparc=$host_cc
# This will result in either an error or falling back to TCI later
ARCH=unknown
if test -z "$ARCH"; then
ARCH="$cpu"
# host *BSD for user mode
HOST_VARIANT_DIR=""
MINGW32*)
mingw32="yes"
hax="yes"
audio_possible_drivers="dsound sdl"
if check_include dsound.h; then
audio_drv_list="dsound"
supported_os="yes"
GNU/kFreeBSD)
bsd="yes"
audio_drv_list="oss"
audio_possible_drivers="oss sdl pa"
FreeBSD)
make="${MAKE-gmake}"
# needed for kinfo_getvmmap(3) in libutil.h
LIBS="-lutil $LIBS"
# needed for kinfo_getproc
libs_qga="-lutil $libs_qga"
netmap="" # enable netmap autodetect
HOST_VARIANT_DIR="freebsd"
DragonFly)
HOST_VARIANT_DIR="dragonfly"
NetBSD)
audio_possible_drivers="oss sdl"
oss_lib="-lossaudio"
HOST_VARIANT_DIR="netbsd"
OpenBSD)
audio_drv_list="sdl"
audio_possible_drivers="sdl"
HOST_VARIANT_DIR="openbsd"
darwin="yes"
hvf="yes"
LDFLAGS_SHARED="-bundle -undefined dynamic_lookup"
if [ "$cpu" = "x86_64" ] ; then
QEMU_CFLAGS="-arch x86_64 $QEMU_CFLAGS"
LDFLAGS="-arch x86_64 $LDFLAGS"
cocoa="yes"
audio_drv_list="coreaudio"
audio_possible_drivers="coreaudio sdl"
LDFLAGS="-framework CoreFoundation -framework IOKit $LDFLAGS"
libs_softmmu="-F/System/Library/Frameworks -framework Cocoa -framework IOKit $libs_softmmu"
# Disable attempts to use ObjectiveC features in os/object.h since they
# won't work when we're compiling with gcc as a C compiler.
QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS"
HOST_VARIANT_DIR="darwin"
solaris="yes"
install="${INSTALL-ginstall}"
smbd="${SMBD-/usr/sfw/sbin/smbd}"
if test -f /usr/include/sys/soundcard.h ; then
# needed for CMSG_ macros in sys/socket.h
QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS"
# needed for TIOCWIN* defines in termios.h
QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
QEMU_CFLAGS="-std=gnu99 $QEMU_CFLAGS"
solarisnetlibs="-lsocket -lnsl -lresolv"
LIBS="$solarisnetlibs $LIBS"
libs_qga="$solarisnetlibs $libs_qga"
Haiku)
haiku="yes"
QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS $QEMU_CFLAGS"
LIBS="-lposix_error_mapper -lnetwork $LIBS"
Linux)
audio_possible_drivers="oss alsa sdl pa"
linux="yes"
linux_user="yes"
kvm="yes"
vhost_net="yes"
vhost_crypto="yes"
vhost_scsi="yes"
vhost_vsock="yes"
QEMU_INCLUDES="-I\$(SRC_PATH)/linux-headers -I$PWD/linux-headers $QEMU_INCLUDES"
libudev="yes"
if [ "$bsd" = "yes" ] ; then
if [ "$darwin" != "yes" ] ; then
bsd_user="yes"
: ${make=${MAKE-make}}
: ${install=${INSTALL-install}}
: ${python=${PYTHON-python}}
: ${smbd=${SMBD-/usr/sbin/smbd}}
# Default objcc to clang if available, otherwise use CC
if has clang; then
objcc=clang
objcc="$cc"
if test "$mingw32" = "yes" ; then
EXESUF=".exe"
DSOSUF=".dll"
QEMU_CFLAGS="-DWIN32_LEAN_AND_MEAN -DWINVER=0x501 $QEMU_CFLAGS"
# enable C99/POSIX format strings (needs mingw32-runtime 3.15 or later)
QEMU_CFLAGS="-D__USE_MINGW_ANSI_STDIO=1 $QEMU_CFLAGS"
# MinGW needs -mthreads for TLS and macro _MT.
QEMU_CFLAGS="-mthreads $QEMU_CFLAGS"
LIBS="-lwinmm -lws2_32 -liphlpapi $LIBS"
write_c_skeleton;
if compile_prog "" "-liberty" ; then
LIBS="-liberty $LIBS"
prefix="c:/Program Files/QEMU"
mandir="\${prefix}"
datadir="\${prefix}"
qemu_docdir="\${prefix}"
bindir="\${prefix}"
sysconfdir="\${prefix}"
local_statedir=
confsuffix=""
libs_qga="-lws2_32 -lwinmm -lpowrprof -lwtsapi32 -lwininet -liphlpapi -lnetapi32 $libs_qga"
werror=""
--help|-h) show_help=yes
--version|-V) exec cat $source_path/VERSION
--prefix=*) prefix="$optarg"
--interp-prefix=*) interp_prefix="$optarg"
--source-path=*)
--cross-prefix=*)
--cc=*)
--host-cc=*) host_cc="$optarg"
--cxx=*)
--iasl=*) iasl="$optarg"
--objcc=*) objcc="$optarg"
--make=*) make="$optarg"
--install=*) install="$optarg"
--python=*) python="$optarg"
--gcov=*) gcov_tool="$optarg"
--smbd=*) smbd="$optarg"
--extra-cflags=*)
--extra-cxxflags=*)
--extra-ldflags=*)
--enable-debug-info)
--disable-debug-info)
--cross-cc-*)
--enable-modules)
modules="yes"
--disable-modules)
--cpu=*)
--target-list=*) target_list="$optarg"
--enable-trace-backends=*) trace_backends="$optarg"
# XXX: backwards compatibility
--enable-trace-backend=*) trace_backends="$optarg"
--with-trace-file=*) trace_file="$optarg"
--enable-gprof) gprof="yes"
--enable-gcov) gcov="yes"
--static)
static="yes"
LDFLAGS="-static $LDFLAGS"
QEMU_PKG_CONFIG_FLAGS="--static $QEMU_PKG_CONFIG_FLAGS"
--mandir=*) mandir="$optarg"
--bindir=*) bindir="$optarg"
--libdir=*) libdir="$optarg"
--libexecdir=*) libexecdir="$optarg"
--includedir=*) includedir="$optarg"
--datadir=*) datadir="$optarg"
--with-confsuffix=*) confsuffix="$optarg"
--docdir=*) qemu_docdir="$optarg"
--sysconfdir=*) sysconfdir="$optarg"
--localstatedir=*) local_statedir="$optarg"
--firmwarepath=*) firmwarepath="$optarg"
--host=*|--build=*|\
--disable-dependency-tracking|\
--sbindir=*|--sharedstatedir=*|\
--oldincludedir=*|--datarootdir=*|--infodir=*|--localedir=*|\
--htmldir=*|--dvidir=*|--pdfdir=*|--psdir=*)
# These switches are silently ignored, for compatibility with
# autoconf-generated configure scripts. This allows QEMU's
# configure to be used by RPM and similar macros that set
# lots of directory switches by default.
--disable-sdl) sdl="no"
--enable-sdl) sdl="yes"
--with-sdlabi=*) sdlabi="$optarg"
--disable-qom-cast-debug) qom_cast_debug="no"
--enable-qom-cast-debug) qom_cast_debug="yes"
--disable-virtfs) virtfs="no"
--enable-virtfs) virtfs="yes"
--disable-mpath) mpath="no"
--enable-mpath) mpath="yes"
--disable-vnc) vnc="no"
--enable-vnc) vnc="yes"
--oss-lib=*) oss_lib="$optarg"
--audio-drv-list=*) audio_drv_list="$optarg"
--block-drv-rw-whitelist=*|--block-drv-whitelist=*) block_drv_rw_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
--block-drv-ro-whitelist=*) block_drv_ro_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
--enable-debug-tcg) debug_tcg="yes"
--disable-debug-tcg) debug_tcg="no"
--enable-debug)
# Enable debugging options that aren't excessively noisy
debug_tcg="yes"
debug_mutex="yes"
debug="yes"
strip_opt="no"
fortify_source="no"
--enable-sanitizers) sanitizers="yes"
--disable-sanitizers) sanitizers="no"
--enable-sparse) sparse="yes"
--disable-sparse) sparse="no"
--disable-strip) strip_opt="no"
--disable-vnc-sasl) vnc_sasl="no"
--enable-vnc-sasl) vnc_sasl="yes"
--disable-vnc-jpeg) vnc_jpeg="no"
--enable-vnc-jpeg) vnc_jpeg="yes"
--disable-vnc-png) vnc_png="no"
--enable-vnc-png) vnc_png="yes"
--disable-slirp) slirp="no"
--disable-vde) vde="no"
--enable-vde) vde="yes"
--disable-netmap) netmap="no"
--enable-netmap) netmap="yes"
--disable-xen) xen="no"
--enable-xen) xen="yes"
--disable-xen-pci-passthrough) xen_pci_passthrough="no"
--enable-xen-pci-passthrough) xen_pci_passthrough="yes"
--disable-xen-pv-domain-build) xen_pv_domain_build="no"
--enable-xen-pv-domain-build) xen_pv_domain_build="yes"
--disable-brlapi) brlapi="no"
--enable-brlapi) brlapi="yes"
--disable-bluez) bluez="no"
--enable-bluez) bluez="yes"
--disable-kvm) kvm="no"
--enable-kvm) kvm="yes"
--disable-hax) hax="no"
--enable-hax) hax="yes"
--disable-hvf) hvf="no"
--enable-hvf) hvf="yes"
--disable-whpx) whpx="no"
--enable-whpx) whpx="yes"
--disable-tcg-interpreter) tcg_interpreter="no"
--enable-tcg-interpreter) tcg_interpreter="yes"
--disable-cap-ng) cap_ng="no"
--enable-cap-ng) cap_ng="yes"
--disable-tcg) tcg="no"
--enable-tcg) tcg="yes"
--disable-malloc-trim) malloc_trim="no"
--enable-malloc-trim) malloc_trim="yes"
--disable-spice) spice="no"
--enable-spice) spice="yes"
--disable-libiscsi) libiscsi="no"
--enable-libiscsi) libiscsi="yes"
--disable-libnfs) libnfs="no"
--enable-libnfs) libnfs="yes"
--enable-profiler) profiler="yes"
--disable-cocoa) cocoa="no"
--enable-cocoa)
cocoa="yes" ;
audio_drv_list="coreaudio $(echo $audio_drv_list | sed s,coreaudio,,g)"
--disable-system) softmmu="no"
--enable-system) softmmu="yes"
--disable-user)
linux_user="no" ;
bsd_user="no" ;
--enable-user) ;;
--disable-linux-user) linux_user="no"
--enable-linux-user) linux_user="yes"
--disable-bsd-user) bsd_user="no"
--enable-bsd-user) bsd_user="yes"
--enable-pie) pie="yes"
--disable-pie) pie="no"
--enable-werror) werror="yes"
--disable-werror) werror="no"
--enable-stack-protector) stack_protector="yes"
--disable-stack-protector) stack_protector="no"
--disable-curses) curses="no"
--enable-curses) curses="yes"
--disable-curl) curl="no"
--enable-curl) curl="yes"
--disable-fdt) fdt="no"
--enable-fdt) fdt="yes"
--disable-linux-aio) linux_aio="no"
--enable-linux-aio) linux_aio="yes"
--disable-attr) attr="no"
--enable-attr) attr="yes"
--disable-membarrier) membarrier="no"
--enable-membarrier) membarrier="yes"
--disable-blobs) blobs="no"
--with-pkgversion=*) pkgversion="$optarg"
--with-coroutine=*) coroutine="$optarg"
--disable-coroutine-pool) coroutine_pool="no"
--enable-coroutine-pool) coroutine_pool="yes"
--enable-debug-stack-usage) debug_stack_usage="yes"
--enable-crypto-afalg) crypto_afalg="yes"
--disable-crypto-afalg) crypto_afalg="no"
--disable-docs) docs="no"
--enable-docs) docs="yes"
--disable-vhost-net) vhost_net="no"
--enable-vhost-net) vhost_net="yes"
--disable-vhost-crypto) vhost_crypto="no"
--enable-vhost-crypto)
if test "$mingw32" = "yes"; then
error_exit "vhost-crypto isn't available on win32"
--disable-vhost-scsi) vhost_scsi="no"
--enable-vhost-scsi) vhost_scsi="yes"
--disable-vhost-vsock) vhost_vsock="no"
--enable-vhost-vsock) vhost_vsock="yes"
--disable-opengl) opengl="no"
--enable-opengl) opengl="yes"
--disable-rbd) rbd="no"
--enable-rbd) rbd="yes"
--disable-xfsctl) xfs="no"
--enable-xfsctl) xfs="yes"
--disable-smartcard) smartcard="no"
--enable-smartcard) smartcard="yes"
--disable-libusb) libusb="no"
--enable-libusb) libusb="yes"
--disable-usb-redir) usb_redir="no"
--enable-usb-redir) usb_redir="yes"
--disable-zlib-test) zlib="no"
--disable-lzo) lzo="no"
--enable-lzo) lzo="yes"
--disable-snappy) snappy="no"
--enable-snappy) snappy="yes"
--disable-bzip2) bzip2="no"
--enable-bzip2) bzip2="yes"
--enable-lzfse) lzfse="yes"
--disable-lzfse) lzfse="no"
--enable-guest-agent) guest_agent="yes"
--disable-guest-agent) guest_agent="no"
--enable-guest-agent-msi) guest_agent_msi="yes"
--disable-guest-agent-msi) guest_agent_msi="no"
--with-vss-sdk) vss_win32_sdk=""
--with-vss-sdk=*) vss_win32_sdk="$optarg"
--without-vss-sdk) vss_win32_sdk="no"
--with-win-sdk) win_sdk=""
--with-win-sdk=*) win_sdk="$optarg"
--without-win-sdk) win_sdk="no"
--enable-tools) want_tools="yes"
--disable-tools) want_tools="no"
--enable-seccomp) seccomp="yes"
--disable-seccomp) seccomp="no"
--disable-glusterfs) glusterfs="no"
--disable-avx2) avx2_opt="no"
--enable-avx2) avx2_opt="yes"
--enable-glusterfs) glusterfs="yes"
--disable-virtio-blk-data-plane|--enable-virtio-blk-data-plane)
echo "$0: $opt is obsolete, virtio-blk data-plane is always on" >&2
--enable-vhdx|--disable-vhdx)
echo "$0: $opt is obsolete, VHDX driver is always built" >&2
--enable-uuid|--disable-uuid)
echo "$0: $opt is obsolete, UUID support is always built" >&2
--disable-gtk) gtk="no"
--enable-gtk) gtk="yes"
--tls-priority=*) tls_priority="$optarg"
--disable-gnutls) gnutls="no"
--enable-gnutls) gnutls="yes"
--disable-nettle) nettle="no"
--enable-nettle) nettle="yes"
--disable-gcrypt) gcrypt="no"
--enable-gcrypt) gcrypt="yes"
--enable-rdma) rdma="yes"
--disable-rdma) rdma="no"
--enable-pvrdma) pvrdma="yes"
--disable-pvrdma) pvrdma="no"
--disable-vte) vte="no"
--enable-vte) vte="yes"
--disable-virglrenderer) virglrenderer="no"
--enable-virglrenderer) virglrenderer="yes"
--disable-tpm) tpm="no"
--enable-tpm) tpm="yes"
--disable-libssh2) libssh2="no"
--enable-libssh2) libssh2="yes"
--disable-live-block-migration) live_block_migration="no"
--enable-live-block-migration) live_block_migration="yes"
--disable-numa) numa="no"
--enable-numa) numa="yes"
--disable-libxml2) libxml2="no"
--enable-libxml2) libxml2="yes"
--disable-tcmalloc) tcmalloc="no"
--enable-tcmalloc) tcmalloc="yes"
--disable-jemalloc) jemalloc="no"
--enable-jemalloc) jemalloc="yes"
--disable-replication) replication="no"
--enable-replication) replication="yes"
--disable-vxhs) vxhs="no"
--enable-vxhs) vxhs="yes"
--disable-bochs) bochs="no"
--enable-bochs) bochs="yes"
--disable-cloop) cloop="no"
--enable-cloop) cloop="yes"
--disable-dmg) dmg="no"
--enable-dmg) dmg="yes"
--disable-qcow1) qcow1="no"
--enable-qcow1) qcow1="yes"
--disable-vdi) vdi="no"
--enable-vdi) vdi="yes"
--disable-vvfat) vvfat="no"
--enable-vvfat) vvfat="yes"
--disable-qed) qed="no"
--enable-qed) qed="yes"
--disable-parallels) parallels="no"
--enable-parallels) parallels="yes"
--disable-sheepdog) sheepdog="no"
--enable-sheepdog) sheepdog="yes"
--disable-vhost-user) vhost_user="no"
--enable-vhost-user)
vhost_user="yes"
error_exit "vhost-user isn't available on win32"
--disable-capstone) capstone="no"
--enable-capstone) capstone="yes"
--enable-capstone=git) capstone="git"
--enable-capstone=system) capstone="system"
--with-git=*) git="$optarg"
--enable-git-update) git_update=yes
--disable-git-update) git_update=no
--enable-debug-mutex) debug_mutex=yes
--disable-debug-mutex) debug_mutex=no
--enable-libpmem) libpmem=yes
--disable-libpmem) libpmem=no
echo "ERROR: unknown option $opt"
echo "Try '$0 --help' for more information"
if test "$vhost_user" = ""; then
vhost_user="no"
ppc)
CPU_CFLAGS="-m32"
LDFLAGS="-m32 $LDFLAGS"
cross_cc_powerpc=$cc
cross_cc_cflags_powerpc=$CPU_CFLAGS
ppc64)
CPU_CFLAGS="-m64"
LDFLAGS="-m64 $LDFLAGS"
cross_cc_ppc64=$cc
cross_cc_cflags_ppc64=$CPU_CFLAGS
sparc)
CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc"
LDFLAGS="-m32 -mv8plus $LDFLAGS"
cross_cc_sparc=$cc
cross_cc_cflags_sparc=$CPU_CFLAGS
sparc64)
CPU_CFLAGS="-m64 -mcpu=ultrasparc"
cross_cc_sparc64=$cc
cross_cc_cflags_sparc64=$CPU_CFLAGS
s390)
CPU_CFLAGS="-m31"
LDFLAGS="-m31 $LDFLAGS"
cross_cc_s390=$cc
cross_cc_cflags_s390=$CPU_CFLAGS
s390x)
cross_cc_s390x=$cc
cross_cc_cflags_s390x=$CPU_CFLAGS
i386)
cross_cc_i386=$cc
cross_cc_cflags_i386=$CPU_CFLAGS
# ??? Only extremely old AMD cpus do not have cmpxchg16b.
# If we truly care, we should simply detect this case at
# runtime and generate the fallback to serial emulation.
CPU_CFLAGS="-m64 -mcx16"
cross_cc_x86_64=$cc
cross_cc_cflags_x86_64=$CPU_CFLAGS
x32)
CPU_CFLAGS="-mx32"
LDFLAGS="-mx32 $LDFLAGS"
# No special flags required for other host CPUs
QEMU_CFLAGS="$CPU_CFLAGS $QEMU_CFLAGS"
# For user-mode emulation the host arch has to be one we explicitly
# support, even if we're using TCI.
if [ "$ARCH" = "unknown" ]; then
default_target_list=""
mak_wilds=""
if [ "$softmmu" = "yes" ]; then
mak_wilds="${mak_wilds} $source_path/default-configs/*-softmmu.mak"
if [ "$linux_user" = "yes" ]; then
mak_wilds="${mak_wilds} $source_path/default-configs/*-linux-user.mak"
if [ "$bsd_user" = "yes" ]; then
mak_wilds="${mak_wilds} $source_path/default-configs/*-bsd-user.mak"
for config in $mak_wilds; do
default_target_list="${default_target_list} $(basename "$config" .mak)"
# Enumerate public trace backends for --help output
trace_backend_list=$(echo $(grep -le '^PUBLIC = True$' "$source_path"/scripts/tracetool/backend/*.py | sed -e 's/^.*\/\(.*\)\.py$/\1/'))
if test x"$show_help" = x"yes" ; then
cat << EOF
Usage: configure [options]
Options: [defaults in brackets after descriptions]
Standard options:
--help print this message
--prefix=PREFIX install in PREFIX [$prefix]
--interp-prefix=PREFIX where to find shared libraries, etc.
use %M for cpu name [$interp_prefix]
--target-list=LIST set target list (default: build everything)
$(echo Available targets: $default_target_list | \
fold -s -w 53 | sed -e 's/^/ /')
Advanced options (experts only):
--source-path=PATH path of source code [$source_path]
--cross-prefix=PREFIX use PREFIX for compile tools [$cross_prefix]
--cc=CC use C compiler CC [$cc]
--iasl=IASL use ACPI compiler IASL [$iasl]
--host-cc=CC use C compiler CC [$host_cc] for code run at
build time
--cxx=CXX use C++ compiler CXX [$cxx]
--objcc=OBJCC use Objective-C compiler OBJCC [$objcc]
--extra-cflags=CFLAGS append extra C compiler flags QEMU_CFLAGS
--extra-cxxflags=CXXFLAGS append extra C++ compiler flags QEMU_CXXFLAGS
--extra-ldflags=LDFLAGS append extra linker flags LDFLAGS
--cross-cc-ARCH=CC use compiler when building ARCH guest test cases
--cross-cc-flags-ARCH= use compiler flags when building ARCH guest tests
--make=MAKE use specified make [$make]
--install=INSTALL use specified install [$install]
--python=PYTHON use specified python [$python]
--smbd=SMBD use specified smbd [$smbd]
--with-git=GIT use specified git [$git]
--static enable static build [$static]
--mandir=PATH install man pages in PATH
--datadir=PATH install firmware in PATH$confsuffix
--docdir=PATH install documentation in PATH$confsuffix
--bindir=PATH install binaries in PATH
--libdir=PATH install libraries in PATH
--libexecdir=PATH install helper binaries in PATH
--sysconfdir=PATH install config in PATH$confsuffix
--localstatedir=PATH install local state in PATH (set at runtime on win32)
--firmwarepath=PATH search PATH for firmware files
--with-confsuffix=SUFFIX suffix for QEMU data inside datadir/libdir/sysconfdir [$confsuffix]
--with-pkgversion=VERS use specified string as sub-version of the package
--enable-debug enable common debug build options
--enable-sanitizers enable default sanitizers
--disable-strip disable stripping binaries
--disable-werror disable compilation abort on warning
--disable-stack-protector disable compiler-provided stack protection
--audio-drv-list=LIST set audio drivers list:
Available drivers: $audio_possible_drivers
--block-drv-whitelist=L Same as --block-drv-rw-whitelist=L
--block-drv-rw-whitelist=L
set block driver read-write whitelist
(affects only QEMU, not qemu-img)
--block-drv-ro-whitelist=L
set block driver read-only whitelist
--enable-trace-backends=B Set trace backend
Available backends: $trace_backend_list
--with-trace-file=NAME Full PATH,NAME of file to store traces
Default:trace-<pid>
--disable-slirp disable SLIRP userspace network connectivity
--enable-tcg-interpreter enable TCG with bytecode interpreter (TCI)
--enable-malloc-trim enable libc malloc_trim() for memory optimization
--oss-lib path to OSS library
--cpu=CPU Build for host CPU [$cpu]
--with-coroutine=BACKEND coroutine backend. Supported options:
ucontext, sigaltstack, windows
--enable-gcov enable test coverage analysis with gcov
--gcov=GCOV use specified gcov [$gcov_tool]
--disable-blobs disable installing provided firmware blobs
--with-vss-sdk=SDK-path enable Windows VSS support in QEMU Guest Agent
--with-win-sdk=SDK-path path to Windows Platform SDK (to build VSS .tlb)
--tls-priority default TLS protocol/cipher priority string
--enable-gprof QEMU profiling with gprof
--enable-profiler profiler support
--enable-xen-pv-domain-build
xen pv domain builder
--enable-debug-stack-usage
track the maximum stack usage of stacks created by qemu_alloc_stack
Optional features, enabled with --enable-FEATURE and
disabled with --disable-FEATURE, default is enabled if available:
system all system emulation targets
user supported user emulation targets
linux-user all linux usermode emulation targets
bsd-user all BSD usermode emulation targets
docs build documentation
guest-agent build the QEMU Guest Agent
guest-agent-msi build guest agent Windows MSI installation package
pie Position Independent Executables
modules modules support
debug-tcg TCG debugging (default is disabled)
debug-info debugging information
sparse sparse checker
gnutls GNUTLS cryptography support
nettle nettle cryptography support
gcrypt libgcrypt cryptography support
sdl SDL UI
--with-sdlabi select preferred SDL ABI 1.2 or 2.0
gtk gtk UI
vte vte support for the gtk UI
curses curses UI
vnc VNC UI support
vnc-sasl SASL encryption for VNC server
vnc-jpeg JPEG lossy compression for VNC server
vnc-png PNG compression for VNC server
cocoa Cocoa UI (Mac OS X only)
virtfs VirtFS
mpath Multipath persistent reservation passthrough
xen xen backend driver support
xen-pci-passthrough PCI passthrough support for Xen
brlapi BrlAPI (Braile)
curl curl connectivity
membarrier membarrier system call (for Linux 4.14+ or Windows)
fdt fdt device tree
bluez bluez stack connectivity
kvm KVM acceleration support
hax HAX acceleration support
hvf Hypervisor.framework acceleration support
whpx Windows Hypervisor Platform acceleration support
rdma Enable RDMA-based migration
pvrdma Enable PVRDMA support
vde support for vde network
netmap support for netmap network
linux-aio Linux AIO support
cap-ng libcap-ng support
attr attr and xattr support
vhost-net vhost-net acceleration support
vhost-crypto vhost-crypto acceleration support
spice spice
rbd rados block device (rbd)
libiscsi iscsi support
libnfs nfs support
smartcard smartcard support (libcacard)
libusb libusb (for usb passthrough)
live-block-migration Block migration in the main migration stream
usb-redir usb network redirection support
lzo support of lzo compression library
snappy support of snappy compression library
bzip2 support of bzip2 compression library
(for reading bzip2-compressed dmg images)
lzfse support of lzfse compression library
(for reading lzfse-compressed dmg images)
seccomp seccomp support
coroutine-pool coroutine freelist (better performance)
glusterfs GlusterFS backend
tpm TPM support
libssh2 ssh block device support
numa libnuma support
libxml2 for Parallels image format
tcmalloc tcmalloc support
jemalloc jemalloc support
avx2 AVX2 optimization support
replication replication support
vhost-vsock virtio sockets device support
opengl opengl support
virglrenderer virgl rendering support
xfsctl xfsctl support
qom-cast-debug cast debugging support
tools build qemu-io, qemu-nbd and qemu-image tools
vxhs Veritas HyperScale vDisk backend support
bochs bochs image format support
cloop cloop image format support
dmg dmg image format support
qcow1 qcow v1 image format support
vdi vdi image format support
vvfat vvfat image format support
qed qed image format support
parallels parallels image format support
sheepdog sheepdog block driver support
crypto-afalg Linux AF_ALG crypto backend driver
vhost-user vhost-user support
capstone capstone disassembler support
debug-mutex mutex debugging support
libpmem libpmem support
NOTE: The object files are built at the place where configure is launched
exit 0
if ! has $python; then
error_exit "Python not found. Use --python=/path/to/python"
# Note that if the Python conditional here evaluates True we will exit
# with status 1 which is a shell 'false' value.
if ! $python -c 'import sys; sys.exit(sys.version_info < (2,7))'; then
error_exit "Cannot use '$python', Python 2 >= 2.7 or Python 3 is required." \
"Use --python=/path/to/python to specify a supported Python."
# Suppress writing compiled files
python="$python -B"
# Check that the C compiler works. Doing this here before testing
# the host CPU ensures that we had a valid CC to autodetect the
# $cpu var (and we should bail right here if that's not the case).
# It also allows the help message to be printed without a CC.
if compile_object ; then
: C compiler works ok
error_exit "\"$cc\" either does not exist or does not work"
if ! compile_prog ; then
error_exit "\"$cc\" cannot build an executable (is your linker broken?)"
# Now we have handled --enable-tcg-interpreter and know we're not just
# printing the help message, bail out if the host CPU isn't supported.
if test "$ARCH" = "unknown"; then
if test "$tcg_interpreter" = "yes" ; then
echo "Unsupported CPU = $cpu, will use TCG with TCI (experimental)"
error_exit "Unsupported CPU = $cpu, try --enable-tcg-interpreter"
# Consult white-list to determine whether to enable werror
# by default. Only enable by default for git builds
if test -z "$werror" ; then
if test -d "$source_path/.git" -a \
\( "$linux" = "yes" -o "$mingw32" = "yes" \) ; then
werror="yes"
werror="no"
if test "$bogus_os" = "yes"; then
# Now that we know that we're not printing the help and that
# the compiler works (so the results of the check_defines we used
# to identify the OS are reliable), if we didn't recognize the
# host OS we should stop now.
error_exit "Unrecognized host OS (uname -s reports '$(uname -s)')"
# Check whether the compiler matches our minimum requirements:
cat > $TMPC << EOF
#if defined(__clang_major__) && defined(__clang_minor__)
# ifdef __apple_build_version__
# if __clang_major__ < 5 || (__clang_major__ == 5 && __clang_minor__ < 1)
# error You need at least XCode Clang v5.1 to compile QEMU
# endif
# else
# if __clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ < 4)
# error You need at least Clang v3.4 to compile QEMU
#elif defined(__GNUC__) && defined(__GNUC_MINOR__)
# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8)
# error You need at least GCC v4.8 to compile QEMU
#else
# error You either need GCC or Clang to compiler QEMU
int main (void) { return 0; }
if ! compile_prog "" "" ; then
error_exit "You need at least GCC v4.8 or Clang v3.4 (or XCode Clang v5.1)"
gcc_flags="-Wold-style-declaration -Wold-style-definition -Wtype-limits"
gcc_flags="-Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers $gcc_flags"
gcc_flags="-Wno-missing-include-dirs -Wempty-body -Wnested-externs $gcc_flags"
gcc_flags="-Wendif-labels -Wno-shift-negative-value $gcc_flags"
gcc_flags="-Wno-initializer-overrides -Wexpansion-to-defined $gcc_flags"
gcc_flags="-Wno-string-plus-int $gcc_flags"
gcc_flags="-Wno-error=address-of-packed-member $gcc_flags"
# Note that we do not add -Werror to gcc_flags here, because that would
# enable it for all configure tests. If a configure test failed due
# to -Werror this would just silently disable some features,
# so it's too error prone.
cc_has_warning_flag() {
# Use the positive sense of the flag when testing for -Wno-wombat
# support (gcc will happily accept the -Wno- form of unknown
# warning options).
optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
compile_prog "-Werror $optflag" ""
for flag in $gcc_flags; do
if cc_has_warning_flag $flag ; then
QEMU_CFLAGS="$QEMU_CFLAGS $flag"
if test "$stack_protector" != "no"; then
int main(int argc, char *argv[])
{
char arr[64], *p = arr, *c = argv[0];
while (*c) {
*p++ = *c++;
return 0;
gcc_flags="-fstack-protector-strong -fstack-protector-all"
sp_on=0
# We need to check both a compile and a link, since some compiler
# setups fail only on a .c->.o compile and some only at link time
if do_cc $QEMU_CFLAGS -Werror $flag -c -o $TMPO $TMPC &&
compile_prog "-Werror $flag" ""; then
sp_on=1
break
if test "$stack_protector" = yes; then
if test $sp_on = 0; then
error_exit "Stack protector not supported"
# Disable -Wmissing-braces on older compilers that warn even for
# the "universal" C zero initializer {0}.
struct {
int a[2];
} x = {0};
if compile_object "-Werror" "" ; then
QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces"
# Static linking is not possible with modules or PIE
if test "$static" = "yes" ; then
if test "$modules" = "yes" ; then
error_exit "static and modules are mutually incompatible"
if test "$pie" = "yes" ; then
error_exit "static and pie are mutually incompatible"
pie="no"
# Unconditional check for compiler __thread support
static __thread int tls_var;
int main(void) { return tls_var; }
if ! compile_prog "-Werror" "" ; then
error_exit "Your compiler does not support the __thread specifier for " \
"Thread-Local Storage (TLS). Please upgrade to a version that does."
if test "$pie" = ""; then
case "$cpu-$targetos" in
i386-Linux|x86_64-Linux|x32-Linux|i386-OpenBSD|x86_64-OpenBSD)
if test "$pie" != "no" ; then
#ifdef __linux__
# define THREAD __thread
# define THREAD
static THREAD int tls_var;
if compile_prog "-fPIE -DPIE" "-pie"; then
QEMU_CFLAGS="-fPIE -DPIE $QEMU_CFLAGS"
LDFLAGS="-pie $LDFLAGS"
pie="yes"
if compile_prog "" "-Wl,-z,relro -Wl,-z,now" ; then
LDFLAGS="-Wl,-z,relro -Wl,-z,now $LDFLAGS"
if test "$pie" = "yes"; then
error_exit "PIE not available due to missing toolchain support"
echo "Disabling PIE due to missing toolchain support"
if compile_prog "-Werror -fno-pie" "-nopie"; then
CFLAGS_NOPIE="-fno-pie"
LDFLAGS_NOPIE="-nopie"
##########################################
# __sync_fetch_and_and requires at least -march=i486. Many toolchains
# use i686 as default anyway, but for those that don't, an explicit
# specification is necessary
if test "$cpu" = "i386"; then
static int sfaa(int *ptr)
return __sync_fetch_and_and(ptr, 0);
int main(void)
int val = 42;
val = __sync_val_compare_and_swap(&val, 0, 1);
sfaa(&val);
return val;
QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS"
#########################################
# Solaris specific configure tool chain decisions
if test "$solaris" = "yes" ; then
if has $install; then
error_exit "Solaris install program not found. Use --install=/usr/ucb/install or" \
"install fileutils from www.blastwave.org using pkg-get -i fileutils" \
"to get ginstall which is used by default (which lives in /opt/csw/bin)"
if test "$(path_of $install)" = "/usr/sbin/install" ; then
error_exit "Solaris /usr/sbin/install is not an appropriate install program." \
"try ginstall from the GNU fileutils available from www.blastwave.org" \
"using pkg-get -i fileutils, or use --install=/usr/ucb/install"
if has ar; then
if test -f /usr/ccs/bin/ar ; then
error_exit "No path includes ar" \
"Add /usr/ccs/bin to your path and rerun configure"
error_exit "No path includes ar"
if test -z "${target_list+xxx}" ; then
for target in $default_target_list; do
supported_target $target 2>/dev/null && \
target_list="$target_list $target"
target_list="${target_list# }"
target_list=$(echo "$target_list" | sed -e 's/,/ /g')
for target in $target_list; do
# Check that we recognised the target name; this allows a more
# friendly error message than if we let it fall through.
case " $default_target_list " in
*" $target "*)
error_exit "Unknown target name '$target'"
supported_target $target || exit 1
# see if system emulation was really requested
case " $target_list " in
*"-softmmu "*) softmmu=yes
*) softmmu=no
feature_not_found() {
feature=$1
remedy=$2
error_exit "User requested feature $feature" \
"configure was not able to find it." \
"$remedy"
# ---
# big/little endian test
short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, };
short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, };
extern int foo(short *, short *);
int main(int argc, char *argv[]) {
return foo(big_endian, little_endian);
if strings -a $TMPO | grep -q BiGeNdIaN ; then
bigendian="yes"
elif strings -a $TMPO | grep -q LiTtLeEnDiAn ; then
echo big/little test failed
# cocoa implies not SDL or GTK
# (the cocoa UI code currently assumes it is always the active UI
# and doesn't interact well with other UI frontend code)
if test "$cocoa" = "yes"; then
if test "$sdl" = "yes"; then
error_exit "Cocoa and SDL UIs cannot both be enabled at once"
if test "$gtk" = "yes"; then
error_exit "Cocoa and GTK UIs cannot both be enabled at once"
gtk=no
sdl=no
# Some versions of Mac OS X incorrectly define SIZE_MAX
#include <stdint.h>
#include <stdio.h>
return printf("%zu", SIZE_MAX);
have_broken_size_max=no
if ! compile_object -Werror ; then
have_broken_size_max=yes
# L2TPV3 probe
#include <sys/socket.h>
#include <linux/ip.h>
int main(void) { return sizeof(struct mmsghdr); }
if compile_prog "" "" ; then
l2tpv3=yes
l2tpv3=no
# MinGW / Mingw-w64 localtime_r/gmtime_r check
# Some versions of MinGW / Mingw-w64 lack localtime_r
# and gmtime_r entirely.
# Some versions of Mingw-w64 define a macro for
# localtime_r/gmtime_r.
# Some versions of Mingw-w64 will define functions
# for localtime_r/gmtime_r, but only if you have
# _POSIX_THREAD_SAFE_FUNCTIONS defined. For fun
# though, unistd.h and pthread.h both define
# that for you.
# So this #undef localtime_r and #include <unistd.h>
# are not in fact redundant.
#include <unistd.h>
#include <time.h>
#undef localtime_r
int main(void) { localtime_r(NULL, NULL); return 0; }
localtime_r="yes"
localtime_r="no"
# pkg-config probe
if ! has "$pkg_config_exe"; then
error_exit "pkg-config binary '$pkg_config_exe' not found"
# NPTL probe
if test "$linux_user" = "yes"; then
#include <sched.h>
#include <linux/futex.h>
int main(void) {
#if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
#error bork
if ! compile_object ; then
feature_not_found "nptl" "Install glibc and linux kernel headers."
# lzo check
if test "$lzo" != "no" ; then
#include <lzo/lzo1x.h>
int main(void) { lzo_version(); return 0; }
if compile_prog "" "-llzo2" ; then
libs_softmmu="$libs_softmmu -llzo2"
lzo="yes"
if test "$lzo" = "yes"; then
feature_not_found "liblzo2" "Install liblzo2 devel"
lzo="no"
# snappy check
if test "$snappy" != "no" ; then
#include <snappy-c.h>
int main(void) { snappy_max_compressed_length(4096); return 0; }
if compile_prog "" "-lsnappy" ; then
libs_softmmu="$libs_softmmu -lsnappy"
snappy="yes"
if test "$snappy" = "yes"; then
feature_not_found "libsnappy" "Install libsnappy devel"
snappy="no"
# bzip2 check
if test "$bzip2" != "no" ; then
#include <bzlib.h>
int main(void) { BZ2_bzlibVersion(); return 0; }
if compile_prog "" "-lbz2" ; then
bzip2="yes"
if test "$bzip2" = "yes"; then
feature_not_found "libbzip2" "Install libbzip2 devel"
bzip2="no"
# lzfse check
if test "$lzfse" != "no" ; then
#include <lzfse.h>
int main(void) { lzfse_decode_scratch_size(); return 0; }
if compile_prog "" "-llzfse" ; then
lzfse="yes"
if test "$lzfse" = "yes"; then
feature_not_found "lzfse" "Install lzfse devel"
lzfse="no"
# libseccomp check
libseccomp_minver="2.2.0"
if test "$seccomp" != "no" ; then
i386|x86_64|mips)
arm|aarch64)
libseccomp_minver="2.2.3"
ppc|ppc64|s390x)
libseccomp_minver="2.3.0"
libseccomp_minver=""
if test "$libseccomp_minver" != "" &&
$pkg_config --atleast-version=$libseccomp_minver libseccomp ; then
seccomp_cflags="$($pkg_config --cflags libseccomp)"
seccomp_libs="$($pkg_config --libs libseccomp)"
seccomp="yes"
if test "$seccomp" = "yes" ; then
if test "$libseccomp_minver" != "" ; then
feature_not_found "libseccomp" \
"Install libseccomp devel >= $libseccomp_minver"
"libseccomp is not supported for host cpu $cpu"
seccomp="no"
# xen probe
if test "$xen" != "no" ; then
# Check whether Xen library path is specified via --extra-ldflags to avoid
# overriding this setting with pkg-config output. If not, try pkg-config
# to obtain all needed flags.
if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
$pkg_config --exists xencontrol ; then
xen_ctrl_version="$(printf '%d%02d%02d' \
$($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
xen=yes
xen_pc="xencontrol xenstore xenguest xenforeignmemory xengnttab"
xen_pc="$xen_pc xenevtchn xendevicemodel"
if $pkg_config --exists xentoolcore; then
xen_pc="$xen_pc xentoolcore"
QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags $xen_pc)"
libs_softmmu="$($pkg_config --libs $xen_pc) $libs_softmmu"
LDFLAGS="$($pkg_config --libs $xen_pc) $LDFLAGS"
xen_libs="-lxenstore -lxenctrl -lxenguest"
xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
# First we test whether Xen headers and libraries are available.
# If no, we are done and there is no Xen support.
# If yes, more tests are run to detect the Xen version.
# Xen (any)
#include <xenctrl.h>
if ! compile_prog "" "$xen_libs" ; then
# Xen not found
if test "$xen" = "yes" ; then
feature_not_found "xen" "Install xen devel"
xen=no
# Xen unstable
elif
cat > $TMPC <<EOF &&
#undef XC_WANT_COMPAT_DEVICEMODEL_API
#define __XEN_TOOLS__
#include <xendevicemodel.h>
#include <xenforeignmemory.h>
xendevicemodel_handle *xd;
xenforeignmemory_handle *xfmem;
xd = xendevicemodel_open(0, 0);
xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
xfmem = xenforeignmemory_open(0, 0);
xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
xen_ctrl_version=41100
#undef XC_WANT_COMPAT_MAP_FOREIGN_API
#include <xentoolcore.h>
xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
xentoolcore_restrict_all(0);
xen_ctrl_version=41000
xendevicemodel_close(xd);
compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
xen_stable_libs="-lxendevicemodel $xen_stable_libs"
xen_ctrl_version=40900
/*
* If we have stable libs the we don't want the libxc compat
* layers, regardless of what CFLAGS we may have been given.
*
* Also, check if xengnttab_grant_copy_segment_t is defined and
* grant copy operation is implemented.
*/
#undef XC_WANT_COMPAT_EVTCHN_API
#undef XC_WANT_COMPAT_GNTTAB_API
#include <xenstore.h>
#include <xenevtchn.h>
#include <xengnttab.h>
#include <xen/hvm/hvm_info_table.h>
#if !defined(HVM_MAX_VCPUS)
# error HVM_MAX_VCPUS not defined
xc_interface *xc = NULL;
xenevtchn_handle *xe;
xengnttab_handle *xg;
xen_domain_handle_t handle;
xengnttab_grant_copy_segment_t* seg = NULL;
xs_daemon_open();
xc = xc_interface_open(0, 0, 0);
xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
xc_domain_create(xc, 0, handle, 0, NULL, NULL);
xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
xe = xenevtchn_open(0, 0);
xenevtchn_fd(xe);
xg = xengnttab_open(0, 0);
xengnttab_grant_copy(xg, 0, seg);
compile_prog "" "$xen_libs $xen_stable_libs"
xen_ctrl_version=40800
xengnttab_map_grant_ref(xg, 0, 0, 0);
xen_ctrl_version=40701
compile_prog "" "$xen_libs"
xen_ctrl_version=40700
# Xen 4.6
xc_interface *xc;
xc_gnttab_open(NULL, 0);
xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
xen_ctrl_version=40600
# Xen 4.5
xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
xen_ctrl_version=40500
xen_ctrl_version=40200
feature_not_found "xen (unsupported version)" \
"Install a supported xen (xen 4.2 or newer)"
if test "$xen" = yes; then
if test $xen_ctrl_version -ge 40701 ; then
libs_softmmu="$xen_stable_libs $libs_softmmu"
libs_softmmu="$xen_libs $libs_softmmu"
if test "$xen_pci_passthrough" != "no"; then
if test "$xen" = "yes" && test "$linux" = "yes"; then
xen_pci_passthrough=yes
if test "$xen_pci_passthrough" = "yes"; then
error_exit "User requested feature Xen PCI Passthrough" \
" but this feature requires /sys from Linux"
xen_pci_passthrough=no
if test "$xen_pv_domain_build" = "yes" &&
test "$xen" != "yes"; then
error_exit "User requested Xen PV domain builder support" \
"which requires Xen support."
# Windows Hypervisor Platform accelerator (WHPX) check
if test "$whpx" != "no" ; then
if check_include "WinHvPlatform.h" && check_include "WinHvEmulation.h"; then
whpx="yes"
if test "$whpx" = "yes"; then
feature_not_found "WinHvPlatform" "WinHvEmulation is not installed"
# Sparse probe
if test "$sparse" != "no" ; then
if has cgcc; then
sparse=yes
if test "$sparse" = "yes" ; then
feature_not_found "sparse" "Install sparse binary"
sparse=no
# X11 probe
if $pkg_config --exists "x11"; then
have_x11=yes
x11_cflags=$($pkg_config --cflags x11)
x11_libs=$($pkg_config --libs x11)
# GTK probe
if test "$gtk" != "no"; then
gtkpackage="gtk+-3.0"
gtkx11package="gtk+-x11-3.0"
gtkversion="3.14.0"
if $pkg_config --exists "$gtkpackage >= $gtkversion"; then
gtk_cflags=$($pkg_config --cflags $gtkpackage)
gtk_libs=$($pkg_config --libs $gtkpackage)
gtk_version=$($pkg_config --modversion $gtkpackage)
if $pkg_config --exists "$gtkx11package >= $gtkversion"; then
need_x11=yes
gtk_cflags="$gtk_cflags $x11_cflags"
gtk_libs="$gtk_libs $x11_libs"
gtk="yes"
elif test "$gtk" = "yes"; then
feature_not_found "gtk" "Install gtk3-devel"
gtk="no"
# GNUTLS probe
if test "$gnutls" != "no"; then
if $pkg_config --exists "gnutls >= 3.1.18"; then
gnutls_cflags=$($pkg_config --cflags gnutls)
gnutls_libs=$($pkg_config --libs gnutls)
libs_softmmu="$gnutls_libs $libs_softmmu"
libs_tools="$gnutls_libs $libs_tools"
QEMU_CFLAGS="$QEMU_CFLAGS $gnutls_cflags"
gnutls="yes"
elif test "$gnutls" = "yes"; then
feature_not_found "gnutls" "Install gnutls devel >= 3.1.18"
gnutls="no"
# If user didn't give a --disable/enable-gcrypt flag,
# then mark as disabled if user requested nettle
# explicitly
if test -z "$gcrypt"
if test "$nettle" = "yes"
gcrypt="no"
# If user didn't give a --disable/enable-nettle flag,
# then mark as disabled if user requested gcrypt
if test -z "$nettle"
if test "$gcrypt" = "yes"
nettle="no"
has_libgcrypt() {
if ! has "libgcrypt-config"
if test -n "$cross_prefix"
host=$(libgcrypt-config --host)
if test "$host-" != $cross_prefix
maj=`libgcrypt-config --version | awk -F . '{print $1}'`
min=`libgcrypt-config --version | awk -F . '{print $2}'`
if test $maj != 1 || test $min -lt 5
if test "$nettle" != "no"; then
if $pkg_config --exists "nettle >= 2.7.1"; then
nettle_cflags=$($pkg_config --cflags nettle)
nettle_libs=$($pkg_config --libs nettle)
nettle_version=$($pkg_config --modversion nettle)
libs_softmmu="$nettle_libs $libs_softmmu"
libs_tools="$nettle_libs $libs_tools"
QEMU_CFLAGS="$QEMU_CFLAGS $nettle_cflags"
nettle="yes"
if test -z "$gcrypt"; then
if test "$nettle" = "yes"; then
feature_not_found "nettle" "Install nettle devel >= 2.7.1"
if test "$gcrypt" != "no"; then
if has_libgcrypt; then
gcrypt_cflags=$(libgcrypt-config --cflags)
gcrypt_libs=$(libgcrypt-config --libs)
# Debian has remove -lgpg-error from libgcrypt-config
# as it "spreads unnecessary dependencies" which in
# turn breaks static builds...
if test "$static" = "yes"
gcrypt_libs="$gcrypt_libs -lgpg-error"
libs_softmmu="$gcrypt_libs $libs_softmmu"
libs_tools="$gcrypt_libs $libs_tools"
QEMU_CFLAGS="$QEMU_CFLAGS $gcrypt_cflags"
gcrypt="yes"
#include <gcrypt.h>
gcry_mac_hd_t handle;
gcry_mac_open(&handle, GCRY_MAC_HMAC_MD5,
GCRY_MAC_FLAG_SECURE, NULL);
if compile_prog "$gcrypt_cflags" "$gcrypt_libs" ; then
gcrypt_hmac=yes
if test "$gcrypt" = "yes"; then
feature_not_found "gcrypt" "Install gcrypt devel >= 1.5.0"
if test "$gcrypt" = "yes" && test "$nettle" = "yes"
error_exit "Only one of gcrypt & nettle can be enabled"
# libtasn1 - only for the TLS creds/session test suite
tasn1=yes
tasn1_cflags=""
tasn1_libs=""
if $pkg_config --exists "libtasn1"; then
tasn1_cflags=$($pkg_config --cflags libtasn1)
tasn1_libs=$($pkg_config --libs libtasn1)
tasn1=no
# getifaddrs (for tests/test-io-channel-socket )
have_ifaddrs_h=yes
if ! check_include "ifaddrs.h" ; then
have_ifaddrs_h=no
# VTE probe
if test "$vte" != "no"; then
vteminversion="0.32.0"
if $pkg_config --exists "vte-2.91"; then
vtepackage="vte-2.91"
vtepackage="vte-2.90"
if $pkg_config --exists "$vtepackage >= $vteminversion"; then
vte_cflags=$($pkg_config --cflags $vtepackage)
vte_libs=$($pkg_config --libs $vtepackage)
vteversion=$($pkg_config --modversion $vtepackage)
vte="yes"
elif test "$vte" = "yes"; then
feature_not_found "vte" "Install libvte-2.90/2.91 devel"
vte="no"
# SDL probe
# Look for sdl configuration program (pkg-config or sdl-config). Try
# sdl-config even without cross prefix, and favour pkg-config over sdl-config.
sdl_probe ()
sdl_too_old=no
if test "$sdlabi" = ""; then
if $pkg_config --exists "sdl2"; then
sdlabi=2.0
elif $pkg_config --exists "sdl"; then
sdlabi=1.2
if test $sdlabi = "2.0"; then
sdl_config=$sdl2_config
sdlname=sdl2
sdlconfigname=sdl2_config
elif test $sdlabi = "1.2"; then
sdlname=sdl
sdlconfigname=sdl_config
error_exit "Unknown sdlabi $sdlabi, must be 1.2 or 2.0"
if test "$(basename $sdl_config)" != $sdlconfigname && ! has ${sdl_config}; then
sdl_config=$sdlconfigname
if $pkg_config $sdlname --exists; then
sdlconfig="$pkg_config $sdlname"
sdlversion=$($sdlconfig --modversion 2>/dev/null)
elif has ${sdl_config}; then
sdlconfig="$sdl_config"
sdlversion=$($sdlconfig --version)
if test "$sdl" = "yes" ; then
feature_not_found "sdl" "Install SDL2-devel"
# no need to do the rest
return
if test -n "$cross_prefix" && test "$(basename "$sdlconfig")" = sdl-config; then
echo warning: using "\"$sdlconfig\"" to detect cross-compiled sdl >&2
#include <SDL.h>
#undef main /* We don't want SDL to override our main() */
int main( void ) { return SDL_Init (SDL_INIT_VIDEO); }
sdl_cflags=$($sdlconfig --cflags 2>/dev/null)
sdl_cflags="$sdl_cflags -Wno-undef" # workaround 2.0.8 bug
sdl_libs=$($pkg_config $sdlname --static --libs 2>/dev/null)
sdl_libs=$($sdlconfig --static-libs 2>/dev/null)
sdl_libs=$($sdlconfig --libs 2>/dev/null)
if compile_prog "$sdl_cflags" "$sdl_libs" ; then
if test $(echo $sdlversion | sed 's/[^0-9]//g') -lt 121 ; then
sdl_too_old=yes
sdl=yes
# static link with sdl ? (note: sdl.pc's --static --libs is broken)
if test "$sdl" = "yes" -a "$static" = "yes" ; then
if test $? = 0 && echo $sdl_libs | grep -- -laa > /dev/null; then
sdl_libs="$sdl_libs $(aalib-config --static-libs 2>/dev/null)"
sdl_cflags="$sdl_cflags $(aalib-config --cflags 2>/dev/null)"
fi # static link
else # sdl not found
feature_not_found "sdl" "Install SDL devel"
fi # sdl compile test
if test "$sdl" != "no" ; then
sdl_probe
#if defined(SDL_VIDEO_DRIVER_X11)
#include <X11/XKBlib.h>
#error No x11 support
if compile_prog "$sdl_cflags $x11_cflags" "$sdl_libs $x11_libs" ; then
sdl_cflags="$sdl_cflags $x11_cflags"
sdl_libs="$sdl_libs $x11_libs"
# RDMA needs OpenFabrics libraries
if test "$rdma" != "no" ; then
#include <rdma/rdma_cma.h>
rdma_libs="-lrdmacm -libverbs -libumad"
if compile_prog "" "$rdma_libs" ; then
rdma="yes"
libs_softmmu="$libs_softmmu $rdma_libs"
if test "$rdma" = "yes" ; then
error_exit \
" OpenFabrics librdmacm/libibverbs/libibumad not present." \
" Your options:" \
" (1) Fast: Install infiniband packages (devel) from your distro." \
" (2) Cleanest: Install libraries from www.openfabrics.org" \
" (3) Also: Install softiwarp if you don't have RDMA hardware"
rdma="no"
# PVRDMA detection
#include <sys/mman.h>
int
main(void)
char buf = 0;
void *addr = &buf;
addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
case "$pvrdma" in
"")
if compile_prog "" ""; then
pvrdma="yes"
pvrdma="no"
"yes")
if ! compile_prog "" ""; then
error_exit "PVRDMA is not supported since mremap is not implemented"
"no")
if test "$pvrdma" = "yes" ; then
error_exit "PVRDMA requires rdma suppport"
# VNC SASL detection
if test "$vnc" = "yes" -a "$vnc_sasl" != "no" ; then
#include <sasl/sasl.h>
int main(void) { sasl_server_init(NULL, "qemu"); return 0; }
# Assuming Cyrus-SASL installed in /usr prefix
vnc_sasl_cflags=""
vnc_sasl_libs="-lsasl2"
if compile_prog "$vnc_sasl_cflags" "$vnc_sasl_libs" ; then
vnc_sasl=yes
libs_softmmu="$vnc_sasl_libs $libs_softmmu"
QEMU_CFLAGS="$QEMU_CFLAGS $vnc_sasl_cflags"
if test "$vnc_sasl" = "yes" ; then
feature_not_found "vnc-sasl" "Install Cyrus SASL devel"
vnc_sasl=no
# VNC JPEG detection
if test "$vnc" = "yes" -a "$vnc_jpeg" != "no" ; then
#include <jpeglib.h>
int main(void) { struct jpeg_compress_struct s; jpeg_create_compress(&s); return 0; }
vnc_jpeg_cflags=""
vnc_jpeg_libs="-ljpeg"
if compile_prog "$vnc_jpeg_cflags" "$vnc_jpeg_libs" ; then
vnc_jpeg=yes
libs_softmmu="$vnc_jpeg_libs $libs_softmmu"
QEMU_CFLAGS="$QEMU_CFLAGS $vnc_jpeg_cflags"
if test "$vnc_jpeg" = "yes" ; then
feature_not_found "vnc-jpeg" "Install libjpeg-turbo devel"
vnc_jpeg=no
# VNC PNG detection
if test "$vnc" = "yes" -a "$vnc_png" != "no" ; then
//#include <stdio.h>
#include <png.h>
#include <stddef.h>
png_structp png_ptr;
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
return png_ptr != 0;
if $pkg_config libpng --exists; then
vnc_png_cflags=$($pkg_config libpng --cflags)
vnc_png_libs=$($pkg_config libpng --libs)
vnc_png_cflags=""
vnc_png_libs="-lpng"
if compile_prog "$vnc_png_cflags" "$vnc_png_libs" ; then
vnc_png=yes
libs_softmmu="$vnc_png_libs $libs_softmmu"
QEMU_CFLAGS="$QEMU_CFLAGS $vnc_png_cflags"
if test "$vnc_png" = "yes" ; then
feature_not_found "vnc-png" "Install libpng devel"
vnc_png=no
# xkbcommon probe
if test "$xkbcommon" != "no" ; then
if $pkg_config xkbcommon --exists; then
xkbcommon_cflags=$($pkg_config xkbcommon --cflags)
xkbcommon_libs=$($pkg_config xkbcommon --libs)
xkbcommon=yes
if test "$xkbcommon" = "yes" ; then
feature_not_found "xkbcommon" "Install libxkbcommon-devel"
xkbcommon=no
# fnmatch() probe, used for ACL routines
fnmatch="no"
#include <fnmatch.h>
fnmatch("foo", "foo", 0);
fnmatch="yes"
# xfsctl() probe, used for file-posix.c
if test "$xfs" != "no" ; then
#include <stddef.h> /* NULL */
#include <xfs/xfs.h>
xfsctl(NULL, 0, 0, NULL);
xfs="yes"
if test "$xfs" = "yes" ; then
feature_not_found "xfs" "Instal xfsprogs/xfslibs devel"
xfs=no
# vde libraries probe
if test "$vde" != "no" ; then
vde_libs="-lvdeplug"
#include <libvdeplug.h>
struct vde_open_args a = {0, 0, 0};
char s[] = "";
vde_open(s, s, &a);
if compile_prog "" "$vde_libs" ; then
vde=yes
if test "$vde" = "yes" ; then
feature_not_found "vde" "Install vde (Virtual Distributed Ethernet) devel"
vde=no
# netmap support probe
# Apart from looking for netmap headers, we make sure that the host API version
# supports the netmap backend (>=11). The upper bound (15) is meant to simulate
# a minor/major version number. Minor new features will be marked with values up
# to 15, and if something happens that requires a change to the backend we will
# move above 15, submit the backend fixes and modify this two bounds.
if test "$netmap" != "no" ; then
#include <inttypes.h>
#include <net/if.h>
#include <net/netmap.h>
#include <net/netmap_user.h>
#if (NETMAP_API < 11) || (NETMAP_API > 15)
#error
netmap=yes
if test "$netmap" = "yes" ; then
feature_not_found "netmap"
netmap=no
# libcap-ng library probe
if test "$cap_ng" != "no" ; then
cap_libs="-lcap-ng"
#include <cap-ng.h>
capng_capability_to_name(CAPNG_EFFECTIVE);
if compile_prog "" "$cap_libs" ; then
cap_ng=yes
libs_tools="$cap_libs $libs_tools"
if test "$cap_ng" = "yes" ; then
feature_not_found "cap_ng" "Install libcap-ng devel"
cap_ng=no
# Sound support libraries probe
audio_drv_probe()
drv=$1
hdr=$2
lib=$3
exp=$4
cfl=$5
#include <$hdr>
int main(void) { $exp }
if compile_prog "$cfl" "$lib" ; then
error_exit "$drv check failed" \
"Make sure to have the $drv libs and headers installed."
audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g')
for drv in $audio_drv_list; do
case $drv in
alsa)
audio_drv_probe $drv alsa/asoundlib.h -lasound \
"return snd_pcm_close((snd_pcm_t *)0);"
alsa_libs="-lasound"
pa)
audio_drv_probe $drv pulse/pulseaudio.h "-lpulse" \
"pa_context_set_source_output_volume(NULL, 0, NULL, NULL, NULL); return 0;"
pulse_libs="-lpulse"
audio_pt_int="yes"
sdl)
if test "$sdl" = "no"; then
error_exit "sdl not found or disabled, can not use sdl audio driver"
coreaudio)
coreaudio_libs="-framework CoreAudio"
dsound)
dsound_libs="-lole32 -ldxguid"
audio_win_int="yes"
oss)
oss_libs="$oss_lib"
wav)
# XXX: Probes for CoreAudio, DirectSound
echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
error_exit "Unknown driver '$drv' selected" \
"Possible drivers are: $audio_possible_drivers"
# BrlAPI probe
if test "$brlapi" != "no" ; then
brlapi_libs="-lbrlapi"
#include <brlapi.h>
int main( void ) { return brlapi__openConnection (NULL, NULL, NULL); }
if compile_prog "" "$brlapi_libs" ; then
brlapi=yes
if test "$brlapi" = "yes" ; then
feature_not_found "brlapi" "Install brlapi devel"
brlapi=no
# curses probe
if test "$curses" != "no" ; then
curses_inc_list="$($pkg_config --cflags ncurses 2>/dev/null):"
curses_lib_list="$($pkg_config --libs ncurses 2>/dev/null):-lpdcurses"
curses_inc_list="$($pkg_config --cflags ncursesw 2>/dev/null):-I/usr/include/ncursesw:"
curses_lib_list="$($pkg_config --libs ncursesw 2>/dev/null):-lncursesw:-lcursesw"
curses_found=no
#include <locale.h>
#include <curses.h>
#include <wchar.h>
wchar_t wch = L'w';
setlocale(LC_ALL, "");
resize_term(0, 0);
addwstr(L"wide chars\n");
addnwstr(&wch, 1);
add_wch(WACS_DEGREE);
for curses_inc in $curses_inc_list; do
# Make sure we get the wide character prototypes
curses_inc="-DNCURSES_WIDECHAR $curses_inc"
for curses_lib in $curses_lib_list; do
unset IFS
if compile_prog "$curses_inc" "$curses_lib" ; then
curses_found=yes
if test "$curses_found" = yes ; then
if test "$curses_found" = "yes" ; then
curses=yes
if test "$curses" = "yes" ; then
feature_not_found "curses" "Install ncurses devel"
curses=no
# curl probe
if test "$curl" != "no" ; then
if $pkg_config libcurl --exists; then
curlconfig="$pkg_config libcurl"
curlconfig=curl-config
#include <curl/curl.h>
int main(void) { curl_easy_init(); curl_multi_setopt(0, 0, 0); return 0; }
curl_cflags=$($curlconfig --cflags 2>/dev/null)
curl_libs=$($curlconfig --libs 2>/dev/null)
if compile_prog "$curl_cflags" "$curl_libs" ; then
curl=yes
if test "$curl" = "yes" ; then
feature_not_found "curl" "Install libcurl devel"
curl=no
fi # test "$curl"
# bluez support probe
if test "$bluez" != "no" ; then
#include <bluetooth/bluetooth.h>
int main(void) { return bt_error(0); }
bluez_cflags=$($pkg_config --cflags bluez 2>/dev/null)
bluez_libs=$($pkg_config --libs bluez 2>/dev/null)
if compile_prog "$bluez_cflags" "$bluez_libs" ; then
bluez=yes
libs_softmmu="$bluez_libs $libs_softmmu"
if test "$bluez" = "yes" ; then
feature_not_found "bluez" "Install bluez-libs/libbluetooth devel"
bluez="no"
# glib support probe
glib_req_ver=2.40
glib_modules=gthread-2.0
if test "$modules" = yes; then
glib_modules="$glib_modules gmodule-export-2.0"
# This workaround is required due to a bug in pkg-config file for glib as it
# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
if test "$static" = yes -a "$mingw32" = yes; then
QEMU_CFLAGS="-DGLIB_STATIC_COMPILATION $QEMU_CFLAGS"
for i in $glib_modules; do
if $pkg_config --atleast-version=$glib_req_ver $i; then
glib_cflags=$($pkg_config --cflags $i)
glib_libs=$($pkg_config --libs $i)
QEMU_CFLAGS="$glib_cflags $QEMU_CFLAGS"
LIBS="$glib_libs $LIBS"
libs_qga="$glib_libs $libs_qga"
error_exit "glib-$glib_req_ver $i is required to compile QEMU"
# Sanity check that the current size_t matches the
# size that glib thinks it should be. This catches
# problems on multi-arch where people try to build
# 32-bit QEMU while pointing at 64-bit glib headers
#include <glib.h>
#define QEMU_BUILD_BUG_ON(x) \
typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
if ! compile_prog "$CFLAGS" "$LIBS" ; then
error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
"You probably need to set PKG_CONFIG_LIBDIR"\
"to point to the right pkg-config files for your"\
"build target"
# Silence clang 3.5.0 warnings about glib attribute __alloc_size__ usage
if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
if cc_has_warning_flag "-Wno-unknown-attributes"; then
glib_cflags="-Wno-unknown-attributes $glib_cflags"
CFLAGS="-Wno-unknown-attributes $CFLAGS"
# zlib check
if test "$zlib" != "no" ; then
if $pkg_config --exists zlib; then
zlib_cflags=$($pkg_config --cflags zlib)
zlib_libs=$($pkg_config --libs zlib)
QEMU_CFLAGS="$zlib_cflags $QEMU_CFLAGS"
LIBS="$zlib_libs $LIBS"
#include <zlib.h>
int main(void) { zlibVersion(); return 0; }
if compile_prog "" "-lz" ; then
LIBS="$LIBS -lz"
error_exit "zlib check failed" \
"Make sure to have the zlib libs and headers installed."
# SHA command probe for modules
shacmd_probe="sha1sum sha1 shasum"
for c in $shacmd_probe; do
if has $c; then
shacmd="$c"
if test "$shacmd" = ""; then
error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
# pixman support probe
if test "$want_tools" = "no" -a "$softmmu" = "no"; then
pixman_cflags=
pixman_libs=
elif $pkg_config --atleast-version=0.21.8 pixman-1 > /dev/null 2>&1; then
pixman_cflags=$($pkg_config --cflags pixman-1)
pixman_libs=$($pkg_config --libs pixman-1)
error_exit "pixman >= 0.21.8 not present." \
"Please install the pixman devel package."
# libmpathpersist probe
if test "$mpath" != "no" ; then
# probe for the new API
#include <libudev.h>
#include <mpath_persist.h>
unsigned mpath_mx_alloc_len = 1024;
int logsink;
static struct config *multipath_conf;
extern struct udev *udev;
extern struct config *get_multipath_config(void);
extern void put_multipath_config(struct config *conf);
struct udev *udev;
struct config *get_multipath_config(void) { return multipath_conf; }
void put_multipath_config(struct config *conf) { }
udev = udev_new();
multipath_conf = mpath_lib_init();
if compile_prog "" "-ludev -lmultipath -lmpathpersist" ; then
mpathpersist=yes
mpathpersist_new_api=yes
# probe for the old API
struct udev *udev = udev_new();
mpath_lib_init(udev);
mpathpersist_new_api=no
mpathpersist=no
# libcap probe
if test "$cap" != "no" ; then
#include <sys/capability.h>
int main(void) { cap_t caps; caps = cap_init(); return caps != NULL; }
if compile_prog "" "-lcap" ; then
cap=yes
cap=no
# pthread probe
PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
pthread=no
#include <pthread.h>
static void *f(void *p) { return NULL; }
pthread_t thread;
pthread_create(&thread, 0, f, 0);
pthread=yes
for pthread_lib in $PTHREADLIBS_LIST; do
if compile_prog "" "$pthread_lib" ; then
found=no
for lib_entry in $LIBS; do
if test "$lib_entry" = "$pthread_lib"; then
found=yes
if test "$found" = "no"; then
LIBS="$pthread_lib $LIBS"
libs_qga="$pthread_lib $libs_qga"
PTHREAD_LIB="$pthread_lib"
if test "$mingw32" != yes -a "$pthread" = no; then
error_exit "pthread check failed" \
"Make sure to have the pthread libs and headers installed."
# check for pthread_setname_np
pthread_setname_np=no
pthread_setname_np(thread, "QEMU");
pthread_setname_np=yes
# rbd probe
if test "$rbd" != "no" ; then
#include <rbd/librbd.h>
rados_t cluster;
rados_create(&cluster, NULL);
rbd_libs="-lrbd -lrados"
if compile_prog "" "$rbd_libs" ; then
rbd=yes
if test "$rbd" = "yes" ; then
feature_not_found "rados block device" "Install librbd/ceph devel"
rbd=no
# libssh2 probe
min_libssh2_version=1.2.8
if test "$libssh2" != "no" ; then
if $pkg_config --atleast-version=$min_libssh2_version libssh2; then
libssh2_cflags=$($pkg_config libssh2 --cflags)
libssh2_libs=$($pkg_config libssh2 --libs)
libssh2=yes
if test "$libssh2" = "yes" ; then
error_exit "libssh2 >= $min_libssh2_version required for --enable-libssh2"
libssh2=no
# libssh2_sftp_fsync probe
if test "$libssh2" = "yes"; then
#include <libssh2.h>
#include <libssh2_sftp.h>
LIBSSH2_SESSION *session;
LIBSSH2_SFTP *sftp;
LIBSSH2_SFTP_HANDLE *sftp_handle;
session = libssh2_session_init ();
sftp = libssh2_sftp_init (session);
sftp_handle = libssh2_sftp_open (sftp, "/", 0, 0);
libssh2_sftp_fsync (sftp_handle);
# libssh2_cflags/libssh2_libs defined in previous test.
if compile_prog "$libssh2_cflags" "$libssh2_libs" ; then
QEMU_CFLAGS="-DHAS_LIBSSH2_SFTP_FSYNC $QEMU_CFLAGS"
# linux-aio probe
if test "$linux_aio" != "no" ; then
#include <libaio.h>
#include <sys/eventfd.h>
int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
if compile_prog "" "-laio" ; then
linux_aio=yes
if test "$linux_aio" = "yes" ; then
feature_not_found "linux AIO" "Install libaio devel"
linux_aio=no
# TPM passthrough is only on x86 Linux
if test "$targetos" = Linux && test "$cpu" = i386 -o "$cpu" = x86_64; then
tpm_passthrough=$tpm
tpm_passthrough=no
# TPM emulator is for all posix systems
if test "$mingw32" != "yes"; then
tpm_emulator=$tpm
tpm_emulator=no
# attr probe
if test "$attr" != "no" ; then
#include <sys/types.h>
#ifdef CONFIG_LIBATTR
#include <attr/xattr.h>
#include <sys/xattr.h>
int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }
attr=yes
# Older distros have <attr/xattr.h>, and need -lattr:
elif compile_prog "-DCONFIG_LIBATTR" "-lattr" ; then
LIBS="-lattr $LIBS"
libattr=yes
if test "$attr" = "yes" ; then
feature_not_found "ATTR" "Install libc6 or libattr devel"
attr=no
# iovec probe
#include <sys/uio.h>
int main(void) { return sizeof(struct iovec); }
iovec=no
iovec=yes
# preadv probe
int main(void) { return preadv(0, 0, 0, 0); }
preadv=no
preadv=yes
# fdt probe
# fdt support is mandatory for at least some target architectures,
# so insist on it if we're building those system emulators.
fdt_required=no
case $target in
aarch64*-softmmu|arm*-softmmu|ppc*-softmmu|microblaze*-softmmu|mips64el-softmmu|riscv*-softmmu)
fdt_required=yes
if test "$fdt_required" = "yes"; then
if test "$fdt" = "no"; then
error_exit "fdt disabled but some requested targets require it." \
"You can turn off fdt only if you also disable all the system emulation" \
"targets which need it (by specifying a cut down --target-list)."
fdt=yes
if test "$fdt" != "no" ; then
fdt_libs="-lfdt"
# explicitly check for libfdt_env.h as it is missing in some stable installs
# and test for required functions to make sure we are on a version >= 1.4.2
#include <libfdt.h>
#include <libfdt_env.h>
int main(void) { fdt_first_subnode(0, 0); return 0; }
if compile_prog "" "$fdt_libs" ; then
# system DTC is good - use it
fdt=system
# have GIT checkout, so activate dtc submodule
if test -e "${source_path}/.git" ; then
git_submodules="${git_submodules} dtc"
if test -d "${source_path}/dtc/libfdt" || test -e "${source_path}/.git" ; then
fdt=git
mkdir -p dtc
if [ "$pwd_is_source_path" != "y" ] ; then
symlink "$source_path/dtc/Makefile" "dtc/Makefile"
symlink "$source_path/dtc/scripts" "dtc/scripts"
fdt_cflags="-I\$(SRC_PATH)/dtc/libfdt"
fdt_ldflags="-L\$(BUILD_DIR)/dtc/libfdt"
fdt_libs="$fdt_libs"
elif test "$fdt" = "yes" ; then
# Not a git build & no libfdt found, prompt for system install
error_exit "DTC (libfdt) version >= 1.4.2 not present." \
"Please install the DTC (libfdt) devel package"
# don't have and don't want
fdt_libs=
fdt=no
libs_softmmu="$libs_softmmu $fdt_libs"
# opengl probe (for sdl2, gtk, milkymist-tmu2)
if test "$opengl" != "no" ; then
opengl_pkgs="epoxy gbm"
if $pkg_config $opengl_pkgs; then
opengl_cflags="$($pkg_config --cflags $opengl_pkgs)"
opengl_libs="$($pkg_config --libs $opengl_pkgs)"
opengl=yes
if test "$gtk" = "yes" && $pkg_config --exists "$gtkpackage >= 3.16"; then
gtk_gl="yes"
QEMU_CFLAGS="$QEMU_CFLAGS $opengl_cflags"
if test "$opengl" = "yes" ; then
feature_not_found "opengl" "Please install opengl (mesa) devel pkgs: $opengl_pkgs"
opengl_cflags=""
opengl_libs=""
opengl=no
if test "$opengl" = "yes"; then
#include <epoxy/egl.h>
#ifndef EGL_MESA_image_dma_buf_export
# error mesa/epoxy lacks support for dmabufs (mesa 10.6+)
opengl_dmabuf=yes
# libxml2 probe
if test "$libxml2" != "no" ; then
if $pkg_config --exists libxml-2.0; then
libxml2="yes"
libxml2_cflags=$($pkg_config --cflags libxml-2.0)
libxml2_libs=$($pkg_config --libs libxml-2.0)
if test "$libxml2" = "yes"; then
feature_not_found "libxml2" "Install libxml2 devel"
libxml2="no"
# glusterfs probe
if test "$glusterfs" != "no" ; then
if $pkg_config --atleast-version=3 glusterfs-api; then
glusterfs="yes"
glusterfs_cflags=$($pkg_config --cflags glusterfs-api)
glusterfs_libs=$($pkg_config --libs glusterfs-api)
if $pkg_config --atleast-version=4 glusterfs-api; then
glusterfs_xlator_opt="yes"
if $pkg_config --atleast-version=5 glusterfs-api; then
glusterfs_discard="yes"
if $pkg_config --atleast-version=6 glusterfs-api; then
glusterfs_fallocate="yes"
glusterfs_zerofill="yes"
if test "$glusterfs" = "yes" ; then
feature_not_found "GlusterFS backend support" \
"Install glusterfs-api devel >= 3"
glusterfs="no"
# Check for inotify functions when we are building linux-user
# emulator. This is done because older glibc versions don't
# have syscall stubs for these implemented. In that case we
# don't provide them even if kernel supports them.
inotify=no
#include <sys/inotify.h>
/* try to start inotify */
return inotify_init();
inotify=yes
inotify1=no
return inotify_init1(0);
inotify1=yes
# check if pipe2 is there
pipe2=no
#include <fcntl.h>
int pipefd[2];
return pipe2(pipefd, O_CLOEXEC);
pipe2=yes
# check if accept4 is there
accept4=no
accept4(0, NULL, NULL, SOCK_CLOEXEC);
accept4=yes
# check if tee/splice is there. vmsplice was added same time.
splice=no
#include <limits.h>
int len, fd = 0;
len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
splice=yes
# libnuma probe
if test "$numa" != "no" ; then
#include <numa.h>
int main(void) { return numa_available(); }
if compile_prog "" "-lnuma" ; then
numa=yes
libs_softmmu="-lnuma $libs_softmmu"
if test "$numa" = "yes" ; then
feature_not_found "numa" "install numactl devel"
numa=no
if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
# Even if malloc_trim() is available, these non-libc memory allocators
# do not support it.
if test "$tcmalloc" = "yes" || test "$jemalloc" = "yes" ; then
if test "$malloc_trim" = "yes" ; then
echo "Disabling malloc_trim with non-libc memory allocator"
malloc_trim="no"
#######################################
# malloc_trim
if test "$malloc_trim" != "no" ; then
#include <malloc.h>
int main(void) { malloc_trim(0); return 0; }
malloc_trim="yes"
# tcmalloc probe
if test "$tcmalloc" = "yes" ; then
#include <stdlib.h>
int main(void) { malloc(1); return 0; }
if compile_prog "" "-ltcmalloc" ; then
LIBS="-ltcmalloc $LIBS"
feature_not_found "tcmalloc" "install gperftools devel"
# jemalloc probe
if test "$jemalloc" = "yes" ; then
if compile_prog "" "-ljemalloc" ; then
LIBS="-ljemalloc $LIBS"
feature_not_found "jemalloc" "install jemalloc devel"
# signalfd probe
signalfd="no"
#include <sys/syscall.h>
#include <signal.h>
int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }
signalfd=yes
# check if eventfd is supported
eventfd=no
return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
eventfd=yes
# check if memfd is supported
memfd=no
return memfd_create("foo", MFD_ALLOW_SEALING);
memfd=yes
# check for usbfs
have_usbfs=no
if check_include linux/usbdevice_fs.h; then
have_usbfs=yes
# check for fallocate
fallocate=no
fallocate(0, 0, 0, 0);
fallocate=yes
# check for fallocate hole punching
fallocate_punch_hole=no
#include <linux/falloc.h>
fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
fallocate_punch_hole=yes
# check that fallocate supports range zeroing inside the file
fallocate_zero_range=no
fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0);
fallocate_zero_range=yes
# check for posix_fallocate
posix_fallocate=no
posix_fallocate(0, 0, 0);
posix_fallocate=yes
# check for sync_file_range
sync_file_range=no
sync_file_range(0, 0, 0, 0);
sync_file_range=yes
# check for linux/fiemap.h and FS_IOC_FIEMAP
fiemap=no
#include <sys/ioctl.h>
#include <linux/fs.h>
#include <linux/fiemap.h>
ioctl(0, FS_IOC_FIEMAP, 0);
fiemap=yes
# check for dup3
dup3=no
dup3(0, 0, 0);
dup3=yes
# check for ppoll support
ppoll=no
#include <poll.h>
struct pollfd pfd = { .fd = 0, .events = 0, .revents = 0 };
ppoll(&pfd, 1, 0, 0);
ppoll=yes
# check for prctl(PR_SET_TIMERSLACK , ... ) support
prctl_pr_set_timerslack=no
#include <sys/prctl.h>
prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0);
prctl_pr_set_timerslack=yes
# check for epoll support
epoll=no
#include <sys/epoll.h>
epoll_create(0);
epoll=yes
# epoll_create1 is a later addition
# so we must check separately for its presence
epoll_create1=no
/* Note that we use epoll_create1 as a value, not as
* a function being called. This is necessary so that on
* old SPARC glibc versions where the function was present in
* the library but not declared in the header file we will
* fail the configure check. (Otherwise we will get a compiler
* warning but not an error, and will proceed to fail the
* qemu compile where we compile with -Werror.)
return (int)(uintptr_t)&epoll_create1;
epoll_create1=yes
# check for sendfile support
sendfile=no
#include <sys/sendfile.h>
return sendfile(0, 0, 0, 0);
sendfile=yes
# check for timerfd support (glibc 2.8 and newer)
timerfd=no
#include <sys/timerfd.h>
return(timerfd_create(CLOCK_REALTIME, 0));
timerfd=yes
# check for setns and unshare support
setns=no
int ret;
ret = setns(0, 0);
ret = unshare(0);
return ret;
setns=yes
# clock_adjtime probe
clock_adjtime=no
return clock_adjtime(0, 0);
clock_adjtime=yes
# syncfs probe
syncfs=no
return syncfs(0);
syncfs=yes
# Check if tools are available to build documentation.
if test "$docs" != "no" ; then
if has makeinfo && has pod2man; then
docs=yes
if test "$docs" = "yes" ; then
feature_not_found "docs" "Install texinfo and Perl/perl-podlators"
docs=no
# Search for bswap_32 function
byteswap_h=no
#include <byteswap.h>
int main(void) { return bswap_32(0); }
byteswap_h=yes
# Search for bswap32 function
bswap_h=no
#include <sys/endian.h>
#include <machine/bswap.h>
int main(void) { return bswap32(0); }
bswap_h=yes
# Do we have libiscsi >= 1.9.0
if test "$libiscsi" != "no" ; then
if $pkg_config --atleast-version=1.9.0 libiscsi; then
libiscsi="yes"
libiscsi_cflags=$($pkg_config --cflags libiscsi)
libiscsi_libs=$($pkg_config --libs libiscsi)
if test "$libiscsi" = "yes" ; then
feature_not_found "libiscsi" "Install libiscsi >= 1.9.0"
libiscsi="no"
# Do we need libm
#include <math.h>
int main(int argc, char **argv) { return isnan(sin((double)argc)); }
elif compile_prog "" "-lm" ; then
LIBS="-lm $LIBS"
libs_qga="-lm $libs_qga"
error_exit "libm check failed"
# Do we need librt
# uClibc provides 2 versions of clock_gettime(), one with realtime
# support and one without. This means that the clock_gettime() don't
# need -lrt. We still need it for timer_create() so we check for this
# function in addition.
timer_create(CLOCK_REALTIME, NULL, NULL);
return clock_gettime(CLOCK_REALTIME, NULL);
# we need pthread for static linking. use previous pthread test result
elif compile_prog "" "$pthread_lib -lrt" ; then
LIBS="$LIBS -lrt"
libs_qga="$libs_qga -lrt"
if test "$darwin" != "yes" -a "$mingw32" != "yes" -a "$solaris" != yes -a \
"$haiku" != "yes" ; then
libs_softmmu="-lutil $libs_softmmu"
# spice probe
if test "$spice" != "no" ; then
#include <spice.h>
int main(void) { spice_server_new(); return 0; }
spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
if $pkg_config --atleast-version=0.12.0 spice-server && \
$pkg_config --atleast-version=0.12.3 spice-protocol && \
compile_prog "$spice_cflags" "$spice_libs" ; then
spice="yes"
libs_softmmu="$libs_softmmu $spice_libs"
QEMU_CFLAGS="$QEMU_CFLAGS $spice_cflags"
spice_protocol_version=$($pkg_config --modversion spice-protocol)
spice_server_version=$($pkg_config --modversion spice-server)
if test "$spice" = "yes" ; then
feature_not_found "spice" \
"Install spice-server(>=0.12.0) and spice-protocol(>=0.12.3) devel"
spice="no"
# check for smartcard support
if test "$smartcard" != "no"; then
if $pkg_config --atleast-version=2.5.1 libcacard; then
libcacard_cflags=$($pkg_config --cflags libcacard)
libcacard_libs=$($pkg_config --libs libcacard)
smartcard="yes"
if test "$smartcard" = "yes"; then
feature_not_found "smartcard" "Install libcacard devel"
smartcard="no"
# check for libusb
if test "$libusb" != "no" ; then
if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
libusb="yes"
libusb_cflags=$($pkg_config --cflags libusb-1.0)
libusb_libs=$($pkg_config --libs libusb-1.0)
if test "$libusb" = "yes"; then
feature_not_found "libusb" "Install libusb devel >= 1.0.13"
libusb="no"
# check for usbredirparser for usb network redirection support
if test "$usb_redir" != "no" ; then
if $pkg_config --atleast-version=0.6 libusbredirparser-0.5; then
usb_redir="yes"
usb_redir_cflags=$($pkg_config --cflags libusbredirparser-0.5)
usb_redir_libs=$($pkg_config --libs libusbredirparser-0.5)
if test "$usb_redir" = "yes"; then
feature_not_found "usb-redir" "Install usbredir devel"
usb_redir="no"
# check if we have VSS SDK headers for win
if test "$mingw32" = "yes" -a "$guest_agent" != "no" -a "$vss_win32_sdk" != "no" ; then
case "$vss_win32_sdk" in
"") vss_win32_include="-isystem $source_path" ;;
*\ *) # The SDK is installed in "Program Files" by default, but we cannot
# handle path with spaces. So we symlink the headers into ".sdk/vss".
vss_win32_include="-isystem $source_path/.sdk/vss"
symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
*) vss_win32_include="-isystem $vss_win32_sdk"
#define __MIDL_user_allocate_free_DEFINED__
#include <inc/win2003/vss.h>
int main(void) { return VSS_CTX_BACKUP; }
if compile_prog "$vss_win32_include" "" ; then
guest_agent_with_vss="yes"
QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
if test "$vss_win32_sdk" != "" ; then
echo "ERROR: Please download and install Microsoft VSS SDK:"
echo "ERROR: http://www.microsoft.com/en-us/download/details.aspx?id=23490"
echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
echo "ERROR: scripts/extract-vsssdk-headers setup.exe"
echo "ERROR: The headers are extracted in the directory \`inc'."
feature_not_found "VSS support"
# lookup Windows platform SDK (if not specified)
# The SDK is needed only to build .tlb (type library) file of guest agent
# VSS provider from the source. It is usually unnecessary because the
# pre-compiled .tlb file is included.
if test "$mingw32" = "yes" -a "$guest_agent" != "no" -a "$guest_agent_with_vss" = "yes" ; then
if test -z "$win_sdk"; then
programfiles="$PROGRAMFILES"
test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
if test -n "$programfiles"; then
win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
feature_not_found "Windows SDK"
elif test "$win_sdk" = "no"; then
win_sdk=""
# check if mingw environment provides a recent ntddscsi.h
if test "$mingw32" = "yes" -a "$guest_agent" != "no"; then
#include <windows.h>
#include <ntddscsi.h>
#if !defined(IOCTL_SCSI_GET_ADDRESS)
#error Missing required ioctl definitions
SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
return addr.Lun;
guest_agent_ntddscsi=yes
libs_qga="-lsetupapi $libs_qga"
# virgl renderer probe
if test "$virglrenderer" != "no" ; then
#include <virglrenderer.h>
int main(void) { virgl_renderer_poll(); return 0; }
virgl_cflags=$($pkg_config --cflags virglrenderer 2>/dev/null)
virgl_libs=$($pkg_config --libs virglrenderer 2>/dev/null)
virgl_version=$($pkg_config --modversion virglrenderer 2>/dev/null)
if $pkg_config virglrenderer >/dev/null 2>&1 && \
compile_prog "$virgl_cflags" "$virgl_libs" ; then
virglrenderer="yes"
if test "$virglrenderer" = "yes" ; then
feature_not_found "virglrenderer"
virglrenderer="no"
# capstone
case "$capstone" in
"" | yes)
if $pkg_config capstone; then
capstone=system
elif test -e "${source_path}/.git" -a $git_update = 'yes' ; then
capstone=git
elif test -e "${source_path}/capstone/Makefile" ; then
capstone=internal
elif test -z "$capstone" ; then
capstone=no
feature_not_found "capstone" "Install capstone devel or git submodule"
system)
if ! $pkg_config capstone; then
feature_not_found "capstone" "Install capstone devel"
git | internal)
if test "$capstone" = git; then
git_submodules="${git_submodules} capstone"
mkdir -p capstone
QEMU_CFLAGS="$QEMU_CFLAGS -I\$(SRC_PATH)/capstone/include"
LIBCAPSTONE=capstone.lib
LIBCAPSTONE=libcapstone.a
LIBS="-L\$(BUILD_DIR)/capstone -lcapstone $LIBS"
QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags capstone)"
LIBS="$($pkg_config --libs capstone) $LIBS"
no)
error_exit "Unknown state for capstone: $capstone"
# check if we have fdatasync
fdatasync=no
#if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
return fdatasync(0);
#error Not supported
fdatasync=yes
# check if we have madvise
madvise=no
int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }
madvise=yes
# check if we have posix_madvise
posix_madvise=no
int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }
posix_madvise=yes
# check if we have posix_memalign()
posix_memalign=no
void *p;
return posix_memalign(&p, 8, 8);
posix_memalign=yes
# check if we have posix_syslog
posix_syslog=no
#include <syslog.h>
int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; }
posix_syslog=yes
# check if we have sem_timedwait
sem_timedwait=no
#include <semaphore.h>
int main(void) { return sem_timedwait(0, 0); }
sem_timedwait=yes
# check if we have strchrnul
strchrnul=no
#include <string.h>
int main(void);
// Use a haystack that the compiler shouldn't be able to constant fold
char *haystack = (char*)&main;
int main(void) { return strchrnul(haystack, 'x') != &haystack[6]; }
strchrnul=yes
# check if trace backend exists
$python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends > /dev/null 2> /dev/null
if test "$?" -ne 0 ; then
error_exit "invalid trace backends" \
"Please choose supported trace backends."
# For 'ust' backend, test if ust headers are present
if have_backend "ust"; then
#include <lttng/tracepoint.h>
if compile_prog "" "-Wl,--no-as-needed -ldl" ; then
if $pkg_config lttng-ust --exists; then
lttng_ust_libs=$($pkg_config --libs lttng-ust)
lttng_ust_libs="-llttng-ust -ldl"
if $pkg_config liburcu-bp --exists; then
urcu_bp_libs=$($pkg_config --libs liburcu-bp)
urcu_bp_libs="-lurcu-bp"
LIBS="$lttng_ust_libs $urcu_bp_libs $LIBS"
libs_qga="$lttng_ust_libs $urcu_bp_libs $libs_qga"
error_exit "Trace backend 'ust' missing lttng-ust header files"
# For 'dtrace' backend, test if 'dtrace' command is present
if have_backend "dtrace"; then
if ! has 'dtrace' ; then
error_exit "dtrace command is not found in PATH $PATH"
trace_backend_stap="no"
if has 'stap' ; then
trace_backend_stap="yes"
# check and set a backend for coroutine
# We prefer ucontext, but it's not always possible. The fallback
# is sigcontext. On Windows the only valid backend is the Windows
# specific one.
ucontext_works=no
if test "$darwin" != "yes"; then
#include <ucontext.h>
#ifdef __stub_makecontext
#error Ignoring glibc stub makecontext which will always fail
int main(void) { makecontext(0, 0, 0); return 0; }
ucontext_works=yes
if test "$coroutine" = ""; then
coroutine=win32
elif test "$ucontext_works" = "yes"; then
coroutine=ucontext
coroutine=sigaltstack
case $coroutine in
windows)
error_exit "'windows' coroutine backend only valid for Windows"
# Unfortunately the user visible backend name doesn't match the
# coroutine-*.c filename for this case, so we have to adjust it here.
ucontext)
if test "$ucontext_works" != "yes"; then
feature_not_found "ucontext"
sigaltstack)
error_exit "only the 'windows' coroutine backend is valid for Windows"
error_exit "unknown coroutine backend $coroutine"
if test "$coroutine_pool" = ""; then
coroutine_pool=yes
if test "$debug_stack_usage" = "yes"; then
if test "$coroutine_pool" = "yes"; then
echo "WARN: disabling coroutine pool for stack usage debugging"
coroutine_pool=no
# check if we have open_by_handle_at
open_by_handle_at=no
#if !defined(AT_EMPTY_PATH)
# error missing definition
int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
open_by_handle_at=yes
########################################
# check if we have linux/magic.h
linux_magic_h=no
#include <linux/magic.h>
linux_magic_h=yes
# check whether we can disable warning option with a pragma (this is needed
# to silence warnings in the headers of some versions of external libraries).
# This test has to be compiled with -Werror as otherwise an unknown pragma is
# only a warning.
# If we can't selectively disable warning in the code, disable -Werror so that
# the build doesn't fail anyway.
pragma_disable_unused_but_set=no
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wstrict-prototypes"
#pragma GCC diagnostic pop
if compile_prog "-Werror" "" ; then
pragma_diagnostic_available=yes
werror=no
# check if we have valgrind/valgrind.h
valgrind_h=no
#include <valgrind/valgrind.h>
valgrind_h=yes
# check if environ is declared
has_environ=no
environ = 0;
has_environ=yes
# check if cpuid.h is usable.
#include <cpuid.h>
unsigned a, b, c, d;
int max = __get_cpuid_max(0, 0);
if (max >= 1) {
__cpuid(1, a, b, c, d);
if (max >= 7) {
__cpuid_count(7, 0, a, b, c, d);
cpuid_h=yes
# avx2 optimization requirement check
# There is no point enabling this if cpuid.h is not usable,
# since we won't be able to select the new routines.
if test "$cpuid_h" = "yes" -a "$avx2_opt" != "no"; then
#pragma GCC push_options
#pragma GCC target("avx2")
#include <immintrin.h>
static int bar(void *a) {
__m256i x = *(__m256i *)a;
return _mm256_testz_si256(x, x);
int main(int argc, char *argv[]) { return bar(argv[0]); }
if compile_object "" ; then
avx2_opt="yes"
avx2_opt="no"
# check if __[u]int128_t is usable.
int128=no
__int128_t a;
__uint128_t b;
int main (void) {
a = a + b;
b = a * b;
a = a * a;
int128=yes
# See if 128-bit atomic operations are supported.
atomic128=no
if test "$int128" = "yes"; then
unsigned __int128 x = 0, y = 0;
y = __atomic_load_16(&x, 0);
__atomic_store_16(&x, y, 0);
__atomic_compare_exchange_16(&x, &y, x, 0, 0, 0);
atomic128=yes
cmpxchg128=no
if test "$int128" = yes -a "$atomic128" = no; then
__sync_val_compare_and_swap_16(&x, y, x);
cmpxchg128=yes
# See if 64-bit atomic operations are supported.
# Note that without __atomic builtins, we can only
# assume atomic loads/stores max at pointer size.
uint64_t x = 0, y = 0;
#ifdef __ATOMIC_RELAXED
y = __atomic_load_8(&x, 0);
__atomic_store_8(&x, y, 0);
__atomic_compare_exchange_8(&x, &y, x, 0, 0, 0);
__atomic_exchange_8(&x, y, 0);
__atomic_fetch_add_8(&x, y, 0);
typedef char is_host64[sizeof(void *) >= sizeof(uint64_t) ? 1 : -1];
__sync_lock_test_and_set(&x, y);
__sync_val_compare_and_swap(&x, y, 0);
__sync_fetch_and_add(&x, y);
atomic64=yes
# See if 16-byte vector operations are supported.
# Even without a vector unit the compiler may expand these.
# There is a bug in old GCC for PPC that crashes here.
# Unfortunately it's the system compiler for Centos 7.
typedef unsigned char U1 __attribute__((vector_size(16)));
typedef unsigned short U2 __attribute__((vector_size(16)));
typedef unsigned int U4 __attribute__((vector_size(16)));
typedef unsigned long long U8 __attribute__((vector_size(16)));
typedef signed char S1 __attribute__((vector_size(16)));
typedef signed short S2 __attribute__((vector_size(16)));
typedef signed int S4 __attribute__((vector_size(16)));
typedef signed long long S8 __attribute__((vector_size(16)));
static U1 a1, b1;
static U2 a2, b2;
static U4 a4, b4;
static U8 a8, b8;
static S1 c1;
static S2 c2;
static S4 c4;
static S8 c8;
static int i;
void helper(void *d, void *a, int shift, int i);
void helper(void *d, void *a, int shift, int i)
*(U1 *)(d + i) = *(U1 *)(a + i) << shift;
*(U2 *)(d + i) = *(U2 *)(a + i) << shift;
*(U4 *)(d + i) = *(U4 *)(a + i) << shift;
*(U8 *)(d + i) = *(U8 *)(a + i) << shift;
a1 += b1; a2 += b2; a4 += b4; a8 += b8;
a1 -= b1; a2 -= b2; a4 -= b4; a8 -= b8;
a1 *= b1; a2 *= b2; a4 *= b4; a8 *= b8;
a1 &= b1; a2 &= b2; a4 &= b4; a8 &= b8;
a1 |= b1; a2 |= b2; a4 |= b4; a8 |= b8;
a1 ^= b1; a2 ^= b2; a4 ^= b4; a8 ^= b8;
a1 <<= i; a2 <<= i; a4 <<= i; a8 <<= i;
a1 >>= i; a2 >>= i; a4 >>= i; a8 >>= i;
c1 >>= i; c2 >>= i; c4 >>= i; c8 >>= i;
vector16=no
vector16=yes
# check if getauxval is available.
getauxval=no
#include <sys/auxv.h>
return getauxval(AT_HWCAP) == 0;
getauxval=yes
# check if ccache is interfering with
# semantic analysis of macros
unset CCACHE_CPP2
ccache_cpp2=no
static const int Z = 1;
#define fn() ({ Z; })
#define TAUT(X) ((X) == Z)
#define PAREN(X, Y) (X == Y)
#define ID(X) (X)
int x = 0, y = 0;
x = ID(x);
x = fn();
fn();
if (PAREN(x, y)) return 0;
if (TAUT(Z)) return 0;
if ! compile_object "-Werror"; then
ccache_cpp2=yes
#################################################
# clang does not support glibc + FORTIFY_SOURCE.
if test "$fortify_source" != "no"; then
if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
fortify_source="no";
elif test -n "$cxx" && has $cxx &&
echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
fortify_source="yes"
###############################################
# Check if copy_file_range is provided by glibc
have_copy_file_range=no
copy_file_range(0, NULL, 0, NULL, 0, 0);
have_copy_file_range=yes
# check if struct fsxattr is available via linux/fs.h
have_fsxattr=no
struct fsxattr foo;
have_fsxattr=yes
# check for usable membarrier system call
if test "$membarrier" = "yes"; then
have_membarrier=no
have_membarrier=yes
elif test "$linux" = "yes" ; then
#include <linux/membarrier.h>
syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
exit(0);
if test "$have_membarrier" = "no"; then
feature_not_found "membarrier" "membarrier system call not available"
# Do not enable it by default even for Mingw32, because it doesn't
# work on Wine.
membarrier=no
# check if rtnetlink.h exists and is useful
have_rtnetlink=no
#include <linux/rtnetlink.h>
return IFLA_PROTO_DOWN;
have_rtnetlink=yes
# check for usable AF_VSOCK environment
have_af_vsock=no
#include <errno.h>
#if !defined(AF_VSOCK)
# error missing AF_VSOCK flag
#include <linux/vm_sockets.h>
int sock, ret;
struct sockaddr_vm svm;
socklen_t len = sizeof(svm);
sock = socket(AF_VSOCK, SOCK_STREAM, 0);
ret = getpeername(sock, (struct sockaddr *)&svm, &len);
if ((ret == -1) && (errno == ENOTCONN)) {
return -1;
have_af_vsock=yes
# check for usable AF_ALG environment
hava_afalg=no
#include <linux/if_alg.h>
int sock;
sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
return sock;
have_afalg=yes
if test "$crypto_afalg" = "yes"
if test "$have_afalg" != "yes"
error_exit "AF_ALG requested but could not be detected"
# Check to see if we have the Hypervisor framework
if [ "$darwin" = "yes" ] ; then
#include <Hypervisor/hv.h>
int main() { return 0;}
if ! compile_object ""; then
hvf='no'
hvf='yes'
LDFLAGS="-framework Hypervisor $LDFLAGS"
# Sparc implicitly links with --relax, which is
# incompatible with -r, so --no-relax should be
# given. It does no harm to give it on other
# platforms too.
# Note: the prototype is needed since QEMU_CFLAGS
# contains -Wmissing-prototypes
extern int foo(void);
int foo(void) { return 0; }
error_exit "Failed to compile object file for LD_REL_FLAGS test"
for i in '-Wl,-r -Wl,--no-relax' -Wl,-r -r; do
if do_cc -nostdlib $i -o $TMPMO $TMPO; then
LD_REL_FLAGS=$i
if test "$modules" = "yes" && test "$LD_REL_FLAGS" = ""; then
feature_not_found "modules" "Cannot find how to build relocatable objects"
# check for sysmacros.h
have_sysmacros=no
#include <sys/sysmacros.h>
return makedev(0, 0);
have_sysmacros=yes
# Veritas HyperScale block driver VxHS
# Check if libvxhs is installed
if test "$vxhs" != "no" ; then
#include <qnio/qnio_api.h>
void *vxhs_callback;
iio_init(QNIO_VERSION, vxhs_callback);
vxhs_libs="-lvxhs -lssl"
if compile_prog "" "$vxhs_libs" ; then
vxhs=yes
if test "$vxhs" = "yes" ; then
feature_not_found "vxhs block device" "Install libvxhs See github"
vxhs=no
# check for _Static_assert()
have_static_assert=no
_Static_assert(1, "success");
have_static_assert=yes
# check for utmpx.h, it is missing e.g. on OpenBSD
have_utmpx=no
#include <utmpx.h>
struct utmpx user_info;
have_utmpx=yes
# checks for sanitizers
have_asan=no
have_ubsan=no
have_asan_iface_h=no
have_asan_iface_fiber=no
if test "$sanitizers" = "yes" ; then
write_c_skeleton
if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
have_asan=yes
# we could use a simple skeleton for flags checks, but this also
# detect the static linking issue of ubsan, see also:
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
void *tmp = malloc(10);
return *(int *)(tmp + 2);
if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
have_ubsan=yes
if check_include "sanitizer/asan_interface.h" ; then
have_asan_iface_h=yes
#include <sanitizer/asan_interface.h>
__sanitizer_start_switch_fiber(0, 0, 0);
if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
have_asan_iface_fiber=yes
# Docker and cross-compiler support
# This is specifically for building test
# cases for foreign architectures, not
# cross-compiling QEMU itself.
if has "docker"; then
docker=$($python $source_path/tests/docker/docker.py probe)
# check for libpmem
if test "$libpmem" != "no"; then
if $pkg_config --exists "libpmem"; then
libpmem="yes"
libpmem_libs=$($pkg_config --libs libpmem)
libpmem_cflags=$($pkg_config --cflags libpmem)
libs_softmmu="$libs_softmmu $libpmem_libs"
QEMU_CFLAGS="$QEMU_CFLAGS $libpmem_cflags"
if test "$libpmem" = "yes" ; then
feature_not_found "libpmem" "Install nvml or pmdk"
libpmem="no"
# End of CC checks
# After here, no more $cc or $ld runs
if test "$gcov" = "yes" ; then
CFLAGS="-fprofile-arcs -ftest-coverage -g $CFLAGS"
LDFLAGS="-fprofile-arcs -ftest-coverage $LDFLAGS"
elif test "$fortify_source" = "yes" ; then
CFLAGS="-O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $CFLAGS"
elif test "$debug" = "no"; then
CFLAGS="-O2 $CFLAGS"
if test "$have_asan" = "yes"; then
CFLAGS="-fsanitize=address $CFLAGS"
if test "$have_asan_iface_h" = "no" ; then
echo "ASAN build enabled, but ASAN header missing." \
"Without code annotation, the report may be inferior."
elif test "$have_asan_iface_fiber" = "no" ; then
echo "ASAN build enabled, but ASAN header is too old." \
if test "$have_ubsan" = "yes"; then
CFLAGS="-fsanitize=undefined $CFLAGS"
# Do we have libnfs
if test "$libnfs" != "no" ; then
if $pkg_config --atleast-version=1.9.3 libnfs; then
libnfs="yes"
libnfs_libs=$($pkg_config --libs libnfs)
if test "$libnfs" = "yes" ; then
feature_not_found "libnfs" "Install libnfs devel >= 1.9.3"
libnfs="no"
# Do we have libudev
if test "$libudev" != "no" ; then
if $pkg_config libudev && test "$static" != "yes"; then
libudev_libs=$($pkg_config --libs libudev)
# Now we've finished running tests it's OK to add -Werror to the compiler flags
if test "$werror" = "yes"; then
QEMU_CFLAGS="-Werror $QEMU_CFLAGS"
if test "$solaris" = "no" ; then
if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
LDFLAGS="-Wl,--warn-common $LDFLAGS"
# test if pod2man has --utf8 option
if pod2man --help | grep -q utf8; then
POD2MAN="pod2man --utf8"
POD2MAN="pod2man"
# Use ASLR, no-SEH and DEP if available
for flag in --dynamicbase --no-seh --nxcompat; do
if ld_has $flag ; then
LDFLAGS="-Wl,$flag $LDFLAGS"
qemu_confdir=$sysconfdir$confsuffix
qemu_moddir=$libdir$confsuffix
qemu_datadir=$datadir$confsuffix
qemu_localedir="$datadir/locale"
# We can only support ivshmem if we have eventfd
if [ "$eventfd" = "yes" ]; then
ivshmem=yes
tools=""
if test "$want_tools" = "yes" ; then
tools="qemu-img\$(EXESUF) qemu-io\$(EXESUF) qemu-edid\$(EXESUF) $tools"
if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" ] ; then
tools="qemu-nbd\$(EXESUF) $tools"
if [ "$ivshmem" = "yes" ]; then
tools="ivshmem-client\$(EXESUF) ivshmem-server\$(EXESUF) $tools"
if [ "$posix" = "yes" ] && [ "$curl" = "yes" ]; then
tools="elf2dmp $tools"
if test "$softmmu" = yes ; then
if test "$linux" = yes; then
if test "$virtfs" != no && test "$cap" = yes && test "$attr" = yes ; then
virtfs=yes
tools="$tools fsdev/virtfs-proxy-helper\$(EXESUF)"
if test "$virtfs" = yes; then
error_exit "VirtFS requires libcap devel and libattr devel"
virtfs=no
if test "$mpath" != no && test "$mpathpersist" = yes ; then
mpath=yes
if test "$mpath" = yes; then
error_exit "Multipath requires libmpathpersist devel"
mpath=no
tools="$tools scsi/qemu-pr-helper\$(EXESUF)"
error_exit "VirtFS is supported only on Linux"
error_exit "Multipath is supported only on Linux"
if test "$xkbcommon" = "yes"; then
tools="qemu-keymap\$(EXESUF) $tools"
# Probe for guest agent support/options
if [ "$guest_agent" != "no" ]; then
if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
tools="qemu-ga $tools"
guest_agent=yes
elif [ "$guest_agent" != yes ]; then
guest_agent=no
error_exit "Guest agent is not supported on this platform"
# Guest agent Window MSI package
if test "$guest_agent" != yes; then
if test "$guest_agent_msi" = yes; then
error_exit "MSI guest agent package requires guest agent enabled"
guest_agent_msi=no
elif test "$mingw32" != "yes"; then
if test "$guest_agent_msi" = "yes"; then
error_exit "MSI guest agent package is available only for MinGW Windows cross-compilation"
elif ! has wixl; then
error_exit "MSI guest agent package requires wixl tool installed ( usually from msitools package )"
# we support qemu-ga, mingw32, and wixl: default to MSI enabled if it wasn't
# disabled explicitly
if test "$guest_agent_msi" != "no"; then
guest_agent_msi=yes
if test "$guest_agent_with_vss" = "yes"; then
QEMU_GA_MSI_WITH_VSS="-D InstallVss"
if test "$QEMU_GA_MANUFACTURER" = ""; then
QEMU_GA_MANUFACTURER=QEMU
if test "$QEMU_GA_DISTRO" = ""; then
QEMU_GA_DISTRO=Linux
if test "$QEMU_GA_VERSION" = ""; then
QEMU_GA_VERSION=$(cat $source_path/VERSION)
QEMU_GA_MSI_MINGW_DLL_PATH="-D Mingw_dlls=$($pkg_config --variable=prefix glib-2.0)/bin"
QEMU_GA_MSI_ARCH="-a x64 -D Arch=64"
QEMU_GA_MSI_ARCH="-D Arch=32"
error_exit "CPU $cpu not supported for building installation package"
# Mac OS X ships with a broken assembler
roms=
if test \( "$cpu" = "i386" -o "$cpu" = "x86_64" \) -a \
"$targetos" != "Darwin" -a "$targetos" != "SunOS" -a \
"$softmmu" = yes ; then
# Different host OS linkers have different ideas about the name of the ELF
# emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
# variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
ld_i386_emulation="$emu"
roms="optionrom"
if test "$cpu" = "ppc64" -a "$targetos" != "Darwin" ; then
roms="$roms spapr-rtas"
if test "$cpu" = "s390x" ; then
roms="$roms s390-ccw"
# Probe for the need for relocating the user-only binary.
if ( [ "$linux_user" = yes ] || [ "$bsd_user" = yes ] ) && [ "$pie" = no ]; then
textseg_addr=
arm | i386 | ppc* | s390* | sparc* | x86_64 | x32)
# ??? Rationale for choosing this address
textseg_addr=0x60000000
mips)
# A 256M aligned address, high in the address space, with enough
# room for the code_gen_buffer above it before the stack.
if [ -n "$textseg_addr" ]; then
textseg_ldflags="-Wl,-Ttext-segment=$textseg_addr"
if ! compile_prog "" "$textseg_ldflags"; then
# In case ld does not support -Ttext-segment, edit the default linker
# script via sed to set the .text start addr. This is needed on FreeBSD
# at least.
if ! $ld --verbose >/dev/null 2>&1; then
"We need to link the QEMU user mode binaries at a" \
"specific text address. Unfortunately your linker" \
"doesn't support either the -Ttext-segment option or" \
"printing the default linker script with --verbose." \
"If you don't want the user mode binaries, pass the" \
"--disable-user option to configure."
$ld --verbose | sed \
-e '1,/==================================================/d' \
-e '/==================================================/,$d' \
-e "s/[.] = [0-9a-fx]* [+] SIZEOF_HEADERS/. = $textseg_addr + SIZEOF_HEADERS/" \
-e "s/__executable_start = [0-9a-fx]*/__executable_start = $textseg_addr/" > config-host.ld
textseg_ldflags="-Wl,-T../config-host.ld"
# Check that the C++ compiler exists and works with the C compiler.
# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
if has $cxx; then
int c_function(void);
int main(void) { return c_function(); }
cat > $TMPCXX <<EOF
extern "C" {
int c_function(void) { return 42; }
update_cxxflags
if do_cxx $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $LDFLAGS; then
# C++ compiler $cxx works ok with C compiler $cc
echo "C++ compiler $cxx does not work with C compiler $cc"
echo "Disabling C++ specific optional code"
cxx=
echo "No C++ compiler available; disabling C++ specific optional code"
echo_version() {
if test "$1" = "yes" ; then
echo "($2)"
# prepend pixman and ftd flags after all config tests are done
QEMU_CFLAGS="$pixman_cflags $fdt_cflags $QEMU_CFLAGS"
QEMU_LDFLAGS="$fdt_ldflags $QEMU_LDFLAGS"
libs_softmmu="$pixman_libs $libs_softmmu"
echo "Install prefix $prefix"
echo "BIOS directory $(eval echo $qemu_datadir)"
echo "firmware path $(eval echo $firmwarepath)"
echo "binary directory $(eval echo $bindir)"
echo "library directory $(eval echo $libdir)"
echo "module directory $(eval echo $qemu_moddir)"
echo "libexec directory $(eval echo $libexecdir)"
echo "include directory $(eval echo $includedir)"
echo "config directory $(eval echo $sysconfdir)"
if test "$mingw32" = "no" ; then
echo "local state directory $(eval echo $local_statedir)"
echo "Manual directory $(eval echo $mandir)"
echo "ELF interp prefix $interp_prefix"
echo "local state directory queried at runtime"
echo "Windows SDK $win_sdk"
echo "Source path $source_path"
echo "GIT binary $git"
echo "GIT submodules $git_submodules"
echo "C compiler $cc"
echo "Host C compiler $host_cc"
echo "C++ compiler $cxx"
echo "Objective-C compiler $objcc"
echo "ARFLAGS $ARFLAGS"
echo "CFLAGS $CFLAGS"
echo "QEMU_CFLAGS $QEMU_CFLAGS"
echo "LDFLAGS $LDFLAGS"
echo "QEMU_LDFLAGS $QEMU_LDFLAGS"
echo "make $make"
echo "install $install"
echo "python $python"
if test "$slirp" = "yes" ; then
echo "smbd $smbd"
echo "module support $modules"
echo "host CPU $cpu"
echo "host big endian $bigendian"
echo "target list $target_list"
echo "gprof enabled $gprof"
echo "sparse enabled $sparse"
echo "strip binaries $strip_opt"
echo "profiler $profiler"
echo "static build $static"
if test "$darwin" = "yes" ; then
echo "Cocoa support $cocoa"
echo "SDL support $sdl $(echo_version $sdl $sdlversion)"
echo "GTK support $gtk $(echo_version $gtk $gtk_version)"
echo "GTK GL support $gtk_gl"
echo "VTE support $vte $(echo_version $vte $vteversion)"
echo "TLS priority $tls_priority"
echo "GNUTLS support $gnutls"
echo "libgcrypt $gcrypt"
echo "nettle $nettle $(echo_version $nettle $nettle_version)"
echo "libtasn1 $tasn1"
echo "curses support $curses"
echo "virgl support $virglrenderer $(echo_version $virglrenderer $virgl_version)"
echo "curl support $curl"
echo "mingw32 support $mingw32"
echo "Audio drivers $audio_drv_list"
echo "Block whitelist (rw) $block_drv_rw_whitelist"
echo "Block whitelist (ro) $block_drv_ro_whitelist"
echo "VirtFS support $virtfs"
echo "Multipath support $mpath"
echo "VNC support $vnc"
if test "$vnc" = "yes" ; then
echo "VNC SASL support $vnc_sasl"
echo "VNC JPEG support $vnc_jpeg"
echo "VNC PNG support $vnc_png"
if test -n "$sparc_cpu"; then
echo "Target Sparc Arch $sparc_cpu"
echo "xen support $xen"
echo "xen ctrl version $xen_ctrl_version"
echo "pv dom build $xen_pv_domain_build"
echo "brlapi support $brlapi"
echo "bluez support $bluez"
echo "Documentation $docs"
echo "PIE $pie"
echo "vde support $vde"
echo "netmap support $netmap"
echo "Linux AIO support $linux_aio"
echo "ATTR/XATTR support $attr"
echo "Install blobs $blobs"
echo "KVM support $kvm"
echo "HAX support $hax"
echo "HVF support $hvf"
echo "WHPX support $whpx"
echo "TCG support $tcg"
if test "$tcg" = "yes" ; then
echo "TCG debug enabled $debug_tcg"
echo "TCG interpreter $tcg_interpreter"
echo "malloc trim support $malloc_trim"
echo "RDMA support $rdma"
echo "PVRDMA support $pvrdma"
echo "fdt support $fdt"
echo "membarrier $membarrier"
echo "preadv support $preadv"
echo "fdatasync $fdatasync"
echo "madvise $madvise"
echo "posix_madvise $posix_madvise"
echo "posix_memalign $posix_memalign"
echo "libcap-ng support $cap_ng"
echo "vhost-net support $vhost_net"
echo "vhost-crypto support $vhost_crypto"
echo "vhost-scsi support $vhost_scsi"
echo "vhost-vsock support $vhost_vsock"
echo "vhost-user support $vhost_user"
echo "Trace backends $trace_backends"
if have_backend "simple"; then
echo "Trace output file $trace_file-<pid>"
echo "spice support $spice $(echo_version $spice $spice_protocol_version/$spice_server_version)"
echo "rbd support $rbd"
echo "xfsctl support $xfs"
echo "smartcard support $smartcard"
echo "libusb $libusb"
echo "usb net redir $usb_redir"
echo "OpenGL support $opengl"
echo "OpenGL dmabufs $opengl_dmabuf"
echo "libiscsi support $libiscsi"
echo "libnfs support $libnfs"
echo "build guest agent $guest_agent"
echo "QGA VSS support $guest_agent_with_vss"
echo "QGA w32 disk info $guest_agent_ntddscsi"
echo "QGA MSI support $guest_agent_msi"
echo "seccomp support $seccomp"
echo "coroutine backend $coroutine"
echo "coroutine pool $coroutine_pool"
echo "debug stack usage $debug_stack_usage"
echo "mutex debugging $debug_mutex"
echo "crypto afalg $crypto_afalg"
echo "GlusterFS support $glusterfs"
echo "gcov $gcov_tool"
echo "gcov enabled $gcov"
echo "TPM support $tpm"
echo "libssh2 support $libssh2"
echo "TPM passthrough $tpm_passthrough"
echo "TPM emulator $tpm_emulator"
echo "QOM debugging $qom_cast_debug"
echo "Live block migration $live_block_migration"
echo "lzo support $lzo"
echo "snappy support $snappy"
echo "bzip2 support $bzip2"
echo "lzfse support $lzfse"
echo "NUMA host support $numa"
echo "libxml2 $libxml2"
echo "tcmalloc support $tcmalloc"
echo "jemalloc support $jemalloc"
echo "avx2 optimization $avx2_opt"
echo "replication support $replication"
echo "VxHS block device $vxhs"
echo "bochs support $bochs"
echo "cloop support $cloop"
echo "dmg support $dmg"
echo "qcow v1 support $qcow1"
echo "vdi support $vdi"
echo "vvfat support $vvfat"
echo "qed support $qed"
echo "parallels support $parallels"
echo "sheepdog support $sheepdog"
echo "capstone $capstone"
echo "docker $docker"
echo "libpmem support $libpmem"
echo "libudev $libudev"
if test "$sdl_too_old" = "yes"; then
echo "-> Your SDL version is too old - please upgrade to have SDL support"
if test "$sdlabi" = "1.2"; then
echo "WARNING: Use of SDL 1.2 is deprecated and will be removed in"
echo "WARNING: future releases. Please switch to using SDL 2.0"
if test "$supported_cpu" = "no"; then
echo "WARNING: SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!"
echo "CPU host architecture $cpu support is not currently maintained."
echo "The QEMU project intends to remove support for this host CPU in"
echo "a future release if nobody volunteers to maintain it and to"
echo "provide a build host for our continuous integration setup."
echo "configure has succeeded and you can continue to build, but"
echo "if you care about QEMU on this platform you should contact"
echo "us upstream at qemu-devel@nongnu.org."
if test "$supported_os" = "no"; then
echo "WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!"
echo "Host OS $targetos support is not currently maintained."
echo "The QEMU project intends to remove support for this host OS in"
config_host_mak="config-host.mak"
echo "# Automatically generated by configure - do not modify" >config-all-disas.mak
echo "# Automatically generated by configure - do not modify" > $config_host_mak
echo >> $config_host_mak
echo all: >> $config_host_mak
echo "prefix=$prefix" >> $config_host_mak
echo "bindir=$bindir" >> $config_host_mak
echo "libdir=$libdir" >> $config_host_mak
echo "libexecdir=$libexecdir" >> $config_host_mak
echo "includedir=$includedir" >> $config_host_mak
echo "mandir=$mandir" >> $config_host_mak
echo "sysconfdir=$sysconfdir" >> $config_host_mak
echo "qemu_confdir=$qemu_confdir" >> $config_host_mak
echo "qemu_datadir=$qemu_datadir" >> $config_host_mak
echo "qemu_firmwarepath=$firmwarepath" >> $config_host_mak
echo "qemu_docdir=$qemu_docdir" >> $config_host_mak
echo "qemu_moddir=$qemu_moddir" >> $config_host_mak
echo "qemu_localstatedir=$local_statedir" >> $config_host_mak
echo "qemu_helperdir=$libexecdir" >> $config_host_mak
echo "qemu_localedir=$qemu_localedir" >> $config_host_mak
echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
echo "GIT=$git" >> $config_host_mak
echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
echo "GIT_UPDATE=$git_update" >> $config_host_mak
echo "ARCH=$ARCH" >> $config_host_mak
if test "$debug_tcg" = "yes" ; then
echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
if test "$strip_opt" = "yes" ; then
echo "STRIP=${strip}" >> $config_host_mak
if test "$bigendian" = "yes" ; then
echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
echo "CONFIG_WIN32=y" >> $config_host_mak
rc_version=$(cat $source_path/VERSION)
version_major=${rc_version%%.*}
rc_version=${rc_version#*.}
version_minor=${rc_version%%.*}
version_subminor=${rc_version%%.*}
version_micro=0
echo "CONFIG_FILEVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
echo "CONFIG_PRODUCTVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
if test "$guest_agent_with_vss" = "yes" ; then
echo "CONFIG_QGA_VSS=y" >> $config_host_mak
echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
if test "$guest_agent_ntddscsi" = "yes" ; then
echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
echo "QEMU_GA_MSI_ENABLED=yes" >> $config_host_mak
echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
echo "QEMU_GA_MSI_WITH_VSS=${QEMU_GA_MSI_WITH_VSS}" >> $config_host_mak
echo "QEMU_GA_MSI_ARCH=${QEMU_GA_MSI_ARCH}" >> $config_host_mak
echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
echo "CONFIG_POSIX=y" >> $config_host_mak
if test "$linux" = "yes" ; then
echo "CONFIG_LINUX=y" >> $config_host_mak
echo "CONFIG_DARWIN=y" >> $config_host_mak
echo "CONFIG_SOLARIS=y" >> $config_host_mak
if test "$haiku" = "yes" ; then
echo "CONFIG_HAIKU=y" >> $config_host_mak
echo "CONFIG_STATIC=y" >> $config_host_mak
if test "$profiler" = "yes" ; then
echo "CONFIG_PROFILER=y" >> $config_host_mak
echo "CONFIG_SLIRP=y" >> $config_host_mak
echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
echo "CONFIG_VDE=y" >> $config_host_mak
echo "VDE_LIBS=$vde_libs" >> $config_host_mak
echo "CONFIG_NETMAP=y" >> $config_host_mak
if test "$l2tpv3" = "yes" ; then
echo "CONFIG_L2TPV3=y" >> $config_host_mak
echo "CONFIG_LIBCAP=y" >> $config_host_mak
echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
case "$drv" in
alsa | oss | pa | sdl)
echo "$def=m" >> $config_host_mak ;;
echo "$def=y" >> $config_host_mak ;;
echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak
echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak
echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak
echo "OSS_LIBS=$oss_libs" >> $config_host_mak
if test "$audio_pt_int" = "yes" ; then
echo "CONFIG_AUDIO_PT_INT=y" >> $config_host_mak
if test "$audio_win_int" = "yes" ; then
echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
echo "CONFIG_VNC=y" >> $config_host_mak
echo "CONFIG_VNC_SASL=y" >> $config_host_mak
echo "CONFIG_VNC_JPEG=y" >> $config_host_mak
echo "CONFIG_VNC_PNG=y" >> $config_host_mak
echo "XKBCOMMON_CFLAGS=$xkbcommon_cflags" >> $config_host_mak
echo "XKBCOMMON_LIBS=$xkbcommon_libs" >> $config_host_mak
if test "$fnmatch" = "yes" ; then
echo "CONFIG_FNMATCH=y" >> $config_host_mak
echo "CONFIG_XFS=y" >> $config_host_mak
qemu_version=$(head $source_path/VERSION)
echo "VERSION=$qemu_version" >>$config_host_mak
echo "PKGVERSION=$pkgversion" >>$config_host_mak
echo "SRC_PATH=$source_path" >> $config_host_mak
echo "TARGET_DIRS=$target_list" >> $config_host_mak
if [ "$docs" = "yes" ] ; then
echo "BUILD_DOCS=yes" >> $config_host_mak
if test "$modules" = "yes"; then
# $shacmd can generate a hash started with digit, which the compiler doesn't
# like as an symbol. So prefix it with an underscore
echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
echo "CONFIG_MODULES=y" >> $config_host_mak
if test "$have_x11" = "yes" -a "$need_x11" = "yes"; then
echo "CONFIG_X11=y" >> $config_host_mak
echo "X11_CFLAGS=$x11_cflags" >> $config_host_mak
echo "X11_LIBS=$x11_libs" >> $config_host_mak
echo "CONFIG_SDL=m" >> $config_host_mak
echo "CONFIG_SDLABI=$sdlabi" >> $config_host_mak
echo "SDL_CFLAGS=$sdl_cflags" >> $config_host_mak
echo "SDL_LIBS=$sdl_libs" >> $config_host_mak
if test "$cocoa" = "yes" ; then
echo "CONFIG_COCOA=y" >> $config_host_mak
echo "CONFIG_CURSES=m" >> $config_host_mak
echo "CURSES_CFLAGS=$curses_inc" >> $config_host_mak
echo "CURSES_LIBS=$curses_lib" >> $config_host_mak
if test "$pipe2" = "yes" ; then
echo "CONFIG_PIPE2=y" >> $config_host_mak
if test "$accept4" = "yes" ; then
echo "CONFIG_ACCEPT4=y" >> $config_host_mak
if test "$splice" = "yes" ; then
echo "CONFIG_SPLICE=y" >> $config_host_mak
if test "$eventfd" = "yes" ; then
echo "CONFIG_EVENTFD=y" >> $config_host_mak
if test "$memfd" = "yes" ; then
echo "CONFIG_MEMFD=y" >> $config_host_mak
if test "$have_usbfs" = "yes" ; then
echo "CONFIG_USBFS=y" >> $config_host_mak
if test "$fallocate" = "yes" ; then
echo "CONFIG_FALLOCATE=y" >> $config_host_mak
if test "$fallocate_punch_hole" = "yes" ; then
echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
if test "$fallocate_zero_range" = "yes" ; then
echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak
if test "$posix_fallocate" = "yes" ; then
echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
if test "$sync_file_range" = "yes" ; then
echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
if test "$fiemap" = "yes" ; then
echo "CONFIG_FIEMAP=y" >> $config_host_mak
if test "$dup3" = "yes" ; then
echo "CONFIG_DUP3=y" >> $config_host_mak
if test "$ppoll" = "yes" ; then
echo "CONFIG_PPOLL=y" >> $config_host_mak
if test "$prctl_pr_set_timerslack" = "yes" ; then
echo "CONFIG_PRCTL_PR_SET_TIMERSLACK=y" >> $config_host_mak
if test "$epoll" = "yes" ; then
echo "CONFIG_EPOLL=y" >> $config_host_mak
if test "$epoll_create1" = "yes" ; then
echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
if test "$sendfile" = "yes" ; then
echo "CONFIG_SENDFILE=y" >> $config_host_mak
if test "$timerfd" = "yes" ; then
echo "CONFIG_TIMERFD=y" >> $config_host_mak
if test "$setns" = "yes" ; then
echo "CONFIG_SETNS=y" >> $config_host_mak
if test "$clock_adjtime" = "yes" ; then
echo "CONFIG_CLOCK_ADJTIME=y" >> $config_host_mak
if test "$syncfs" = "yes" ; then
echo "CONFIG_SYNCFS=y" >> $config_host_mak
if test "$inotify" = "yes" ; then
echo "CONFIG_INOTIFY=y" >> $config_host_mak
if test "$inotify1" = "yes" ; then
echo "CONFIG_INOTIFY1=y" >> $config_host_mak
if test "$sem_timedwait" = "yes" ; then
echo "CONFIG_SEM_TIMEDWAIT=y" >> $config_host_mak
if test "$strchrnul" = "yes" ; then
echo "HAVE_STRCHRNUL=y" >> $config_host_mak
if test "$byteswap_h" = "yes" ; then
echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
if test "$bswap_h" = "yes" ; then
echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
echo "CONFIG_CURL=m" >> $config_host_mak
echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak
echo "CURL_LIBS=$curl_libs" >> $config_host_mak
echo "CONFIG_BRLAPI=y" >> $config_host_mak
echo "BRLAPI_LIBS=$brlapi_libs" >> $config_host_mak
echo "CONFIG_BLUEZ=y" >> $config_host_mak
echo "BLUEZ_CFLAGS=$bluez_cflags" >> $config_host_mak
if test "$gtk" = "yes" ; then
echo "CONFIG_GTK=m" >> $config_host_mak
echo "GTK_CFLAGS=$gtk_cflags" >> $config_host_mak
echo "GTK_LIBS=$gtk_libs" >> $config_host_mak
if test "$gtk_gl" = "yes" ; then
echo "CONFIG_GTK_GL=y" >> $config_host_mak
echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
if test "$gnutls" = "yes" ; then
echo "CONFIG_GNUTLS=y" >> $config_host_mak
if test "$gcrypt" = "yes" ; then
echo "CONFIG_GCRYPT=y" >> $config_host_mak
if test "$gcrypt_hmac" = "yes" ; then
echo "CONFIG_GCRYPT_HMAC=y" >> $config_host_mak
if test "$nettle" = "yes" ; then
echo "CONFIG_NETTLE=y" >> $config_host_mak
echo "CONFIG_NETTLE_VERSION_MAJOR=${nettle_version%%.*}" >> $config_host_mak
if test "$tasn1" = "yes" ; then
echo "CONFIG_TASN1=y" >> $config_host_mak
if test "$have_ifaddrs_h" = "yes" ; then
echo "HAVE_IFADDRS_H=y" >> $config_host_mak
if test "$have_broken_size_max" = "yes" ; then
echo "HAVE_BROKEN_SIZE_MAX=y" >> $config_host_mak
# Work around a system header bug with some kernel/XFS header
# versions where they both try to define 'struct fsxattr':
# xfs headers will not try to redefine structs from linux headers
# if this macro is set.
if test "$have_fsxattr" = "yes" ; then
echo "HAVE_FSXATTR=y" >> $config_host_mak
if test "$have_copy_file_range" = "yes" ; then
echo "HAVE_COPY_FILE_RANGE=y" >> $config_host_mak
if test "$vte" = "yes" ; then
echo "CONFIG_VTE=y" >> $config_host_mak
echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak
echo "VTE_LIBS=$vte_libs" >> $config_host_mak
echo "CONFIG_VIRGL=y" >> $config_host_mak
echo "VIRGL_CFLAGS=$virgl_cflags" >> $config_host_mak
echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak
echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
if test "$xen_pv_domain_build" = "yes" ; then
echo "CONFIG_XEN_PV_DOMAIN_BUILD=y" >> $config_host_mak
echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
echo "CONFIG_ATTR=y" >> $config_host_mak
if test "$libattr" = "yes" ; then
echo "CONFIG_LIBATTR=y" >> $config_host_mak
if test "$virtfs" = "yes" ; then
echo "CONFIG_VIRTFS=y" >> $config_host_mak
if test "$mpath" = "yes" ; then
echo "CONFIG_MPATH=y" >> $config_host_mak
if test "$mpathpersist_new_api" = "yes"; then
echo "CONFIG_MPATH_NEW_API=y" >> $config_host_mak
if test "$vhost_scsi" = "yes" ; then
echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
if test "$vhost_net" = "yes" -a "$vhost_user" = "yes"; then
echo "CONFIG_VHOST_NET_USED=y" >> $config_host_mak
if test "$vhost_crypto" = "yes" ; then
echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
if test "$vhost_vsock" = "yes" ; then
echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
if test "$vhost_user" = "yes" ; then
echo "CONFIG_VHOST_USER=y" >> $config_host_mak
if test "$blobs" = "yes" ; then
echo "INSTALL_BLOBS=yes" >> $config_host_mak
if test "$iovec" = "yes" ; then
echo "CONFIG_IOVEC=y" >> $config_host_mak
if test "$preadv" = "yes" ; then
echo "CONFIG_PREADV=y" >> $config_host_mak
echo "CONFIG_FDT=y" >> $config_host_mak
if test "$membarrier" = "yes" ; then
echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
if test "$signalfd" = "yes" ; then
echo "CONFIG_SIGNALFD=y" >> $config_host_mak
if test "$tcg" = "yes"; then
echo "CONFIG_TCG=y" >> $config_host_mak
echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
if test "$fdatasync" = "yes" ; then
echo "CONFIG_FDATASYNC=y" >> $config_host_mak
if test "$madvise" = "yes" ; then
echo "CONFIG_MADVISE=y" >> $config_host_mak
if test "$posix_madvise" = "yes" ; then
echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak
if test "$posix_memalign" = "yes" ; then
echo "CONFIG_POSIX_MEMALIGN=y" >> $config_host_mak
echo "CONFIG_SPICE=y" >> $config_host_mak
if test "$smartcard" = "yes" ; then
echo "CONFIG_SMARTCARD=y" >> $config_host_mak
echo "SMARTCARD_CFLAGS=$libcacard_cflags" >> $config_host_mak
echo "SMARTCARD_LIBS=$libcacard_libs" >> $config_host_mak
if test "$libusb" = "yes" ; then
echo "CONFIG_USB_LIBUSB=y" >> $config_host_mak
echo "LIBUSB_CFLAGS=$libusb_cflags" >> $config_host_mak
echo "LIBUSB_LIBS=$libusb_libs" >> $config_host_mak
if test "$usb_redir" = "yes" ; then
echo "CONFIG_USB_REDIR=y" >> $config_host_mak
echo "USB_REDIR_CFLAGS=$usb_redir_cflags" >> $config_host_mak
echo "USB_REDIR_LIBS=$usb_redir_libs" >> $config_host_mak
echo "CONFIG_OPENGL=y" >> $config_host_mak
echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
if test "$opengl_dmabuf" = "yes" ; then
echo "CONFIG_OPENGL_DMABUF=y" >> $config_host_mak
echo "CONFIG_MALLOC_TRIM=y" >> $config_host_mak
if test "$avx2_opt" = "yes" ; then
echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
if test "$lzo" = "yes" ; then
echo "CONFIG_LZO=y" >> $config_host_mak
if test "$snappy" = "yes" ; then
echo "CONFIG_SNAPPY=y" >> $config_host_mak
if test "$bzip2" = "yes" ; then
echo "CONFIG_BZIP2=y" >> $config_host_mak
echo "BZIP2_LIBS=-lbz2" >> $config_host_mak
if test "$lzfse" = "yes" ; then
echo "CONFIG_LZFSE=y" >> $config_host_mak
echo "LZFSE_LIBS=-llzfse" >> $config_host_mak
echo "CONFIG_LIBISCSI=m" >> $config_host_mak
echo "LIBISCSI_CFLAGS=$libiscsi_cflags" >> $config_host_mak
echo "LIBISCSI_LIBS=$libiscsi_libs" >> $config_host_mak
echo "CONFIG_LIBNFS=m" >> $config_host_mak
echo "LIBNFS_LIBS=$libnfs_libs" >> $config_host_mak
if test "$seccomp" = "yes"; then
echo "CONFIG_SECCOMP=y" >> $config_host_mak
echo "SECCOMP_CFLAGS=$seccomp_cflags" >> $config_host_mak
echo "SECCOMP_LIBS=$seccomp_libs" >> $config_host_mak
# XXX: suppress that
echo "CONFIG_BSD=y" >> $config_host_mak
if test "$localtime_r" = "yes" ; then
echo "CONFIG_LOCALTIME_R=y" >> $config_host_mak
if test "$qom_cast_debug" = "yes" ; then
echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
echo "CONFIG_RBD=m" >> $config_host_mak
echo "RBD_CFLAGS=$rbd_cflags" >> $config_host_mak
echo "RBD_LIBS=$rbd_libs" >> $config_host_mak
echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
if test "$coroutine_pool" = "yes" ; then
echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
if test "$debug_stack_usage" = "yes" ; then
echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
if test "$crypto_afalg" = "yes" ; then
echo "CONFIG_AF_ALG=y" >> $config_host_mak
if test "$open_by_handle_at" = "yes" ; then
echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
if test "$linux_magic_h" = "yes" ; then
echo "CONFIG_LINUX_MAGIC_H=y" >> $config_host_mak
if test "$pragma_diagnostic_available" = "yes" ; then
echo "CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE=y" >> $config_host_mak
if test "$valgrind_h" = "yes" ; then
echo "CONFIG_VALGRIND_H=y" >> $config_host_mak
if test "$have_asan_iface_fiber" = "yes" ; then
echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
if test "$has_environ" = "yes" ; then
echo "CONFIG_HAS_ENVIRON=y" >> $config_host_mak
if test "$cpuid_h" = "yes" ; then
echo "CONFIG_CPUID_H=y" >> $config_host_mak
if test "$int128" = "yes" ; then
echo "CONFIG_INT128=y" >> $config_host_mak
if test "$atomic128" = "yes" ; then
echo "CONFIG_ATOMIC128=y" >> $config_host_mak
if test "$cmpxchg128" = "yes" ; then
echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
if test "$atomic64" = "yes" ; then
echo "CONFIG_ATOMIC64=y" >> $config_host_mak
if test "$vector16" = "yes" ; then
echo "CONFIG_VECTOR16=y" >> $config_host_mak
if test "$getauxval" = "yes" ; then
echo "CONFIG_GETAUXVAL=y" >> $config_host_mak
echo "CONFIG_GLUSTERFS=m" >> $config_host_mak
echo "GLUSTERFS_CFLAGS=$glusterfs_cflags" >> $config_host_mak
echo "GLUSTERFS_LIBS=$glusterfs_libs" >> $config_host_mak
if test "$glusterfs_xlator_opt" = "yes" ; then
echo "CONFIG_GLUSTERFS_XLATOR_OPT=y" >> $config_host_mak
if test "$glusterfs_discard" = "yes" ; then
echo "CONFIG_GLUSTERFS_DISCARD=y" >> $config_host_mak
if test "$glusterfs_fallocate" = "yes" ; then
echo "CONFIG_GLUSTERFS_FALLOCATE=y" >> $config_host_mak
if test "$glusterfs_zerofill" = "yes" ; then
echo "CONFIG_GLUSTERFS_ZEROFILL=y" >> $config_host_mak
echo "CONFIG_LIBSSH2=m" >> $config_host_mak
echo "LIBSSH2_CFLAGS=$libssh2_cflags" >> $config_host_mak
echo "LIBSSH2_LIBS=$libssh2_libs" >> $config_host_mak
if test "$live_block_migration" = "yes" ; then
echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
if test "$tpm" = "yes"; then
echo 'CONFIG_TPM=$(CONFIG_SOFTMMU)' >> $config_host_mak
# TPM passthrough support?
if test "$tpm_passthrough" = "yes"; then
echo "CONFIG_TPM_PASSTHROUGH=y" >> $config_host_mak
# TPM emulator support?
if test "$tpm_emulator" = "yes"; then
echo "CONFIG_TPM_EMULATOR=y" >> $config_host_mak
echo "TRACE_BACKENDS=$trace_backends" >> $config_host_mak
if have_backend "nop"; then
echo "CONFIG_TRACE_NOP=y" >> $config_host_mak
echo "CONFIG_TRACE_SIMPLE=y" >> $config_host_mak
# Set the appropriate trace file.
trace_file="\"$trace_file-\" FMT_pid"
if have_backend "log"; then
echo "CONFIG_TRACE_LOG=y" >> $config_host_mak
echo "CONFIG_TRACE_UST=y" >> $config_host_mak
echo "CONFIG_TRACE_DTRACE=y" >> $config_host_mak
if test "$trace_backend_stap" = "yes" ; then
echo "CONFIG_TRACE_SYSTEMTAP=y" >> $config_host_mak
if have_backend "ftrace"; then
echo "CONFIG_TRACE_FTRACE=y" >> $config_host_mak
feature_not_found "ftrace(trace backend)" "ftrace requires Linux"
if have_backend "syslog"; then
if test "$posix_syslog" = "yes" ; then
echo "CONFIG_TRACE_SYSLOG=y" >> $config_host_mak
feature_not_found "syslog(trace backend)" "syslog not available"
echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
echo "CONFIG_RDMA=y" >> $config_host_mak
echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
echo "CONFIG_PVRDMA=y" >> $config_host_mak
if test "$have_rtnetlink" = "yes" ; then
echo "CONFIG_RTNETLINK=y" >> $config_host_mak
if test "$libxml2" = "yes" ; then
echo "CONFIG_LIBXML2=y" >> $config_host_mak
echo "LIBXML2_CFLAGS=$libxml2_cflags" >> $config_host_mak
echo "LIBXML2_LIBS=$libxml2_libs" >> $config_host_mak
if test "$replication" = "yes" ; then
echo "CONFIG_REPLICATION=y" >> $config_host_mak
if test "$have_af_vsock" = "yes" ; then
echo "CONFIG_AF_VSOCK=y" >> $config_host_mak
if test "$have_sysmacros" = "yes" ; then
echo "CONFIG_SYSMACROS=y" >> $config_host_mak
if test "$have_static_assert" = "yes" ; then
echo "CONFIG_STATIC_ASSERT=y" >> $config_host_mak
if test "$have_utmpx" = "yes" ; then
echo "HAVE_UTMPX=y" >> $config_host_mak
if test "$ivshmem" = "yes" ; then
echo "CONFIG_IVSHMEM=y" >> $config_host_mak
if test "$capstone" != "no" ; then
echo "CONFIG_CAPSTONE=y" >> $config_host_mak
if test "$debug_mutex" = "yes" ; then
echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
# Hold two types of flag:
# CONFIG_THREAD_SETNAME_BYTHREAD - we've got a way of setting the name on
# a thread we have a handle to
# CONFIG_PTHREAD_SETNAME_NP - A way of doing it on a particular
# platform
if test "$pthread_setname_np" = "yes" ; then
echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
echo "CONFIG_PTHREAD_SETNAME_NP=y" >> $config_host_mak
echo "CONFIG_VXHS=y" >> $config_host_mak
echo "VXHS_LIBS=$vxhs_libs" >> $config_host_mak
echo "CONFIG_LIBPMEM=y" >> $config_host_mak
if test "$bochs" = "yes" ; then
echo "CONFIG_BOCHS=y" >> $config_host_mak
if test "$cloop" = "yes" ; then
echo "CONFIG_CLOOP=y" >> $config_host_mak
if test "$dmg" = "yes" ; then
echo "CONFIG_DMG=y" >> $config_host_mak
if test "$qcow1" = "yes" ; then
echo "CONFIG_QCOW1=y" >> $config_host_mak
if test "$vdi" = "yes" ; then
echo "CONFIG_VDI=y" >> $config_host_mak
if test "$vvfat" = "yes" ; then
echo "CONFIG_VVFAT=y" >> $config_host_mak
if test "$qed" = "yes" ; then
echo "CONFIG_QED=y" >> $config_host_mak
if test "$parallels" = "yes" ; then
echo "CONFIG_PARALLELS=y" >> $config_host_mak
if test "$sheepdog" = "yes" ; then
echo "CONFIG_SHEEPDOG=y" >> $config_host_mak
if test "$tcg_interpreter" = "yes"; then
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/tci $QEMU_INCLUDES"
elif test "$ARCH" = "sparc64" ; then
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/sparc $QEMU_INCLUDES"
elif test "$ARCH" = "s390x" ; then
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/s390 $QEMU_INCLUDES"
elif test "$ARCH" = "x86_64" -o "$ARCH" = "x32" ; then
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/i386 $QEMU_INCLUDES"
elif test "$ARCH" = "ppc64" ; then
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/ppc $QEMU_INCLUDES"
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/\$(ARCH) $QEMU_INCLUDES"
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg $QEMU_INCLUDES"
echo "TOOLS=$tools" >> $config_host_mak
echo "ROMS=$roms" >> $config_host_mak
echo "MAKE=$make" >> $config_host_mak
echo "INSTALL=$install" >> $config_host_mak
echo "INSTALL_DIR=$install -d -m 0755" >> $config_host_mak
echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
echo "PYTHON=$python" >> $config_host_mak
echo "CC=$cc" >> $config_host_mak
if $iasl -h > /dev/null 2>&1; then
echo "IASL=$iasl" >> $config_host_mak
echo "HOST_CC=$host_cc" >> $config_host_mak
echo "CXX=$cxx" >> $config_host_mak
echo "OBJCC=$objcc" >> $config_host_mak
echo "AR=$ar" >> $config_host_mak
echo "ARFLAGS=$ARFLAGS" >> $config_host_mak
echo "AS=$as" >> $config_host_mak
echo "CCAS=$ccas" >> $config_host_mak
echo "CPP=$cpp" >> $config_host_mak
echo "OBJCOPY=$objcopy" >> $config_host_mak
echo "LD=$ld" >> $config_host_mak
echo "RANLIB=$ranlib" >> $config_host_mak
echo "NM=$nm" >> $config_host_mak
echo "WINDRES=$windres" >> $config_host_mak
echo "CFLAGS=$CFLAGS" >> $config_host_mak
echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
echo "QEMU_INCLUDES=$QEMU_INCLUDES" >> $config_host_mak
echo "CC := REAL_CC=\"\$(CC)\" cgcc" >> $config_host_mak
echo "CPP := REAL_CC=\"\$(CPP)\" cgcc" >> $config_host_mak
echo "CXX := REAL_CC=\"\$(CXX)\" cgcc" >> $config_host_mak
echo "HOST_CC := REAL_CC=\"\$(HOST_CC)\" cgcc" >> $config_host_mak
echo "QEMU_CFLAGS += -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-non-pointer-null" >> $config_host_mak
if test "$cross_prefix" != ""; then
echo "AUTOCONF_HOST := --host=${cross_prefix%-}" >> $config_host_mak
echo "AUTOCONF_HOST := " >> $config_host_mak
echo "LDFLAGS=$LDFLAGS" >> $config_host_mak
echo "LDFLAGS_NOPIE=$LDFLAGS_NOPIE" >> $config_host_mak
echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
echo "LD_REL_FLAGS=$LD_REL_FLAGS" >> $config_host_mak
echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
echo "LIBS+=$LIBS" >> $config_host_mak
echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak
echo "PTHREAD_LIB=$PTHREAD_LIB" >> $config_host_mak
echo "EXESUF=$EXESUF" >> $config_host_mak
echo "DSOSUF=$DSOSUF" >> $config_host_mak
echo "LDFLAGS_SHARED=$LDFLAGS_SHARED" >> $config_host_mak
echo "LIBS_QGA+=$libs_qga" >> $config_host_mak
echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak
echo "TASN1_CFLAGS=$tasn1_cflags" >> $config_host_mak
echo "POD2MAN=$POD2MAN" >> $config_host_mak
echo "CONFIG_GCOV=y" >> $config_host_mak
echo "GCOV=$gcov_tool" >> $config_host_mak
if test "$docker" != "no"; then
echo "HAVE_USER_DOCKER=y" >> $config_host_mak
if test "$libudev" != "no"; then
echo "CONFIG_LIBUDEV=y" >> $config_host_mak
echo "LIBUDEV_LIBS=$libudev_libs" >> $config_host_mak
# use included Linux headers
mkdir -p linux-headers
i386|x86_64|x32)
linux_arch=x86
ppc|ppc64)
linux_arch=powerpc
linux_arch=s390
linux_arch=arm64
mips64)
linux_arch=mips
# For most CPUs the kernel architecture name and QEMU CPU name match.
linux_arch="$cpu"
# For non-KVM architectures we will not have asm headers
if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
target_dir="$target"
config_target_mak=$target_dir/config-target.mak
target_name=$(echo $target | cut -d '-' -f 1)
target_bigendian="no"
case "$target_name" in
armeb|aarch64_be|hppa|lm32|m68k|microblaze|mips|mipsn32|mips64|moxie|or1k|ppc|ppc64|ppc64abi32|s390x|sh4eb|sparc|sparc64|sparc32plus|xtensaeb)
target_bigendian=yes
target_softmmu="no"
target_user_only="no"
target_linux_user="no"
target_bsd_user="no"
case "$target" in
${target_name}-softmmu)
target_softmmu="yes"
${target_name}-linux-user)
target_user_only="yes"
target_linux_user="yes"
${target_name}-bsd-user)
target_bsd_user="yes"
error_exit "Target '$target' not recognised"
target_compiler=""
target_compiler_static=""
target_compiler_cflags=""
mkdir -p $target_dir
echo "# Automatically generated by configure - do not modify" > $config_target_mak
bflt="no"
mttcg="no"
interp_prefix1=$(echo "$interp_prefix" | sed "s/%M/$target_name/g")
gdb_xml_files=""
TARGET_ARCH="$target_name"
TARGET_BASE_ARCH=""
TARGET_ABI_DIR=""
mttcg="yes"
gdb_xml_files="i386-32bit.xml i386-32bit-core.xml i386-32bit-sse.xml"
target_compiler=$cross_cc_i386
target_compiler_cflags=$cross_cc_ccflags_i386
TARGET_BASE_ARCH=i386
gdb_xml_files="i386-64bit.xml i386-64bit-core.xml i386-64bit-sse.xml"
target_compiler=$cross_cc_x86_64
alpha)
target_compiler=$cross_cc_alpha
arm|armeb)
TARGET_ARCH=arm
bflt="yes"
gdb_xml_files="arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"
target_compiler=$cross_cc_arm
eval "target_compiler_cflags=\$cross_cc_cflags_${target_name}"
aarch64|aarch64_be)
TARGET_ARCH=aarch64
TARGET_BASE_ARCH=arm
gdb_xml_files="aarch64-core.xml aarch64-fpu.xml arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"
target_compiler=$cross_cc_aarch64
cris)
target_compiler=$cross_cc_cris
hppa)
target_compiler=$cross_cc_hppa
lm32)
target_compiler=$cross_cc_lm32
m68k)
gdb_xml_files="cf-core.xml cf-fp.xml m68k-fp.xml"
target_compiler=$cross_cc_m68k
microblaze|microblazeel)
TARGET_ARCH=microblaze
echo "TARGET_ABI32=y" >> $config_target_mak
target_compiler=$cross_cc_microblaze
mips|mipsel)
TARGET_ARCH=mips
target_compiler=$cross_cc_mips
echo "TARGET_ABI_MIPSO32=y" >> $config_target_mak
mipsn32|mipsn32el)
TARGET_ARCH=mips64
TARGET_BASE_ARCH=mips
target_compiler=$cross_cc_mipsn32
echo "TARGET_ABI_MIPSN32=y" >> $config_target_mak
mips64|mips64el)
target_compiler=$cross_cc_mips64
echo "TARGET_ABI_MIPSN64=y" >> $config_target_mak
moxie)
target_compiler=$cross_cc_moxie
nios2)
target_compiler=$cross_cc_nios2
or1k)
target_compiler=$cross_cc_or1k
TARGET_ARCH=openrisc
TARGET_BASE_ARCH=openrisc
gdb_xml_files="power-core.xml power-fpu.xml power-altivec.xml power-spe.xml"
target_compiler=$cross_cc_powerpc
TARGET_BASE_ARCH=ppc
TARGET_ABI_DIR=ppc
mttcg=yes
gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml power-vsx.xml"
target_compiler=$cross_cc_ppc64
ppc64le)
TARGET_ARCH=ppc64
target_compiler=$cross_cc_ppc64le
ppc64abi32)
target_compiler=$cross_cc_ppc64abi32
riscv32)
TARGET_BASE_ARCH=riscv
TARGET_ABI_DIR=riscv
target_compiler=$cross_cc_riscv32
riscv64)
target_compiler=$cross_cc_riscv64
sh4|sh4eb)
TARGET_ARCH=sh4
target_compiler=$cross_cc_sh4
target_compiler=$cross_cc_sparc
TARGET_BASE_ARCH=sparc
target_compiler=$cross_cc_sparc64
sparc32plus)
TARGET_ARCH=sparc64
TARGET_ABI_DIR=sparc
target_compiler=$cross_cc_sparc32plus
gdb_xml_files="s390x-core64.xml s390-acr.xml s390-fpr.xml s390-vx.xml s390-cr.xml s390-virt.xml s390-gs.xml"
target_compiler=$cross_cc_s390x
tilegx)
target_compiler=$cross_cc_tilegx
tricore)
target_compiler=$cross_cc_tricore
unicore32)
target_compiler=$cross_cc_unicore32
xtensa|xtensaeb)
TARGET_ARCH=xtensa
target_compiler=$cross_cc_xtensa
error_exit "Unsupported target CPU"
# TARGET_BASE_ARCH needs to be defined after TARGET_ARCH
if [ "$TARGET_BASE_ARCH" = "" ]; then
TARGET_BASE_ARCH=$TARGET_ARCH
# Do we have a cross compiler for this target?
if has $target_compiler; then
if ! do_compiler "$target_compiler" $target_compiler_cflags -o $TMPE $TMPC -static ; then
# For host systems we might get away with building without -static
if ! do_compiler "$target_compiler" $target_compiler_cflags -o $TMPE $TMPC ; then
enabled_cross_compilers="${enabled_cross_compilers} '${target_compiler}'"
target_compiler_static="n"
target_compiler_static="y"
symlink "$source_path/Makefile.target" "$target_dir/Makefile"
upper() {
echo "$@"| LC_ALL=C tr '[a-z]' '[A-Z]'
target_arch_name="$(upper $TARGET_ARCH)"
echo "TARGET_$target_arch_name=y" >> $config_target_mak
echo "TARGET_NAME=$target_name" >> $config_target_mak
echo "TARGET_BASE_ARCH=$TARGET_BASE_ARCH" >> $config_target_mak
if [ "$TARGET_ABI_DIR" = "" ]; then
TARGET_ABI_DIR=$TARGET_ARCH
echo "TARGET_ABI_DIR=$TARGET_ABI_DIR" >> $config_target_mak
if [ "$HOST_VARIANT_DIR" != "" ]; then
echo "HOST_VARIANT_DIR=$HOST_VARIANT_DIR" >> $config_target_mak
if supported_xen_target $target; then
echo "CONFIG_XEN=y" >> $config_target_mak
if test "$xen_pci_passthrough" = yes; then
echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak"
if supported_kvm_target $target; then
echo "CONFIG_KVM=y" >> $config_target_mak
if test "$vhost_net" = "yes" ; then
echo "CONFIG_VHOST_NET=y" >> $config_target_mak
echo "CONFIG_VHOST_USER_NET_TEST_$target_name=y" >> $config_host_mak
if supported_hax_target $target; then
echo "CONFIG_HAX=y" >> $config_target_mak
if supported_hvf_target $target; then
echo "CONFIG_HVF=y" >> $config_target_mak
if supported_whpx_target $target; then
echo "CONFIG_WHPX=y" >> $config_target_mak
if test "$target_bigendian" = "yes" ; then
echo "TARGET_WORDS_BIGENDIAN=y" >> $config_target_mak
if test "$target_softmmu" = "yes" ; then
echo "CONFIG_SOFTMMU=y" >> $config_target_mak
if test "$mttcg" = "yes" ; then
echo "TARGET_SUPPORTS_MTTCG=y" >> $config_target_mak
if test "$target_user_only" = "yes" ; then
echo "CONFIG_USER_ONLY=y" >> $config_target_mak
echo "CONFIG_QEMU_INTERP_PREFIX=\"$interp_prefix1\"" >> $config_target_mak
if test "$target_linux_user" = "yes" ; then
echo "CONFIG_LINUX_USER=y" >> $config_target_mak
list=""
if test ! -z "$gdb_xml_files" ; then
for x in $gdb_xml_files; do
list="$list $source_path/gdb-xml/$x"
echo "TARGET_XML_FILES=$list" >> $config_target_mak
if test "$target_user_only" = "yes" -a "$bflt" = "yes"; then
echo "TARGET_HAS_BFLT=y" >> $config_target_mak
if test "$target_bsd_user" = "yes" ; then
echo "CONFIG_BSD_USER=y" >> $config_target_mak
if test -n "$target_compiler"; then
echo "CROSS_CC_GUEST=\"$target_compiler\"" >> $config_target_mak
if test -n "$target_compiler_static"; then
echo "CROSS_CC_GUEST_STATIC=$target_compiler_static" >> $config_target_mak
if test -n "$target_compiler_cflags"; then
echo "CROSS_CC_GUEST_CFLAGS=$target_compiler_cflags" >> $config_target_mak
# generate QEMU_CFLAGS/LDFLAGS for targets
cflags=""
ldflags=""
disas_config() {
echo "CONFIG_${1}_DIS=y" >> $config_target_mak
echo "CONFIG_${1}_DIS=y" >> config-all-disas.mak
for i in $ARCH $TARGET_BASE_ARCH ; do
case "$i" in
disas_config "ALPHA"
if test -n "${cxx}"; then
disas_config "ARM_A64"
arm)
disas_config "ARM"
disas_config "CRIS"
disas_config "HPPA"
disas_config "I386"
disas_config "LM32"
disas_config "M68K"
microblaze*)
disas_config "MICROBLAZE"
disas_config "MIPS"
disas_config "NANOMIPS"
moxie*)
disas_config "MOXIE"
disas_config "NIOS2"
disas_config "OPENRISC"
ppc*)
disas_config "PPC"
riscv)
disas_config "RISCV"
s390*)
disas_config "S390"
sh4)
disas_config "SH4"
sparc*)
disas_config "SPARC"
xtensa*)
disas_config "XTENSA"
disas_config "TCI"
case "$ARCH" in
# Ensure there's only a single GP
cflags="-msmall-data $cflags"
if test "$gprof" = "yes" ; then
echo "TARGET_GPROF=yes" >> $config_target_mak
cflags="-p $cflags"
ldflags="-p $ldflags"
echo "GPROF_CFLAGS=-p" >> $config_target_mak
if test "$target_linux_user" = "yes" -o "$target_bsd_user" = "yes" ; then
ldflags="$ldflags $textseg_ldflags"
# Newer kernels on s390 check for an S390_PGSTE program header and
# enable the pgste page table extensions in that case. This makes
# the vm.allocate_pgste sysctl unnecessary. We enable this program
# header if
# - we build on s390x
# - we build the system emulation for s390x (qemu-system-s390x)
# - KVM is enabled
# - the linker supports --s390-pgste
if test "$TARGET_ARCH" = "s390x" -a "$target_softmmu" = "yes" -a "$ARCH" = "s390x" -a "$kvm" = "yes"; then
if ld_has --s390-pgste ; then
ldflags="-Wl,--s390-pgste $ldflags"
echo "LDFLAGS+=$ldflags" >> $config_target_mak
echo "QEMU_CFLAGS+=$cflags" >> $config_target_mak
done # for target in $targets
if test -n "$enabled_cross_compilers"; then
echo "NOTE: cross-compilers enabled: $enabled_cross_compilers"
if [ "$fdt" = "git" ]; then
echo "config-host.h: subdir-dtc" >> $config_host_mak
if [ "$capstone" = "git" -o "$capstone" = "internal" ]; then
echo "config-host.h: subdir-capstone" >> $config_host_mak
if test -n "$LIBCAPSTONE"; then
echo "LIBCAPSTONE=$LIBCAPSTONE" >> $config_host_mak
if test "$numa" = "yes"; then
echo "CONFIG_NUMA=y" >> $config_host_mak
if test "$ccache_cpp2" = "yes"; then
echo "export CCACHE_CPP2=y" >> $config_host_mak
# If we're using a separate build tree, set it up now.
# DIRS are directories which we simply mkdir in the build tree;
# LINKS are things to symlink back into the source tree
# (these can be both files and directories).
# Caution: do not add files or directories here using wildcards. This
# will result in problems later if a new file matching the wildcard is
# added to the source tree -- nothing will cause configure to be rerun
# so the build tree will be missing the link back to the new file, and
# tests might fail. Prefer to keep the relevant files in their own
# directory and symlink the directory instead.
DIRS="tests tests/tcg tests/tcg/cris tests/tcg/lm32 tests/libqos tests/qapi-schema tests/tcg/xtensa tests/qemu-iotests tests/vm"
DIRS="$DIRS tests/fp"
DIRS="$DIRS docs docs/interop fsdev scsi"
DIRS="$DIRS pc-bios/optionrom pc-bios/spapr-rtas pc-bios/s390-ccw"
DIRS="$DIRS roms/seabios roms/vgabios"
LINKS="Makefile tests/tcg/Makefile qdict-test-data.txt"
LINKS="$LINKS tests/tcg/cris/Makefile tests/tcg/cris/.gdbinit"
LINKS="$LINKS tests/tcg/lm32/Makefile tests/tcg/xtensa/Makefile po/Makefile"
LINKS="$LINKS tests/fp/Makefile"
LINKS="$LINKS pc-bios/optionrom/Makefile pc-bios/keymaps"
LINKS="$LINKS pc-bios/spapr-rtas/Makefile"
LINKS="$LINKS pc-bios/s390-ccw/Makefile"
LINKS="$LINKS roms/seabios/Makefile roms/vgabios/Makefile"
LINKS="$LINKS pc-bios/qemu-icon.bmp"
LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
LINKS="$LINKS tests/acceptance tests/data"
LINKS="$LINKS tests/qemu-iotests/check"
for bios_file in \
$source_path/pc-bios/*.bin \
$source_path/pc-bios/*.lid \
$source_path/pc-bios/*.aml \
$source_path/pc-bios/*.rom \
$source_path/pc-bios/*.dtb \
$source_path/pc-bios/*.img \
$source_path/pc-bios/openbios-* \
$source_path/pc-bios/u-boot.* \
$source_path/pc-bios/palcode-*
do
LINKS="$LINKS pc-bios/$(basename $bios_file)"
mkdir -p $DIRS
for f in $LINKS ; do
if [ -e "$source_path/$f" ] && [ "$pwd_is_source_path" != "y" ]; then
symlink "$source_path/$f" "$f"
# temporary config to build submodules
for rom in seabios vgabios ; do
config_mak=roms/$rom/config.mak
echo "# Automatically generated by configure - do not modify" > $config_mak
echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
echo "AS=$as" >> $config_mak
echo "CCAS=$ccas" >> $config_mak
echo "CC=$cc" >> $config_mak
echo "BCC=bcc" >> $config_mak
echo "CPP=$cpp" >> $config_mak
echo "OBJCOPY=objcopy" >> $config_mak
echo "IASL=$iasl" >> $config_mak
echo "LD=$ld" >> $config_mak
echo "RANLIB=$ranlib" >> $config_mak
# set up qemu-iotests in this build directory
iotests_common_env="tests/qemu-iotests/common.env"
echo "# Automatically generated by configure - do not modify" > "$iotests_common_env"
echo >> "$iotests_common_env"
echo "export PYTHON='$python'" >> "$iotests_common_env"
# Save the configure command line for later reuse.
cat <<EOD >config.status
# Generated by configure.
# Run this file to recreate the current configuration.
# Compiler output produced by configure, useful for debugging
# configure, is in config.log if it exists.
EOD
preserve_env() {
envname=$1
eval envval=\$$envname
if test -n "$envval"
echo "$envname='$envval'" >> config.status
echo "export $envname" >> config.status
echo "unset $envname" >> config.status
# Preserve various env variables that influence what
# features/build target configure will detect
preserve_env AR
preserve_env AS
preserve_env CC
preserve_env CPP
preserve_env CXX
preserve_env INSTALL
preserve_env LD
preserve_env LD_LIBRARY_PATH
preserve_env LIBTOOL
preserve_env MAKE
preserve_env NM
preserve_env OBJCOPY
preserve_env PATH
preserve_env PKG_CONFIG
preserve_env PKG_CONFIG_LIBDIR
preserve_env PKG_CONFIG_PATH
preserve_env PYTHON
preserve_env SDL_CONFIG
preserve_env SDL2_CONFIG
preserve_env SMBD
preserve_env STRIP
preserve_env WINDRES
printf "exec" >>config.status
printf " '%s'" "$0" "$@" >>config.status
echo ' "$@"' >>config.status
chmod +x config.status
rm -r "$TMPDIR1"