xref: /openbmc/qemu/configure (revision b915a2f1)
17d13299dSbellard#!/bin/sh
27d13299dSbellard#
33ef693a0Sbellard# qemu configure script (c) 2003 Fabrice Bellard
47d13299dSbellard#
58cd05ab6SPeter Maydell
699519e67SCornelia Huck# Unset some variables known to interfere with behavior of common tools,
799519e67SCornelia Huck# just as autoconf does.
899519e67SCornelia HuckCLICOLOR_FORCE= GREP_OPTIONS=
999519e67SCornelia Huckunset CLICOLOR_FORCE GREP_OPTIONS
1099519e67SCornelia Huck
115e4dfd3dSJohn Snow# Don't allow CCACHE, if present, to use cached results of compile tests!
125e4dfd3dSJohn Snowexport CCACHE_RECACHE=yes
135e4dfd3dSJohn Snow
14dedad027SDaniel P. Berrangé# make source path absolute
15dedad027SDaniel P. Berrangésource_path=$(cd "$(dirname -- "$0")"; pwd)
16dedad027SDaniel P. Berrangé
17dedad027SDaniel P. Berrangéif test "$PWD" = "$source_path"
18dedad027SDaniel P. Berrangéthen
19dedad027SDaniel P. Berrangé    echo "Using './build' as the directory for build output"
20dedad027SDaniel P. Berrangé
21dedad027SDaniel P. Berrangé    MARKER=build/auto-created-by-configure
22dedad027SDaniel P. Berrangé
23dedad027SDaniel P. Berrangé    if test -e build
24dedad027SDaniel P. Berrangé    then
25dedad027SDaniel P. Berrangé        if test -f $MARKER
26dedad027SDaniel P. Berrangé        then
27dedad027SDaniel P. Berrangé           rm -rf build
28dedad027SDaniel P. Berrangé        else
29dedad027SDaniel P. Berrangé            echo "ERROR: ./build dir already exists and was not previously created by configure"
30dedad027SDaniel P. Berrangé            exit 1
31dedad027SDaniel P. Berrangé        fi
32dedad027SDaniel P. Berrangé    fi
33dedad027SDaniel P. Berrangé
34dedad027SDaniel P. Berrangé    mkdir build
35dedad027SDaniel P. Berrangé    touch $MARKER
36dedad027SDaniel P. Berrangé
37dedad027SDaniel P. Berrangé    cat > GNUmakefile <<'EOF'
38dedad027SDaniel P. Berrangé# This file is auto-generated by configure to support in-source tree
39dedad027SDaniel P. Berrangé# 'make' command invocation
40dedad027SDaniel P. Berrangé
41dedad027SDaniel P. Berrangéifeq ($(MAKECMDGOALS),)
42dedad027SDaniel P. Berrangérecurse: all
43dedad027SDaniel P. Berrangéendif
44dedad027SDaniel P. Berrangé
45dedad027SDaniel P. Berrangé.NOTPARALLEL: %
46dedad027SDaniel P. Berrangé%: force
47dedad027SDaniel P. Berrangé	@echo 'changing dir to build for $(MAKE) "$(MAKECMDGOALS)"...'
48dedad027SDaniel P. Berrangé	@$(MAKE) -C build -f Makefile $(MAKECMDGOALS)
49dedad027SDaniel P. Berrangé	@if test "$(MAKECMDGOALS)" = "distclean" && \
50dedad027SDaniel P. Berrangé	    test -e build/auto-created-by-configure ; \
51dedad027SDaniel P. Berrangé	then \
52dedad027SDaniel P. Berrangé	    rm -rf build GNUmakefile ; \
53dedad027SDaniel P. Berrangé	fi
54dedad027SDaniel P. Berrangéforce: ;
55dedad027SDaniel P. Berrangé.PHONY: force
56dedad027SDaniel P. BerrangéGNUmakefile: ;
57dedad027SDaniel P. Berrangé
58dedad027SDaniel P. BerrangéEOF
59dedad027SDaniel P. Berrangé    cd build
60dedad027SDaniel P. Berrangé    exec $source_path/configure "$@"
61dedad027SDaniel P. Berrangéfi
62dedad027SDaniel P. Berrangé
638cd05ab6SPeter Maydell# Temporary directory used for files created while
648cd05ab6SPeter Maydell# configure runs. Since it is in the build directory
658cd05ab6SPeter Maydell# we can safely blow away any previous version of it
668cd05ab6SPeter Maydell# (and we need not jump through hoops to try to delete
678cd05ab6SPeter Maydell# it when configure exits.)
688cd05ab6SPeter MaydellTMPDIR1="config-temp"
698cd05ab6SPeter Maydellrm -rf "${TMPDIR1}"
708cd05ab6SPeter Maydellmkdir -p "${TMPDIR1}"
718cd05ab6SPeter Maydellif [ $? -ne 0 ]; then
728cd05ab6SPeter Maydell    echo "ERROR: failed to create temporary directory"
738cd05ab6SPeter Maydell    exit 1
747d13299dSbellardfi
757d13299dSbellard
768cd05ab6SPeter MaydellTMPB="qemu-conf"
778cd05ab6SPeter MaydellTMPC="${TMPDIR1}/${TMPB}.c"
7866518bf6SDon SlutzTMPO="${TMPDIR1}/${TMPB}.o"
799c83ffd8SPeter MaydellTMPCXX="${TMPDIR1}/${TMPB}.cxx"
808cd05ab6SPeter MaydellTMPE="${TMPDIR1}/${TMPB}.exe"
817d13299dSbellard
82da1d85e3SGerd Hoffmannrm -f config.log
839ac81bbbSmalc
84b48e3611SPeter Maydell# Print a helpful header at the top of config.log
85b48e3611SPeter Maydellecho "# QEMU configure log $(date)" >> config.log
86979ae168SPeter Maydellprintf "# Configured with:" >> config.log
87979ae168SPeter Maydellprintf " '%s'" "$0" "$@" >> config.log
88979ae168SPeter Maydellecho >> config.log
89b48e3611SPeter Maydellecho "#" >> config.log
90b48e3611SPeter Maydell
91835af899SPaolo Bonziniquote_sh() {
92835af899SPaolo Bonzini    printf "%s" "$1" | sed "s,','\\\\'',g; s,.*,'&',"
93835af899SPaolo Bonzini}
94835af899SPaolo Bonzini
95d880a3baSPaolo Bonziniprint_error() {
96d880a3baSPaolo Bonzini    (echo
9776ad07a4SPeter Maydell    echo "ERROR: $1"
9876ad07a4SPeter Maydell    while test -n "$2"; do
9976ad07a4SPeter Maydell        echo "       $2"
10076ad07a4SPeter Maydell        shift
10176ad07a4SPeter Maydell    done
102d880a3baSPaolo Bonzini    echo) >&2
103d880a3baSPaolo Bonzini}
104d880a3baSPaolo Bonzini
105d880a3baSPaolo Bonzinierror_exit() {
106d880a3baSPaolo Bonzini    print_error "$@"
10776ad07a4SPeter Maydell    exit 1
10876ad07a4SPeter Maydell}
10976ad07a4SPeter Maydell
1109c83ffd8SPeter Maydelldo_compiler() {
1119c83ffd8SPeter Maydell    # Run the compiler, capturing its output to the log. First argument
1129c83ffd8SPeter Maydell    # is compiler binary to execute.
113630d86b7SDavid CARLIER    compiler="$1"
1149c83ffd8SPeter Maydell    shift
1158bbe05d7SIan Jackson    if test -n "$BASH_VERSION"; then eval '
1168bbe05d7SIan Jackson        echo >>config.log "
1178bbe05d7SIan Jacksonfuncs: ${FUNCNAME[*]}
1188bbe05d7SIan Jacksonlines: ${BASH_LINENO[*]}"
1198bbe05d7SIan Jackson    '; fi
1209c83ffd8SPeter Maydell    echo $compiler "$@" >> config.log
1219c83ffd8SPeter Maydell    $compiler "$@" >> config.log 2>&1 || return $?
1228dc38a78SPeter Maydell    # Test passed. If this is an --enable-werror build, rerun
1238dc38a78SPeter Maydell    # the test with -Werror and bail out if it fails. This
1248dc38a78SPeter Maydell    # makes warning-generating-errors in configure test code
1258dc38a78SPeter Maydell    # obvious to developers.
1268dc38a78SPeter Maydell    if test "$werror" != "yes"; then
1278dc38a78SPeter Maydell        return 0
1288dc38a78SPeter Maydell    fi
1298dc38a78SPeter Maydell    # Don't bother rerunning the compile if we were already using -Werror
1308dc38a78SPeter Maydell    case "$*" in
1318dc38a78SPeter Maydell        *-Werror*)
1328dc38a78SPeter Maydell           return 0
1338dc38a78SPeter Maydell        ;;
1348dc38a78SPeter Maydell    esac
1359c83ffd8SPeter Maydell    echo $compiler -Werror "$@" >> config.log
1369c83ffd8SPeter Maydell    $compiler -Werror "$@" >> config.log 2>&1 && return $?
13776ad07a4SPeter Maydell    error_exit "configure test passed without -Werror but failed with -Werror." \
13876ad07a4SPeter Maydell        "This is probably a bug in the configure script. The failing command" \
13976ad07a4SPeter Maydell        "will be at the bottom of config.log." \
14076ad07a4SPeter Maydell        "You can run configure with --disable-werror to bypass this check."
1418dc38a78SPeter Maydell}
1428dc38a78SPeter Maydell
1439c83ffd8SPeter Maydelldo_cc() {
1444dba2789SPaolo Bonzini    do_compiler "$cc" $CPU_CFLAGS "$@"
1459c83ffd8SPeter Maydell}
1469c83ffd8SPeter Maydell
1479c83ffd8SPeter Maydelldo_cxx() {
1484dba2789SPaolo Bonzini    do_compiler "$cxx" $CPU_CFLAGS "$@"
1499c83ffd8SPeter Maydell}
1509c83ffd8SPeter Maydell
15100849b92SRichard Henderson# Append $2 to the variable named $1, with space separation
15200849b92SRichard Hendersonadd_to() {
15300849b92SRichard Henderson    eval $1=\${$1:+\"\$$1 \"}\$2
15400849b92SRichard Henderson}
15500849b92SRichard Henderson
1569c83ffd8SPeter Maydellupdate_cxxflags() {
1579c83ffd8SPeter Maydell    # Set QEMU_CXXFLAGS from QEMU_CFLAGS by filtering out those
1589c83ffd8SPeter Maydell    # options which some versions of GCC's C++ compiler complain about
1599c83ffd8SPeter Maydell    # because they only make sense for C programs.
160de38c0ccSPaolo Bonzini    QEMU_CXXFLAGS="-D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"
1618a9d3d56SRichard Henderson    CONFIGURE_CXXFLAGS=$(echo "$CONFIGURE_CFLAGS" | sed s/-std=gnu11/-std=gnu++11/)
1629c83ffd8SPeter Maydell    for arg in $QEMU_CFLAGS; do
1639c83ffd8SPeter Maydell        case $arg in
1649c83ffd8SPeter Maydell            -Wstrict-prototypes|-Wmissing-prototypes|-Wnested-externs|\
1659c83ffd8SPeter Maydell            -Wold-style-declaration|-Wold-style-definition|-Wredundant-decls)
1669c83ffd8SPeter Maydell                ;;
1679c83ffd8SPeter Maydell            *)
1689c83ffd8SPeter Maydell                QEMU_CXXFLAGS=${QEMU_CXXFLAGS:+$QEMU_CXXFLAGS }$arg
1699c83ffd8SPeter Maydell                ;;
1709c83ffd8SPeter Maydell        esac
1719c83ffd8SPeter Maydell    done
1729c83ffd8SPeter Maydell}
1739c83ffd8SPeter Maydell
17452166aa0SJuan Quintelacompile_object() {
175fd0e6053SJohn Snow  local_cflags="$1"
176a2866660SPaolo Bonzini  do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
17752166aa0SJuan Quintela}
17852166aa0SJuan Quintela
17952166aa0SJuan Quintelacompile_prog() {
18052166aa0SJuan Quintela  local_cflags="$1"
18152166aa0SJuan Quintela  local_ldflags="$2"
182a2866660SPaolo Bonzini  do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC \
183a2866660SPaolo Bonzini      $LDFLAGS $EXTRA_LDFLAGS $CONFIGURE_LDFLAGS $QEMU_LDFLAGS $local_ldflags
18452166aa0SJuan Quintela}
18552166aa0SJuan Quintela
18611568d6dSPaolo Bonzini# symbolically link $1 to $2.  Portable version of "ln -sf".
18711568d6dSPaolo Bonzinisymlink() {
18872b8b5a1SStefan Weil  rm -rf "$2"
189ec5b06d7SAnthony Liguori  mkdir -p "$(dirname "$2")"
19072b8b5a1SStefan Weil  ln -s "$1" "$2"
19111568d6dSPaolo Bonzini}
19211568d6dSPaolo Bonzini
1930dba6195SLoïc Minier# check whether a command is available to this shell (may be either an
1940dba6195SLoïc Minier# executable or a builtin)
1950dba6195SLoïc Minierhas() {
1960dba6195SLoïc Minier    type "$1" >/dev/null 2>&1
1970dba6195SLoïc Minier}
1980dba6195SLoïc Minier
1990a01d76fSMarc-André Lureauversion_ge () {
2002df52b9bSAlex Bennée    local_ver1=$(expr "$1" : '\([0-9.]*\)' | tr . ' ')
2012df52b9bSAlex Bennée    local_ver2=$(echo "$2" | tr . ' ')
2020a01d76fSMarc-André Lureau    while true; do
2030a01d76fSMarc-André Lureau        set x $local_ver1
2040a01d76fSMarc-André Lureau        local_first=${2-0}
205c44a33e2SStefano Garzarella        # 'shift 2' if $2 is set, or 'shift' if $2 is not set
206c44a33e2SStefano Garzarella        shift ${2:+2}
2070a01d76fSMarc-André Lureau        local_ver1=$*
2080a01d76fSMarc-André Lureau        set x $local_ver2
2090a01d76fSMarc-André Lureau        # the second argument finished, the first must be greater or equal
2100a01d76fSMarc-André Lureau        test $# = 1 && return 0
2110a01d76fSMarc-André Lureau        test $local_first -lt $2 && return 1
2120a01d76fSMarc-André Lureau        test $local_first -gt $2 && return 0
213c44a33e2SStefano Garzarella        shift ${2:+2}
2140a01d76fSMarc-André Lureau        local_ver2=$*
2150a01d76fSMarc-André Lureau    done
2160a01d76fSMarc-André Lureau}
2170a01d76fSMarc-André Lureau
2183b6b7550SPaolo Bonziniglob() {
2193b6b7550SPaolo Bonzini    eval test -z '"${1#'"$2"'}"'
2203b6b7550SPaolo Bonzini}
2213b6b7550SPaolo Bonzini
222e9a3591fSChristian Borntraegerld_has() {
223e9a3591fSChristian Borntraeger    $ld --help 2>/dev/null | grep ".$1" >/dev/null 2>&1
224e9a3591fSChristian Borntraeger}
225e9a3591fSChristian Borntraeger
2264ace32e2SAntonio Ospiteif printf %s\\n "$source_path" "$PWD" | grep -q "[[:space:]:]";
2274ace32e2SAntonio Ospitethen
2284ace32e2SAntonio Ospite  error_exit "main directory cannot contain spaces nor colons"
2294ace32e2SAntonio Ospitefi
2304ace32e2SAntonio Ospite
23114211825SAntonio Ospite# default parameters
2322ff6b91eSJuan Quintelacpu=""
233a31a8642SMichael S. Tsirkiniasl="iasl"
2341e43adfcSbellardinterp_prefix="/usr/gnemul/qemu-%M"
23543ce4dfeSbellardstatic="no"
2363812c0c4SJoelle van Dynecross_compile="no"
2377d13299dSbellardcross_prefix=""
23887430d5bSPaolo Bonziniaudio_drv_list="default"
239b64ec4e4SFam Zhengblock_drv_rw_whitelist=""
240b64ec4e4SFam Zhengblock_drv_ro_whitelist=""
241e5f05f8cSKevin Wolfblock_drv_whitelist_tools="no"
242e49d021eSPeter Maydellhost_cc="cc"
243957f1f99SMichael Rothlibs_qga=""
2445bc62e01SGerd Hoffmanndebug_info="yes"
245cdad781dSDaniele Buonolto="false"
24663678e17SSteven Noonanstack_protector=""
2471e4f6065SDaniele Buonosafe_stack=""
248afc3a8f9SAlex Bennéeuse_containers="yes"
249f2385398SAlex Bennéegdb_bin=$(command -v "gdb-multiarch" || command -v "gdb")
250ac0df51dSaliguori
25192712822SDaniel P. Berrangeif test -e "$source_path/.git"
25292712822SDaniel P. Berrangethen
2537d7dbf9dSDan Streetman    git_submodules_action="update"
25492712822SDaniel P. Berrangeelse
2557d7dbf9dSDan Streetman    git_submodules_action="ignore"
25692712822SDaniel P. Berrangefi
2572d652f24SPaolo Bonzini
2582d652f24SPaolo Bonzinigit_submodules="ui/keycodemapdb"
259cc84d63aSDaniel P. Berrangegit="git"
260ac0df51dSaliguori
261afb63ebdSStefan Weil# Don't accept a target_list environment variable.
262afb63ebdSStefan Weilunset target_list
263447e133fSAlex Bennéeunset target_list_exclude
264377529c0SPaolo Bonzini
265377529c0SPaolo Bonzini# Default value for a variable defining feature "foo".
266377529c0SPaolo Bonzini#  * foo="no"  feature will only be used if --enable-foo arg is given
267377529c0SPaolo Bonzini#  * foo=""    feature will be searched for, and if found, will be used
268377529c0SPaolo Bonzini#              unless --disable-foo is given
269377529c0SPaolo Bonzini#  * foo="yes" this value will only be set by --enable-foo flag.
270377529c0SPaolo Bonzini#              feature will searched for,
271377529c0SPaolo Bonzini#              if not found, configure exits with error
272377529c0SPaolo Bonzini#
273377529c0SPaolo Bonzini# Always add --enable-foo and --disable-foo command line args.
274377529c0SPaolo Bonzini# Distributions want to ensure that several features are compiled in, and it
275377529c0SPaolo Bonzini# is impossible without a --enable-foo that exits if a feature is not found.
276377529c0SPaolo Bonzini
277c87ea116SAlex Bennéedefault_feature=""
278c87ea116SAlex Bennée# parse CC options second
279c87ea116SAlex Bennéefor opt do
280c87ea116SAlex Bennée  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
281c87ea116SAlex Bennée  case "$opt" in
282c87ea116SAlex Bennée      --without-default-features)
283c87ea116SAlex Bennée          default_feature="no"
284c87ea116SAlex Bennée  ;;
285c87ea116SAlex Bennée  esac
286c87ea116SAlex Bennéedone
287c87ea116SAlex Bennée
288a2866660SPaolo BonziniEXTRA_CFLAGS=""
289a2866660SPaolo BonziniEXTRA_CXXFLAGS=""
290a2866660SPaolo BonziniEXTRA_LDFLAGS=""
291a2866660SPaolo Bonzini
292c87ea116SAlex Bennéexen_ctrl_version="$default_feature"
293c87ea116SAlex Bennéemembarrier="$default_feature"
2940848f8acSThomas Huthvhost_kernel="$default_feature"
295c87ea116SAlex Bennéevhost_net="$default_feature"
296c87ea116SAlex Bennéevhost_crypto="$default_feature"
297c87ea116SAlex Bennéevhost_scsi="$default_feature"
298c87ea116SAlex Bennéevhost_vsock="$default_feature"
299d88618f7SStefan Hajnoczivhost_user="no"
300c87ea116SAlex Bennéevhost_user_fs="$default_feature"
3010848f8acSThomas Huthvhost_vdpa="$default_feature"
302c87ea116SAlex Bennéerdma="$default_feature"
303c87ea116SAlex Bennéepvrdma="$default_feature"
304377529c0SPaolo Bonzinigprof="no"
305377529c0SPaolo Bonzinidebug_tcg="no"
306377529c0SPaolo Bonzinidebug="no"
307247724cbSMarc-André Lureausanitizers="no"
3080aebab04SLingfeng Yangtsan="no"
309c87ea116SAlex Bennéefortify_source="$default_feature"
310377529c0SPaolo Bonzinistrip_opt="yes"
311377529c0SPaolo Bonzinimingw32="no"
3121d728c39SBlue Swirlgcov="no"
313c7328271SMiroslav RezaninaEXESUF=""
31417969268SFam Zhengmodules="no"
315bd83c861SChristian Ehrhardtmodule_upgrades="no"
316377529c0SPaolo Bonziniprefix="/usr/local"
31710ff82d1SMarc-André Lureauqemu_suffix="qemu"
318377529c0SPaolo Bonzinibsd="no"
319377529c0SPaolo Bonzinilinux="no"
320377529c0SPaolo Bonzinisolaris="no"
321377529c0SPaolo Bonziniprofiler="no"
322377529c0SPaolo Bonzinisoftmmu="yes"
323*b915a2f1SPaolo Bonzinilinux_user=""
324*b915a2f1SPaolo Bonzinibsd_user=""
325377529c0SPaolo Bonzinipkgversion=""
32640d6444eSAvi Kivitypie=""
3273556c233SPaolo Bonziniqom_cast_debug="yes"
328baf86d6bSPaolo Bonzinitrace_backends="log"
329377529c0SPaolo Bonzinitrace_file="trace"
330c87ea116SAlex Bennéeopengl="$default_feature"
3315dd89908SRichard Hendersoncpuid_h="no"
332c87ea116SAlex Bennéeavx2_opt="$default_feature"
333c87ea116SAlex Bennéeguest_agent="$default_feature"
334d9840e25STomoki Sekiyamaguest_agent_with_vss="no"
33550cbebb9SMichael Rothguest_agent_ntddscsi="no"
336c87ea116SAlex Bennéevss_win32_sdk="$default_feature"
337d9840e25STomoki Sekiyamawin_sdk="no"
338c87ea116SAlex Bennéewant_tools="$default_feature"
339519175a2SAlex Barcelocoroutine=""
340c87ea116SAlex Bennéecoroutine_pool="$default_feature"
3417d992e4dSPeter Lievendebug_stack_usage="no"
342f0d92b56SLongpeng(Mike)crypto_afalg="no"
343a1c5e949SDaniel P. Berrangetls_priority="NORMAL"
344c87ea116SAlex Bennéetpm="$default_feature"
345c87ea116SAlex Bennéelive_block_migration=${default_feature:-yes}
346c87ea116SAlex Bennéenuma="$default_feature"
347c87ea116SAlex Bennéereplication=${default_feature:-yes}
348c87ea116SAlex Bennéebochs=${default_feature:-yes}
349c87ea116SAlex Bennéecloop=${default_feature:-yes}
350c87ea116SAlex Bennéedmg=${default_feature:-yes}
351c87ea116SAlex Bennéeqcow1=${default_feature:-yes}
352c87ea116SAlex Bennéevdi=${default_feature:-yes}
353c87ea116SAlex Bennéevvfat=${default_feature:-yes}
354c87ea116SAlex Bennéeqed=${default_feature:-yes}
355c87ea116SAlex Bennéeparallels=${default_feature:-yes}
356ba59fb77SPaolo Bonzinidebug_mutex="no"
357ba4dd2aaSAlex Bennéeplugins="$default_feature"
358b767d257SMarek Marczykowski-Góreckirng_none="no"
359c87ea116SAlex Bennéesecret_keyring="$default_feature"
360a5665051SPaolo Bonzinimeson=""
3613b4da132SPaolo Bonzinimeson_args=""
36248328880SPaolo Bonzinininja=""
3633b4da132SPaolo Bonzinigio="$default_feature"
364a5665051SPaolo Bonziniskip_meson=no
365b8e0c493SJoelle van Dyneslirp_smbd="$default_feature"
366377529c0SPaolo Bonzini
3673b4da132SPaolo Bonzini# The following Meson options are handled manually (still they
3683b4da132SPaolo Bonzini# are included in the automatically generated help message)
3693b4da132SPaolo Bonzini
3703b4da132SPaolo Bonzini# 1. Track which submodules are needed
3713b4da132SPaolo Bonzinicapstone="auto"
3723b4da132SPaolo Bonzinifdt="auto"
3733b4da132SPaolo Bonzinislirp="auto"
3743b4da132SPaolo Bonzini
3753b4da132SPaolo Bonzini# 2. Support --with/--without option
3763b4da132SPaolo Bonzinidefault_devices="true"
3773b4da132SPaolo Bonzini
3783b4da132SPaolo Bonzini# 3. Automatically enable/disable other options
3793b4da132SPaolo Bonzinitcg="enabled"
3803b4da132SPaolo Bonzinicfi="false"
3813b4da132SPaolo Bonzini
3823b4da132SPaolo Bonzini# 4. Detection partly done in configure
3833b4da132SPaolo Bonzinixen=${default_feature:+disabled}
384898be3e0SPeter Maydell
385c87ea116SAlex Bennée# parse CC options second
386ac0df51dSaliguorifor opt do
38789138857SStefan Weil  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
388ac0df51dSaliguori  case "$opt" in
389ac0df51dSaliguori  --cross-prefix=*) cross_prefix="$optarg"
3903812c0c4SJoelle van Dyne                    cross_compile="yes"
391ac0df51dSaliguori  ;;
3923d8df640SPaolo Bonzini  --cc=*) CC="$optarg"
393ac0df51dSaliguori  ;;
39483f73fceSTomoki Sekiyama  --cxx=*) CXX="$optarg"
39583f73fceSTomoki Sekiyama  ;;
3962ff6b91eSJuan Quintela  --cpu=*) cpu="$optarg"
3972ff6b91eSJuan Quintela  ;;
398a2866660SPaolo Bonzini  --extra-cflags=*)
399a2866660SPaolo Bonzini    EXTRA_CFLAGS="$EXTRA_CFLAGS $optarg"
400a2866660SPaolo Bonzini    EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS $optarg"
401e2a2ed06SJuan Quintela    ;;
402a2866660SPaolo Bonzini  --extra-cxxflags=*) EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS $optarg"
40311cde1c8SBruno Dominguez  ;;
404a2866660SPaolo Bonzini  --extra-ldflags=*) EXTRA_LDFLAGS="$EXTRA_LDFLAGS $optarg"
405e2a2ed06SJuan Quintela  ;;
4065bc62e01SGerd Hoffmann  --enable-debug-info) debug_info="yes"
4075bc62e01SGerd Hoffmann  ;;
4085bc62e01SGerd Hoffmann  --disable-debug-info) debug_info="no"
4095bc62e01SGerd Hoffmann  ;;
410d75402b5SAlex Bennée  --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"
411d75402b5SAlex Bennée  ;;
412d422b2bcSAlex Bennée  --cross-cc-cflags-*) cc_arch=${opt#--cross-cc-flags-}; cc_arch=${cc_arch%%=*}
413d422b2bcSAlex Bennée                      eval "cross_cc_cflags_${cc_arch}=\$optarg"
4142038f8c8SPaolo Bonzini                      cross_cc_vars="$cross_cc_vars cross_cc_cflags_${cc_arch}"
415d422b2bcSAlex Bennée  ;;
416d75402b5SAlex Bennée  --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}
4172038f8c8SPaolo Bonzini                cc_archs="$cc_archs $cc_arch"
418d75402b5SAlex Bennée                eval "cross_cc_${cc_arch}=\$optarg"
4192038f8c8SPaolo Bonzini                cross_cc_vars="$cross_cc_vars cross_cc_${cc_arch}"
420d75402b5SAlex Bennée  ;;
421ac0df51dSaliguori  esac
422ac0df51dSaliguoridone
423ac0df51dSaliguori# OS specific
424ac0df51dSaliguori# Using uname is really, really broken.  Once we have the right set of checks
42593148aa5SStefan Weil# we can eliminate its usage altogether.
426ac0df51dSaliguori
427e49d021eSPeter Maydell# Preferred compiler:
428e49d021eSPeter Maydell#  ${CC} (if set)
429e49d021eSPeter Maydell#  ${cross_prefix}gcc (if cross-prefix specified)
430e49d021eSPeter Maydell#  system compiler
431e49d021eSPeter Maydellif test -z "${CC}${cross_prefix}"; then
432e49d021eSPeter Maydell  cc="$host_cc"
433e49d021eSPeter Maydellelse
434b3198cc2SStuart Yoder  cc="${CC-${cross_prefix}gcc}"
435e49d021eSPeter Maydellfi
436e49d021eSPeter Maydell
43783f73fceSTomoki Sekiyamaif test -z "${CXX}${cross_prefix}"; then
43883f73fceSTomoki Sekiyama  cxx="c++"
43983f73fceSTomoki Sekiyamaelse
44083f73fceSTomoki Sekiyama  cxx="${CXX-${cross_prefix}g++}"
44183f73fceSTomoki Sekiyamafi
44283f73fceSTomoki Sekiyama
443b3198cc2SStuart Yoderar="${AR-${cross_prefix}ar}"
444cdbd727cSRichard Hendersonas="${AS-${cross_prefix}as}"
4455f6f0e27SRichard Hendersonccas="${CCAS-$cc}"
4463dd46c78SBlue Swirlcpp="${CPP-$cc -E}"
447b3198cc2SStuart Yoderobjcopy="${OBJCOPY-${cross_prefix}objcopy}"
448b3198cc2SStuart Yoderld="${LD-${cross_prefix}ld}"
4499f81aeb5SAlistair Francisranlib="${RANLIB-${cross_prefix}ranlib}"
4504852ee95SStefan Weilnm="${NM-${cross_prefix}nm}"
451b3198cc2SStuart Yoderstrip="${STRIP-${cross_prefix}strip}"
452b3198cc2SStuart Yoderwindres="${WINDRES-${cross_prefix}windres}"
45317884d7bSSergei Trofimovichpkg_config_exe="${PKG_CONFIG-${cross_prefix}pkg-config}"
45417884d7bSSergei Trofimovichquery_pkg_config() {
45517884d7bSSergei Trofimovich    "${pkg_config_exe}" ${QEMU_PKG_CONFIG_FLAGS} "$@"
45617884d7bSSergei Trofimovich}
45717884d7bSSergei Trofimovichpkg_config=query_pkg_config
45847c03744SDave Airliesdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
459ac0df51dSaliguori
460be17dc90SMichael S. Tsirkin# default flags for all hosts
4612d31515bSPeter Maydell# We use -fwrapv to tell the compiler that we require a C dialect where
4622d31515bSPeter Maydell# left shift of signed integers is well defined and has the expected
4632d31515bSPeter Maydell# 2s-complement style results. (Both clang and gcc agree that it
4642d31515bSPeter Maydell# provides these semantics.)
465de38c0ccSPaolo BonziniQEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv"
466086d5f75SPaolo BonziniQEMU_CFLAGS="-Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS"
467c95e3080SKevin WolfQEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS"
468be17dc90SMichael S. TsirkinQEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
4695770e8afSPaolo Bonzini
470de38c0ccSPaolo BonziniQEMU_LDFLAGS=
471de38c0ccSPaolo Bonzini
4725770e8afSPaolo Bonzini# Flags that are needed during configure but later taken care of by Meson
4738a9d3d56SRichard HendersonCONFIGURE_CFLAGS="-std=gnu11 -Wall"
4745770e8afSPaolo BonziniCONFIGURE_LDFLAGS=
475086d5f75SPaolo Bonzini
476be17dc90SMichael S. Tsirkin
477ac0df51dSaliguoricheck_define() {
478ac0df51dSaliguoricat > $TMPC <<EOF
479ac0df51dSaliguori#if !defined($1)
480fd786e1aSPeter Maydell#error $1 not defined
481ac0df51dSaliguori#endif
482ac0df51dSaliguoriint main(void) { return 0; }
483ac0df51dSaliguoriEOF
48452166aa0SJuan Quintela  compile_object
485ac0df51dSaliguori}
486ac0df51dSaliguori
487307119e7SGerd Hoffmanncheck_include() {
488307119e7SGerd Hoffmanncat > $TMPC <<EOF
489307119e7SGerd Hoffmann#include <$1>
490307119e7SGerd Hoffmannint main(void) { return 0; }
491307119e7SGerd HoffmannEOF
492307119e7SGerd Hoffmann  compile_object
493307119e7SGerd Hoffmann}
494307119e7SGerd Hoffmann
49593b25869SJohn Snowwrite_c_skeleton() {
49693b25869SJohn Snow    cat > $TMPC <<EOF
49793b25869SJohn Snowint main(void) { return 0; }
49893b25869SJohn SnowEOF
49993b25869SJohn Snow}
50093b25869SJohn Snow
501bbea4050SPeter Maydellif check_define __linux__ ; then
502ba7c60c2SPaolo Bonzini  targetos=linux
503bbea4050SPeter Maydellelif check_define _WIN32 ; then
504ba7c60c2SPaolo Bonzini  targetos=windows
505bbea4050SPeter Maydellelif check_define __OpenBSD__ ; then
506ba7c60c2SPaolo Bonzini  targetos=openbsd
507bbea4050SPeter Maydellelif check_define __sun__ ; then
508ba7c60c2SPaolo Bonzini  targetos=sunos
509bbea4050SPeter Maydellelif check_define __HAIKU__ ; then
510ba7c60c2SPaolo Bonzini  targetos=haiku
511951fedfcSPeter Maydellelif check_define __FreeBSD__ ; then
512ba7c60c2SPaolo Bonzini  targetos=freebsd
513951fedfcSPeter Maydellelif check_define __FreeBSD_kernel__ && check_define __GLIBC__; then
514ba7c60c2SPaolo Bonzini  targetos=gnu/kfreebsd
515951fedfcSPeter Maydellelif check_define __DragonFly__ ; then
516ba7c60c2SPaolo Bonzini  targetos=dragonfly
517951fedfcSPeter Maydellelif check_define __NetBSD__; then
518ba7c60c2SPaolo Bonzini  targetos=netbsd
519951fedfcSPeter Maydellelif check_define __APPLE__; then
520ba7c60c2SPaolo Bonzini  targetos=darwin
521bbea4050SPeter Maydellelse
522951fedfcSPeter Maydell  # This is a fatal error, but don't report it yet, because we
523951fedfcSPeter Maydell  # might be going to just print the --help text, or it might
524951fedfcSPeter Maydell  # be the result of a missing compiler.
525ba7c60c2SPaolo Bonzini  targetos=bogus
526bbea4050SPeter Maydellfi
527bbea4050SPeter Maydell
52865eff01bSPaolo Bonzini# OS specific
52965eff01bSPaolo Bonzini
53065eff01bSPaolo Bonzinicase $targetos in
53165eff01bSPaolo Bonziniwindows)
53265eff01bSPaolo Bonzini  mingw32="yes"
53365eff01bSPaolo Bonzini  plugins="no"
53465eff01bSPaolo Bonzini  pie="no"
53565eff01bSPaolo Bonzini;;
53665eff01bSPaolo Bonzinignu/kfreebsd)
53765eff01bSPaolo Bonzini  bsd="yes"
53865eff01bSPaolo Bonzini;;
53965eff01bSPaolo Bonzinifreebsd)
54065eff01bSPaolo Bonzini  bsd="yes"
54165eff01bSPaolo Bonzini  make="${MAKE-gmake}"
54265eff01bSPaolo Bonzini  # needed for kinfo_getvmmap(3) in libutil.h
54365eff01bSPaolo Bonzini;;
54465eff01bSPaolo Bonzinidragonfly)
54565eff01bSPaolo Bonzini  bsd="yes"
54665eff01bSPaolo Bonzini  make="${MAKE-gmake}"
54765eff01bSPaolo Bonzini;;
54865eff01bSPaolo Bonzininetbsd)
54965eff01bSPaolo Bonzini  bsd="yes"
55065eff01bSPaolo Bonzini  make="${MAKE-gmake}"
55165eff01bSPaolo Bonzini;;
55265eff01bSPaolo Bonziniopenbsd)
55365eff01bSPaolo Bonzini  bsd="yes"
55465eff01bSPaolo Bonzini  make="${MAKE-gmake}"
55565eff01bSPaolo Bonzini;;
55665eff01bSPaolo Bonzinidarwin)
55765eff01bSPaolo Bonzini  bsd="yes"
55865eff01bSPaolo Bonzini  darwin="yes"
55965eff01bSPaolo Bonzini  # Disable attempts to use ObjectiveC features in os/object.h since they
56065eff01bSPaolo Bonzini  # won't work when we're compiling with gcc as a C compiler.
56165eff01bSPaolo Bonzini  QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS"
56265eff01bSPaolo Bonzini;;
56365eff01bSPaolo Bonzinisunos)
56465eff01bSPaolo Bonzini  solaris="yes"
56565eff01bSPaolo Bonzini  make="${MAKE-gmake}"
56665eff01bSPaolo Bonzini  smbd="${SMBD-/usr/sfw/sbin/smbd}"
56765eff01bSPaolo Bonzini# needed for CMSG_ macros in sys/socket.h
56865eff01bSPaolo Bonzini  QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS"
56965eff01bSPaolo Bonzini# needed for TIOCWIN* defines in termios.h
57065eff01bSPaolo Bonzini  QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
57165eff01bSPaolo Bonzini  # $(uname -m) returns i86pc even on an x86_64 box, so default based on isainfo
57265eff01bSPaolo Bonzini  # Note that this check is broken for cross-compilation: if you're
573bbea4050SPeter Maydell  # cross-compiling to one of these OSes then you'll need to specify
574bbea4050SPeter Maydell  # the correct CPU with the --cpu option.
575bbea4050SPeter Maydell  if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then
576bbea4050SPeter Maydell    cpu="x86_64"
577bbea4050SPeter Maydell  fi
57865eff01bSPaolo Bonzini;;
57965eff01bSPaolo Bonzinihaiku)
58065eff01bSPaolo Bonzini  pie="no"
58165eff01bSPaolo Bonzini  QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS -D_BSD_SOURCE -fPIC $QEMU_CFLAGS"
58265eff01bSPaolo Bonzini;;
58365eff01bSPaolo Bonzinilinux)
58465eff01bSPaolo Bonzini  linux="yes"
58565eff01bSPaolo Bonzini  vhost_user=${default_feature:-yes}
58665eff01bSPaolo Bonzini;;
587bbea4050SPeter Maydellesac
588bbea4050SPeter Maydell
5892ff6b91eSJuan Quintelaif test ! -z "$cpu" ; then
5902ff6b91eSJuan Quintela  # command line argument
5912ff6b91eSJuan Quintela  :
5922ff6b91eSJuan Quintelaelif check_define __i386__ ; then
593ac0df51dSaliguori  cpu="i386"
594ac0df51dSaliguorielif check_define __x86_64__ ; then
595c72b26ecSRichard Henderson  if check_define __ILP32__ ; then
596c72b26ecSRichard Henderson    cpu="x32"
597c72b26ecSRichard Henderson  else
598ac0df51dSaliguori    cpu="x86_64"
599c72b26ecSRichard Henderson  fi
6003aa9bd6cSblueswir1elif check_define __sparc__ ; then
6013aa9bd6cSblueswir1  if check_define __arch64__ ; then
6023aa9bd6cSblueswir1    cpu="sparc64"
6033aa9bd6cSblueswir1  else
6043aa9bd6cSblueswir1    cpu="sparc"
6053aa9bd6cSblueswir1  fi
606fdf7ed96Smalcelif check_define _ARCH_PPC ; then
607fdf7ed96Smalc  if check_define _ARCH_PPC64 ; then
608f8378accSRichard Henderson    if check_define _LITTLE_ENDIAN ; then
609f8378accSRichard Henderson      cpu="ppc64le"
610f8378accSRichard Henderson    else
611fdf7ed96Smalc      cpu="ppc64"
612f8378accSRichard Henderson    fi
613ac0df51dSaliguori  else
614fdf7ed96Smalc    cpu="ppc"
615fdf7ed96Smalc  fi
616afa05235SAurelien Jarnoelif check_define __mips__ ; then
617afa05235SAurelien Jarno  cpu="mips"
618d66ed0eaSAurelien Jarnoelif check_define __s390__ ; then
619d66ed0eaSAurelien Jarno  if check_define __s390x__ ; then
620d66ed0eaSAurelien Jarno    cpu="s390x"
621d66ed0eaSAurelien Jarno  else
622d66ed0eaSAurelien Jarno    cpu="s390"
623d66ed0eaSAurelien Jarno  fi
624c4f80543SAlistair Franciselif check_define __riscv ; then
625ba0e7333SRichard Henderson  cpu="riscv"
62621d89f84SPeter Maydellelif check_define __arm__ ; then
62721d89f84SPeter Maydell  cpu="arm"
6281f080313SClaudio Fontanaelif check_define __aarch64__ ; then
6291f080313SClaudio Fontana  cpu="aarch64"
630dfcf900bSWANG Xueruielif check_define __loongarch64 ; then
631dfcf900bSWANG Xuerui  cpu="loongarch64"
632fdf7ed96Smalcelse
63389138857SStefan Weil  cpu=$(uname -m)
634ac0df51dSaliguorifi
635ac0df51dSaliguori
636823eb013SPaolo Bonzini# Normalise host CPU name, set multilib cflags
637359bc95dSPeter Maydell# Note that this case should only have supported host CPUs, not guests.
6387d13299dSbellardcase "$cpu" in
639e4da0e39SPaolo Bonzini  armv*b|armv*l|arm)
640e4da0e39SPaolo Bonzini    cpu="arm" ;;
641e4da0e39SPaolo Bonzini
6427d13299dSbellard  i386|i486|i586|i686|i86pc|BePC)
64397a847bcSbellard    cpu="i386"
644e4da0e39SPaolo Bonzini    CPU_CFLAGS="-m32" ;;
645e4da0e39SPaolo Bonzini  x32)
6464da270beSPaolo Bonzini    cpu="x86_64"
647e4da0e39SPaolo Bonzini    CPU_CFLAGS="-mx32" ;;
648aaa5fa14Saurel32  x86_64|amd64)
649aaa5fa14Saurel32    cpu="x86_64"
650e4da0e39SPaolo Bonzini    # ??? Only extremely old AMD cpus do not have cmpxchg16b.
651e4da0e39SPaolo Bonzini    # If we truly care, we should simply detect this case at
652e4da0e39SPaolo Bonzini    # runtime and generate the fallback to serial emulation.
653e4da0e39SPaolo Bonzini    CPU_CFLAGS="-m64 -mcx16" ;;
654e4da0e39SPaolo Bonzini
655afa05235SAurelien Jarno  mips*)
656e4da0e39SPaolo Bonzini    cpu="mips" ;;
657e4da0e39SPaolo Bonzini
658e4da0e39SPaolo Bonzini  ppc)
659e4da0e39SPaolo Bonzini    CPU_CFLAGS="-m32" ;;
660e4da0e39SPaolo Bonzini  ppc64)
661d8ff892dSPaolo Bonzini    CPU_CFLAGS="-m64 -mbig" ;;
662e4da0e39SPaolo Bonzini  ppc64le)
663d8ff892dSPaolo Bonzini    cpu="ppc64"
664d8ff892dSPaolo Bonzini    CPU_CFLAGS="-m64 -mlittle" ;;
665e4da0e39SPaolo Bonzini
666e4da0e39SPaolo Bonzini  s390)
667823eb013SPaolo Bonzini    CPU_CFLAGS="-m31" ;;
668e4da0e39SPaolo Bonzini  s390x)
669e4da0e39SPaolo Bonzini    CPU_CFLAGS="-m64" ;;
670e4da0e39SPaolo Bonzini
6713142255cSblueswir1  sparc|sun4[cdmuv])
672ae228531Sbellard    cpu="sparc"
673e4da0e39SPaolo Bonzini    CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc" ;;
674e4da0e39SPaolo Bonzini  sparc64)
675e4da0e39SPaolo Bonzini    CPU_CFLAGS="-m64 -mcpu=ultrasparc" ;;
6767d13299dSbellardesac
677e2d52ad3SJuan Quintela
6780db4a067SPaolo Bonzini: ${make=${MAKE-make}}
679b6daf4d3SPaolo Bonzini
680faf44142SDaniel P. Berrangé# We prefer python 3.x. A bare 'python' is traditionally
681faf44142SDaniel P. Berrangé# python 2.x, but some distros have it as python 3.x, so
682ddf90699SEduardo Habkost# we check that too
683faf44142SDaniel P. Berrangépython=
6840a01d76fSMarc-André Lureauexplicit_python=no
685ddf90699SEduardo Habkostfor binary in "${PYTHON-python3}" python
686faf44142SDaniel P. Berrangédo
687faf44142SDaniel P. Berrangé    if has "$binary"
688faf44142SDaniel P. Berrangé    then
68995c5f2deSPaolo Bonzini        python=$(command -v "$binary")
690faf44142SDaniel P. Berrangé        break
691faf44142SDaniel P. Berrangé    fi
692faf44142SDaniel P. Berrangédone
693903458c8SMarkus Armbruster
694903458c8SMarkus Armbruster
69539d87c8cSAlex Bennée# Check for ancillary tools used in testing
69639d87c8cSAlex Bennéegenisoimage=
6973df437c7SAlex Bennéefor binary in genisoimage mkisofs
69839d87c8cSAlex Bennéedo
69939d87c8cSAlex Bennée    if has $binary
70039d87c8cSAlex Bennée    then
70139d87c8cSAlex Bennée        genisoimage=$(command -v "$binary")
70239d87c8cSAlex Bennée        break
70339d87c8cSAlex Bennée    fi
70439d87c8cSAlex Bennéedone
70539d87c8cSAlex Bennée
7063c4a4d0dSPeter Maydell# Default objcc to clang if available, otherwise use CC
7073c4a4d0dSPeter Maydellif has clang; then
7083c4a4d0dSPeter Maydell  objcc=clang
7093c4a4d0dSPeter Maydellelse
7103c4a4d0dSPeter Maydell  objcc="$cc"
7113c4a4d0dSPeter Maydellfi
7123c4a4d0dSPeter Maydell
7133457a3f8SJuan Quintelaif test "$mingw32" = "yes" ; then
7143457a3f8SJuan Quintela  EXESUF=".exe"
71578e9d4adSStefan Weil  # MinGW needs -mthreads for TLS and macro _MT.
7165770e8afSPaolo Bonzini  CONFIGURE_CFLAGS="-mthreads $CONFIGURE_CFLAGS"
71793b25869SJohn Snow  write_c_skeleton;
718d17f305aSPaolo Bonzini  prefix="/qemu"
71977433a5fSMarc-André Lureau  qemu_suffix=""
720105fad6bSBishara AbuHattoum  libs_qga="-lws2_32 -lwinmm -lpowrprof -lwtsapi32 -lwininet -liphlpapi -lnetapi32 $libs_qga"
7213457a3f8SJuan Quintelafi
7223457a3f8SJuan Quintela
723487fefdbSAnthony Liguoriwerror=""
72485aa5189Sbellard
72561d63097SPaolo Bonzini. $source_path/scripts/meson-buildoptions.sh
72661d63097SPaolo Bonzini
72761d63097SPaolo Bonzinimeson_options=
72861d63097SPaolo Bonzinimeson_option_parse() {
72961d63097SPaolo Bonzini  meson_options="$meson_options $(_meson_option_parse "$@")"
73061d63097SPaolo Bonzini  if test $? -eq 1; then
73161d63097SPaolo Bonzini    echo "ERROR: unknown option $1"
73261d63097SPaolo Bonzini    echo "Try '$0 --help' for more information"
73361d63097SPaolo Bonzini    exit 1
73461d63097SPaolo Bonzini  fi
73561d63097SPaolo Bonzini}
73661d63097SPaolo Bonzini
7377d13299dSbellardfor opt do
73889138857SStefan Weil  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
7397d13299dSbellard  case "$opt" in
7402efc3265Sbellard  --help|-h) show_help=yes
7412efc3265Sbellard  ;;
74299123e13SMike Frysinger  --version|-V) exec cat $source_path/VERSION
74399123e13SMike Frysinger  ;;
744b1a550a0Spbrook  --prefix=*) prefix="$optarg"
7457d13299dSbellard  ;;
746b1a550a0Spbrook  --interp-prefix=*) interp_prefix="$optarg"
74732ce6337Sbellard  ;;
748ac0df51dSaliguori  --cross-prefix=*)
7497d13299dSbellard  ;;
750ac0df51dSaliguori  --cc=*)
7517d13299dSbellard  ;;
752b1a550a0Spbrook  --host-cc=*) host_cc="$optarg"
75383469015Sbellard  ;;
75483f73fceSTomoki Sekiyama  --cxx=*)
75583f73fceSTomoki Sekiyama  ;;
756e007dbecSMichael S. Tsirkin  --iasl=*) iasl="$optarg"
757e007dbecSMichael S. Tsirkin  ;;
7583c4a4d0dSPeter Maydell  --objcc=*) objcc="$optarg"
7593c4a4d0dSPeter Maydell  ;;
760b1a550a0Spbrook  --make=*) make="$optarg"
7617d13299dSbellard  ;;
762b6daf4d3SPaolo Bonzini  --install=*)
7636a882643Spbrook  ;;
7640a01d76fSMarc-André Lureau  --python=*) python="$optarg" ; explicit_python=yes
765c886edfbSBlue Swirl  ;;
7662eb054c2SPeter Maydell  --sphinx-build=*) sphinx_build="$optarg"
7672eb054c2SPeter Maydell  ;;
768a5665051SPaolo Bonzini  --skip-meson) skip_meson=yes
769a5665051SPaolo Bonzini  ;;
770a5665051SPaolo Bonzini  --meson=*) meson="$optarg"
771a5665051SPaolo Bonzini  ;;
77248328880SPaolo Bonzini  --ninja=*) ninja="$optarg"
77348328880SPaolo Bonzini  ;;
774e2d8830eSBrad  --smbd=*) smbd="$optarg"
775e2d8830eSBrad  ;;
776e2a2ed06SJuan Quintela  --extra-cflags=*)
7777d13299dSbellard  ;;
77811cde1c8SBruno Dominguez  --extra-cxxflags=*)
77911cde1c8SBruno Dominguez  ;;
780e2a2ed06SJuan Quintela  --extra-ldflags=*)
7817d13299dSbellard  ;;
7825bc62e01SGerd Hoffmann  --enable-debug-info)
7835bc62e01SGerd Hoffmann  ;;
7845bc62e01SGerd Hoffmann  --disable-debug-info)
7855bc62e01SGerd Hoffmann  ;;
786d75402b5SAlex Bennée  --cross-cc-*)
787d75402b5SAlex Bennée  ;;
78817969268SFam Zheng  --enable-modules)
78917969268SFam Zheng      modules="yes"
79017969268SFam Zheng  ;;
7913aa88b31SStefan Hajnoczi  --disable-modules)
7923aa88b31SStefan Hajnoczi      modules="no"
7933aa88b31SStefan Hajnoczi  ;;
794bd83c861SChristian Ehrhardt  --disable-module-upgrades) module_upgrades="no"
795bd83c861SChristian Ehrhardt  ;;
796bd83c861SChristian Ehrhardt  --enable-module-upgrades) module_upgrades="yes"
797bd83c861SChristian Ehrhardt  ;;
7982ff6b91eSJuan Quintela  --cpu=*)
7997d13299dSbellard  ;;
800b1a550a0Spbrook  --target-list=*) target_list="$optarg"
801447e133fSAlex Bennée                   if test "$target_list_exclude"; then
802447e133fSAlex Bennée                       error_exit "Can't mix --target-list with --target-list-exclude"
803447e133fSAlex Bennée                   fi
804447e133fSAlex Bennée  ;;
805447e133fSAlex Bennée  --target-list-exclude=*) target_list_exclude="$optarg"
806447e133fSAlex Bennée                   if test "$target_list"; then
807447e133fSAlex Bennée                       error_exit "Can't mix --target-list-exclude with --target-list"
808447e133fSAlex Bennée                   fi
809de83cd02Sbellard  ;;
81074242e0fSPaolo Bonzini  --with-trace-file=*) trace_file="$optarg"
8119410b56cSPrerna Saxena  ;;
8127bc3ca7fSPaolo Bonzini  --with-default-devices) default_devices="true"
813f3494749SPaolo Bonzini  ;;
8147bc3ca7fSPaolo Bonzini  --without-default-devices) default_devices="false"
815f3494749SPaolo Bonzini  ;;
816d1d5e9eeSAlex Bennée  --with-devices-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --with-devices-FOO option"
817d1d5e9eeSAlex Bennée  ;;
818d1d5e9eeSAlex Bennée  --with-devices-*) device_arch=${opt#--with-devices-};
819d1d5e9eeSAlex Bennée                    device_arch=${device_arch%%=*}
820d1d5e9eeSAlex Bennée                    cf=$source_path/configs/devices/$device_arch-softmmu/$optarg.mak
821d1d5e9eeSAlex Bennée                    if test -f "$cf"; then
822d1d5e9eeSAlex Bennée                        device_archs="$device_archs $device_arch"
823d1d5e9eeSAlex Bennée                        eval "devices_${device_arch}=\$optarg"
824d1d5e9eeSAlex Bennée                    else
825d1d5e9eeSAlex Bennée                        error_exit "File $cf does not exist"
826d1d5e9eeSAlex Bennée                    fi
827d1d5e9eeSAlex Bennée  ;;
828c87ea116SAlex Bennée  --without-default-features) # processed above
829c87ea116SAlex Bennée  ;;
8307d13299dSbellard  --enable-gprof) gprof="yes"
8317d13299dSbellard  ;;
8321d728c39SBlue Swirl  --enable-gcov) gcov="yes"
8331d728c39SBlue Swirl  ;;
83479427693SLoïc Minier  --static)
83579427693SLoïc Minier    static="yes"
83617884d7bSSergei Trofimovich    QEMU_PKG_CONFIG_FLAGS="--static $QEMU_PKG_CONFIG_FLAGS"
83743ce4dfeSbellard  ;;
8380b24e75fSPaolo Bonzini  --mandir=*) mandir="$optarg"
8390b24e75fSPaolo Bonzini  ;;
8400b24e75fSPaolo Bonzini  --bindir=*) bindir="$optarg"
8410b24e75fSPaolo Bonzini  ;;
8423aa5d2beSAlon Levy  --libdir=*) libdir="$optarg"
8433aa5d2beSAlon Levy  ;;
8448bf188aaSMichael Tokarev  --libexecdir=*) libexecdir="$optarg"
8458bf188aaSMichael Tokarev  ;;
8460f94d6daSAlon Levy  --includedir=*) includedir="$optarg"
8470f94d6daSAlon Levy  ;;
848528ae5b8SEduardo Habkost  --datadir=*) datadir="$optarg"
8490b24e75fSPaolo Bonzini  ;;
85077433a5fSMarc-André Lureau  --with-suffix=*) qemu_suffix="$optarg"
851023d3d67SEduardo Habkost  ;;
852c6502638SBruce Rogers  --docdir=*) docdir="$optarg"
8530b24e75fSPaolo Bonzini  ;;
854fe0038beSPaolo Bonzini  --localedir=*) localedir="$optarg"
855fe0038beSPaolo Bonzini  ;;
856ca2fb938SAndre Przywara  --sysconfdir=*) sysconfdir="$optarg"
85707381cc1SAnthony Liguori  ;;
858785c23aeSLuiz Capitulino  --localstatedir=*) local_statedir="$optarg"
859785c23aeSLuiz Capitulino  ;;
8603d5eecabSGerd Hoffmann  --firmwarepath=*) firmwarepath="$optarg"
8613d5eecabSGerd Hoffmann  ;;
862181ce1d0SOlaf Hering  --host=*|--build=*|\
863181ce1d0SOlaf Hering  --disable-dependency-tracking|\
864785c23aeSLuiz Capitulino  --sbindir=*|--sharedstatedir=*|\
865fe0038beSPaolo Bonzini  --oldincludedir=*|--datarootdir=*|--infodir=*|\
866023ddd74SMax Filippov  --htmldir=*|--dvidir=*|--pdfdir=*|--psdir=*)
867023ddd74SMax Filippov    # These switches are silently ignored, for compatibility with
868023ddd74SMax Filippov    # autoconf-generated configure scripts. This allows QEMU's
869023ddd74SMax Filippov    # configure to be used by RPM and similar macros that set
870023ddd74SMax Filippov    # lots of directory switches by default.
871023ddd74SMax Filippov  ;;
8723556c233SPaolo Bonzini  --disable-qom-cast-debug) qom_cast_debug="no"
8733556c233SPaolo Bonzini  ;;
8743556c233SPaolo Bonzini  --enable-qom-cast-debug) qom_cast_debug="yes"
8753556c233SPaolo Bonzini  ;;
8760c58ac1cSmalc  --audio-drv-list=*) audio_drv_list="$optarg"
8770c58ac1cSmalc  ;;
87889138857SStefan Weil  --block-drv-rw-whitelist=*|--block-drv-whitelist=*) block_drv_rw_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
879b64ec4e4SFam Zheng  ;;
88089138857SStefan Weil  --block-drv-ro-whitelist=*) block_drv_ro_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
881eb852011SMarkus Armbruster  ;;
882e5f05f8cSKevin Wolf  --enable-block-drv-whitelist-in-tools) block_drv_whitelist_tools="yes"
883e5f05f8cSKevin Wolf  ;;
884e5f05f8cSKevin Wolf  --disable-block-drv-whitelist-in-tools) block_drv_whitelist_tools="no"
885e5f05f8cSKevin Wolf  ;;
886f8393946Saurel32  --enable-debug-tcg) debug_tcg="yes"
887f8393946Saurel32  ;;
888f8393946Saurel32  --disable-debug-tcg) debug_tcg="no"
889f8393946Saurel32  ;;
890f3d08ee6SPaul Brook  --enable-debug)
891f3d08ee6SPaul Brook      # Enable debugging options that aren't excessively noisy
892f3d08ee6SPaul Brook      debug_tcg="yes"
8931fcc6d42SPeter Xu      debug_mutex="yes"
894f3d08ee6SPaul Brook      debug="yes"
895f3d08ee6SPaul Brook      strip_opt="no"
896b553a042SJohn Snow      fortify_source="no"
897f3d08ee6SPaul Brook  ;;
898247724cbSMarc-André Lureau  --enable-sanitizers) sanitizers="yes"
899247724cbSMarc-André Lureau  ;;
900247724cbSMarc-André Lureau  --disable-sanitizers) sanitizers="no"
901247724cbSMarc-André Lureau  ;;
9020aebab04SLingfeng Yang  --enable-tsan) tsan="yes"
9030aebab04SLingfeng Yang  ;;
9040aebab04SLingfeng Yang  --disable-tsan) tsan="no"
9050aebab04SLingfeng Yang  ;;
9061625af87Saliguori  --disable-strip) strip_opt="no"
9071625af87Saliguori  ;;
9084d34a86bSPaolo Bonzini  --disable-slirp) slirp="disabled"
909c20709aaSbellard  ;;
910fd6fc214SPaolo Bonzini  --enable-slirp) slirp="enabled"
911fd6fc214SPaolo Bonzini  ;;
9124d34a86bSPaolo Bonzini  --enable-slirp=git) slirp="internal"
9137c57bdd8SMarc-André Lureau  ;;
91403a3c0b3SPaolo Bonzini  --enable-slirp=*) slirp="$optarg"
915675b9b53SMarc-André Lureau  ;;
9161badb709SPaolo Bonzini  --disable-xen) xen="disabled"
917e37630caSaliguori  ;;
9181badb709SPaolo Bonzini  --enable-xen) xen="enabled"
919fc321b4bSJuan Quintela  ;;
9201badb709SPaolo Bonzini  --disable-tcg) tcg="disabled"
921d1a14257SAlex Bennée                 plugins="no"
922b3f6ea7eSPaolo Bonzini  ;;
9231badb709SPaolo Bonzini  --enable-tcg) tcg="enabled"
924b3f6ea7eSPaolo Bonzini  ;;
92505c2a3e7Sbellard  --enable-profiler) profiler="yes"
92605c2a3e7Sbellard  ;;
927cad25d69Spbrook  --disable-system) softmmu="no"
9280a8e90f4Spbrook  ;;
929cad25d69Spbrook  --enable-system) softmmu="yes"
9300a8e90f4Spbrook  ;;
9310953a80fSZachary Amsden  --disable-user)
9320953a80fSZachary Amsden      linux_user="no" ;
9330953a80fSZachary Amsden      bsd_user="no" ;
9340953a80fSZachary Amsden  ;;
9350953a80fSZachary Amsden  --enable-user) ;;
936831b7825Sths  --disable-linux-user) linux_user="no"
9370a8e90f4Spbrook  ;;
938831b7825Sths  --enable-linux-user) linux_user="yes"
939831b7825Sths  ;;
94084778508Sblueswir1  --disable-bsd-user) bsd_user="no"
94184778508Sblueswir1  ;;
94284778508Sblueswir1  --enable-bsd-user) bsd_user="yes"
94384778508Sblueswir1  ;;
94440d6444eSAvi Kivity  --enable-pie) pie="yes"
94534005a00SKirill A. Shutemov  ;;
94640d6444eSAvi Kivity  --disable-pie) pie="no"
94734005a00SKirill A. Shutemov  ;;
94885aa5189Sbellard  --enable-werror) werror="yes"
94985aa5189Sbellard  ;;
95085aa5189Sbellard  --disable-werror) werror="no"
95185aa5189Sbellard  ;;
952cdad781dSDaniele Buono  --enable-lto) lto="true"
953cdad781dSDaniele Buono  ;;
954cdad781dSDaniele Buono  --disable-lto) lto="false"
955cdad781dSDaniele Buono  ;;
95663678e17SSteven Noonan  --enable-stack-protector) stack_protector="yes"
95763678e17SSteven Noonan  ;;
95863678e17SSteven Noonan  --disable-stack-protector) stack_protector="no"
95963678e17SSteven Noonan  ;;
9601e4f6065SDaniele Buono  --enable-safe-stack) safe_stack="yes"
9611e4f6065SDaniele Buono  ;;
9621e4f6065SDaniele Buono  --disable-safe-stack) safe_stack="no"
9631e4f6065SDaniele Buono  ;;
9649e62ba48SDaniele Buono  --enable-cfi)
9659e62ba48SDaniele Buono      cfi="true";
9669e62ba48SDaniele Buono      lto="true";
9679e62ba48SDaniele Buono  ;;
9689e62ba48SDaniele Buono  --disable-cfi) cfi="false"
9699e62ba48SDaniele Buono  ;;
970fbb4121dSPaolo Bonzini  --disable-fdt) fdt="disabled"
9712df87df7SJuan Quintela  ;;
972fbb4121dSPaolo Bonzini  --enable-fdt) fdt="enabled"
973fbb4121dSPaolo Bonzini  ;;
974fbb4121dSPaolo Bonzini  --enable-fdt=git) fdt="internal"
975fbb4121dSPaolo Bonzini  ;;
97603a3c0b3SPaolo Bonzini  --enable-fdt=*) fdt="$optarg"
9772df87df7SJuan Quintela  ;;
978a40161cbSPaolo Bonzini  --disable-membarrier) membarrier="no"
979a40161cbSPaolo Bonzini  ;;
980a40161cbSPaolo Bonzini  --enable-membarrier) membarrier="yes"
981a40161cbSPaolo Bonzini  ;;
9827e563bfbSThomas Huth  --with-pkgversion=*) pkgversion="$optarg"
9834a19f1ecSpbrook  ;;
984519175a2SAlex Barcelo  --with-coroutine=*) coroutine="$optarg"
985519175a2SAlex Barcelo  ;;
98670c60c08SStefan Hajnoczi  --disable-coroutine-pool) coroutine_pool="no"
98770c60c08SStefan Hajnoczi  ;;
98870c60c08SStefan Hajnoczi  --enable-coroutine-pool) coroutine_pool="yes"
98970c60c08SStefan Hajnoczi  ;;
9907d992e4dSPeter Lieven  --enable-debug-stack-usage) debug_stack_usage="yes"
9917d992e4dSPeter Lieven  ;;
992f0d92b56SLongpeng(Mike)  --enable-crypto-afalg) crypto_afalg="yes"
993f0d92b56SLongpeng(Mike)  ;;
994f0d92b56SLongpeng(Mike)  --disable-crypto-afalg) crypto_afalg="no"
995f0d92b56SLongpeng(Mike)  ;;
996d5970055SMichael S. Tsirkin  --disable-vhost-net) vhost_net="no"
997d5970055SMichael S. Tsirkin  ;;
998d5970055SMichael S. Tsirkin  --enable-vhost-net) vhost_net="yes"
999d5970055SMichael S. Tsirkin  ;;
1000042cea27SGonglei  --disable-vhost-crypto) vhost_crypto="no"
1001042cea27SGonglei  ;;
1002299e6f19SPaolo Bonzini  --enable-vhost-crypto) vhost_crypto="yes"
1003042cea27SGonglei  ;;
10045e9be92dSNicholas Bellinger  --disable-vhost-scsi) vhost_scsi="no"
10055e9be92dSNicholas Bellinger  ;;
10065e9be92dSNicholas Bellinger  --enable-vhost-scsi) vhost_scsi="yes"
10075e9be92dSNicholas Bellinger  ;;
1008fc0b9b0eSStefan Hajnoczi  --disable-vhost-vsock) vhost_vsock="no"
1009fc0b9b0eSStefan Hajnoczi  ;;
1010fc0b9b0eSStefan Hajnoczi  --enable-vhost-vsock) vhost_vsock="yes"
1011fc0b9b0eSStefan Hajnoczi  ;;
101298fc1adaSDr. David Alan Gilbert  --disable-vhost-user-fs) vhost_user_fs="no"
101398fc1adaSDr. David Alan Gilbert  ;;
101498fc1adaSDr. David Alan Gilbert  --enable-vhost-user-fs) vhost_user_fs="yes"
101598fc1adaSDr. David Alan Gilbert  ;;
1016da076ffeSGerd Hoffmann  --disable-opengl) opengl="no"
101720ff075bSMichael Walle  ;;
1018da076ffeSGerd Hoffmann  --enable-opengl) opengl="yes"
101920ff075bSMichael Walle  ;;
10201ffb3bbbSPaolo Bonzini  --disable-zlib-test)
10211ece9905SAlon Levy  ;;
1022d138cee9SMichael Roth  --enable-guest-agent) guest_agent="yes"
1023d138cee9SMichael Roth  ;;
1024d138cee9SMichael Roth  --disable-guest-agent) guest_agent="no"
1025d138cee9SMichael Roth  ;;
1026d9840e25STomoki Sekiyama  --with-vss-sdk) vss_win32_sdk=""
1027d9840e25STomoki Sekiyama  ;;
1028d9840e25STomoki Sekiyama  --with-vss-sdk=*) vss_win32_sdk="$optarg"
1029d9840e25STomoki Sekiyama  ;;
1030d9840e25STomoki Sekiyama  --without-vss-sdk) vss_win32_sdk="no"
1031d9840e25STomoki Sekiyama  ;;
1032d9840e25STomoki Sekiyama  --with-win-sdk) win_sdk=""
1033d9840e25STomoki Sekiyama  ;;
1034d9840e25STomoki Sekiyama  --with-win-sdk=*) win_sdk="$optarg"
1035d9840e25STomoki Sekiyama  ;;
1036d9840e25STomoki Sekiyama  --without-win-sdk) win_sdk="no"
1037d9840e25STomoki Sekiyama  ;;
10384b1c11fdSDaniel P. Berrange  --enable-tools) want_tools="yes"
10394b1c11fdSDaniel P. Berrange  ;;
10404b1c11fdSDaniel P. Berrange  --disable-tools) want_tools="no"
10414b1c11fdSDaniel P. Berrange  ;;
104286583a07SLiam Merwick  --disable-avx2) avx2_opt="no"
104386583a07SLiam Merwick  ;;
104486583a07SLiam Merwick  --enable-avx2) avx2_opt="yes"
104586583a07SLiam Merwick  ;;
10466b8cd447SRobert Hoo  --disable-avx512f) avx512f_opt="no"
10476b8cd447SRobert Hoo  ;;
10486b8cd447SRobert Hoo  --enable-avx512f) avx512f_opt="yes"
10496b8cd447SRobert Hoo  ;;
105052b53c04SFam Zheng  --disable-virtio-blk-data-plane|--enable-virtio-blk-data-plane)
105152b53c04SFam Zheng      echo "$0: $opt is obsolete, virtio-blk data-plane is always on" >&2
1052583f6e7bSStefan Hajnoczi  ;;
1053cb6414dfSFam Zheng  --enable-vhdx|--disable-vhdx)
1054cb6414dfSFam Zheng      echo "$0: $opt is obsolete, VHDX driver is always built" >&2
1055cb6414dfSFam Zheng  ;;
1056315d3184SFam Zheng  --enable-uuid|--disable-uuid)
1057315d3184SFam Zheng      echo "$0: $opt is obsolete, UUID support is always built" >&2
1058315d3184SFam Zheng  ;;
1059a1c5e949SDaniel P. Berrange  --tls-priority=*) tls_priority="$optarg"
1060a1c5e949SDaniel P. Berrange  ;;
10612da776dbSMichael R. Hines  --enable-rdma) rdma="yes"
10622da776dbSMichael R. Hines  ;;
10632da776dbSMichael R. Hines  --disable-rdma) rdma="no"
10642da776dbSMichael R. Hines  ;;
106521ab34c9SMarcel Apfelbaum  --enable-pvrdma) pvrdma="yes"
106621ab34c9SMarcel Apfelbaum  ;;
106721ab34c9SMarcel Apfelbaum  --disable-pvrdma) pvrdma="no"
106821ab34c9SMarcel Apfelbaum  ;;
1069e91c793cSCole Robinson  --disable-tpm) tpm="no"
1070e91c793cSCole Robinson  ;;
1071ab214c29SStefan Berger  --enable-tpm) tpm="yes"
1072ab214c29SStefan Berger  ;;
1073ed1701c6SDr. David Alan Gilbert  --disable-live-block-migration) live_block_migration="no"
1074ed1701c6SDr. David Alan Gilbert  ;;
1075ed1701c6SDr. David Alan Gilbert  --enable-live-block-migration) live_block_migration="yes"
1076ed1701c6SDr. David Alan Gilbert  ;;
1077a99d57bbSWanlong Gao  --disable-numa) numa="no"
1078a99d57bbSWanlong Gao  ;;
1079a99d57bbSWanlong Gao  --enable-numa) numa="yes"
1080a99d57bbSWanlong Gao  ;;
1081a6b1d4c0SChanglong Xie  --disable-replication) replication="no"
1082a6b1d4c0SChanglong Xie  ;;
1083a6b1d4c0SChanglong Xie  --enable-replication) replication="yes"
1084a6b1d4c0SChanglong Xie  ;;
10852f740136SJeff Cody  --disable-bochs) bochs="no"
10862f740136SJeff Cody  ;;
10872f740136SJeff Cody  --enable-bochs) bochs="yes"
10882f740136SJeff Cody  ;;
10892f740136SJeff Cody  --disable-cloop) cloop="no"
10902f740136SJeff Cody  ;;
10912f740136SJeff Cody  --enable-cloop) cloop="yes"
10922f740136SJeff Cody  ;;
10932f740136SJeff Cody  --disable-dmg) dmg="no"
10942f740136SJeff Cody  ;;
10952f740136SJeff Cody  --enable-dmg) dmg="yes"
10962f740136SJeff Cody  ;;
10972f740136SJeff Cody  --disable-qcow1) qcow1="no"
10982f740136SJeff Cody  ;;
10992f740136SJeff Cody  --enable-qcow1) qcow1="yes"
11002f740136SJeff Cody  ;;
11012f740136SJeff Cody  --disable-vdi) vdi="no"
11022f740136SJeff Cody  ;;
11032f740136SJeff Cody  --enable-vdi) vdi="yes"
11042f740136SJeff Cody  ;;
11052f740136SJeff Cody  --disable-vvfat) vvfat="no"
11062f740136SJeff Cody  ;;
11072f740136SJeff Cody  --enable-vvfat) vvfat="yes"
11082f740136SJeff Cody  ;;
11092f740136SJeff Cody  --disable-qed) qed="no"
11102f740136SJeff Cody  ;;
11112f740136SJeff Cody  --enable-qed) qed="yes"
11122f740136SJeff Cody  ;;
11132f740136SJeff Cody  --disable-parallels) parallels="no"
11142f740136SJeff Cody  ;;
11152f740136SJeff Cody  --enable-parallels) parallels="yes"
11162f740136SJeff Cody  ;;
1117e6a74868SMarc-André Lureau  --disable-vhost-user) vhost_user="no"
1118e6a74868SMarc-André Lureau  ;;
1119299e6f19SPaolo Bonzini  --enable-vhost-user) vhost_user="yes"
1120299e6f19SPaolo Bonzini  ;;
1121108a6481SCindy Lu  --disable-vhost-vdpa) vhost_vdpa="no"
1122108a6481SCindy Lu  ;;
1123108a6481SCindy Lu  --enable-vhost-vdpa) vhost_vdpa="yes"
1124108a6481SCindy Lu  ;;
1125299e6f19SPaolo Bonzini  --disable-vhost-kernel) vhost_kernel="no"
1126299e6f19SPaolo Bonzini  ;;
1127299e6f19SPaolo Bonzini  --enable-vhost-kernel) vhost_kernel="yes"
1128e6a74868SMarc-André Lureau  ;;
11298b18cdbfSRichard Henderson  --disable-capstone) capstone="disabled"
11308ca80760SRichard Henderson  ;;
11318b18cdbfSRichard Henderson  --enable-capstone) capstone="enabled"
11328ca80760SRichard Henderson  ;;
11338b18cdbfSRichard Henderson  --enable-capstone=git) capstone="internal"
1134e219c499SRichard Henderson  ;;
113503a3c0b3SPaolo Bonzini  --enable-capstone=*) capstone="$optarg"
1136e219c499SRichard Henderson  ;;
1137cc84d63aSDaniel P. Berrange  --with-git=*) git="$optarg"
1138cc84d63aSDaniel P. Berrange  ;;
11397d7dbf9dSDan Streetman  --with-git-submodules=*)
11407d7dbf9dSDan Streetman      git_submodules_action="$optarg"
1141f62bbee5SDaniel P. Berrange  ;;
1142ba59fb77SPaolo Bonzini  --enable-debug-mutex) debug_mutex=yes
1143ba59fb77SPaolo Bonzini  ;;
1144ba59fb77SPaolo Bonzini  --disable-debug-mutex) debug_mutex=no
1145ba59fb77SPaolo Bonzini  ;;
11469b8e4298SAlex Bennée  --enable-plugins) if test "$mingw32" = "yes"; then
11479b8e4298SAlex Bennée                        error_exit "TCG plugins not currently supported on Windows platforms"
11489b8e4298SAlex Bennée                    else
11499b8e4298SAlex Bennée                        plugins="yes"
11509b8e4298SAlex Bennée                    fi
115140e8c6f4SAlex Bennée  ;;
115240e8c6f4SAlex Bennée  --disable-plugins) plugins="no"
115340e8c6f4SAlex Bennée  ;;
1154afc3a8f9SAlex Bennée  --enable-containers) use_containers="yes"
1155afc3a8f9SAlex Bennée  ;;
1156afc3a8f9SAlex Bennée  --disable-containers) use_containers="no"
1157afc3a8f9SAlex Bennée  ;;
1158f48e590aSAlex Bennée  --gdb=*) gdb_bin="$optarg"
1159f48e590aSAlex Bennée  ;;
1160b767d257SMarek Marczykowski-Górecki  --enable-rng-none) rng_none=yes
1161b767d257SMarek Marczykowski-Górecki  ;;
1162b767d257SMarek Marczykowski-Górecki  --disable-rng-none) rng_none=no
1163b767d257SMarek Marczykowski-Górecki  ;;
116454e7aac0SAlexey Krasikov  --enable-keyring) secret_keyring="yes"
116554e7aac0SAlexey Krasikov  ;;
116654e7aac0SAlexey Krasikov  --disable-keyring) secret_keyring="no"
116754e7aac0SAlexey Krasikov  ;;
116820cf7b8eSDenis Plotnikov  --enable-gio) gio=yes
116920cf7b8eSDenis Plotnikov  ;;
117020cf7b8eSDenis Plotnikov  --disable-gio) gio=no
117120cf7b8eSDenis Plotnikov  ;;
1172b8e0c493SJoelle van Dyne  --enable-slirp-smbd) slirp_smbd=yes
1173b8e0c493SJoelle van Dyne  ;;
1174b8e0c493SJoelle van Dyne  --disable-slirp-smbd) slirp_smbd=no
1175b8e0c493SJoelle van Dyne  ;;
11763b4da132SPaolo Bonzini  # backwards compatibility options
11773b4da132SPaolo Bonzini  --enable-trace-backend=*) meson_option_parse "--enable-trace-backends=$optarg" "$optarg"
11783b4da132SPaolo Bonzini  ;;
11793b4da132SPaolo Bonzini  --disable-blobs) meson_option_parse --disable-install-blobs ""
11803b4da132SPaolo Bonzini  ;;
11813b4da132SPaolo Bonzini  --enable-tcmalloc) meson_option_parse --enable-malloc=tcmalloc tcmalloc
11823b4da132SPaolo Bonzini  ;;
11833b4da132SPaolo Bonzini  --enable-jemalloc) meson_option_parse --enable-malloc=jemalloc jemalloc
11843b4da132SPaolo Bonzini  ;;
11853b4da132SPaolo Bonzini  # everything else has the same name in configure and meson
118661d63097SPaolo Bonzini  --enable-* | --disable-*) meson_option_parse "$opt" "$optarg"
118761d63097SPaolo Bonzini  ;;
11882d2ad6d0SFam Zheng  *)
11892d2ad6d0SFam Zheng      echo "ERROR: unknown option $opt"
11902d2ad6d0SFam Zheng      echo "Try '$0 --help' for more information"
11912d2ad6d0SFam Zheng      exit 1
11927f1559c6Sbalrog  ;;
11937d13299dSbellard  esac
11947d13299dSbellarddone
11957d13299dSbellard
1196d1a14257SAlex Bennée# test for any invalid configuration combinations
1197d1a14257SAlex Bennéeif test "$plugins" = "yes" -a "$tcg" = "disabled"; then
1198d1a14257SAlex Bennée    error_exit "Can't enable plugins on non-TCG builds"
1199d1a14257SAlex Bennéefi
1200d1a14257SAlex Bennée
12017d7dbf9dSDan Streetmancase $git_submodules_action in
12027d7dbf9dSDan Streetman    update|validate)
12037d7dbf9dSDan Streetman        if test ! -e "$source_path/.git"; then
12047d7dbf9dSDan Streetman            echo "ERROR: cannot $git_submodules_action git submodules without .git"
12057d7dbf9dSDan Streetman            exit 1
12067d7dbf9dSDan Streetman        fi
12077d7dbf9dSDan Streetman    ;;
12087d7dbf9dSDan Streetman    ignore)
1209b80fd281SPaolo Bonzini        if ! test -f "$source_path/ui/keycodemapdb/README"
1210b80fd281SPaolo Bonzini        then
1211b80fd281SPaolo Bonzini            echo
1212b80fd281SPaolo Bonzini            echo "ERROR: missing GIT submodules"
1213b80fd281SPaolo Bonzini            echo
1214b80fd281SPaolo Bonzini            if test -e "$source_path/.git"; then
1215b80fd281SPaolo Bonzini                echo "--with-git-submodules=ignore specified but submodules were not"
1216b80fd281SPaolo Bonzini                echo "checked out.  Please initialize and update submodules."
1217b80fd281SPaolo Bonzini            else
1218b80fd281SPaolo Bonzini                echo "This is not a GIT checkout but module content appears to"
1219b80fd281SPaolo Bonzini                echo "be missing. Do not use 'git archive' or GitHub download links"
1220b80fd281SPaolo Bonzini                echo "to acquire QEMU source archives. Non-GIT builds are only"
1221b80fd281SPaolo Bonzini                echo "supported with source archives linked from:"
1222b80fd281SPaolo Bonzini                echo
1223b80fd281SPaolo Bonzini                echo "  https://www.qemu.org/download/#source"
1224b80fd281SPaolo Bonzini                echo
1225b80fd281SPaolo Bonzini                echo "Developers working with GIT can use scripts/archive-source.sh"
1226b80fd281SPaolo Bonzini                echo "if they need to create valid source archives."
1227b80fd281SPaolo Bonzini            fi
1228b80fd281SPaolo Bonzini            echo
1229b80fd281SPaolo Bonzini            exit 1
1230b80fd281SPaolo Bonzini        fi
12317d7dbf9dSDan Streetman    ;;
12327d7dbf9dSDan Streetman    *)
12337d7dbf9dSDan Streetman        echo "ERROR: invalid --with-git-submodules= value '$git_submodules_action'"
12347d7dbf9dSDan Streetman        exit 1
12357d7dbf9dSDan Streetman    ;;
12367d7dbf9dSDan Streetmanesac
12377d7dbf9dSDan Streetman
123822a87800SMarc-André Lureaulibdir="${libdir:-$prefix/lib}"
123922a87800SMarc-André Lureaulibexecdir="${libexecdir:-$prefix/libexec}"
124022a87800SMarc-André Lureauincludedir="${includedir:-$prefix/include}"
124122a87800SMarc-André Lureau
124222a87800SMarc-André Lureauif test "$mingw32" = "yes" ; then
124315588a62SJoshua Watt    bindir="${bindir:-$prefix}"
124422a87800SMarc-André Lureauelse
124515588a62SJoshua Watt    bindir="${bindir:-$prefix/bin}"
124615588a62SJoshua Wattfi
124722a87800SMarc-André Lureaumandir="${mandir:-$prefix/share/man}"
124822a87800SMarc-André Lureaudatadir="${datadir:-$prefix/share}"
1249ca8c0909SMarc-André Lureaudocdir="${docdir:-$prefix/share/doc}"
125022a87800SMarc-André Lureausysconfdir="${sysconfdir:-$prefix/etc}"
125122a87800SMarc-André Lureaulocal_statedir="${local_statedir:-$prefix/var}"
125216bf7a33SPaolo Bonzinifirmwarepath="${firmwarepath:-$datadir/qemu-firmware}"
125316bf7a33SPaolo Bonzinilocaledir="${localedir:-$datadir/locale}"
125422a87800SMarc-André Lureau
12559557af9cSAlex Bennéeif eval test -z "\${cross_cc_$cpu}"; then
1256b1aa4de1SAlex Bennée    eval "cross_cc_${cpu}=\$cc"
12572038f8c8SPaolo Bonzini    cross_cc_vars="$cross_cc_vars cross_cc_${cpu}"
12589557af9cSAlex Bennéefi
125979f3b12fSPeter Crosthwaite
126060e0df25SPeter Maydelldefault_target_list=""
126143692239SMarkus Armbrusterdeprecated_targets_list=ppc64abi32-linux-user
1262fdb75aefSPaolo Bonzinideprecated_features=""
12636e92f823SPeter Maydellmak_wilds=""
12646e92f823SPeter Maydell
1265*b915a2f1SPaolo Bonziniif [ "$linux_user" != no ]; then
1266*b915a2f1SPaolo Bonzini    if [ "$targetos" = linux ] && [ -d $source_path/linux-user/include/host/$cpu ]; then
1267*b915a2f1SPaolo Bonzini        linux_user=yes
1268*b915a2f1SPaolo Bonzini    elif [ "$linux_user" = yes ]; then
1269*b915a2f1SPaolo Bonzini        error_exit "linux-user not supported on this architecture"
1270*b915a2f1SPaolo Bonzini    fi
1271*b915a2f1SPaolo Bonzinifi
1272*b915a2f1SPaolo Bonziniif [ "$bsd_user" != no ]; then
1273*b915a2f1SPaolo Bonzini    if [ "$bsd_user" = "" ]; then
1274*b915a2f1SPaolo Bonzini        test $targetos = freebsd && bsd_user=yes
1275*b915a2f1SPaolo Bonzini    fi
1276*b915a2f1SPaolo Bonzini    if [ "$bsd_user" = yes ] && ! [ -d $source_path/bsd-user/$targetos ]; then
1277*b915a2f1SPaolo Bonzini        error_exit "bsd-user not supported on this host OS"
1278*b915a2f1SPaolo Bonzini    fi
1279*b915a2f1SPaolo Bonzinifi
128060e0df25SPeter Maydellif [ "$softmmu" = "yes" ]; then
1281812b31d3SAlex Bennée    mak_wilds="${mak_wilds} $source_path/configs/targets/*-softmmu.mak"
128260e0df25SPeter Maydellfi
128360e0df25SPeter Maydellif [ "$linux_user" = "yes" ]; then
1284812b31d3SAlex Bennée    mak_wilds="${mak_wilds} $source_path/configs/targets/*-linux-user.mak"
128560e0df25SPeter Maydellfi
128660e0df25SPeter Maydellif [ "$bsd_user" = "yes" ]; then
1287812b31d3SAlex Bennée    mak_wilds="${mak_wilds} $source_path/configs/targets/*-bsd-user.mak"
128860e0df25SPeter Maydellfi
128960e0df25SPeter Maydell
12903a5ae4a9SAlex Bennée# If the user doesn't explicitly specify a deprecated target we will
12913a5ae4a9SAlex Bennée# skip it.
12923a5ae4a9SAlex Bennéeif test -z "$target_list"; then
12933a5ae4a9SAlex Bennée    if test -z "$target_list_exclude"; then
12943a5ae4a9SAlex Bennée        target_list_exclude="$deprecated_targets_list"
12953a5ae4a9SAlex Bennée    else
12963a5ae4a9SAlex Bennée        target_list_exclude="$target_list_exclude,$deprecated_targets_list"
12973a5ae4a9SAlex Bennée    fi
12982d838d9bSAlex Bennéefi
12992d838d9bSAlex Bennée
1300447e133fSAlex Bennéefor config in $mak_wilds; do
1301447e133fSAlex Bennée    target="$(basename "$config" .mak)"
130298db9a06SAlex Bennée    if echo "$target_list_exclude" | grep -vq "$target"; then
1303447e133fSAlex Bennée        default_target_list="${default_target_list} $target"
1304447e133fSAlex Bennée    fi
1305447e133fSAlex Bennéedone
13066e92f823SPeter Maydell
1307af5db58eSpbrookif test x"$show_help" = x"yes" ; then
1308af5db58eSpbrookcat << EOF
1309af5db58eSpbrook
1310af5db58eSpbrookUsage: configure [options]
1311af5db58eSpbrookOptions: [defaults in brackets after descriptions]
1312af5db58eSpbrook
131308fb77edSStefan WeilStandard options:
131408fb77edSStefan Weil  --help                   print this message
131508fb77edSStefan Weil  --prefix=PREFIX          install in PREFIX [$prefix]
131608fb77edSStefan Weil  --interp-prefix=PREFIX   where to find shared libraries, etc.
131708fb77edSStefan Weil                           use %M for cpu name [$interp_prefix]
13182deca810SAlex Bennée  --target-list=LIST       set target list (default: build all non-deprecated)
131908fb77edSStefan Weil$(echo Available targets: $default_target_list | \
132008fb77edSStefan Weil  fold -s -w 53 | sed -e 's/^/                           /')
13212deca810SAlex Bennée$(echo Deprecated targets: $deprecated_targets_list | \
13222deca810SAlex Bennée  fold -s -w 53 | sed -e 's/^/                           /')
1323447e133fSAlex Bennée  --target-list-exclude=LIST exclude a set of targets from the default target-list
132408fb77edSStefan Weil
132508fb77edSStefan WeilAdvanced options (experts only):
13263812c0c4SJoelle van Dyne  --cross-prefix=PREFIX    use PREFIX for compile tools, PREFIX can be blank [$cross_prefix]
132708fb77edSStefan Weil  --cc=CC                  use C compiler CC [$cc]
132808fb77edSStefan Weil  --iasl=IASL              use ACPI compiler IASL [$iasl]
132908fb77edSStefan Weil  --host-cc=CC             use C compiler CC [$host_cc] for code run at
133008fb77edSStefan Weil                           build time
133108fb77edSStefan Weil  --cxx=CXX                use C++ compiler CXX [$cxx]
133208fb77edSStefan Weil  --objcc=OBJCC            use Objective-C compiler OBJCC [$objcc]
1333a2866660SPaolo Bonzini  --extra-cflags=CFLAGS    append extra C compiler flags CFLAGS
1334a2866660SPaolo Bonzini  --extra-cxxflags=CXXFLAGS append extra C++ compiler flags CXXFLAGS
133508fb77edSStefan Weil  --extra-ldflags=LDFLAGS  append extra linker flags LDFLAGS
1336d75402b5SAlex Bennée  --cross-cc-ARCH=CC       use compiler when building ARCH guest test cases
1337d422b2bcSAlex Bennée  --cross-cc-flags-ARCH=   use compiler flags when building ARCH guest tests
133808fb77edSStefan Weil  --make=MAKE              use specified make [$make]
133908fb77edSStefan Weil  --python=PYTHON          use specified python [$python]
13402eb054c2SPeter Maydell  --sphinx-build=SPHINX    use specified sphinx-build [$sphinx_build]
1341a5665051SPaolo Bonzini  --meson=MESON            use specified meson [$meson]
134248328880SPaolo Bonzini  --ninja=NINJA            use specified ninja [$ninja]
134308fb77edSStefan Weil  --smbd=SMBD              use specified smbd [$smbd]
1344db1b5f13SThomas Huth  --with-git=GIT           use specified git [$git]
13457d7dbf9dSDan Streetman  --with-git-submodules=update   update git submodules (default if .git dir exists)
13467d7dbf9dSDan Streetman  --with-git-submodules=validate fail if git submodules are not up to date
13477d7dbf9dSDan Streetman  --with-git-submodules=ignore   do not update or check git submodules (default if no .git dir)
134808fb77edSStefan Weil  --static                 enable static build [$static]
134908fb77edSStefan Weil  --mandir=PATH            install man pages in PATH
135010ff82d1SMarc-André Lureau  --datadir=PATH           install firmware in PATH/$qemu_suffix
1351fe0038beSPaolo Bonzini  --localedir=PATH         install translation in PATH/$qemu_suffix
135210ff82d1SMarc-André Lureau  --docdir=PATH            install documentation in PATH/$qemu_suffix
135308fb77edSStefan Weil  --bindir=PATH            install binaries in PATH
135408fb77edSStefan Weil  --libdir=PATH            install libraries in PATH
1355db1b5f13SThomas Huth  --libexecdir=PATH        install helper binaries in PATH
135610ff82d1SMarc-André Lureau  --sysconfdir=PATH        install config in PATH/$qemu_suffix
135708fb77edSStefan Weil  --localstatedir=PATH     install local state in PATH (set at runtime on win32)
13583d5eecabSGerd Hoffmann  --firmwarepath=PATH      search PATH for firmware files
135913336606SRobert Foley  --efi-aarch64=PATH       PATH of efi file to use for aarch64 VMs.
1360ca8c0909SMarc-André Lureau  --with-suffix=SUFFIX     suffix for QEMU data inside datadir/libdir/sysconfdir/docdir [$qemu_suffix]
1361db1b5f13SThomas Huth  --with-pkgversion=VERS   use specified string as sub-version of the package
1362c035c8d6SPaolo Bonzini  --without-default-features default all --enable-* options to "disabled"
1363c035c8d6SPaolo Bonzini  --without-default-devices  do not include any device that is not needed to
1364c035c8d6SPaolo Bonzini                           start the emulator (only use if you are including
1365d1d5e9eeSAlex Bennée                           desired devices in configs/devices/)
1366d1d5e9eeSAlex Bennée  --with-devices-ARCH=NAME override default configs/devices
136708fb77edSStefan Weil  --enable-debug           enable common debug build options
1368247724cbSMarc-André Lureau  --enable-sanitizers      enable default sanitizers
13690aebab04SLingfeng Yang  --enable-tsan            enable thread sanitizer
137008fb77edSStefan Weil  --disable-strip          disable stripping binaries
137108fb77edSStefan Weil  --disable-werror         disable compilation abort on warning
137263678e17SSteven Noonan  --disable-stack-protector disable compiler-provided stack protection
137316bfbc70SPaolo Bonzini  --audio-drv-list=LIST    set audio drivers to try if -audiodev is not used
137408fb77edSStefan Weil  --block-drv-whitelist=L  Same as --block-drv-rw-whitelist=L
137508fb77edSStefan Weil  --block-drv-rw-whitelist=L
137608fb77edSStefan Weil                           set block driver read-write whitelist
1377e5f05f8cSKevin Wolf                           (by default affects only QEMU, not tools like qemu-img)
137808fb77edSStefan Weil  --block-drv-ro-whitelist=L
137908fb77edSStefan Weil                           set block driver read-only whitelist
1380e5f05f8cSKevin Wolf                           (by default affects only QEMU, not tools like qemu-img)
1381e5f05f8cSKevin Wolf  --enable-block-drv-whitelist-in-tools
1382e5f05f8cSKevin Wolf                           use block whitelist also in tools instead of only QEMU
138308fb77edSStefan Weil  --with-trace-file=NAME   Full PATH,NAME of file to store traces
138408fb77edSStefan Weil                           Default:trace-<pid>
1385c23f23b9SMichael Tokarev  --cpu=CPU                Build for host CPU [$cpu]
138608fb77edSStefan Weil  --with-coroutine=BACKEND coroutine backend. Supported options:
138733c53c54SDaniel P. Berrange                           ucontext, sigaltstack, windows
138808fb77edSStefan Weil  --enable-gcov            enable test coverage analysis with gcov
1389c23f23b9SMichael Tokarev  --with-vss-sdk=SDK-path  enable Windows VSS support in QEMU Guest Agent
1390c23f23b9SMichael Tokarev  --with-win-sdk=SDK-path  path to Windows Platform SDK (to build VSS .tlb)
1391a1c5e949SDaniel P. Berrange  --tls-priority           default TLS protocol/cipher priority string
1392c12d66aaSLin Ma  --enable-gprof           QEMU profiling with gprof
1393c12d66aaSLin Ma  --enable-profiler        profiler support
1394c12d66aaSLin Ma  --enable-debug-stack-usage
1395c12d66aaSLin Ma                           track the maximum stack usage of stacks created by qemu_alloc_stack
139640e8c6f4SAlex Bennée  --enable-plugins
139740e8c6f4SAlex Bennée                           enable plugins via shared library loading
1398afc3a8f9SAlex Bennée  --disable-containers     don't use containers for cross-building
1399f48e590aSAlex Bennée  --gdb=GDB-path           gdb to use for gdbstub tests [$gdb_bin]
140061d63097SPaolo BonziniEOF
140161d63097SPaolo Bonzini  meson_options_help
140261d63097SPaolo Bonzinicat << EOF
1403c23f23b9SMichael Tokarev  system          all system emulation targets
1404c23f23b9SMichael Tokarev  user            supported user emulation targets
1405c23f23b9SMichael Tokarev  linux-user      all linux usermode emulation targets
1406c23f23b9SMichael Tokarev  bsd-user        all BSD usermode emulation targets
1407c23f23b9SMichael Tokarev  guest-agent     build the QEMU Guest Agent
1408c23f23b9SMichael Tokarev  pie             Position Independent Executables
140921e709aaSMarc-André Lureau  modules         modules support (non-Windows)
1410bd83c861SChristian Ehrhardt  module-upgrades try to load modules from alternate paths for upgrades
1411c23f23b9SMichael Tokarev  debug-tcg       TCG debugging (default is disabled)
1412c23f23b9SMichael Tokarev  debug-info      debugging information
1413cdad781dSDaniele Buono  lto             Enable Link-Time Optimization.
14141e4f6065SDaniele Buono  safe-stack      SafeStack Stack Smash Protection. Depends on
14151e4f6065SDaniele Buono                  clang/llvm >= 3.7 and requires coroutine backend ucontext.
1416a40161cbSPaolo Bonzini  membarrier      membarrier system call (for Linux 4.14+ or Windows)
141721ab34c9SMarcel Apfelbaum  rdma            Enable RDMA-based migration
141821ab34c9SMarcel Apfelbaum  pvrdma          Enable PVRDMA support
1419299e6f19SPaolo Bonzini  vhost-net       vhost-net kernel acceleration support
1420299e6f19SPaolo Bonzini  vhost-vsock     virtio sockets device support
1421299e6f19SPaolo Bonzini  vhost-scsi      vhost-scsi kernel target support
1422299e6f19SPaolo Bonzini  vhost-crypto    vhost-user-crypto backend support
1423299e6f19SPaolo Bonzini  vhost-kernel    vhost kernel backend support
1424299e6f19SPaolo Bonzini  vhost-user      vhost-user backend support
1425108a6481SCindy Lu  vhost-vdpa      vhost-vdpa kernel backend support
1426ed1701c6SDr. David Alan Gilbert  live-block-migration   Block migration in the main migration stream
1427c23f23b9SMichael Tokarev  coroutine-pool  coroutine freelist (better performance)
1428c23f23b9SMichael Tokarev  tpm             TPM support
1429c23f23b9SMichael Tokarev  numa            libnuma support
143086583a07SLiam Merwick  avx2            AVX2 optimization support
14316b8cd447SRobert Hoo  avx512f         AVX512F optimization support
1432a6b1d4c0SChanglong Xie  replication     replication support
1433c12d66aaSLin Ma  opengl          opengl support
1434c12d66aaSLin Ma  qom-cast-debug  cast debugging support
14358de73fa8SCleber Rosa  tools           build qemu-io, qemu-nbd and qemu-img tools
14362f740136SJeff Cody  bochs           bochs image format support
14372f740136SJeff Cody  cloop           cloop image format support
14382f740136SJeff Cody  dmg             dmg image format support
14392f740136SJeff Cody  qcow1           qcow v1 image format support
14402f740136SJeff Cody  vdi             vdi image format support
14412f740136SJeff Cody  vvfat           vvfat image format support
14422f740136SJeff Cody  qed             qed image format support
14432f740136SJeff Cody  parallels       parallels image format support
1444f0d92b56SLongpeng(Mike)  crypto-afalg    Linux AF_ALG crypto backend driver
1445ba59fb77SPaolo Bonzini  debug-mutex     mutex debugging support
1446b767d257SMarek Marczykowski-Górecki  rng-none        dummy RNG, avoid using /dev/(u)random and getrandom()
144720cf7b8eSDenis Plotnikov  gio             libgio support
1448b8e0c493SJoelle van Dyne  slirp-smbd      use smbd (at path --smbd=*) in slirp networking
144908fb77edSStefan Weil
145008fb77edSStefan WeilNOTE: The object files are built at the place where configure is launched
1451af5db58eSpbrookEOF
14522d2ad6d0SFam Zhengexit 0
1453af5db58eSpbrookfi
1454af5db58eSpbrook
14559c790242SThomas Huth# Remove old dependency files to make sure that they get properly regenerated
1456bb768f71SThomas Huthrm -f */config-devices.mak.d
14579c790242SThomas Huth
1458faf44142SDaniel P. Berrangéif test -z "$python"
1459faf44142SDaniel P. Berrangéthen
1460c53eeaf7SStefan Hajnoczi    error_exit "Python not found. Use --python=/path/to/python"
1461c53eeaf7SStefan Hajnoczifi
14628e2c76bdSRoman Bolshakovif ! has "$make"
14638e2c76bdSRoman Bolshakovthen
14648e2c76bdSRoman Bolshakov    error_exit "GNU make ($make) not found"
14658e2c76bdSRoman Bolshakovfi
1466c53eeaf7SStefan Hajnoczi
1467c53eeaf7SStefan Hajnoczi# Note that if the Python conditional here evaluates True we will exit
1468c53eeaf7SStefan Hajnoczi# with status 1 which is a shell 'false' value.
14691b11f28dSThomas Huthif ! $python -c 'import sys; sys.exit(sys.version_info < (3,6))'; then
14701b11f28dSThomas Huth  error_exit "Cannot use '$python', Python >= 3.6 is required." \
1471c53eeaf7SStefan Hajnoczi      "Use --python=/path/to/python to specify a supported Python."
1472c53eeaf7SStefan Hajnoczifi
1473c53eeaf7SStefan Hajnoczi
1474755ee70fSCleber Rosa# Preserve python version since some functionality is dependent on it
1475406ab2f3SCleber Rosapython_version=$($python -c 'import sys; print("%d.%d.%d" % (sys.version_info[0], sys.version_info[1], sys.version_info[2]))' 2>/dev/null)
1476755ee70fSCleber Rosa
1477c53eeaf7SStefan Hajnoczi# Suppress writing compiled files
1478c53eeaf7SStefan Hajnoczipython="$python -B"
1479c53eeaf7SStefan Hajnoczi
14800a01d76fSMarc-André Lureauif test -z "$meson"; then
14816638cae5SPaolo Bonzini    if test "$explicit_python" = no && has meson && version_ge "$(meson --version)" 0.59.3; then
14820a01d76fSMarc-André Lureau        meson=meson
14837d7dbf9dSDan Streetman    elif test $git_submodules_action != 'ignore' ; then
14840a01d76fSMarc-André Lureau        meson=git
14850a01d76fSMarc-André Lureau    elif test -e "${source_path}/meson/meson.py" ; then
14860a01d76fSMarc-André Lureau        meson=internal
14870a01d76fSMarc-André Lureau    else
14880a01d76fSMarc-André Lureau        if test "$explicit_python" = yes; then
14890a01d76fSMarc-André Lureau            error_exit "--python requires using QEMU's embedded Meson distribution, but it was not found."
14900a01d76fSMarc-André Lureau        else
1491a5665051SPaolo Bonzini            error_exit "Meson not found.  Use --meson=/path/to/meson"
1492a5665051SPaolo Bonzini        fi
14930a01d76fSMarc-André Lureau    fi
14940a01d76fSMarc-André Lureauelse
14950a01d76fSMarc-André Lureau    # Meson uses its own Python interpreter to invoke other Python scripts,
14960a01d76fSMarc-André Lureau    # but the user wants to use the one they specified with --python.
14970a01d76fSMarc-André Lureau    #
14980a01d76fSMarc-André Lureau    # We do not want to override the distro Python interpreter (and sometimes
14990a01d76fSMarc-André Lureau    # cannot: for example in Homebrew /usr/bin/meson is a bash script), so
15000a01d76fSMarc-André Lureau    # just require --meson=git|internal together with --python.
15010a01d76fSMarc-André Lureau    if test "$explicit_python" = yes; then
15020a01d76fSMarc-André Lureau        case "$meson" in
15030a01d76fSMarc-André Lureau            git | internal) ;;
15040a01d76fSMarc-André Lureau            *) error_exit "--python requires using QEMU's embedded Meson distribution." ;;
15050a01d76fSMarc-André Lureau        esac
15060a01d76fSMarc-André Lureau    fi
15070a01d76fSMarc-André Lureaufi
1508a5665051SPaolo Bonzini
15090a01d76fSMarc-André Lureauif test "$meson" = git; then
15100a01d76fSMarc-André Lureau    git_submodules="${git_submodules} meson"
15110a01d76fSMarc-André Lureaufi
15120a01d76fSMarc-André Lureau
15130a01d76fSMarc-André Lureaucase "$meson" in
15140a01d76fSMarc-André Lureau    git | internal)
15150a01d76fSMarc-André Lureau        meson="$python ${source_path}/meson/meson.py"
15160a01d76fSMarc-André Lureau        ;;
151784ec0c24SPaolo Bonzini    *) meson=$(command -v "$meson") ;;
15180a01d76fSMarc-André Lureauesac
15190a01d76fSMarc-André Lureau
152009e93326SPaolo Bonzini# Probe for ninja
152148328880SPaolo Bonzini
152248328880SPaolo Bonziniif test -z "$ninja"; then
152348328880SPaolo Bonzini    for c in ninja ninja-build samu; do
152448328880SPaolo Bonzini        if has $c; then
152548328880SPaolo Bonzini            ninja=$(command -v "$c")
152648328880SPaolo Bonzini            break
152748328880SPaolo Bonzini        fi
152848328880SPaolo Bonzini    done
152909e93326SPaolo Bonzini    if test -z "$ninja"; then
153009e93326SPaolo Bonzini      error_exit "Cannot find Ninja"
153109e93326SPaolo Bonzini    fi
153248328880SPaolo Bonzinifi
1533a5665051SPaolo Bonzini
15349aae6e54SDaniel Henrique Barboza# Check that the C compiler works. Doing this here before testing
15359aae6e54SDaniel Henrique Barboza# the host CPU ensures that we had a valid CC to autodetect the
15369aae6e54SDaniel Henrique Barboza# $cpu var (and we should bail right here if that's not the case).
15379aae6e54SDaniel Henrique Barboza# It also allows the help message to be printed without a CC.
15389aae6e54SDaniel Henrique Barbozawrite_c_skeleton;
15399aae6e54SDaniel Henrique Barbozaif compile_object ; then
15409aae6e54SDaniel Henrique Barboza  : C compiler works ok
15419aae6e54SDaniel Henrique Barbozaelse
15429aae6e54SDaniel Henrique Barboza    error_exit "\"$cc\" either does not exist or does not work"
15439aae6e54SDaniel Henrique Barbozafi
15449aae6e54SDaniel Henrique Barbozaif ! compile_prog ; then
15459aae6e54SDaniel Henrique Barboza    error_exit "\"$cc\" cannot build an executable (is your linker broken?)"
15469aae6e54SDaniel Henrique Barbozafi
15479aae6e54SDaniel Henrique Barboza
15489c83ffd8SPeter Maydell# Consult white-list to determine whether to enable werror
15499c83ffd8SPeter Maydell# by default.  Only enable by default for git builds
15509c83ffd8SPeter Maydellif test -z "$werror" ; then
15517d7dbf9dSDan Streetman    if test "$git_submodules_action" != "ignore" && \
1552e633a5c6SEric Blake        { test "$linux" = "yes" || test "$mingw32" = "yes"; }; then
15539c83ffd8SPeter Maydell        werror="yes"
15549c83ffd8SPeter Maydell    else
15559c83ffd8SPeter Maydell        werror="no"
15569c83ffd8SPeter Maydell    fi
15579c83ffd8SPeter Maydellfi
15589c83ffd8SPeter Maydell
1559975ff037SPaolo Bonziniif test "$targetos" = "bogus"; then
1560fb59dabdSPeter Maydell    # Now that we know that we're not printing the help and that
1561fb59dabdSPeter Maydell    # the compiler works (so the results of the check_defines we used
1562fb59dabdSPeter Maydell    # to identify the OS are reliable), if we didn't recognize the
1563fb59dabdSPeter Maydell    # host OS we should stop now.
1564951fedfcSPeter Maydell    error_exit "Unrecognized host OS (uname -s reports '$(uname -s)')"
1565fb59dabdSPeter Maydellfi
1566fb59dabdSPeter Maydell
1567efc6c070SThomas Huth# Check whether the compiler matches our minimum requirements:
1568efc6c070SThomas Huthcat > $TMPC << EOF
1569efc6c070SThomas Huth#if defined(__clang_major__) && defined(__clang_minor__)
1570efc6c070SThomas Huth# ifdef __apple_build_version__
15712a85a08cSDaniel P. Berrangé#  if __clang_major__ < 10 || (__clang_major__ == 10 && __clang_minor__ < 0)
15722a85a08cSDaniel P. Berrangé#   error You need at least XCode Clang v10.0 to compile QEMU
1573efc6c070SThomas Huth#  endif
1574efc6c070SThomas Huth# else
15752a85a08cSDaniel P. Berrangé#  if __clang_major__ < 6 || (__clang_major__ == 6 && __clang_minor__ < 0)
15762a85a08cSDaniel P. Berrangé#   error You need at least Clang v6.0 to compile QEMU
1577efc6c070SThomas Huth#  endif
1578efc6c070SThomas Huth# endif
1579efc6c070SThomas Huth#elif defined(__GNUC__) && defined(__GNUC_MINOR__)
15803830df5fSnia# if __GNUC__ < 7 || (__GNUC__ == 7 && __GNUC_MINOR__ < 4)
15813830df5fSnia#  error You need at least GCC v7.4.0 to compile QEMU
1582efc6c070SThomas Huth# endif
1583efc6c070SThomas Huth#else
1584efc6c070SThomas Huth# error You either need GCC or Clang to compiler QEMU
1585efc6c070SThomas Huth#endif
1586efc6c070SThomas Huthint main (void) { return 0; }
1587efc6c070SThomas HuthEOF
1588efc6c070SThomas Huthif ! compile_prog "" "" ; then
15893830df5fSnia    error_exit "You need at least GCC v7.4 or Clang v6.0 (or XCode Clang v10.0)"
1590efc6c070SThomas Huthfi
1591efc6c070SThomas Huth
159200849b92SRichard Henderson# Accumulate -Wfoo and -Wno-bar separately.
159300849b92SRichard Henderson# We will list all of the enable flags first, and the disable flags second.
159400849b92SRichard Henderson# Note that we do not add -Werror, because that would enable it for all
159500849b92SRichard Henderson# configure tests. If a configure test failed due to -Werror this would
159600849b92SRichard Henderson# just silently disable some features, so it's too error prone.
159700849b92SRichard Henderson
159800849b92SRichard Hendersonwarn_flags=
159900849b92SRichard Hendersonadd_to warn_flags -Wold-style-declaration
160000849b92SRichard Hendersonadd_to warn_flags -Wold-style-definition
160100849b92SRichard Hendersonadd_to warn_flags -Wtype-limits
160200849b92SRichard Hendersonadd_to warn_flags -Wformat-security
160300849b92SRichard Hendersonadd_to warn_flags -Wformat-y2k
160400849b92SRichard Hendersonadd_to warn_flags -Winit-self
160500849b92SRichard Hendersonadd_to warn_flags -Wignored-qualifiers
160600849b92SRichard Hendersonadd_to warn_flags -Wempty-body
160700849b92SRichard Hendersonadd_to warn_flags -Wnested-externs
160800849b92SRichard Hendersonadd_to warn_flags -Wendif-labels
160900849b92SRichard Hendersonadd_to warn_flags -Wexpansion-to-defined
16100a2ebce9SThomas Huthadd_to warn_flags -Wimplicit-fallthrough=2
161100849b92SRichard Henderson
161200849b92SRichard Hendersonnowarn_flags=
161300849b92SRichard Hendersonadd_to nowarn_flags -Wno-initializer-overrides
161400849b92SRichard Hendersonadd_to nowarn_flags -Wno-missing-include-dirs
161500849b92SRichard Hendersonadd_to nowarn_flags -Wno-shift-negative-value
161600849b92SRichard Hendersonadd_to nowarn_flags -Wno-string-plus-int
161700849b92SRichard Hendersonadd_to nowarn_flags -Wno-typedef-redefinition
1618aabab967SRichard Hendersonadd_to nowarn_flags -Wno-tautological-type-limit-compare
1619bac8d222SRichard Hendersonadd_to nowarn_flags -Wno-psabi
162000849b92SRichard Henderson
162100849b92SRichard Hendersongcc_flags="$warn_flags $nowarn_flags"
162293b25869SJohn Snow
162393b25869SJohn Snowcc_has_warning_flag() {
162493b25869SJohn Snow    write_c_skeleton;
162593b25869SJohn Snow
1626a1d29d6cSPeter Maydell    # Use the positive sense of the flag when testing for -Wno-wombat
1627a1d29d6cSPeter Maydell    # support (gcc will happily accept the -Wno- form of unknown
1628a1d29d6cSPeter Maydell    # warning options).
162993b25869SJohn Snow    optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
163093b25869SJohn Snow    compile_prog "-Werror $optflag" ""
163193b25869SJohn Snow}
163293b25869SJohn Snow
163393b25869SJohn Snowfor flag in $gcc_flags; do
163493b25869SJohn Snow    if cc_has_warning_flag $flag ; then
16358d05095cSPaolo Bonzini        QEMU_CFLAGS="$QEMU_CFLAGS $flag"
16368d05095cSPaolo Bonzini    fi
16378d05095cSPaolo Bonzinidone
16388d05095cSPaolo Bonzini
163963678e17SSteven Noonanif test "$stack_protector" != "no"; then
1640fccd35a0SRodrigo Rebello  cat > $TMPC << EOF
1641fccd35a0SRodrigo Rebelloint main(int argc, char *argv[])
1642fccd35a0SRodrigo Rebello{
1643fccd35a0SRodrigo Rebello    char arr[64], *p = arr, *c = argv[0];
1644fccd35a0SRodrigo Rebello    while (*c) {
1645fccd35a0SRodrigo Rebello        *p++ = *c++;
1646fccd35a0SRodrigo Rebello    }
1647fccd35a0SRodrigo Rebello    return 0;
1648fccd35a0SRodrigo Rebello}
1649fccd35a0SRodrigo RebelloEOF
165063678e17SSteven Noonan  gcc_flags="-fstack-protector-strong -fstack-protector-all"
16513b463a3fSMiroslav Rezanina  sp_on=0
165263678e17SSteven Noonan  for flag in $gcc_flags; do
1653590e5dd9SPeter Maydell    # We need to check both a compile and a link, since some compiler
1654590e5dd9SPeter Maydell    # setups fail only on a .c->.o compile and some only at link time
1655086d5f75SPaolo Bonzini    if compile_object "-Werror $flag" &&
1656590e5dd9SPeter Maydell       compile_prog "-Werror $flag" ""; then
165763678e17SSteven Noonan      QEMU_CFLAGS="$QEMU_CFLAGS $flag"
1658db5adeaaSPaolo Bonzini      QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
16593b463a3fSMiroslav Rezanina      sp_on=1
166063678e17SSteven Noonan      break
166163678e17SSteven Noonan    fi
166263678e17SSteven Noonan  done
16633b463a3fSMiroslav Rezanina  if test "$stack_protector" = yes; then
16643b463a3fSMiroslav Rezanina    if test $sp_on = 0; then
16653b463a3fSMiroslav Rezanina      error_exit "Stack protector not supported"
16663b463a3fSMiroslav Rezanina    fi
16673b463a3fSMiroslav Rezanina  fi
166837746c5eSMarc-André Lureaufi
166937746c5eSMarc-André Lureau
167020bc94a2SPaolo Bonzini# Disable -Wmissing-braces on older compilers that warn even for
167120bc94a2SPaolo Bonzini# the "universal" C zero initializer {0}.
167220bc94a2SPaolo Bonzinicat > $TMPC << EOF
167320bc94a2SPaolo Bonzinistruct {
167420bc94a2SPaolo Bonzini  int a[2];
167520bc94a2SPaolo Bonzini} x = {0};
167620bc94a2SPaolo BonziniEOF
167720bc94a2SPaolo Bonziniif compile_object "-Werror" "" ; then
167820bc94a2SPaolo Bonzini  :
167920bc94a2SPaolo Bonzinielse
168020bc94a2SPaolo Bonzini  QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces"
168120bc94a2SPaolo Bonzinifi
168220bc94a2SPaolo Bonzini
168321e709aaSMarc-André Lureau# Our module code doesn't support Windows
168421e709aaSMarc-André Lureauif test "$modules" = "yes" && test "$mingw32" = "yes" ; then
168521e709aaSMarc-André Lureau  error_exit "Modules are not available for Windows"
168621e709aaSMarc-André Lureaufi
168721e709aaSMarc-André Lureau
1688bd83c861SChristian Ehrhardt# module_upgrades is only reasonable if modules are enabled
1689bd83c861SChristian Ehrhardtif test "$modules" = "no" && test "$module_upgrades" = "yes" ; then
1690bd83c861SChristian Ehrhardt  error_exit "Can't enable module-upgrades as Modules are not enabled"
1691bd83c861SChristian Ehrhardtfi
1692bd83c861SChristian Ehrhardt
16935f2453acSAlex Bennée# Static linking is not possible with plugins, modules or PIE
169440d6444eSAvi Kivityif test "$static" = "yes" ; then
1695aa0d1f44SPaolo Bonzini  if test "$modules" = "yes" ; then
1696aa0d1f44SPaolo Bonzini    error_exit "static and modules are mutually incompatible"
1697aa0d1f44SPaolo Bonzini  fi
16985f2453acSAlex Bennée  if test "$plugins" = "yes"; then
16995f2453acSAlex Bennée    error_exit "static and plugins are mutually incompatible"
1700ba4dd2aaSAlex Bennée  else
1701ba4dd2aaSAlex Bennée    plugins="no"
17025f2453acSAlex Bennée  fi
170340d6444eSAvi Kivityfi
170437650689SPaolo Bonzinitest "$plugins" = "" && plugins=yes
170540d6444eSAvi Kivity
170640d6444eSAvi Kivitycat > $TMPC << EOF
170721d4a791SAvi Kivity
170821d4a791SAvi Kivity#ifdef __linux__
170921d4a791SAvi Kivity#  define THREAD __thread
171021d4a791SAvi Kivity#else
171121d4a791SAvi Kivity#  define THREAD
171221d4a791SAvi Kivity#endif
171321d4a791SAvi Kivitystatic THREAD int tls_var;
171421d4a791SAvi Kivityint main(void) { return tls_var; }
171540d6444eSAvi KivityEOF
1716b2634124SRichard Henderson
1717ffd205efSJessica Clarke# Check we support -fno-pie and -no-pie first; we will need the former for
1718ffd205efSJessica Clarke# building ROMs, and both for everything if --disable-pie is passed.
1719412aeacdSAlex Bennéeif compile_prog "-Werror -fno-pie" "-no-pie"; then
1720412aeacdSAlex Bennée  CFLAGS_NOPIE="-fno-pie"
1721ffd205efSJessica Clarke  LDFLAGS_NOPIE="-no-pie"
1722412aeacdSAlex Bennéefi
1723412aeacdSAlex Bennée
172412781462SRichard Hendersonif test "$static" = "yes"; then
1725eca7a8e6SRichard Henderson  if test "$pie" != "no" && compile_prog "-Werror -fPIE -DPIE" "-static-pie"; then
17265770e8afSPaolo Bonzini    CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
172712781462SRichard Henderson    QEMU_LDFLAGS="-static-pie $QEMU_LDFLAGS"
172812781462SRichard Henderson    pie="yes"
172912781462SRichard Henderson  elif test "$pie" = "yes"; then
173012781462SRichard Henderson    error_exit "-static-pie not available due to missing toolchain support"
173112781462SRichard Henderson  else
173212781462SRichard Henderson    QEMU_LDFLAGS="-static $QEMU_LDFLAGS"
173312781462SRichard Henderson    pie="no"
173412781462SRichard Henderson  fi
173512781462SRichard Hendersonelif test "$pie" = "no"; then
17365770e8afSPaolo Bonzini  CONFIGURE_CFLAGS="$CFLAGS_NOPIE $CONFIGURE_CFLAGS"
1737ffd205efSJessica Clarke  CONFIGURE_LDFLAGS="$LDFLAGS_NOPIE $CONFIGURE_LDFLAGS"
1738eca7a8e6SRichard Hendersonelif compile_prog "-Werror -fPIE -DPIE" "-pie"; then
17395770e8afSPaolo Bonzini  CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
17405770e8afSPaolo Bonzini  CONFIGURE_LDFLAGS="-pie $CONFIGURE_LDFLAGS"
174140d6444eSAvi Kivity  pie="yes"
17422c674109SRichard Hendersonelif test "$pie" = "yes"; then
174376ad07a4SPeter Maydell  error_exit "PIE not available due to missing toolchain support"
174440d6444eSAvi Kivityelse
174540d6444eSAvi Kivity  echo "Disabling PIE due to missing toolchain support"
174640d6444eSAvi Kivity  pie="no"
174740d6444eSAvi Kivityfi
174840d6444eSAvi Kivity
1749e6cbd751SRichard Henderson# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
1750e6cbd751SRichard Henderson# The combination is known as "full relro", because .got.plt is read-only too.
1751e6cbd751SRichard Hendersonif compile_prog "" "-Wl,-z,relro -Wl,-z,now" ; then
1752e6cbd751SRichard Henderson  QEMU_LDFLAGS="-Wl,-z,relro -Wl,-z,now $QEMU_LDFLAGS"
1753e6cbd751SRichard Hendersonfi
1754e6cbd751SRichard Henderson
175509dada40SPaolo Bonzini##########################################
175609dada40SPaolo Bonzini# __sync_fetch_and_and requires at least -march=i486. Many toolchains
175709dada40SPaolo Bonzini# use i686 as default anyway, but for those that don't, an explicit
175809dada40SPaolo Bonzini# specification is necessary
175909dada40SPaolo Bonzini
176009dada40SPaolo Bonziniif test "$cpu" = "i386"; then
176109dada40SPaolo Bonzini  cat > $TMPC << EOF
176209dada40SPaolo Bonzinistatic int sfaa(int *ptr)
176309dada40SPaolo Bonzini{
176409dada40SPaolo Bonzini  return __sync_fetch_and_and(ptr, 0);
176509dada40SPaolo Bonzini}
176609dada40SPaolo Bonzini
176709dada40SPaolo Bonziniint main(void)
176809dada40SPaolo Bonzini{
176909dada40SPaolo Bonzini  int val = 42;
17701405b629SStefan Weil  val = __sync_val_compare_and_swap(&val, 0, 1);
177109dada40SPaolo Bonzini  sfaa(&val);
177209dada40SPaolo Bonzini  return val;
177309dada40SPaolo Bonzini}
177409dada40SPaolo BonziniEOF
177509dada40SPaolo Bonzini  if ! compile_prog "" "" ; then
177609dada40SPaolo Bonzini    QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS"
177709dada40SPaolo Bonzini  fi
177809dada40SPaolo Bonzinifi
177909dada40SPaolo Bonzini
178056267b62SPhilippe Mathieu-Daudéif test "$tcg" = "enabled"; then
178156267b62SPhilippe Mathieu-Daudé    git_submodules="$git_submodules tests/fp/berkeley-testfloat-3"
178256267b62SPhilippe Mathieu-Daudé    git_submodules="$git_submodules tests/fp/berkeley-softfloat-3"
178356267b62SPhilippe Mathieu-Daudéfi
178456267b62SPhilippe Mathieu-Daudé
1785afb63ebdSStefan Weilif test -z "${target_list+xxx}" ; then
1786fdb75aefSPaolo Bonzini    default_targets=yes
1787d880a3baSPaolo Bonzini    for target in $default_target_list; do
1788d880a3baSPaolo Bonzini        target_list="$target_list $target"
1789d880a3baSPaolo Bonzini    done
1790d880a3baSPaolo Bonzini    target_list="${target_list# }"
1791121afa9eSAnthony Liguorielse
1792fdb75aefSPaolo Bonzini    default_targets=no
179389138857SStefan Weil    target_list=$(echo "$target_list" | sed -e 's/,/ /g')
1794d880a3baSPaolo Bonzini    for target in $target_list; do
179525b48338SPeter Maydell        # Check that we recognised the target name; this allows a more
179625b48338SPeter Maydell        # friendly error message than if we let it fall through.
179725b48338SPeter Maydell        case " $default_target_list " in
179825b48338SPeter Maydell            *" $target "*)
179925b48338SPeter Maydell                ;;
180025b48338SPeter Maydell            *)
180125b48338SPeter Maydell                error_exit "Unknown target name '$target'"
180225b48338SPeter Maydell                ;;
180325b48338SPeter Maydell        esac
180425b48338SPeter Maydell    done
1805d880a3baSPaolo Bonzinifi
180625b48338SPeter Maydell
1807fdb75aefSPaolo Bonzinifor target in $target_list; do
1808fdb75aefSPaolo Bonzini    # if a deprecated target is enabled we note it here
1809fdb75aefSPaolo Bonzini    if echo "$deprecated_targets_list" | grep -q "$target"; then
1810fdb75aefSPaolo Bonzini        add_to deprecated_features $target
1811fdb75aefSPaolo Bonzini    fi
1812fdb75aefSPaolo Bonzinidone
1813fdb75aefSPaolo Bonzini
1814f55fe278SPaolo Bonzini# see if system emulation was really requested
1815f55fe278SPaolo Bonzinicase " $target_list " in
1816f55fe278SPaolo Bonzini  *"-softmmu "*) softmmu=yes
1817f55fe278SPaolo Bonzini  ;;
1818f55fe278SPaolo Bonzini  *) softmmu=no
1819f55fe278SPaolo Bonzini  ;;
1820f55fe278SPaolo Bonziniesac
18215327cf48Sbellard
1822249247c9SJuan Quintelafeature_not_found() {
1823249247c9SJuan Quintela  feature=$1
182421684af0SStewart Smith  remedy=$2
1825249247c9SJuan Quintela
182676ad07a4SPeter Maydell  error_exit "User requested feature $feature" \
182721684af0SStewart Smith      "configure was not able to find it." \
182821684af0SStewart Smith      "$remedy"
1829249247c9SJuan Quintela}
1830249247c9SJuan Quintela
18317d13299dSbellard# ---
18327d13299dSbellard# big/little endian test
18337d13299dSbellardcat > $TMPC << EOF
1834659eb157SThomas Huth#include <stdio.h>
183561cc919fSMike Frysingershort big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, };
183661cc919fSMike Frysingershort little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, };
1837659eb157SThomas Huthint main(int argc, char *argv[])
1838659eb157SThomas Huth{
1839659eb157SThomas Huth    return printf("%s %s\n", (char *)big_endian, (char *)little_endian);
18407d13299dSbellard}
18417d13299dSbellardEOF
18427d13299dSbellard
1843659eb157SThomas Huthif compile_prog ; then
1844659eb157SThomas Huth    if strings -a $TMPE | grep -q BiGeNdIaN ; then
184561cc919fSMike Frysinger        bigendian="yes"
1846659eb157SThomas Huth    elif strings -a $TMPE | grep -q LiTtLeEnDiAn ; then
184761cc919fSMike Frysinger        bigendian="no"
18487d13299dSbellard    else
18497d13299dSbellard        echo big/little test failed
1850659eb157SThomas Huth        exit 1
18517d13299dSbellard    fi
18527d13299dSbellardelse
185361cc919fSMike Frysinger    echo big/little test failed
1854659eb157SThomas Huth    exit 1
18557d13299dSbellardfi
18567d13299dSbellard
1857b0a47e79SJuan Quintela##########################################
1858e10ee3f5SPhilippe Mathieu-Daudé# system tools
1859e10ee3f5SPhilippe Mathieu-Daudéif test -z "$want_tools"; then
1860e10ee3f5SPhilippe Mathieu-Daudé    if test "$softmmu" = "no"; then
1861e10ee3f5SPhilippe Mathieu-Daudé        want_tools=no
1862e10ee3f5SPhilippe Mathieu-Daudé    else
1863e10ee3f5SPhilippe Mathieu-Daudé        want_tools=yes
1864e10ee3f5SPhilippe Mathieu-Daudé    fi
1865e10ee3f5SPhilippe Mathieu-Daudéfi
1866e10ee3f5SPhilippe Mathieu-Daudé
1867299e6f19SPaolo Bonzini#########################################
1868299e6f19SPaolo Bonzini# vhost interdependencies and host support
1869299e6f19SPaolo Bonzini
1870299e6f19SPaolo Bonzini# vhost backends
1871d88618f7SStefan Hajnocziif test "$vhost_user" = "yes" && test "$linux" != "yes"; then
1872d88618f7SStefan Hajnoczi  error_exit "vhost-user is only available on Linux"
1873299e6f19SPaolo Bonzinifi
1874108a6481SCindy Lutest "$vhost_vdpa" = "" && vhost_vdpa=$linux
1875108a6481SCindy Luif test "$vhost_vdpa" = "yes" && test "$linux" != "yes"; then
1876108a6481SCindy Lu  error_exit "vhost-vdpa is only available on Linux"
1877108a6481SCindy Lufi
1878299e6f19SPaolo Bonzinitest "$vhost_kernel" = "" && vhost_kernel=$linux
1879299e6f19SPaolo Bonziniif test "$vhost_kernel" = "yes" && test "$linux" != "yes"; then
1880299e6f19SPaolo Bonzini  error_exit "vhost-kernel is only available on Linux"
1881299e6f19SPaolo Bonzinifi
1882299e6f19SPaolo Bonzini
1883299e6f19SPaolo Bonzini# vhost-kernel devices
1884299e6f19SPaolo Bonzinitest "$vhost_scsi" = "" && vhost_scsi=$vhost_kernel
1885299e6f19SPaolo Bonziniif test "$vhost_scsi" = "yes" && test "$vhost_kernel" != "yes"; then
1886299e6f19SPaolo Bonzini  error_exit "--enable-vhost-scsi requires --enable-vhost-kernel"
1887299e6f19SPaolo Bonzinifi
1888299e6f19SPaolo Bonzinitest "$vhost_vsock" = "" && vhost_vsock=$vhost_kernel
1889299e6f19SPaolo Bonziniif test "$vhost_vsock" = "yes" && test "$vhost_kernel" != "yes"; then
1890299e6f19SPaolo Bonzini  error_exit "--enable-vhost-vsock requires --enable-vhost-kernel"
1891299e6f19SPaolo Bonzinifi
1892299e6f19SPaolo Bonzini
1893299e6f19SPaolo Bonzini# vhost-user backends
1894299e6f19SPaolo Bonzinitest "$vhost_net_user" = "" && vhost_net_user=$vhost_user
1895299e6f19SPaolo Bonziniif test "$vhost_net_user" = "yes" && test "$vhost_user" = "no"; then
1896299e6f19SPaolo Bonzini  error_exit "--enable-vhost-net-user requires --enable-vhost-user"
1897299e6f19SPaolo Bonzinifi
1898299e6f19SPaolo Bonzinitest "$vhost_crypto" = "" && vhost_crypto=$vhost_user
1899299e6f19SPaolo Bonziniif test "$vhost_crypto" = "yes" && test "$vhost_user" = "no"; then
1900299e6f19SPaolo Bonzini  error_exit "--enable-vhost-crypto requires --enable-vhost-user"
1901299e6f19SPaolo Bonzinifi
190298fc1adaSDr. David Alan Gilberttest "$vhost_user_fs" = "" && vhost_user_fs=$vhost_user
190398fc1adaSDr. David Alan Gilbertif test "$vhost_user_fs" = "yes" && test "$vhost_user" = "no"; then
190498fc1adaSDr. David Alan Gilbert  error_exit "--enable-vhost-user-fs requires --enable-vhost-user"
190598fc1adaSDr. David Alan Gilbertfi
1906108a6481SCindy Lu#vhost-vdpa backends
1907108a6481SCindy Lutest "$vhost_net_vdpa" = "" && vhost_net_vdpa=$vhost_vdpa
1908108a6481SCindy Luif test "$vhost_net_vdpa" = "yes" && test "$vhost_vdpa" = "no"; then
1909108a6481SCindy Lu  error_exit "--enable-vhost-net-vdpa requires --enable-vhost-vdpa"
1910108a6481SCindy Lufi
1911299e6f19SPaolo Bonzini
191240bc0ca9SLaurent Vivier# OR the vhost-kernel, vhost-vdpa and vhost-user values for simplicity
1913299e6f19SPaolo Bonziniif test "$vhost_net" = ""; then
1914299e6f19SPaolo Bonzini  test "$vhost_net_user" = "yes" && vhost_net=yes
191540bc0ca9SLaurent Vivier  test "$vhost_net_vdpa" = "yes" && vhost_net=yes
1916299e6f19SPaolo Bonzini  test "$vhost_kernel" = "yes" && vhost_net=yes
1917299e6f19SPaolo Bonzinifi
1918299e6f19SPaolo Bonzini
1919015a33bdSGonglei##########################################
1920779ab5e3SStefan Weil# pkg-config probe
1921779ab5e3SStefan Weil
1922779ab5e3SStefan Weilif ! has "$pkg_config_exe"; then
192376ad07a4SPeter Maydell  error_exit "pkg-config binary '$pkg_config_exe' not found"
1924779ab5e3SStefan Weilfi
1925779ab5e3SStefan Weil
1926779ab5e3SStefan Weil##########################################
1927e37630caSaliguori# xen probe
1928e37630caSaliguori
19291badb709SPaolo Bonziniif test "$xen" != "disabled" ; then
1930c1cdd9d5SJuergen Gross  # Check whether Xen library path is specified via --extra-ldflags to avoid
1931c1cdd9d5SJuergen Gross  # overriding this setting with pkg-config output. If not, try pkg-config
1932c1cdd9d5SJuergen Gross  # to obtain all needed flags.
1933c1cdd9d5SJuergen Gross
1934c1cdd9d5SJuergen Gross  if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
1935c1cdd9d5SJuergen Gross     $pkg_config --exists xencontrol ; then
1936c1cdd9d5SJuergen Gross    xen_ctrl_version="$(printf '%d%02d%02d' \
1937c1cdd9d5SJuergen Gross      $($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
19381badb709SPaolo Bonzini    xen=enabled
19395b6a8f43SMichael Tokarev    xen_pc="xencontrol xenstore xenforeignmemory xengnttab"
1940c1cdd9d5SJuergen Gross    xen_pc="$xen_pc xenevtchn xendevicemodel"
194158ea9a7aSAnthony PERARD    if $pkg_config --exists xentoolcore; then
194258ea9a7aSAnthony PERARD      xen_pc="$xen_pc xentoolcore"
194358ea9a7aSAnthony PERARD    fi
1944582ea95fSMarc-André Lureau    xen_cflags="$($pkg_config --cflags $xen_pc)"
1945582ea95fSMarc-André Lureau    xen_libs="$($pkg_config --libs $xen_pc)"
1946c1cdd9d5SJuergen Gross  else
1947c1cdd9d5SJuergen Gross
19485b6a8f43SMichael Tokarev    xen_libs="-lxenstore -lxenctrl"
1949d9506cabSAnthony PERARD    xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
1950d5b93ddfSAnthony PERARD
195150ced5b3SStefan Weil    # First we test whether Xen headers and libraries are available.
195250ced5b3SStefan Weil    # If no, we are done and there is no Xen support.
195350ced5b3SStefan Weil    # If yes, more tests are run to detect the Xen version.
195450ced5b3SStefan Weil
195550ced5b3SStefan Weil    # Xen (any)
195650ced5b3SStefan Weil    cat > $TMPC <<EOF
195750ced5b3SStefan Weil#include <xenctrl.h>
195850ced5b3SStefan Weilint main(void) {
195950ced5b3SStefan Weil  return 0;
196050ced5b3SStefan Weil}
196150ced5b3SStefan WeilEOF
196250ced5b3SStefan Weil    if ! compile_prog "" "$xen_libs" ; then
196350ced5b3SStefan Weil      # Xen not found
19641badb709SPaolo Bonzini      if test "$xen" = "enabled" ; then
196521684af0SStewart Smith        feature_not_found "xen" "Install xen devel"
196650ced5b3SStefan Weil      fi
19671badb709SPaolo Bonzini      xen=disabled
196850ced5b3SStefan Weil
1969d5b93ddfSAnthony PERARD    # Xen unstable
197069deef08SPeter Maydell    elif
197169deef08SPeter Maydell        cat > $TMPC <<EOF &&
19722cbf8903SRoss Lagerwall#undef XC_WANT_COMPAT_DEVICEMODEL_API
19732cbf8903SRoss Lagerwall#define __XEN_TOOLS__
19742cbf8903SRoss Lagerwall#include <xendevicemodel.h>
1975d3c49ebbSPaul Durrant#include <xenforeignmemory.h>
19762cbf8903SRoss Lagerwallint main(void) {
19772cbf8903SRoss Lagerwall  xendevicemodel_handle *xd;
1978d3c49ebbSPaul Durrant  xenforeignmemory_handle *xfmem;
19792cbf8903SRoss Lagerwall
19802cbf8903SRoss Lagerwall  xd = xendevicemodel_open(0, 0);
19812cbf8903SRoss Lagerwall  xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
19822cbf8903SRoss Lagerwall
1983d3c49ebbSPaul Durrant  xfmem = xenforeignmemory_open(0, 0);
1984d3c49ebbSPaul Durrant  xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
1985d3c49ebbSPaul Durrant
19862cbf8903SRoss Lagerwall  return 0;
19872cbf8903SRoss Lagerwall}
19882cbf8903SRoss LagerwallEOF
19892cbf8903SRoss Lagerwall        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
19902cbf8903SRoss Lagerwall      then
19912cbf8903SRoss Lagerwall      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
19922cbf8903SRoss Lagerwall      xen_ctrl_version=41100
19931badb709SPaolo Bonzini      xen=enabled
19942cbf8903SRoss Lagerwall    elif
19952cbf8903SRoss Lagerwall        cat > $TMPC <<EOF &&
19965ba3d756SIgor Druzhinin#undef XC_WANT_COMPAT_MAP_FOREIGN_API
19975ba3d756SIgor Druzhinin#include <xenforeignmemory.h>
199858ea9a7aSAnthony PERARD#include <xentoolcore.h>
19995ba3d756SIgor Druzhininint main(void) {
20005ba3d756SIgor Druzhinin  xenforeignmemory_handle *xfmem;
20015ba3d756SIgor Druzhinin
20025ba3d756SIgor Druzhinin  xfmem = xenforeignmemory_open(0, 0);
20035ba3d756SIgor Druzhinin  xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
200458ea9a7aSAnthony PERARD  xentoolcore_restrict_all(0);
20055ba3d756SIgor Druzhinin
20065ba3d756SIgor Druzhinin  return 0;
20075ba3d756SIgor Druzhinin}
20085ba3d756SIgor DruzhininEOF
200958ea9a7aSAnthony PERARD        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
20105ba3d756SIgor Druzhinin      then
201158ea9a7aSAnthony PERARD      xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
20125ba3d756SIgor Druzhinin      xen_ctrl_version=41000
20131badb709SPaolo Bonzini      xen=enabled
20145ba3d756SIgor Druzhinin    elif
20155ba3d756SIgor Druzhinin        cat > $TMPC <<EOF &&
2016da8090ccSPaul Durrant#undef XC_WANT_COMPAT_DEVICEMODEL_API
2017da8090ccSPaul Durrant#define __XEN_TOOLS__
2018da8090ccSPaul Durrant#include <xendevicemodel.h>
2019da8090ccSPaul Durrantint main(void) {
2020da8090ccSPaul Durrant  xendevicemodel_handle *xd;
2021da8090ccSPaul Durrant
2022da8090ccSPaul Durrant  xd = xendevicemodel_open(0, 0);
2023da8090ccSPaul Durrant  xendevicemodel_close(xd);
2024da8090ccSPaul Durrant
2025da8090ccSPaul Durrant  return 0;
2026da8090ccSPaul Durrant}
2027da8090ccSPaul DurrantEOF
2028da8090ccSPaul Durrant        compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
2029da8090ccSPaul Durrant      then
2030da8090ccSPaul Durrant      xen_stable_libs="-lxendevicemodel $xen_stable_libs"
2031f1167ee6SJuergen Gross      xen_ctrl_version=40900
20321badb709SPaolo Bonzini      xen=enabled
2033da8090ccSPaul Durrant    elif
2034da8090ccSPaul Durrant        cat > $TMPC <<EOF &&
20355eeb39c2SIan Campbell/*
20365eeb39c2SIan Campbell * If we have stable libs the we don't want the libxc compat
20375eeb39c2SIan Campbell * layers, regardless of what CFLAGS we may have been given.
2038b6eb9b45SPaulina Szubarczyk *
2039b6eb9b45SPaulina Szubarczyk * Also, check if xengnttab_grant_copy_segment_t is defined and
2040b6eb9b45SPaulina Szubarczyk * grant copy operation is implemented.
2041b6eb9b45SPaulina Szubarczyk */
2042b6eb9b45SPaulina Szubarczyk#undef XC_WANT_COMPAT_EVTCHN_API
2043b6eb9b45SPaulina Szubarczyk#undef XC_WANT_COMPAT_GNTTAB_API
2044b6eb9b45SPaulina Szubarczyk#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2045b6eb9b45SPaulina Szubarczyk#include <xenctrl.h>
2046b6eb9b45SPaulina Szubarczyk#include <xenstore.h>
2047b6eb9b45SPaulina Szubarczyk#include <xenevtchn.h>
2048b6eb9b45SPaulina Szubarczyk#include <xengnttab.h>
2049b6eb9b45SPaulina Szubarczyk#include <xenforeignmemory.h>
2050b6eb9b45SPaulina Szubarczyk#include <stdint.h>
2051b6eb9b45SPaulina Szubarczyk#include <xen/hvm/hvm_info_table.h>
2052b6eb9b45SPaulina Szubarczyk#if !defined(HVM_MAX_VCPUS)
2053b6eb9b45SPaulina Szubarczyk# error HVM_MAX_VCPUS not defined
2054b6eb9b45SPaulina Szubarczyk#endif
2055b6eb9b45SPaulina Szubarczykint main(void) {
2056b6eb9b45SPaulina Szubarczyk  xc_interface *xc = NULL;
2057b6eb9b45SPaulina Szubarczyk  xenforeignmemory_handle *xfmem;
2058b6eb9b45SPaulina Szubarczyk  xenevtchn_handle *xe;
2059b6eb9b45SPaulina Szubarczyk  xengnttab_handle *xg;
2060b6eb9b45SPaulina Szubarczyk  xengnttab_grant_copy_segment_t* seg = NULL;
2061b6eb9b45SPaulina Szubarczyk
2062b6eb9b45SPaulina Szubarczyk  xs_daemon_open();
2063b6eb9b45SPaulina Szubarczyk
2064b6eb9b45SPaulina Szubarczyk  xc = xc_interface_open(0, 0, 0);
2065b6eb9b45SPaulina Szubarczyk  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2066b6eb9b45SPaulina Szubarczyk  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2067b6eb9b45SPaulina Szubarczyk  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2068b6eb9b45SPaulina Szubarczyk  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2069b6eb9b45SPaulina Szubarczyk
2070b6eb9b45SPaulina Szubarczyk  xfmem = xenforeignmemory_open(0, 0);
2071b6eb9b45SPaulina Szubarczyk  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2072b6eb9b45SPaulina Szubarczyk
2073b6eb9b45SPaulina Szubarczyk  xe = xenevtchn_open(0, 0);
2074b6eb9b45SPaulina Szubarczyk  xenevtchn_fd(xe);
2075b6eb9b45SPaulina Szubarczyk
2076b6eb9b45SPaulina Szubarczyk  xg = xengnttab_open(0, 0);
2077b6eb9b45SPaulina Szubarczyk  xengnttab_grant_copy(xg, 0, seg);
2078b6eb9b45SPaulina Szubarczyk
2079b6eb9b45SPaulina Szubarczyk  return 0;
2080b6eb9b45SPaulina Szubarczyk}
2081b6eb9b45SPaulina SzubarczykEOF
2082b6eb9b45SPaulina Szubarczyk        compile_prog "" "$xen_libs $xen_stable_libs"
2083b6eb9b45SPaulina Szubarczyk      then
2084f1167ee6SJuergen Gross      xen_ctrl_version=40800
20851badb709SPaolo Bonzini      xen=enabled
2086b6eb9b45SPaulina Szubarczyk    elif
2087b6eb9b45SPaulina Szubarczyk        cat > $TMPC <<EOF &&
2088b6eb9b45SPaulina Szubarczyk/*
2089b6eb9b45SPaulina Szubarczyk * If we have stable libs the we don't want the libxc compat
2090b6eb9b45SPaulina Szubarczyk * layers, regardless of what CFLAGS we may have been given.
20915eeb39c2SIan Campbell */
20925eeb39c2SIan Campbell#undef XC_WANT_COMPAT_EVTCHN_API
20935eeb39c2SIan Campbell#undef XC_WANT_COMPAT_GNTTAB_API
20945eeb39c2SIan Campbell#undef XC_WANT_COMPAT_MAP_FOREIGN_API
20955eeb39c2SIan Campbell#include <xenctrl.h>
20965eeb39c2SIan Campbell#include <xenstore.h>
20975eeb39c2SIan Campbell#include <xenevtchn.h>
20985eeb39c2SIan Campbell#include <xengnttab.h>
20995eeb39c2SIan Campbell#include <xenforeignmemory.h>
21005eeb39c2SIan Campbell#include <stdint.h>
21015eeb39c2SIan Campbell#include <xen/hvm/hvm_info_table.h>
21025eeb39c2SIan Campbell#if !defined(HVM_MAX_VCPUS)
21035eeb39c2SIan Campbell# error HVM_MAX_VCPUS not defined
21045eeb39c2SIan Campbell#endif
21055eeb39c2SIan Campbellint main(void) {
21065eeb39c2SIan Campbell  xc_interface *xc = NULL;
21075eeb39c2SIan Campbell  xenforeignmemory_handle *xfmem;
21085eeb39c2SIan Campbell  xenevtchn_handle *xe;
21095eeb39c2SIan Campbell  xengnttab_handle *xg;
21105eeb39c2SIan Campbell
21115eeb39c2SIan Campbell  xs_daemon_open();
21125eeb39c2SIan Campbell
21135eeb39c2SIan Campbell  xc = xc_interface_open(0, 0, 0);
21145eeb39c2SIan Campbell  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
21155eeb39c2SIan Campbell  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
21165eeb39c2SIan Campbell  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
21175eeb39c2SIan Campbell  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
21185eeb39c2SIan Campbell
21195eeb39c2SIan Campbell  xfmem = xenforeignmemory_open(0, 0);
21205eeb39c2SIan Campbell  xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
21215eeb39c2SIan Campbell
21225eeb39c2SIan Campbell  xe = xenevtchn_open(0, 0);
21235eeb39c2SIan Campbell  xenevtchn_fd(xe);
21245eeb39c2SIan Campbell
21255eeb39c2SIan Campbell  xg = xengnttab_open(0, 0);
21265eeb39c2SIan Campbell  xengnttab_map_grant_ref(xg, 0, 0, 0);
21275eeb39c2SIan Campbell
21285eeb39c2SIan Campbell  return 0;
21295eeb39c2SIan Campbell}
21305eeb39c2SIan CampbellEOF
21315eeb39c2SIan Campbell        compile_prog "" "$xen_libs $xen_stable_libs"
21325eeb39c2SIan Campbell      then
2133f1167ee6SJuergen Gross      xen_ctrl_version=40701
21341badb709SPaolo Bonzini      xen=enabled
2135cdadde39SRoger Pau Monne
2136cdadde39SRoger Pau Monne    # Xen 4.6
2137cdadde39SRoger Pau Monne    elif
2138cdadde39SRoger Pau Monne        cat > $TMPC <<EOF &&
2139cdadde39SRoger Pau Monne#include <xenctrl.h>
2140e108a3c1SAnthony PERARD#include <xenstore.h>
2141d5b93ddfSAnthony PERARD#include <stdint.h>
2142d5b93ddfSAnthony PERARD#include <xen/hvm/hvm_info_table.h>
2143d5b93ddfSAnthony PERARD#if !defined(HVM_MAX_VCPUS)
2144d5b93ddfSAnthony PERARD# error HVM_MAX_VCPUS not defined
2145d5b93ddfSAnthony PERARD#endif
2146d5b93ddfSAnthony PERARDint main(void) {
2147d5b93ddfSAnthony PERARD  xc_interface *xc;
2148d5b93ddfSAnthony PERARD  xs_daemon_open();
2149d5b93ddfSAnthony PERARD  xc = xc_interface_open(0, 0, 0);
2150d5b93ddfSAnthony PERARD  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2151d5b93ddfSAnthony PERARD  xc_gnttab_open(NULL, 0);
2152b87de24eSAnthony PERARD  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
21538688e065SStefano Stabellini  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2154d8b441a3SJan Beulich  xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
215520a544c7SKonrad Rzeszutek Wilk  xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
2156d8b441a3SJan Beulich  return 0;
2157d8b441a3SJan Beulich}
2158d8b441a3SJan BeulichEOF
2159d8b441a3SJan Beulich        compile_prog "" "$xen_libs"
2160d8b441a3SJan Beulich      then
2161f1167ee6SJuergen Gross      xen_ctrl_version=40600
21621badb709SPaolo Bonzini      xen=enabled
2163d8b441a3SJan Beulich
2164d8b441a3SJan Beulich    # Xen 4.5
2165d8b441a3SJan Beulich    elif
2166d8b441a3SJan Beulich        cat > $TMPC <<EOF &&
2167d8b441a3SJan Beulich#include <xenctrl.h>
2168d8b441a3SJan Beulich#include <xenstore.h>
2169d8b441a3SJan Beulich#include <stdint.h>
2170d8b441a3SJan Beulich#include <xen/hvm/hvm_info_table.h>
2171d8b441a3SJan Beulich#if !defined(HVM_MAX_VCPUS)
2172d8b441a3SJan Beulich# error HVM_MAX_VCPUS not defined
2173d8b441a3SJan Beulich#endif
2174d8b441a3SJan Beulichint main(void) {
2175d8b441a3SJan Beulich  xc_interface *xc;
2176d8b441a3SJan Beulich  xs_daemon_open();
2177d8b441a3SJan Beulich  xc = xc_interface_open(0, 0, 0);
2178d8b441a3SJan Beulich  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2179d8b441a3SJan Beulich  xc_gnttab_open(NULL, 0);
2180d8b441a3SJan Beulich  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2181d8b441a3SJan Beulich  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
21823996e85cSPaul Durrant  xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
21833996e85cSPaul Durrant  return 0;
21843996e85cSPaul Durrant}
21853996e85cSPaul DurrantEOF
21863996e85cSPaul Durrant        compile_prog "" "$xen_libs"
21873996e85cSPaul Durrant      then
2188f1167ee6SJuergen Gross      xen_ctrl_version=40500
21891badb709SPaolo Bonzini      xen=enabled
21903996e85cSPaul Durrant
21913996e85cSPaul Durrant    elif
21923996e85cSPaul Durrant        cat > $TMPC <<EOF &&
21933996e85cSPaul Durrant#include <xenctrl.h>
21943996e85cSPaul Durrant#include <xenstore.h>
21953996e85cSPaul Durrant#include <stdint.h>
21963996e85cSPaul Durrant#include <xen/hvm/hvm_info_table.h>
21973996e85cSPaul Durrant#if !defined(HVM_MAX_VCPUS)
21983996e85cSPaul Durrant# error HVM_MAX_VCPUS not defined
21993996e85cSPaul Durrant#endif
22003996e85cSPaul Durrantint main(void) {
22013996e85cSPaul Durrant  xc_interface *xc;
22023996e85cSPaul Durrant  xs_daemon_open();
22033996e85cSPaul Durrant  xc = xc_interface_open(0, 0, 0);
22043996e85cSPaul Durrant  xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
22053996e85cSPaul Durrant  xc_gnttab_open(NULL, 0);
22063996e85cSPaul Durrant  xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
22073996e85cSPaul Durrant  xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
22088688e065SStefano Stabellini  return 0;
22098688e065SStefano Stabellini}
22108688e065SStefano StabelliniEOF
22118688e065SStefano Stabellini        compile_prog "" "$xen_libs"
221269deef08SPeter Maydell      then
2213f1167ee6SJuergen Gross      xen_ctrl_version=40200
22141badb709SPaolo Bonzini      xen=enabled
22158688e065SStefano Stabellini
2216e37630caSaliguori    else
22171badb709SPaolo Bonzini      if test "$xen" = "enabled" ; then
2218edfb07edSIan Campbell        feature_not_found "xen (unsupported version)" \
2219edfb07edSIan Campbell                          "Install a supported xen (xen 4.2 or newer)"
2220fc321b4bSJuan Quintela      fi
22211badb709SPaolo Bonzini      xen=disabled
2222e37630caSaliguori    fi
2223d5b93ddfSAnthony PERARD
22241badb709SPaolo Bonzini    if test "$xen" = enabled; then
2225f1167ee6SJuergen Gross      if test $xen_ctrl_version -ge 40701  ; then
2226582ea95fSMarc-André Lureau        xen_libs="$xen_libs $xen_stable_libs "
22275eeb39c2SIan Campbell      fi
2228d5b93ddfSAnthony PERARD    fi
2229e37630caSaliguori  fi
2230c1cdd9d5SJuergen Grossfi
2231e37630caSaliguori
2232d661d9a4SJustin Terry (VM)##########################################
22332da776dbSMichael R. Hines# RDMA needs OpenFabrics libraries
22342da776dbSMichael R. Hinesif test "$rdma" != "no" ; then
22352da776dbSMichael R. Hines  cat > $TMPC <<EOF
22362da776dbSMichael R. Hines#include <rdma/rdma_cma.h>
22372da776dbSMichael R. Hinesint main(void) { return 0; }
22382da776dbSMichael R. HinesEOF
2239ef6d4ccdSYuval Shaia  rdma_libs="-lrdmacm -libverbs -libumad"
22402da776dbSMichael R. Hines  if compile_prog "" "$rdma_libs" ; then
22412da776dbSMichael R. Hines    rdma="yes"
22422da776dbSMichael R. Hines  else
22432da776dbSMichael R. Hines    if test "$rdma" = "yes" ; then
22442da776dbSMichael R. Hines        error_exit \
2245ef6d4ccdSYuval Shaia            " OpenFabrics librdmacm/libibverbs/libibumad not present." \
22462da776dbSMichael R. Hines            " Your options:" \
2247ef6d4ccdSYuval Shaia            "  (1) Fast: Install infiniband packages (devel) from your distro." \
22482da776dbSMichael R. Hines            "  (2) Cleanest: Install libraries from www.openfabrics.org" \
22492da776dbSMichael R. Hines            "  (3) Also: Install softiwarp if you don't have RDMA hardware"
22502da776dbSMichael R. Hines    fi
22512da776dbSMichael R. Hines    rdma="no"
22522da776dbSMichael R. Hines  fi
22532da776dbSMichael R. Hinesfi
22542da776dbSMichael R. Hines
225521ab34c9SMarcel Apfelbaum##########################################
225621ab34c9SMarcel Apfelbaum# PVRDMA detection
225721ab34c9SMarcel Apfelbaum
225821ab34c9SMarcel Apfelbaumcat > $TMPC <<EOF &&
225921ab34c9SMarcel Apfelbaum#include <sys/mman.h>
226021ab34c9SMarcel Apfelbaum
226121ab34c9SMarcel Apfelbaumint
226221ab34c9SMarcel Apfelbaummain(void)
226321ab34c9SMarcel Apfelbaum{
226421ab34c9SMarcel Apfelbaum    char buf = 0;
226521ab34c9SMarcel Apfelbaum    void *addr = &buf;
226621ab34c9SMarcel Apfelbaum    addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
226721ab34c9SMarcel Apfelbaum
226821ab34c9SMarcel Apfelbaum    return 0;
226921ab34c9SMarcel Apfelbaum}
227021ab34c9SMarcel ApfelbaumEOF
227121ab34c9SMarcel Apfelbaum
227221ab34c9SMarcel Apfelbaumif test "$rdma" = "yes" ; then
227321ab34c9SMarcel Apfelbaum    case "$pvrdma" in
227421ab34c9SMarcel Apfelbaum    "")
227521ab34c9SMarcel Apfelbaum        if compile_prog "" ""; then
227621ab34c9SMarcel Apfelbaum            pvrdma="yes"
227721ab34c9SMarcel Apfelbaum        else
227821ab34c9SMarcel Apfelbaum            pvrdma="no"
227921ab34c9SMarcel Apfelbaum        fi
228021ab34c9SMarcel Apfelbaum        ;;
228121ab34c9SMarcel Apfelbaum    "yes")
228221ab34c9SMarcel Apfelbaum        if ! compile_prog "" ""; then
228321ab34c9SMarcel Apfelbaum            error_exit "PVRDMA is not supported since mremap is not implemented"
228421ab34c9SMarcel Apfelbaum        fi
228521ab34c9SMarcel Apfelbaum        pvrdma="yes"
228621ab34c9SMarcel Apfelbaum        ;;
228721ab34c9SMarcel Apfelbaum    "no")
228821ab34c9SMarcel Apfelbaum        pvrdma="no"
228921ab34c9SMarcel Apfelbaum        ;;
229021ab34c9SMarcel Apfelbaum    esac
229121ab34c9SMarcel Apfelbaumelse
229221ab34c9SMarcel Apfelbaum    if test "$pvrdma" = "yes" ; then
229321ab34c9SMarcel Apfelbaum        error_exit "PVRDMA requires rdma suppport"
229421ab34c9SMarcel Apfelbaum    fi
229521ab34c9SMarcel Apfelbaum    pvrdma="no"
229621ab34c9SMarcel Apfelbaumfi
229795c6bff3SBenoît Canet
2298ee108585SYuval Shaia# Let's see if enhanced reg_mr is supported
2299ee108585SYuval Shaiaif test "$pvrdma" = "yes" ; then
2300ee108585SYuval Shaia
2301ee108585SYuval Shaiacat > $TMPC <<EOF &&
2302ee108585SYuval Shaia#include <infiniband/verbs.h>
2303ee108585SYuval Shaia
2304ee108585SYuval Shaiaint
2305ee108585SYuval Shaiamain(void)
2306ee108585SYuval Shaia{
2307ee108585SYuval Shaia    struct ibv_mr *mr;
2308ee108585SYuval Shaia    struct ibv_pd *pd = NULL;
2309ee108585SYuval Shaia    size_t length = 10;
2310ee108585SYuval Shaia    uint64_t iova = 0;
2311ee108585SYuval Shaia    int access = 0;
2312ee108585SYuval Shaia    void *addr = NULL;
2313ee108585SYuval Shaia
2314ee108585SYuval Shaia    mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
2315ee108585SYuval Shaia
2316ee108585SYuval Shaia    ibv_dereg_mr(mr);
2317ee108585SYuval Shaia
2318ee108585SYuval Shaia    return 0;
2319ee108585SYuval Shaia}
2320ee108585SYuval ShaiaEOF
2321ee108585SYuval Shaia    if ! compile_prog "" "-libverbs"; then
2322ee108585SYuval Shaia        QEMU_CFLAGS="$QEMU_CFLAGS -DLEGACY_RDMA_REG_MR"
2323ee108585SYuval Shaia    fi
2324ee108585SYuval Shaiafi
2325ee108585SYuval Shaia
232695c6bff3SBenoît Canet##########################################
2327e18df141SAnthony Liguori# glib support probe
2328a52d28afSPaolo Bonzini
2329b4c6036fSDaniel P. Berrangéglib_req_ver=2.56
2330aa0d1f44SPaolo Bonziniglib_modules=gthread-2.0
2331aa0d1f44SPaolo Bonziniif test "$modules" = yes; then
2332a88afc64SGerd Hoffmann    glib_modules="$glib_modules gmodule-export-2.0"
2333b906acacSPaolo Bonzinielif test "$plugins" = "yes"; then
2334b906acacSPaolo Bonzini    glib_modules="$glib_modules gmodule-no-export-2.0"
233554cb65d8SEmilio G. Cotafi
2336e26110cfSFam Zheng
2337aa0d1f44SPaolo Bonzinifor i in $glib_modules; do
2338e26110cfSFam Zheng    if $pkg_config --atleast-version=$glib_req_ver $i; then
233989138857SStefan Weil        glib_cflags=$($pkg_config --cflags $i)
234089138857SStefan Weil        glib_libs=$($pkg_config --libs $i)
2341e18df141SAnthony Liguori    else
2342e26110cfSFam Zheng        error_exit "glib-$glib_req_ver $i is required to compile QEMU"
2343e26110cfSFam Zheng    fi
2344e26110cfSFam Zhengdone
2345e26110cfSFam Zheng
2346215b0c2fSPaolo Bonzini# This workaround is required due to a bug in pkg-config file for glib as it
2347215b0c2fSPaolo Bonzini# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
2348215b0c2fSPaolo Bonzini
2349215b0c2fSPaolo Bonziniif test "$static" = yes && test "$mingw32" = yes; then
2350215b0c2fSPaolo Bonzini    glib_cflags="-DGLIB_STATIC_COMPILATION $glib_cflags"
2351215b0c2fSPaolo Bonzinifi
2352215b0c2fSPaolo Bonzini
235320cf7b8eSDenis Plotnikovif ! test "$gio" = "no"; then
235420cf7b8eSDenis Plotnikov    pass=no
2355f876b765SMarc-André Lureau    if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
2356f876b765SMarc-André Lureau        gio_cflags=$($pkg_config --cflags gio-2.0)
2357f876b765SMarc-André Lureau        gio_libs=$($pkg_config --libs gio-2.0)
235825a97a56SMarc-André Lureau        gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
23595ecfb76cSPaolo Bonzini        if ! has "$gdbus_codegen"; then
23600dba4897SMarc-André Lureau            gdbus_codegen=
23610dba4897SMarc-André Lureau        fi
236276346b62SPeter Maydell        # Check that the libraries actually work -- Ubuntu 18.04 ships
236376346b62SPeter Maydell        # with pkg-config --static --libs data for gio-2.0 that is missing
236476346b62SPeter Maydell        # -lblkid and will give a link error.
236513ceae66SPeter Maydell        cat > $TMPC <<EOF
236613ceae66SPeter Maydell#include <gio/gio.h>
236713ceae66SPeter Maydellint main(void)
236813ceae66SPeter Maydell{
236913ceae66SPeter Maydell    g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
237013ceae66SPeter Maydell    return 0;
237113ceae66SPeter Maydell}
237213ceae66SPeter MaydellEOF
237313ceae66SPeter Maydell        if compile_prog "$gio_cflags" "$gio_libs" ; then
237420cf7b8eSDenis Plotnikov            pass=yes
237576346b62SPeter Maydell        else
237620cf7b8eSDenis Plotnikov            pass=no
2377f876b765SMarc-André Lureau        fi
2378f876b765SMarc-André Lureau
237920cf7b8eSDenis Plotnikov        if test "$pass" = "yes" &&
238020cf7b8eSDenis Plotnikov            $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
238125a97a56SMarc-André Lureau            gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
238225a97a56SMarc-André Lureau            gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
238325a97a56SMarc-André Lureau        fi
238420cf7b8eSDenis Plotnikov    fi
238520cf7b8eSDenis Plotnikov
238620cf7b8eSDenis Plotnikov    if test "$pass" = "no"; then
238720cf7b8eSDenis Plotnikov        if test "$gio" = "yes"; then
238820cf7b8eSDenis Plotnikov            feature_not_found "gio" "Install libgio >= 2.0"
238920cf7b8eSDenis Plotnikov        else
239020cf7b8eSDenis Plotnikov            gio=no
239120cf7b8eSDenis Plotnikov        fi
239220cf7b8eSDenis Plotnikov    else
239320cf7b8eSDenis Plotnikov        gio=yes
239420cf7b8eSDenis Plotnikov    fi
239520cf7b8eSDenis Plotnikovfi
239625a97a56SMarc-André Lureau
2397977a82abSDaniel P. Berrange# Sanity check that the current size_t matches the
2398977a82abSDaniel P. Berrange# size that glib thinks it should be. This catches
2399977a82abSDaniel P. Berrange# problems on multi-arch where people try to build
2400977a82abSDaniel P. Berrange# 32-bit QEMU while pointing at 64-bit glib headers
2401977a82abSDaniel P. Berrangecat > $TMPC <<EOF
2402977a82abSDaniel P. Berrange#include <glib.h>
2403977a82abSDaniel P. Berrange#include <unistd.h>
2404977a82abSDaniel P. Berrange
2405977a82abSDaniel P. Berrange#define QEMU_BUILD_BUG_ON(x) \
2406977a82abSDaniel P. Berrange  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
2407977a82abSDaniel P. Berrange
2408977a82abSDaniel P. Berrangeint main(void) {
2409977a82abSDaniel P. Berrange   QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
2410977a82abSDaniel P. Berrange   return 0;
2411977a82abSDaniel P. Berrange}
2412977a82abSDaniel P. BerrangeEOF
2413977a82abSDaniel P. Berrange
2414215b0c2fSPaolo Bonziniif ! compile_prog "$glib_cflags" "$glib_libs" ; then
2415977a82abSDaniel P. Berrange    error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
2416977a82abSDaniel P. Berrange               "You probably need to set PKG_CONFIG_LIBDIR"\
2417977a82abSDaniel P. Berrange	       "to point to the right pkg-config files for your"\
2418977a82abSDaniel P. Berrange	       "build target"
2419977a82abSDaniel P. Berrangefi
2420977a82abSDaniel P. Berrange
24219bda600bSEric Blake# Silence clang warnings triggered by glib < 2.57.2
24229bda600bSEric Blakecat > $TMPC << EOF
24239bda600bSEric Blake#include <glib.h>
24249bda600bSEric Blaketypedef struct Foo {
24259bda600bSEric Blake    int i;
24269bda600bSEric Blake} Foo;
24279bda600bSEric Blakestatic void foo_free(Foo *f)
24289bda600bSEric Blake{
24299bda600bSEric Blake    g_free(f);
24309bda600bSEric Blake}
24319bda600bSEric BlakeG_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free);
24329bda600bSEric Blakeint main(void) { return 0; }
24339bda600bSEric BlakeEOF
24349bda600bSEric Blakeif ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
24359bda600bSEric Blake    if cc_has_warning_flag "-Wno-unused-function"; then
24369bda600bSEric Blake        glib_cflags="$glib_cflags -Wno-unused-function"
24375770e8afSPaolo Bonzini        CONFIGURE_CFLAGS="$CONFIGURE_CFLAGS -Wno-unused-function"
24389bda600bSEric Blake    fi
24399bda600bSEric Blakefi
24409bda600bSEric Blake
2441e26110cfSFam Zheng##########################################
2442e26110cfSFam Zheng# SHA command probe for modules
2443e26110cfSFam Zhengif test "$modules" = yes; then
2444e26110cfSFam Zheng    shacmd_probe="sha1sum sha1 shasum"
2445e26110cfSFam Zheng    for c in $shacmd_probe; do
24468ccefb91SFam Zheng        if has $c; then
2447e26110cfSFam Zheng            shacmd="$c"
2448e26110cfSFam Zheng            break
2449e26110cfSFam Zheng        fi
2450e26110cfSFam Zheng    done
2451e26110cfSFam Zheng    if test "$shacmd" = ""; then
2452e26110cfSFam Zheng        error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
2453e26110cfSFam Zheng    fi
2454e18df141SAnthony Liguorifi
2455e18df141SAnthony Liguori
2456e18df141SAnthony Liguori##########################################
24577aaa6a16SPaolo Bonzini# TPM emulation is only on POSIX
24583b8acc11SPaolo Bonzini
24597aaa6a16SPaolo Bonziniif test "$tpm" = ""; then
24607aaa6a16SPaolo Bonzini  if test "$mingw32" = "yes"; then
24617aaa6a16SPaolo Bonzini    tpm=no
24623b8acc11SPaolo Bonzini  else
24637aaa6a16SPaolo Bonzini    tpm=yes
24647aaa6a16SPaolo Bonzini  fi
24657aaa6a16SPaolo Bonzinielif test "$tpm" = "yes"; then
24667aaa6a16SPaolo Bonzini  if test "$mingw32" = "yes" ; then
24677aaa6a16SPaolo Bonzini    error_exit "TPM emulation only available on POSIX systems"
24687aaa6a16SPaolo Bonzini  fi
24693b8acc11SPaolo Bonzinifi
24703b8acc11SPaolo Bonzini
24713b8acc11SPaolo Bonzini##########################################
2472f652e6afSaurel32# fdt probe
2473e169e1e1SPeter Maydell
2474fbb4121dSPaolo Bonzinicase "$fdt" in
2475fbb4121dSPaolo Bonzini  auto | enabled | internal)
2476fbb4121dSPaolo Bonzini    # Simpler to always update submodule, even if not needed.
2477aef45d51SDaniel P. Berrange    git_submodules="${git_submodules} dtc"
2478fbb4121dSPaolo Bonzini    ;;
2479fbb4121dSPaolo Bonziniesac
2480f652e6afSaurel32
248120ff075bSMichael Walle##########################################
24829d49bcf6SMarkus Armbruster# opengl probe (for sdl2, gtk)
2483b1546f32SGerd Hoffmann
2484da076ffeSGerd Hoffmannif test "$opengl" != "no" ; then
2485bc6a3565SAkihiko Odaki  epoxy=no
2486bc6a3565SAkihiko Odaki  if $pkg_config epoxy; then
2487bc6a3565SAkihiko Odaki    cat > $TMPC << EOF
2488bc6a3565SAkihiko Odaki#include <epoxy/egl.h>
2489bc6a3565SAkihiko Odakiint main(void) { return 0; }
2490bc6a3565SAkihiko OdakiEOF
2491bc6a3565SAkihiko Odaki    if compile_prog "" "" ; then
2492bc6a3565SAkihiko Odaki      epoxy=yes
2493bc6a3565SAkihiko Odaki    fi
2494bc6a3565SAkihiko Odaki  fi
2495bc6a3565SAkihiko Odaki
2496bc6a3565SAkihiko Odaki  if test "$epoxy" = "yes" ; then
2497bc6a3565SAkihiko Odaki    opengl_cflags="$($pkg_config --cflags epoxy)"
2498bc6a3565SAkihiko Odaki    opengl_libs="$($pkg_config --libs epoxy)"
2499da076ffeSGerd Hoffmann    opengl=yes
250020ff075bSMichael Walle  else
2501da076ffeSGerd Hoffmann    if test "$opengl" = "yes" ; then
2502bc6a3565SAkihiko Odaki      feature_not_found "opengl" "Please install epoxy with EGL"
250320ff075bSMichael Walle    fi
2504f676c67eSJeremy White    opengl_cflags=""
2505da076ffeSGerd Hoffmann    opengl_libs=""
2506da076ffeSGerd Hoffmann    opengl=no
250720ff075bSMichael Walle  fi
250820ff075bSMichael Wallefi
250920ff075bSMichael Walle
2510dcc38d1cSMarcelo Tosatti##########################################
2511a99d57bbSWanlong Gao# libnuma probe
2512a99d57bbSWanlong Gao
2513a99d57bbSWanlong Gaoif test "$numa" != "no" ; then
2514a99d57bbSWanlong Gao  cat > $TMPC << EOF
2515a99d57bbSWanlong Gao#include <numa.h>
2516a99d57bbSWanlong Gaoint main(void) { return numa_available(); }
2517a99d57bbSWanlong GaoEOF
2518a99d57bbSWanlong Gao
2519a99d57bbSWanlong Gao  if compile_prog "" "-lnuma" ; then
2520a99d57bbSWanlong Gao    numa=yes
2521ab318051SMarc-André Lureau    numa_libs="-lnuma"
2522a99d57bbSWanlong Gao  else
2523a99d57bbSWanlong Gao    if test "$numa" = "yes" ; then
2524a99d57bbSWanlong Gao      feature_not_found "numa" "install numactl devel"
2525a99d57bbSWanlong Gao    fi
2526a99d57bbSWanlong Gao    numa=no
2527a99d57bbSWanlong Gao  fi
2528a99d57bbSWanlong Gaofi
2529a99d57bbSWanlong Gao
2530955727d2SCortland Tölva# check for usbfs
2531955727d2SCortland Tölvahave_usbfs=no
2532955727d2SCortland Tölvaif test "$linux_user" = "yes"; then
253396566d09SThomas Petazzoni  cat > $TMPC << EOF
253496566d09SThomas Petazzoni#include <linux/usbdevice_fs.h>
253596566d09SThomas Petazzoni
253696566d09SThomas Petazzoni#ifndef USBDEVFS_GET_CAPABILITIES
253796566d09SThomas Petazzoni#error "USBDEVFS_GET_CAPABILITIES undefined"
253896566d09SThomas Petazzoni#endif
253996566d09SThomas Petazzoni
254096566d09SThomas Petazzoni#ifndef USBDEVFS_DISCONNECT_CLAIM
254196566d09SThomas Petazzoni#error "USBDEVFS_DISCONNECT_CLAIM undefined"
254296566d09SThomas Petazzoni#endif
254396566d09SThomas Petazzoni
254496566d09SThomas Petazzoniint main(void)
254596566d09SThomas Petazzoni{
254696566d09SThomas Petazzoni    return 0;
254796566d09SThomas Petazzoni}
254896566d09SThomas PetazzoniEOF
254996566d09SThomas Petazzoni  if compile_prog "" ""; then
2550955727d2SCortland Tölva    have_usbfs=yes
2551955727d2SCortland Tölva  fi
2552955727d2SCortland Tölvafi
2553751bcc39SMarc-André Lureau
2554de5071c5SBlue Swirl##########################################
2555d9840e25STomoki Sekiyama# check if we have VSS SDK headers for win
2556d9840e25STomoki Sekiyama
2557e633a5c6SEric Blakeif test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
2558e633a5c6SEric Blake        test "$vss_win32_sdk" != "no" ; then
2559d9840e25STomoki Sekiyama  case "$vss_win32_sdk" in
2560690604f6SMichael Roth    "")   vss_win32_include="-isystem $source_path" ;;
2561d9840e25STomoki Sekiyama    *\ *) # The SDK is installed in "Program Files" by default, but we cannot
2562d9840e25STomoki Sekiyama          # handle path with spaces. So we symlink the headers into ".sdk/vss".
2563690604f6SMichael Roth          vss_win32_include="-isystem $source_path/.sdk/vss"
2564d9840e25STomoki Sekiyama	  symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
2565d9840e25STomoki Sekiyama	  ;;
2566690604f6SMichael Roth    *)    vss_win32_include="-isystem $vss_win32_sdk"
2567d9840e25STomoki Sekiyama  esac
2568d9840e25STomoki Sekiyama  cat > $TMPC << EOF
2569d9840e25STomoki Sekiyama#define __MIDL_user_allocate_free_DEFINED__
2570d9840e25STomoki Sekiyama#include <inc/win2003/vss.h>
2571d9840e25STomoki Sekiyamaint main(void) { return VSS_CTX_BACKUP; }
2572d9840e25STomoki SekiyamaEOF
2573d9840e25STomoki Sekiyama  if compile_prog "$vss_win32_include" "" ; then
2574d9840e25STomoki Sekiyama    guest_agent_with_vss="yes"
2575d9840e25STomoki Sekiyama    QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
2576315d3184SFam Zheng    libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
2577f33ca81fSMichael Roth    qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
2578d9840e25STomoki Sekiyama  else
2579d9840e25STomoki Sekiyama    if test "$vss_win32_sdk" != "" ; then
2580d9840e25STomoki Sekiyama      echo "ERROR: Please download and install Microsoft VSS SDK:"
2581d9840e25STomoki Sekiyama      echo "ERROR:   http://www.microsoft.com/en-us/download/details.aspx?id=23490"
2582d9840e25STomoki Sekiyama      echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
2583d9840e25STomoki Sekiyama      echo "ERROR:   scripts/extract-vsssdk-headers setup.exe"
2584d9840e25STomoki Sekiyama      echo "ERROR: The headers are extracted in the directory \`inc'."
2585d9840e25STomoki Sekiyama      feature_not_found "VSS support"
2586d9840e25STomoki Sekiyama    fi
2587d9840e25STomoki Sekiyama    guest_agent_with_vss="no"
2588d9840e25STomoki Sekiyama  fi
2589d9840e25STomoki Sekiyamafi
2590d9840e25STomoki Sekiyama
2591d9840e25STomoki Sekiyama##########################################
2592d9840e25STomoki Sekiyama# lookup Windows platform SDK (if not specified)
2593d9840e25STomoki Sekiyama# The SDK is needed only to build .tlb (type library) file of guest agent
2594d9840e25STomoki Sekiyama# VSS provider from the source. It is usually unnecessary because the
2595d9840e25STomoki Sekiyama# pre-compiled .tlb file is included.
2596d9840e25STomoki Sekiyama
2597e633a5c6SEric Blakeif test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
2598e633a5c6SEric Blake        test "$guest_agent_with_vss" = "yes" ; then
2599d9840e25STomoki Sekiyama  if test -z "$win_sdk"; then
2600d9840e25STomoki Sekiyama    programfiles="$PROGRAMFILES"
2601d9840e25STomoki Sekiyama    test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
2602d9840e25STomoki Sekiyama    if test -n "$programfiles"; then
2603d9840e25STomoki Sekiyama      win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
2604d9840e25STomoki Sekiyama    else
2605d9840e25STomoki Sekiyama      feature_not_found "Windows SDK"
2606d9840e25STomoki Sekiyama    fi
2607d9840e25STomoki Sekiyama  elif test "$win_sdk" = "no"; then
2608d9840e25STomoki Sekiyama    win_sdk=""
2609d9840e25STomoki Sekiyama  fi
2610d9840e25STomoki Sekiyamafi
2611d9840e25STomoki Sekiyama
2612d9840e25STomoki Sekiyama##########################################
261350cbebb9SMichael Roth# check if mingw environment provides a recent ntddscsi.h
2614e633a5c6SEric Blakeif test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
261550cbebb9SMichael Roth  cat > $TMPC << EOF
261650cbebb9SMichael Roth#include <windows.h>
261750cbebb9SMichael Roth#include <ntddscsi.h>
261850cbebb9SMichael Rothint main(void) {
261950cbebb9SMichael Roth#if !defined(IOCTL_SCSI_GET_ADDRESS)
262050cbebb9SMichael Roth#error Missing required ioctl definitions
262150cbebb9SMichael Roth#endif
262250cbebb9SMichael Roth  SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
262350cbebb9SMichael Roth  return addr.Lun;
262450cbebb9SMichael Roth}
262550cbebb9SMichael RothEOF
262650cbebb9SMichael Roth  if compile_prog "" "" ; then
262750cbebb9SMichael Roth    guest_agent_ntddscsi=yes
2628996b9cdcSMatt Hines    libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
262950cbebb9SMichael Roth  fi
263050cbebb9SMichael Rothfi
263150cbebb9SMichael Roth
263250cbebb9SMichael Roth##########################################
26338ca80760SRichard Henderson# capstone
26348ca80760SRichard Henderson
2635e219c499SRichard Hendersoncase "$capstone" in
26368b18cdbfSRichard Henderson  auto | enabled | internal)
26378b18cdbfSRichard Henderson    # Simpler to always update submodule, even if not needed.
2638e219c499SRichard Henderson    git_submodules="${git_submodules} capstone"
2639e219c499SRichard Henderson    ;;
2640e219c499SRichard Hendersonesac
26418ca80760SRichard Henderson
26428ca80760SRichard Henderson##########################################
2643519175a2SAlex Barcelo# check and set a backend for coroutine
2644d0e2fce5SAneesh Kumar K.V
26457c2acc70SPeter Maydell# We prefer ucontext, but it's not always possible. The fallback
264633c53c54SDaniel P. Berrange# is sigcontext. On Windows the only valid backend is the Windows
264733c53c54SDaniel P. Berrange# specific one.
26487c2acc70SPeter Maydell
26497c2acc70SPeter Maydellucontext_works=no
2650d0e2fce5SAneesh Kumar K.Vif test "$darwin" != "yes"; then
2651d0e2fce5SAneesh Kumar K.V  cat > $TMPC << EOF
2652d0e2fce5SAneesh Kumar K.V#include <ucontext.h>
2653cdf84806SPeter Maydell#ifdef __stub_makecontext
2654cdf84806SPeter Maydell#error Ignoring glibc stub makecontext which will always fail
2655cdf84806SPeter Maydell#endif
265675cafad7SStefan Weilint main(void) { makecontext(0, 0, 0); return 0; }
2657d0e2fce5SAneesh Kumar K.VEOF
2658d0e2fce5SAneesh Kumar K.V  if compile_prog "" "" ; then
26597c2acc70SPeter Maydell    ucontext_works=yes
2660d0e2fce5SAneesh Kumar K.V  fi
2661519175a2SAlex Barcelofi
26627c2acc70SPeter Maydell
26637c2acc70SPeter Maydellif test "$coroutine" = ""; then
26647c2acc70SPeter Maydell  if test "$mingw32" = "yes"; then
26657c2acc70SPeter Maydell    coroutine=win32
26667c2acc70SPeter Maydell  elif test "$ucontext_works" = "yes"; then
26677c2acc70SPeter Maydell    coroutine=ucontext
2668519175a2SAlex Barcelo  else
26697c2acc70SPeter Maydell    coroutine=sigaltstack
26707c2acc70SPeter Maydell  fi
26717c2acc70SPeter Maydellelse
26727c2acc70SPeter Maydell  case $coroutine in
26737c2acc70SPeter Maydell  windows)
26747c2acc70SPeter Maydell    if test "$mingw32" != "yes"; then
26757c2acc70SPeter Maydell      error_exit "'windows' coroutine backend only valid for Windows"
26767c2acc70SPeter Maydell    fi
26777c2acc70SPeter Maydell    # Unfortunately the user visible backend name doesn't match the
26787c2acc70SPeter Maydell    # coroutine-*.c filename for this case, so we have to adjust it here.
26797c2acc70SPeter Maydell    coroutine=win32
26807c2acc70SPeter Maydell    ;;
26817c2acc70SPeter Maydell  ucontext)
26827c2acc70SPeter Maydell    if test "$ucontext_works" != "yes"; then
26837c2acc70SPeter Maydell      feature_not_found "ucontext"
26847c2acc70SPeter Maydell    fi
26857c2acc70SPeter Maydell    ;;
268633c53c54SDaniel P. Berrange  sigaltstack)
26877c2acc70SPeter Maydell    if test "$mingw32" = "yes"; then
26887c2acc70SPeter Maydell      error_exit "only the 'windows' coroutine backend is valid for Windows"
26897c2acc70SPeter Maydell    fi
26907c2acc70SPeter Maydell    ;;
26917c2acc70SPeter Maydell  *)
269276ad07a4SPeter Maydell    error_exit "unknown coroutine backend $coroutine"
26937c2acc70SPeter Maydell    ;;
26947c2acc70SPeter Maydell  esac
2695d0e2fce5SAneesh Kumar K.Vfi
2696d0e2fce5SAneesh Kumar K.V
269770c60c08SStefan Hajnocziif test "$coroutine_pool" = ""; then
269870c60c08SStefan Hajnoczi  coroutine_pool=yes
269970c60c08SStefan Hajnoczifi
270070c60c08SStefan Hajnoczi
27017d992e4dSPeter Lievenif test "$debug_stack_usage" = "yes"; then
27027d992e4dSPeter Lieven  if test "$coroutine_pool" = "yes"; then
27037d992e4dSPeter Lieven    echo "WARN: disabling coroutine pool for stack usage debugging"
27047d992e4dSPeter Lieven    coroutine_pool=no
27057d992e4dSPeter Lieven  fi
27067d992e4dSPeter Lievenfi
27077d992e4dSPeter Lieven
27081e4f6065SDaniele Buono##################################################
27091e4f6065SDaniele Buono# SafeStack
27101e4f6065SDaniele Buono
27111e4f6065SDaniele Buono
27121e4f6065SDaniele Buonoif test "$safe_stack" = "yes"; then
27131e4f6065SDaniele Buonocat > $TMPC << EOF
27141e4f6065SDaniele Buonoint main(int argc, char *argv[])
27151e4f6065SDaniele Buono{
27161e4f6065SDaniele Buono#if ! __has_feature(safe_stack)
27171e4f6065SDaniele Buono#error SafeStack Disabled
27181e4f6065SDaniele Buono#endif
27191e4f6065SDaniele Buono    return 0;
27201e4f6065SDaniele Buono}
27211e4f6065SDaniele BuonoEOF
27221e4f6065SDaniele Buono  flag="-fsanitize=safe-stack"
27231e4f6065SDaniele Buono  # Check that safe-stack is supported and enabled.
27241e4f6065SDaniele Buono  if compile_prog "-Werror $flag" "$flag"; then
27251e4f6065SDaniele Buono    # Flag needed both at compilation and at linking
27261e4f6065SDaniele Buono    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
27271e4f6065SDaniele Buono    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
27281e4f6065SDaniele Buono  else
27291e4f6065SDaniele Buono    error_exit "SafeStack not supported by your compiler"
27301e4f6065SDaniele Buono  fi
27311e4f6065SDaniele Buono  if test "$coroutine" != "ucontext"; then
27321e4f6065SDaniele Buono    error_exit "SafeStack is only supported by the coroutine backend ucontext"
27331e4f6065SDaniele Buono  fi
27341e4f6065SDaniele Buonoelse
27351e4f6065SDaniele Buonocat > $TMPC << EOF
27361e4f6065SDaniele Buonoint main(int argc, char *argv[])
27371e4f6065SDaniele Buono{
27381e4f6065SDaniele Buono#if defined(__has_feature)
27391e4f6065SDaniele Buono#if __has_feature(safe_stack)
27401e4f6065SDaniele Buono#error SafeStack Enabled
27411e4f6065SDaniele Buono#endif
27421e4f6065SDaniele Buono#endif
27431e4f6065SDaniele Buono    return 0;
27441e4f6065SDaniele Buono}
27451e4f6065SDaniele BuonoEOF
27461e4f6065SDaniele Buonoif test "$safe_stack" = "no"; then
27471e4f6065SDaniele Buono  # Make sure that safe-stack is disabled
27481e4f6065SDaniele Buono  if ! compile_prog "-Werror" ""; then
27491e4f6065SDaniele Buono    # SafeStack was already enabled, try to explicitly remove the feature
27501e4f6065SDaniele Buono    flag="-fno-sanitize=safe-stack"
27511e4f6065SDaniele Buono    if ! compile_prog "-Werror $flag" "$flag"; then
27521e4f6065SDaniele Buono      error_exit "Configure cannot disable SafeStack"
27531e4f6065SDaniele Buono    fi
27541e4f6065SDaniele Buono    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
27551e4f6065SDaniele Buono    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
27561e4f6065SDaniele Buono  fi
27571e4f6065SDaniele Buonoelse # "$safe_stack" = ""
27581e4f6065SDaniele Buono  # Set safe_stack to yes or no based on pre-existing flags
27591e4f6065SDaniele Buono  if compile_prog "-Werror" ""; then
27601e4f6065SDaniele Buono    safe_stack="no"
27611e4f6065SDaniele Buono  else
27621e4f6065SDaniele Buono    safe_stack="yes"
27631e4f6065SDaniele Buono    if test "$coroutine" != "ucontext"; then
27641e4f6065SDaniele Buono      error_exit "SafeStack is only supported by the coroutine backend ucontext"
27651e4f6065SDaniele Buono    fi
27661e4f6065SDaniele Buono  fi
27671e4f6065SDaniele Buonofi
27681e4f6065SDaniele Buonofi
27697d992e4dSPeter Lieven
277076a347e1SRichard Henderson########################################
277176a347e1SRichard Henderson# check if cpuid.h is usable.
277276a347e1SRichard Henderson
277376a347e1SRichard Hendersoncat > $TMPC << EOF
277476a347e1SRichard Henderson#include <cpuid.h>
277576a347e1SRichard Hendersonint main(void) {
2776774d566cSPeter Maydell    unsigned a, b, c, d;
2777774d566cSPeter Maydell    int max = __get_cpuid_max(0, 0);
2778774d566cSPeter Maydell
2779774d566cSPeter Maydell    if (max >= 1) {
2780774d566cSPeter Maydell        __cpuid(1, a, b, c, d);
2781774d566cSPeter Maydell    }
2782774d566cSPeter Maydell
2783774d566cSPeter Maydell    if (max >= 7) {
2784774d566cSPeter Maydell        __cpuid_count(7, 0, a, b, c, d);
2785774d566cSPeter Maydell    }
2786774d566cSPeter Maydell
278776a347e1SRichard Henderson    return 0;
278876a347e1SRichard Henderson}
278976a347e1SRichard HendersonEOF
279076a347e1SRichard Hendersonif compile_prog "" "" ; then
279176a347e1SRichard Henderson    cpuid_h=yes
279276a347e1SRichard Hendersonfi
279376a347e1SRichard Henderson
27945dd89908SRichard Henderson##########################################
27955dd89908SRichard Henderson# avx2 optimization requirement check
27965dd89908SRichard Henderson#
27975dd89908SRichard Henderson# There is no point enabling this if cpuid.h is not usable,
27985dd89908SRichard Henderson# since we won't be able to select the new routines.
27995dd89908SRichard Henderson
2800e633a5c6SEric Blakeif test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
28015dd89908SRichard Henderson  cat > $TMPC << EOF
28025dd89908SRichard Henderson#pragma GCC push_options
28035dd89908SRichard Henderson#pragma GCC target("avx2")
28045dd89908SRichard Henderson#include <cpuid.h>
28055dd89908SRichard Henderson#include <immintrin.h>
28065dd89908SRichard Hendersonstatic int bar(void *a) {
28075dd89908SRichard Henderson    __m256i x = *(__m256i *)a;
28085dd89908SRichard Henderson    return _mm256_testz_si256(x, x);
28095dd89908SRichard Henderson}
28105dd89908SRichard Hendersonint main(int argc, char *argv[]) { return bar(argv[0]); }
28115dd89908SRichard HendersonEOF
28125b945f23SRichard Henderson  if compile_object "-Werror" ; then
28135dd89908SRichard Henderson    avx2_opt="yes"
281486583a07SLiam Merwick  else
281586583a07SLiam Merwick    avx2_opt="no"
28165dd89908SRichard Henderson  fi
28175dd89908SRichard Hendersonfi
28185dd89908SRichard Henderson
28196b8cd447SRobert Hoo##########################################
28206b8cd447SRobert Hoo# avx512f optimization requirement check
28216b8cd447SRobert Hoo#
28226b8cd447SRobert Hoo# There is no point enabling this if cpuid.h is not usable,
28236b8cd447SRobert Hoo# since we won't be able to select the new routines.
28246b8cd447SRobert Hoo# by default, it is turned off.
28256b8cd447SRobert Hoo# if user explicitly want to enable it, check environment
28266b8cd447SRobert Hoo
28276b8cd447SRobert Hooif test "$cpuid_h" = "yes" && test "$avx512f_opt" = "yes"; then
28286b8cd447SRobert Hoo  cat > $TMPC << EOF
28296b8cd447SRobert Hoo#pragma GCC push_options
28306b8cd447SRobert Hoo#pragma GCC target("avx512f")
28316b8cd447SRobert Hoo#include <cpuid.h>
28326b8cd447SRobert Hoo#include <immintrin.h>
28336b8cd447SRobert Hoostatic int bar(void *a) {
28346b8cd447SRobert Hoo    __m512i x = *(__m512i *)a;
28356b8cd447SRobert Hoo    return _mm512_test_epi64_mask(x, x);
28366b8cd447SRobert Hoo}
28376b8cd447SRobert Hooint main(int argc, char *argv[])
28386b8cd447SRobert Hoo{
28396b8cd447SRobert Hoo	return bar(argv[0]);
28406b8cd447SRobert Hoo}
28416b8cd447SRobert HooEOF
28425b945f23SRichard Henderson  if ! compile_object "-Werror" ; then
28436b8cd447SRobert Hoo    avx512f_opt="no"
28446b8cd447SRobert Hoo  fi
28456b8cd447SRobert Hooelse
28466b8cd447SRobert Hoo  avx512f_opt="no"
28476b8cd447SRobert Hoofi
28486b8cd447SRobert Hoo
2849f540166bSRichard Henderson########################################
2850f540166bSRichard Henderson# check if __[u]int128_t is usable.
2851f540166bSRichard Henderson
2852f540166bSRichard Hendersonint128=no
2853f540166bSRichard Hendersoncat > $TMPC << EOF
2854f540166bSRichard Henderson__int128_t a;
2855f540166bSRichard Henderson__uint128_t b;
2856f540166bSRichard Hendersonint main (void) {
2857f540166bSRichard Henderson  a = a + b;
2858f540166bSRichard Henderson  b = a * b;
2859464e3671SPeter Maydell  a = a * a;
2860f540166bSRichard Henderson  return 0;
2861f540166bSRichard Henderson}
2862f540166bSRichard HendersonEOF
2863f540166bSRichard Hendersonif compile_prog "" "" ; then
2864f540166bSRichard Henderson    int128=yes
2865f540166bSRichard Hendersonfi
286676a347e1SRichard Henderson
28677ebee43eSRichard Henderson#########################################
28687ebee43eSRichard Henderson# See if 128-bit atomic operations are supported.
28697ebee43eSRichard Henderson
28707ebee43eSRichard Hendersonatomic128=no
28717ebee43eSRichard Hendersonif test "$int128" = "yes"; then
28727ebee43eSRichard Henderson  cat > $TMPC << EOF
28737ebee43eSRichard Hendersonint main(void)
28747ebee43eSRichard Henderson{
28757ebee43eSRichard Henderson  unsigned __int128 x = 0, y = 0;
2876bceac547SThomas Huth  y = __atomic_load(&x, 0);
2877bceac547SThomas Huth  __atomic_store(&x, y, 0);
2878bceac547SThomas Huth  __atomic_compare_exchange(&x, &y, x, 0, 0, 0);
28797ebee43eSRichard Henderson  return 0;
28807ebee43eSRichard Henderson}
28817ebee43eSRichard HendersonEOF
28827ebee43eSRichard Henderson  if compile_prog "" "" ; then
28837ebee43eSRichard Henderson    atomic128=yes
28847ebee43eSRichard Henderson  fi
28857ebee43eSRichard Hendersonfi
28867ebee43eSRichard Henderson
2887e6cd4bb5SRichard Hendersoncmpxchg128=no
2888e633a5c6SEric Blakeif test "$int128" = yes && test "$atomic128" = no; then
2889e6cd4bb5SRichard Henderson  cat > $TMPC << EOF
2890e6cd4bb5SRichard Hendersonint main(void)
2891e6cd4bb5SRichard Henderson{
2892e6cd4bb5SRichard Henderson  unsigned __int128 x = 0, y = 0;
2893e6cd4bb5SRichard Henderson  __sync_val_compare_and_swap_16(&x, y, x);
2894e6cd4bb5SRichard Henderson  return 0;
2895e6cd4bb5SRichard Henderson}
2896e6cd4bb5SRichard HendersonEOF
2897e6cd4bb5SRichard Henderson  if compile_prog "" "" ; then
2898e6cd4bb5SRichard Henderson    cmpxchg128=yes
2899e6cd4bb5SRichard Henderson  fi
2900e6cd4bb5SRichard Hendersonfi
2901e6cd4bb5SRichard Henderson
2902fd0e6053SJohn Snow########################################
2903fd0e6053SJohn Snow# check if ccache is interfering with
2904fd0e6053SJohn Snow# semantic analysis of macros
2905fd0e6053SJohn Snow
29065e4dfd3dSJohn Snowunset CCACHE_CPP2
2907fd0e6053SJohn Snowccache_cpp2=no
2908fd0e6053SJohn Snowcat > $TMPC << EOF
2909fd0e6053SJohn Snowstatic const int Z = 1;
2910fd0e6053SJohn Snow#define fn() ({ Z; })
2911fd0e6053SJohn Snow#define TAUT(X) ((X) == Z)
2912fd0e6053SJohn Snow#define PAREN(X, Y) (X == Y)
2913fd0e6053SJohn Snow#define ID(X) (X)
2914fd0e6053SJohn Snowint main(int argc, char *argv[])
2915fd0e6053SJohn Snow{
2916fd0e6053SJohn Snow    int x = 0, y = 0;
2917fd0e6053SJohn Snow    x = ID(x);
2918fd0e6053SJohn Snow    x = fn();
2919fd0e6053SJohn Snow    fn();
2920fd0e6053SJohn Snow    if (PAREN(x, y)) return 0;
2921fd0e6053SJohn Snow    if (TAUT(Z)) return 0;
2922fd0e6053SJohn Snow    return 0;
2923fd0e6053SJohn Snow}
2924fd0e6053SJohn SnowEOF
2925fd0e6053SJohn Snow
2926fd0e6053SJohn Snowif ! compile_object "-Werror"; then
2927fd0e6053SJohn Snow    ccache_cpp2=yes
2928fd0e6053SJohn Snowfi
2929fd0e6053SJohn Snow
2930b553a042SJohn Snow#################################################
2931b553a042SJohn Snow# clang does not support glibc + FORTIFY_SOURCE.
2932b553a042SJohn Snow
2933b553a042SJohn Snowif test "$fortify_source" != "no"; then
2934b553a042SJohn Snow  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
2935b553a042SJohn Snow    fortify_source="no";
2936e189091fSPeter Maydell  elif test -n "$cxx" && has $cxx &&
2937cfcc7c14SJohn Snow       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
2938b553a042SJohn Snow    fortify_source="no";
2939b553a042SJohn Snow  else
2940b553a042SJohn Snow    fortify_source="yes"
2941b553a042SJohn Snow  fi
2942b553a042SJohn Snowfi
2943b553a042SJohn Snow
2944d2042378SAneesh Kumar K.V##########################################
2945a40161cbSPaolo Bonzini# check for usable membarrier system call
2946a40161cbSPaolo Bonziniif test "$membarrier" = "yes"; then
2947a40161cbSPaolo Bonzini    have_membarrier=no
2948a40161cbSPaolo Bonzini    if test "$mingw32" = "yes" ; then
2949a40161cbSPaolo Bonzini        have_membarrier=yes
2950a40161cbSPaolo Bonzini    elif test "$linux" = "yes" ; then
2951a40161cbSPaolo Bonzini        cat > $TMPC << EOF
2952a40161cbSPaolo Bonzini    #include <linux/membarrier.h>
2953a40161cbSPaolo Bonzini    #include <sys/syscall.h>
2954a40161cbSPaolo Bonzini    #include <unistd.h>
2955a40161cbSPaolo Bonzini    #include <stdlib.h>
2956a40161cbSPaolo Bonzini    int main(void) {
2957a40161cbSPaolo Bonzini        syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
2958a40161cbSPaolo Bonzini        syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
2959a40161cbSPaolo Bonzini	exit(0);
2960a40161cbSPaolo Bonzini    }
2961a40161cbSPaolo BonziniEOF
2962a40161cbSPaolo Bonzini        if compile_prog "" "" ; then
2963a40161cbSPaolo Bonzini            have_membarrier=yes
2964a40161cbSPaolo Bonzini        fi
2965a40161cbSPaolo Bonzini    fi
2966a40161cbSPaolo Bonzini    if test "$have_membarrier" = "no"; then
2967a40161cbSPaolo Bonzini      feature_not_found "membarrier" "membarrier system call not available"
2968a40161cbSPaolo Bonzini    fi
2969a40161cbSPaolo Bonzinielse
2970a40161cbSPaolo Bonzini    # Do not enable it by default even for Mingw32, because it doesn't
2971a40161cbSPaolo Bonzini    # work on Wine.
2972a40161cbSPaolo Bonzini    membarrier=no
2973a40161cbSPaolo Bonzinifi
2974a40161cbSPaolo Bonzini
2975a40161cbSPaolo Bonzini##########################################
2976f0d92b56SLongpeng(Mike)# check for usable AF_ALG environment
29774f67366eSThomas Huthhave_afalg=no
2978f0d92b56SLongpeng(Mike)cat > $TMPC << EOF
2979f0d92b56SLongpeng(Mike)#include <errno.h>
2980f0d92b56SLongpeng(Mike)#include <sys/types.h>
2981f0d92b56SLongpeng(Mike)#include <sys/socket.h>
2982f0d92b56SLongpeng(Mike)#include <linux/if_alg.h>
2983f0d92b56SLongpeng(Mike)int main(void) {
2984f0d92b56SLongpeng(Mike)    int sock;
2985f0d92b56SLongpeng(Mike)    sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
2986f0d92b56SLongpeng(Mike)    return sock;
2987f0d92b56SLongpeng(Mike)}
2988f0d92b56SLongpeng(Mike)EOF
2989f0d92b56SLongpeng(Mike)if compile_prog "" "" ; then
2990f0d92b56SLongpeng(Mike)    have_afalg=yes
2991f0d92b56SLongpeng(Mike)fi
2992f0d92b56SLongpeng(Mike)if test "$crypto_afalg" = "yes"
2993f0d92b56SLongpeng(Mike)then
2994f0d92b56SLongpeng(Mike)    if test "$have_afalg" != "yes"
2995f0d92b56SLongpeng(Mike)    then
2996f0d92b56SLongpeng(Mike)	error_exit "AF_ALG requested but could not be detected"
2997f0d92b56SLongpeng(Mike)    fi
2998f0d92b56SLongpeng(Mike)fi
2999f0d92b56SLongpeng(Mike)
3000f0d92b56SLongpeng(Mike)
3001db1ed1abSRichard Henderson##########################################
3002247724cbSMarc-André Lureau# checks for sanitizers
3003247724cbSMarc-André Lureau
3004247724cbSMarc-André Lureauhave_asan=no
3005247724cbSMarc-André Lureauhave_ubsan=no
3006d83414e1SMarc-André Lureauhave_asan_iface_h=no
3007d83414e1SMarc-André Lureauhave_asan_iface_fiber=no
3008247724cbSMarc-André Lureau
3009247724cbSMarc-André Lureauif test "$sanitizers" = "yes" ; then
3010b9f44da2SMarc-André Lureau  write_c_skeleton
3011247724cbSMarc-André Lureau  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
3012247724cbSMarc-André Lureau      have_asan=yes
3013247724cbSMarc-André Lureau  fi
3014b9f44da2SMarc-André Lureau
3015b9f44da2SMarc-André Lureau  # we could use a simple skeleton for flags checks, but this also
3016b9f44da2SMarc-André Lureau  # detect the static linking issue of ubsan, see also:
3017b9f44da2SMarc-André Lureau  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
3018b9f44da2SMarc-André Lureau  cat > $TMPC << EOF
3019b9f44da2SMarc-André Lureau#include <stdlib.h>
3020b9f44da2SMarc-André Lureauint main(void) {
3021b9f44da2SMarc-André Lureau    void *tmp = malloc(10);
3022f2dfe54cSLeonid Bloch    if (tmp != NULL) {
3023b9f44da2SMarc-André Lureau        return *(int *)(tmp + 2);
3024b9f44da2SMarc-André Lureau    }
3025d1abf3fcSOlaf Hering    return 1;
3026f2dfe54cSLeonid Bloch}
3027b9f44da2SMarc-André LureauEOF
3028247724cbSMarc-André Lureau  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
3029247724cbSMarc-André Lureau      have_ubsan=yes
3030247724cbSMarc-André Lureau  fi
3031d83414e1SMarc-André Lureau
3032d83414e1SMarc-André Lureau  if check_include "sanitizer/asan_interface.h" ; then
3033d83414e1SMarc-André Lureau      have_asan_iface_h=yes
3034d83414e1SMarc-André Lureau  fi
3035d83414e1SMarc-André Lureau
3036d83414e1SMarc-André Lureau  cat > $TMPC << EOF
3037d83414e1SMarc-André Lureau#include <sanitizer/asan_interface.h>
3038d83414e1SMarc-André Lureauint main(void) {
3039d83414e1SMarc-André Lureau  __sanitizer_start_switch_fiber(0, 0, 0);
3040d83414e1SMarc-André Lureau  return 0;
3041d83414e1SMarc-André Lureau}
3042d83414e1SMarc-André LureauEOF
3043d83414e1SMarc-André Lureau  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
3044d83414e1SMarc-André Lureau      have_asan_iface_fiber=yes
3045d83414e1SMarc-André Lureau  fi
3046247724cbSMarc-André Lureaufi
3047247724cbSMarc-André Lureau
30480aebab04SLingfeng Yang# Thread sanitizer is, for now, much noisier than the other sanitizers;
30490aebab04SLingfeng Yang# keep it separate until that is not the case.
30500aebab04SLingfeng Yangif test "$tsan" = "yes" && test "$sanitizers" = "yes"; then
30510aebab04SLingfeng Yang  error_exit "TSAN is not supported with other sanitiziers."
30520aebab04SLingfeng Yangfi
30530aebab04SLingfeng Yanghave_tsan=no
30540aebab04SLingfeng Yanghave_tsan_iface_fiber=no
30550aebab04SLingfeng Yangif test "$tsan" = "yes" ; then
30560aebab04SLingfeng Yang  write_c_skeleton
30570aebab04SLingfeng Yang  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
30580aebab04SLingfeng Yang      have_tsan=yes
30590aebab04SLingfeng Yang  fi
30600aebab04SLingfeng Yang  cat > $TMPC << EOF
30610aebab04SLingfeng Yang#include <sanitizer/tsan_interface.h>
30620aebab04SLingfeng Yangint main(void) {
30630aebab04SLingfeng Yang  __tsan_create_fiber(0);
30640aebab04SLingfeng Yang  return 0;
30650aebab04SLingfeng Yang}
30660aebab04SLingfeng YangEOF
30670aebab04SLingfeng Yang  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
30680aebab04SLingfeng Yang      have_tsan_iface_fiber=yes
30690aebab04SLingfeng Yang  fi
30700aebab04SLingfeng Yangfi
30710aebab04SLingfeng Yang
3072adc28027SAlexander Bulekov##########################################
3073675b9b53SMarc-André Lureau# check for slirp
3074675b9b53SMarc-André Lureau
3075675b9b53SMarc-André Lureaucase "$slirp" in
30764d34a86bSPaolo Bonzini  auto | enabled | internal)
30774d34a86bSPaolo Bonzini    # Simpler to always update submodule, even if not needed.
30787c57bdd8SMarc-André Lureau    git_submodules="${git_submodules} slirp"
3079675b9b53SMarc-André Lureau    ;;
3080675b9b53SMarc-André Lureauesac
3081675b9b53SMarc-André Lureau
3082b8e0c493SJoelle van Dyne# Check for slirp smbd dupport
3083b8e0c493SJoelle van Dyne: ${smbd=${SMBD-/usr/sbin/smbd}}
3084b8e0c493SJoelle van Dyneif test "$slirp_smbd" != "no" ; then
3085b8e0c493SJoelle van Dyne  if test "$mingw32" = "yes" ; then
3086b8e0c493SJoelle van Dyne    if test "$slirp_smbd" = "yes" ; then
3087b8e0c493SJoelle van Dyne      error_exit "Host smbd not supported on this platform."
3088b8e0c493SJoelle van Dyne    fi
3089b8e0c493SJoelle van Dyne    slirp_smbd=no
3090b8e0c493SJoelle van Dyne  else
3091b8e0c493SJoelle van Dyne    slirp_smbd=yes
3092b8e0c493SJoelle van Dyne  fi
3093b8e0c493SJoelle van Dynefi
3094b8e0c493SJoelle van Dyne
309554e7aac0SAlexey Krasikov##########################################
309654e7aac0SAlexey Krasikov# check for usable __NR_keyctl syscall
309754e7aac0SAlexey Krasikov
309854e7aac0SAlexey Krasikovif test "$linux" = "yes" ; then
309954e7aac0SAlexey Krasikov
310054e7aac0SAlexey Krasikov    have_keyring=no
310154e7aac0SAlexey Krasikov    cat > $TMPC << EOF
310254e7aac0SAlexey Krasikov#include <errno.h>
310354e7aac0SAlexey Krasikov#include <asm/unistd.h>
310454e7aac0SAlexey Krasikov#include <linux/keyctl.h>
310554e7aac0SAlexey Krasikov#include <unistd.h>
310654e7aac0SAlexey Krasikovint main(void) {
310754e7aac0SAlexey Krasikov    return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
310854e7aac0SAlexey Krasikov}
310954e7aac0SAlexey KrasikovEOF
311054e7aac0SAlexey Krasikov    if compile_prog "" "" ; then
311154e7aac0SAlexey Krasikov        have_keyring=yes
311254e7aac0SAlexey Krasikov    fi
311354e7aac0SAlexey Krasikovfi
311454e7aac0SAlexey Krasikovif test "$secret_keyring" != "no"
311554e7aac0SAlexey Krasikovthen
3116b418d265SDavid Edmondson    if test "$have_keyring" = "yes"
311754e7aac0SAlexey Krasikov    then
311854e7aac0SAlexey Krasikov	secret_keyring=yes
311954e7aac0SAlexey Krasikov    else
312054e7aac0SAlexey Krasikov	if test "$secret_keyring" = "yes"
312154e7aac0SAlexey Krasikov	then
312254e7aac0SAlexey Krasikov	    error_exit "syscall __NR_keyctl requested, \
312354e7aac0SAlexey Krasikovbut not implemented on your system"
312454e7aac0SAlexey Krasikov	else
312554e7aac0SAlexey Krasikov	    secret_keyring=no
312654e7aac0SAlexey Krasikov	fi
312754e7aac0SAlexey Krasikov    fi
312854e7aac0SAlexey Krasikovfi
312954e7aac0SAlexey Krasikov
313092500362SAlexey Krasikov##########################################
3131e86ecd4bSJuan Quintela# End of CC checks
3132e86ecd4bSJuan Quintela# After here, no more $cc or $ld runs
3133e86ecd4bSJuan Quintela
3134d83414e1SMarc-André Lureauwrite_c_skeleton
3135d83414e1SMarc-André Lureau
31361d728c39SBlue Swirlif test "$gcov" = "yes" ; then
3137bf0e56a3SMarc-André Lureau  :
3138b553a042SJohn Snowelif test "$fortify_source" = "yes" ; then
3139086d5f75SPaolo Bonzini  QEMU_CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $QEMU_CFLAGS"
3140086d5f75SPaolo Bonzini  debug=no
3141086d5f75SPaolo Bonzinifi
3142086d5f75SPaolo Bonzini
3143086d5f75SPaolo Bonzinicase "$ARCH" in
3144086d5f75SPaolo Bonzinialpha)
3145086d5f75SPaolo Bonzini  # Ensure there's only a single GP
3146086d5f75SPaolo Bonzini  QEMU_CFLAGS="-msmall-data $QEMU_CFLAGS"
3147086d5f75SPaolo Bonzini;;
3148086d5f75SPaolo Bonziniesac
3149086d5f75SPaolo Bonzini
3150086d5f75SPaolo Bonziniif test "$gprof" = "yes" ; then
3151086d5f75SPaolo Bonzini  QEMU_CFLAGS="-p $QEMU_CFLAGS"
3152086d5f75SPaolo Bonzini  QEMU_LDFLAGS="-p $QEMU_LDFLAGS"
3153086d5f75SPaolo Bonzinifi
3154a316e378SJuan Quintela
3155247724cbSMarc-André Lureauif test "$have_asan" = "yes"; then
3156db5adeaaSPaolo Bonzini  QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
3157db5adeaaSPaolo Bonzini  QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
3158d83414e1SMarc-André Lureau  if test "$have_asan_iface_h" = "no" ; then
3159d83414e1SMarc-André Lureau      echo "ASAN build enabled, but ASAN header missing." \
3160d83414e1SMarc-André Lureau           "Without code annotation, the report may be inferior."
3161d83414e1SMarc-André Lureau  elif test "$have_asan_iface_fiber" = "no" ; then
3162d83414e1SMarc-André Lureau      echo "ASAN build enabled, but ASAN header is too old." \
3163d83414e1SMarc-André Lureau           "Without code annotation, the report may be inferior."
3164d83414e1SMarc-André Lureau  fi
3165247724cbSMarc-André Lureaufi
31660aebab04SLingfeng Yangif test "$have_tsan" = "yes" ; then
31670aebab04SLingfeng Yang  if test "$have_tsan_iface_fiber" = "yes" ; then
31680aebab04SLingfeng Yang    QEMU_CFLAGS="-fsanitize=thread $QEMU_CFLAGS"
31690aebab04SLingfeng Yang    QEMU_LDFLAGS="-fsanitize=thread $QEMU_LDFLAGS"
31700aebab04SLingfeng Yang  else
31710aebab04SLingfeng Yang    error_exit "Cannot enable TSAN due to missing fiber annotation interface."
31720aebab04SLingfeng Yang  fi
31730aebab04SLingfeng Yangelif test "$tsan" = "yes" ; then
31740aebab04SLingfeng Yang  error_exit "Cannot enable TSAN due to missing sanitize thread interface."
31750aebab04SLingfeng Yangfi
3176247724cbSMarc-André Lureauif test "$have_ubsan" = "yes"; then
3177db5adeaaSPaolo Bonzini  QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS"
3178db5adeaaSPaolo Bonzini  QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
3179247724cbSMarc-André Lureaufi
3180247724cbSMarc-André Lureau
31816542aa9cSPeter Lieven##########################################
31823efac6ebSTomáš Golembiovský
31830aebab04SLingfeng Yang# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
31840aebab04SLingfeng Yangif test "$solaris" = "no" && test "$tsan" = "no"; then
3185e86ecd4bSJuan Quintela    if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
3186db5adeaaSPaolo Bonzini        QEMU_LDFLAGS="-Wl,--warn-common $QEMU_LDFLAGS"
3187e86ecd4bSJuan Quintela    fi
3188e86ecd4bSJuan Quintelafi
3189e86ecd4bSJuan Quintela
3190952afb71SBlue Swirl# Use ASLR, no-SEH and DEP if available
3191952afb71SBlue Swirlif test "$mingw32" = "yes" ; then
3192cb8baa77SMark Cave-Ayland    flags="--no-seh --nxcompat"
3193cb8baa77SMark Cave-Ayland
3194cb8baa77SMark Cave-Ayland    # Disable ASLR for debug builds to allow debugging with gdb
3195cb8baa77SMark Cave-Ayland    if test "$debug" = "no" ; then
3196cb8baa77SMark Cave-Ayland        flags="--dynamicbase $flags"
3197cb8baa77SMark Cave-Ayland    fi
3198cb8baa77SMark Cave-Ayland
3199cb8baa77SMark Cave-Ayland    for flag in $flags; do
3200e9a3591fSChristian Borntraeger        if ld_has $flag ; then
3201db5adeaaSPaolo Bonzini            QEMU_LDFLAGS="-Wl,$flag $QEMU_LDFLAGS"
3202952afb71SBlue Swirl        fi
3203952afb71SBlue Swirl    done
3204952afb71SBlue Swirlfi
3205952afb71SBlue Swirl
32069d6bc27bSMichael Roth# Probe for guest agent support/options
32079d6bc27bSMichael Roth
3208e8ef31a3SMichael Tokarevif [ "$guest_agent" != "no" ]; then
3209a5125905SLaurent Vivier  if [ "$softmmu" = no -a "$want_tools" = no ] ; then
3210a5125905SLaurent Vivier      guest_agent=no
3211a5125905SLaurent Vivier  elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
3212e8ef31a3SMichael Tokarev      guest_agent=yes
3213e8ef31a3SMichael Tokarev  elif [ "$guest_agent" != yes ]; then
3214e8ef31a3SMichael Tokarev      guest_agent=no
3215e8ef31a3SMichael Tokarev  else
3216e8ef31a3SMichael Tokarev      error_exit "Guest agent is not supported on this platform"
3217ca35f780SPaolo Bonzini  fi
32184b1c11fdSDaniel P. Berrangefi
3219ca35f780SPaolo Bonzini
3220b846ab7cSPaolo Bonzini# Guest agent Windows MSI package
32219d6bc27bSMichael Roth
32229d6bc27bSMichael Rothif test "$QEMU_GA_MANUFACTURER" = ""; then
32239d6bc27bSMichael Roth  QEMU_GA_MANUFACTURER=QEMU
32249d6bc27bSMichael Rothfi
32259d6bc27bSMichael Rothif test "$QEMU_GA_DISTRO" = ""; then
32269d6bc27bSMichael Roth  QEMU_GA_DISTRO=Linux
32279d6bc27bSMichael Rothfi
32289d6bc27bSMichael Rothif test "$QEMU_GA_VERSION" = ""; then
322989138857SStefan Weil    QEMU_GA_VERSION=$(cat $source_path/VERSION)
32309d6bc27bSMichael Rothfi
32319d6bc27bSMichael Roth
3232b846ab7cSPaolo BonziniQEMU_GA_MSI_MINGW_DLL_PATH="$($pkg_config --variable=prefix glib-2.0)/bin"
32339d6bc27bSMichael Roth
3234ca35f780SPaolo Bonzini# Mac OS X ships with a broken assembler
3235ca35f780SPaolo Bonziniroms=
3236e633a5c6SEric Blakeif { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
3237ba7c60c2SPaolo Bonzini        test "$targetos" != "darwin" && test "$targetos" != "sunos" && \
3238ba7c60c2SPaolo Bonzini        test "$targetos" != "haiku" && test "$softmmu" = yes ; then
3239e57218b6SPeter Maydell    # Different host OS linkers have different ideas about the name of the ELF
3240c65d5e4eSBrad Smith    # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
3241c65d5e4eSBrad Smith    # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
3242c65d5e4eSBrad Smith    for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
3243e57218b6SPeter Maydell        if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
3244e57218b6SPeter Maydell            ld_i386_emulation="$emu"
3245ca35f780SPaolo Bonzini            roms="optionrom"
3246e57218b6SPeter Maydell            break
3247e57218b6SPeter Maydell        fi
3248e57218b6SPeter Maydell    done
3249ca35f780SPaolo Bonzinifi
3250ca35f780SPaolo Bonzini
32512e33c3f8SThomas Huth# Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
3252a5b2afd5SThomas Huth# or -march=z10 (which is the lowest architecture level that Clang supports)
32539933c305SChristian Borntraegerif test "$cpu" = "s390x" ; then
32542e33c3f8SThomas Huth  write_c_skeleton
3255a5b2afd5SThomas Huth  compile_prog "-march=z900" ""
3256a5b2afd5SThomas Huth  has_z900=$?
32573af448b3SThomas Huth  if [ $has_z900 = 0 ] || compile_object "-march=z10 -msoft-float -Werror"; then
3258a5b2afd5SThomas Huth    if [ $has_z900 != 0 ]; then
3259a5b2afd5SThomas Huth      echo "WARNING: Your compiler does not support the z900!"
3260a5b2afd5SThomas Huth      echo "         The s390-ccw bios will only work with guest CPUs >= z10."
3261a5b2afd5SThomas Huth    fi
32629933c305SChristian Borntraeger    roms="$roms s390-ccw"
32631ef6bfc2SPhilippe Mathieu-Daudé    # SLOF is required for building the s390-ccw firmware on s390x,
32641ef6bfc2SPhilippe Mathieu-Daudé    # since it is using the libnet code from SLOF for network booting.
32651ef6bfc2SPhilippe Mathieu-Daudé    git_submodules="${git_submodules} roms/SLOF"
32661ef6bfc2SPhilippe Mathieu-Daudé  fi
32679933c305SChristian Borntraegerfi
32689933c305SChristian Borntraeger
326911cde1c8SBruno Dominguez# Check that the C++ compiler exists and works with the C compiler.
327011cde1c8SBruno Dominguez# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
327111cde1c8SBruno Dominguezif has $cxx; then
327211cde1c8SBruno Dominguez    cat > $TMPC <<EOF
327311cde1c8SBruno Dominguezint c_function(void);
327411cde1c8SBruno Dominguezint main(void) { return c_function(); }
327511cde1c8SBruno DominguezEOF
327611cde1c8SBruno Dominguez
327711cde1c8SBruno Dominguez    compile_object
327811cde1c8SBruno Dominguez
327911cde1c8SBruno Dominguez    cat > $TMPCXX <<EOF
328011cde1c8SBruno Dominguezextern "C" {
328111cde1c8SBruno Dominguez   int c_function(void);
328211cde1c8SBruno Dominguez}
328311cde1c8SBruno Dominguezint c_function(void) { return 42; }
328411cde1c8SBruno DominguezEOF
328511cde1c8SBruno Dominguez
328611cde1c8SBruno Dominguez    update_cxxflags
328711cde1c8SBruno Dominguez
3288a2866660SPaolo Bonzini    if do_cxx $CXXFLAGS $EXTRA_CXXFLAGS $CONFIGURE_CXXFLAGS $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
328911cde1c8SBruno Dominguez        # C++ compiler $cxx works ok with C compiler $cc
329011cde1c8SBruno Dominguez        :
329111cde1c8SBruno Dominguez    else
329211cde1c8SBruno Dominguez        echo "C++ compiler $cxx does not work with C compiler $cc"
329311cde1c8SBruno Dominguez        echo "Disabling C++ specific optional code"
329411cde1c8SBruno Dominguez        cxx=
329511cde1c8SBruno Dominguez    fi
329611cde1c8SBruno Dominguezelse
329711cde1c8SBruno Dominguez    echo "No C++ compiler available; disabling C++ specific optional code"
329811cde1c8SBruno Dominguez    cxx=
329911cde1c8SBruno Dominguezfi
330011cde1c8SBruno Dominguez
33017d7dbf9dSDan Streetmanif !(GIT="$git" "$source_path/scripts/git-submodule.sh" "$git_submodules_action" "$git_submodules"); then
33027d7dbf9dSDan Streetman    exit 1
33035d91a2edSYonggang Luofi
33045d91a2edSYonggang Luo
330598ec69acSJuan Quintelaconfig_host_mak="config-host.mak"
330697a847bcSbellard
330798ec69acSJuan Quintelaecho "# Automatically generated by configure - do not modify" > $config_host_mak
330898ec69acSJuan Quintelaecho >> $config_host_mak
330998ec69acSJuan Quintela
3310e6c3b0f7SPaolo Bonziniecho all: >> $config_host_mak
3311cc84d63aSDaniel P. Berrangeecho "GIT=$git" >> $config_host_mak
3312aef45d51SDaniel P. Berrangeecho "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
33137d7dbf9dSDan Streetmanecho "GIT_SUBMODULES_ACTION=$git_submodules_action" >> $config_host_mak
3314804edf29SJuan Quintela
3315f8393946Saurel32if test "$debug_tcg" = "yes" ; then
33162358a494SJuan Quintela  echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
3317f8393946Saurel32fi
33181625af87Saliguoriif test "$strip_opt" = "yes" ; then
331952ba784dSHollis Blanchard  echo "STRIP=${strip}" >> $config_host_mak
33201625af87Saliguorifi
332167b915a5Sbellardif test "$mingw32" = "yes" ; then
332298ec69acSJuan Quintela  echo "CONFIG_WIN32=y" >> $config_host_mak
3323d9840e25STomoki Sekiyama  if test "$guest_agent_with_vss" = "yes" ; then
3324d9840e25STomoki Sekiyama    echo "CONFIG_QGA_VSS=y" >> $config_host_mak
3325f33ca81fSMichael Roth    echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
3326d9840e25STomoki Sekiyama    echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
3327d9840e25STomoki Sekiyama  fi
332850cbebb9SMichael Roth  if test "$guest_agent_ntddscsi" = "yes" ; then
332976dc75caSTomáš Golembiovský    echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
333050cbebb9SMichael Roth  fi
33319dacf32dSYossi Hindin  echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
33329dacf32dSYossi Hindin  echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
33339dacf32dSYossi Hindin  echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
33349dacf32dSYossi Hindin  echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
3335210fa556Spbrookelse
333635f4df27SJuan Quintela  echo "CONFIG_POSIX=y" >> $config_host_mak
3337210fa556Spbrookfi
3338128ab2ffSblueswir1
3339dffcb71cSMark McLoughlinif test "$linux" = "yes" ; then
3340dffcb71cSMark McLoughlin  echo "CONFIG_LINUX=y" >> $config_host_mak
3341dffcb71cSMark McLoughlinfi
3342dffcb71cSMark McLoughlin
334383fb7adfSbellardif test "$darwin" = "yes" ; then
334498ec69acSJuan Quintela  echo "CONFIG_DARWIN=y" >> $config_host_mak
334583fb7adfSbellardfi
3346b29fe3edSmalc
3347ec530c81Sbellardif test "$solaris" = "yes" ; then
334898ec69acSJuan Quintela  echo "CONFIG_SOLARIS=y" >> $config_host_mak
3349ec530c81Sbellardfi
335097a847bcSbellardif test "$static" = "yes" ; then
335198ec69acSJuan Quintela  echo "CONFIG_STATIC=y" >> $config_host_mak
335297a847bcSbellardfi
33531ba16968SStefan Weilif test "$profiler" = "yes" ; then
33542358a494SJuan Quintela  echo "CONFIG_PROFILER=y" >> $config_host_mak
335505c2a3e7Sbellardfi
3356c932ce31SPaolo Bonziniif test "$want_tools" = "yes" ; then
3357c932ce31SPaolo Bonzini  echo "CONFIG_TOOLS=y" >> $config_host_mak
3358c932ce31SPaolo Bonzinifi
3359f15bff25SPaolo Bonziniif test "$guest_agent" = "yes" ; then
3360f15bff25SPaolo Bonzini  echo "CONFIG_GUEST_AGENT=y" >> $config_host_mak
3361f15bff25SPaolo Bonzinifi
3362b8e0c493SJoelle van Dyneif test "$slirp_smbd" = "yes" ; then
3363b8e0c493SJoelle van Dyne  echo "CONFIG_SLIRP_SMBD=y" >> $config_host_mak
3364e2d8830eSBrad  echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
3365b8e0c493SJoelle van Dynefi
33664cc600d2SPaolo Bonziniif test "$gprof" = "yes" ; then
33674cc600d2SPaolo Bonzini  echo "CONFIG_GPROF=y" >> $config_host_mak
33684cc600d2SPaolo Bonzinifi
3369b64ec4e4SFam Zhengecho "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
3370b64ec4e4SFam Zhengecho "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
3371e5f05f8cSKevin Wolfif test "$block_drv_whitelist_tools" = "yes" ; then
3372e5f05f8cSKevin Wolf  echo "CONFIG_BDRV_WHITELIST_TOOLS=y" >> $config_host_mak
3373e5f05f8cSKevin Wolffi
337489138857SStefan Weilqemu_version=$(head $source_path/VERSION)
33752358a494SJuan Quintelaecho "PKGVERSION=$pkgversion" >>$config_host_mak
337698ec69acSJuan Quintelaecho "SRC_PATH=$source_path" >> $config_host_mak
33772b1f35b9SAlex Bennéeecho "TARGET_DIRS=$target_list" >> $config_host_mak
337817969268SFam Zhengif test "$modules" = "yes"; then
3379e26110cfSFam Zheng  # $shacmd can generate a hash started with digit, which the compiler doesn't
3380e26110cfSFam Zheng  # like as an symbol. So prefix it with an underscore
338189138857SStefan Weil  echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
338217969268SFam Zheng  echo "CONFIG_MODULES=y" >> $config_host_mak
338317969268SFam Zhengfi
3384bd83c861SChristian Ehrhardtif test "$module_upgrades" = "yes"; then
3385bd83c861SChristian Ehrhardt  echo "CONFIG_MODULE_UPGRADES=y" >> $config_host_mak
3386bd83c861SChristian Ehrhardtfi
3387955727d2SCortland Tölvaif test "$have_usbfs" = "yes" ; then
3388955727d2SCortland Tölva  echo "CONFIG_USBFS=y" >> $config_host_mak
3389955727d2SCortland Tölvafi
3390f876b765SMarc-André Lureauif test "$gio" = "yes" ; then
3391f876b765SMarc-André Lureau    echo "CONFIG_GIO=y" >> $config_host_mak
3392f876b765SMarc-André Lureau    echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
3393f876b765SMarc-André Lureau    echo "GIO_LIBS=$gio_libs" >> $config_host_mak
33945ecfb76cSPaolo Bonzinifi
33955ecfb76cSPaolo Bonziniif test "$gdbus_codegen" != "" ; then
339625a97a56SMarc-André Lureau    echo "GDBUS_CODEGEN=$gdbus_codegen" >> $config_host_mak
3397f876b765SMarc-André Lureaufi
3398a1c5e949SDaniel P. Berrangeecho "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
3399277abf15SJan Vesely
34001badb709SPaolo Bonziniif test "$xen" = "enabled" ; then
34016dbd588aSJan Kiszka  echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
3402d5b93ddfSAnthony PERARD  echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
3403582ea95fSMarc-André Lureau  echo "XEN_CFLAGS=$xen_cflags" >> $config_host_mak
3404582ea95fSMarc-André Lureau  echo "XEN_LIBS=$xen_libs" >> $config_host_mak
3405e37630caSaliguorifi
34065e9be92dSNicholas Bellingerif test "$vhost_scsi" = "yes" ; then
34075e9be92dSNicholas Bellinger  echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
34085e9be92dSNicholas Bellingerfi
3409af3bba76SPaolo Bonziniif test "$vhost_net" = "yes" ; then
3410af3bba76SPaolo Bonzini  echo "CONFIG_VHOST_NET=y" >> $config_host_mak
3411af3bba76SPaolo Bonzinifi
3412af3bba76SPaolo Bonziniif test "$vhost_net_user" = "yes" ; then
341356f41de7SPaolo Bonzini  echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
341403ce5744SNikolay Nikolaevfi
3415108a6481SCindy Luif test "$vhost_net_vdpa" = "yes" ; then
3416108a6481SCindy Lu  echo "CONFIG_VHOST_NET_VDPA=y" >> $config_host_mak
3417108a6481SCindy Lufi
3418042cea27SGongleiif test "$vhost_crypto" = "yes" ; then
3419042cea27SGonglei  echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
3420042cea27SGongleifi
3421fc0b9b0eSStefan Hajnocziif test "$vhost_vsock" = "yes" ; then
3422fc0b9b0eSStefan Hajnoczi  echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
34235fe97d88SStefano Garzarella  if test "$vhost_user" = "yes" ; then
34245fe97d88SStefano Garzarella    echo "CONFIG_VHOST_USER_VSOCK=y" >> $config_host_mak
34255fe97d88SStefano Garzarella  fi
3426fc0b9b0eSStefan Hajnoczifi
3427299e6f19SPaolo Bonziniif test "$vhost_kernel" = "yes" ; then
3428299e6f19SPaolo Bonzini  echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
3429299e6f19SPaolo Bonzinifi
3430e6a74868SMarc-André Lureauif test "$vhost_user" = "yes" ; then
3431e6a74868SMarc-André Lureau  echo "CONFIG_VHOST_USER=y" >> $config_host_mak
3432e6a74868SMarc-André Lureaufi
3433108a6481SCindy Luif test "$vhost_vdpa" = "yes" ; then
3434108a6481SCindy Lu  echo "CONFIG_VHOST_VDPA=y" >> $config_host_mak
3435108a6481SCindy Lufi
343698fc1adaSDr. David Alan Gilbertif test "$vhost_user_fs" = "yes" ; then
343798fc1adaSDr. David Alan Gilbert  echo "CONFIG_VHOST_USER_FS=y" >> $config_host_mak
343898fc1adaSDr. David Alan Gilbertfi
3439a40161cbSPaolo Bonziniif test "$membarrier" = "yes" ; then
3440a40161cbSPaolo Bonzini  echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
3441a40161cbSPaolo Bonzinifi
3442e5b46549SRichard Hendersonif test "$tcg" = "enabled" -a "$tcg_interpreter" = "true" ; then
3443e5b46549SRichard Henderson  echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
3444e5b46549SRichard Hendersonfi
344558d3f3ffSGerd Hoffmann
3446da076ffeSGerd Hoffmannif test "$opengl" = "yes" ; then
3447da076ffeSGerd Hoffmann  echo "CONFIG_OPENGL=y" >> $config_host_mak
3448de2d3005SPaolo Bonzini  echo "OPENGL_CFLAGS=$opengl_cflags" >> $config_host_mak
3449da076ffeSGerd Hoffmann  echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
345020ff075bSMichael Wallefi
345120ff075bSMichael Walle
345299f2dbd3SLiang Liif test "$avx2_opt" = "yes" ; then
345399f2dbd3SLiang Li  echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
345499f2dbd3SLiang Lifi
345599f2dbd3SLiang Li
34566b8cd447SRobert Hooif test "$avx512f_opt" = "yes" ; then
34576b8cd447SRobert Hoo  echo "CONFIG_AVX512F_OPT=y" >> $config_host_mak
34586b8cd447SRobert Hoofi
34596b8cd447SRobert Hoo
346083fb7adfSbellard# XXX: suppress that
34617d3505c5Sbellardif [ "$bsd" = "yes" ] ; then
34622358a494SJuan Quintela  echo "CONFIG_BSD=y" >> $config_host_mak
34637d3505c5Sbellardfi
34647d3505c5Sbellard
34653556c233SPaolo Bonziniif test "$qom_cast_debug" = "yes" ; then
34663556c233SPaolo Bonzini  echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
34673556c233SPaolo Bonzinifi
346820ff6c80SAnthony Liguori
34697c2acc70SPeter Maydellecho "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
347070c60c08SStefan Hajnocziif test "$coroutine_pool" = "yes" ; then
347170c60c08SStefan Hajnoczi  echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
347270c60c08SStefan Hajnoczielse
347370c60c08SStefan Hajnoczi  echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
347470c60c08SStefan Hajnoczifi
3475d0e2fce5SAneesh Kumar K.V
34767d992e4dSPeter Lievenif test "$debug_stack_usage" = "yes" ; then
34777d992e4dSPeter Lieven  echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
34787d992e4dSPeter Lievenfi
34797d992e4dSPeter Lieven
3480f0d92b56SLongpeng(Mike)if test "$crypto_afalg" = "yes" ; then
3481f0d92b56SLongpeng(Mike)  echo "CONFIG_AF_ALG=y" >> $config_host_mak
3482f0d92b56SLongpeng(Mike)fi
3483f0d92b56SLongpeng(Mike)
3484d83414e1SMarc-André Lureauif test "$have_asan_iface_fiber" = "yes" ; then
3485d83414e1SMarc-André Lureau    echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
3486d83414e1SMarc-André Lureaufi
3487d83414e1SMarc-André Lureau
34880aebab04SLingfeng Yangif test "$have_tsan" = "yes" && test "$have_tsan_iface_fiber" = "yes" ; then
34890aebab04SLingfeng Yang    echo "CONFIG_TSAN=y" >> $config_host_mak
34900aebab04SLingfeng Yangfi
34910aebab04SLingfeng Yang
349276a347e1SRichard Hendersonif test "$cpuid_h" = "yes" ; then
349376a347e1SRichard Henderson  echo "CONFIG_CPUID_H=y" >> $config_host_mak
349476a347e1SRichard Hendersonfi
349576a347e1SRichard Henderson
3496f540166bSRichard Hendersonif test "$int128" = "yes" ; then
3497f540166bSRichard Henderson  echo "CONFIG_INT128=y" >> $config_host_mak
3498f540166bSRichard Hendersonfi
3499f540166bSRichard Henderson
35007ebee43eSRichard Hendersonif test "$atomic128" = "yes" ; then
35017ebee43eSRichard Henderson  echo "CONFIG_ATOMIC128=y" >> $config_host_mak
35027ebee43eSRichard Hendersonfi
35037ebee43eSRichard Henderson
3504e6cd4bb5SRichard Hendersonif test "$cmpxchg128" = "yes" ; then
3505e6cd4bb5SRichard Henderson  echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
3506e6cd4bb5SRichard Hendersonfi
3507e6cd4bb5SRichard Henderson
3508ed1701c6SDr. David Alan Gilbertif test "$live_block_migration" = "yes" ; then
3509ed1701c6SDr. David Alan Gilbert  echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
3510ed1701c6SDr. David Alan Gilbertfi
3511ed1701c6SDr. David Alan Gilbert
35123b8acc11SPaolo Bonziniif test "$tpm" = "yes"; then
35133cae16dbSPaolo Bonzini  echo 'CONFIG_TPM=y' >> $config_host_mak
35143b8acc11SPaolo Bonzinifi
35153b8acc11SPaolo Bonzini
35162da776dbSMichael R. Hinesif test "$rdma" = "yes" ; then
35172da776dbSMichael R. Hines  echo "CONFIG_RDMA=y" >> $config_host_mak
3518392fb643SFam Zheng  echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
35192da776dbSMichael R. Hinesfi
35202da776dbSMichael R. Hines
352121ab34c9SMarcel Apfelbaumif test "$pvrdma" = "yes" ; then
352221ab34c9SMarcel Apfelbaum  echo "CONFIG_PVRDMA=y" >> $config_host_mak
352321ab34c9SMarcel Apfelbaumfi
352421ab34c9SMarcel Apfelbaum
3525a6b1d4c0SChanglong Xieif test "$replication" = "yes" ; then
3526a6b1d4c0SChanglong Xie  echo "CONFIG_REPLICATION=y" >> $config_host_mak
3527a6b1d4c0SChanglong Xiefi
3528a6b1d4c0SChanglong Xie
3529ba59fb77SPaolo Bonziniif test "$debug_mutex" = "yes" ; then
3530ba59fb77SPaolo Bonzini  echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
3531ba59fb77SPaolo Bonzinifi
3532e0580342SKamil Rytarowski
35332f740136SJeff Codyif test "$bochs" = "yes" ; then
35342f740136SJeff Cody  echo "CONFIG_BOCHS=y" >> $config_host_mak
35352f740136SJeff Codyfi
35362f740136SJeff Codyif test "$cloop" = "yes" ; then
35372f740136SJeff Cody  echo "CONFIG_CLOOP=y" >> $config_host_mak
35382f740136SJeff Codyfi
35392f740136SJeff Codyif test "$dmg" = "yes" ; then
35402f740136SJeff Cody  echo "CONFIG_DMG=y" >> $config_host_mak
35412f740136SJeff Codyfi
35422f740136SJeff Codyif test "$qcow1" = "yes" ; then
35432f740136SJeff Cody  echo "CONFIG_QCOW1=y" >> $config_host_mak
35442f740136SJeff Codyfi
35452f740136SJeff Codyif test "$vdi" = "yes" ; then
35462f740136SJeff Cody  echo "CONFIG_VDI=y" >> $config_host_mak
35472f740136SJeff Codyfi
35482f740136SJeff Codyif test "$vvfat" = "yes" ; then
35492f740136SJeff Cody  echo "CONFIG_VVFAT=y" >> $config_host_mak
35502f740136SJeff Codyfi
35512f740136SJeff Codyif test "$qed" = "yes" ; then
35522f740136SJeff Cody  echo "CONFIG_QED=y" >> $config_host_mak
35532f740136SJeff Codyfi
35542f740136SJeff Codyif test "$parallels" = "yes" ; then
35552f740136SJeff Cody  echo "CONFIG_PARALLELS=y" >> $config_host_mak
35562f740136SJeff Codyfi
35572f740136SJeff Cody
355840e8c6f4SAlex Bennéeif test "$plugins" = "yes" ; then
355940e8c6f4SAlex Bennée    echo "CONFIG_PLUGIN=y" >> $config_host_mak
356040e8c6f4SAlex Bennéefi
356140e8c6f4SAlex Bennée
3562f48e590aSAlex Bennéeif test -n "$gdb_bin"; then
3563b1863cccSAlex Bennée    gdb_version=$($gdb_bin --version | head -n 1)
3564d6a66c81SAlex Bennée    if version_ge ${gdb_version##* } 9.1; then
3565f48e590aSAlex Bennée        echo "HAVE_GDB_BIN=$gdb_bin" >> $config_host_mak
3566f48e590aSAlex Bennée    fi
3567b1863cccSAlex Bennéefi
3568f48e590aSAlex Bennée
356954e7aac0SAlexey Krasikovif test "$secret_keyring" = "yes" ; then
357054e7aac0SAlexey Krasikov  echo "CONFIG_SECRET_KEYRING=y" >> $config_host_mak
357154e7aac0SAlexey Krasikovfi
357254e7aac0SAlexey Krasikov
357398ec69acSJuan Quintelaecho "ROMS=$roms" >> $config_host_mak
3574804edf29SJuan Quintelaecho "MAKE=$make" >> $config_host_mak
3575c886edfbSBlue Swirlecho "PYTHON=$python" >> $config_host_mak
357639d87c8cSAlex Bennéeecho "GENISOIMAGE=$genisoimage" >> $config_host_mak
3577a5665051SPaolo Bonziniecho "MESON=$meson" >> $config_host_mak
357809e93326SPaolo Bonziniecho "NINJA=$ninja" >> $config_host_mak
3579804edf29SJuan Quintelaecho "CC=$cc" >> $config_host_mak
3580433de74cSBastian Koppelmannecho "HOST_CC=$host_cc" >> $config_host_mak
3581a31a8642SMichael S. Tsirkinif $iasl -h > /dev/null 2>&1; then
3582859aef02SPaolo Bonzini  echo "CONFIG_IASL=$iasl" >> $config_host_mak
3583a31a8642SMichael S. Tsirkinfi
3584804edf29SJuan Quintelaecho "AR=$ar" >> $config_host_mak
3585cdbd727cSRichard Hendersonecho "AS=$as" >> $config_host_mak
35865f6f0e27SRichard Hendersonecho "CCAS=$ccas" >> $config_host_mak
35873dd46c78SBlue Swirlecho "CPP=$cpp" >> $config_host_mak
3588804edf29SJuan Quintelaecho "OBJCOPY=$objcopy" >> $config_host_mak
3589804edf29SJuan Quintelaecho "LD=$ld" >> $config_host_mak
359046eef33bSBradecho "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
3591a558ee17SJuan Quintelaecho "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
359211cde1c8SBruno Dominguezecho "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
3593a81df1b6SPaolo Bonziniecho "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
3594a81df1b6SPaolo Bonziniecho "GLIB_LIBS=$glib_libs" >> $config_host_mak
3595d83acfd0SMarc-André Lureauecho "GLIB_VERSION=$(pkg-config --modversion glib-2.0)" >> $config_host_mak
35968a99e9a3SPhilippe Mathieu-Daudéecho "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
3597e57218b6SPeter Maydellecho "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
3598804edf29SJuan Quintelaecho "EXESUF=$EXESUF" >> $config_host_mak
3599f15bff25SPaolo Bonziniecho "LIBS_QGA=$libs_qga" >> $config_host_mak
3600804edf29SJuan Quintela
3601b767d257SMarek Marczykowski-Góreckiif test "$rng_none" = "yes"; then
3602b767d257SMarek Marczykowski-Górecki  echo "CONFIG_RNG_NONE=y" >> $config_host_mak
3603b767d257SMarek Marczykowski-Góreckifi
3604b767d257SMarek Marczykowski-Górecki
36056efd7517SPeter Maydell# use included Linux headers
36066efd7517SPeter Maydellif test "$linux" = "yes" ; then
3607a307beb6SAndreas Färber  mkdir -p linux-headers
36086efd7517SPeter Maydell  case "$cpu" in
36094da270beSPaolo Bonzini  i386|x86_64)
361008312a63SPeter Maydell    linux_arch=x86
36116efd7517SPeter Maydell    ;;
3612d8ff892dSPaolo Bonzini  ppc|ppc64)
361308312a63SPeter Maydell    linux_arch=powerpc
36146efd7517SPeter Maydell    ;;
36156efd7517SPeter Maydell  s390x)
361608312a63SPeter Maydell    linux_arch=s390
361708312a63SPeter Maydell    ;;
36181f080313SClaudio Fontana  aarch64)
36191f080313SClaudio Fontana    linux_arch=arm64
36201f080313SClaudio Fontana    ;;
3621dfcf900bSWANG Xuerui  loongarch*)
3622dfcf900bSWANG Xuerui    linux_arch=loongarch
3623dfcf900bSWANG Xuerui    ;;
3624222e7d11SSanjay Lal  mips64)
3625222e7d11SSanjay Lal    linux_arch=mips
3626222e7d11SSanjay Lal    ;;
362708312a63SPeter Maydell  *)
362808312a63SPeter Maydell    # For most CPUs the kernel architecture name and QEMU CPU name match.
362908312a63SPeter Maydell    linux_arch="$cpu"
36306efd7517SPeter Maydell    ;;
36316efd7517SPeter Maydell  esac
363208312a63SPeter Maydell    # For non-KVM architectures we will not have asm headers
363308312a63SPeter Maydell    if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
363408312a63SPeter Maydell      symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
363508312a63SPeter Maydell    fi
36366efd7517SPeter Maydellfi
36376efd7517SPeter Maydell
363897a847bcSbellardfor target in $target_list; do
363997a847bcSbellard    target_dir="$target"
364057a93f16SPhilippe Mathieu-Daudé    target_name=$(echo $target | cut -d '-' -f 1)$EXESUF
364197a847bcSbellard    mkdir -p $target_dir
3642fdb75aefSPaolo Bonzini    case $target in
3643fdb75aefSPaolo Bonzini        *-user) symlink "../qemu-$target_name" "$target_dir/qemu-$target_name" ;;
3644fdb75aefSPaolo Bonzini        *) symlink "../qemu-system-$target_name" "$target_dir/qemu-system-$target_name" ;;
36452408a527Saurel32    esac
364656aebc89Spbrookdone
36477d13299dSbellard
3648765686d6SPaolo Bonziniecho "CONFIG_QEMU_INTERP_PREFIX=$interp_prefix" | sed 's/%M/@0@/' >> $config_host_mak
3649fdb75aefSPaolo Bonziniif test "$default_targets" = "yes"; then
3650fdb75aefSPaolo Bonzini  echo "CONFIG_DEFAULT_TARGETS=y" >> $config_host_mak
3651fdb75aefSPaolo Bonzinifi
3652a540f158SPeter Crosthwaite
3653a99d57bbSWanlong Gaoif test "$numa" = "yes"; then
3654a99d57bbSWanlong Gao  echo "CONFIG_NUMA=y" >> $config_host_mak
3655ab318051SMarc-André Lureau  echo "NUMA_LIBS=$numa_libs" >> $config_host_mak
3656a99d57bbSWanlong Gaofi
3657a99d57bbSWanlong Gao
3658fd0e6053SJohn Snowif test "$ccache_cpp2" = "yes"; then
3659fd0e6053SJohn Snow  echo "export CCACHE_CPP2=y" >> $config_host_mak
3660fd0e6053SJohn Snowfi
3661fd0e6053SJohn Snow
36621e4f6065SDaniele Buonoif test "$safe_stack" = "yes"; then
36631e4f6065SDaniele Buono  echo "CONFIG_SAFESTACK=y" >> $config_host_mak
36641e4f6065SDaniele Buonofi
36651e4f6065SDaniele Buono
3666e29e5c6eSPeter Maydell# If we're using a separate build tree, set it up now.
3667e29e5c6eSPeter Maydell# LINKS are things to symlink back into the source tree
3668e29e5c6eSPeter Maydell# (these can be both files and directories).
3669e29e5c6eSPeter Maydell# Caution: do not add files or directories here using wildcards. This
3670e29e5c6eSPeter Maydell# will result in problems later if a new file matching the wildcard is
3671e29e5c6eSPeter Maydell# added to the source tree -- nothing will cause configure to be rerun
3672e29e5c6eSPeter Maydell# so the build tree will be missing the link back to the new file, and
3673e29e5c6eSPeter Maydell# tests might fail. Prefer to keep the relevant files in their own
3674e29e5c6eSPeter Maydell# directory and symlink the directory instead.
367509db9b9dSGerd Hoffmann# UNLINK is used to remove symlinks from older development versions
367609db9b9dSGerd Hoffmann# that might get into the way when doing "git update" without doing
367709db9b9dSGerd Hoffmann# a "make distclean" in between.
36782038f8c8SPaolo BonziniLINKS="Makefile"
36793941996bSPaolo BonziniLINKS="$LINKS tests/tcg/Makefile.target"
3680ddcf607fSGerd HoffmannLINKS="$LINKS pc-bios/optionrom/Makefile"
3681e29e5c6eSPeter MaydellLINKS="$LINKS pc-bios/s390-ccw/Makefile"
36828db2a4fdSGerd HoffmannLINKS="$LINKS roms/seabios/Makefile"
3683e29e5c6eSPeter MaydellLINKS="$LINKS pc-bios/qemu-icon.bmp"
3684e29e5c6eSPeter MaydellLINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
3685bbbd9b6eSWillian RampazzoLINKS="$LINKS tests/avocado tests/data"
368639950353SPeter MaydellLINKS="$LINKS tests/qemu-iotests/check"
36878f8fd9edSCleber RosaLINKS="$LINKS python"
3688c17a386bSAlex BennéeLINKS="$LINKS contrib/plugins/Makefile "
368909db9b9dSGerd HoffmannUNLINK="pc-bios/keymaps"
3690753d11f2SRichard Hendersonfor bios_file in \
3691753d11f2SRichard Henderson    $source_path/pc-bios/*.bin \
36923a631b8eSBin Meng    $source_path/pc-bios/*.elf \
3693225a9ab8SAlexey Kardashevskiy    $source_path/pc-bios/*.lid \
3694753d11f2SRichard Henderson    $source_path/pc-bios/*.rom \
3695753d11f2SRichard Henderson    $source_path/pc-bios/*.dtb \
3696e89e33e1SDominik Dingel    $source_path/pc-bios/*.img \
3697753d11f2SRichard Henderson    $source_path/pc-bios/openbios-* \
36984e73c781SAlexander Graf    $source_path/pc-bios/u-boot.* \
3699cd946e5cSJohn Arbuckle    $source_path/pc-bios/palcode-* \
3700cd946e5cSJohn Arbuckle    $source_path/pc-bios/qemu_vga.ndrv
3701cd946e5cSJohn Arbuckle
3702753d11f2SRichard Hendersondo
3703e29e5c6eSPeter Maydell    LINKS="$LINKS pc-bios/$(basename $bios_file)"
37047ea78b74SJan Kiszkadone
3705e29e5c6eSPeter Maydellfor f in $LINKS ; do
37060f4d8894SPaolo Bonzini    if [ -e "$source_path/$f" ]; then
37075dce7b8dSPaolo Bonzini        mkdir -p `dirname ./$f`
3708f9245e10SPeter Maydell        symlink "$source_path/$f" "$f"
3709f9245e10SPeter Maydell    fi
37107d13299dSbellarddone
371109db9b9dSGerd Hoffmannfor f in $UNLINK ; do
371209db9b9dSGerd Hoffmann    if [ -L "$f" ]; then
371309db9b9dSGerd Hoffmann        rm -f "$f"
371409db9b9dSGerd Hoffmann    fi
371509db9b9dSGerd Hoffmanndone
37161ad2134fSPaul Brook
37172038f8c8SPaolo Bonzini(for i in $cross_cc_vars; do
37182038f8c8SPaolo Bonzini  export $i
37192038f8c8SPaolo Bonzinidone
3720fd0f79d7SRichard Hendersonexport target_list source_path use_containers cpu
37212038f8c8SPaolo Bonzini$source_path/tests/tcg/configure.sh)
37222038f8c8SPaolo Bonzini
3723c34ebfdcSAnthony Liguori# temporary config to build submodules
37248db2a4fdSGerd Hoffmannfor rom in seabios; do
3725c34ebfdcSAnthony Liguori    config_mak=roms/$rom/config.mak
372637116c89SStefan Weil    echo "# Automatically generated by configure - do not modify" > $config_mak
3727c34ebfdcSAnthony Liguori    echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
3728cdbd727cSRichard Henderson    echo "AS=$as" >> $config_mak
37295f6f0e27SRichard Henderson    echo "CCAS=$ccas" >> $config_mak
3730c34ebfdcSAnthony Liguori    echo "CC=$cc" >> $config_mak
3731c34ebfdcSAnthony Liguori    echo "BCC=bcc" >> $config_mak
37323dd46c78SBlue Swirl    echo "CPP=$cpp" >> $config_mak
3733c34ebfdcSAnthony Liguori    echo "OBJCOPY=objcopy" >> $config_mak
3734a31a8642SMichael S. Tsirkin    echo "IASL=$iasl" >> $config_mak
3735c34ebfdcSAnthony Liguori    echo "LD=$ld" >> $config_mak
37369f81aeb5SAlistair Francis    echo "RANLIB=$ranlib" >> $config_mak
3737c34ebfdcSAnthony Liguoridone
3738c34ebfdcSAnthony Liguori
373998409991SHelge Konetzkaconfig_mak=pc-bios/optionrom/config.mak
374098409991SHelge Konetzkaecho "# Automatically generated by configure - do not modify" > $config_mak
374198409991SHelge Konetzkaecho "TOPSRC_DIR=$source_path" >> $config_mak
374298409991SHelge Konetzka
3743a5665051SPaolo Bonziniif test "$skip_meson" = no; then
3744fc929892SMarc-André Lureau  cross="config-meson.cross.new"
3745fc929892SMarc-André Lureau  meson_quote() {
3746ac7ebcc5SPaolo Bonzini    test $# = 0 && return
374747b30835SPaolo Bonzini    echo "'$(echo $* | sed "s/ /','/g")'"
3748fc929892SMarc-André Lureau  }
3749fc929892SMarc-André Lureau
3750fc929892SMarc-André Lureau  echo "# Automatically generated by configure - do not modify" > $cross
3751fc929892SMarc-André Lureau  echo "[properties]" >> $cross
3752d1d5e9eeSAlex Bennée
3753d1d5e9eeSAlex Bennée  # unroll any custom device configs
3754d1d5e9eeSAlex Bennée  for a in $device_archs; do
3755d1d5e9eeSAlex Bennée      eval "c=\$devices_${a}"
3756d1d5e9eeSAlex Bennée      echo "${a}-softmmu = '$c'" >> $cross
3757d1d5e9eeSAlex Bennée  done
3758d1d5e9eeSAlex Bennée
3759fc929892SMarc-André Lureau  test -z "$cxx" && echo "link_language = 'c'" >> $cross
376047b30835SPaolo Bonzini  echo "[built-in options]" >> $cross
3761a2866660SPaolo Bonzini  echo "c_args = [$(meson_quote $CFLAGS $EXTRA_CFLAGS)]" >> $cross
3762a2866660SPaolo Bonzini  echo "cpp_args = [$(meson_quote $CXXFLAGS $EXTRA_CXXFLAGS)]" >> $cross
3763a2866660SPaolo Bonzini  echo "c_link_args = [$(meson_quote $CFLAGS $LDFLAGS $EXTRA_CFLAGS $EXTRA_LDFLAGS)]" >> $cross
3764a2866660SPaolo Bonzini  echo "cpp_link_args = [$(meson_quote $CXXFLAGS $LDFLAGS $EXTRA_CXXFLAGS $EXTRA_LDFLAGS)]" >> $cross
3765fc929892SMarc-André Lureau  echo "[binaries]" >> $cross
37664dba2789SPaolo Bonzini  echo "c = [$(meson_quote $cc $CPU_CFLAGS)]" >> $cross
37674dba2789SPaolo Bonzini  test -n "$cxx" && echo "cpp = [$(meson_quote $cxx $CPU_CFLAGS)]" >> $cross
37684dba2789SPaolo Bonzini  test -n "$objcc" && echo "objc = [$(meson_quote $objcc $CPU_CFLAGS)]" >> $cross
376947b30835SPaolo Bonzini  echo "ar = [$(meson_quote $ar)]" >> $cross
377047b30835SPaolo Bonzini  echo "nm = [$(meson_quote $nm)]" >> $cross
377147b30835SPaolo Bonzini  echo "pkgconfig = [$(meson_quote $pkg_config_exe)]" >> $cross
377247b30835SPaolo Bonzini  echo "ranlib = [$(meson_quote $ranlib)]" >> $cross
3773e8178514SPaolo Bonzini  if has $sdl2_config; then
377447b30835SPaolo Bonzini    echo "sdl2-config = [$(meson_quote $sdl2_config)]" >> $cross
3775e8178514SPaolo Bonzini  fi
377647b30835SPaolo Bonzini  echo "strip = [$(meson_quote $strip)]" >> $cross
377747b30835SPaolo Bonzini  echo "windres = [$(meson_quote $windres)]" >> $cross
37783812c0c4SJoelle van Dyne  if test "$cross_compile" = "yes"; then
3779fc929892SMarc-André Lureau    cross_arg="--cross-file config-meson.cross"
3780fc929892SMarc-André Lureau    echo "[host_machine]" >> $cross
3781ba7c60c2SPaolo Bonzini    echo "system = '$targetos'" >> $cross
3782823eb013SPaolo Bonzini    case "$cpu" in
3783f6bca9dfSJoelle van Dyne        i386)
3784fc929892SMarc-André Lureau            echo "cpu_family = 'x86'" >> $cross
3785fc929892SMarc-André Lureau            ;;
3786fc929892SMarc-André Lureau        *)
3787823eb013SPaolo Bonzini            echo "cpu_family = '$cpu'" >> $cross
3788fc929892SMarc-André Lureau            ;;
3789fc929892SMarc-André Lureau    esac
3790fc929892SMarc-André Lureau    echo "cpu = '$cpu'" >> $cross
3791fc929892SMarc-André Lureau    if test "$bigendian" = "yes" ; then
3792fc929892SMarc-André Lureau        echo "endian = 'big'" >> $cross
3793fc929892SMarc-André Lureau    else
3794fc929892SMarc-André Lureau        echo "endian = 'little'" >> $cross
3795fc929892SMarc-André Lureau    fi
3796fc929892SMarc-André Lureau  else
3797fc929892SMarc-André Lureau    cross_arg="--native-file config-meson.cross"
3798fc929892SMarc-André Lureau  fi
3799fc929892SMarc-André Lureau  mv $cross config-meson.cross
3800fc929892SMarc-André Lureau
3801a5665051SPaolo Bonzini  rm -rf meson-private meson-info meson-logs
380261d63097SPaolo Bonzini  run_meson() {
380309e93326SPaolo Bonzini    NINJA=$ninja $meson setup \
3804d17f305aSPaolo Bonzini        --prefix "$prefix" \
3805d17f305aSPaolo Bonzini        --libdir "$libdir" \
3806d17f305aSPaolo Bonzini        --libexecdir "$libexecdir" \
3807d17f305aSPaolo Bonzini        --bindir "$bindir" \
3808d17f305aSPaolo Bonzini        --includedir "$includedir" \
3809d17f305aSPaolo Bonzini        --datadir "$datadir" \
3810d17f305aSPaolo Bonzini        --mandir "$mandir" \
3811d17f305aSPaolo Bonzini        --sysconfdir "$sysconfdir" \
381216bf7a33SPaolo Bonzini        --localedir "$localedir" \
3813d17f305aSPaolo Bonzini        --localstatedir "$local_statedir" \
38143b4da132SPaolo Bonzini        -Daudio_drv_list=$audio_drv_list \
38153b4da132SPaolo Bonzini        -Ddefault_devices=$default_devices \
3816d17f305aSPaolo Bonzini        -Ddocdir="$docdir" \
381716bf7a33SPaolo Bonzini        -Dqemu_firmwarepath="$firmwarepath" \
381873f3aa37SMarc-André Lureau        -Dqemu_suffix="$qemu_suffix" \
38193b4da132SPaolo Bonzini        -Dsphinx_build="$sphinx_build" \
38203b4da132SPaolo Bonzini        -Dtrace_file="$trace_file" \
3821a5665051SPaolo Bonzini        -Doptimization=$(if test "$debug" = yes; then echo 0; else echo 2; fi) \
3822a5665051SPaolo Bonzini        -Ddebug=$(if test "$debug_info" = yes; then echo true; else echo false; fi) \
3823a5665051SPaolo Bonzini        -Dwerror=$(if test "$werror" = yes; then echo true; else echo false; fi) \
3824a5665051SPaolo Bonzini        -Dstrip=$(if test "$strip_opt" = yes; then echo true; else echo false; fi) \
3825da6d48b9SMarc-André Lureau        -Db_pie=$(if test "$pie" = yes; then echo true; else echo false; fi) \
3826bf0e56a3SMarc-André Lureau        -Db_coverage=$(if test "$gcov" = yes; then echo true; else echo false; fi) \
38273b4da132SPaolo Bonzini        -Db_lto=$lto -Dcfi=$cfi -Dtcg=$tcg -Dxen=$xen \
38283b4da132SPaolo Bonzini        -Dcapstone=$capstone -Dfdt=$fdt -Dslirp=$slirp \
3829537b7248SPaolo Bonzini        $(test -n "${LIB_FUZZING_ENGINE+xxx}" && echo "-Dfuzzing_engine=$LIB_FUZZING_ENGINE") \
3830332008e0SThomas Huth        $(if test "$default_feature" = no; then echo "-Dauto_features=disabled"; fi) \
383161d63097SPaolo Bonzini        "$@" $cross_arg "$PWD" "$source_path"
383261d63097SPaolo Bonzini  }
383361d63097SPaolo Bonzini  eval run_meson $meson_options
3834a5665051SPaolo Bonzini  if test "$?" -ne 0 ; then
3835a5665051SPaolo Bonzini      error_exit "meson setup failed"
3836a5665051SPaolo Bonzini  fi
3837699d3884SPaolo Bonzinielse
3838699d3884SPaolo Bonzini  if test -f meson-private/cmd_line.txt; then
3839699d3884SPaolo Bonzini    # Adjust old command line options whose type was changed
3840699d3884SPaolo Bonzini    # Avoids having to use "setup --wipe" when Meson is upgraded
3841699d3884SPaolo Bonzini    perl -i -ne '
3842699d3884SPaolo Bonzini      s/^gettext = true$/gettext = auto/;
3843699d3884SPaolo Bonzini      s/^gettext = false$/gettext = disabled/;
3844654d6b04SPaolo Bonzini      /^b_staticpic/ && next;
3845699d3884SPaolo Bonzini      print;' meson-private/cmd_line.txt
3846699d3884SPaolo Bonzini  fi
3847a5665051SPaolo Bonzinifi
3848a5665051SPaolo Bonzini
38492d838d9bSAlex Bennéeif test -n "${deprecated_features}"; then
38502d838d9bSAlex Bennée    echo "Warning, deprecated features enabled."
3851a476b216SMao Zhongyi    echo "Please see docs/about/deprecated.rst"
38522d838d9bSAlex Bennée    echo "  features: ${deprecated_features}"
38532d838d9bSAlex Bennéefi
38542d838d9bSAlex Bennée
3855e0447a83SThomas Huth# Create list of config switches that should be poisoned in common code...
3856e0447a83SThomas Huth# but filter out CONFIG_TCG and CONFIG_USER_ONLY which are special.
385754b0306eSThomas Huthtarget_configs_h=$(ls *-config-devices.h *-config-target.h 2>/dev/null)
385854b0306eSThomas Huthif test -n "$target_configs_h" ; then
3859e0447a83SThomas Huth    sed -n -e '/CONFIG_TCG/d' -e '/CONFIG_USER_ONLY/d' \
3860e0447a83SThomas Huth        -e '/^#define / { s///; s/ .*//; s/^/#pragma GCC poison /p; }' \
386154b0306eSThomas Huth        $target_configs_h | sort -u > config-poison.h
386254b0306eSThomas Huthelse
386354b0306eSThomas Huth    :> config-poison.h
386454b0306eSThomas Huthfi
3865e0447a83SThomas Huth
3866dc655404SMichael S. Tsirkin# Save the configure command line for later reuse.
3867dc655404SMichael S. Tsirkincat <<EOD >config.status
3868dc655404SMichael S. Tsirkin#!/bin/sh
3869dc655404SMichael S. Tsirkin# Generated by configure.
3870dc655404SMichael S. Tsirkin# Run this file to recreate the current configuration.
3871dc655404SMichael S. Tsirkin# Compiler output produced by configure, useful for debugging
3872dc655404SMichael S. Tsirkin# configure, is in config.log if it exists.
3873dc655404SMichael S. TsirkinEOD
3874e811da7fSDaniel P. Berrangé
3875e811da7fSDaniel P. Berrangépreserve_env() {
3876e811da7fSDaniel P. Berrangé    envname=$1
3877e811da7fSDaniel P. Berrangé
3878e811da7fSDaniel P. Berrangé    eval envval=\$$envname
3879e811da7fSDaniel P. Berrangé
3880e811da7fSDaniel P. Berrangé    if test -n "$envval"
3881e811da7fSDaniel P. Berrangé    then
3882e811da7fSDaniel P. Berrangé	echo "$envname='$envval'" >> config.status
3883e811da7fSDaniel P. Berrangé	echo "export $envname" >> config.status
3884e811da7fSDaniel P. Berrangé    else
3885e811da7fSDaniel P. Berrangé	echo "unset $envname" >> config.status
3886e811da7fSDaniel P. Berrangé    fi
3887e811da7fSDaniel P. Berrangé}
3888e811da7fSDaniel P. Berrangé
3889e811da7fSDaniel P. Berrangé# Preserve various env variables that influence what
3890e811da7fSDaniel P. Berrangé# features/build target configure will detect
3891e811da7fSDaniel P. Berrangépreserve_env AR
3892e811da7fSDaniel P. Berrangépreserve_env AS
3893e811da7fSDaniel P. Berrangépreserve_env CC
3894e811da7fSDaniel P. Berrangépreserve_env CPP
38958009da03SPaolo Bonzinipreserve_env CFLAGS
3896e811da7fSDaniel P. Berrangépreserve_env CXX
38978009da03SPaolo Bonzinipreserve_env CXXFLAGS
3898e811da7fSDaniel P. Berrangépreserve_env INSTALL
3899e811da7fSDaniel P. Berrangépreserve_env LD
39008009da03SPaolo Bonzinipreserve_env LDFLAGS
3901e811da7fSDaniel P. Berrangépreserve_env LD_LIBRARY_PATH
3902e811da7fSDaniel P. Berrangépreserve_env LIBTOOL
3903e811da7fSDaniel P. Berrangépreserve_env MAKE
3904e811da7fSDaniel P. Berrangépreserve_env NM
3905e811da7fSDaniel P. Berrangépreserve_env OBJCOPY
3906e811da7fSDaniel P. Berrangépreserve_env PATH
3907e811da7fSDaniel P. Berrangépreserve_env PKG_CONFIG
3908e811da7fSDaniel P. Berrangépreserve_env PKG_CONFIG_LIBDIR
3909e811da7fSDaniel P. Berrangépreserve_env PKG_CONFIG_PATH
3910e811da7fSDaniel P. Berrangépreserve_env PYTHON
3911e811da7fSDaniel P. Berrangépreserve_env SDL2_CONFIG
3912e811da7fSDaniel P. Berrangépreserve_env SMBD
3913e811da7fSDaniel P. Berrangépreserve_env STRIP
3914e811da7fSDaniel P. Berrangépreserve_env WINDRES
3915e811da7fSDaniel P. Berrangé
3916dc655404SMichael S. Tsirkinprintf "exec" >>config.status
3917a5665051SPaolo Bonzinifor i in "$0" "$@"; do
3918835af899SPaolo Bonzini  test "$i" = --skip-meson || printf " %s" "$(quote_sh "$i")" >>config.status
3919a5665051SPaolo Bonzinidone
3920cf7cc929SDr. David Alan Gilbertecho ' "$@"' >>config.status
3921dc655404SMichael S. Tsirkinchmod +x config.status
3922dc655404SMichael S. Tsirkin
39238cd05ab6SPeter Maydellrm -r "$TMPDIR1"
3924