]> git.proxmox.com Git - mirror_qemu.git/blame_incremental - configure
configure: simplify creation of plugin symbol list
[mirror_qemu.git] / configure
... / ...
CommitLineData
1#!/bin/sh
2#
3# qemu configure script (c) 2003 Fabrice Bellard
4#
5
6# Unset some variables known to interfere with behavior of common tools,
7# just as autoconf does.
8CLICOLOR_FORCE= GREP_OPTIONS=
9unset CLICOLOR_FORCE GREP_OPTIONS
10
11# Don't allow CCACHE, if present, to use cached results of compile tests!
12export CCACHE_RECACHE=yes
13
14# make source path absolute
15source_path=$(cd "$(dirname -- "$0")"; pwd)
16
17if test "$PWD" = "$source_path"
18then
19 echo "Using './build' as the directory for build output"
20
21 MARKER=build/auto-created-by-configure
22
23 if test -e build
24 then
25 if test -f $MARKER
26 then
27 rm -rf build
28 else
29 echo "ERROR: ./build dir already exists and was not previously created by configure"
30 exit 1
31 fi
32 fi
33
34 mkdir build
35 touch $MARKER
36
37 cat > GNUmakefile <<'EOF'
38# This file is auto-generated by configure to support in-source tree
39# 'make' command invocation
40
41ifeq ($(MAKECMDGOALS),)
42recurse: all
43endif
44
45.NOTPARALLEL: %
46%: force
47 @echo 'changing dir to build for $(MAKE) "$(MAKECMDGOALS)"...'
48 @$(MAKE) -C build -f Makefile $(MAKECMDGOALS)
49 @if test "$(MAKECMDGOALS)" = "distclean" && \
50 test -e build/auto-created-by-configure ; \
51 then \
52 rm -rf build GNUmakefile ; \
53 fi
54force: ;
55.PHONY: force
56GNUmakefile: ;
57
58EOF
59 cd build
60 exec $source_path/configure "$@"
61fi
62
63# Temporary directory used for files created while
64# configure runs. Since it is in the build directory
65# we can safely blow away any previous version of it
66# (and we need not jump through hoops to try to delete
67# it when configure exits.)
68TMPDIR1="config-temp"
69rm -rf "${TMPDIR1}"
70mkdir -p "${TMPDIR1}"
71if [ $? -ne 0 ]; then
72 echo "ERROR: failed to create temporary directory"
73 exit 1
74fi
75
76TMPB="qemu-conf"
77TMPC="${TMPDIR1}/${TMPB}.c"
78TMPO="${TMPDIR1}/${TMPB}.o"
79TMPCXX="${TMPDIR1}/${TMPB}.cxx"
80TMPE="${TMPDIR1}/${TMPB}.exe"
81
82rm -f config.log
83
84# Print a helpful header at the top of config.log
85echo "# QEMU configure log $(date)" >> config.log
86printf "# Configured with:" >> config.log
87printf " '%s'" "$0" "$@" >> config.log
88echo >> config.log
89echo "#" >> config.log
90
91quote_sh() {
92 printf "%s" "$1" | sed "s,','\\\\'',g; s,.*,'&',"
93}
94
95print_error() {
96 (echo
97 echo "ERROR: $1"
98 while test -n "$2"; do
99 echo " $2"
100 shift
101 done
102 echo) >&2
103}
104
105error_exit() {
106 print_error "$@"
107 exit 1
108}
109
110do_compiler() {
111 # Run the compiler, capturing its output to the log. First argument
112 # is compiler binary to execute.
113 compiler="$1"
114 shift
115 if test -n "$BASH_VERSION"; then eval '
116 echo >>config.log "
117funcs: ${FUNCNAME[*]}
118lines: ${BASH_LINENO[*]}"
119 '; fi
120 echo $compiler "$@" >> config.log
121 $compiler "$@" >> config.log 2>&1 || return $?
122 # Test passed. If this is an --enable-werror build, rerun
123 # the test with -Werror and bail out if it fails. This
124 # makes warning-generating-errors in configure test code
125 # obvious to developers.
126 if test "$werror" != "yes"; then
127 return 0
128 fi
129 # Don't bother rerunning the compile if we were already using -Werror
130 case "$*" in
131 *-Werror*)
132 return 0
133 ;;
134 esac
135 echo $compiler -Werror "$@" >> config.log
136 $compiler -Werror "$@" >> config.log 2>&1 && return $?
137 error_exit "configure test passed without -Werror but failed with -Werror." \
138 "This is probably a bug in the configure script. The failing command" \
139 "will be at the bottom of config.log." \
140 "You can run configure with --disable-werror to bypass this check."
141}
142
143do_cc() {
144 do_compiler "$cc" $CPU_CFLAGS "$@"
145}
146
147do_cxx() {
148 do_compiler "$cxx" $CPU_CFLAGS "$@"
149}
150
151# Append $2 to the variable named $1, with space separation
152add_to() {
153 eval $1=\${$1:+\"\$$1 \"}\$2
154}
155
156update_cxxflags() {
157 # Set QEMU_CXXFLAGS from QEMU_CFLAGS by filtering out those
158 # options which some versions of GCC's C++ compiler complain about
159 # because they only make sense for C programs.
160 QEMU_CXXFLAGS="-D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"
161 CONFIGURE_CXXFLAGS=$(echo "$CONFIGURE_CFLAGS" | sed s/-std=gnu11/-std=gnu++11/)
162 for arg in $QEMU_CFLAGS; do
163 case $arg in
164 -Wstrict-prototypes|-Wmissing-prototypes|-Wnested-externs|\
165 -Wold-style-declaration|-Wold-style-definition|-Wredundant-decls)
166 ;;
167 *)
168 QEMU_CXXFLAGS=${QEMU_CXXFLAGS:+$QEMU_CXXFLAGS }$arg
169 ;;
170 esac
171 done
172}
173
174compile_object() {
175 local_cflags="$1"
176 do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
177}
178
179compile_prog() {
180 local_cflags="$1"
181 local_ldflags="$2"
182 do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC \
183 $LDFLAGS $EXTRA_LDFLAGS $CONFIGURE_LDFLAGS $QEMU_LDFLAGS $local_ldflags
184}
185
186# symbolically link $1 to $2. Portable version of "ln -sf".
187symlink() {
188 rm -rf "$2"
189 mkdir -p "$(dirname "$2")"
190 ln -s "$1" "$2"
191}
192
193# check whether a command is available to this shell (may be either an
194# executable or a builtin)
195has() {
196 type "$1" >/dev/null 2>&1
197}
198
199version_ge () {
200 local_ver1=$(expr "$1" : '\([0-9.]*\)' | tr . ' ')
201 local_ver2=$(echo "$2" | tr . ' ')
202 while true; do
203 set x $local_ver1
204 local_first=${2-0}
205 # 'shift 2' if $2 is set, or 'shift' if $2 is not set
206 shift ${2:+2}
207 local_ver1=$*
208 set x $local_ver2
209 # the second argument finished, the first must be greater or equal
210 test $# = 1 && return 0
211 test $local_first -lt $2 && return 1
212 test $local_first -gt $2 && return 0
213 shift ${2:+2}
214 local_ver2=$*
215 done
216}
217
218glob() {
219 eval test -z '"${1#'"$2"'}"'
220}
221
222ld_has() {
223 $ld --help 2>/dev/null | grep ".$1" >/dev/null 2>&1
224}
225
226if printf %s\\n "$source_path" "$PWD" | grep -q "[[:space:]:]";
227then
228 error_exit "main directory cannot contain spaces nor colons"
229fi
230
231# default parameters
232cpu=""
233iasl="iasl"
234interp_prefix="/usr/gnemul/qemu-%M"
235static="no"
236cross_compile="no"
237cross_prefix=""
238audio_drv_list="default"
239block_drv_rw_whitelist=""
240block_drv_ro_whitelist=""
241block_drv_whitelist_tools="no"
242host_cc="cc"
243libs_qga=""
244debug_info="yes"
245lto="false"
246stack_protector=""
247safe_stack=""
248use_containers="yes"
249gdb_bin=$(command -v "gdb-multiarch" || command -v "gdb")
250
251if test -e "$source_path/.git"
252then
253 git_submodules_action="update"
254else
255 git_submodules_action="ignore"
256fi
257
258git_submodules="ui/keycodemapdb"
259git="git"
260
261# Don't accept a target_list environment variable.
262unset target_list
263unset target_list_exclude
264
265# Default value for a variable defining feature "foo".
266# * foo="no" feature will only be used if --enable-foo arg is given
267# * foo="" feature will be searched for, and if found, will be used
268# unless --disable-foo is given
269# * foo="yes" this value will only be set by --enable-foo flag.
270# feature will searched for,
271# if not found, configure exits with error
272#
273# Always add --enable-foo and --disable-foo command line args.
274# Distributions want to ensure that several features are compiled in, and it
275# is impossible without a --enable-foo that exits if a feature is not found.
276
277default_feature=""
278# parse CC options second
279for opt do
280 optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
281 case "$opt" in
282 --without-default-features)
283 default_feature="no"
284 ;;
285 esac
286done
287
288EXTRA_CFLAGS=""
289EXTRA_CXXFLAGS=""
290EXTRA_LDFLAGS=""
291
292xen_ctrl_version="$default_feature"
293membarrier="$default_feature"
294vhost_kernel="$default_feature"
295vhost_net="$default_feature"
296vhost_crypto="$default_feature"
297vhost_scsi="$default_feature"
298vhost_vsock="$default_feature"
299vhost_user="no"
300vhost_user_fs="$default_feature"
301vhost_vdpa="$default_feature"
302rdma="$default_feature"
303pvrdma="$default_feature"
304gprof="no"
305debug_tcg="no"
306debug="no"
307sanitizers="no"
308tsan="no"
309fortify_source="$default_feature"
310strip_opt="yes"
311mingw32="no"
312gcov="no"
313EXESUF=""
314modules="no"
315module_upgrades="no"
316prefix="/usr/local"
317qemu_suffix="qemu"
318bsd="no"
319linux="no"
320solaris="no"
321profiler="no"
322softmmu="yes"
323linux_user="no"
324bsd_user="no"
325pkgversion=""
326pie=""
327qom_cast_debug="yes"
328trace_backends="log"
329trace_file="trace"
330opengl="$default_feature"
331cpuid_h="no"
332avx2_opt="$default_feature"
333guest_agent="$default_feature"
334guest_agent_with_vss="no"
335guest_agent_ntddscsi="no"
336vss_win32_sdk="$default_feature"
337win_sdk="no"
338want_tools="$default_feature"
339coroutine=""
340coroutine_pool="$default_feature"
341debug_stack_usage="no"
342crypto_afalg="no"
343tls_priority="NORMAL"
344tpm="$default_feature"
345live_block_migration=${default_feature:-yes}
346numa="$default_feature"
347replication=${default_feature:-yes}
348bochs=${default_feature:-yes}
349cloop=${default_feature:-yes}
350dmg=${default_feature:-yes}
351qcow1=${default_feature:-yes}
352vdi=${default_feature:-yes}
353vvfat=${default_feature:-yes}
354qed=${default_feature:-yes}
355parallels=${default_feature:-yes}
356debug_mutex="no"
357plugins="$default_feature"
358rng_none="no"
359secret_keyring="$default_feature"
360meson=""
361meson_args=""
362ninja=""
363gio="$default_feature"
364skip_meson=no
365slirp_smbd="$default_feature"
366
367# The following Meson options are handled manually (still they
368# are included in the automatically generated help message)
369
370# 1. Track which submodules are needed
371capstone="auto"
372fdt="auto"
373slirp="auto"
374
375# 2. Support --with/--without option
376default_devices="true"
377
378# 3. Automatically enable/disable other options
379tcg="enabled"
380cfi="false"
381
382# 4. Detection partly done in configure
383xen=${default_feature:+disabled}
384
385# parse CC options second
386for opt do
387 optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
388 case "$opt" in
389 --cross-prefix=*) cross_prefix="$optarg"
390 cross_compile="yes"
391 ;;
392 --cc=*) CC="$optarg"
393 ;;
394 --cxx=*) CXX="$optarg"
395 ;;
396 --cpu=*) cpu="$optarg"
397 ;;
398 --extra-cflags=*)
399 EXTRA_CFLAGS="$EXTRA_CFLAGS $optarg"
400 EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS $optarg"
401 ;;
402 --extra-cxxflags=*) EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS $optarg"
403 ;;
404 --extra-ldflags=*) EXTRA_LDFLAGS="$EXTRA_LDFLAGS $optarg"
405 ;;
406 --enable-debug-info) debug_info="yes"
407 ;;
408 --disable-debug-info) debug_info="no"
409 ;;
410 --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"
411 ;;
412 --cross-cc-cflags-*) cc_arch=${opt#--cross-cc-flags-}; cc_arch=${cc_arch%%=*}
413 eval "cross_cc_cflags_${cc_arch}=\$optarg"
414 cross_cc_vars="$cross_cc_vars cross_cc_cflags_${cc_arch}"
415 ;;
416 --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}
417 cc_archs="$cc_archs $cc_arch"
418 eval "cross_cc_${cc_arch}=\$optarg"
419 cross_cc_vars="$cross_cc_vars cross_cc_${cc_arch}"
420 ;;
421 esac
422done
423# OS specific
424# Using uname is really, really broken. Once we have the right set of checks
425# we can eliminate its usage altogether.
426
427# Preferred compiler:
428# ${CC} (if set)
429# ${cross_prefix}gcc (if cross-prefix specified)
430# system compiler
431if test -z "${CC}${cross_prefix}"; then
432 cc="$host_cc"
433else
434 cc="${CC-${cross_prefix}gcc}"
435fi
436
437if test -z "${CXX}${cross_prefix}"; then
438 cxx="c++"
439else
440 cxx="${CXX-${cross_prefix}g++}"
441fi
442
443ar="${AR-${cross_prefix}ar}"
444as="${AS-${cross_prefix}as}"
445ccas="${CCAS-$cc}"
446cpp="${CPP-$cc -E}"
447objcopy="${OBJCOPY-${cross_prefix}objcopy}"
448ld="${LD-${cross_prefix}ld}"
449ranlib="${RANLIB-${cross_prefix}ranlib}"
450nm="${NM-${cross_prefix}nm}"
451strip="${STRIP-${cross_prefix}strip}"
452windres="${WINDRES-${cross_prefix}windres}"
453pkg_config_exe="${PKG_CONFIG-${cross_prefix}pkg-config}"
454query_pkg_config() {
455 "${pkg_config_exe}" ${QEMU_PKG_CONFIG_FLAGS} "$@"
456}
457pkg_config=query_pkg_config
458sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
459
460# default flags for all hosts
461# We use -fwrapv to tell the compiler that we require a C dialect where
462# left shift of signed integers is well defined and has the expected
463# 2s-complement style results. (Both clang and gcc agree that it
464# provides these semantics.)
465QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv"
466QEMU_CFLAGS="-Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS"
467QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS"
468QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
469
470QEMU_LDFLAGS=
471
472# Flags that are needed during configure but later taken care of by Meson
473CONFIGURE_CFLAGS="-std=gnu11 -Wall"
474CONFIGURE_LDFLAGS=
475
476
477check_define() {
478cat > $TMPC <<EOF
479#if !defined($1)
480#error $1 not defined
481#endif
482int main(void) { return 0; }
483EOF
484 compile_object
485}
486
487check_include() {
488cat > $TMPC <<EOF
489#include <$1>
490int main(void) { return 0; }
491EOF
492 compile_object
493}
494
495write_c_skeleton() {
496 cat > $TMPC <<EOF
497int main(void) { return 0; }
498EOF
499}
500
501if check_define __linux__ ; then
502 targetos=linux
503elif check_define _WIN32 ; then
504 targetos=windows
505elif check_define __OpenBSD__ ; then
506 targetos=openbsd
507elif check_define __sun__ ; then
508 targetos=sunos
509elif check_define __HAIKU__ ; then
510 targetos=haiku
511elif check_define __FreeBSD__ ; then
512 targetos=freebsd
513elif check_define __FreeBSD_kernel__ && check_define __GLIBC__; then
514 targetos=gnu/kfreebsd
515elif check_define __DragonFly__ ; then
516 targetos=dragonfly
517elif check_define __NetBSD__; then
518 targetos=netbsd
519elif check_define __APPLE__; then
520 targetos=darwin
521else
522 # This is a fatal error, but don't report it yet, because we
523 # might be going to just print the --help text, or it might
524 # be the result of a missing compiler.
525 targetos=bogus
526fi
527
528# OS specific
529
530case $targetos in
531windows)
532 mingw32="yes"
533 plugins="no"
534 pie="no"
535;;
536gnu/kfreebsd)
537 bsd="yes"
538;;
539freebsd)
540 bsd="yes"
541 bsd_user="yes"
542 make="${MAKE-gmake}"
543 # needed for kinfo_getvmmap(3) in libutil.h
544;;
545dragonfly)
546 bsd="yes"
547 make="${MAKE-gmake}"
548;;
549netbsd)
550 bsd="yes"
551 make="${MAKE-gmake}"
552;;
553openbsd)
554 bsd="yes"
555 make="${MAKE-gmake}"
556;;
557darwin)
558 bsd="yes"
559 darwin="yes"
560 # Disable attempts to use ObjectiveC features in os/object.h since they
561 # won't work when we're compiling with gcc as a C compiler.
562 QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS"
563;;
564sunos)
565 solaris="yes"
566 make="${MAKE-gmake}"
567 smbd="${SMBD-/usr/sfw/sbin/smbd}"
568# needed for CMSG_ macros in sys/socket.h
569 QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS"
570# needed for TIOCWIN* defines in termios.h
571 QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
572 # $(uname -m) returns i86pc even on an x86_64 box, so default based on isainfo
573 # Note that this check is broken for cross-compilation: if you're
574 # cross-compiling to one of these OSes then you'll need to specify
575 # the correct CPU with the --cpu option.
576 if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then
577 cpu="x86_64"
578 fi
579;;
580haiku)
581 pie="no"
582 QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS -D_BSD_SOURCE -fPIC $QEMU_CFLAGS"
583;;
584linux)
585 linux="yes"
586 linux_user="yes"
587 vhost_user=${default_feature:-yes}
588;;
589esac
590
591if test ! -z "$cpu" ; then
592 # command line argument
593 :
594elif check_define __i386__ ; then
595 cpu="i386"
596elif check_define __x86_64__ ; then
597 if check_define __ILP32__ ; then
598 cpu="x32"
599 else
600 cpu="x86_64"
601 fi
602elif check_define __sparc__ ; then
603 if check_define __arch64__ ; then
604 cpu="sparc64"
605 else
606 cpu="sparc"
607 fi
608elif check_define _ARCH_PPC ; then
609 if check_define _ARCH_PPC64 ; then
610 if check_define _LITTLE_ENDIAN ; then
611 cpu="ppc64le"
612 else
613 cpu="ppc64"
614 fi
615 else
616 cpu="ppc"
617 fi
618elif check_define __mips__ ; then
619 cpu="mips"
620elif check_define __s390__ ; then
621 if check_define __s390x__ ; then
622 cpu="s390x"
623 else
624 cpu="s390"
625 fi
626elif check_define __riscv ; then
627 cpu="riscv"
628elif check_define __arm__ ; then
629 cpu="arm"
630elif check_define __aarch64__ ; then
631 cpu="aarch64"
632elif check_define __loongarch64 ; then
633 cpu="loongarch64"
634else
635 cpu=$(uname -m)
636fi
637
638# Normalise host CPU name, set multilib cflags
639# Note that this case should only have supported host CPUs, not guests.
640case "$cpu" in
641 armv*b|armv*l|arm)
642 cpu="arm" ;;
643
644 i386|i486|i586|i686|i86pc|BePC)
645 cpu="i386"
646 CPU_CFLAGS="-m32" ;;
647 x32)
648 cpu="x86_64"
649 CPU_CFLAGS="-mx32" ;;
650 x86_64|amd64)
651 cpu="x86_64"
652 # ??? Only extremely old AMD cpus do not have cmpxchg16b.
653 # If we truly care, we should simply detect this case at
654 # runtime and generate the fallback to serial emulation.
655 CPU_CFLAGS="-m64 -mcx16" ;;
656
657 mips*)
658 cpu="mips" ;;
659
660 ppc)
661 CPU_CFLAGS="-m32" ;;
662 ppc64)
663 CPU_CFLAGS="-m64 -mbig" ;;
664 ppc64le)
665 cpu="ppc64"
666 CPU_CFLAGS="-m64 -mlittle" ;;
667
668 s390)
669 CPU_CFLAGS="-m31" ;;
670 s390x)
671 CPU_CFLAGS="-m64" ;;
672
673 sparc|sun4[cdmuv])
674 cpu="sparc"
675 CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc" ;;
676 sparc64)
677 CPU_CFLAGS="-m64 -mcpu=ultrasparc" ;;
678esac
679
680: ${make=${MAKE-make}}
681
682# We prefer python 3.x. A bare 'python' is traditionally
683# python 2.x, but some distros have it as python 3.x, so
684# we check that too
685python=
686explicit_python=no
687for binary in "${PYTHON-python3}" python
688do
689 if has "$binary"
690 then
691 python=$(command -v "$binary")
692 break
693 fi
694done
695
696
697# Check for ancillary tools used in testing
698genisoimage=
699for binary in genisoimage mkisofs
700do
701 if has $binary
702 then
703 genisoimage=$(command -v "$binary")
704 break
705 fi
706done
707
708# Default objcc to clang if available, otherwise use CC
709if has clang; then
710 objcc=clang
711else
712 objcc="$cc"
713fi
714
715if test "$mingw32" = "yes" ; then
716 EXESUF=".exe"
717 # MinGW needs -mthreads for TLS and macro _MT.
718 CONFIGURE_CFLAGS="-mthreads $CONFIGURE_CFLAGS"
719 write_c_skeleton;
720 prefix="/qemu"
721 qemu_suffix=""
722 libs_qga="-lws2_32 -lwinmm -lpowrprof -lwtsapi32 -lwininet -liphlpapi -lnetapi32 $libs_qga"
723fi
724
725werror=""
726
727. $source_path/scripts/meson-buildoptions.sh
728
729meson_options=
730meson_option_parse() {
731 meson_options="$meson_options $(_meson_option_parse "$@")"
732 if test $? -eq 1; then
733 echo "ERROR: unknown option $1"
734 echo "Try '$0 --help' for more information"
735 exit 1
736 fi
737}
738
739for opt do
740 optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
741 case "$opt" in
742 --help|-h) show_help=yes
743 ;;
744 --version|-V) exec cat $source_path/VERSION
745 ;;
746 --prefix=*) prefix="$optarg"
747 ;;
748 --interp-prefix=*) interp_prefix="$optarg"
749 ;;
750 --cross-prefix=*)
751 ;;
752 --cc=*)
753 ;;
754 --host-cc=*) host_cc="$optarg"
755 ;;
756 --cxx=*)
757 ;;
758 --iasl=*) iasl="$optarg"
759 ;;
760 --objcc=*) objcc="$optarg"
761 ;;
762 --make=*) make="$optarg"
763 ;;
764 --install=*)
765 ;;
766 --python=*) python="$optarg" ; explicit_python=yes
767 ;;
768 --sphinx-build=*) sphinx_build="$optarg"
769 ;;
770 --skip-meson) skip_meson=yes
771 ;;
772 --meson=*) meson="$optarg"
773 ;;
774 --ninja=*) ninja="$optarg"
775 ;;
776 --smbd=*) smbd="$optarg"
777 ;;
778 --extra-cflags=*)
779 ;;
780 --extra-cxxflags=*)
781 ;;
782 --extra-ldflags=*)
783 ;;
784 --enable-debug-info)
785 ;;
786 --disable-debug-info)
787 ;;
788 --cross-cc-*)
789 ;;
790 --enable-modules)
791 modules="yes"
792 ;;
793 --disable-modules)
794 modules="no"
795 ;;
796 --disable-module-upgrades) module_upgrades="no"
797 ;;
798 --enable-module-upgrades) module_upgrades="yes"
799 ;;
800 --cpu=*)
801 ;;
802 --target-list=*) target_list="$optarg"
803 if test "$target_list_exclude"; then
804 error_exit "Can't mix --target-list with --target-list-exclude"
805 fi
806 ;;
807 --target-list-exclude=*) target_list_exclude="$optarg"
808 if test "$target_list"; then
809 error_exit "Can't mix --target-list-exclude with --target-list"
810 fi
811 ;;
812 --with-trace-file=*) trace_file="$optarg"
813 ;;
814 --with-default-devices) default_devices="true"
815 ;;
816 --without-default-devices) default_devices="false"
817 ;;
818 --with-devices-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --with-devices-FOO option"
819 ;;
820 --with-devices-*) device_arch=${opt#--with-devices-};
821 device_arch=${device_arch%%=*}
822 cf=$source_path/configs/devices/$device_arch-softmmu/$optarg.mak
823 if test -f "$cf"; then
824 device_archs="$device_archs $device_arch"
825 eval "devices_${device_arch}=\$optarg"
826 else
827 error_exit "File $cf does not exist"
828 fi
829 ;;
830 --without-default-features) # processed above
831 ;;
832 --enable-gprof) gprof="yes"
833 ;;
834 --enable-gcov) gcov="yes"
835 ;;
836 --static)
837 static="yes"
838 QEMU_PKG_CONFIG_FLAGS="--static $QEMU_PKG_CONFIG_FLAGS"
839 ;;
840 --mandir=*) mandir="$optarg"
841 ;;
842 --bindir=*) bindir="$optarg"
843 ;;
844 --libdir=*) libdir="$optarg"
845 ;;
846 --libexecdir=*) libexecdir="$optarg"
847 ;;
848 --includedir=*) includedir="$optarg"
849 ;;
850 --datadir=*) datadir="$optarg"
851 ;;
852 --with-suffix=*) qemu_suffix="$optarg"
853 ;;
854 --docdir=*) docdir="$optarg"
855 ;;
856 --localedir=*) localedir="$optarg"
857 ;;
858 --sysconfdir=*) sysconfdir="$optarg"
859 ;;
860 --localstatedir=*) local_statedir="$optarg"
861 ;;
862 --firmwarepath=*) firmwarepath="$optarg"
863 ;;
864 --host=*|--build=*|\
865 --disable-dependency-tracking|\
866 --sbindir=*|--sharedstatedir=*|\
867 --oldincludedir=*|--datarootdir=*|--infodir=*|\
868 --htmldir=*|--dvidir=*|--pdfdir=*|--psdir=*)
869 # These switches are silently ignored, for compatibility with
870 # autoconf-generated configure scripts. This allows QEMU's
871 # configure to be used by RPM and similar macros that set
872 # lots of directory switches by default.
873 ;;
874 --disable-qom-cast-debug) qom_cast_debug="no"
875 ;;
876 --enable-qom-cast-debug) qom_cast_debug="yes"
877 ;;
878 --audio-drv-list=*) audio_drv_list="$optarg"
879 ;;
880 --block-drv-rw-whitelist=*|--block-drv-whitelist=*) block_drv_rw_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
881 ;;
882 --block-drv-ro-whitelist=*) block_drv_ro_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
883 ;;
884 --enable-block-drv-whitelist-in-tools) block_drv_whitelist_tools="yes"
885 ;;
886 --disable-block-drv-whitelist-in-tools) block_drv_whitelist_tools="no"
887 ;;
888 --enable-debug-tcg) debug_tcg="yes"
889 ;;
890 --disable-debug-tcg) debug_tcg="no"
891 ;;
892 --enable-debug)
893 # Enable debugging options that aren't excessively noisy
894 debug_tcg="yes"
895 debug_mutex="yes"
896 debug="yes"
897 strip_opt="no"
898 fortify_source="no"
899 ;;
900 --enable-sanitizers) sanitizers="yes"
901 ;;
902 --disable-sanitizers) sanitizers="no"
903 ;;
904 --enable-tsan) tsan="yes"
905 ;;
906 --disable-tsan) tsan="no"
907 ;;
908 --disable-strip) strip_opt="no"
909 ;;
910 --disable-slirp) slirp="disabled"
911 ;;
912 --enable-slirp) slirp="enabled"
913 ;;
914 --enable-slirp=git) slirp="internal"
915 ;;
916 --enable-slirp=*) slirp="$optarg"
917 ;;
918 --disable-xen) xen="disabled"
919 ;;
920 --enable-xen) xen="enabled"
921 ;;
922 --disable-tcg) tcg="disabled"
923 plugins="no"
924 ;;
925 --enable-tcg) tcg="enabled"
926 ;;
927 --enable-profiler) profiler="yes"
928 ;;
929 --disable-system) softmmu="no"
930 ;;
931 --enable-system) softmmu="yes"
932 ;;
933 --disable-user)
934 linux_user="no" ;
935 bsd_user="no" ;
936 ;;
937 --enable-user) ;;
938 --disable-linux-user) linux_user="no"
939 ;;
940 --enable-linux-user) linux_user="yes"
941 ;;
942 --disable-bsd-user) bsd_user="no"
943 ;;
944 --enable-bsd-user) bsd_user="yes"
945 ;;
946 --enable-pie) pie="yes"
947 ;;
948 --disable-pie) pie="no"
949 ;;
950 --enable-werror) werror="yes"
951 ;;
952 --disable-werror) werror="no"
953 ;;
954 --enable-lto) lto="true"
955 ;;
956 --disable-lto) lto="false"
957 ;;
958 --enable-stack-protector) stack_protector="yes"
959 ;;
960 --disable-stack-protector) stack_protector="no"
961 ;;
962 --enable-safe-stack) safe_stack="yes"
963 ;;
964 --disable-safe-stack) safe_stack="no"
965 ;;
966 --enable-cfi)
967 cfi="true";
968 lto="true";
969 ;;
970 --disable-cfi) cfi="false"
971 ;;
972 --disable-fdt) fdt="disabled"
973 ;;
974 --enable-fdt) fdt="enabled"
975 ;;
976 --enable-fdt=git) fdt="internal"
977 ;;
978 --enable-fdt=*) fdt="$optarg"
979 ;;
980 --disable-membarrier) membarrier="no"
981 ;;
982 --enable-membarrier) membarrier="yes"
983 ;;
984 --with-pkgversion=*) pkgversion="$optarg"
985 ;;
986 --with-coroutine=*) coroutine="$optarg"
987 ;;
988 --disable-coroutine-pool) coroutine_pool="no"
989 ;;
990 --enable-coroutine-pool) coroutine_pool="yes"
991 ;;
992 --enable-debug-stack-usage) debug_stack_usage="yes"
993 ;;
994 --enable-crypto-afalg) crypto_afalg="yes"
995 ;;
996 --disable-crypto-afalg) crypto_afalg="no"
997 ;;
998 --disable-vhost-net) vhost_net="no"
999 ;;
1000 --enable-vhost-net) vhost_net="yes"
1001 ;;
1002 --disable-vhost-crypto) vhost_crypto="no"
1003 ;;
1004 --enable-vhost-crypto) vhost_crypto="yes"
1005 ;;
1006 --disable-vhost-scsi) vhost_scsi="no"
1007 ;;
1008 --enable-vhost-scsi) vhost_scsi="yes"
1009 ;;
1010 --disable-vhost-vsock) vhost_vsock="no"
1011 ;;
1012 --enable-vhost-vsock) vhost_vsock="yes"
1013 ;;
1014 --disable-vhost-user-fs) vhost_user_fs="no"
1015 ;;
1016 --enable-vhost-user-fs) vhost_user_fs="yes"
1017 ;;
1018 --disable-opengl) opengl="no"
1019 ;;
1020 --enable-opengl) opengl="yes"
1021 ;;
1022 --disable-zlib-test)
1023 ;;
1024 --enable-guest-agent) guest_agent="yes"
1025 ;;
1026 --disable-guest-agent) guest_agent="no"
1027 ;;
1028 --with-vss-sdk) vss_win32_sdk=""
1029 ;;
1030 --with-vss-sdk=*) vss_win32_sdk="$optarg"
1031 ;;
1032 --without-vss-sdk) vss_win32_sdk="no"
1033 ;;
1034 --with-win-sdk) win_sdk=""
1035 ;;
1036 --with-win-sdk=*) win_sdk="$optarg"
1037 ;;
1038 --without-win-sdk) win_sdk="no"
1039 ;;
1040 --enable-tools) want_tools="yes"
1041 ;;
1042 --disable-tools) want_tools="no"
1043 ;;
1044 --disable-avx2) avx2_opt="no"
1045 ;;
1046 --enable-avx2) avx2_opt="yes"
1047 ;;
1048 --disable-avx512f) avx512f_opt="no"
1049 ;;
1050 --enable-avx512f) avx512f_opt="yes"
1051 ;;
1052 --disable-virtio-blk-data-plane|--enable-virtio-blk-data-plane)
1053 echo "$0: $opt is obsolete, virtio-blk data-plane is always on" >&2
1054 ;;
1055 --enable-vhdx|--disable-vhdx)
1056 echo "$0: $opt is obsolete, VHDX driver is always built" >&2
1057 ;;
1058 --enable-uuid|--disable-uuid)
1059 echo "$0: $opt is obsolete, UUID support is always built" >&2
1060 ;;
1061 --tls-priority=*) tls_priority="$optarg"
1062 ;;
1063 --enable-rdma) rdma="yes"
1064 ;;
1065 --disable-rdma) rdma="no"
1066 ;;
1067 --enable-pvrdma) pvrdma="yes"
1068 ;;
1069 --disable-pvrdma) pvrdma="no"
1070 ;;
1071 --disable-tpm) tpm="no"
1072 ;;
1073 --enable-tpm) tpm="yes"
1074 ;;
1075 --disable-live-block-migration) live_block_migration="no"
1076 ;;
1077 --enable-live-block-migration) live_block_migration="yes"
1078 ;;
1079 --disable-numa) numa="no"
1080 ;;
1081 --enable-numa) numa="yes"
1082 ;;
1083 --disable-replication) replication="no"
1084 ;;
1085 --enable-replication) replication="yes"
1086 ;;
1087 --disable-bochs) bochs="no"
1088 ;;
1089 --enable-bochs) bochs="yes"
1090 ;;
1091 --disable-cloop) cloop="no"
1092 ;;
1093 --enable-cloop) cloop="yes"
1094 ;;
1095 --disable-dmg) dmg="no"
1096 ;;
1097 --enable-dmg) dmg="yes"
1098 ;;
1099 --disable-qcow1) qcow1="no"
1100 ;;
1101 --enable-qcow1) qcow1="yes"
1102 ;;
1103 --disable-vdi) vdi="no"
1104 ;;
1105 --enable-vdi) vdi="yes"
1106 ;;
1107 --disable-vvfat) vvfat="no"
1108 ;;
1109 --enable-vvfat) vvfat="yes"
1110 ;;
1111 --disable-qed) qed="no"
1112 ;;
1113 --enable-qed) qed="yes"
1114 ;;
1115 --disable-parallels) parallels="no"
1116 ;;
1117 --enable-parallels) parallels="yes"
1118 ;;
1119 --disable-vhost-user) vhost_user="no"
1120 ;;
1121 --enable-vhost-user) vhost_user="yes"
1122 ;;
1123 --disable-vhost-vdpa) vhost_vdpa="no"
1124 ;;
1125 --enable-vhost-vdpa) vhost_vdpa="yes"
1126 ;;
1127 --disable-vhost-kernel) vhost_kernel="no"
1128 ;;
1129 --enable-vhost-kernel) vhost_kernel="yes"
1130 ;;
1131 --disable-capstone) capstone="disabled"
1132 ;;
1133 --enable-capstone) capstone="enabled"
1134 ;;
1135 --enable-capstone=git) capstone="internal"
1136 ;;
1137 --enable-capstone=*) capstone="$optarg"
1138 ;;
1139 --with-git=*) git="$optarg"
1140 ;;
1141 --with-git-submodules=*)
1142 git_submodules_action="$optarg"
1143 ;;
1144 --enable-debug-mutex) debug_mutex=yes
1145 ;;
1146 --disable-debug-mutex) debug_mutex=no
1147 ;;
1148 --enable-plugins) if test "$mingw32" = "yes"; then
1149 error_exit "TCG plugins not currently supported on Windows platforms"
1150 else
1151 plugins="yes"
1152 fi
1153 ;;
1154 --disable-plugins) plugins="no"
1155 ;;
1156 --enable-containers) use_containers="yes"
1157 ;;
1158 --disable-containers) use_containers="no"
1159 ;;
1160 --gdb=*) gdb_bin="$optarg"
1161 ;;
1162 --enable-rng-none) rng_none=yes
1163 ;;
1164 --disable-rng-none) rng_none=no
1165 ;;
1166 --enable-keyring) secret_keyring="yes"
1167 ;;
1168 --disable-keyring) secret_keyring="no"
1169 ;;
1170 --enable-gio) gio=yes
1171 ;;
1172 --disable-gio) gio=no
1173 ;;
1174 --enable-slirp-smbd) slirp_smbd=yes
1175 ;;
1176 --disable-slirp-smbd) slirp_smbd=no
1177 ;;
1178 # backwards compatibility options
1179 --enable-trace-backend=*) meson_option_parse "--enable-trace-backends=$optarg" "$optarg"
1180 ;;
1181 --disable-blobs) meson_option_parse --disable-install-blobs ""
1182 ;;
1183 --enable-tcmalloc) meson_option_parse --enable-malloc=tcmalloc tcmalloc
1184 ;;
1185 --enable-jemalloc) meson_option_parse --enable-malloc=jemalloc jemalloc
1186 ;;
1187 # everything else has the same name in configure and meson
1188 --enable-* | --disable-*) meson_option_parse "$opt" "$optarg"
1189 ;;
1190 *)
1191 echo "ERROR: unknown option $opt"
1192 echo "Try '$0 --help' for more information"
1193 exit 1
1194 ;;
1195 esac
1196done
1197
1198# test for any invalid configuration combinations
1199if test "$plugins" = "yes" -a "$tcg" = "disabled"; then
1200 error_exit "Can't enable plugins on non-TCG builds"
1201fi
1202
1203case $git_submodules_action in
1204 update|validate)
1205 if test ! -e "$source_path/.git"; then
1206 echo "ERROR: cannot $git_submodules_action git submodules without .git"
1207 exit 1
1208 fi
1209 ;;
1210 ignore)
1211 if ! test -f "$source_path/ui/keycodemapdb/README"
1212 then
1213 echo
1214 echo "ERROR: missing GIT submodules"
1215 echo
1216 if test -e "$source_path/.git"; then
1217 echo "--with-git-submodules=ignore specified but submodules were not"
1218 echo "checked out. Please initialize and update submodules."
1219 else
1220 echo "This is not a GIT checkout but module content appears to"
1221 echo "be missing. Do not use 'git archive' or GitHub download links"
1222 echo "to acquire QEMU source archives. Non-GIT builds are only"
1223 echo "supported with source archives linked from:"
1224 echo
1225 echo " https://www.qemu.org/download/#source"
1226 echo
1227 echo "Developers working with GIT can use scripts/archive-source.sh"
1228 echo "if they need to create valid source archives."
1229 fi
1230 echo
1231 exit 1
1232 fi
1233 ;;
1234 *)
1235 echo "ERROR: invalid --with-git-submodules= value '$git_submodules_action'"
1236 exit 1
1237 ;;
1238esac
1239
1240libdir="${libdir:-$prefix/lib}"
1241libexecdir="${libexecdir:-$prefix/libexec}"
1242includedir="${includedir:-$prefix/include}"
1243
1244if test "$mingw32" = "yes" ; then
1245 bindir="${bindir:-$prefix}"
1246else
1247 bindir="${bindir:-$prefix/bin}"
1248fi
1249mandir="${mandir:-$prefix/share/man}"
1250datadir="${datadir:-$prefix/share}"
1251docdir="${docdir:-$prefix/share/doc}"
1252sysconfdir="${sysconfdir:-$prefix/etc}"
1253local_statedir="${local_statedir:-$prefix/var}"
1254firmwarepath="${firmwarepath:-$datadir/qemu-firmware}"
1255localedir="${localedir:-$datadir/locale}"
1256
1257if eval test -z "\${cross_cc_$cpu}"; then
1258 eval "cross_cc_${cpu}=\$cc"
1259 cross_cc_vars="$cross_cc_vars cross_cc_${cpu}"
1260fi
1261
1262# For user-mode emulation the host arch has to be one we explicitly
1263# support, even if we're using TCI.
1264if [ "$ARCH" = "unknown" ]; then
1265 bsd_user="no"
1266 linux_user="no"
1267fi
1268
1269default_target_list=""
1270deprecated_targets_list=ppc64abi32-linux-user
1271deprecated_features=""
1272mak_wilds=""
1273
1274if [ "$softmmu" = "yes" ]; then
1275 mak_wilds="${mak_wilds} $source_path/configs/targets/*-softmmu.mak"
1276fi
1277if [ "$linux_user" = "yes" ]; then
1278 mak_wilds="${mak_wilds} $source_path/configs/targets/*-linux-user.mak"
1279fi
1280if [ "$bsd_user" = "yes" ]; then
1281 mak_wilds="${mak_wilds} $source_path/configs/targets/*-bsd-user.mak"
1282fi
1283
1284# If the user doesn't explicitly specify a deprecated target we will
1285# skip it.
1286if test -z "$target_list"; then
1287 if test -z "$target_list_exclude"; then
1288 target_list_exclude="$deprecated_targets_list"
1289 else
1290 target_list_exclude="$target_list_exclude,$deprecated_targets_list"
1291 fi
1292fi
1293
1294for config in $mak_wilds; do
1295 target="$(basename "$config" .mak)"
1296 if echo "$target_list_exclude" | grep -vq "$target"; then
1297 default_target_list="${default_target_list} $target"
1298 fi
1299done
1300
1301if test x"$show_help" = x"yes" ; then
1302cat << EOF
1303
1304Usage: configure [options]
1305Options: [defaults in brackets after descriptions]
1306
1307Standard options:
1308 --help print this message
1309 --prefix=PREFIX install in PREFIX [$prefix]
1310 --interp-prefix=PREFIX where to find shared libraries, etc.
1311 use %M for cpu name [$interp_prefix]
1312 --target-list=LIST set target list (default: build all non-deprecated)
1313$(echo Available targets: $default_target_list | \
1314 fold -s -w 53 | sed -e 's/^/ /')
1315$(echo Deprecated targets: $deprecated_targets_list | \
1316 fold -s -w 53 | sed -e 's/^/ /')
1317 --target-list-exclude=LIST exclude a set of targets from the default target-list
1318
1319Advanced options (experts only):
1320 --cross-prefix=PREFIX use PREFIX for compile tools, PREFIX can be blank [$cross_prefix]
1321 --cc=CC use C compiler CC [$cc]
1322 --iasl=IASL use ACPI compiler IASL [$iasl]
1323 --host-cc=CC use C compiler CC [$host_cc] for code run at
1324 build time
1325 --cxx=CXX use C++ compiler CXX [$cxx]
1326 --objcc=OBJCC use Objective-C compiler OBJCC [$objcc]
1327 --extra-cflags=CFLAGS append extra C compiler flags CFLAGS
1328 --extra-cxxflags=CXXFLAGS append extra C++ compiler flags CXXFLAGS
1329 --extra-ldflags=LDFLAGS append extra linker flags LDFLAGS
1330 --cross-cc-ARCH=CC use compiler when building ARCH guest test cases
1331 --cross-cc-flags-ARCH= use compiler flags when building ARCH guest tests
1332 --make=MAKE use specified make [$make]
1333 --python=PYTHON use specified python [$python]
1334 --sphinx-build=SPHINX use specified sphinx-build [$sphinx_build]
1335 --meson=MESON use specified meson [$meson]
1336 --ninja=NINJA use specified ninja [$ninja]
1337 --smbd=SMBD use specified smbd [$smbd]
1338 --with-git=GIT use specified git [$git]
1339 --with-git-submodules=update update git submodules (default if .git dir exists)
1340 --with-git-submodules=validate fail if git submodules are not up to date
1341 --with-git-submodules=ignore do not update or check git submodules (default if no .git dir)
1342 --static enable static build [$static]
1343 --mandir=PATH install man pages in PATH
1344 --datadir=PATH install firmware in PATH/$qemu_suffix
1345 --localedir=PATH install translation in PATH/$qemu_suffix
1346 --docdir=PATH install documentation in PATH/$qemu_suffix
1347 --bindir=PATH install binaries in PATH
1348 --libdir=PATH install libraries in PATH
1349 --libexecdir=PATH install helper binaries in PATH
1350 --sysconfdir=PATH install config in PATH/$qemu_suffix
1351 --localstatedir=PATH install local state in PATH (set at runtime on win32)
1352 --firmwarepath=PATH search PATH for firmware files
1353 --efi-aarch64=PATH PATH of efi file to use for aarch64 VMs.
1354 --with-suffix=SUFFIX suffix for QEMU data inside datadir/libdir/sysconfdir/docdir [$qemu_suffix]
1355 --with-pkgversion=VERS use specified string as sub-version of the package
1356 --without-default-features default all --enable-* options to "disabled"
1357 --without-default-devices do not include any device that is not needed to
1358 start the emulator (only use if you are including
1359 desired devices in configs/devices/)
1360 --with-devices-ARCH=NAME override default configs/devices
1361 --enable-debug enable common debug build options
1362 --enable-sanitizers enable default sanitizers
1363 --enable-tsan enable thread sanitizer
1364 --disable-strip disable stripping binaries
1365 --disable-werror disable compilation abort on warning
1366 --disable-stack-protector disable compiler-provided stack protection
1367 --audio-drv-list=LIST set audio drivers to try if -audiodev is not used
1368 --block-drv-whitelist=L Same as --block-drv-rw-whitelist=L
1369 --block-drv-rw-whitelist=L
1370 set block driver read-write whitelist
1371 (by default affects only QEMU, not tools like qemu-img)
1372 --block-drv-ro-whitelist=L
1373 set block driver read-only whitelist
1374 (by default affects only QEMU, not tools like qemu-img)
1375 --enable-block-drv-whitelist-in-tools
1376 use block whitelist also in tools instead of only QEMU
1377 --with-trace-file=NAME Full PATH,NAME of file to store traces
1378 Default:trace-<pid>
1379 --cpu=CPU Build for host CPU [$cpu]
1380 --with-coroutine=BACKEND coroutine backend. Supported options:
1381 ucontext, sigaltstack, windows
1382 --enable-gcov enable test coverage analysis with gcov
1383 --with-vss-sdk=SDK-path enable Windows VSS support in QEMU Guest Agent
1384 --with-win-sdk=SDK-path path to Windows Platform SDK (to build VSS .tlb)
1385 --tls-priority default TLS protocol/cipher priority string
1386 --enable-gprof QEMU profiling with gprof
1387 --enable-profiler profiler support
1388 --enable-debug-stack-usage
1389 track the maximum stack usage of stacks created by qemu_alloc_stack
1390 --enable-plugins
1391 enable plugins via shared library loading
1392 --disable-containers don't use containers for cross-building
1393 --gdb=GDB-path gdb to use for gdbstub tests [$gdb_bin]
1394EOF
1395 meson_options_help
1396cat << EOF
1397 system all system emulation targets
1398 user supported user emulation targets
1399 linux-user all linux usermode emulation targets
1400 bsd-user all BSD usermode emulation targets
1401 guest-agent build the QEMU Guest Agent
1402 pie Position Independent Executables
1403 modules modules support (non-Windows)
1404 module-upgrades try to load modules from alternate paths for upgrades
1405 debug-tcg TCG debugging (default is disabled)
1406 debug-info debugging information
1407 lto Enable Link-Time Optimization.
1408 safe-stack SafeStack Stack Smash Protection. Depends on
1409 clang/llvm >= 3.7 and requires coroutine backend ucontext.
1410 membarrier membarrier system call (for Linux 4.14+ or Windows)
1411 rdma Enable RDMA-based migration
1412 pvrdma Enable PVRDMA support
1413 vhost-net vhost-net kernel acceleration support
1414 vhost-vsock virtio sockets device support
1415 vhost-scsi vhost-scsi kernel target support
1416 vhost-crypto vhost-user-crypto backend support
1417 vhost-kernel vhost kernel backend support
1418 vhost-user vhost-user backend support
1419 vhost-vdpa vhost-vdpa kernel backend support
1420 live-block-migration Block migration in the main migration stream
1421 coroutine-pool coroutine freelist (better performance)
1422 tpm TPM support
1423 numa libnuma support
1424 avx2 AVX2 optimization support
1425 avx512f AVX512F optimization support
1426 replication replication support
1427 opengl opengl support
1428 qom-cast-debug cast debugging support
1429 tools build qemu-io, qemu-nbd and qemu-img tools
1430 bochs bochs image format support
1431 cloop cloop image format support
1432 dmg dmg image format support
1433 qcow1 qcow v1 image format support
1434 vdi vdi image format support
1435 vvfat vvfat image format support
1436 qed qed image format support
1437 parallels parallels image format support
1438 crypto-afalg Linux AF_ALG crypto backend driver
1439 debug-mutex mutex debugging support
1440 rng-none dummy RNG, avoid using /dev/(u)random and getrandom()
1441 gio libgio support
1442 slirp-smbd use smbd (at path --smbd=*) in slirp networking
1443
1444NOTE: The object files are built at the place where configure is launched
1445EOF
1446exit 0
1447fi
1448
1449# Remove old dependency files to make sure that they get properly regenerated
1450rm -f */config-devices.mak.d
1451
1452if test -z "$python"
1453then
1454 error_exit "Python not found. Use --python=/path/to/python"
1455fi
1456if ! has "$make"
1457then
1458 error_exit "GNU make ($make) not found"
1459fi
1460
1461# Note that if the Python conditional here evaluates True we will exit
1462# with status 1 which is a shell 'false' value.
1463if ! $python -c 'import sys; sys.exit(sys.version_info < (3,6))'; then
1464 error_exit "Cannot use '$python', Python >= 3.6 is required." \
1465 "Use --python=/path/to/python to specify a supported Python."
1466fi
1467
1468# Preserve python version since some functionality is dependent on it
1469python_version=$($python -c 'import sys; print("%d.%d.%d" % (sys.version_info[0], sys.version_info[1], sys.version_info[2]))' 2>/dev/null)
1470
1471# Suppress writing compiled files
1472python="$python -B"
1473
1474if test -z "$meson"; then
1475 if test "$explicit_python" = no && has meson && version_ge "$(meson --version)" 0.59.3; then
1476 meson=meson
1477 elif test $git_submodules_action != 'ignore' ; then
1478 meson=git
1479 elif test -e "${source_path}/meson/meson.py" ; then
1480 meson=internal
1481 else
1482 if test "$explicit_python" = yes; then
1483 error_exit "--python requires using QEMU's embedded Meson distribution, but it was not found."
1484 else
1485 error_exit "Meson not found. Use --meson=/path/to/meson"
1486 fi
1487 fi
1488else
1489 # Meson uses its own Python interpreter to invoke other Python scripts,
1490 # but the user wants to use the one they specified with --python.
1491 #
1492 # We do not want to override the distro Python interpreter (and sometimes
1493 # cannot: for example in Homebrew /usr/bin/meson is a bash script), so
1494 # just require --meson=git|internal together with --python.
1495 if test "$explicit_python" = yes; then
1496 case "$meson" in
1497 git | internal) ;;
1498 *) error_exit "--python requires using QEMU's embedded Meson distribution." ;;
1499 esac
1500 fi
1501fi
1502
1503if test "$meson" = git; then
1504 git_submodules="${git_submodules} meson"
1505fi
1506
1507case "$meson" in
1508 git | internal)
1509 meson="$python ${source_path}/meson/meson.py"
1510 ;;
1511 *) meson=$(command -v "$meson") ;;
1512esac
1513
1514# Probe for ninja
1515
1516if test -z "$ninja"; then
1517 for c in ninja ninja-build samu; do
1518 if has $c; then
1519 ninja=$(command -v "$c")
1520 break
1521 fi
1522 done
1523 if test -z "$ninja"; then
1524 error_exit "Cannot find Ninja"
1525 fi
1526fi
1527
1528# Check that the C compiler works. Doing this here before testing
1529# the host CPU ensures that we had a valid CC to autodetect the
1530# $cpu var (and we should bail right here if that's not the case).
1531# It also allows the help message to be printed without a CC.
1532write_c_skeleton;
1533if compile_object ; then
1534 : C compiler works ok
1535else
1536 error_exit "\"$cc\" either does not exist or does not work"
1537fi
1538if ! compile_prog ; then
1539 error_exit "\"$cc\" cannot build an executable (is your linker broken?)"
1540fi
1541
1542# Consult white-list to determine whether to enable werror
1543# by default. Only enable by default for git builds
1544if test -z "$werror" ; then
1545 if test "$git_submodules_action" != "ignore" && \
1546 { test "$linux" = "yes" || test "$mingw32" = "yes"; }; then
1547 werror="yes"
1548 else
1549 werror="no"
1550 fi
1551fi
1552
1553if test "$targetos" = "bogus"; then
1554 # Now that we know that we're not printing the help and that
1555 # the compiler works (so the results of the check_defines we used
1556 # to identify the OS are reliable), if we didn't recognize the
1557 # host OS we should stop now.
1558 error_exit "Unrecognized host OS (uname -s reports '$(uname -s)')"
1559fi
1560
1561# Check whether the compiler matches our minimum requirements:
1562cat > $TMPC << EOF
1563#if defined(__clang_major__) && defined(__clang_minor__)
1564# ifdef __apple_build_version__
1565# if __clang_major__ < 10 || (__clang_major__ == 10 && __clang_minor__ < 0)
1566# error You need at least XCode Clang v10.0 to compile QEMU
1567# endif
1568# else
1569# if __clang_major__ < 6 || (__clang_major__ == 6 && __clang_minor__ < 0)
1570# error You need at least Clang v6.0 to compile QEMU
1571# endif
1572# endif
1573#elif defined(__GNUC__) && defined(__GNUC_MINOR__)
1574# if __GNUC__ < 7 || (__GNUC__ == 7 && __GNUC_MINOR__ < 4)
1575# error You need at least GCC v7.4.0 to compile QEMU
1576# endif
1577#else
1578# error You either need GCC or Clang to compiler QEMU
1579#endif
1580int main (void) { return 0; }
1581EOF
1582if ! compile_prog "" "" ; then
1583 error_exit "You need at least GCC v7.4 or Clang v6.0 (or XCode Clang v10.0)"
1584fi
1585
1586# Accumulate -Wfoo and -Wno-bar separately.
1587# We will list all of the enable flags first, and the disable flags second.
1588# Note that we do not add -Werror, because that would enable it for all
1589# configure tests. If a configure test failed due to -Werror this would
1590# just silently disable some features, so it's too error prone.
1591
1592warn_flags=
1593add_to warn_flags -Wold-style-declaration
1594add_to warn_flags -Wold-style-definition
1595add_to warn_flags -Wtype-limits
1596add_to warn_flags -Wformat-security
1597add_to warn_flags -Wformat-y2k
1598add_to warn_flags -Winit-self
1599add_to warn_flags -Wignored-qualifiers
1600add_to warn_flags -Wempty-body
1601add_to warn_flags -Wnested-externs
1602add_to warn_flags -Wendif-labels
1603add_to warn_flags -Wexpansion-to-defined
1604add_to warn_flags -Wimplicit-fallthrough=2
1605
1606nowarn_flags=
1607add_to nowarn_flags -Wno-initializer-overrides
1608add_to nowarn_flags -Wno-missing-include-dirs
1609add_to nowarn_flags -Wno-shift-negative-value
1610add_to nowarn_flags -Wno-string-plus-int
1611add_to nowarn_flags -Wno-typedef-redefinition
1612add_to nowarn_flags -Wno-tautological-type-limit-compare
1613add_to nowarn_flags -Wno-psabi
1614
1615gcc_flags="$warn_flags $nowarn_flags"
1616
1617cc_has_warning_flag() {
1618 write_c_skeleton;
1619
1620 # Use the positive sense of the flag when testing for -Wno-wombat
1621 # support (gcc will happily accept the -Wno- form of unknown
1622 # warning options).
1623 optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
1624 compile_prog "-Werror $optflag" ""
1625}
1626
1627for flag in $gcc_flags; do
1628 if cc_has_warning_flag $flag ; then
1629 QEMU_CFLAGS="$QEMU_CFLAGS $flag"
1630 fi
1631done
1632
1633if test "$stack_protector" != "no"; then
1634 cat > $TMPC << EOF
1635int main(int argc, char *argv[])
1636{
1637 char arr[64], *p = arr, *c = argv[0];
1638 while (*c) {
1639 *p++ = *c++;
1640 }
1641 return 0;
1642}
1643EOF
1644 gcc_flags="-fstack-protector-strong -fstack-protector-all"
1645 sp_on=0
1646 for flag in $gcc_flags; do
1647 # We need to check both a compile and a link, since some compiler
1648 # setups fail only on a .c->.o compile and some only at link time
1649 if compile_object "-Werror $flag" &&
1650 compile_prog "-Werror $flag" ""; then
1651 QEMU_CFLAGS="$QEMU_CFLAGS $flag"
1652 QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
1653 sp_on=1
1654 break
1655 fi
1656 done
1657 if test "$stack_protector" = yes; then
1658 if test $sp_on = 0; then
1659 error_exit "Stack protector not supported"
1660 fi
1661 fi
1662fi
1663
1664# Disable -Wmissing-braces on older compilers that warn even for
1665# the "universal" C zero initializer {0}.
1666cat > $TMPC << EOF
1667struct {
1668 int a[2];
1669} x = {0};
1670EOF
1671if compile_object "-Werror" "" ; then
1672 :
1673else
1674 QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces"
1675fi
1676
1677# Our module code doesn't support Windows
1678if test "$modules" = "yes" && test "$mingw32" = "yes" ; then
1679 error_exit "Modules are not available for Windows"
1680fi
1681
1682# module_upgrades is only reasonable if modules are enabled
1683if test "$modules" = "no" && test "$module_upgrades" = "yes" ; then
1684 error_exit "Can't enable module-upgrades as Modules are not enabled"
1685fi
1686
1687# Static linking is not possible with plugins, modules or PIE
1688if test "$static" = "yes" ; then
1689 if test "$modules" = "yes" ; then
1690 error_exit "static and modules are mutually incompatible"
1691 fi
1692 if test "$plugins" = "yes"; then
1693 error_exit "static and plugins are mutually incompatible"
1694 else
1695 plugins="no"
1696 fi
1697fi
1698test "$plugins" = "" && plugins=yes
1699
1700cat > $TMPC << EOF
1701
1702#ifdef __linux__
1703# define THREAD __thread
1704#else
1705# define THREAD
1706#endif
1707static THREAD int tls_var;
1708int main(void) { return tls_var; }
1709EOF
1710
1711# Check we support -fno-pie and -no-pie first; we will need the former for
1712# building ROMs, and both for everything if --disable-pie is passed.
1713if compile_prog "-Werror -fno-pie" "-no-pie"; then
1714 CFLAGS_NOPIE="-fno-pie"
1715 LDFLAGS_NOPIE="-no-pie"
1716fi
1717
1718if test "$static" = "yes"; then
1719 if test "$pie" != "no" && compile_prog "-Werror -fPIE -DPIE" "-static-pie"; then
1720 CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
1721 QEMU_LDFLAGS="-static-pie $QEMU_LDFLAGS"
1722 pie="yes"
1723 elif test "$pie" = "yes"; then
1724 error_exit "-static-pie not available due to missing toolchain support"
1725 else
1726 QEMU_LDFLAGS="-static $QEMU_LDFLAGS"
1727 pie="no"
1728 fi
1729elif test "$pie" = "no"; then
1730 CONFIGURE_CFLAGS="$CFLAGS_NOPIE $CONFIGURE_CFLAGS"
1731 CONFIGURE_LDFLAGS="$LDFLAGS_NOPIE $CONFIGURE_LDFLAGS"
1732elif compile_prog "-Werror -fPIE -DPIE" "-pie"; then
1733 CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
1734 CONFIGURE_LDFLAGS="-pie $CONFIGURE_LDFLAGS"
1735 pie="yes"
1736elif test "$pie" = "yes"; then
1737 error_exit "PIE not available due to missing toolchain support"
1738else
1739 echo "Disabling PIE due to missing toolchain support"
1740 pie="no"
1741fi
1742
1743# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
1744# The combination is known as "full relro", because .got.plt is read-only too.
1745if compile_prog "" "-Wl,-z,relro -Wl,-z,now" ; then
1746 QEMU_LDFLAGS="-Wl,-z,relro -Wl,-z,now $QEMU_LDFLAGS"
1747fi
1748
1749##########################################
1750# __sync_fetch_and_and requires at least -march=i486. Many toolchains
1751# use i686 as default anyway, but for those that don't, an explicit
1752# specification is necessary
1753
1754if test "$cpu" = "i386"; then
1755 cat > $TMPC << EOF
1756static int sfaa(int *ptr)
1757{
1758 return __sync_fetch_and_and(ptr, 0);
1759}
1760
1761int main(void)
1762{
1763 int val = 42;
1764 val = __sync_val_compare_and_swap(&val, 0, 1);
1765 sfaa(&val);
1766 return val;
1767}
1768EOF
1769 if ! compile_prog "" "" ; then
1770 QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS"
1771 fi
1772fi
1773
1774if test "$tcg" = "enabled"; then
1775 git_submodules="$git_submodules tests/fp/berkeley-testfloat-3"
1776 git_submodules="$git_submodules tests/fp/berkeley-softfloat-3"
1777fi
1778
1779if test -z "${target_list+xxx}" ; then
1780 default_targets=yes
1781 for target in $default_target_list; do
1782 target_list="$target_list $target"
1783 done
1784 target_list="${target_list# }"
1785else
1786 default_targets=no
1787 target_list=$(echo "$target_list" | sed -e 's/,/ /g')
1788 for target in $target_list; do
1789 # Check that we recognised the target name; this allows a more
1790 # friendly error message than if we let it fall through.
1791 case " $default_target_list " in
1792 *" $target "*)
1793 ;;
1794 *)
1795 error_exit "Unknown target name '$target'"
1796 ;;
1797 esac
1798 done
1799fi
1800
1801for target in $target_list; do
1802 # if a deprecated target is enabled we note it here
1803 if echo "$deprecated_targets_list" | grep -q "$target"; then
1804 add_to deprecated_features $target
1805 fi
1806done
1807
1808# see if system emulation was really requested
1809case " $target_list " in
1810 *"-softmmu "*) softmmu=yes
1811 ;;
1812 *) softmmu=no
1813 ;;
1814esac
1815
1816feature_not_found() {
1817 feature=$1
1818 remedy=$2
1819
1820 error_exit "User requested feature $feature" \
1821 "configure was not able to find it." \
1822 "$remedy"
1823}
1824
1825# ---
1826# big/little endian test
1827cat > $TMPC << EOF
1828#include <stdio.h>
1829short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, };
1830short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, };
1831int main(int argc, char *argv[])
1832{
1833 return printf("%s %s\n", (char *)big_endian, (char *)little_endian);
1834}
1835EOF
1836
1837if compile_prog ; then
1838 if strings -a $TMPE | grep -q BiGeNdIaN ; then
1839 bigendian="yes"
1840 elif strings -a $TMPE | grep -q LiTtLeEnDiAn ; then
1841 bigendian="no"
1842 else
1843 echo big/little test failed
1844 exit 1
1845 fi
1846else
1847 echo big/little test failed
1848 exit 1
1849fi
1850
1851##########################################
1852# system tools
1853if test -z "$want_tools"; then
1854 if test "$softmmu" = "no"; then
1855 want_tools=no
1856 else
1857 want_tools=yes
1858 fi
1859fi
1860
1861#########################################
1862# vhost interdependencies and host support
1863
1864# vhost backends
1865if test "$vhost_user" = "yes" && test "$linux" != "yes"; then
1866 error_exit "vhost-user is only available on Linux"
1867fi
1868test "$vhost_vdpa" = "" && vhost_vdpa=$linux
1869if test "$vhost_vdpa" = "yes" && test "$linux" != "yes"; then
1870 error_exit "vhost-vdpa is only available on Linux"
1871fi
1872test "$vhost_kernel" = "" && vhost_kernel=$linux
1873if test "$vhost_kernel" = "yes" && test "$linux" != "yes"; then
1874 error_exit "vhost-kernel is only available on Linux"
1875fi
1876
1877# vhost-kernel devices
1878test "$vhost_scsi" = "" && vhost_scsi=$vhost_kernel
1879if test "$vhost_scsi" = "yes" && test "$vhost_kernel" != "yes"; then
1880 error_exit "--enable-vhost-scsi requires --enable-vhost-kernel"
1881fi
1882test "$vhost_vsock" = "" && vhost_vsock=$vhost_kernel
1883if test "$vhost_vsock" = "yes" && test "$vhost_kernel" != "yes"; then
1884 error_exit "--enable-vhost-vsock requires --enable-vhost-kernel"
1885fi
1886
1887# vhost-user backends
1888test "$vhost_net_user" = "" && vhost_net_user=$vhost_user
1889if test "$vhost_net_user" = "yes" && test "$vhost_user" = "no"; then
1890 error_exit "--enable-vhost-net-user requires --enable-vhost-user"
1891fi
1892test "$vhost_crypto" = "" && vhost_crypto=$vhost_user
1893if test "$vhost_crypto" = "yes" && test "$vhost_user" = "no"; then
1894 error_exit "--enable-vhost-crypto requires --enable-vhost-user"
1895fi
1896test "$vhost_user_fs" = "" && vhost_user_fs=$vhost_user
1897if test "$vhost_user_fs" = "yes" && test "$vhost_user" = "no"; then
1898 error_exit "--enable-vhost-user-fs requires --enable-vhost-user"
1899fi
1900#vhost-vdpa backends
1901test "$vhost_net_vdpa" = "" && vhost_net_vdpa=$vhost_vdpa
1902if test "$vhost_net_vdpa" = "yes" && test "$vhost_vdpa" = "no"; then
1903 error_exit "--enable-vhost-net-vdpa requires --enable-vhost-vdpa"
1904fi
1905
1906# OR the vhost-kernel, vhost-vdpa and vhost-user values for simplicity
1907if test "$vhost_net" = ""; then
1908 test "$vhost_net_user" = "yes" && vhost_net=yes
1909 test "$vhost_net_vdpa" = "yes" && vhost_net=yes
1910 test "$vhost_kernel" = "yes" && vhost_net=yes
1911fi
1912
1913##########################################
1914# pkg-config probe
1915
1916if ! has "$pkg_config_exe"; then
1917 error_exit "pkg-config binary '$pkg_config_exe' not found"
1918fi
1919
1920##########################################
1921# xen probe
1922
1923if test "$xen" != "disabled" ; then
1924 # Check whether Xen library path is specified via --extra-ldflags to avoid
1925 # overriding this setting with pkg-config output. If not, try pkg-config
1926 # to obtain all needed flags.
1927
1928 if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
1929 $pkg_config --exists xencontrol ; then
1930 xen_ctrl_version="$(printf '%d%02d%02d' \
1931 $($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
1932 xen=enabled
1933 xen_pc="xencontrol xenstore xenforeignmemory xengnttab"
1934 xen_pc="$xen_pc xenevtchn xendevicemodel"
1935 if $pkg_config --exists xentoolcore; then
1936 xen_pc="$xen_pc xentoolcore"
1937 fi
1938 xen_cflags="$($pkg_config --cflags $xen_pc)"
1939 xen_libs="$($pkg_config --libs $xen_pc)"
1940 else
1941
1942 xen_libs="-lxenstore -lxenctrl"
1943 xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
1944
1945 # First we test whether Xen headers and libraries are available.
1946 # If no, we are done and there is no Xen support.
1947 # If yes, more tests are run to detect the Xen version.
1948
1949 # Xen (any)
1950 cat > $TMPC <<EOF
1951#include <xenctrl.h>
1952int main(void) {
1953 return 0;
1954}
1955EOF
1956 if ! compile_prog "" "$xen_libs" ; then
1957 # Xen not found
1958 if test "$xen" = "enabled" ; then
1959 feature_not_found "xen" "Install xen devel"
1960 fi
1961 xen=disabled
1962
1963 # Xen unstable
1964 elif
1965 cat > $TMPC <<EOF &&
1966#undef XC_WANT_COMPAT_DEVICEMODEL_API
1967#define __XEN_TOOLS__
1968#include <xendevicemodel.h>
1969#include <xenforeignmemory.h>
1970int main(void) {
1971 xendevicemodel_handle *xd;
1972 xenforeignmemory_handle *xfmem;
1973
1974 xd = xendevicemodel_open(0, 0);
1975 xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
1976
1977 xfmem = xenforeignmemory_open(0, 0);
1978 xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
1979
1980 return 0;
1981}
1982EOF
1983 compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
1984 then
1985 xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
1986 xen_ctrl_version=41100
1987 xen=enabled
1988 elif
1989 cat > $TMPC <<EOF &&
1990#undef XC_WANT_COMPAT_MAP_FOREIGN_API
1991#include <xenforeignmemory.h>
1992#include <xentoolcore.h>
1993int main(void) {
1994 xenforeignmemory_handle *xfmem;
1995
1996 xfmem = xenforeignmemory_open(0, 0);
1997 xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
1998 xentoolcore_restrict_all(0);
1999
2000 return 0;
2001}
2002EOF
2003 compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2004 then
2005 xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2006 xen_ctrl_version=41000
2007 xen=enabled
2008 elif
2009 cat > $TMPC <<EOF &&
2010#undef XC_WANT_COMPAT_DEVICEMODEL_API
2011#define __XEN_TOOLS__
2012#include <xendevicemodel.h>
2013int main(void) {
2014 xendevicemodel_handle *xd;
2015
2016 xd = xendevicemodel_open(0, 0);
2017 xendevicemodel_close(xd);
2018
2019 return 0;
2020}
2021EOF
2022 compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
2023 then
2024 xen_stable_libs="-lxendevicemodel $xen_stable_libs"
2025 xen_ctrl_version=40900
2026 xen=enabled
2027 elif
2028 cat > $TMPC <<EOF &&
2029/*
2030 * If we have stable libs the we don't want the libxc compat
2031 * layers, regardless of what CFLAGS we may have been given.
2032 *
2033 * Also, check if xengnttab_grant_copy_segment_t is defined and
2034 * grant copy operation is implemented.
2035 */
2036#undef XC_WANT_COMPAT_EVTCHN_API
2037#undef XC_WANT_COMPAT_GNTTAB_API
2038#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2039#include <xenctrl.h>
2040#include <xenstore.h>
2041#include <xenevtchn.h>
2042#include <xengnttab.h>
2043#include <xenforeignmemory.h>
2044#include <stdint.h>
2045#include <xen/hvm/hvm_info_table.h>
2046#if !defined(HVM_MAX_VCPUS)
2047# error HVM_MAX_VCPUS not defined
2048#endif
2049int main(void) {
2050 xc_interface *xc = NULL;
2051 xenforeignmemory_handle *xfmem;
2052 xenevtchn_handle *xe;
2053 xengnttab_handle *xg;
2054 xengnttab_grant_copy_segment_t* seg = NULL;
2055
2056 xs_daemon_open();
2057
2058 xc = xc_interface_open(0, 0, 0);
2059 xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2060 xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2061 xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2062 xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2063
2064 xfmem = xenforeignmemory_open(0, 0);
2065 xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2066
2067 xe = xenevtchn_open(0, 0);
2068 xenevtchn_fd(xe);
2069
2070 xg = xengnttab_open(0, 0);
2071 xengnttab_grant_copy(xg, 0, seg);
2072
2073 return 0;
2074}
2075EOF
2076 compile_prog "" "$xen_libs $xen_stable_libs"
2077 then
2078 xen_ctrl_version=40800
2079 xen=enabled
2080 elif
2081 cat > $TMPC <<EOF &&
2082/*
2083 * If we have stable libs the we don't want the libxc compat
2084 * layers, regardless of what CFLAGS we may have been given.
2085 */
2086#undef XC_WANT_COMPAT_EVTCHN_API
2087#undef XC_WANT_COMPAT_GNTTAB_API
2088#undef XC_WANT_COMPAT_MAP_FOREIGN_API
2089#include <xenctrl.h>
2090#include <xenstore.h>
2091#include <xenevtchn.h>
2092#include <xengnttab.h>
2093#include <xenforeignmemory.h>
2094#include <stdint.h>
2095#include <xen/hvm/hvm_info_table.h>
2096#if !defined(HVM_MAX_VCPUS)
2097# error HVM_MAX_VCPUS not defined
2098#endif
2099int main(void) {
2100 xc_interface *xc = NULL;
2101 xenforeignmemory_handle *xfmem;
2102 xenevtchn_handle *xe;
2103 xengnttab_handle *xg;
2104
2105 xs_daemon_open();
2106
2107 xc = xc_interface_open(0, 0, 0);
2108 xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2109 xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2110 xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2111 xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2112
2113 xfmem = xenforeignmemory_open(0, 0);
2114 xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2115
2116 xe = xenevtchn_open(0, 0);
2117 xenevtchn_fd(xe);
2118
2119 xg = xengnttab_open(0, 0);
2120 xengnttab_map_grant_ref(xg, 0, 0, 0);
2121
2122 return 0;
2123}
2124EOF
2125 compile_prog "" "$xen_libs $xen_stable_libs"
2126 then
2127 xen_ctrl_version=40701
2128 xen=enabled
2129
2130 # Xen 4.6
2131 elif
2132 cat > $TMPC <<EOF &&
2133#include <xenctrl.h>
2134#include <xenstore.h>
2135#include <stdint.h>
2136#include <xen/hvm/hvm_info_table.h>
2137#if !defined(HVM_MAX_VCPUS)
2138# error HVM_MAX_VCPUS not defined
2139#endif
2140int main(void) {
2141 xc_interface *xc;
2142 xs_daemon_open();
2143 xc = xc_interface_open(0, 0, 0);
2144 xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2145 xc_gnttab_open(NULL, 0);
2146 xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2147 xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2148 xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2149 xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
2150 return 0;
2151}
2152EOF
2153 compile_prog "" "$xen_libs"
2154 then
2155 xen_ctrl_version=40600
2156 xen=enabled
2157
2158 # Xen 4.5
2159 elif
2160 cat > $TMPC <<EOF &&
2161#include <xenctrl.h>
2162#include <xenstore.h>
2163#include <stdint.h>
2164#include <xen/hvm/hvm_info_table.h>
2165#if !defined(HVM_MAX_VCPUS)
2166# error HVM_MAX_VCPUS not defined
2167#endif
2168int main(void) {
2169 xc_interface *xc;
2170 xs_daemon_open();
2171 xc = xc_interface_open(0, 0, 0);
2172 xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2173 xc_gnttab_open(NULL, 0);
2174 xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2175 xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2176 xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
2177 return 0;
2178}
2179EOF
2180 compile_prog "" "$xen_libs"
2181 then
2182 xen_ctrl_version=40500
2183 xen=enabled
2184
2185 elif
2186 cat > $TMPC <<EOF &&
2187#include <xenctrl.h>
2188#include <xenstore.h>
2189#include <stdint.h>
2190#include <xen/hvm/hvm_info_table.h>
2191#if !defined(HVM_MAX_VCPUS)
2192# error HVM_MAX_VCPUS not defined
2193#endif
2194int main(void) {
2195 xc_interface *xc;
2196 xs_daemon_open();
2197 xc = xc_interface_open(0, 0, 0);
2198 xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2199 xc_gnttab_open(NULL, 0);
2200 xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2201 xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2202 return 0;
2203}
2204EOF
2205 compile_prog "" "$xen_libs"
2206 then
2207 xen_ctrl_version=40200
2208 xen=enabled
2209
2210 else
2211 if test "$xen" = "enabled" ; then
2212 feature_not_found "xen (unsupported version)" \
2213 "Install a supported xen (xen 4.2 or newer)"
2214 fi
2215 xen=disabled
2216 fi
2217
2218 if test "$xen" = enabled; then
2219 if test $xen_ctrl_version -ge 40701 ; then
2220 xen_libs="$xen_libs $xen_stable_libs "
2221 fi
2222 fi
2223 fi
2224fi
2225
2226##########################################
2227# RDMA needs OpenFabrics libraries
2228if test "$rdma" != "no" ; then
2229 cat > $TMPC <<EOF
2230#include <rdma/rdma_cma.h>
2231int main(void) { return 0; }
2232EOF
2233 rdma_libs="-lrdmacm -libverbs -libumad"
2234 if compile_prog "" "$rdma_libs" ; then
2235 rdma="yes"
2236 else
2237 if test "$rdma" = "yes" ; then
2238 error_exit \
2239 " OpenFabrics librdmacm/libibverbs/libibumad not present." \
2240 " Your options:" \
2241 " (1) Fast: Install infiniband packages (devel) from your distro." \
2242 " (2) Cleanest: Install libraries from www.openfabrics.org" \
2243 " (3) Also: Install softiwarp if you don't have RDMA hardware"
2244 fi
2245 rdma="no"
2246 fi
2247fi
2248
2249##########################################
2250# PVRDMA detection
2251
2252cat > $TMPC <<EOF &&
2253#include <sys/mman.h>
2254
2255int
2256main(void)
2257{
2258 char buf = 0;
2259 void *addr = &buf;
2260 addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
2261
2262 return 0;
2263}
2264EOF
2265
2266if test "$rdma" = "yes" ; then
2267 case "$pvrdma" in
2268 "")
2269 if compile_prog "" ""; then
2270 pvrdma="yes"
2271 else
2272 pvrdma="no"
2273 fi
2274 ;;
2275 "yes")
2276 if ! compile_prog "" ""; then
2277 error_exit "PVRDMA is not supported since mremap is not implemented"
2278 fi
2279 pvrdma="yes"
2280 ;;
2281 "no")
2282 pvrdma="no"
2283 ;;
2284 esac
2285else
2286 if test "$pvrdma" = "yes" ; then
2287 error_exit "PVRDMA requires rdma suppport"
2288 fi
2289 pvrdma="no"
2290fi
2291
2292# Let's see if enhanced reg_mr is supported
2293if test "$pvrdma" = "yes" ; then
2294
2295cat > $TMPC <<EOF &&
2296#include <infiniband/verbs.h>
2297
2298int
2299main(void)
2300{
2301 struct ibv_mr *mr;
2302 struct ibv_pd *pd = NULL;
2303 size_t length = 10;
2304 uint64_t iova = 0;
2305 int access = 0;
2306 void *addr = NULL;
2307
2308 mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
2309
2310 ibv_dereg_mr(mr);
2311
2312 return 0;
2313}
2314EOF
2315 if ! compile_prog "" "-libverbs"; then
2316 QEMU_CFLAGS="$QEMU_CFLAGS -DLEGACY_RDMA_REG_MR"
2317 fi
2318fi
2319
2320##########################################
2321# glib support probe
2322
2323glib_req_ver=2.56
2324glib_modules=gthread-2.0
2325if test "$modules" = yes; then
2326 glib_modules="$glib_modules gmodule-export-2.0"
2327elif test "$plugins" = "yes"; then
2328 glib_modules="$glib_modules gmodule-no-export-2.0"
2329fi
2330
2331for i in $glib_modules; do
2332 if $pkg_config --atleast-version=$glib_req_ver $i; then
2333 glib_cflags=$($pkg_config --cflags $i)
2334 glib_libs=$($pkg_config --libs $i)
2335 else
2336 error_exit "glib-$glib_req_ver $i is required to compile QEMU"
2337 fi
2338done
2339
2340# This workaround is required due to a bug in pkg-config file for glib as it
2341# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
2342
2343if test "$static" = yes && test "$mingw32" = yes; then
2344 glib_cflags="-DGLIB_STATIC_COMPILATION $glib_cflags"
2345fi
2346
2347if ! test "$gio" = "no"; then
2348 pass=no
2349 if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
2350 gio_cflags=$($pkg_config --cflags gio-2.0)
2351 gio_libs=$($pkg_config --libs gio-2.0)
2352 gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
2353 if ! has "$gdbus_codegen"; then
2354 gdbus_codegen=
2355 fi
2356 # Check that the libraries actually work -- Ubuntu 18.04 ships
2357 # with pkg-config --static --libs data for gio-2.0 that is missing
2358 # -lblkid and will give a link error.
2359 cat > $TMPC <<EOF
2360#include <gio/gio.h>
2361int main(void)
2362{
2363 g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
2364 return 0;
2365}
2366EOF
2367 if compile_prog "$gio_cflags" "$gio_libs" ; then
2368 pass=yes
2369 else
2370 pass=no
2371 fi
2372
2373 if test "$pass" = "yes" &&
2374 $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
2375 gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
2376 gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
2377 fi
2378 fi
2379
2380 if test "$pass" = "no"; then
2381 if test "$gio" = "yes"; then
2382 feature_not_found "gio" "Install libgio >= 2.0"
2383 else
2384 gio=no
2385 fi
2386 else
2387 gio=yes
2388 fi
2389fi
2390
2391# Sanity check that the current size_t matches the
2392# size that glib thinks it should be. This catches
2393# problems on multi-arch where people try to build
2394# 32-bit QEMU while pointing at 64-bit glib headers
2395cat > $TMPC <<EOF
2396#include <glib.h>
2397#include <unistd.h>
2398
2399#define QEMU_BUILD_BUG_ON(x) \
2400 typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
2401
2402int main(void) {
2403 QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
2404 return 0;
2405}
2406EOF
2407
2408if ! compile_prog "$glib_cflags" "$glib_libs" ; then
2409 error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
2410 "You probably need to set PKG_CONFIG_LIBDIR"\
2411 "to point to the right pkg-config files for your"\
2412 "build target"
2413fi
2414
2415# Silence clang warnings triggered by glib < 2.57.2
2416cat > $TMPC << EOF
2417#include <glib.h>
2418typedef struct Foo {
2419 int i;
2420} Foo;
2421static void foo_free(Foo *f)
2422{
2423 g_free(f);
2424}
2425G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free);
2426int main(void) { return 0; }
2427EOF
2428if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
2429 if cc_has_warning_flag "-Wno-unused-function"; then
2430 glib_cflags="$glib_cflags -Wno-unused-function"
2431 CONFIGURE_CFLAGS="$CONFIGURE_CFLAGS -Wno-unused-function"
2432 fi
2433fi
2434
2435##########################################
2436# SHA command probe for modules
2437if test "$modules" = yes; then
2438 shacmd_probe="sha1sum sha1 shasum"
2439 for c in $shacmd_probe; do
2440 if has $c; then
2441 shacmd="$c"
2442 break
2443 fi
2444 done
2445 if test "$shacmd" = ""; then
2446 error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
2447 fi
2448fi
2449
2450##########################################
2451# TPM emulation is only on POSIX
2452
2453if test "$tpm" = ""; then
2454 if test "$mingw32" = "yes"; then
2455 tpm=no
2456 else
2457 tpm=yes
2458 fi
2459elif test "$tpm" = "yes"; then
2460 if test "$mingw32" = "yes" ; then
2461 error_exit "TPM emulation only available on POSIX systems"
2462 fi
2463fi
2464
2465##########################################
2466# fdt probe
2467
2468case "$fdt" in
2469 auto | enabled | internal)
2470 # Simpler to always update submodule, even if not needed.
2471 git_submodules="${git_submodules} dtc"
2472 ;;
2473esac
2474
2475##########################################
2476# opengl probe (for sdl2, gtk)
2477
2478if test "$opengl" != "no" ; then
2479 epoxy=no
2480 if $pkg_config epoxy; then
2481 cat > $TMPC << EOF
2482#include <epoxy/egl.h>
2483int main(void) { return 0; }
2484EOF
2485 if compile_prog "" "" ; then
2486 epoxy=yes
2487 fi
2488 fi
2489
2490 if test "$epoxy" = "yes" ; then
2491 opengl_cflags="$($pkg_config --cflags epoxy)"
2492 opengl_libs="$($pkg_config --libs epoxy)"
2493 opengl=yes
2494 else
2495 if test "$opengl" = "yes" ; then
2496 feature_not_found "opengl" "Please install epoxy with EGL"
2497 fi
2498 opengl_cflags=""
2499 opengl_libs=""
2500 opengl=no
2501 fi
2502fi
2503
2504##########################################
2505# libnuma probe
2506
2507if test "$numa" != "no" ; then
2508 cat > $TMPC << EOF
2509#include <numa.h>
2510int main(void) { return numa_available(); }
2511EOF
2512
2513 if compile_prog "" "-lnuma" ; then
2514 numa=yes
2515 numa_libs="-lnuma"
2516 else
2517 if test "$numa" = "yes" ; then
2518 feature_not_found "numa" "install numactl devel"
2519 fi
2520 numa=no
2521 fi
2522fi
2523
2524# check for usbfs
2525have_usbfs=no
2526if test "$linux_user" = "yes"; then
2527 cat > $TMPC << EOF
2528#include <linux/usbdevice_fs.h>
2529
2530#ifndef USBDEVFS_GET_CAPABILITIES
2531#error "USBDEVFS_GET_CAPABILITIES undefined"
2532#endif
2533
2534#ifndef USBDEVFS_DISCONNECT_CLAIM
2535#error "USBDEVFS_DISCONNECT_CLAIM undefined"
2536#endif
2537
2538int main(void)
2539{
2540 return 0;
2541}
2542EOF
2543 if compile_prog "" ""; then
2544 have_usbfs=yes
2545 fi
2546fi
2547
2548##########################################
2549# check if we have VSS SDK headers for win
2550
2551if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
2552 test "$vss_win32_sdk" != "no" ; then
2553 case "$vss_win32_sdk" in
2554 "") vss_win32_include="-isystem $source_path" ;;
2555 *\ *) # The SDK is installed in "Program Files" by default, but we cannot
2556 # handle path with spaces. So we symlink the headers into ".sdk/vss".
2557 vss_win32_include="-isystem $source_path/.sdk/vss"
2558 symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
2559 ;;
2560 *) vss_win32_include="-isystem $vss_win32_sdk"
2561 esac
2562 cat > $TMPC << EOF
2563#define __MIDL_user_allocate_free_DEFINED__
2564#include <inc/win2003/vss.h>
2565int main(void) { return VSS_CTX_BACKUP; }
2566EOF
2567 if compile_prog "$vss_win32_include" "" ; then
2568 guest_agent_with_vss="yes"
2569 QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
2570 libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
2571 qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
2572 else
2573 if test "$vss_win32_sdk" != "" ; then
2574 echo "ERROR: Please download and install Microsoft VSS SDK:"
2575 echo "ERROR: http://www.microsoft.com/en-us/download/details.aspx?id=23490"
2576 echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
2577 echo "ERROR: scripts/extract-vsssdk-headers setup.exe"
2578 echo "ERROR: The headers are extracted in the directory \`inc'."
2579 feature_not_found "VSS support"
2580 fi
2581 guest_agent_with_vss="no"
2582 fi
2583fi
2584
2585##########################################
2586# lookup Windows platform SDK (if not specified)
2587# The SDK is needed only to build .tlb (type library) file of guest agent
2588# VSS provider from the source. It is usually unnecessary because the
2589# pre-compiled .tlb file is included.
2590
2591if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
2592 test "$guest_agent_with_vss" = "yes" ; then
2593 if test -z "$win_sdk"; then
2594 programfiles="$PROGRAMFILES"
2595 test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
2596 if test -n "$programfiles"; then
2597 win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
2598 else
2599 feature_not_found "Windows SDK"
2600 fi
2601 elif test "$win_sdk" = "no"; then
2602 win_sdk=""
2603 fi
2604fi
2605
2606##########################################
2607# check if mingw environment provides a recent ntddscsi.h
2608if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
2609 cat > $TMPC << EOF
2610#include <windows.h>
2611#include <ntddscsi.h>
2612int main(void) {
2613#if !defined(IOCTL_SCSI_GET_ADDRESS)
2614#error Missing required ioctl definitions
2615#endif
2616 SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
2617 return addr.Lun;
2618}
2619EOF
2620 if compile_prog "" "" ; then
2621 guest_agent_ntddscsi=yes
2622 libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
2623 fi
2624fi
2625
2626##########################################
2627# capstone
2628
2629case "$capstone" in
2630 auto | enabled | internal)
2631 # Simpler to always update submodule, even if not needed.
2632 git_submodules="${git_submodules} capstone"
2633 ;;
2634esac
2635
2636##########################################
2637# check and set a backend for coroutine
2638
2639# We prefer ucontext, but it's not always possible. The fallback
2640# is sigcontext. On Windows the only valid backend is the Windows
2641# specific one.
2642
2643ucontext_works=no
2644if test "$darwin" != "yes"; then
2645 cat > $TMPC << EOF
2646#include <ucontext.h>
2647#ifdef __stub_makecontext
2648#error Ignoring glibc stub makecontext which will always fail
2649#endif
2650int main(void) { makecontext(0, 0, 0); return 0; }
2651EOF
2652 if compile_prog "" "" ; then
2653 ucontext_works=yes
2654 fi
2655fi
2656
2657if test "$coroutine" = ""; then
2658 if test "$mingw32" = "yes"; then
2659 coroutine=win32
2660 elif test "$ucontext_works" = "yes"; then
2661 coroutine=ucontext
2662 else
2663 coroutine=sigaltstack
2664 fi
2665else
2666 case $coroutine in
2667 windows)
2668 if test "$mingw32" != "yes"; then
2669 error_exit "'windows' coroutine backend only valid for Windows"
2670 fi
2671 # Unfortunately the user visible backend name doesn't match the
2672 # coroutine-*.c filename for this case, so we have to adjust it here.
2673 coroutine=win32
2674 ;;
2675 ucontext)
2676 if test "$ucontext_works" != "yes"; then
2677 feature_not_found "ucontext"
2678 fi
2679 ;;
2680 sigaltstack)
2681 if test "$mingw32" = "yes"; then
2682 error_exit "only the 'windows' coroutine backend is valid for Windows"
2683 fi
2684 ;;
2685 *)
2686 error_exit "unknown coroutine backend $coroutine"
2687 ;;
2688 esac
2689fi
2690
2691if test "$coroutine_pool" = ""; then
2692 coroutine_pool=yes
2693fi
2694
2695if test "$debug_stack_usage" = "yes"; then
2696 if test "$coroutine_pool" = "yes"; then
2697 echo "WARN: disabling coroutine pool for stack usage debugging"
2698 coroutine_pool=no
2699 fi
2700fi
2701
2702##################################################
2703# SafeStack
2704
2705
2706if test "$safe_stack" = "yes"; then
2707cat > $TMPC << EOF
2708int main(int argc, char *argv[])
2709{
2710#if ! __has_feature(safe_stack)
2711#error SafeStack Disabled
2712#endif
2713 return 0;
2714}
2715EOF
2716 flag="-fsanitize=safe-stack"
2717 # Check that safe-stack is supported and enabled.
2718 if compile_prog "-Werror $flag" "$flag"; then
2719 # Flag needed both at compilation and at linking
2720 QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2721 QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
2722 else
2723 error_exit "SafeStack not supported by your compiler"
2724 fi
2725 if test "$coroutine" != "ucontext"; then
2726 error_exit "SafeStack is only supported by the coroutine backend ucontext"
2727 fi
2728else
2729cat > $TMPC << EOF
2730int main(int argc, char *argv[])
2731{
2732#if defined(__has_feature)
2733#if __has_feature(safe_stack)
2734#error SafeStack Enabled
2735#endif
2736#endif
2737 return 0;
2738}
2739EOF
2740if test "$safe_stack" = "no"; then
2741 # Make sure that safe-stack is disabled
2742 if ! compile_prog "-Werror" ""; then
2743 # SafeStack was already enabled, try to explicitly remove the feature
2744 flag="-fno-sanitize=safe-stack"
2745 if ! compile_prog "-Werror $flag" "$flag"; then
2746 error_exit "Configure cannot disable SafeStack"
2747 fi
2748 QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2749 QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
2750 fi
2751else # "$safe_stack" = ""
2752 # Set safe_stack to yes or no based on pre-existing flags
2753 if compile_prog "-Werror" ""; then
2754 safe_stack="no"
2755 else
2756 safe_stack="yes"
2757 if test "$coroutine" != "ucontext"; then
2758 error_exit "SafeStack is only supported by the coroutine backend ucontext"
2759 fi
2760 fi
2761fi
2762fi
2763
2764########################################
2765# check if cpuid.h is usable.
2766
2767cat > $TMPC << EOF
2768#include <cpuid.h>
2769int main(void) {
2770 unsigned a, b, c, d;
2771 int max = __get_cpuid_max(0, 0);
2772
2773 if (max >= 1) {
2774 __cpuid(1, a, b, c, d);
2775 }
2776
2777 if (max >= 7) {
2778 __cpuid_count(7, 0, a, b, c, d);
2779 }
2780
2781 return 0;
2782}
2783EOF
2784if compile_prog "" "" ; then
2785 cpuid_h=yes
2786fi
2787
2788##########################################
2789# avx2 optimization requirement check
2790#
2791# There is no point enabling this if cpuid.h is not usable,
2792# since we won't be able to select the new routines.
2793
2794if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
2795 cat > $TMPC << EOF
2796#pragma GCC push_options
2797#pragma GCC target("avx2")
2798#include <cpuid.h>
2799#include <immintrin.h>
2800static int bar(void *a) {
2801 __m256i x = *(__m256i *)a;
2802 return _mm256_testz_si256(x, x);
2803}
2804int main(int argc, char *argv[]) { return bar(argv[0]); }
2805EOF
2806 if compile_object "-Werror" ; then
2807 avx2_opt="yes"
2808 else
2809 avx2_opt="no"
2810 fi
2811fi
2812
2813##########################################
2814# avx512f optimization requirement check
2815#
2816# There is no point enabling this if cpuid.h is not usable,
2817# since we won't be able to select the new routines.
2818# by default, it is turned off.
2819# if user explicitly want to enable it, check environment
2820
2821if test "$cpuid_h" = "yes" && test "$avx512f_opt" = "yes"; then
2822 cat > $TMPC << EOF
2823#pragma GCC push_options
2824#pragma GCC target("avx512f")
2825#include <cpuid.h>
2826#include <immintrin.h>
2827static int bar(void *a) {
2828 __m512i x = *(__m512i *)a;
2829 return _mm512_test_epi64_mask(x, x);
2830}
2831int main(int argc, char *argv[])
2832{
2833 return bar(argv[0]);
2834}
2835EOF
2836 if ! compile_object "-Werror" ; then
2837 avx512f_opt="no"
2838 fi
2839else
2840 avx512f_opt="no"
2841fi
2842
2843########################################
2844# check if __[u]int128_t is usable.
2845
2846int128=no
2847cat > $TMPC << EOF
2848__int128_t a;
2849__uint128_t b;
2850int main (void) {
2851 a = a + b;
2852 b = a * b;
2853 a = a * a;
2854 return 0;
2855}
2856EOF
2857if compile_prog "" "" ; then
2858 int128=yes
2859fi
2860
2861#########################################
2862# See if 128-bit atomic operations are supported.
2863
2864atomic128=no
2865if test "$int128" = "yes"; then
2866 cat > $TMPC << EOF
2867int main(void)
2868{
2869 unsigned __int128 x = 0, y = 0;
2870 y = __atomic_load(&x, 0);
2871 __atomic_store(&x, y, 0);
2872 __atomic_compare_exchange(&x, &y, x, 0, 0, 0);
2873 return 0;
2874}
2875EOF
2876 if compile_prog "" "" ; then
2877 atomic128=yes
2878 fi
2879fi
2880
2881cmpxchg128=no
2882if test "$int128" = yes && test "$atomic128" = no; then
2883 cat > $TMPC << EOF
2884int main(void)
2885{
2886 unsigned __int128 x = 0, y = 0;
2887 __sync_val_compare_and_swap_16(&x, y, x);
2888 return 0;
2889}
2890EOF
2891 if compile_prog "" "" ; then
2892 cmpxchg128=yes
2893 fi
2894fi
2895
2896########################################
2897# check if ccache is interfering with
2898# semantic analysis of macros
2899
2900unset CCACHE_CPP2
2901ccache_cpp2=no
2902cat > $TMPC << EOF
2903static const int Z = 1;
2904#define fn() ({ Z; })
2905#define TAUT(X) ((X) == Z)
2906#define PAREN(X, Y) (X == Y)
2907#define ID(X) (X)
2908int main(int argc, char *argv[])
2909{
2910 int x = 0, y = 0;
2911 x = ID(x);
2912 x = fn();
2913 fn();
2914 if (PAREN(x, y)) return 0;
2915 if (TAUT(Z)) return 0;
2916 return 0;
2917}
2918EOF
2919
2920if ! compile_object "-Werror"; then
2921 ccache_cpp2=yes
2922fi
2923
2924#################################################
2925# clang does not support glibc + FORTIFY_SOURCE.
2926
2927if test "$fortify_source" != "no"; then
2928 if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
2929 fortify_source="no";
2930 elif test -n "$cxx" && has $cxx &&
2931 echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
2932 fortify_source="no";
2933 else
2934 fortify_source="yes"
2935 fi
2936fi
2937
2938##########################################
2939# check for usable membarrier system call
2940if test "$membarrier" = "yes"; then
2941 have_membarrier=no
2942 if test "$mingw32" = "yes" ; then
2943 have_membarrier=yes
2944 elif test "$linux" = "yes" ; then
2945 cat > $TMPC << EOF
2946 #include <linux/membarrier.h>
2947 #include <sys/syscall.h>
2948 #include <unistd.h>
2949 #include <stdlib.h>
2950 int main(void) {
2951 syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
2952 syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
2953 exit(0);
2954 }
2955EOF
2956 if compile_prog "" "" ; then
2957 have_membarrier=yes
2958 fi
2959 fi
2960 if test "$have_membarrier" = "no"; then
2961 feature_not_found "membarrier" "membarrier system call not available"
2962 fi
2963else
2964 # Do not enable it by default even for Mingw32, because it doesn't
2965 # work on Wine.
2966 membarrier=no
2967fi
2968
2969##########################################
2970# check for usable AF_ALG environment
2971have_afalg=no
2972cat > $TMPC << EOF
2973#include <errno.h>
2974#include <sys/types.h>
2975#include <sys/socket.h>
2976#include <linux/if_alg.h>
2977int main(void) {
2978 int sock;
2979 sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
2980 return sock;
2981}
2982EOF
2983if compile_prog "" "" ; then
2984 have_afalg=yes
2985fi
2986if test "$crypto_afalg" = "yes"
2987then
2988 if test "$have_afalg" != "yes"
2989 then
2990 error_exit "AF_ALG requested but could not be detected"
2991 fi
2992fi
2993
2994
2995##########################################
2996# checks for sanitizers
2997
2998have_asan=no
2999have_ubsan=no
3000have_asan_iface_h=no
3001have_asan_iface_fiber=no
3002
3003if test "$sanitizers" = "yes" ; then
3004 write_c_skeleton
3005 if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
3006 have_asan=yes
3007 fi
3008
3009 # we could use a simple skeleton for flags checks, but this also
3010 # detect the static linking issue of ubsan, see also:
3011 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
3012 cat > $TMPC << EOF
3013#include <stdlib.h>
3014int main(void) {
3015 void *tmp = malloc(10);
3016 if (tmp != NULL) {
3017 return *(int *)(tmp + 2);
3018 }
3019 return 1;
3020}
3021EOF
3022 if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
3023 have_ubsan=yes
3024 fi
3025
3026 if check_include "sanitizer/asan_interface.h" ; then
3027 have_asan_iface_h=yes
3028 fi
3029
3030 cat > $TMPC << EOF
3031#include <sanitizer/asan_interface.h>
3032int main(void) {
3033 __sanitizer_start_switch_fiber(0, 0, 0);
3034 return 0;
3035}
3036EOF
3037 if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
3038 have_asan_iface_fiber=yes
3039 fi
3040fi
3041
3042# Thread sanitizer is, for now, much noisier than the other sanitizers;
3043# keep it separate until that is not the case.
3044if test "$tsan" = "yes" && test "$sanitizers" = "yes"; then
3045 error_exit "TSAN is not supported with other sanitiziers."
3046fi
3047have_tsan=no
3048have_tsan_iface_fiber=no
3049if test "$tsan" = "yes" ; then
3050 write_c_skeleton
3051 if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
3052 have_tsan=yes
3053 fi
3054 cat > $TMPC << EOF
3055#include <sanitizer/tsan_interface.h>
3056int main(void) {
3057 __tsan_create_fiber(0);
3058 return 0;
3059}
3060EOF
3061 if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
3062 have_tsan_iface_fiber=yes
3063 fi
3064fi
3065
3066##########################################
3067# check for slirp
3068
3069case "$slirp" in
3070 auto | enabled | internal)
3071 # Simpler to always update submodule, even if not needed.
3072 git_submodules="${git_submodules} slirp"
3073 ;;
3074esac
3075
3076# Check for slirp smbd dupport
3077: ${smbd=${SMBD-/usr/sbin/smbd}}
3078if test "$slirp_smbd" != "no" ; then
3079 if test "$mingw32" = "yes" ; then
3080 if test "$slirp_smbd" = "yes" ; then
3081 error_exit "Host smbd not supported on this platform."
3082 fi
3083 slirp_smbd=no
3084 else
3085 slirp_smbd=yes
3086 fi
3087fi
3088
3089##########################################
3090# check for usable __NR_keyctl syscall
3091
3092if test "$linux" = "yes" ; then
3093
3094 have_keyring=no
3095 cat > $TMPC << EOF
3096#include <errno.h>
3097#include <asm/unistd.h>
3098#include <linux/keyctl.h>
3099#include <unistd.h>
3100int main(void) {
3101 return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
3102}
3103EOF
3104 if compile_prog "" "" ; then
3105 have_keyring=yes
3106 fi
3107fi
3108if test "$secret_keyring" != "no"
3109then
3110 if test "$have_keyring" = "yes"
3111 then
3112 secret_keyring=yes
3113 else
3114 if test "$secret_keyring" = "yes"
3115 then
3116 error_exit "syscall __NR_keyctl requested, \
3117but not implemented on your system"
3118 else
3119 secret_keyring=no
3120 fi
3121 fi
3122fi
3123
3124##########################################
3125# End of CC checks
3126# After here, no more $cc or $ld runs
3127
3128write_c_skeleton
3129
3130if test "$gcov" = "yes" ; then
3131 :
3132elif test "$fortify_source" = "yes" ; then
3133 QEMU_CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $QEMU_CFLAGS"
3134 debug=no
3135fi
3136
3137case "$ARCH" in
3138alpha)
3139 # Ensure there's only a single GP
3140 QEMU_CFLAGS="-msmall-data $QEMU_CFLAGS"
3141;;
3142esac
3143
3144if test "$gprof" = "yes" ; then
3145 QEMU_CFLAGS="-p $QEMU_CFLAGS"
3146 QEMU_LDFLAGS="-p $QEMU_LDFLAGS"
3147fi
3148
3149if test "$have_asan" = "yes"; then
3150 QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
3151 QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
3152 if test "$have_asan_iface_h" = "no" ; then
3153 echo "ASAN build enabled, but ASAN header missing." \
3154 "Without code annotation, the report may be inferior."
3155 elif test "$have_asan_iface_fiber" = "no" ; then
3156 echo "ASAN build enabled, but ASAN header is too old." \
3157 "Without code annotation, the report may be inferior."
3158 fi
3159fi
3160if test "$have_tsan" = "yes" ; then
3161 if test "$have_tsan_iface_fiber" = "yes" ; then
3162 QEMU_CFLAGS="-fsanitize=thread $QEMU_CFLAGS"
3163 QEMU_LDFLAGS="-fsanitize=thread $QEMU_LDFLAGS"
3164 else
3165 error_exit "Cannot enable TSAN due to missing fiber annotation interface."
3166 fi
3167elif test "$tsan" = "yes" ; then
3168 error_exit "Cannot enable TSAN due to missing sanitize thread interface."
3169fi
3170if test "$have_ubsan" = "yes"; then
3171 QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS"
3172 QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
3173fi
3174
3175##########################################
3176
3177# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
3178if test "$solaris" = "no" && test "$tsan" = "no"; then
3179 if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
3180 QEMU_LDFLAGS="-Wl,--warn-common $QEMU_LDFLAGS"
3181 fi
3182fi
3183
3184# Use ASLR, no-SEH and DEP if available
3185if test "$mingw32" = "yes" ; then
3186 flags="--no-seh --nxcompat"
3187
3188 # Disable ASLR for debug builds to allow debugging with gdb
3189 if test "$debug" = "no" ; then
3190 flags="--dynamicbase $flags"
3191 fi
3192
3193 for flag in $flags; do
3194 if ld_has $flag ; then
3195 QEMU_LDFLAGS="-Wl,$flag $QEMU_LDFLAGS"
3196 fi
3197 done
3198fi
3199
3200# Probe for guest agent support/options
3201
3202if [ "$guest_agent" != "no" ]; then
3203 if [ "$softmmu" = no -a "$want_tools" = no ] ; then
3204 guest_agent=no
3205 elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
3206 guest_agent=yes
3207 elif [ "$guest_agent" != yes ]; then
3208 guest_agent=no
3209 else
3210 error_exit "Guest agent is not supported on this platform"
3211 fi
3212fi
3213
3214# Guest agent Windows MSI package
3215
3216if test "$QEMU_GA_MANUFACTURER" = ""; then
3217 QEMU_GA_MANUFACTURER=QEMU
3218fi
3219if test "$QEMU_GA_DISTRO" = ""; then
3220 QEMU_GA_DISTRO=Linux
3221fi
3222if test "$QEMU_GA_VERSION" = ""; then
3223 QEMU_GA_VERSION=$(cat $source_path/VERSION)
3224fi
3225
3226QEMU_GA_MSI_MINGW_DLL_PATH="$($pkg_config --variable=prefix glib-2.0)/bin"
3227
3228# Mac OS X ships with a broken assembler
3229roms=
3230if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
3231 test "$targetos" != "darwin" && test "$targetos" != "sunos" && \
3232 test "$targetos" != "haiku" && test "$softmmu" = yes ; then
3233 # Different host OS linkers have different ideas about the name of the ELF
3234 # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
3235 # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
3236 for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
3237 if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
3238 ld_i386_emulation="$emu"
3239 roms="optionrom"
3240 break
3241 fi
3242 done
3243fi
3244
3245# Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
3246# or -march=z10 (which is the lowest architecture level that Clang supports)
3247if test "$cpu" = "s390x" ; then
3248 write_c_skeleton
3249 compile_prog "-march=z900" ""
3250 has_z900=$?
3251 if [ $has_z900 = 0 ] || compile_object "-march=z10 -msoft-float -Werror"; then
3252 if [ $has_z900 != 0 ]; then
3253 echo "WARNING: Your compiler does not support the z900!"
3254 echo " The s390-ccw bios will only work with guest CPUs >= z10."
3255 fi
3256 roms="$roms s390-ccw"
3257 # SLOF is required for building the s390-ccw firmware on s390x,
3258 # since it is using the libnet code from SLOF for network booting.
3259 git_submodules="${git_submodules} roms/SLOF"
3260 fi
3261fi
3262
3263# Check that the C++ compiler exists and works with the C compiler.
3264# All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
3265if has $cxx; then
3266 cat > $TMPC <<EOF
3267int c_function(void);
3268int main(void) { return c_function(); }
3269EOF
3270
3271 compile_object
3272
3273 cat > $TMPCXX <<EOF
3274extern "C" {
3275 int c_function(void);
3276}
3277int c_function(void) { return 42; }
3278EOF
3279
3280 update_cxxflags
3281
3282 if do_cxx $CXXFLAGS $EXTRA_CXXFLAGS $CONFIGURE_CXXFLAGS $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
3283 # C++ compiler $cxx works ok with C compiler $cc
3284 :
3285 else
3286 echo "C++ compiler $cxx does not work with C compiler $cc"
3287 echo "Disabling C++ specific optional code"
3288 cxx=
3289 fi
3290else
3291 echo "No C++ compiler available; disabling C++ specific optional code"
3292 cxx=
3293fi
3294
3295if !(GIT="$git" "$source_path/scripts/git-submodule.sh" "$git_submodules_action" "$git_submodules"); then
3296 exit 1
3297fi
3298
3299config_host_mak="config-host.mak"
3300
3301echo "# Automatically generated by configure - do not modify" > $config_host_mak
3302echo >> $config_host_mak
3303
3304echo all: >> $config_host_mak
3305echo "GIT=$git" >> $config_host_mak
3306echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
3307echo "GIT_SUBMODULES_ACTION=$git_submodules_action" >> $config_host_mak
3308
3309if test "$debug_tcg" = "yes" ; then
3310 echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
3311fi
3312if test "$strip_opt" = "yes" ; then
3313 echo "STRIP=${strip}" >> $config_host_mak
3314fi
3315if test "$mingw32" = "yes" ; then
3316 echo "CONFIG_WIN32=y" >> $config_host_mak
3317 if test "$guest_agent_with_vss" = "yes" ; then
3318 echo "CONFIG_QGA_VSS=y" >> $config_host_mak
3319 echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
3320 echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
3321 fi
3322 if test "$guest_agent_ntddscsi" = "yes" ; then
3323 echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
3324 fi
3325 echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
3326 echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
3327 echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
3328 echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
3329else
3330 echo "CONFIG_POSIX=y" >> $config_host_mak
3331fi
3332
3333if test "$linux" = "yes" ; then
3334 echo "CONFIG_LINUX=y" >> $config_host_mak
3335fi
3336
3337if test "$darwin" = "yes" ; then
3338 echo "CONFIG_DARWIN=y" >> $config_host_mak
3339fi
3340
3341if test "$solaris" = "yes" ; then
3342 echo "CONFIG_SOLARIS=y" >> $config_host_mak
3343fi
3344if test "$static" = "yes" ; then
3345 echo "CONFIG_STATIC=y" >> $config_host_mak
3346fi
3347if test "$profiler" = "yes" ; then
3348 echo "CONFIG_PROFILER=y" >> $config_host_mak
3349fi
3350if test "$want_tools" = "yes" ; then
3351 echo "CONFIG_TOOLS=y" >> $config_host_mak
3352fi
3353if test "$guest_agent" = "yes" ; then
3354 echo "CONFIG_GUEST_AGENT=y" >> $config_host_mak
3355fi
3356if test "$slirp_smbd" = "yes" ; then
3357 echo "CONFIG_SLIRP_SMBD=y" >> $config_host_mak
3358 echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
3359fi
3360if test "$gprof" = "yes" ; then
3361 echo "CONFIG_GPROF=y" >> $config_host_mak
3362fi
3363echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
3364echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
3365if test "$block_drv_whitelist_tools" = "yes" ; then
3366 echo "CONFIG_BDRV_WHITELIST_TOOLS=y" >> $config_host_mak
3367fi
3368qemu_version=$(head $source_path/VERSION)
3369echo "PKGVERSION=$pkgversion" >>$config_host_mak
3370echo "SRC_PATH=$source_path" >> $config_host_mak
3371echo "TARGET_DIRS=$target_list" >> $config_host_mak
3372if test "$modules" = "yes"; then
3373 # $shacmd can generate a hash started with digit, which the compiler doesn't
3374 # like as an symbol. So prefix it with an underscore
3375 echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
3376 echo "CONFIG_MODULES=y" >> $config_host_mak
3377fi
3378if test "$module_upgrades" = "yes"; then
3379 echo "CONFIG_MODULE_UPGRADES=y" >> $config_host_mak
3380fi
3381if test "$have_usbfs" = "yes" ; then
3382 echo "CONFIG_USBFS=y" >> $config_host_mak
3383fi
3384if test "$gio" = "yes" ; then
3385 echo "CONFIG_GIO=y" >> $config_host_mak
3386 echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
3387 echo "GIO_LIBS=$gio_libs" >> $config_host_mak
3388fi
3389if test "$gdbus_codegen" != "" ; then
3390 echo "GDBUS_CODEGEN=$gdbus_codegen" >> $config_host_mak
3391fi
3392echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
3393
3394if test "$xen" = "enabled" ; then
3395 echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
3396 echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
3397 echo "XEN_CFLAGS=$xen_cflags" >> $config_host_mak
3398 echo "XEN_LIBS=$xen_libs" >> $config_host_mak
3399fi
3400if test "$vhost_scsi" = "yes" ; then
3401 echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
3402fi
3403if test "$vhost_net" = "yes" ; then
3404 echo "CONFIG_VHOST_NET=y" >> $config_host_mak
3405fi
3406if test "$vhost_net_user" = "yes" ; then
3407 echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
3408fi
3409if test "$vhost_net_vdpa" = "yes" ; then
3410 echo "CONFIG_VHOST_NET_VDPA=y" >> $config_host_mak
3411fi
3412if test "$vhost_crypto" = "yes" ; then
3413 echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
3414fi
3415if test "$vhost_vsock" = "yes" ; then
3416 echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
3417 if test "$vhost_user" = "yes" ; then
3418 echo "CONFIG_VHOST_USER_VSOCK=y" >> $config_host_mak
3419 fi
3420fi
3421if test "$vhost_kernel" = "yes" ; then
3422 echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
3423fi
3424if test "$vhost_user" = "yes" ; then
3425 echo "CONFIG_VHOST_USER=y" >> $config_host_mak
3426fi
3427if test "$vhost_vdpa" = "yes" ; then
3428 echo "CONFIG_VHOST_VDPA=y" >> $config_host_mak
3429fi
3430if test "$vhost_user_fs" = "yes" ; then
3431 echo "CONFIG_VHOST_USER_FS=y" >> $config_host_mak
3432fi
3433if test "$membarrier" = "yes" ; then
3434 echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
3435fi
3436if test "$tcg" = "enabled" -a "$tcg_interpreter" = "true" ; then
3437 echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
3438fi
3439
3440if test "$opengl" = "yes" ; then
3441 echo "CONFIG_OPENGL=y" >> $config_host_mak
3442 echo "OPENGL_CFLAGS=$opengl_cflags" >> $config_host_mak
3443 echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
3444fi
3445
3446if test "$avx2_opt" = "yes" ; then
3447 echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
3448fi
3449
3450if test "$avx512f_opt" = "yes" ; then
3451 echo "CONFIG_AVX512F_OPT=y" >> $config_host_mak
3452fi
3453
3454# XXX: suppress that
3455if [ "$bsd" = "yes" ] ; then
3456 echo "CONFIG_BSD=y" >> $config_host_mak
3457fi
3458
3459if test "$qom_cast_debug" = "yes" ; then
3460 echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
3461fi
3462
3463echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
3464if test "$coroutine_pool" = "yes" ; then
3465 echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
3466else
3467 echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
3468fi
3469
3470if test "$debug_stack_usage" = "yes" ; then
3471 echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
3472fi
3473
3474if test "$crypto_afalg" = "yes" ; then
3475 echo "CONFIG_AF_ALG=y" >> $config_host_mak
3476fi
3477
3478if test "$have_asan_iface_fiber" = "yes" ; then
3479 echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
3480fi
3481
3482if test "$have_tsan" = "yes" && test "$have_tsan_iface_fiber" = "yes" ; then
3483 echo "CONFIG_TSAN=y" >> $config_host_mak
3484fi
3485
3486if test "$cpuid_h" = "yes" ; then
3487 echo "CONFIG_CPUID_H=y" >> $config_host_mak
3488fi
3489
3490if test "$int128" = "yes" ; then
3491 echo "CONFIG_INT128=y" >> $config_host_mak
3492fi
3493
3494if test "$atomic128" = "yes" ; then
3495 echo "CONFIG_ATOMIC128=y" >> $config_host_mak
3496fi
3497
3498if test "$cmpxchg128" = "yes" ; then
3499 echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
3500fi
3501
3502if test "$live_block_migration" = "yes" ; then
3503 echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
3504fi
3505
3506if test "$tpm" = "yes"; then
3507 echo 'CONFIG_TPM=y' >> $config_host_mak
3508fi
3509
3510if test "$rdma" = "yes" ; then
3511 echo "CONFIG_RDMA=y" >> $config_host_mak
3512 echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
3513fi
3514
3515if test "$pvrdma" = "yes" ; then
3516 echo "CONFIG_PVRDMA=y" >> $config_host_mak
3517fi
3518
3519if test "$replication" = "yes" ; then
3520 echo "CONFIG_REPLICATION=y" >> $config_host_mak
3521fi
3522
3523if test "$debug_mutex" = "yes" ; then
3524 echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
3525fi
3526
3527if test "$bochs" = "yes" ; then
3528 echo "CONFIG_BOCHS=y" >> $config_host_mak
3529fi
3530if test "$cloop" = "yes" ; then
3531 echo "CONFIG_CLOOP=y" >> $config_host_mak
3532fi
3533if test "$dmg" = "yes" ; then
3534 echo "CONFIG_DMG=y" >> $config_host_mak
3535fi
3536if test "$qcow1" = "yes" ; then
3537 echo "CONFIG_QCOW1=y" >> $config_host_mak
3538fi
3539if test "$vdi" = "yes" ; then
3540 echo "CONFIG_VDI=y" >> $config_host_mak
3541fi
3542if test "$vvfat" = "yes" ; then
3543 echo "CONFIG_VVFAT=y" >> $config_host_mak
3544fi
3545if test "$qed" = "yes" ; then
3546 echo "CONFIG_QED=y" >> $config_host_mak
3547fi
3548if test "$parallels" = "yes" ; then
3549 echo "CONFIG_PARALLELS=y" >> $config_host_mak
3550fi
3551
3552if test "$plugins" = "yes" ; then
3553 echo "CONFIG_PLUGIN=y" >> $config_host_mak
3554fi
3555
3556if test -n "$gdb_bin"; then
3557 gdb_version=$($gdb_bin --version | head -n 1)
3558 if version_ge ${gdb_version##* } 9.1; then
3559 echo "HAVE_GDB_BIN=$gdb_bin" >> $config_host_mak
3560 fi
3561fi
3562
3563if test "$secret_keyring" = "yes" ; then
3564 echo "CONFIG_SECRET_KEYRING=y" >> $config_host_mak
3565fi
3566
3567echo "ROMS=$roms" >> $config_host_mak
3568echo "MAKE=$make" >> $config_host_mak
3569echo "PYTHON=$python" >> $config_host_mak
3570echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
3571echo "MESON=$meson" >> $config_host_mak
3572echo "NINJA=$ninja" >> $config_host_mak
3573echo "CC=$cc" >> $config_host_mak
3574echo "HOST_CC=$host_cc" >> $config_host_mak
3575if $iasl -h > /dev/null 2>&1; then
3576 echo "CONFIG_IASL=$iasl" >> $config_host_mak
3577fi
3578echo "AR=$ar" >> $config_host_mak
3579echo "AS=$as" >> $config_host_mak
3580echo "CCAS=$ccas" >> $config_host_mak
3581echo "CPP=$cpp" >> $config_host_mak
3582echo "OBJCOPY=$objcopy" >> $config_host_mak
3583echo "LD=$ld" >> $config_host_mak
3584echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
3585echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
3586echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
3587echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
3588echo "GLIB_LIBS=$glib_libs" >> $config_host_mak
3589echo "GLIB_VERSION=$(pkg-config --modversion glib-2.0)" >> $config_host_mak
3590echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
3591echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
3592echo "EXESUF=$EXESUF" >> $config_host_mak
3593echo "LIBS_QGA=$libs_qga" >> $config_host_mak
3594
3595if test "$rng_none" = "yes"; then
3596 echo "CONFIG_RNG_NONE=y" >> $config_host_mak
3597fi
3598
3599# use included Linux headers
3600if test "$linux" = "yes" ; then
3601 mkdir -p linux-headers
3602 case "$cpu" in
3603 i386|x86_64)
3604 linux_arch=x86
3605 ;;
3606 ppc|ppc64)
3607 linux_arch=powerpc
3608 ;;
3609 s390x)
3610 linux_arch=s390
3611 ;;
3612 aarch64)
3613 linux_arch=arm64
3614 ;;
3615 loongarch*)
3616 linux_arch=loongarch
3617 ;;
3618 mips64)
3619 linux_arch=mips
3620 ;;
3621 *)
3622 # For most CPUs the kernel architecture name and QEMU CPU name match.
3623 linux_arch="$cpu"
3624 ;;
3625 esac
3626 # For non-KVM architectures we will not have asm headers
3627 if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
3628 symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
3629 fi
3630fi
3631
3632for target in $target_list; do
3633 target_dir="$target"
3634 target_name=$(echo $target | cut -d '-' -f 1)$EXESUF
3635 mkdir -p $target_dir
3636 case $target in
3637 *-user) symlink "../qemu-$target_name" "$target_dir/qemu-$target_name" ;;
3638 *) symlink "../qemu-system-$target_name" "$target_dir/qemu-system-$target_name" ;;
3639 esac
3640done
3641
3642echo "CONFIG_QEMU_INTERP_PREFIX=$interp_prefix" | sed 's/%M/@0@/' >> $config_host_mak
3643if test "$default_targets" = "yes"; then
3644 echo "CONFIG_DEFAULT_TARGETS=y" >> $config_host_mak
3645fi
3646
3647if test "$numa" = "yes"; then
3648 echo "CONFIG_NUMA=y" >> $config_host_mak
3649 echo "NUMA_LIBS=$numa_libs" >> $config_host_mak
3650fi
3651
3652if test "$ccache_cpp2" = "yes"; then
3653 echo "export CCACHE_CPP2=y" >> $config_host_mak
3654fi
3655
3656if test "$safe_stack" = "yes"; then
3657 echo "CONFIG_SAFESTACK=y" >> $config_host_mak
3658fi
3659
3660# If we're using a separate build tree, set it up now.
3661# LINKS are things to symlink back into the source tree
3662# (these can be both files and directories).
3663# Caution: do not add files or directories here using wildcards. This
3664# will result in problems later if a new file matching the wildcard is
3665# added to the source tree -- nothing will cause configure to be rerun
3666# so the build tree will be missing the link back to the new file, and
3667# tests might fail. Prefer to keep the relevant files in their own
3668# directory and symlink the directory instead.
3669# UNLINK is used to remove symlinks from older development versions
3670# that might get into the way when doing "git update" without doing
3671# a "make distclean" in between.
3672LINKS="Makefile"
3673LINKS="$LINKS tests/tcg/Makefile.target"
3674LINKS="$LINKS pc-bios/optionrom/Makefile"
3675LINKS="$LINKS pc-bios/s390-ccw/Makefile"
3676LINKS="$LINKS roms/seabios/Makefile"
3677LINKS="$LINKS pc-bios/qemu-icon.bmp"
3678LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
3679LINKS="$LINKS tests/avocado tests/data"
3680LINKS="$LINKS tests/qemu-iotests/check"
3681LINKS="$LINKS python"
3682LINKS="$LINKS contrib/plugins/Makefile "
3683UNLINK="pc-bios/keymaps"
3684for bios_file in \
3685 $source_path/pc-bios/*.bin \
3686 $source_path/pc-bios/*.elf \
3687 $source_path/pc-bios/*.lid \
3688 $source_path/pc-bios/*.rom \
3689 $source_path/pc-bios/*.dtb \
3690 $source_path/pc-bios/*.img \
3691 $source_path/pc-bios/openbios-* \
3692 $source_path/pc-bios/u-boot.* \
3693 $source_path/pc-bios/palcode-* \
3694 $source_path/pc-bios/qemu_vga.ndrv
3695
3696do
3697 LINKS="$LINKS pc-bios/$(basename $bios_file)"
3698done
3699for f in $LINKS ; do
3700 if [ -e "$source_path/$f" ]; then
3701 mkdir -p `dirname ./$f`
3702 symlink "$source_path/$f" "$f"
3703 fi
3704done
3705for f in $UNLINK ; do
3706 if [ -L "$f" ]; then
3707 rm -f "$f"
3708 fi
3709done
3710
3711(for i in $cross_cc_vars; do
3712 export $i
3713done
3714export target_list source_path use_containers cpu
3715$source_path/tests/tcg/configure.sh)
3716
3717# temporary config to build submodules
3718for rom in seabios; do
3719 config_mak=roms/$rom/config.mak
3720 echo "# Automatically generated by configure - do not modify" > $config_mak
3721 echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
3722 echo "AS=$as" >> $config_mak
3723 echo "CCAS=$ccas" >> $config_mak
3724 echo "CC=$cc" >> $config_mak
3725 echo "BCC=bcc" >> $config_mak
3726 echo "CPP=$cpp" >> $config_mak
3727 echo "OBJCOPY=objcopy" >> $config_mak
3728 echo "IASL=$iasl" >> $config_mak
3729 echo "LD=$ld" >> $config_mak
3730 echo "RANLIB=$ranlib" >> $config_mak
3731done
3732
3733config_mak=pc-bios/optionrom/config.mak
3734echo "# Automatically generated by configure - do not modify" > $config_mak
3735echo "TOPSRC_DIR=$source_path" >> $config_mak
3736
3737if test "$skip_meson" = no; then
3738 cross="config-meson.cross.new"
3739 meson_quote() {
3740 test $# = 0 && return
3741 echo "'$(echo $* | sed "s/ /','/g")'"
3742 }
3743
3744 echo "# Automatically generated by configure - do not modify" > $cross
3745 echo "[properties]" >> $cross
3746
3747 # unroll any custom device configs
3748 for a in $device_archs; do
3749 eval "c=\$devices_${a}"
3750 echo "${a}-softmmu = '$c'" >> $cross
3751 done
3752
3753 test -z "$cxx" && echo "link_language = 'c'" >> $cross
3754 echo "[built-in options]" >> $cross
3755 echo "c_args = [$(meson_quote $CFLAGS $EXTRA_CFLAGS)]" >> $cross
3756 echo "cpp_args = [$(meson_quote $CXXFLAGS $EXTRA_CXXFLAGS)]" >> $cross
3757 echo "c_link_args = [$(meson_quote $CFLAGS $LDFLAGS $EXTRA_CFLAGS $EXTRA_LDFLAGS)]" >> $cross
3758 echo "cpp_link_args = [$(meson_quote $CXXFLAGS $LDFLAGS $EXTRA_CXXFLAGS $EXTRA_LDFLAGS)]" >> $cross
3759 echo "[binaries]" >> $cross
3760 echo "c = [$(meson_quote $cc $CPU_CFLAGS)]" >> $cross
3761 test -n "$cxx" && echo "cpp = [$(meson_quote $cxx $CPU_CFLAGS)]" >> $cross
3762 test -n "$objcc" && echo "objc = [$(meson_quote $objcc $CPU_CFLAGS)]" >> $cross
3763 echo "ar = [$(meson_quote $ar)]" >> $cross
3764 echo "nm = [$(meson_quote $nm)]" >> $cross
3765 echo "pkgconfig = [$(meson_quote $pkg_config_exe)]" >> $cross
3766 echo "ranlib = [$(meson_quote $ranlib)]" >> $cross
3767 if has $sdl2_config; then
3768 echo "sdl2-config = [$(meson_quote $sdl2_config)]" >> $cross
3769 fi
3770 echo "strip = [$(meson_quote $strip)]" >> $cross
3771 echo "windres = [$(meson_quote $windres)]" >> $cross
3772 if test "$cross_compile" = "yes"; then
3773 cross_arg="--cross-file config-meson.cross"
3774 echo "[host_machine]" >> $cross
3775 echo "system = '$targetos'" >> $cross
3776 case "$cpu" in
3777 i386)
3778 echo "cpu_family = 'x86'" >> $cross
3779 ;;
3780 *)
3781 echo "cpu_family = '$cpu'" >> $cross
3782 ;;
3783 esac
3784 echo "cpu = '$cpu'" >> $cross
3785 if test "$bigendian" = "yes" ; then
3786 echo "endian = 'big'" >> $cross
3787 else
3788 echo "endian = 'little'" >> $cross
3789 fi
3790 else
3791 cross_arg="--native-file config-meson.cross"
3792 fi
3793 mv $cross config-meson.cross
3794
3795 rm -rf meson-private meson-info meson-logs
3796 run_meson() {
3797 NINJA=$ninja $meson setup \
3798 --prefix "$prefix" \
3799 --libdir "$libdir" \
3800 --libexecdir "$libexecdir" \
3801 --bindir "$bindir" \
3802 --includedir "$includedir" \
3803 --datadir "$datadir" \
3804 --mandir "$mandir" \
3805 --sysconfdir "$sysconfdir" \
3806 --localedir "$localedir" \
3807 --localstatedir "$local_statedir" \
3808 -Daudio_drv_list=$audio_drv_list \
3809 -Ddefault_devices=$default_devices \
3810 -Ddocdir="$docdir" \
3811 -Dqemu_firmwarepath="$firmwarepath" \
3812 -Dqemu_suffix="$qemu_suffix" \
3813 -Dsphinx_build="$sphinx_build" \
3814 -Dtrace_file="$trace_file" \
3815 -Doptimization=$(if test "$debug" = yes; then echo 0; else echo 2; fi) \
3816 -Ddebug=$(if test "$debug_info" = yes; then echo true; else echo false; fi) \
3817 -Dwerror=$(if test "$werror" = yes; then echo true; else echo false; fi) \
3818 -Dstrip=$(if test "$strip_opt" = yes; then echo true; else echo false; fi) \
3819 -Db_pie=$(if test "$pie" = yes; then echo true; else echo false; fi) \
3820 -Db_coverage=$(if test "$gcov" = yes; then echo true; else echo false; fi) \
3821 -Db_lto=$lto -Dcfi=$cfi -Dtcg=$tcg -Dxen=$xen \
3822 -Dcapstone=$capstone -Dfdt=$fdt -Dslirp=$slirp \
3823 $(test -n "${LIB_FUZZING_ENGINE+xxx}" && echo "-Dfuzzing_engine=$LIB_FUZZING_ENGINE") \
3824 $(if test "$default_feature" = no; then echo "-Dauto_features=disabled"; fi) \
3825 "$@" $cross_arg "$PWD" "$source_path"
3826 }
3827 eval run_meson $meson_options
3828 if test "$?" -ne 0 ; then
3829 error_exit "meson setup failed"
3830 fi
3831else
3832 if test -f meson-private/cmd_line.txt; then
3833 # Adjust old command line options whose type was changed
3834 # Avoids having to use "setup --wipe" when Meson is upgraded
3835 perl -i -ne '
3836 s/^gettext = true$/gettext = auto/;
3837 s/^gettext = false$/gettext = disabled/;
3838 /^b_staticpic/ && next;
3839 print;' meson-private/cmd_line.txt
3840 fi
3841fi
3842
3843if test -n "${deprecated_features}"; then
3844 echo "Warning, deprecated features enabled."
3845 echo "Please see docs/about/deprecated.rst"
3846 echo " features: ${deprecated_features}"
3847fi
3848
3849# Create list of config switches that should be poisoned in common code...
3850# but filter out CONFIG_TCG and CONFIG_USER_ONLY which are special.
3851target_configs_h=$(ls *-config-devices.h *-config-target.h 2>/dev/null)
3852if test -n "$target_configs_h" ; then
3853 sed -n -e '/CONFIG_TCG/d' -e '/CONFIG_USER_ONLY/d' \
3854 -e '/^#define / { s///; s/ .*//; s/^/#pragma GCC poison /p; }' \
3855 $target_configs_h | sort -u > config-poison.h
3856else
3857 :> config-poison.h
3858fi
3859
3860# Save the configure command line for later reuse.
3861cat <<EOD >config.status
3862#!/bin/sh
3863# Generated by configure.
3864# Run this file to recreate the current configuration.
3865# Compiler output produced by configure, useful for debugging
3866# configure, is in config.log if it exists.
3867EOD
3868
3869preserve_env() {
3870 envname=$1
3871
3872 eval envval=\$$envname
3873
3874 if test -n "$envval"
3875 then
3876 echo "$envname='$envval'" >> config.status
3877 echo "export $envname" >> config.status
3878 else
3879 echo "unset $envname" >> config.status
3880 fi
3881}
3882
3883# Preserve various env variables that influence what
3884# features/build target configure will detect
3885preserve_env AR
3886preserve_env AS
3887preserve_env CC
3888preserve_env CPP
3889preserve_env CFLAGS
3890preserve_env CXX
3891preserve_env CXXFLAGS
3892preserve_env INSTALL
3893preserve_env LD
3894preserve_env LDFLAGS
3895preserve_env LD_LIBRARY_PATH
3896preserve_env LIBTOOL
3897preserve_env MAKE
3898preserve_env NM
3899preserve_env OBJCOPY
3900preserve_env PATH
3901preserve_env PKG_CONFIG
3902preserve_env PKG_CONFIG_LIBDIR
3903preserve_env PKG_CONFIG_PATH
3904preserve_env PYTHON
3905preserve_env SDL2_CONFIG
3906preserve_env SMBD
3907preserve_env STRIP
3908preserve_env WINDRES
3909
3910printf "exec" >>config.status
3911for i in "$0" "$@"; do
3912 test "$i" = --skip-meson || printf " %s" "$(quote_sh "$i")" >>config.status
3913done
3914echo ' "$@"' >>config.status
3915chmod +x config.status
3916
3917rm -r "$TMPDIR1"