Update version for v6.2.0-rc0 release
[qemu.git] / configure
blob48c21775f3a90c91631d90bd6e3ec6b060215465
1 #!/bin/sh
3 # qemu configure script (c) 2003 Fabrice Bellard
6 # Unset some variables known to interfere with behavior of common tools,
7 # just as autoconf does.
8 CLICOLOR_FORCE= GREP_OPTIONS=
9 unset CLICOLOR_FORCE GREP_OPTIONS
11 # Don't allow CCACHE, if present, to use cached results of compile tests!
12 export CCACHE_RECACHE=yes
14 # make source path absolute
15 source_path=$(cd "$(dirname -- "$0")"; pwd)
17 if test "$PWD" = "$source_path"
18 then
19 echo "Using './build' as the directory for build output"
21 MARKER=build/auto-created-by-configure
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
34 mkdir build
35 touch $MARKER
37 cat > GNUmakefile <<'EOF'
38 # This file is auto-generated by configure to support in-source tree
39 # 'make' command invocation
41 ifeq ($(MAKECMDGOALS),)
42 recurse: all
43 endif
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 ; \
54 force: ;
55 .PHONY: force
56 GNUmakefile: ;
58 EOF
59 cd build
60 exec $source_path/configure "$@"
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.)
68 TMPDIR1="config-temp"
69 rm -rf "${TMPDIR1}"
70 mkdir -p "${TMPDIR1}"
71 if [ $? -ne 0 ]; then
72 echo "ERROR: failed to create temporary directory"
73 exit 1
76 TMPB="qemu-conf"
77 TMPC="${TMPDIR1}/${TMPB}.c"
78 TMPO="${TMPDIR1}/${TMPB}.o"
79 TMPCXX="${TMPDIR1}/${TMPB}.cxx"
80 TMPE="${TMPDIR1}/${TMPB}.exe"
81 TMPTXT="${TMPDIR1}/${TMPB}.txt"
83 rm -f config.log
85 # Print a helpful header at the top of config.log
86 echo "# QEMU configure log $(date)" >> config.log
87 printf "# Configured with:" >> config.log
88 printf " '%s'" "$0" "$@" >> config.log
89 echo >> config.log
90 echo "#" >> config.log
92 quote_sh() {
93 printf "%s" "$1" | sed "s,','\\\\'',g; s,.*,'&',"
96 print_error() {
97 (echo
98 echo "ERROR: $1"
99 while test -n "$2"; do
100 echo " $2"
101 shift
102 done
103 echo) >&2
106 error_exit() {
107 print_error "$@"
108 exit 1
111 do_compiler() {
112 # Run the compiler, capturing its output to the log. First argument
113 # is compiler binary to execute.
114 compiler="$1"
115 shift
116 if test -n "$BASH_VERSION"; then eval '
117 echo >>config.log "
118 funcs: ${FUNCNAME[*]}
119 lines: ${BASH_LINENO[*]}"
120 '; fi
121 echo $compiler "$@" >> config.log
122 $compiler "$@" >> config.log 2>&1 || return $?
123 # Test passed. If this is an --enable-werror build, rerun
124 # the test with -Werror and bail out if it fails. This
125 # makes warning-generating-errors in configure test code
126 # obvious to developers.
127 if test "$werror" != "yes"; then
128 return 0
130 # Don't bother rerunning the compile if we were already using -Werror
131 case "$*" in
132 *-Werror*)
133 return 0
135 esac
136 echo $compiler -Werror "$@" >> config.log
137 $compiler -Werror "$@" >> config.log 2>&1 && return $?
138 error_exit "configure test passed without -Werror but failed with -Werror." \
139 "This is probably a bug in the configure script. The failing command" \
140 "will be at the bottom of config.log." \
141 "You can run configure with --disable-werror to bypass this check."
144 do_cc() {
145 do_compiler "$cc" $CPU_CFLAGS "$@"
148 do_cxx() {
149 do_compiler "$cxx" $CPU_CFLAGS "$@"
152 # Append $2 to the variable named $1, with space separation
153 add_to() {
154 eval $1=\${$1:+\"\$$1 \"}\$2
157 update_cxxflags() {
158 # Set QEMU_CXXFLAGS from QEMU_CFLAGS by filtering out those
159 # options which some versions of GCC's C++ compiler complain about
160 # because they only make sense for C programs.
161 QEMU_CXXFLAGS="-D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"
162 CONFIGURE_CXXFLAGS=$(echo "$CONFIGURE_CFLAGS" | sed s/-std=gnu11/-std=gnu++11/)
163 for arg in $QEMU_CFLAGS; do
164 case $arg in
165 -Wstrict-prototypes|-Wmissing-prototypes|-Wnested-externs|\
166 -Wold-style-declaration|-Wold-style-definition|-Wredundant-decls)
169 QEMU_CXXFLAGS=${QEMU_CXXFLAGS:+$QEMU_CXXFLAGS }$arg
171 esac
172 done
175 compile_object() {
176 local_cflags="$1"
177 do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
180 compile_prog() {
181 local_cflags="$1"
182 local_ldflags="$2"
183 do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC \
184 $LDFLAGS $EXTRA_LDFLAGS $CONFIGURE_LDFLAGS $QEMU_LDFLAGS $local_ldflags
187 # symbolically link $1 to $2. Portable version of "ln -sf".
188 symlink() {
189 rm -rf "$2"
190 mkdir -p "$(dirname "$2")"
191 ln -s "$1" "$2"
194 # check whether a command is available to this shell (may be either an
195 # executable or a builtin)
196 has() {
197 type "$1" >/dev/null 2>&1
200 version_ge () {
201 local_ver1=$(expr "$1" : '\([0-9.]*\)' | tr . ' ')
202 local_ver2=$(echo "$2" | tr . ' ')
203 while true; do
204 set x $local_ver1
205 local_first=${2-0}
206 # 'shift 2' if $2 is set, or 'shift' if $2 is not set
207 shift ${2:+2}
208 local_ver1=$*
209 set x $local_ver2
210 # the second argument finished, the first must be greater or equal
211 test $# = 1 && return 0
212 test $local_first -lt $2 && return 1
213 test $local_first -gt $2 && return 0
214 shift ${2:+2}
215 local_ver2=$*
216 done
219 glob() {
220 eval test -z '"${1#'"$2"'}"'
223 ld_has() {
224 $ld --help 2>/dev/null | grep ".$1" >/dev/null 2>&1
227 if printf %s\\n "$source_path" "$PWD" | grep -q "[[:space:]:]";
228 then
229 error_exit "main directory cannot contain spaces nor colons"
232 # default parameters
233 cpu=""
234 iasl="iasl"
235 interp_prefix="/usr/gnemul/qemu-%M"
236 static="no"
237 cross_compile="no"
238 cross_prefix=""
239 audio_drv_list="default"
240 block_drv_rw_whitelist=""
241 block_drv_ro_whitelist=""
242 block_drv_whitelist_tools="no"
243 host_cc="cc"
244 libs_qga=""
245 debug_info="yes"
246 lto="false"
247 stack_protector=""
248 safe_stack=""
249 use_containers="yes"
250 gdb_bin=$(command -v "gdb-multiarch" || command -v "gdb")
252 if test -e "$source_path/.git"
253 then
254 git_submodules_action="update"
255 else
256 git_submodules_action="ignore"
259 git_submodules="ui/keycodemapdb"
260 git="git"
262 # Don't accept a target_list environment variable.
263 unset target_list
264 unset target_list_exclude
266 # Default value for a variable defining feature "foo".
267 # * foo="no" feature will only be used if --enable-foo arg is given
268 # * foo="" feature will be searched for, and if found, will be used
269 # unless --disable-foo is given
270 # * foo="yes" this value will only be set by --enable-foo flag.
271 # feature will searched for,
272 # if not found, configure exits with error
274 # Always add --enable-foo and --disable-foo command line args.
275 # Distributions want to ensure that several features are compiled in, and it
276 # is impossible without a --enable-foo that exits if a feature is not found.
278 default_feature=""
279 # parse CC options second
280 for opt do
281 optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
282 case "$opt" in
283 --without-default-features)
284 default_feature="no"
286 esac
287 done
289 EXTRA_CFLAGS=""
290 EXTRA_CXXFLAGS=""
291 EXTRA_LDFLAGS=""
293 xen_ctrl_version="$default_feature"
294 xfs="$default_feature"
295 membarrier="$default_feature"
296 vhost_kernel="$default_feature"
297 vhost_net="$default_feature"
298 vhost_crypto="$default_feature"
299 vhost_scsi="$default_feature"
300 vhost_vsock="$default_feature"
301 vhost_user="no"
302 vhost_user_fs="$default_feature"
303 vhost_vdpa="$default_feature"
304 rdma="$default_feature"
305 pvrdma="$default_feature"
306 gprof="no"
307 debug_tcg="no"
308 debug="no"
309 sanitizers="no"
310 tsan="no"
311 fortify_source="$default_feature"
312 strip_opt="yes"
313 mingw32="no"
314 gcov="no"
315 EXESUF=""
316 modules="no"
317 module_upgrades="no"
318 prefix="/usr/local"
319 qemu_suffix="qemu"
320 bsd="no"
321 linux="no"
322 solaris="no"
323 profiler="no"
324 softmmu="yes"
325 linux_user="no"
326 bsd_user="no"
327 pkgversion=""
328 pie=""
329 qom_cast_debug="yes"
330 trace_backends="log"
331 trace_file="trace"
332 opengl="$default_feature"
333 cpuid_h="no"
334 avx2_opt="$default_feature"
335 guest_agent="$default_feature"
336 guest_agent_with_vss="no"
337 guest_agent_ntddscsi="no"
338 vss_win32_sdk="$default_feature"
339 win_sdk="no"
340 want_tools="$default_feature"
341 coroutine=""
342 coroutine_pool="$default_feature"
343 debug_stack_usage="no"
344 crypto_afalg="no"
345 tls_priority="NORMAL"
346 tpm="$default_feature"
347 libssh="$default_feature"
348 live_block_migration=${default_feature:-yes}
349 numa="$default_feature"
350 replication=${default_feature:-yes}
351 bochs=${default_feature:-yes}
352 cloop=${default_feature:-yes}
353 dmg=${default_feature:-yes}
354 qcow1=${default_feature:-yes}
355 vdi=${default_feature:-yes}
356 vvfat=${default_feature:-yes}
357 qed=${default_feature:-yes}
358 parallels=${default_feature:-yes}
359 debug_mutex="no"
360 plugins="$default_feature"
361 rng_none="no"
362 secret_keyring="$default_feature"
363 meson=""
364 meson_args=""
365 ninja=""
366 gio="$default_feature"
367 skip_meson=no
368 slirp_smbd="$default_feature"
370 # The following Meson options are handled manually (still they
371 # are included in the automatically generated help message)
373 # 1. Track which submodules are needed
374 capstone="auto"
375 fdt="auto"
376 slirp="auto"
378 # 2. Support --with/--without option
379 default_devices="true"
381 # 3. Automatically enable/disable other options
382 tcg="enabled"
383 cfi="false"
385 # 4. Detection partly done in configure
386 xen=${default_feature:+disabled}
388 # parse CC options second
389 for opt do
390 optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
391 case "$opt" in
392 --cross-prefix=*) cross_prefix="$optarg"
393 cross_compile="yes"
395 --cc=*) CC="$optarg"
397 --cxx=*) CXX="$optarg"
399 --cpu=*) cpu="$optarg"
401 --extra-cflags=*)
402 EXTRA_CFLAGS="$EXTRA_CFLAGS $optarg"
403 EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS $optarg"
405 --extra-cxxflags=*) EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS $optarg"
407 --extra-ldflags=*) EXTRA_LDFLAGS="$EXTRA_LDFLAGS $optarg"
409 --enable-debug-info) debug_info="yes"
411 --disable-debug-info) debug_info="no"
413 --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"
415 --cross-cc-cflags-*) cc_arch=${opt#--cross-cc-flags-}; cc_arch=${cc_arch%%=*}
416 eval "cross_cc_cflags_${cc_arch}=\$optarg"
417 cross_cc_vars="$cross_cc_vars cross_cc_cflags_${cc_arch}"
419 --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}
420 cc_archs="$cc_archs $cc_arch"
421 eval "cross_cc_${cc_arch}=\$optarg"
422 cross_cc_vars="$cross_cc_vars cross_cc_${cc_arch}"
424 esac
425 done
426 # OS specific
427 # Using uname is really, really broken. Once we have the right set of checks
428 # we can eliminate its usage altogether.
430 # Preferred compiler:
431 # ${CC} (if set)
432 # ${cross_prefix}gcc (if cross-prefix specified)
433 # system compiler
434 if test -z "${CC}${cross_prefix}"; then
435 cc="$host_cc"
436 else
437 cc="${CC-${cross_prefix}gcc}"
440 if test -z "${CXX}${cross_prefix}"; then
441 cxx="c++"
442 else
443 cxx="${CXX-${cross_prefix}g++}"
446 ar="${AR-${cross_prefix}ar}"
447 as="${AS-${cross_prefix}as}"
448 ccas="${CCAS-$cc}"
449 cpp="${CPP-$cc -E}"
450 objcopy="${OBJCOPY-${cross_prefix}objcopy}"
451 ld="${LD-${cross_prefix}ld}"
452 ranlib="${RANLIB-${cross_prefix}ranlib}"
453 nm="${NM-${cross_prefix}nm}"
454 strip="${STRIP-${cross_prefix}strip}"
455 windres="${WINDRES-${cross_prefix}windres}"
456 pkg_config_exe="${PKG_CONFIG-${cross_prefix}pkg-config}"
457 query_pkg_config() {
458 "${pkg_config_exe}" ${QEMU_PKG_CONFIG_FLAGS} "$@"
460 pkg_config=query_pkg_config
461 sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
463 # default flags for all hosts
464 # We use -fwrapv to tell the compiler that we require a C dialect where
465 # left shift of signed integers is well defined and has the expected
466 # 2s-complement style results. (Both clang and gcc agree that it
467 # provides these semantics.)
468 QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv"
469 QEMU_CFLAGS="-Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS"
470 QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS"
471 QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
473 QEMU_LDFLAGS=
475 # Flags that are needed during configure but later taken care of by Meson
476 CONFIGURE_CFLAGS="-std=gnu11 -Wall"
477 CONFIGURE_LDFLAGS=
480 check_define() {
481 cat > $TMPC <<EOF
482 #if !defined($1)
483 #error $1 not defined
484 #endif
485 int main(void) { return 0; }
487 compile_object
490 check_include() {
491 cat > $TMPC <<EOF
492 #include <$1>
493 int main(void) { return 0; }
495 compile_object
498 write_c_skeleton() {
499 cat > $TMPC <<EOF
500 int main(void) { return 0; }
504 if check_define __linux__ ; then
505 targetos="Linux"
506 elif check_define _WIN32 ; then
507 targetos='MINGW32'
508 elif check_define __OpenBSD__ ; then
509 targetos='OpenBSD'
510 elif check_define __sun__ ; then
511 targetos='SunOS'
512 elif check_define __HAIKU__ ; then
513 targetos='Haiku'
514 elif check_define __FreeBSD__ ; then
515 targetos='FreeBSD'
516 elif check_define __FreeBSD_kernel__ && check_define __GLIBC__; then
517 targetos='GNU/kFreeBSD'
518 elif check_define __DragonFly__ ; then
519 targetos='DragonFly'
520 elif check_define __NetBSD__; then
521 targetos='NetBSD'
522 elif check_define __APPLE__; then
523 targetos='Darwin'
524 else
525 # This is a fatal error, but don't report it yet, because we
526 # might be going to just print the --help text, or it might
527 # be the result of a missing compiler.
528 targetos='bogus'
531 # Some host OSes need non-standard checks for which CPU to use.
532 # Note that these checks are broken for cross-compilation: if you're
533 # cross-compiling to one of these OSes then you'll need to specify
534 # the correct CPU with the --cpu option.
535 case $targetos in
536 SunOS)
537 # $(uname -m) returns i86pc even on an x86_64 box, so default based on isainfo
538 if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then
539 cpu="x86_64"
541 esac
543 if test ! -z "$cpu" ; then
544 # command line argument
546 elif check_define __i386__ ; then
547 cpu="i386"
548 elif check_define __x86_64__ ; then
549 if check_define __ILP32__ ; then
550 cpu="x32"
551 else
552 cpu="x86_64"
554 elif check_define __sparc__ ; then
555 if check_define __arch64__ ; then
556 cpu="sparc64"
557 else
558 cpu="sparc"
560 elif check_define _ARCH_PPC ; then
561 if check_define _ARCH_PPC64 ; then
562 if check_define _LITTLE_ENDIAN ; then
563 cpu="ppc64le"
564 else
565 cpu="ppc64"
567 else
568 cpu="ppc"
570 elif check_define __mips__ ; then
571 cpu="mips"
572 elif check_define __s390__ ; then
573 if check_define __s390x__ ; then
574 cpu="s390x"
575 else
576 cpu="s390"
578 elif check_define __riscv ; then
579 cpu="riscv"
580 elif check_define __arm__ ; then
581 cpu="arm"
582 elif check_define __aarch64__ ; then
583 cpu="aarch64"
584 else
585 cpu=$(uname -m)
588 ARCH=
589 # Normalise host CPU name and set ARCH.
590 # Note that this case should only have supported host CPUs, not guests.
591 case "$cpu" in
592 ppc|ppc64|s390x|sparc64|x32|riscv)
594 ppc64le)
595 ARCH="ppc64"
597 i386|i486|i586|i686|i86pc|BePC)
598 cpu="i386"
600 x86_64|amd64)
601 cpu="x86_64"
603 armv*b|armv*l|arm)
604 cpu="arm"
606 aarch64)
607 cpu="aarch64"
609 mips*)
610 cpu="mips"
612 sparc|sun4[cdmuv])
613 cpu="sparc"
616 # This will result in either an error or falling back to TCI later
617 ARCH=unknown
619 esac
620 if test -z "$ARCH"; then
621 ARCH="$cpu"
624 # OS specific
626 case $targetos in
627 MINGW32*)
628 mingw32="yes"
629 supported_os="yes"
630 plugins="no"
631 pie="no"
633 GNU/kFreeBSD)
634 bsd="yes"
636 FreeBSD)
637 bsd="yes"
638 bsd_user="yes"
639 make="${MAKE-gmake}"
640 # needed for kinfo_getvmmap(3) in libutil.h
642 DragonFly)
643 bsd="yes"
644 make="${MAKE-gmake}"
646 NetBSD)
647 bsd="yes"
648 make="${MAKE-gmake}"
650 OpenBSD)
651 bsd="yes"
652 make="${MAKE-gmake}"
654 Darwin)
655 bsd="yes"
656 darwin="yes"
657 # Disable attempts to use ObjectiveC features in os/object.h since they
658 # won't work when we're compiling with gcc as a C compiler.
659 QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS"
661 SunOS)
662 solaris="yes"
663 make="${MAKE-gmake}"
664 smbd="${SMBD-/usr/sfw/sbin/smbd}"
665 # needed for CMSG_ macros in sys/socket.h
666 QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS"
667 # needed for TIOCWIN* defines in termios.h
668 QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
670 Haiku)
671 haiku="yes"
672 pie="no"
673 QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS -D_BSD_SOURCE -fPIC $QEMU_CFLAGS"
675 Linux)
676 linux="yes"
677 linux_user="yes"
678 vhost_user=${default_feature:-yes}
680 esac
682 : ${make=${MAKE-make}}
684 # We prefer python 3.x. A bare 'python' is traditionally
685 # python 2.x, but some distros have it as python 3.x, so
686 # we check that too
687 python=
688 explicit_python=no
689 for binary in "${PYTHON-python3}" python
691 if has "$binary"
692 then
693 python=$(command -v "$binary")
694 break
696 done
699 # Check for ancillary tools used in testing
700 genisoimage=
701 for binary in genisoimage mkisofs
703 if has $binary
704 then
705 genisoimage=$(command -v "$binary")
706 break
708 done
710 # Default objcc to clang if available, otherwise use CC
711 if has clang; then
712 objcc=clang
713 else
714 objcc="$cc"
717 if test "$mingw32" = "yes" ; then
718 EXESUF=".exe"
719 # MinGW needs -mthreads for TLS and macro _MT.
720 CONFIGURE_CFLAGS="-mthreads $CONFIGURE_CFLAGS"
721 write_c_skeleton;
722 prefix="/qemu"
723 qemu_suffix=""
724 libs_qga="-lws2_32 -lwinmm -lpowrprof -lwtsapi32 -lwininet -liphlpapi -lnetapi32 $libs_qga"
727 werror=""
729 . $source_path/scripts/meson-buildoptions.sh
731 meson_options=
732 meson_option_parse() {
733 meson_options="$meson_options $(_meson_option_parse "$@")"
734 if test $? -eq 1; then
735 echo "ERROR: unknown option $1"
736 echo "Try '$0 --help' for more information"
737 exit 1
741 for opt do
742 optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
743 case "$opt" in
744 --help|-h) show_help=yes
746 --version|-V) exec cat $source_path/VERSION
748 --prefix=*) prefix="$optarg"
750 --interp-prefix=*) interp_prefix="$optarg"
752 --cross-prefix=*)
754 --cc=*)
756 --host-cc=*) host_cc="$optarg"
758 --cxx=*)
760 --iasl=*) iasl="$optarg"
762 --objcc=*) objcc="$optarg"
764 --make=*) make="$optarg"
766 --install=*)
768 --python=*) python="$optarg" ; explicit_python=yes
770 --sphinx-build=*) sphinx_build="$optarg"
772 --skip-meson) skip_meson=yes
774 --meson=*) meson="$optarg"
776 --ninja=*) ninja="$optarg"
778 --smbd=*) smbd="$optarg"
780 --extra-cflags=*)
782 --extra-cxxflags=*)
784 --extra-ldflags=*)
786 --enable-debug-info)
788 --disable-debug-info)
790 --cross-cc-*)
792 --enable-modules)
793 modules="yes"
795 --disable-modules)
796 modules="no"
798 --disable-module-upgrades) module_upgrades="no"
800 --enable-module-upgrades) module_upgrades="yes"
802 --cpu=*)
804 --target-list=*) target_list="$optarg"
805 if test "$target_list_exclude"; then
806 error_exit "Can't mix --target-list with --target-list-exclude"
809 --target-list-exclude=*) target_list_exclude="$optarg"
810 if test "$target_list"; then
811 error_exit "Can't mix --target-list-exclude with --target-list"
814 --with-trace-file=*) trace_file="$optarg"
816 --with-default-devices) default_devices="true"
818 --without-default-devices) default_devices="false"
820 --with-devices-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --with-devices-FOO option"
822 --with-devices-*) device_arch=${opt#--with-devices-};
823 device_arch=${device_arch%%=*}
824 cf=$source_path/configs/devices/$device_arch-softmmu/$optarg.mak
825 if test -f "$cf"; then
826 device_archs="$device_archs $device_arch"
827 eval "devices_${device_arch}=\$optarg"
828 else
829 error_exit "File $cf does not exist"
832 --without-default-features) # processed above
834 --enable-gprof) gprof="yes"
836 --enable-gcov) gcov="yes"
838 --static)
839 static="yes"
840 QEMU_PKG_CONFIG_FLAGS="--static $QEMU_PKG_CONFIG_FLAGS"
842 --mandir=*) mandir="$optarg"
844 --bindir=*) bindir="$optarg"
846 --libdir=*) libdir="$optarg"
848 --libexecdir=*) libexecdir="$optarg"
850 --includedir=*) includedir="$optarg"
852 --datadir=*) datadir="$optarg"
854 --with-suffix=*) qemu_suffix="$optarg"
856 --docdir=*) docdir="$optarg"
858 --localedir=*) localedir="$optarg"
860 --sysconfdir=*) sysconfdir="$optarg"
862 --localstatedir=*) local_statedir="$optarg"
864 --firmwarepath=*) firmwarepath="$optarg"
866 --host=*|--build=*|\
867 --disable-dependency-tracking|\
868 --sbindir=*|--sharedstatedir=*|\
869 --oldincludedir=*|--datarootdir=*|--infodir=*|\
870 --htmldir=*|--dvidir=*|--pdfdir=*|--psdir=*)
871 # These switches are silently ignored, for compatibility with
872 # autoconf-generated configure scripts. This allows QEMU's
873 # configure to be used by RPM and similar macros that set
874 # lots of directory switches by default.
876 --disable-qom-cast-debug) qom_cast_debug="no"
878 --enable-qom-cast-debug) qom_cast_debug="yes"
880 --audio-drv-list=*) audio_drv_list="$optarg"
882 --block-drv-rw-whitelist=*|--block-drv-whitelist=*) block_drv_rw_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
884 --block-drv-ro-whitelist=*) block_drv_ro_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
886 --enable-block-drv-whitelist-in-tools) block_drv_whitelist_tools="yes"
888 --disable-block-drv-whitelist-in-tools) block_drv_whitelist_tools="no"
890 --enable-debug-tcg) debug_tcg="yes"
892 --disable-debug-tcg) debug_tcg="no"
894 --enable-debug)
895 # Enable debugging options that aren't excessively noisy
896 debug_tcg="yes"
897 debug_mutex="yes"
898 debug="yes"
899 strip_opt="no"
900 fortify_source="no"
902 --enable-sanitizers) sanitizers="yes"
904 --disable-sanitizers) sanitizers="no"
906 --enable-tsan) tsan="yes"
908 --disable-tsan) tsan="no"
910 --disable-strip) strip_opt="no"
912 --disable-slirp) slirp="disabled"
914 --enable-slirp) slirp="enabled"
916 --enable-slirp=git) slirp="internal"
918 --enable-slirp=*) slirp="$optarg"
920 --disable-xen) xen="disabled"
922 --enable-xen) xen="enabled"
924 --disable-tcg) tcg="disabled"
925 plugins="no"
927 --enable-tcg) tcg="enabled"
929 --enable-profiler) profiler="yes"
931 --disable-system) softmmu="no"
933 --enable-system) softmmu="yes"
935 --disable-user)
936 linux_user="no" ;
937 bsd_user="no" ;
939 --enable-user) ;;
940 --disable-linux-user) linux_user="no"
942 --enable-linux-user) linux_user="yes"
944 --disable-bsd-user) bsd_user="no"
946 --enable-bsd-user) bsd_user="yes"
948 --enable-pie) pie="yes"
950 --disable-pie) pie="no"
952 --enable-werror) werror="yes"
954 --disable-werror) werror="no"
956 --enable-lto) lto="true"
958 --disable-lto) lto="false"
960 --enable-stack-protector) stack_protector="yes"
962 --disable-stack-protector) stack_protector="no"
964 --enable-safe-stack) safe_stack="yes"
966 --disable-safe-stack) safe_stack="no"
968 --enable-cfi)
969 cfi="true";
970 lto="true";
972 --disable-cfi) cfi="false"
974 --disable-fdt) fdt="disabled"
976 --enable-fdt) fdt="enabled"
978 --enable-fdt=git) fdt="internal"
980 --enable-fdt=*) fdt="$optarg"
982 --disable-membarrier) membarrier="no"
984 --enable-membarrier) membarrier="yes"
986 --with-pkgversion=*) pkgversion="$optarg"
988 --with-coroutine=*) coroutine="$optarg"
990 --disable-coroutine-pool) coroutine_pool="no"
992 --enable-coroutine-pool) coroutine_pool="yes"
994 --enable-debug-stack-usage) debug_stack_usage="yes"
996 --enable-crypto-afalg) crypto_afalg="yes"
998 --disable-crypto-afalg) crypto_afalg="no"
1000 --disable-vhost-net) vhost_net="no"
1002 --enable-vhost-net) vhost_net="yes"
1004 --disable-vhost-crypto) vhost_crypto="no"
1006 --enable-vhost-crypto) vhost_crypto="yes"
1008 --disable-vhost-scsi) vhost_scsi="no"
1010 --enable-vhost-scsi) vhost_scsi="yes"
1012 --disable-vhost-vsock) vhost_vsock="no"
1014 --enable-vhost-vsock) vhost_vsock="yes"
1016 --disable-vhost-user-fs) vhost_user_fs="no"
1018 --enable-vhost-user-fs) vhost_user_fs="yes"
1020 --disable-opengl) opengl="no"
1022 --enable-opengl) opengl="yes"
1024 --disable-xfsctl) xfs="no"
1026 --enable-xfsctl) xfs="yes"
1028 --disable-zlib-test)
1030 --enable-guest-agent) guest_agent="yes"
1032 --disable-guest-agent) guest_agent="no"
1034 --with-vss-sdk) vss_win32_sdk=""
1036 --with-vss-sdk=*) vss_win32_sdk="$optarg"
1038 --without-vss-sdk) vss_win32_sdk="no"
1040 --with-win-sdk) win_sdk=""
1042 --with-win-sdk=*) win_sdk="$optarg"
1044 --without-win-sdk) win_sdk="no"
1046 --enable-tools) want_tools="yes"
1048 --disable-tools) want_tools="no"
1050 --disable-avx2) avx2_opt="no"
1052 --enable-avx2) avx2_opt="yes"
1054 --disable-avx512f) avx512f_opt="no"
1056 --enable-avx512f) avx512f_opt="yes"
1058 --disable-virtio-blk-data-plane|--enable-virtio-blk-data-plane)
1059 echo "$0: $opt is obsolete, virtio-blk data-plane is always on" >&2
1061 --enable-vhdx|--disable-vhdx)
1062 echo "$0: $opt is obsolete, VHDX driver is always built" >&2
1064 --enable-uuid|--disable-uuid)
1065 echo "$0: $opt is obsolete, UUID support is always built" >&2
1067 --tls-priority=*) tls_priority="$optarg"
1069 --enable-rdma) rdma="yes"
1071 --disable-rdma) rdma="no"
1073 --enable-pvrdma) pvrdma="yes"
1075 --disable-pvrdma) pvrdma="no"
1077 --disable-tpm) tpm="no"
1079 --enable-tpm) tpm="yes"
1081 --disable-libssh) libssh="no"
1083 --enable-libssh) libssh="yes"
1085 --disable-live-block-migration) live_block_migration="no"
1087 --enable-live-block-migration) live_block_migration="yes"
1089 --disable-numa) numa="no"
1091 --enable-numa) numa="yes"
1093 --disable-replication) replication="no"
1095 --enable-replication) replication="yes"
1097 --disable-bochs) bochs="no"
1099 --enable-bochs) bochs="yes"
1101 --disable-cloop) cloop="no"
1103 --enable-cloop) cloop="yes"
1105 --disable-dmg) dmg="no"
1107 --enable-dmg) dmg="yes"
1109 --disable-qcow1) qcow1="no"
1111 --enable-qcow1) qcow1="yes"
1113 --disable-vdi) vdi="no"
1115 --enable-vdi) vdi="yes"
1117 --disable-vvfat) vvfat="no"
1119 --enable-vvfat) vvfat="yes"
1121 --disable-qed) qed="no"
1123 --enable-qed) qed="yes"
1125 --disable-parallels) parallels="no"
1127 --enable-parallels) parallels="yes"
1129 --disable-vhost-user) vhost_user="no"
1131 --enable-vhost-user) vhost_user="yes"
1133 --disable-vhost-vdpa) vhost_vdpa="no"
1135 --enable-vhost-vdpa) vhost_vdpa="yes"
1137 --disable-vhost-kernel) vhost_kernel="no"
1139 --enable-vhost-kernel) vhost_kernel="yes"
1141 --disable-capstone) capstone="disabled"
1143 --enable-capstone) capstone="enabled"
1145 --enable-capstone=git) capstone="internal"
1147 --enable-capstone=*) capstone="$optarg"
1149 --with-git=*) git="$optarg"
1151 --with-git-submodules=*)
1152 git_submodules_action="$optarg"
1154 --enable-debug-mutex) debug_mutex=yes
1156 --disable-debug-mutex) debug_mutex=no
1158 --enable-plugins) if test "$mingw32" = "yes"; then
1159 error_exit "TCG plugins not currently supported on Windows platforms"
1160 else
1161 plugins="yes"
1164 --disable-plugins) plugins="no"
1166 --enable-containers) use_containers="yes"
1168 --disable-containers) use_containers="no"
1170 --gdb=*) gdb_bin="$optarg"
1172 --enable-rng-none) rng_none=yes
1174 --disable-rng-none) rng_none=no
1176 --enable-keyring) secret_keyring="yes"
1178 --disable-keyring) secret_keyring="no"
1180 --enable-gio) gio=yes
1182 --disable-gio) gio=no
1184 --enable-slirp-smbd) slirp_smbd=yes
1186 --disable-slirp-smbd) slirp_smbd=no
1188 # backwards compatibility options
1189 --enable-trace-backend=*) meson_option_parse "--enable-trace-backends=$optarg" "$optarg"
1191 --disable-blobs) meson_option_parse --disable-install-blobs ""
1193 --enable-tcmalloc) meson_option_parse --enable-malloc=tcmalloc tcmalloc
1195 --enable-jemalloc) meson_option_parse --enable-malloc=jemalloc jemalloc
1197 # everything else has the same name in configure and meson
1198 --enable-* | --disable-*) meson_option_parse "$opt" "$optarg"
1201 echo "ERROR: unknown option $opt"
1202 echo "Try '$0 --help' for more information"
1203 exit 1
1205 esac
1206 done
1208 # test for any invalid configuration combinations
1209 if test "$plugins" = "yes" -a "$tcg" = "disabled"; then
1210 error_exit "Can't enable plugins on non-TCG builds"
1213 case $git_submodules_action in
1214 update|validate)
1215 if test ! -e "$source_path/.git"; then
1216 echo "ERROR: cannot $git_submodules_action git submodules without .git"
1217 exit 1
1220 ignore)
1221 if ! test -f "$source_path/ui/keycodemapdb/README"
1222 then
1223 echo
1224 echo "ERROR: missing GIT submodules"
1225 echo
1226 if test -e "$source_path/.git"; then
1227 echo "--with-git-submodules=ignore specified but submodules were not"
1228 echo "checked out. Please initialize and update submodules."
1229 else
1230 echo "This is not a GIT checkout but module content appears to"
1231 echo "be missing. Do not use 'git archive' or GitHub download links"
1232 echo "to acquire QEMU source archives. Non-GIT builds are only"
1233 echo "supported with source archives linked from:"
1234 echo
1235 echo " https://www.qemu.org/download/#source"
1236 echo
1237 echo "Developers working with GIT can use scripts/archive-source.sh"
1238 echo "if they need to create valid source archives."
1240 echo
1241 exit 1
1245 echo "ERROR: invalid --with-git-submodules= value '$git_submodules_action'"
1246 exit 1
1248 esac
1250 libdir="${libdir:-$prefix/lib}"
1251 libexecdir="${libexecdir:-$prefix/libexec}"
1252 includedir="${includedir:-$prefix/include}"
1254 if test "$mingw32" = "yes" ; then
1255 bindir="${bindir:-$prefix}"
1256 else
1257 bindir="${bindir:-$prefix/bin}"
1259 mandir="${mandir:-$prefix/share/man}"
1260 datadir="${datadir:-$prefix/share}"
1261 docdir="${docdir:-$prefix/share/doc}"
1262 sysconfdir="${sysconfdir:-$prefix/etc}"
1263 local_statedir="${local_statedir:-$prefix/var}"
1264 firmwarepath="${firmwarepath:-$datadir/qemu-firmware}"
1265 localedir="${localedir:-$datadir/locale}"
1267 case "$cpu" in
1268 ppc) CPU_CFLAGS="-m32" ;;
1269 ppc64) CPU_CFLAGS="-m64" ;;
1270 sparc) CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc" ;;
1271 sparc64) CPU_CFLAGS="-m64 -mcpu=ultrasparc" ;;
1272 s390) CPU_CFLAGS="-m31" ;;
1273 s390x) CPU_CFLAGS="-m64" ;;
1274 i386) CPU_CFLAGS="-m32" ;;
1275 x32) CPU_CFLAGS="-mx32" ;;
1277 # ??? Only extremely old AMD cpus do not have cmpxchg16b.
1278 # If we truly care, we should simply detect this case at
1279 # runtime and generate the fallback to serial emulation.
1280 x86_64) CPU_CFLAGS="-m64 -mcx16" ;;
1282 # No special flags required for other host CPUs
1283 esac
1285 if eval test -z "\${cross_cc_$cpu}"; then
1286 eval "cross_cc_${cpu}=\$cc"
1287 cross_cc_vars="$cross_cc_vars cross_cc_${cpu}"
1290 # For user-mode emulation the host arch has to be one we explicitly
1291 # support, even if we're using TCI.
1292 if [ "$ARCH" = "unknown" ]; then
1293 bsd_user="no"
1294 linux_user="no"
1297 default_target_list=""
1298 deprecated_targets_list=ppc64abi32-linux-user
1299 deprecated_features=""
1300 mak_wilds=""
1302 if [ "$softmmu" = "yes" ]; then
1303 mak_wilds="${mak_wilds} $source_path/configs/targets/*-softmmu.mak"
1305 if [ "$linux_user" = "yes" ]; then
1306 mak_wilds="${mak_wilds} $source_path/configs/targets/*-linux-user.mak"
1308 if [ "$bsd_user" = "yes" ]; then
1309 mak_wilds="${mak_wilds} $source_path/configs/targets/*-bsd-user.mak"
1312 # If the user doesn't explicitly specify a deprecated target we will
1313 # skip it.
1314 if test -z "$target_list"; then
1315 if test -z "$target_list_exclude"; then
1316 target_list_exclude="$deprecated_targets_list"
1317 else
1318 target_list_exclude="$target_list_exclude,$deprecated_targets_list"
1322 for config in $mak_wilds; do
1323 target="$(basename "$config" .mak)"
1324 if echo "$target_list_exclude" | grep -vq "$target"; then
1325 default_target_list="${default_target_list} $target"
1327 done
1329 if test x"$show_help" = x"yes" ; then
1330 cat << EOF
1332 Usage: configure [options]
1333 Options: [defaults in brackets after descriptions]
1335 Standard options:
1336 --help print this message
1337 --prefix=PREFIX install in PREFIX [$prefix]
1338 --interp-prefix=PREFIX where to find shared libraries, etc.
1339 use %M for cpu name [$interp_prefix]
1340 --target-list=LIST set target list (default: build all non-deprecated)
1341 $(echo Available targets: $default_target_list | \
1342 fold -s -w 53 | sed -e 's/^/ /')
1343 $(echo Deprecated targets: $deprecated_targets_list | \
1344 fold -s -w 53 | sed -e 's/^/ /')
1345 --target-list-exclude=LIST exclude a set of targets from the default target-list
1347 Advanced options (experts only):
1348 --cross-prefix=PREFIX use PREFIX for compile tools, PREFIX can be blank [$cross_prefix]
1349 --cc=CC use C compiler CC [$cc]
1350 --iasl=IASL use ACPI compiler IASL [$iasl]
1351 --host-cc=CC use C compiler CC [$host_cc] for code run at
1352 build time
1353 --cxx=CXX use C++ compiler CXX [$cxx]
1354 --objcc=OBJCC use Objective-C compiler OBJCC [$objcc]
1355 --extra-cflags=CFLAGS append extra C compiler flags CFLAGS
1356 --extra-cxxflags=CXXFLAGS append extra C++ compiler flags CXXFLAGS
1357 --extra-ldflags=LDFLAGS append extra linker flags LDFLAGS
1358 --cross-cc-ARCH=CC use compiler when building ARCH guest test cases
1359 --cross-cc-flags-ARCH= use compiler flags when building ARCH guest tests
1360 --make=MAKE use specified make [$make]
1361 --python=PYTHON use specified python [$python]
1362 --sphinx-build=SPHINX use specified sphinx-build [$sphinx_build]
1363 --meson=MESON use specified meson [$meson]
1364 --ninja=NINJA use specified ninja [$ninja]
1365 --smbd=SMBD use specified smbd [$smbd]
1366 --with-git=GIT use specified git [$git]
1367 --with-git-submodules=update update git submodules (default if .git dir exists)
1368 --with-git-submodules=validate fail if git submodules are not up to date
1369 --with-git-submodules=ignore do not update or check git submodules (default if no .git dir)
1370 --static enable static build [$static]
1371 --mandir=PATH install man pages in PATH
1372 --datadir=PATH install firmware in PATH/$qemu_suffix
1373 --localedir=PATH install translation in PATH/$qemu_suffix
1374 --docdir=PATH install documentation in PATH/$qemu_suffix
1375 --bindir=PATH install binaries in PATH
1376 --libdir=PATH install libraries in PATH
1377 --libexecdir=PATH install helper binaries in PATH
1378 --sysconfdir=PATH install config in PATH/$qemu_suffix
1379 --localstatedir=PATH install local state in PATH (set at runtime on win32)
1380 --firmwarepath=PATH search PATH for firmware files
1381 --efi-aarch64=PATH PATH of efi file to use for aarch64 VMs.
1382 --with-suffix=SUFFIX suffix for QEMU data inside datadir/libdir/sysconfdir/docdir [$qemu_suffix]
1383 --with-pkgversion=VERS use specified string as sub-version of the package
1384 --without-default-features default all --enable-* options to "disabled"
1385 --without-default-devices do not include any device that is not needed to
1386 start the emulator (only use if you are including
1387 desired devices in configs/devices/)
1388 --with-devices-ARCH=NAME override default configs/devices
1389 --enable-debug enable common debug build options
1390 --enable-sanitizers enable default sanitizers
1391 --enable-tsan enable thread sanitizer
1392 --disable-strip disable stripping binaries
1393 --disable-werror disable compilation abort on warning
1394 --disable-stack-protector disable compiler-provided stack protection
1395 --audio-drv-list=LIST set audio drivers to try if -audiodev is not used
1396 --block-drv-whitelist=L Same as --block-drv-rw-whitelist=L
1397 --block-drv-rw-whitelist=L
1398 set block driver read-write whitelist
1399 (by default affects only QEMU, not tools like qemu-img)
1400 --block-drv-ro-whitelist=L
1401 set block driver read-only whitelist
1402 (by default affects only QEMU, not tools like qemu-img)
1403 --enable-block-drv-whitelist-in-tools
1404 use block whitelist also in tools instead of only QEMU
1405 --with-trace-file=NAME Full PATH,NAME of file to store traces
1406 Default:trace-<pid>
1407 --cpu=CPU Build for host CPU [$cpu]
1408 --with-coroutine=BACKEND coroutine backend. Supported options:
1409 ucontext, sigaltstack, windows
1410 --enable-gcov enable test coverage analysis with gcov
1411 --with-vss-sdk=SDK-path enable Windows VSS support in QEMU Guest Agent
1412 --with-win-sdk=SDK-path path to Windows Platform SDK (to build VSS .tlb)
1413 --tls-priority default TLS protocol/cipher priority string
1414 --enable-gprof QEMU profiling with gprof
1415 --enable-profiler profiler support
1416 --enable-debug-stack-usage
1417 track the maximum stack usage of stacks created by qemu_alloc_stack
1418 --enable-plugins
1419 enable plugins via shared library loading
1420 --disable-containers don't use containers for cross-building
1421 --gdb=GDB-path gdb to use for gdbstub tests [$gdb_bin]
1423 meson_options_help
1424 cat << EOF
1425 system all system emulation targets
1426 user supported user emulation targets
1427 linux-user all linux usermode emulation targets
1428 bsd-user all BSD usermode emulation targets
1429 guest-agent build the QEMU Guest Agent
1430 pie Position Independent Executables
1431 modules modules support (non-Windows)
1432 module-upgrades try to load modules from alternate paths for upgrades
1433 debug-tcg TCG debugging (default is disabled)
1434 debug-info debugging information
1435 lto Enable Link-Time Optimization.
1436 safe-stack SafeStack Stack Smash Protection. Depends on
1437 clang/llvm >= 3.7 and requires coroutine backend ucontext.
1438 membarrier membarrier system call (for Linux 4.14+ or Windows)
1439 rdma Enable RDMA-based migration
1440 pvrdma Enable PVRDMA support
1441 vhost-net vhost-net kernel acceleration support
1442 vhost-vsock virtio sockets device support
1443 vhost-scsi vhost-scsi kernel target support
1444 vhost-crypto vhost-user-crypto backend support
1445 vhost-kernel vhost kernel backend support
1446 vhost-user vhost-user backend support
1447 vhost-vdpa vhost-vdpa kernel backend support
1448 live-block-migration Block migration in the main migration stream
1449 coroutine-pool coroutine freelist (better performance)
1450 tpm TPM support
1451 libssh ssh block device support
1452 numa libnuma support
1453 avx2 AVX2 optimization support
1454 avx512f AVX512F optimization support
1455 replication replication support
1456 opengl opengl support
1457 xfsctl xfsctl support
1458 qom-cast-debug cast debugging support
1459 tools build qemu-io, qemu-nbd and qemu-img tools
1460 bochs bochs image format support
1461 cloop cloop image format support
1462 dmg dmg image format support
1463 qcow1 qcow v1 image format support
1464 vdi vdi image format support
1465 vvfat vvfat image format support
1466 qed qed image format support
1467 parallels parallels image format support
1468 crypto-afalg Linux AF_ALG crypto backend driver
1469 debug-mutex mutex debugging support
1470 rng-none dummy RNG, avoid using /dev/(u)random and getrandom()
1471 gio libgio support
1472 slirp-smbd use smbd (at path --smbd=*) in slirp networking
1474 NOTE: The object files are built at the place where configure is launched
1476 exit 0
1479 # Remove old dependency files to make sure that they get properly regenerated
1480 rm -f */config-devices.mak.d
1482 if test -z "$python"
1483 then
1484 error_exit "Python not found. Use --python=/path/to/python"
1486 if ! has "$make"
1487 then
1488 error_exit "GNU make ($make) not found"
1491 # Note that if the Python conditional here evaluates True we will exit
1492 # with status 1 which is a shell 'false' value.
1493 if ! $python -c 'import sys; sys.exit(sys.version_info < (3,6))'; then
1494 error_exit "Cannot use '$python', Python >= 3.6 is required." \
1495 "Use --python=/path/to/python to specify a supported Python."
1498 # Preserve python version since some functionality is dependent on it
1499 python_version=$($python -c 'import sys; print("%d.%d.%d" % (sys.version_info[0], sys.version_info[1], sys.version_info[2]))' 2>/dev/null)
1501 # Suppress writing compiled files
1502 python="$python -B"
1504 if test -z "$meson"; then
1505 if test "$explicit_python" = no && has meson && version_ge "$(meson --version)" 0.59.3; then
1506 meson=meson
1507 elif test $git_submodules_action != 'ignore' ; then
1508 meson=git
1509 elif test -e "${source_path}/meson/meson.py" ; then
1510 meson=internal
1511 else
1512 if test "$explicit_python" = yes; then
1513 error_exit "--python requires using QEMU's embedded Meson distribution, but it was not found."
1514 else
1515 error_exit "Meson not found. Use --meson=/path/to/meson"
1518 else
1519 # Meson uses its own Python interpreter to invoke other Python scripts,
1520 # but the user wants to use the one they specified with --python.
1522 # We do not want to override the distro Python interpreter (and sometimes
1523 # cannot: for example in Homebrew /usr/bin/meson is a bash script), so
1524 # just require --meson=git|internal together with --python.
1525 if test "$explicit_python" = yes; then
1526 case "$meson" in
1527 git | internal) ;;
1528 *) error_exit "--python requires using QEMU's embedded Meson distribution." ;;
1529 esac
1533 if test "$meson" = git; then
1534 git_submodules="${git_submodules} meson"
1537 case "$meson" in
1538 git | internal)
1539 meson="$python ${source_path}/meson/meson.py"
1541 *) meson=$(command -v "$meson") ;;
1542 esac
1544 # Probe for ninja
1546 if test -z "$ninja"; then
1547 for c in ninja ninja-build samu; do
1548 if has $c; then
1549 ninja=$(command -v "$c")
1550 break
1552 done
1553 if test -z "$ninja"; then
1554 error_exit "Cannot find Ninja"
1558 # Check that the C compiler works. Doing this here before testing
1559 # the host CPU ensures that we had a valid CC to autodetect the
1560 # $cpu var (and we should bail right here if that's not the case).
1561 # It also allows the help message to be printed without a CC.
1562 write_c_skeleton;
1563 if compile_object ; then
1564 : C compiler works ok
1565 else
1566 error_exit "\"$cc\" either does not exist or does not work"
1568 if ! compile_prog ; then
1569 error_exit "\"$cc\" cannot build an executable (is your linker broken?)"
1572 # Consult white-list to determine whether to enable werror
1573 # by default. Only enable by default for git builds
1574 if test -z "$werror" ; then
1575 if test "$git_submodules_action" != "ignore" && \
1576 { test "$linux" = "yes" || test "$mingw32" = "yes"; }; then
1577 werror="yes"
1578 else
1579 werror="no"
1583 if test "$targetos" = "bogus"; then
1584 # Now that we know that we're not printing the help and that
1585 # the compiler works (so the results of the check_defines we used
1586 # to identify the OS are reliable), if we didn't recognize the
1587 # host OS we should stop now.
1588 error_exit "Unrecognized host OS (uname -s reports '$(uname -s)')"
1591 # Check whether the compiler matches our minimum requirements:
1592 cat > $TMPC << EOF
1593 #if defined(__clang_major__) && defined(__clang_minor__)
1594 # ifdef __apple_build_version__
1595 # if __clang_major__ < 10 || (__clang_major__ == 10 && __clang_minor__ < 0)
1596 # error You need at least XCode Clang v10.0 to compile QEMU
1597 # endif
1598 # else
1599 # if __clang_major__ < 6 || (__clang_major__ == 6 && __clang_minor__ < 0)
1600 # error You need at least Clang v6.0 to compile QEMU
1601 # endif
1602 # endif
1603 #elif defined(__GNUC__) && defined(__GNUC_MINOR__)
1604 # if __GNUC__ < 7 || (__GNUC__ == 7 && __GNUC_MINOR__ < 4)
1605 # error You need at least GCC v7.4.0 to compile QEMU
1606 # endif
1607 #else
1608 # error You either need GCC or Clang to compiler QEMU
1609 #endif
1610 int main (void) { return 0; }
1612 if ! compile_prog "" "" ; then
1613 error_exit "You need at least GCC v7.4 or Clang v6.0 (or XCode Clang v10.0)"
1616 # Accumulate -Wfoo and -Wno-bar separately.
1617 # We will list all of the enable flags first, and the disable flags second.
1618 # Note that we do not add -Werror, because that would enable it for all
1619 # configure tests. If a configure test failed due to -Werror this would
1620 # just silently disable some features, so it's too error prone.
1622 warn_flags=
1623 add_to warn_flags -Wold-style-declaration
1624 add_to warn_flags -Wold-style-definition
1625 add_to warn_flags -Wtype-limits
1626 add_to warn_flags -Wformat-security
1627 add_to warn_flags -Wformat-y2k
1628 add_to warn_flags -Winit-self
1629 add_to warn_flags -Wignored-qualifiers
1630 add_to warn_flags -Wempty-body
1631 add_to warn_flags -Wnested-externs
1632 add_to warn_flags -Wendif-labels
1633 add_to warn_flags -Wexpansion-to-defined
1634 add_to warn_flags -Wimplicit-fallthrough=2
1636 nowarn_flags=
1637 add_to nowarn_flags -Wno-initializer-overrides
1638 add_to nowarn_flags -Wno-missing-include-dirs
1639 add_to nowarn_flags -Wno-shift-negative-value
1640 add_to nowarn_flags -Wno-string-plus-int
1641 add_to nowarn_flags -Wno-typedef-redefinition
1642 add_to nowarn_flags -Wno-tautological-type-limit-compare
1643 add_to nowarn_flags -Wno-psabi
1645 gcc_flags="$warn_flags $nowarn_flags"
1647 cc_has_warning_flag() {
1648 write_c_skeleton;
1650 # Use the positive sense of the flag when testing for -Wno-wombat
1651 # support (gcc will happily accept the -Wno- form of unknown
1652 # warning options).
1653 optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
1654 compile_prog "-Werror $optflag" ""
1657 for flag in $gcc_flags; do
1658 if cc_has_warning_flag $flag ; then
1659 QEMU_CFLAGS="$QEMU_CFLAGS $flag"
1661 done
1663 if test "$stack_protector" != "no"; then
1664 cat > $TMPC << EOF
1665 int main(int argc, char *argv[])
1667 char arr[64], *p = arr, *c = argv[0];
1668 while (*c) {
1669 *p++ = *c++;
1671 return 0;
1674 gcc_flags="-fstack-protector-strong -fstack-protector-all"
1675 sp_on=0
1676 for flag in $gcc_flags; do
1677 # We need to check both a compile and a link, since some compiler
1678 # setups fail only on a .c->.o compile and some only at link time
1679 if compile_object "-Werror $flag" &&
1680 compile_prog "-Werror $flag" ""; then
1681 QEMU_CFLAGS="$QEMU_CFLAGS $flag"
1682 QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
1683 sp_on=1
1684 break
1686 done
1687 if test "$stack_protector" = yes; then
1688 if test $sp_on = 0; then
1689 error_exit "Stack protector not supported"
1694 # Disable -Wmissing-braces on older compilers that warn even for
1695 # the "universal" C zero initializer {0}.
1696 cat > $TMPC << EOF
1697 struct {
1698 int a[2];
1699 } x = {0};
1701 if compile_object "-Werror" "" ; then
1703 else
1704 QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces"
1707 # Our module code doesn't support Windows
1708 if test "$modules" = "yes" && test "$mingw32" = "yes" ; then
1709 error_exit "Modules are not available for Windows"
1712 # module_upgrades is only reasonable if modules are enabled
1713 if test "$modules" = "no" && test "$module_upgrades" = "yes" ; then
1714 error_exit "Can't enable module-upgrades as Modules are not enabled"
1717 # Static linking is not possible with plugins, modules or PIE
1718 if test "$static" = "yes" ; then
1719 if test "$modules" = "yes" ; then
1720 error_exit "static and modules are mutually incompatible"
1722 if test "$plugins" = "yes"; then
1723 error_exit "static and plugins are mutually incompatible"
1724 else
1725 plugins="no"
1729 cat > $TMPC << EOF
1731 #ifdef __linux__
1732 # define THREAD __thread
1733 #else
1734 # define THREAD
1735 #endif
1736 static THREAD int tls_var;
1737 int main(void) { return tls_var; }
1740 # Check we support -fno-pie and -no-pie first; we will need the former for
1741 # building ROMs, and both for everything if --disable-pie is passed.
1742 if compile_prog "-Werror -fno-pie" "-no-pie"; then
1743 CFLAGS_NOPIE="-fno-pie"
1744 LDFLAGS_NOPIE="-no-pie"
1747 if test "$static" = "yes"; then
1748 if test "$pie" != "no" && compile_prog "-Werror -fPIE -DPIE" "-static-pie"; then
1749 CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
1750 QEMU_LDFLAGS="-static-pie $QEMU_LDFLAGS"
1751 pie="yes"
1752 elif test "$pie" = "yes"; then
1753 error_exit "-static-pie not available due to missing toolchain support"
1754 else
1755 QEMU_LDFLAGS="-static $QEMU_LDFLAGS"
1756 pie="no"
1758 elif test "$pie" = "no"; then
1759 CONFIGURE_CFLAGS="$CFLAGS_NOPIE $CONFIGURE_CFLAGS"
1760 CONFIGURE_LDFLAGS="$LDFLAGS_NOPIE $CONFIGURE_LDFLAGS"
1761 elif compile_prog "-Werror -fPIE -DPIE" "-pie"; then
1762 CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
1763 CONFIGURE_LDFLAGS="-pie $CONFIGURE_LDFLAGS"
1764 pie="yes"
1765 elif test "$pie" = "yes"; then
1766 error_exit "PIE not available due to missing toolchain support"
1767 else
1768 echo "Disabling PIE due to missing toolchain support"
1769 pie="no"
1772 # Detect support for PT_GNU_RELRO + DT_BIND_NOW.
1773 # The combination is known as "full relro", because .got.plt is read-only too.
1774 if compile_prog "" "-Wl,-z,relro -Wl,-z,now" ; then
1775 QEMU_LDFLAGS="-Wl,-z,relro -Wl,-z,now $QEMU_LDFLAGS"
1778 ##########################################
1779 # __sync_fetch_and_and requires at least -march=i486. Many toolchains
1780 # use i686 as default anyway, but for those that don't, an explicit
1781 # specification is necessary
1783 if test "$cpu" = "i386"; then
1784 cat > $TMPC << EOF
1785 static int sfaa(int *ptr)
1787 return __sync_fetch_and_and(ptr, 0);
1790 int main(void)
1792 int val = 42;
1793 val = __sync_val_compare_and_swap(&val, 0, 1);
1794 sfaa(&val);
1795 return val;
1798 if ! compile_prog "" "" ; then
1799 QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS"
1803 if test "$tcg" = "enabled"; then
1804 git_submodules="$git_submodules tests/fp/berkeley-testfloat-3"
1805 git_submodules="$git_submodules tests/fp/berkeley-softfloat-3"
1808 if test -z "${target_list+xxx}" ; then
1809 default_targets=yes
1810 for target in $default_target_list; do
1811 target_list="$target_list $target"
1812 done
1813 target_list="${target_list# }"
1814 else
1815 default_targets=no
1816 target_list=$(echo "$target_list" | sed -e 's/,/ /g')
1817 for target in $target_list; do
1818 # Check that we recognised the target name; this allows a more
1819 # friendly error message than if we let it fall through.
1820 case " $default_target_list " in
1821 *" $target "*)
1824 error_exit "Unknown target name '$target'"
1826 esac
1827 done
1830 for target in $target_list; do
1831 # if a deprecated target is enabled we note it here
1832 if echo "$deprecated_targets_list" | grep -q "$target"; then
1833 add_to deprecated_features $target
1835 done
1837 # see if system emulation was really requested
1838 case " $target_list " in
1839 *"-softmmu "*) softmmu=yes
1841 *) softmmu=no
1843 esac
1845 feature_not_found() {
1846 feature=$1
1847 remedy=$2
1849 error_exit "User requested feature $feature" \
1850 "configure was not able to find it." \
1851 "$remedy"
1854 # ---
1855 # big/little endian test
1856 cat > $TMPC << EOF
1857 #include <stdio.h>
1858 short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, };
1859 short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, };
1860 int main(int argc, char *argv[])
1862 return printf("%s %s\n", (char *)big_endian, (char *)little_endian);
1866 if compile_prog ; then
1867 if strings -a $TMPE | grep -q BiGeNdIaN ; then
1868 bigendian="yes"
1869 elif strings -a $TMPE | grep -q LiTtLeEnDiAn ; then
1870 bigendian="no"
1871 else
1872 echo big/little test failed
1873 exit 1
1875 else
1876 echo big/little test failed
1877 exit 1
1880 ##########################################
1881 # system tools
1882 if test -z "$want_tools"; then
1883 if test "$softmmu" = "no"; then
1884 want_tools=no
1885 else
1886 want_tools=yes
1890 #########################################
1891 # vhost interdependencies and host support
1893 # vhost backends
1894 if test "$vhost_user" = "yes" && test "$linux" != "yes"; then
1895 error_exit "vhost-user is only available on Linux"
1897 test "$vhost_vdpa" = "" && vhost_vdpa=$linux
1898 if test "$vhost_vdpa" = "yes" && test "$linux" != "yes"; then
1899 error_exit "vhost-vdpa is only available on Linux"
1901 test "$vhost_kernel" = "" && vhost_kernel=$linux
1902 if test "$vhost_kernel" = "yes" && test "$linux" != "yes"; then
1903 error_exit "vhost-kernel is only available on Linux"
1906 # vhost-kernel devices
1907 test "$vhost_scsi" = "" && vhost_scsi=$vhost_kernel
1908 if test "$vhost_scsi" = "yes" && test "$vhost_kernel" != "yes"; then
1909 error_exit "--enable-vhost-scsi requires --enable-vhost-kernel"
1911 test "$vhost_vsock" = "" && vhost_vsock=$vhost_kernel
1912 if test "$vhost_vsock" = "yes" && test "$vhost_kernel" != "yes"; then
1913 error_exit "--enable-vhost-vsock requires --enable-vhost-kernel"
1916 # vhost-user backends
1917 test "$vhost_net_user" = "" && vhost_net_user=$vhost_user
1918 if test "$vhost_net_user" = "yes" && test "$vhost_user" = "no"; then
1919 error_exit "--enable-vhost-net-user requires --enable-vhost-user"
1921 test "$vhost_crypto" = "" && vhost_crypto=$vhost_user
1922 if test "$vhost_crypto" = "yes" && test "$vhost_user" = "no"; then
1923 error_exit "--enable-vhost-crypto requires --enable-vhost-user"
1925 test "$vhost_user_fs" = "" && vhost_user_fs=$vhost_user
1926 if test "$vhost_user_fs" = "yes" && test "$vhost_user" = "no"; then
1927 error_exit "--enable-vhost-user-fs requires --enable-vhost-user"
1929 #vhost-vdpa backends
1930 test "$vhost_net_vdpa" = "" && vhost_net_vdpa=$vhost_vdpa
1931 if test "$vhost_net_vdpa" = "yes" && test "$vhost_vdpa" = "no"; then
1932 error_exit "--enable-vhost-net-vdpa requires --enable-vhost-vdpa"
1935 # OR the vhost-kernel, vhost-vdpa and vhost-user values for simplicity
1936 if test "$vhost_net" = ""; then
1937 test "$vhost_net_user" = "yes" && vhost_net=yes
1938 test "$vhost_net_vdpa" = "yes" && vhost_net=yes
1939 test "$vhost_kernel" = "yes" && vhost_net=yes
1942 ##########################################
1943 # pkg-config probe
1945 if ! has "$pkg_config_exe"; then
1946 error_exit "pkg-config binary '$pkg_config_exe' not found"
1949 ##########################################
1950 # xen probe
1952 if test "$xen" != "disabled" ; then
1953 # Check whether Xen library path is specified via --extra-ldflags to avoid
1954 # overriding this setting with pkg-config output. If not, try pkg-config
1955 # to obtain all needed flags.
1957 if ! echo $EXTRA_LDFLAGS | grep tools/libxc > /dev/null && \
1958 $pkg_config --exists xencontrol ; then
1959 xen_ctrl_version="$(printf '%d%02d%02d' \
1960 $($pkg_config --modversion xencontrol | sed 's/\./ /g') )"
1961 xen=enabled
1962 xen_pc="xencontrol xenstore xenforeignmemory xengnttab"
1963 xen_pc="$xen_pc xenevtchn xendevicemodel"
1964 if $pkg_config --exists xentoolcore; then
1965 xen_pc="$xen_pc xentoolcore"
1967 xen_cflags="$($pkg_config --cflags $xen_pc)"
1968 xen_libs="$($pkg_config --libs $xen_pc)"
1969 else
1971 xen_libs="-lxenstore -lxenctrl"
1972 xen_stable_libs="-lxenforeignmemory -lxengnttab -lxenevtchn"
1974 # First we test whether Xen headers and libraries are available.
1975 # If no, we are done and there is no Xen support.
1976 # If yes, more tests are run to detect the Xen version.
1978 # Xen (any)
1979 cat > $TMPC <<EOF
1980 #include <xenctrl.h>
1981 int main(void) {
1982 return 0;
1985 if ! compile_prog "" "$xen_libs" ; then
1986 # Xen not found
1987 if test "$xen" = "enabled" ; then
1988 feature_not_found "xen" "Install xen devel"
1990 xen=disabled
1992 # Xen unstable
1993 elif
1994 cat > $TMPC <<EOF &&
1995 #undef XC_WANT_COMPAT_DEVICEMODEL_API
1996 #define __XEN_TOOLS__
1997 #include <xendevicemodel.h>
1998 #include <xenforeignmemory.h>
1999 int main(void) {
2000 xendevicemodel_handle *xd;
2001 xenforeignmemory_handle *xfmem;
2003 xd = xendevicemodel_open(0, 0);
2004 xendevicemodel_pin_memory_cacheattr(xd, 0, 0, 0, 0);
2006 xfmem = xenforeignmemory_open(0, 0);
2007 xenforeignmemory_map_resource(xfmem, 0, 0, 0, 0, 0, NULL, 0, 0);
2009 return 0;
2012 compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2013 then
2014 xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2015 xen_ctrl_version=41100
2016 xen=enabled
2017 elif
2018 cat > $TMPC <<EOF &&
2019 #undef XC_WANT_COMPAT_MAP_FOREIGN_API
2020 #include <xenforeignmemory.h>
2021 #include <xentoolcore.h>
2022 int main(void) {
2023 xenforeignmemory_handle *xfmem;
2025 xfmem = xenforeignmemory_open(0, 0);
2026 xenforeignmemory_map2(xfmem, 0, 0, 0, 0, 0, 0, 0);
2027 xentoolcore_restrict_all(0);
2029 return 0;
2032 compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs -lxentoolcore"
2033 then
2034 xen_stable_libs="-lxendevicemodel $xen_stable_libs -lxentoolcore"
2035 xen_ctrl_version=41000
2036 xen=enabled
2037 elif
2038 cat > $TMPC <<EOF &&
2039 #undef XC_WANT_COMPAT_DEVICEMODEL_API
2040 #define __XEN_TOOLS__
2041 #include <xendevicemodel.h>
2042 int main(void) {
2043 xendevicemodel_handle *xd;
2045 xd = xendevicemodel_open(0, 0);
2046 xendevicemodel_close(xd);
2048 return 0;
2051 compile_prog "" "$xen_libs -lxendevicemodel $xen_stable_libs"
2052 then
2053 xen_stable_libs="-lxendevicemodel $xen_stable_libs"
2054 xen_ctrl_version=40900
2055 xen=enabled
2056 elif
2057 cat > $TMPC <<EOF &&
2059 * If we have stable libs the we don't want the libxc compat
2060 * layers, regardless of what CFLAGS we may have been given.
2062 * Also, check if xengnttab_grant_copy_segment_t is defined and
2063 * grant copy operation is implemented.
2065 #undef XC_WANT_COMPAT_EVTCHN_API
2066 #undef XC_WANT_COMPAT_GNTTAB_API
2067 #undef XC_WANT_COMPAT_MAP_FOREIGN_API
2068 #include <xenctrl.h>
2069 #include <xenstore.h>
2070 #include <xenevtchn.h>
2071 #include <xengnttab.h>
2072 #include <xenforeignmemory.h>
2073 #include <stdint.h>
2074 #include <xen/hvm/hvm_info_table.h>
2075 #if !defined(HVM_MAX_VCPUS)
2076 # error HVM_MAX_VCPUS not defined
2077 #endif
2078 int main(void) {
2079 xc_interface *xc = NULL;
2080 xenforeignmemory_handle *xfmem;
2081 xenevtchn_handle *xe;
2082 xengnttab_handle *xg;
2083 xengnttab_grant_copy_segment_t* seg = NULL;
2085 xs_daemon_open();
2087 xc = xc_interface_open(0, 0, 0);
2088 xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2089 xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2090 xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2091 xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2093 xfmem = xenforeignmemory_open(0, 0);
2094 xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2096 xe = xenevtchn_open(0, 0);
2097 xenevtchn_fd(xe);
2099 xg = xengnttab_open(0, 0);
2100 xengnttab_grant_copy(xg, 0, seg);
2102 return 0;
2105 compile_prog "" "$xen_libs $xen_stable_libs"
2106 then
2107 xen_ctrl_version=40800
2108 xen=enabled
2109 elif
2110 cat > $TMPC <<EOF &&
2112 * If we have stable libs the we don't want the libxc compat
2113 * layers, regardless of what CFLAGS we may have been given.
2115 #undef XC_WANT_COMPAT_EVTCHN_API
2116 #undef XC_WANT_COMPAT_GNTTAB_API
2117 #undef XC_WANT_COMPAT_MAP_FOREIGN_API
2118 #include <xenctrl.h>
2119 #include <xenstore.h>
2120 #include <xenevtchn.h>
2121 #include <xengnttab.h>
2122 #include <xenforeignmemory.h>
2123 #include <stdint.h>
2124 #include <xen/hvm/hvm_info_table.h>
2125 #if !defined(HVM_MAX_VCPUS)
2126 # error HVM_MAX_VCPUS not defined
2127 #endif
2128 int main(void) {
2129 xc_interface *xc = NULL;
2130 xenforeignmemory_handle *xfmem;
2131 xenevtchn_handle *xe;
2132 xengnttab_handle *xg;
2134 xs_daemon_open();
2136 xc = xc_interface_open(0, 0, 0);
2137 xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2138 xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2139 xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2140 xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2142 xfmem = xenforeignmemory_open(0, 0);
2143 xenforeignmemory_map(xfmem, 0, 0, 0, 0, 0);
2145 xe = xenevtchn_open(0, 0);
2146 xenevtchn_fd(xe);
2148 xg = xengnttab_open(0, 0);
2149 xengnttab_map_grant_ref(xg, 0, 0, 0);
2151 return 0;
2154 compile_prog "" "$xen_libs $xen_stable_libs"
2155 then
2156 xen_ctrl_version=40701
2157 xen=enabled
2159 # Xen 4.6
2160 elif
2161 cat > $TMPC <<EOF &&
2162 #include <xenctrl.h>
2163 #include <xenstore.h>
2164 #include <stdint.h>
2165 #include <xen/hvm/hvm_info_table.h>
2166 #if !defined(HVM_MAX_VCPUS)
2167 # error HVM_MAX_VCPUS not defined
2168 #endif
2169 int main(void) {
2170 xc_interface *xc;
2171 xs_daemon_open();
2172 xc = xc_interface_open(0, 0, 0);
2173 xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2174 xc_gnttab_open(NULL, 0);
2175 xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2176 xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2177 xc_hvm_create_ioreq_server(xc, 0, HVM_IOREQSRV_BUFIOREQ_ATOMIC, NULL);
2178 xc_reserved_device_memory_map(xc, 0, 0, 0, 0, NULL, 0);
2179 return 0;
2182 compile_prog "" "$xen_libs"
2183 then
2184 xen_ctrl_version=40600
2185 xen=enabled
2187 # Xen 4.5
2188 elif
2189 cat > $TMPC <<EOF &&
2190 #include <xenctrl.h>
2191 #include <xenstore.h>
2192 #include <stdint.h>
2193 #include <xen/hvm/hvm_info_table.h>
2194 #if !defined(HVM_MAX_VCPUS)
2195 # error HVM_MAX_VCPUS not defined
2196 #endif
2197 int main(void) {
2198 xc_interface *xc;
2199 xs_daemon_open();
2200 xc = xc_interface_open(0, 0, 0);
2201 xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2202 xc_gnttab_open(NULL, 0);
2203 xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2204 xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2205 xc_hvm_create_ioreq_server(xc, 0, 0, NULL);
2206 return 0;
2209 compile_prog "" "$xen_libs"
2210 then
2211 xen_ctrl_version=40500
2212 xen=enabled
2214 elif
2215 cat > $TMPC <<EOF &&
2216 #include <xenctrl.h>
2217 #include <xenstore.h>
2218 #include <stdint.h>
2219 #include <xen/hvm/hvm_info_table.h>
2220 #if !defined(HVM_MAX_VCPUS)
2221 # error HVM_MAX_VCPUS not defined
2222 #endif
2223 int main(void) {
2224 xc_interface *xc;
2225 xs_daemon_open();
2226 xc = xc_interface_open(0, 0, 0);
2227 xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
2228 xc_gnttab_open(NULL, 0);
2229 xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
2230 xc_hvm_inject_msi(xc, 0, 0xf0000000, 0x00000000);
2231 return 0;
2234 compile_prog "" "$xen_libs"
2235 then
2236 xen_ctrl_version=40200
2237 xen=enabled
2239 else
2240 if test "$xen" = "enabled" ; then
2241 feature_not_found "xen (unsupported version)" \
2242 "Install a supported xen (xen 4.2 or newer)"
2244 xen=disabled
2247 if test "$xen" = enabled; then
2248 if test $xen_ctrl_version -ge 40701 ; then
2249 xen_libs="$xen_libs $xen_stable_libs "
2255 ##########################################
2256 # RDMA needs OpenFabrics libraries
2257 if test "$rdma" != "no" ; then
2258 cat > $TMPC <<EOF
2259 #include <rdma/rdma_cma.h>
2260 int main(void) { return 0; }
2262 rdma_libs="-lrdmacm -libverbs -libumad"
2263 if compile_prog "" "$rdma_libs" ; then
2264 rdma="yes"
2265 else
2266 if test "$rdma" = "yes" ; then
2267 error_exit \
2268 " OpenFabrics librdmacm/libibverbs/libibumad not present." \
2269 " Your options:" \
2270 " (1) Fast: Install infiniband packages (devel) from your distro." \
2271 " (2) Cleanest: Install libraries from www.openfabrics.org" \
2272 " (3) Also: Install softiwarp if you don't have RDMA hardware"
2274 rdma="no"
2278 ##########################################
2279 # PVRDMA detection
2281 cat > $TMPC <<EOF &&
2282 #include <sys/mman.h>
2285 main(void)
2287 char buf = 0;
2288 void *addr = &buf;
2289 addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
2291 return 0;
2295 if test "$rdma" = "yes" ; then
2296 case "$pvrdma" in
2298 if compile_prog "" ""; then
2299 pvrdma="yes"
2300 else
2301 pvrdma="no"
2304 "yes")
2305 if ! compile_prog "" ""; then
2306 error_exit "PVRDMA is not supported since mremap is not implemented"
2308 pvrdma="yes"
2310 "no")
2311 pvrdma="no"
2313 esac
2314 else
2315 if test "$pvrdma" = "yes" ; then
2316 error_exit "PVRDMA requires rdma suppport"
2318 pvrdma="no"
2321 # Let's see if enhanced reg_mr is supported
2322 if test "$pvrdma" = "yes" ; then
2324 cat > $TMPC <<EOF &&
2325 #include <infiniband/verbs.h>
2328 main(void)
2330 struct ibv_mr *mr;
2331 struct ibv_pd *pd = NULL;
2332 size_t length = 10;
2333 uint64_t iova = 0;
2334 int access = 0;
2335 void *addr = NULL;
2337 mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
2339 ibv_dereg_mr(mr);
2341 return 0;
2344 if ! compile_prog "" "-libverbs"; then
2345 QEMU_CFLAGS="$QEMU_CFLAGS -DLEGACY_RDMA_REG_MR"
2349 ##########################################
2350 # xfsctl() probe, used for file-posix.c
2351 if test "$xfs" != "no" ; then
2352 cat > $TMPC << EOF
2353 #include <stddef.h> /* NULL */
2354 #include <xfs/xfs.h>
2355 int main(void)
2357 xfsctl(NULL, 0, 0, NULL);
2358 return 0;
2361 if compile_prog "" "" ; then
2362 xfs="yes"
2363 else
2364 if test "$xfs" = "yes" ; then
2365 feature_not_found "xfs" "Install xfsprogs/xfslibs devel"
2367 xfs=no
2371 ##########################################
2372 # plugin linker support probe
2374 if test "$plugins" != "no"; then
2376 #########################################
2377 # See if --dynamic-list is supported by the linker
2379 ld_dynamic_list="no"
2380 cat > $TMPTXT <<EOF
2382 foo;
2386 cat > $TMPC <<EOF
2387 #include <stdio.h>
2388 void foo(void);
2390 void foo(void)
2392 printf("foo\n");
2395 int main(void)
2397 foo();
2398 return 0;
2402 if compile_prog "" "-Wl,--dynamic-list=$TMPTXT" ; then
2403 ld_dynamic_list="yes"
2406 #########################################
2407 # See if -exported_symbols_list is supported by the linker
2409 ld_exported_symbols_list="no"
2410 cat > $TMPTXT <<EOF
2411 _foo
2414 if compile_prog "" "-Wl,-exported_symbols_list,$TMPTXT" ; then
2415 ld_exported_symbols_list="yes"
2418 if test "$ld_dynamic_list" = "no" &&
2419 test "$ld_exported_symbols_list" = "no" ; then
2420 if test "$plugins" = "yes"; then
2421 error_exit \
2422 "Plugin support requires dynamic linking and specifying a set of symbols " \
2423 "that are exported to plugins. Unfortunately your linker doesn't " \
2424 "support the flag (--dynamic-list or -exported_symbols_list) used " \
2425 "for this purpose."
2426 else
2427 plugins="no"
2429 else
2430 plugins="yes"
2434 ##########################################
2435 # glib support probe
2437 glib_req_ver=2.56
2438 glib_modules=gthread-2.0
2439 if test "$modules" = yes; then
2440 glib_modules="$glib_modules gmodule-export-2.0"
2441 elif test "$plugins" = "yes"; then
2442 glib_modules="$glib_modules gmodule-no-export-2.0"
2445 for i in $glib_modules; do
2446 if $pkg_config --atleast-version=$glib_req_ver $i; then
2447 glib_cflags=$($pkg_config --cflags $i)
2448 glib_libs=$($pkg_config --libs $i)
2449 else
2450 error_exit "glib-$glib_req_ver $i is required to compile QEMU"
2452 done
2454 # This workaround is required due to a bug in pkg-config file for glib as it
2455 # doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
2457 if test "$static" = yes && test "$mingw32" = yes; then
2458 glib_cflags="-DGLIB_STATIC_COMPILATION $glib_cflags"
2461 if ! test "$gio" = "no"; then
2462 pass=no
2463 if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
2464 gio_cflags=$($pkg_config --cflags gio-2.0)
2465 gio_libs=$($pkg_config --libs gio-2.0)
2466 gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
2467 if ! has "$gdbus_codegen"; then
2468 gdbus_codegen=
2470 # Check that the libraries actually work -- Ubuntu 18.04 ships
2471 # with pkg-config --static --libs data for gio-2.0 that is missing
2472 # -lblkid and will give a link error.
2473 cat > $TMPC <<EOF
2474 #include <gio/gio.h>
2475 int main(void)
2477 g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
2478 return 0;
2481 if compile_prog "$gio_cflags" "$gio_libs" ; then
2482 pass=yes
2483 else
2484 pass=no
2487 if test "$pass" = "yes" &&
2488 $pkg_config --atleast-version=$glib_req_ver gio-unix-2.0; then
2489 gio_cflags="$gio_cflags $($pkg_config --cflags gio-unix-2.0)"
2490 gio_libs="$gio_libs $($pkg_config --libs gio-unix-2.0)"
2494 if test "$pass" = "no"; then
2495 if test "$gio" = "yes"; then
2496 feature_not_found "gio" "Install libgio >= 2.0"
2497 else
2498 gio=no
2500 else
2501 gio=yes
2505 # Sanity check that the current size_t matches the
2506 # size that glib thinks it should be. This catches
2507 # problems on multi-arch where people try to build
2508 # 32-bit QEMU while pointing at 64-bit glib headers
2509 cat > $TMPC <<EOF
2510 #include <glib.h>
2511 #include <unistd.h>
2513 #define QEMU_BUILD_BUG_ON(x) \
2514 typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
2516 int main(void) {
2517 QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
2518 return 0;
2522 if ! compile_prog "$glib_cflags" "$glib_libs" ; then
2523 error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
2524 "You probably need to set PKG_CONFIG_LIBDIR"\
2525 "to point to the right pkg-config files for your"\
2526 "build target"
2529 # Silence clang warnings triggered by glib < 2.57.2
2530 cat > $TMPC << EOF
2531 #include <glib.h>
2532 typedef struct Foo {
2533 int i;
2534 } Foo;
2535 static void foo_free(Foo *f)
2537 g_free(f);
2539 G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free);
2540 int main(void) { return 0; }
2542 if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
2543 if cc_has_warning_flag "-Wno-unused-function"; then
2544 glib_cflags="$glib_cflags -Wno-unused-function"
2545 CONFIGURE_CFLAGS="$CONFIGURE_CFLAGS -Wno-unused-function"
2549 ##########################################
2550 # SHA command probe for modules
2551 if test "$modules" = yes; then
2552 shacmd_probe="sha1sum sha1 shasum"
2553 for c in $shacmd_probe; do
2554 if has $c; then
2555 shacmd="$c"
2556 break
2558 done
2559 if test "$shacmd" = ""; then
2560 error_exit "one of the checksum commands is required to enable modules: $shacmd_probe"
2564 ##########################################
2565 # libssh probe
2566 if test "$libssh" != "no" ; then
2567 if $pkg_config --exists "libssh >= 0.8.7"; then
2568 libssh_cflags=$($pkg_config libssh --cflags)
2569 libssh_libs=$($pkg_config libssh --libs)
2570 libssh=yes
2571 else
2572 if test "$libssh" = "yes" ; then
2573 error_exit "libssh required for --enable-libssh"
2575 libssh=no
2579 ##########################################
2580 # TPM emulation is only on POSIX
2582 if test "$tpm" = ""; then
2583 if test "$mingw32" = "yes"; then
2584 tpm=no
2585 else
2586 tpm=yes
2588 elif test "$tpm" = "yes"; then
2589 if test "$mingw32" = "yes" ; then
2590 error_exit "TPM emulation only available on POSIX systems"
2594 ##########################################
2595 # fdt probe
2597 case "$fdt" in
2598 auto | enabled | internal)
2599 # Simpler to always update submodule, even if not needed.
2600 git_submodules="${git_submodules} dtc"
2602 esac
2604 ##########################################
2605 # opengl probe (for sdl2, gtk)
2607 if test "$opengl" != "no" ; then
2608 epoxy=no
2609 if $pkg_config epoxy; then
2610 cat > $TMPC << EOF
2611 #include <epoxy/egl.h>
2612 int main(void) { return 0; }
2614 if compile_prog "" "" ; then
2615 epoxy=yes
2619 if test "$epoxy" = "yes" ; then
2620 opengl_cflags="$($pkg_config --cflags epoxy)"
2621 opengl_libs="$($pkg_config --libs epoxy)"
2622 opengl=yes
2623 else
2624 if test "$opengl" = "yes" ; then
2625 feature_not_found "opengl" "Please install epoxy with EGL"
2627 opengl_cflags=""
2628 opengl_libs=""
2629 opengl=no
2633 ##########################################
2634 # libnuma probe
2636 if test "$numa" != "no" ; then
2637 cat > $TMPC << EOF
2638 #include <numa.h>
2639 int main(void) { return numa_available(); }
2642 if compile_prog "" "-lnuma" ; then
2643 numa=yes
2644 numa_libs="-lnuma"
2645 else
2646 if test "$numa" = "yes" ; then
2647 feature_not_found "numa" "install numactl devel"
2649 numa=no
2653 # check for usbfs
2654 have_usbfs=no
2655 if test "$linux_user" = "yes"; then
2656 cat > $TMPC << EOF
2657 #include <linux/usbdevice_fs.h>
2659 #ifndef USBDEVFS_GET_CAPABILITIES
2660 #error "USBDEVFS_GET_CAPABILITIES undefined"
2661 #endif
2663 #ifndef USBDEVFS_DISCONNECT_CLAIM
2664 #error "USBDEVFS_DISCONNECT_CLAIM undefined"
2665 #endif
2667 int main(void)
2669 return 0;
2672 if compile_prog "" ""; then
2673 have_usbfs=yes
2677 ##########################################
2678 # check if we have VSS SDK headers for win
2680 if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
2681 test "$vss_win32_sdk" != "no" ; then
2682 case "$vss_win32_sdk" in
2683 "") vss_win32_include="-isystem $source_path" ;;
2684 *\ *) # The SDK is installed in "Program Files" by default, but we cannot
2685 # handle path with spaces. So we symlink the headers into ".sdk/vss".
2686 vss_win32_include="-isystem $source_path/.sdk/vss"
2687 symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
2689 *) vss_win32_include="-isystem $vss_win32_sdk"
2690 esac
2691 cat > $TMPC << EOF
2692 #define __MIDL_user_allocate_free_DEFINED__
2693 #include <inc/win2003/vss.h>
2694 int main(void) { return VSS_CTX_BACKUP; }
2696 if compile_prog "$vss_win32_include" "" ; then
2697 guest_agent_with_vss="yes"
2698 QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
2699 libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
2700 qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
2701 else
2702 if test "$vss_win32_sdk" != "" ; then
2703 echo "ERROR: Please download and install Microsoft VSS SDK:"
2704 echo "ERROR: http://www.microsoft.com/en-us/download/details.aspx?id=23490"
2705 echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
2706 echo "ERROR: scripts/extract-vsssdk-headers setup.exe"
2707 echo "ERROR: The headers are extracted in the directory \`inc'."
2708 feature_not_found "VSS support"
2710 guest_agent_with_vss="no"
2714 ##########################################
2715 # lookup Windows platform SDK (if not specified)
2716 # The SDK is needed only to build .tlb (type library) file of guest agent
2717 # VSS provider from the source. It is usually unnecessary because the
2718 # pre-compiled .tlb file is included.
2720 if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
2721 test "$guest_agent_with_vss" = "yes" ; then
2722 if test -z "$win_sdk"; then
2723 programfiles="$PROGRAMFILES"
2724 test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
2725 if test -n "$programfiles"; then
2726 win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
2727 else
2728 feature_not_found "Windows SDK"
2730 elif test "$win_sdk" = "no"; then
2731 win_sdk=""
2735 ##########################################
2736 # check if mingw environment provides a recent ntddscsi.h
2737 if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
2738 cat > $TMPC << EOF
2739 #include <windows.h>
2740 #include <ntddscsi.h>
2741 int main(void) {
2742 #if !defined(IOCTL_SCSI_GET_ADDRESS)
2743 #error Missing required ioctl definitions
2744 #endif
2745 SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
2746 return addr.Lun;
2749 if compile_prog "" "" ; then
2750 guest_agent_ntddscsi=yes
2751 libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
2755 ##########################################
2756 # capstone
2758 case "$capstone" in
2759 auto | enabled | internal)
2760 # Simpler to always update submodule, even if not needed.
2761 git_submodules="${git_submodules} capstone"
2763 esac
2765 ##########################################
2766 # check and set a backend for coroutine
2768 # We prefer ucontext, but it's not always possible. The fallback
2769 # is sigcontext. On Windows the only valid backend is the Windows
2770 # specific one.
2772 ucontext_works=no
2773 if test "$darwin" != "yes"; then
2774 cat > $TMPC << EOF
2775 #include <ucontext.h>
2776 #ifdef __stub_makecontext
2777 #error Ignoring glibc stub makecontext which will always fail
2778 #endif
2779 int main(void) { makecontext(0, 0, 0); return 0; }
2781 if compile_prog "" "" ; then
2782 ucontext_works=yes
2786 if test "$coroutine" = ""; then
2787 if test "$mingw32" = "yes"; then
2788 coroutine=win32
2789 elif test "$ucontext_works" = "yes"; then
2790 coroutine=ucontext
2791 else
2792 coroutine=sigaltstack
2794 else
2795 case $coroutine in
2796 windows)
2797 if test "$mingw32" != "yes"; then
2798 error_exit "'windows' coroutine backend only valid for Windows"
2800 # Unfortunately the user visible backend name doesn't match the
2801 # coroutine-*.c filename for this case, so we have to adjust it here.
2802 coroutine=win32
2804 ucontext)
2805 if test "$ucontext_works" != "yes"; then
2806 feature_not_found "ucontext"
2809 sigaltstack)
2810 if test "$mingw32" = "yes"; then
2811 error_exit "only the 'windows' coroutine backend is valid for Windows"
2815 error_exit "unknown coroutine backend $coroutine"
2817 esac
2820 if test "$coroutine_pool" = ""; then
2821 coroutine_pool=yes
2824 if test "$debug_stack_usage" = "yes"; then
2825 if test "$coroutine_pool" = "yes"; then
2826 echo "WARN: disabling coroutine pool for stack usage debugging"
2827 coroutine_pool=no
2831 ##################################################
2832 # SafeStack
2835 if test "$safe_stack" = "yes"; then
2836 cat > $TMPC << EOF
2837 int main(int argc, char *argv[])
2839 #if ! __has_feature(safe_stack)
2840 #error SafeStack Disabled
2841 #endif
2842 return 0;
2845 flag="-fsanitize=safe-stack"
2846 # Check that safe-stack is supported and enabled.
2847 if compile_prog "-Werror $flag" "$flag"; then
2848 # Flag needed both at compilation and at linking
2849 QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2850 QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
2851 else
2852 error_exit "SafeStack not supported by your compiler"
2854 if test "$coroutine" != "ucontext"; then
2855 error_exit "SafeStack is only supported by the coroutine backend ucontext"
2857 else
2858 cat > $TMPC << EOF
2859 int main(int argc, char *argv[])
2861 #if defined(__has_feature)
2862 #if __has_feature(safe_stack)
2863 #error SafeStack Enabled
2864 #endif
2865 #endif
2866 return 0;
2869 if test "$safe_stack" = "no"; then
2870 # Make sure that safe-stack is disabled
2871 if ! compile_prog "-Werror" ""; then
2872 # SafeStack was already enabled, try to explicitly remove the feature
2873 flag="-fno-sanitize=safe-stack"
2874 if ! compile_prog "-Werror $flag" "$flag"; then
2875 error_exit "Configure cannot disable SafeStack"
2877 QEMU_CFLAGS="$QEMU_CFLAGS $flag"
2878 QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
2880 else # "$safe_stack" = ""
2881 # Set safe_stack to yes or no based on pre-existing flags
2882 if compile_prog "-Werror" ""; then
2883 safe_stack="no"
2884 else
2885 safe_stack="yes"
2886 if test "$coroutine" != "ucontext"; then
2887 error_exit "SafeStack is only supported by the coroutine backend ucontext"
2893 ########################################
2894 # check if cpuid.h is usable.
2896 cat > $TMPC << EOF
2897 #include <cpuid.h>
2898 int main(void) {
2899 unsigned a, b, c, d;
2900 int max = __get_cpuid_max(0, 0);
2902 if (max >= 1) {
2903 __cpuid(1, a, b, c, d);
2906 if (max >= 7) {
2907 __cpuid_count(7, 0, a, b, c, d);
2910 return 0;
2913 if compile_prog "" "" ; then
2914 cpuid_h=yes
2917 ##########################################
2918 # avx2 optimization requirement check
2920 # There is no point enabling this if cpuid.h is not usable,
2921 # since we won't be able to select the new routines.
2923 if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
2924 cat > $TMPC << EOF
2925 #pragma GCC push_options
2926 #pragma GCC target("avx2")
2927 #include <cpuid.h>
2928 #include <immintrin.h>
2929 static int bar(void *a) {
2930 __m256i x = *(__m256i *)a;
2931 return _mm256_testz_si256(x, x);
2933 int main(int argc, char *argv[]) { return bar(argv[0]); }
2935 if compile_object "-Werror" ; then
2936 avx2_opt="yes"
2937 else
2938 avx2_opt="no"
2942 ##########################################
2943 # avx512f optimization requirement check
2945 # There is no point enabling this if cpuid.h is not usable,
2946 # since we won't be able to select the new routines.
2947 # by default, it is turned off.
2948 # if user explicitly want to enable it, check environment
2950 if test "$cpuid_h" = "yes" && test "$avx512f_opt" = "yes"; then
2951 cat > $TMPC << EOF
2952 #pragma GCC push_options
2953 #pragma GCC target("avx512f")
2954 #include <cpuid.h>
2955 #include <immintrin.h>
2956 static int bar(void *a) {
2957 __m512i x = *(__m512i *)a;
2958 return _mm512_test_epi64_mask(x, x);
2960 int main(int argc, char *argv[])
2962 return bar(argv[0]);
2965 if ! compile_object "-Werror" ; then
2966 avx512f_opt="no"
2968 else
2969 avx512f_opt="no"
2972 ########################################
2973 # check if __[u]int128_t is usable.
2975 int128=no
2976 cat > $TMPC << EOF
2977 __int128_t a;
2978 __uint128_t b;
2979 int main (void) {
2980 a = a + b;
2981 b = a * b;
2982 a = a * a;
2983 return 0;
2986 if compile_prog "" "" ; then
2987 int128=yes
2990 #########################################
2991 # See if 128-bit atomic operations are supported.
2993 atomic128=no
2994 if test "$int128" = "yes"; then
2995 cat > $TMPC << EOF
2996 int main(void)
2998 unsigned __int128 x = 0, y = 0;
2999 y = __atomic_load(&x, 0);
3000 __atomic_store(&x, y, 0);
3001 __atomic_compare_exchange(&x, &y, x, 0, 0, 0);
3002 return 0;
3005 if compile_prog "" "" ; then
3006 atomic128=yes
3010 cmpxchg128=no
3011 if test "$int128" = yes && test "$atomic128" = no; then
3012 cat > $TMPC << EOF
3013 int main(void)
3015 unsigned __int128 x = 0, y = 0;
3016 __sync_val_compare_and_swap_16(&x, y, x);
3017 return 0;
3020 if compile_prog "" "" ; then
3021 cmpxchg128=yes
3025 ########################################
3026 # check if ccache is interfering with
3027 # semantic analysis of macros
3029 unset CCACHE_CPP2
3030 ccache_cpp2=no
3031 cat > $TMPC << EOF
3032 static const int Z = 1;
3033 #define fn() ({ Z; })
3034 #define TAUT(X) ((X) == Z)
3035 #define PAREN(X, Y) (X == Y)
3036 #define ID(X) (X)
3037 int main(int argc, char *argv[])
3039 int x = 0, y = 0;
3040 x = ID(x);
3041 x = fn();
3042 fn();
3043 if (PAREN(x, y)) return 0;
3044 if (TAUT(Z)) return 0;
3045 return 0;
3049 if ! compile_object "-Werror"; then
3050 ccache_cpp2=yes
3053 #################################################
3054 # clang does not support glibc + FORTIFY_SOURCE.
3056 if test "$fortify_source" != "no"; then
3057 if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
3058 fortify_source="no";
3059 elif test -n "$cxx" && has $cxx &&
3060 echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
3061 fortify_source="no";
3062 else
3063 fortify_source="yes"
3067 ##########################################
3068 # check for usable membarrier system call
3069 if test "$membarrier" = "yes"; then
3070 have_membarrier=no
3071 if test "$mingw32" = "yes" ; then
3072 have_membarrier=yes
3073 elif test "$linux" = "yes" ; then
3074 cat > $TMPC << EOF
3075 #include <linux/membarrier.h>
3076 #include <sys/syscall.h>
3077 #include <unistd.h>
3078 #include <stdlib.h>
3079 int main(void) {
3080 syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
3081 syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
3082 exit(0);
3085 if compile_prog "" "" ; then
3086 have_membarrier=yes
3089 if test "$have_membarrier" = "no"; then
3090 feature_not_found "membarrier" "membarrier system call not available"
3092 else
3093 # Do not enable it by default even for Mingw32, because it doesn't
3094 # work on Wine.
3095 membarrier=no
3098 ##########################################
3099 # check for usable AF_ALG environment
3100 have_afalg=no
3101 cat > $TMPC << EOF
3102 #include <errno.h>
3103 #include <sys/types.h>
3104 #include <sys/socket.h>
3105 #include <linux/if_alg.h>
3106 int main(void) {
3107 int sock;
3108 sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
3109 return sock;
3112 if compile_prog "" "" ; then
3113 have_afalg=yes
3115 if test "$crypto_afalg" = "yes"
3116 then
3117 if test "$have_afalg" != "yes"
3118 then
3119 error_exit "AF_ALG requested but could not be detected"
3124 ##########################################
3125 # checks for sanitizers
3127 have_asan=no
3128 have_ubsan=no
3129 have_asan_iface_h=no
3130 have_asan_iface_fiber=no
3132 if test "$sanitizers" = "yes" ; then
3133 write_c_skeleton
3134 if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
3135 have_asan=yes
3138 # we could use a simple skeleton for flags checks, but this also
3139 # detect the static linking issue of ubsan, see also:
3140 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
3141 cat > $TMPC << EOF
3142 #include <stdlib.h>
3143 int main(void) {
3144 void *tmp = malloc(10);
3145 if (tmp != NULL) {
3146 return *(int *)(tmp + 2);
3148 return 1;
3151 if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
3152 have_ubsan=yes
3155 if check_include "sanitizer/asan_interface.h" ; then
3156 have_asan_iface_h=yes
3159 cat > $TMPC << EOF
3160 #include <sanitizer/asan_interface.h>
3161 int main(void) {
3162 __sanitizer_start_switch_fiber(0, 0, 0);
3163 return 0;
3166 if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
3167 have_asan_iface_fiber=yes
3171 # Thread sanitizer is, for now, much noisier than the other sanitizers;
3172 # keep it separate until that is not the case.
3173 if test "$tsan" = "yes" && test "$sanitizers" = "yes"; then
3174 error_exit "TSAN is not supported with other sanitiziers."
3176 have_tsan=no
3177 have_tsan_iface_fiber=no
3178 if test "$tsan" = "yes" ; then
3179 write_c_skeleton
3180 if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
3181 have_tsan=yes
3183 cat > $TMPC << EOF
3184 #include <sanitizer/tsan_interface.h>
3185 int main(void) {
3186 __tsan_create_fiber(0);
3187 return 0;
3190 if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
3191 have_tsan_iface_fiber=yes
3195 ##########################################
3196 # check for slirp
3198 case "$slirp" in
3199 auto | enabled | internal)
3200 # Simpler to always update submodule, even if not needed.
3201 git_submodules="${git_submodules} slirp"
3203 esac
3205 # Check for slirp smbd dupport
3206 : ${smbd=${SMBD-/usr/sbin/smbd}}
3207 if test "$slirp_smbd" != "no" ; then
3208 if test "$mingw32" = "yes" ; then
3209 if test "$slirp_smbd" = "yes" ; then
3210 error_exit "Host smbd not supported on this platform."
3212 slirp_smbd=no
3213 else
3214 slirp_smbd=yes
3218 ##########################################
3219 # check for usable __NR_keyctl syscall
3221 if test "$linux" = "yes" ; then
3223 have_keyring=no
3224 cat > $TMPC << EOF
3225 #include <errno.h>
3226 #include <asm/unistd.h>
3227 #include <linux/keyctl.h>
3228 #include <unistd.h>
3229 int main(void) {
3230 return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
3233 if compile_prog "" "" ; then
3234 have_keyring=yes
3237 if test "$secret_keyring" != "no"
3238 then
3239 if test "$have_keyring" = "yes"
3240 then
3241 secret_keyring=yes
3242 else
3243 if test "$secret_keyring" = "yes"
3244 then
3245 error_exit "syscall __NR_keyctl requested, \
3246 but not implemented on your system"
3247 else
3248 secret_keyring=no
3253 ##########################################
3254 # End of CC checks
3255 # After here, no more $cc or $ld runs
3257 write_c_skeleton
3259 if test "$gcov" = "yes" ; then
3261 elif test "$fortify_source" = "yes" ; then
3262 QEMU_CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $QEMU_CFLAGS"
3263 debug=no
3266 case "$ARCH" in
3267 alpha)
3268 # Ensure there's only a single GP
3269 QEMU_CFLAGS="-msmall-data $QEMU_CFLAGS"
3271 esac
3273 if test "$gprof" = "yes" ; then
3274 QEMU_CFLAGS="-p $QEMU_CFLAGS"
3275 QEMU_LDFLAGS="-p $QEMU_LDFLAGS"
3278 if test "$have_asan" = "yes"; then
3279 QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
3280 QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
3281 if test "$have_asan_iface_h" = "no" ; then
3282 echo "ASAN build enabled, but ASAN header missing." \
3283 "Without code annotation, the report may be inferior."
3284 elif test "$have_asan_iface_fiber" = "no" ; then
3285 echo "ASAN build enabled, but ASAN header is too old." \
3286 "Without code annotation, the report may be inferior."
3289 if test "$have_tsan" = "yes" ; then
3290 if test "$have_tsan_iface_fiber" = "yes" ; then
3291 QEMU_CFLAGS="-fsanitize=thread $QEMU_CFLAGS"
3292 QEMU_LDFLAGS="-fsanitize=thread $QEMU_LDFLAGS"
3293 else
3294 error_exit "Cannot enable TSAN due to missing fiber annotation interface."
3296 elif test "$tsan" = "yes" ; then
3297 error_exit "Cannot enable TSAN due to missing sanitize thread interface."
3299 if test "$have_ubsan" = "yes"; then
3300 QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS"
3301 QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
3304 ##########################################
3306 # Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
3307 if test "$solaris" = "no" && test "$tsan" = "no"; then
3308 if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
3309 QEMU_LDFLAGS="-Wl,--warn-common $QEMU_LDFLAGS"
3313 # Use ASLR, no-SEH and DEP if available
3314 if test "$mingw32" = "yes" ; then
3315 flags="--no-seh --nxcompat"
3317 # Disable ASLR for debug builds to allow debugging with gdb
3318 if test "$debug" = "no" ; then
3319 flags="--dynamicbase $flags"
3322 for flag in $flags; do
3323 if ld_has $flag ; then
3324 QEMU_LDFLAGS="-Wl,$flag $QEMU_LDFLAGS"
3326 done
3329 # Probe for guest agent support/options
3331 if [ "$guest_agent" != "no" ]; then
3332 if [ "$softmmu" = no -a "$want_tools" = no ] ; then
3333 guest_agent=no
3334 elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
3335 guest_agent=yes
3336 elif [ "$guest_agent" != yes ]; then
3337 guest_agent=no
3338 else
3339 error_exit "Guest agent is not supported on this platform"
3343 # Guest agent Windows MSI package
3345 if test "$QEMU_GA_MANUFACTURER" = ""; then
3346 QEMU_GA_MANUFACTURER=QEMU
3348 if test "$QEMU_GA_DISTRO" = ""; then
3349 QEMU_GA_DISTRO=Linux
3351 if test "$QEMU_GA_VERSION" = ""; then
3352 QEMU_GA_VERSION=$(cat $source_path/VERSION)
3355 QEMU_GA_MSI_MINGW_DLL_PATH="$($pkg_config --variable=prefix glib-2.0)/bin"
3357 # Mac OS X ships with a broken assembler
3358 roms=
3359 if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
3360 test "$targetos" != "Darwin" && test "$targetos" != "SunOS" && \
3361 test "$targetos" != "Haiku" && test "$softmmu" = yes ; then
3362 # Different host OS linkers have different ideas about the name of the ELF
3363 # emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
3364 # variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
3365 for emu in elf_i386 elf_i386_fbsd elf_i386_obsd i386pe; do
3366 if "$ld" -verbose 2>&1 | grep -q "^[[:space:]]*$emu[[:space:]]*$"; then
3367 ld_i386_emulation="$emu"
3368 roms="optionrom"
3369 break
3371 done
3374 # Only build s390-ccw bios if we're on s390x and the compiler has -march=z900
3375 # or -march=z10 (which is the lowest architecture level that Clang supports)
3376 if test "$cpu" = "s390x" ; then
3377 write_c_skeleton
3378 compile_prog "-march=z900" ""
3379 has_z900=$?
3380 if [ $has_z900 = 0 ] || compile_object "-march=z10 -msoft-float -Werror"; then
3381 if [ $has_z900 != 0 ]; then
3382 echo "WARNING: Your compiler does not support the z900!"
3383 echo " The s390-ccw bios will only work with guest CPUs >= z10."
3385 roms="$roms s390-ccw"
3386 # SLOF is required for building the s390-ccw firmware on s390x,
3387 # since it is using the libnet code from SLOF for network booting.
3388 git_submodules="${git_submodules} roms/SLOF"
3392 # Check that the C++ compiler exists and works with the C compiler.
3393 # All the QEMU_CXXFLAGS are based on QEMU_CFLAGS. Keep this at the end to don't miss any other that could be added.
3394 if has $cxx; then
3395 cat > $TMPC <<EOF
3396 int c_function(void);
3397 int main(void) { return c_function(); }
3400 compile_object
3402 cat > $TMPCXX <<EOF
3403 extern "C" {
3404 int c_function(void);
3406 int c_function(void) { return 42; }
3409 update_cxxflags
3411 if do_cxx $CXXFLAGS $EXTRA_CXXFLAGS $CONFIGURE_CXXFLAGS $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
3412 # C++ compiler $cxx works ok with C compiler $cc
3414 else
3415 echo "C++ compiler $cxx does not work with C compiler $cc"
3416 echo "Disabling C++ specific optional code"
3417 cxx=
3419 else
3420 echo "No C++ compiler available; disabling C++ specific optional code"
3421 cxx=
3424 if !(GIT="$git" "$source_path/scripts/git-submodule.sh" "$git_submodules_action" "$git_submodules"); then
3425 exit 1
3428 config_host_mak="config-host.mak"
3430 echo "# Automatically generated by configure - do not modify" > $config_host_mak
3431 echo >> $config_host_mak
3433 echo all: >> $config_host_mak
3434 echo "GIT=$git" >> $config_host_mak
3435 echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
3436 echo "GIT_SUBMODULES_ACTION=$git_submodules_action" >> $config_host_mak
3438 echo "ARCH=$ARCH" >> $config_host_mak
3440 if test "$debug_tcg" = "yes" ; then
3441 echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
3443 if test "$strip_opt" = "yes" ; then
3444 echo "STRIP=${strip}" >> $config_host_mak
3446 if test "$mingw32" = "yes" ; then
3447 echo "CONFIG_WIN32=y" >> $config_host_mak
3448 if test "$guest_agent_with_vss" = "yes" ; then
3449 echo "CONFIG_QGA_VSS=y" >> $config_host_mak
3450 echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
3451 echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
3453 if test "$guest_agent_ntddscsi" = "yes" ; then
3454 echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
3456 echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
3457 echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
3458 echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
3459 echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
3460 else
3461 echo "CONFIG_POSIX=y" >> $config_host_mak
3464 if test "$linux" = "yes" ; then
3465 echo "CONFIG_LINUX=y" >> $config_host_mak
3468 if test "$darwin" = "yes" ; then
3469 echo "CONFIG_DARWIN=y" >> $config_host_mak
3472 if test "$solaris" = "yes" ; then
3473 echo "CONFIG_SOLARIS=y" >> $config_host_mak
3475 if test "$haiku" = "yes" ; then
3476 echo "CONFIG_HAIKU=y" >> $config_host_mak
3478 if test "$static" = "yes" ; then
3479 echo "CONFIG_STATIC=y" >> $config_host_mak
3481 if test "$profiler" = "yes" ; then
3482 echo "CONFIG_PROFILER=y" >> $config_host_mak
3484 if test "$want_tools" = "yes" ; then
3485 echo "CONFIG_TOOLS=y" >> $config_host_mak
3487 if test "$guest_agent" = "yes" ; then
3488 echo "CONFIG_GUEST_AGENT=y" >> $config_host_mak
3490 if test "$slirp_smbd" = "yes" ; then
3491 echo "CONFIG_SLIRP_SMBD=y" >> $config_host_mak
3492 echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
3494 if test "$gprof" = "yes" ; then
3495 echo "CONFIG_GPROF=y" >> $config_host_mak
3497 echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
3498 echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
3499 if test "$block_drv_whitelist_tools" = "yes" ; then
3500 echo "CONFIG_BDRV_WHITELIST_TOOLS=y" >> $config_host_mak
3502 if test "$xfs" = "yes" ; then
3503 echo "CONFIG_XFS=y" >> $config_host_mak
3505 qemu_version=$(head $source_path/VERSION)
3506 echo "PKGVERSION=$pkgversion" >>$config_host_mak
3507 echo "SRC_PATH=$source_path" >> $config_host_mak
3508 echo "TARGET_DIRS=$target_list" >> $config_host_mak
3509 if test "$modules" = "yes"; then
3510 # $shacmd can generate a hash started with digit, which the compiler doesn't
3511 # like as an symbol. So prefix it with an underscore
3512 echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
3513 echo "CONFIG_MODULES=y" >> $config_host_mak
3515 if test "$module_upgrades" = "yes"; then
3516 echo "CONFIG_MODULE_UPGRADES=y" >> $config_host_mak
3518 if test "$have_usbfs" = "yes" ; then
3519 echo "CONFIG_USBFS=y" >> $config_host_mak
3521 if test "$gio" = "yes" ; then
3522 echo "CONFIG_GIO=y" >> $config_host_mak
3523 echo "GIO_CFLAGS=$gio_cflags" >> $config_host_mak
3524 echo "GIO_LIBS=$gio_libs" >> $config_host_mak
3526 if test "$gdbus_codegen" != "" ; then
3527 echo "GDBUS_CODEGEN=$gdbus_codegen" >> $config_host_mak
3529 echo "CONFIG_TLS_PRIORITY=\"$tls_priority\"" >> $config_host_mak
3531 if test "$xen" = "enabled" ; then
3532 echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
3533 echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
3534 echo "XEN_CFLAGS=$xen_cflags" >> $config_host_mak
3535 echo "XEN_LIBS=$xen_libs" >> $config_host_mak
3537 if test "$vhost_scsi" = "yes" ; then
3538 echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
3540 if test "$vhost_net" = "yes" ; then
3541 echo "CONFIG_VHOST_NET=y" >> $config_host_mak
3543 if test "$vhost_net_user" = "yes" ; then
3544 echo "CONFIG_VHOST_NET_USER=y" >> $config_host_mak
3546 if test "$vhost_net_vdpa" = "yes" ; then
3547 echo "CONFIG_VHOST_NET_VDPA=y" >> $config_host_mak
3549 if test "$vhost_crypto" = "yes" ; then
3550 echo "CONFIG_VHOST_CRYPTO=y" >> $config_host_mak
3552 if test "$vhost_vsock" = "yes" ; then
3553 echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
3554 if test "$vhost_user" = "yes" ; then
3555 echo "CONFIG_VHOST_USER_VSOCK=y" >> $config_host_mak
3558 if test "$vhost_kernel" = "yes" ; then
3559 echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
3561 if test "$vhost_user" = "yes" ; then
3562 echo "CONFIG_VHOST_USER=y" >> $config_host_mak
3564 if test "$vhost_vdpa" = "yes" ; then
3565 echo "CONFIG_VHOST_VDPA=y" >> $config_host_mak
3567 if test "$vhost_user_fs" = "yes" ; then
3568 echo "CONFIG_VHOST_USER_FS=y" >> $config_host_mak
3570 if test "$membarrier" = "yes" ; then
3571 echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
3573 if test "$tcg" = "enabled" -a "$tcg_interpreter" = "true" ; then
3574 echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
3577 if test "$opengl" = "yes" ; then
3578 echo "CONFIG_OPENGL=y" >> $config_host_mak
3579 echo "OPENGL_CFLAGS=$opengl_cflags" >> $config_host_mak
3580 echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
3583 if test "$avx2_opt" = "yes" ; then
3584 echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
3587 if test "$avx512f_opt" = "yes" ; then
3588 echo "CONFIG_AVX512F_OPT=y" >> $config_host_mak
3591 # XXX: suppress that
3592 if [ "$bsd" = "yes" ] ; then
3593 echo "CONFIG_BSD=y" >> $config_host_mak
3596 if test "$qom_cast_debug" = "yes" ; then
3597 echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
3600 echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
3601 if test "$coroutine_pool" = "yes" ; then
3602 echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
3603 else
3604 echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
3607 if test "$debug_stack_usage" = "yes" ; then
3608 echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
3611 if test "$crypto_afalg" = "yes" ; then
3612 echo "CONFIG_AF_ALG=y" >> $config_host_mak
3615 if test "$have_asan_iface_fiber" = "yes" ; then
3616 echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
3619 if test "$have_tsan" = "yes" && test "$have_tsan_iface_fiber" = "yes" ; then
3620 echo "CONFIG_TSAN=y" >> $config_host_mak
3623 if test "$cpuid_h" = "yes" ; then
3624 echo "CONFIG_CPUID_H=y" >> $config_host_mak
3627 if test "$int128" = "yes" ; then
3628 echo "CONFIG_INT128=y" >> $config_host_mak
3631 if test "$atomic128" = "yes" ; then
3632 echo "CONFIG_ATOMIC128=y" >> $config_host_mak
3635 if test "$cmpxchg128" = "yes" ; then
3636 echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
3639 if test "$libssh" = "yes" ; then
3640 echo "CONFIG_LIBSSH=y" >> $config_host_mak
3641 echo "LIBSSH_CFLAGS=$libssh_cflags" >> $config_host_mak
3642 echo "LIBSSH_LIBS=$libssh_libs" >> $config_host_mak
3645 if test "$live_block_migration" = "yes" ; then
3646 echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
3649 if test "$tpm" = "yes"; then
3650 echo 'CONFIG_TPM=y' >> $config_host_mak
3653 if test "$rdma" = "yes" ; then
3654 echo "CONFIG_RDMA=y" >> $config_host_mak
3655 echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
3658 if test "$pvrdma" = "yes" ; then
3659 echo "CONFIG_PVRDMA=y" >> $config_host_mak
3662 if test "$replication" = "yes" ; then
3663 echo "CONFIG_REPLICATION=y" >> $config_host_mak
3666 if test "$debug_mutex" = "yes" ; then
3667 echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
3670 if test "$bochs" = "yes" ; then
3671 echo "CONFIG_BOCHS=y" >> $config_host_mak
3673 if test "$cloop" = "yes" ; then
3674 echo "CONFIG_CLOOP=y" >> $config_host_mak
3676 if test "$dmg" = "yes" ; then
3677 echo "CONFIG_DMG=y" >> $config_host_mak
3679 if test "$qcow1" = "yes" ; then
3680 echo "CONFIG_QCOW1=y" >> $config_host_mak
3682 if test "$vdi" = "yes" ; then
3683 echo "CONFIG_VDI=y" >> $config_host_mak
3685 if test "$vvfat" = "yes" ; then
3686 echo "CONFIG_VVFAT=y" >> $config_host_mak
3688 if test "$qed" = "yes" ; then
3689 echo "CONFIG_QED=y" >> $config_host_mak
3691 if test "$parallels" = "yes" ; then
3692 echo "CONFIG_PARALLELS=y" >> $config_host_mak
3695 if test "$plugins" = "yes" ; then
3696 echo "CONFIG_PLUGIN=y" >> $config_host_mak
3697 # Copy the export object list to the build dir
3698 if test "$ld_dynamic_list" = "yes" ; then
3699 echo "CONFIG_HAS_LD_DYNAMIC_LIST=yes" >> $config_host_mak
3700 ld_symbols=qemu-plugins-ld.symbols
3701 cp "$source_path/plugins/qemu-plugins.symbols" $ld_symbols
3702 elif test "$ld_exported_symbols_list" = "yes" ; then
3703 echo "CONFIG_HAS_LD_EXPORTED_SYMBOLS_LIST=yes" >> $config_host_mak
3704 ld64_symbols=qemu-plugins-ld64.symbols
3705 echo "# Automatically generated by configure - do not modify" > $ld64_symbols
3706 grep 'qemu_' "$source_path/plugins/qemu-plugins.symbols" | sed 's/;//g' | \
3707 sed -E 's/^[[:space:]]*(.*)/_\1/' >> $ld64_symbols
3708 else
3709 error_exit \
3710 "If \$plugins=yes, either \$ld_dynamic_list or " \
3711 "\$ld_exported_symbols_list should have been set to 'yes'."
3715 if test -n "$gdb_bin"; then
3716 gdb_version=$($gdb_bin --version | head -n 1)
3717 if version_ge ${gdb_version##* } 9.1; then
3718 echo "HAVE_GDB_BIN=$gdb_bin" >> $config_host_mak
3722 if test "$secret_keyring" = "yes" ; then
3723 echo "CONFIG_SECRET_KEYRING=y" >> $config_host_mak
3726 echo "ROMS=$roms" >> $config_host_mak
3727 echo "MAKE=$make" >> $config_host_mak
3728 echo "PYTHON=$python" >> $config_host_mak
3729 echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
3730 echo "MESON=$meson" >> $config_host_mak
3731 echo "NINJA=$ninja" >> $config_host_mak
3732 echo "CC=$cc" >> $config_host_mak
3733 echo "HOST_CC=$host_cc" >> $config_host_mak
3734 if $iasl -h > /dev/null 2>&1; then
3735 echo "CONFIG_IASL=$iasl" >> $config_host_mak
3737 echo "AR=$ar" >> $config_host_mak
3738 echo "AS=$as" >> $config_host_mak
3739 echo "CCAS=$ccas" >> $config_host_mak
3740 echo "CPP=$cpp" >> $config_host_mak
3741 echo "OBJCOPY=$objcopy" >> $config_host_mak
3742 echo "LD=$ld" >> $config_host_mak
3743 echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak
3744 echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
3745 echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak
3746 echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
3747 echo "GLIB_LIBS=$glib_libs" >> $config_host_mak
3748 echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
3749 echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
3750 echo "EXESUF=$EXESUF" >> $config_host_mak
3751 echo "LIBS_QGA=$libs_qga" >> $config_host_mak
3753 if test "$rng_none" = "yes"; then
3754 echo "CONFIG_RNG_NONE=y" >> $config_host_mak
3757 # use included Linux headers
3758 if test "$linux" = "yes" ; then
3759 mkdir -p linux-headers
3760 case "$cpu" in
3761 i386|x86_64|x32)
3762 linux_arch=x86
3764 ppc|ppc64|ppc64le)
3765 linux_arch=powerpc
3767 s390x)
3768 linux_arch=s390
3770 aarch64)
3771 linux_arch=arm64
3773 mips64)
3774 linux_arch=mips
3777 # For most CPUs the kernel architecture name and QEMU CPU name match.
3778 linux_arch="$cpu"
3780 esac
3781 # For non-KVM architectures we will not have asm headers
3782 if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
3783 symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
3787 for target in $target_list; do
3788 target_dir="$target"
3789 target_name=$(echo $target | cut -d '-' -f 1)
3790 mkdir -p $target_dir
3791 case $target in
3792 *-user) symlink "../qemu-$target_name" "$target_dir/qemu-$target_name" ;;
3793 *) symlink "../qemu-system-$target_name" "$target_dir/qemu-system-$target_name" ;;
3794 esac
3795 done
3797 echo "CONFIG_QEMU_INTERP_PREFIX=$interp_prefix" | sed 's/%M/@0@/' >> $config_host_mak
3798 if test "$default_targets" = "yes"; then
3799 echo "CONFIG_DEFAULT_TARGETS=y" >> $config_host_mak
3802 if test "$numa" = "yes"; then
3803 echo "CONFIG_NUMA=y" >> $config_host_mak
3804 echo "NUMA_LIBS=$numa_libs" >> $config_host_mak
3807 if test "$ccache_cpp2" = "yes"; then
3808 echo "export CCACHE_CPP2=y" >> $config_host_mak
3811 if test "$safe_stack" = "yes"; then
3812 echo "CONFIG_SAFESTACK=y" >> $config_host_mak
3815 # If we're using a separate build tree, set it up now.
3816 # DIRS are directories which we simply mkdir in the build tree;
3817 # LINKS are things to symlink back into the source tree
3818 # (these can be both files and directories).
3819 # Caution: do not add files or directories here using wildcards. This
3820 # will result in problems later if a new file matching the wildcard is
3821 # added to the source tree -- nothing will cause configure to be rerun
3822 # so the build tree will be missing the link back to the new file, and
3823 # tests might fail. Prefer to keep the relevant files in their own
3824 # directory and symlink the directory instead.
3825 # UNLINK is used to remove symlinks from older development versions
3826 # that might get into the way when doing "git update" without doing
3827 # a "make distclean" in between.
3828 DIRS="tests tests/tcg tests/qapi-schema tests/qtest/libqos"
3829 DIRS="$DIRS tests/qtest tests/qemu-iotests tests/vm tests/fp tests/qgraph"
3830 DIRS="$DIRS docs docs/interop fsdev scsi"
3831 DIRS="$DIRS pc-bios/optionrom pc-bios/s390-ccw"
3832 DIRS="$DIRS roms/seabios"
3833 DIRS="$DIRS contrib/plugins/"
3834 LINKS="Makefile"
3835 LINKS="$LINKS tests/tcg/Makefile.target"
3836 LINKS="$LINKS pc-bios/optionrom/Makefile"
3837 LINKS="$LINKS pc-bios/s390-ccw/Makefile"
3838 LINKS="$LINKS roms/seabios/Makefile"
3839 LINKS="$LINKS pc-bios/qemu-icon.bmp"
3840 LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
3841 LINKS="$LINKS tests/avocado tests/data"
3842 LINKS="$LINKS tests/qemu-iotests/check"
3843 LINKS="$LINKS python"
3844 LINKS="$LINKS contrib/plugins/Makefile "
3845 UNLINK="pc-bios/keymaps"
3846 for bios_file in \
3847 $source_path/pc-bios/*.bin \
3848 $source_path/pc-bios/*.elf \
3849 $source_path/pc-bios/*.lid \
3850 $source_path/pc-bios/*.rom \
3851 $source_path/pc-bios/*.dtb \
3852 $source_path/pc-bios/*.img \
3853 $source_path/pc-bios/openbios-* \
3854 $source_path/pc-bios/u-boot.* \
3855 $source_path/pc-bios/edk2-*.fd.bz2 \
3856 $source_path/pc-bios/palcode-* \
3857 $source_path/pc-bios/qemu_vga.ndrv
3860 LINKS="$LINKS pc-bios/$(basename $bios_file)"
3861 done
3862 mkdir -p $DIRS
3863 for f in $LINKS ; do
3864 if [ -e "$source_path/$f" ]; then
3865 symlink "$source_path/$f" "$f"
3867 done
3868 for f in $UNLINK ; do
3869 if [ -L "$f" ]; then
3870 rm -f "$f"
3872 done
3874 (for i in $cross_cc_vars; do
3875 export $i
3876 done
3877 export target_list source_path use_containers ARCH
3878 $source_path/tests/tcg/configure.sh)
3880 # temporary config to build submodules
3881 for rom in seabios; do
3882 config_mak=roms/$rom/config.mak
3883 echo "# Automatically generated by configure - do not modify" > $config_mak
3884 echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
3885 echo "AS=$as" >> $config_mak
3886 echo "CCAS=$ccas" >> $config_mak
3887 echo "CC=$cc" >> $config_mak
3888 echo "BCC=bcc" >> $config_mak
3889 echo "CPP=$cpp" >> $config_mak
3890 echo "OBJCOPY=objcopy" >> $config_mak
3891 echo "IASL=$iasl" >> $config_mak
3892 echo "LD=$ld" >> $config_mak
3893 echo "RANLIB=$ranlib" >> $config_mak
3894 done
3896 config_mak=pc-bios/optionrom/config.mak
3897 echo "# Automatically generated by configure - do not modify" > $config_mak
3898 echo "TOPSRC_DIR=$source_path" >> $config_mak
3900 if test "$skip_meson" = no; then
3901 cross="config-meson.cross.new"
3902 meson_quote() {
3903 test $# = 0 && return
3904 echo "'$(echo $* | sed "s/ /','/g")'"
3907 echo "# Automatically generated by configure - do not modify" > $cross
3908 echo "[properties]" >> $cross
3910 # unroll any custom device configs
3911 for a in $device_archs; do
3912 eval "c=\$devices_${a}"
3913 echo "${a}-softmmu = '$c'" >> $cross
3914 done
3916 test -z "$cxx" && echo "link_language = 'c'" >> $cross
3917 echo "[built-in options]" >> $cross
3918 echo "c_args = [$(meson_quote $CFLAGS $EXTRA_CFLAGS)]" >> $cross
3919 echo "cpp_args = [$(meson_quote $CXXFLAGS $EXTRA_CXXFLAGS)]" >> $cross
3920 echo "c_link_args = [$(meson_quote $CFLAGS $LDFLAGS $EXTRA_CFLAGS $EXTRA_LDFLAGS)]" >> $cross
3921 echo "cpp_link_args = [$(meson_quote $CXXFLAGS $LDFLAGS $EXTRA_CXXFLAGS $EXTRA_LDFLAGS)]" >> $cross
3922 echo "[binaries]" >> $cross
3923 echo "c = [$(meson_quote $cc $CPU_CFLAGS)]" >> $cross
3924 test -n "$cxx" && echo "cpp = [$(meson_quote $cxx $CPU_CFLAGS)]" >> $cross
3925 test -n "$objcc" && echo "objc = [$(meson_quote $objcc $CPU_CFLAGS)]" >> $cross
3926 echo "ar = [$(meson_quote $ar)]" >> $cross
3927 echo "nm = [$(meson_quote $nm)]" >> $cross
3928 echo "pkgconfig = [$(meson_quote $pkg_config_exe)]" >> $cross
3929 echo "ranlib = [$(meson_quote $ranlib)]" >> $cross
3930 if has $sdl2_config; then
3931 echo "sdl2-config = [$(meson_quote $sdl2_config)]" >> $cross
3933 echo "strip = [$(meson_quote $strip)]" >> $cross
3934 echo "windres = [$(meson_quote $windres)]" >> $cross
3935 if test "$cross_compile" = "yes"; then
3936 cross_arg="--cross-file config-meson.cross"
3937 echo "[host_machine]" >> $cross
3938 if test "$mingw32" = "yes" ; then
3939 echo "system = 'windows'" >> $cross
3941 if test "$linux" = "yes" ; then
3942 echo "system = 'linux'" >> $cross
3944 if test "$darwin" = "yes" ; then
3945 echo "system = 'darwin'" >> $cross
3947 case "$ARCH" in
3948 i386)
3949 echo "cpu_family = 'x86'" >> $cross
3951 x86_64|x32)
3952 echo "cpu_family = 'x86_64'" >> $cross
3954 ppc64le)
3955 echo "cpu_family = 'ppc64'" >> $cross
3958 echo "cpu_family = '$ARCH'" >> $cross
3960 esac
3961 echo "cpu = '$cpu'" >> $cross
3962 if test "$bigendian" = "yes" ; then
3963 echo "endian = 'big'" >> $cross
3964 else
3965 echo "endian = 'little'" >> $cross
3967 else
3968 cross_arg="--native-file config-meson.cross"
3970 mv $cross config-meson.cross
3972 rm -rf meson-private meson-info meson-logs
3973 run_meson() {
3974 NINJA=$ninja $meson setup \
3975 --prefix "$prefix" \
3976 --libdir "$libdir" \
3977 --libexecdir "$libexecdir" \
3978 --bindir "$bindir" \
3979 --includedir "$includedir" \
3980 --datadir "$datadir" \
3981 --mandir "$mandir" \
3982 --sysconfdir "$sysconfdir" \
3983 --localedir "$localedir" \
3984 --localstatedir "$local_statedir" \
3985 -Daudio_drv_list=$audio_drv_list \
3986 -Ddefault_devices=$default_devices \
3987 -Ddocdir="$docdir" \
3988 -Dqemu_firmwarepath="$firmwarepath" \
3989 -Dqemu_suffix="$qemu_suffix" \
3990 -Dsphinx_build="$sphinx_build" \
3991 -Dtrace_file="$trace_file" \
3992 -Doptimization=$(if test "$debug" = yes; then echo 0; else echo 2; fi) \
3993 -Ddebug=$(if test "$debug_info" = yes; then echo true; else echo false; fi) \
3994 -Dwerror=$(if test "$werror" = yes; then echo true; else echo false; fi) \
3995 -Dstrip=$(if test "$strip_opt" = yes; then echo true; else echo false; fi) \
3996 -Db_pie=$(if test "$pie" = yes; then echo true; else echo false; fi) \
3997 -Db_coverage=$(if test "$gcov" = yes; then echo true; else echo false; fi) \
3998 -Db_lto=$lto -Dcfi=$cfi -Dtcg=$tcg -Dxen=$xen \
3999 -Dcapstone=$capstone -Dfdt=$fdt -Dslirp=$slirp \
4000 $(test -n "${LIB_FUZZING_ENGINE+xxx}" && echo "-Dfuzzing_engine=$LIB_FUZZING_ENGINE") \
4001 $(if test "$default_feature" = no; then echo "-Dauto_features=disabled"; fi) \
4002 "$@" $cross_arg "$PWD" "$source_path"
4004 eval run_meson $meson_options
4005 if test "$?" -ne 0 ; then
4006 error_exit "meson setup failed"
4008 else
4009 if test -f meson-private/cmd_line.txt; then
4010 # Adjust old command line options whose type was changed
4011 # Avoids having to use "setup --wipe" when Meson is upgraded
4012 perl -i -ne '
4013 s/^gettext = true$/gettext = auto/;
4014 s/^gettext = false$/gettext = disabled/;
4015 /^b_staticpic/ && next;
4016 print;' meson-private/cmd_line.txt
4020 if test -n "${deprecated_features}"; then
4021 echo "Warning, deprecated features enabled."
4022 echo "Please see docs/about/deprecated.rst"
4023 echo " features: ${deprecated_features}"
4026 # Create list of config switches that should be poisoned in common code...
4027 # but filter out CONFIG_TCG and CONFIG_USER_ONLY which are special.
4028 target_configs_h=$(ls *-config-devices.h *-config-target.h 2>/dev/null)
4029 if test -n "$target_configs_h" ; then
4030 sed -n -e '/CONFIG_TCG/d' -e '/CONFIG_USER_ONLY/d' \
4031 -e '/^#define / { s///; s/ .*//; s/^/#pragma GCC poison /p; }' \
4032 $target_configs_h | sort -u > config-poison.h
4033 else
4034 :> config-poison.h
4037 # Save the configure command line for later reuse.
4038 cat <<EOD >config.status
4039 #!/bin/sh
4040 # Generated by configure.
4041 # Run this file to recreate the current configuration.
4042 # Compiler output produced by configure, useful for debugging
4043 # configure, is in config.log if it exists.
4046 preserve_env() {
4047 envname=$1
4049 eval envval=\$$envname
4051 if test -n "$envval"
4052 then
4053 echo "$envname='$envval'" >> config.status
4054 echo "export $envname" >> config.status
4055 else
4056 echo "unset $envname" >> config.status
4060 # Preserve various env variables that influence what
4061 # features/build target configure will detect
4062 preserve_env AR
4063 preserve_env AS
4064 preserve_env CC
4065 preserve_env CPP
4066 preserve_env CFLAGS
4067 preserve_env CXX
4068 preserve_env CXXFLAGS
4069 preserve_env INSTALL
4070 preserve_env LD
4071 preserve_env LDFLAGS
4072 preserve_env LD_LIBRARY_PATH
4073 preserve_env LIBTOOL
4074 preserve_env MAKE
4075 preserve_env NM
4076 preserve_env OBJCOPY
4077 preserve_env PATH
4078 preserve_env PKG_CONFIG
4079 preserve_env PKG_CONFIG_LIBDIR
4080 preserve_env PKG_CONFIG_PATH
4081 preserve_env PYTHON
4082 preserve_env SDL2_CONFIG
4083 preserve_env SMBD
4084 preserve_env STRIP
4085 preserve_env WINDRES
4087 printf "exec" >>config.status
4088 for i in "$0" "$@"; do
4089 test "$i" = --skip-meson || printf " %s" "$(quote_sh "$i")" >>config.status
4090 done
4091 echo ' "$@"' >>config.status
4092 chmod +x config.status
4094 rm -r "$TMPDIR1"