#!/bin/sh # # qemu configure script (c) 2003 Fabrice Bellard # # Unset some variables known to interfere with behavior of common tools, # just as autoconf does. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS # Don't allow CCACHE, if present, to use cached results of compile tests! export CCACHE_RECACHE=yes # Temporary directory used for files created while # configure runs. Since it is in the build directory # we can safely blow away any previous version of it # (and we need not jump through hoops to try to delete # it when configure exits.) TMPDIR1="config-temp" rm -rf "${TMPDIR1}" mkdir -p "${TMPDIR1}" if [ $? -ne 0 ]; then echo "ERROR: failed to create temporary directory" exit 1 fi TMPB="qemu-conf" TMPC="${TMPDIR1}/${TMPB}.c" TMPO="${TMPDIR1}/${TMPB}.o" TMPCXX="${TMPDIR1}/${TMPB}.cxx" TMPE="${TMPDIR1}/${TMPB}.exe" TMPMO="${TMPDIR1}/${TMPB}.mo" TMPTXT="${TMPDIR1}/${TMPB}.txt" rm -f config.log # Print a helpful header at the top of config.log echo "# QEMU configure log $(date)" >> config.log printf "# Configured with:" >> config.log printf " '%s'" "$0" "$@" >> config.log echo >> config.log echo "#" >> config.log print_error() { (echo echo "ERROR: $1" while test -n "$2"; do echo " $2" shift done echo) >&2 } error_exit() { print_error "$@" exit 1 } do_compiler() { # Run the compiler, capturing its output to the log. First argument # is compiler binary to execute. local compiler="$1" shift if test -n "$BASH_VERSION"; then eval ' echo >>config.log " funcs: ${FUNCNAME[*]} lines: ${BASH_LINENO[*]}" '; fi echo $compiler "$@" >> config.log $compiler "$@" >> config.log 2>&1 || return $? # Test passed. If this is an --enable-werror build, rerun # the test with -Werror and bail out if it fails. This # makes warning-generating-errors in configure test code # obvious to developers. if test "$werror" != "yes"; then return 0 fi # Don't bother rerunning the compile if we were already using -Werror case "$*" in *-Werror*) return 0 ;; esac echo $compiler -Werror "$@" >> config.log $compiler -Werror "$@" >> config.log 2>&1 && return $? error_exit "configure test passed without -Werror but failed with -Werror." \ "This is probably a bug in the configure script. The failing command" \ "will be at the bottom of config.log." \ "You can run configure with --disable-werror to bypass this check." } do_cc() { do_compiler "$cc" "$@" } do_cxx() { do_compiler "$cxx" "$@" } update_cxxflags() { # Set QEMU_CXXFLAGS from QEMU_CFLAGS by filtering out those # options which some versions of GCC's C++ compiler complain about # because they only make sense for C programs. QEMU_CXXFLAGS="$QEMU_CXXFLAGS -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS" for arg in $QEMU_CFLAGS; do case $arg in -Wstrict-prototypes|-Wmissing-prototypes|-Wnested-externs|\ -Wold-style-declaration|-Wold-style-definition|-Wredundant-decls) ;; -std=gnu99) QEMU_CXXFLAGS=${QEMU_CXXFLAGS:+$QEMU_CXXFLAGS }"-std=gnu++98" ;; *) QEMU_CXXFLAGS=${QEMU_CXXFLAGS:+$QEMU_CXXFLAGS }$arg ;; esac done } compile_object() { local_cflags="$1" do_cc $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC } compile_prog() { local_cflags="$1" local_ldflags="$2" do_cc $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC $QEMU_LDFLAGS $local_ldflags } # symbolically link $1 to $2. Portable version of "ln -sf". symlink() { rm -rf "$2" mkdir -p "$(dirname "$2")" ln -s "$1" "$2" } # check whether a command is available to this shell (may be either an # executable or a builtin) has() { type "$1" >/dev/null 2>&1 } # search for an executable in PATH path_of() { local_command="$1" local_ifs="$IFS" local_dir="" # pathname has a dir component? if [ "${local_command#*/}" != "$local_command" ]; then if [ -x "$local_command" ] && [ ! -d "$local_command" ]; then echo "$local_command" return 0 fi fi if [ -z "$local_command" ]; then return 1 fi IFS=: for local_dir in $PATH; do if [ -x "$local_dir/$local_command" ] && [ ! -d "$local_dir/$local_command" ]; then echo "$local_dir/$local_command" IFS="${local_ifs:-$(printf ' \t\n')}" return 0 fi done # not found IFS="${local_ifs:-$(printf ' \t\n')}" return 1 } glob() { eval test -z '"${1#'"$2"'}"' } supported_target() { case "$1" in *-softmmu) ;; *) print_error "Invalid target name '$target'" return 1 ;; esac test "$tcg" = "yes" && return 0 print_error "TCG disabled, but hardware accelerator not available for '$target'" return 1 } ld_has() { $ld --help 2>/dev/null | grep ".$1" >/dev/null 2>&1 } # make source path absolute source_path=$(cd "$(dirname -- "$0")"; pwd) if printf %s\\n "$source_path" "$PWD" | grep -q "[[:space:]:]"; then error_exit "main directory cannot contain spaces nor colons" fi # default parameters cpu="" iasl="iasl" interp_prefix="/usr/gnemul/qemu-%M" static="no" cross_prefix="" host_cc="cc" libs_cpu="" libs_softmmu="" libs_tools="" debug_info="yes" stack_protector="" git_update=no git_submodules="" git="git" # Don't accept a target_list environment variable. unset target_list unset target_list_exclude # Default value for a variable defining feature "foo". # * foo="no" feature will only be used if --enable-foo arg is given # * foo="" feature will be searched for, and if found, will be used # unless --disable-foo is given # * foo="yes" this value will only be set by --enable-foo flag. # feature will searched for, # if not found, configure exits with error # # Always add --enable-foo and --disable-foo command line args. # Distributions want to ensure that several features are compiled in, and it # is impossible without a --enable-foo that exits if a feature is not found. tcg="yes" membarrier="" debug="no" sanitizers="no" strip_opt="yes" bigendian="no" mingw32="no" EXESUF="" DSOSUF=".so" LDFLAGS_SHARED="-shared" prefix="/usr/local" bindir="\${prefix}/bin" libdir="\${prefix}/lib" libexecdir="\${prefix}/libexec" includedir="\${prefix}/include" sysconfdir="\${prefix}/etc" local_statedir="\${prefix}/var" confsuffix="/qemu" bsd="no" linux="no" solaris="no" softmmu="yes" pkgversion="" pie="" cpuid_h="no" avx2_opt="" debug_stack_usage="no" gtk_gl="no" tcmalloc="no" jemalloc="no" supported_cpu="no" supported_os="no" bogus_os="no" malloc_trim="" # parse CC options first for opt do optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)') case "$opt" in --cross-prefix=*) cross_prefix="$optarg" ;; --cc=*) CC="$optarg" ;; --cxx=*) CXX="$optarg" ;; --cpu=*) cpu="$optarg" ;; --extra-cflags=*) QEMU_CFLAGS="$QEMU_CFLAGS $optarg" QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg" ;; --extra-cxxflags=*) QEMU_CXXFLAGS="$QEMU_CXXFLAGS $optarg" ;; --extra-ldflags=*) QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg" EXTRA_LDFLAGS="$optarg" ;; --enable-debug-info) debug_info="yes" ;; --disable-debug-info) debug_info="no" ;; --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option" ;; --cross-cc-cflags-*) cc_arch=${opt#--cross-cc-flags-}; cc_arch=${cc_arch%%=*} eval "cross_cc_cflags_${cc_arch}=\$optarg" cross_cc_vars="$cross_cc_vars cross_cc_cflags_${cc_arch}" ;; --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*} cc_archs="$cc_archs $cc_arch" eval "cross_cc_${cc_arch}=\$optarg" cross_cc_vars="$cross_cc_vars cross_cc_${cc_arch}" ;; esac done # OS specific # Using uname is really, really broken. Once we have the right set of checks # we can eliminate its usage altogether. # Preferred compiler: # ${CC} (if set) # ${cross_prefix}gcc (if cross-prefix specified) # system compiler if test -z "${CC}${cross_prefix}"; then cc="$host_cc" else cc="${CC-${cross_prefix}gcc}" fi if test -z "${CXX}${cross_prefix}"; then cxx="c++" else cxx="${CXX-${cross_prefix}g++}" fi ar="${AR-${cross_prefix}ar}" as="${AS-${cross_prefix}as}" ccas="${CCAS-$cc}" cpp="${CPP-$cc -E}" objcopy="${OBJCOPY-${cross_prefix}objcopy}" ld="${LD-${cross_prefix}ld}" ranlib="${RANLIB-${cross_prefix}ranlib}" nm="${NM-${cross_prefix}nm}" strip="${STRIP-${cross_prefix}strip}" pkg_config_exe="${PKG_CONFIG-${cross_prefix}pkg-config}" query_pkg_config() { "${pkg_config_exe}" ${QEMU_PKG_CONFIG_FLAGS} "$@" } pkg_config=query_pkg_config # If the user hasn't specified ARFLAGS, default to 'rv', just as make does. ARFLAGS="${ARFLAGS-rv}" # default flags for all hosts # We use -fwrapv to tell the compiler that we require a C dialect where # left shift of signed integers is well defined and has the expected # 2s-complement style results. (Both clang and gcc agree that it # provides these semantics.) QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv -std=gnu99 $QEMU_CFLAGS" QEMU_CFLAGS="-Wall -Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS" QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS" QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS" QEMU_INCLUDES="-iquote . -iquote \$(SRC_PATH) -iquote \$(SRC_PATH)/accel/tcg -iquote \$(SRC_PATH)/include" QEMU_INCLUDES="$QEMU_INCLUDES -iquote \$(SRC_PATH)/disas/libvixl" if test "$debug_info" = "yes"; then CFLAGS="-g $CFLAGS" fi # running configure in the source tree? # we know that's the case if configure is there. if test -f "./configure"; then pwd_is_source_path="y" else pwd_is_source_path="n" fi check_define() { cat > $TMPC < $TMPC < int main(void) { return 0; } EOF compile_object } write_c_skeleton() { cat > $TMPC <&2 ;; --enable-vhdx|--disable-vhdx) echo "$0: $opt is obsolete, VHDX driver is always built" >&2 ;; --enable-uuid|--disable-uuid) echo "$0: $opt is obsolete, UUID support is always built" >&2 ;; --disable-tcmalloc) tcmalloc="no" ;; --enable-tcmalloc) tcmalloc="yes" ;; --disable-jemalloc) jemalloc="no" ;; --enable-jemalloc) jemalloc="yes" ;; --with-git=*) git="$optarg" ;; *) echo "ERROR: unknown option $opt" echo "Try '$0 --help' for more information" exit 1 ;; esac done case "$cpu" in ppc) CPU_CFLAGS="-m32" QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS" ;; ppc64) CPU_CFLAGS="-m64" QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS" ;; sparc) CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc" QEMU_LDFLAGS="-m32 -mv8plus $QEMU_LDFLAGS" ;; sparc64) CPU_CFLAGS="-m64 -mcpu=ultrasparc" QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS" ;; s390) CPU_CFLAGS="-m31" QEMU_LDFLAGS="-m31 $QEMU_LDFLAGS" ;; s390x) CPU_CFLAGS="-m64" QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS" ;; i386) CPU_CFLAGS="-m32" QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS" ;; x86_64) # ??? Only extremely old AMD cpus do not have cmpxchg16b. # If we truly care, we should simply detect this case at # runtime and generate the fallback to serial emulation. CPU_CFLAGS="-m64 -mcx16" QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS" ;; x32) CPU_CFLAGS="-mx32" QEMU_LDFLAGS="-mx32 $QEMU_LDFLAGS" ;; # No special flags required for other host CPUs esac eval "cross_cc_${cpu}=\$host_cc" cross_cc_vars="$cross_cc_vars cross_cc_${cpu}" QEMU_CFLAGS="$CPU_CFLAGS $QEMU_CFLAGS" default_target_list="aarch64-softmmu \ arm-softmmu m68k-softmmu mips64el-softmmu mips64-softmmu mipsel-softmmu \ mips-softmmu ppc64-softmmu ppc-softmmu sparc64-softmmu sparc-softmmu \ x86_64-softmmu riscv32-softmmu riscv64-softmmu s390x-softmmu \ tricore-softmmu" if test x"$show_help" = x"yes" ; then cat << EOF Usage: configure [options] Options: [defaults in brackets after descriptions] Standard options: --help print this message --prefix=PREFIX install in PREFIX [$prefix] --interp-prefix=PREFIX where to find shared libraries, etc. use %M for cpu name [$interp_prefix] --target-list=LIST set target list (default: build everything) $(echo Available targets: $default_target_list | \ fold -s -w 53 | sed -e 's/^/ /') --target-list-exclude=LIST exclude a set of targets from the default target-list Advanced options (experts only): --cross-prefix=PREFIX use PREFIX for compile tools [$cross_prefix] --cc=CC use C compiler CC [$cc] --iasl=IASL use ACPI compiler IASL [$iasl] --host-cc=CC use C compiler CC [$host_cc] for code run at build time --cxx=CXX use C++ compiler CXX [$cxx] --objcc=OBJCC use Objective-C compiler OBJCC [$objcc] --extra-cflags=CFLAGS append extra C compiler flags QEMU_CFLAGS --extra-cxxflags=CXXFLAGS append extra C++ compiler flags QEMU_CXXFLAGS --extra-ldflags=LDFLAGS append extra linker flags LDFLAGS --cross-cc-ARCH=CC use compiler when building ARCH guest test cases --cross-cc-flags-ARCH= use compiler flags when building ARCH guest tests --make=MAKE use specified make [$make] --install=INSTALL use specified install [$install] --with-git=GIT use specified git [$git] --static enable static build [$static] --docdir=PATH install documentation in PATH$confsuffix --bindir=PATH install binaries in PATH --libdir=PATH install libraries in PATH --libexecdir=PATH install helper binaries in PATH --sysconfdir=PATH install config in PATH$confsuffix --localstatedir=PATH install local state in PATH (set at runtime on win32) --with-confsuffix=SUFFIX suffix for QEMU data inside datadir/libdir/sysconfdir [$confsuffix] --with-pkgversion=VERS use specified string as sub-version of the package --enable-debug enable common debug build options --enable-sanitizers enable default sanitizers --disable-strip disable stripping binaries --disable-werror disable compilation abort on warning --disable-stack-protector disable compiler-provided stack protection --enable-malloc-trim enable libc malloc_trim() for memory optimization --cpu=CPU Build for host CPU [$cpu] --enable-debug-stack-usage track the maximum stack usage of stacks created by qemu_alloc_stack Optional features, enabled with --enable-FEATURE and disabled with --disable-FEATURE, default is enabled if available: pie Position Independent Executables debug-tcg TCG debugging (default is disabled) membarrier membarrier system call (for Linux 4.14+ or Windows) tcmalloc tcmalloc support jemalloc jemalloc support avx2 AVX2 optimization support avx512f AVX512F optimization support NOTE: The object files are built at the place where configure is launched EOF exit 0 fi # Remove old dependency files to make sure that they get properly regenerated rm -f */config-devices.mak.d # Check that the C compiler works. Doing this here before testing # the host CPU ensures that we had a valid CC to autodetect the # $cpu var (and we should bail right here if that's not the case). # It also allows the help message to be printed without a CC. write_c_skeleton; if compile_object ; then : C compiler works ok else error_exit "\"$cc\" either does not exist or does not work" fi if ! compile_prog ; then error_exit "\"$cc\" cannot build an executable (is your linker broken?)" fi # Now we have handled --enable-tcg-interpreter and know we're not just # printing the help message, bail out if the host CPU isn't supported. if test "$ARCH" = "unknown"; then error_exit "Unsupported CPU = $cpu, try --enable-tcg-interpreter" fi # Consult white-list to determine whether to enable werror # by default. Only enable by default for git builds if test -z "$werror" ; then if test -e "$source_path/.git" && \ { test "$linux" = "yes" || test "$mingw32" = "yes"; }; then werror="yes" else werror="no" fi fi if test "$bogus_os" = "yes"; then # Now that we know that we're not printing the help and that # the compiler works (so the results of the check_defines we used # to identify the OS are reliable), if we didn't recognize the # host OS we should stop now. error_exit "Unrecognized host OS (uname -s reports '$(uname -s)')" fi # Check whether the compiler matches our minimum requirements: cat > $TMPC << EOF #if defined(__clang_major__) && defined(__clang_minor__) # ifdef __apple_build_version__ # if __clang_major__ < 5 || (__clang_major__ == 5 && __clang_minor__ < 1) # error You need at least XCode Clang v5.1 to compile QEMU # endif # else # if __clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ < 4) # error You need at least Clang v3.4 to compile QEMU # endif # endif #elif defined(__GNUC__) && defined(__GNUC_MINOR__) # if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8) # error You need at least GCC v4.8 to compile QEMU # endif #else # error You either need GCC or Clang to compiler QEMU #endif int main (void) { return 0; } EOF if ! compile_prog "" "" ; then error_exit "You need at least GCC v4.8 or Clang v3.4 (or XCode Clang v5.1)" fi gcc_flags="-Wold-style-declaration -Wold-style-definition -Wtype-limits" gcc_flags="-Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers $gcc_flags" gcc_flags="-Wno-missing-include-dirs -Wempty-body -Wnested-externs $gcc_flags" gcc_flags="-Wendif-labels -Wno-shift-negative-value $gcc_flags" gcc_flags="-Wno-initializer-overrides -Wexpansion-to-defined $gcc_flags" gcc_flags="-Wno-string-plus-int -Wno-typedef-redefinition $gcc_flags" # Note that we do not add -Werror to gcc_flags here, because that would # enable it for all configure tests. If a configure test failed due # to -Werror this would just silently disable some features, # so it's too error prone. cc_has_warning_flag() { write_c_skeleton; # Use the positive sense of the flag when testing for -Wno-wombat # support (gcc will happily accept the -Wno- form of unknown # warning options). optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')" compile_prog "-Werror $optflag" "" } for flag in $gcc_flags; do if cc_has_warning_flag $flag ; then QEMU_CFLAGS="$QEMU_CFLAGS $flag" fi done if test "$stack_protector" != "no"; then cat > $TMPC << EOF int main(int argc, char *argv[]) { char arr[64], *p = arr, *c = argv[0]; while (*c) { *p++ = *c++; } return 0; } EOF gcc_flags="-fstack-protector-strong -fstack-protector-all" sp_on=0 for flag in $gcc_flags; do # We need to check both a compile and a link, since some compiler # setups fail only on a .c->.o compile and some only at link time if do_cc $QEMU_CFLAGS -Werror $flag -c -o $TMPO $TMPC && compile_prog "-Werror $flag" ""; then QEMU_CFLAGS="$QEMU_CFLAGS $flag" QEMU_LDFLAGS="$QEMU_LDFLAGS $flag" sp_on=1 break fi done if test "$stack_protector" = yes; then if test $sp_on = 0; then error_exit "Stack protector not supported" fi fi fi # Disable -Wmissing-braces on older compilers that warn even for # the "universal" C zero initializer {0}. cat > $TMPC << EOF struct { int a[2]; } x = {0}; EOF if compile_object "-Werror" "" ; then : else QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces" fi # Unconditional check for compiler __thread support cat > $TMPC << EOF static __thread int tls_var; int main(void) { return tls_var; } EOF if ! compile_prog "-Werror" "" ; then error_exit "Your compiler does not support the __thread specifier for " \ "Thread-Local Storage (TLS). Please upgrade to a version that does." fi cat > $TMPC << EOF #ifdef __linux__ # define THREAD __thread #else # define THREAD #endif static THREAD int tls_var; int main(void) { return tls_var; } EOF if test "$static" = "yes"; then if test "$pie" != "no" && compile_prog "-Werror -fPIE -DPIE" "-static-pie"; then QEMU_CFLAGS="-fPIE -DPIE $QEMU_CFLAGS" QEMU_LDFLAGS="-static-pie $QEMU_LDFLAGS" pie="yes" elif test "$pie" = "yes"; then error_exit "-static-pie not available due to missing toolchain support" else QEMU_LDFLAGS="-static $QEMU_LDFLAGS" pie="no" fi elif test "$pie" = "no"; then QEMU_CFLAGS="$CFLAGS_NOPIE $QEMU_CFLAGS" QEMU_LDFLAGS="$LDFLAGS_NOPIE $QEMU_LDFLAGS" elif compile_prog "-Werror -fPIE -DPIE" "-pie"; then QEMU_CFLAGS="-fPIE -DPIE $QEMU_CFLAGS" QEMU_LDFLAGS="-pie $QEMU_LDFLAGS" pie="yes" elif test "$pie" = "yes"; then error_exit "PIE not available due to missing toolchain support" else echo "Disabling PIE due to missing toolchain support" pie="no" fi # Detect support for PT_GNU_RELRO + DT_BIND_NOW. # The combination is known as "full relro", because .got.plt is read-only too. if compile_prog "" "-Wl,-z,relro -Wl,-z,now" ; then QEMU_LDFLAGS="-Wl,-z,relro -Wl,-z,now $QEMU_LDFLAGS" fi ########################################## # __sync_fetch_and_and requires at least -march=i486. Many toolchains # use i686 as default anyway, but for those that don't, an explicit # specification is necessary if test "$cpu" = "i386"; then cat > $TMPC << EOF static int sfaa(int *ptr) { return __sync_fetch_and_and(ptr, 0); } int main(void) { int val = 42; val = __sync_val_compare_and_swap(&val, 0, 1); sfaa(&val); return val; } EOF if ! compile_prog "" "" ; then QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS" fi fi ######################################### # Solaris specific configure tool chain decisions if test "$solaris" = "yes" ; then if has $install; then : else error_exit "Solaris install program not found. Use --install=/usr/ucb/install or" \ "install fileutils from www.blastwave.org using pkg-get -i fileutils" \ "to get ginstall which is used by default (which lives in /opt/csw/bin)" fi if test "$(path_of $install)" = "/usr/sbin/install" ; then error_exit "Solaris /usr/sbin/install is not an appropriate install program." \ "try ginstall from the GNU fileutils available from www.blastwave.org" \ "using pkg-get -i fileutils, or use --install=/usr/ucb/install" fi if has ar; then : else if test -f /usr/ccs/bin/ar ; then error_exit "No path includes ar" \ "Add /usr/ccs/bin to your path and rerun configure" fi error_exit "No path includes ar" fi fi if test -z "${target_list+xxx}" ; then for target in $default_target_list; do supported_target $target 2>/dev/null && \ target_list="$target_list $target" done target_list="${target_list# }" else target_list=$(echo "$target_list" | sed -e 's/,/ /g') for target in $target_list; do # Check that we recognised the target name; this allows a more # friendly error message than if we let it fall through. case " $default_target_list " in *" $target "*) ;; *) error_exit "Unknown target name '$target'" ;; esac supported_target $target || exit 1 done fi # see if system emulation was really requested case " $target_list " in *"-softmmu "*) softmmu=yes ;; *) softmmu=no ;; esac feature_not_found() { feature=$1 remedy=$2 error_exit "User requested feature $feature" \ "configure was not able to find it." \ "$remedy" } # --- # big/little endian test cat > $TMPC << EOF short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, }; short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, }; extern int foo(short *, short *); int main(int argc, char *argv[]) { return foo(big_endian, little_endian); } EOF if compile_object ; then if strings -a $TMPO | grep -q BiGeNdIaN ; then bigendian="yes" elif strings -a $TMPO | grep -q LiTtLeEnDiAn ; then bigendian="no" else echo big/little test failed fi else echo big/little test failed fi ########################################## # pkg-config probe if ! has "$pkg_config_exe"; then error_exit "pkg-config binary '$pkg_config_exe' not found" fi ########################################## # pthread probe PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2" pthread=no cat > $TMPC << EOF #include static void *f(void *p) { return NULL; } int main(void) { pthread_t thread; pthread_create(&thread, 0, f, 0); return 0; } EOF if compile_prog "" "" ; then pthread=yes else for pthread_lib in $PTHREADLIBS_LIST; do if compile_prog "" "$pthread_lib" ; then pthread=yes found=no for lib_entry in $LIBS; do if test "$lib_entry" = "$pthread_lib"; then found=yes break fi done if test "$found" = "no"; then LIBS="$pthread_lib $LIBS" fi PTHREAD_LIB="$pthread_lib" break fi done fi if test "$mingw32" != yes && test "$pthread" = no; then error_exit "pthread check failed" \ "Make sure to have the pthread libs and headers installed." fi # check for pthread_setname_np with thread id pthread_setname_np_w_tid=no cat > $TMPC << EOF #include static void *f(void *p) { return NULL; } int main(void) { pthread_t thread; pthread_create(&thread, 0, f, 0); pthread_setname_np(thread, "QEMU"); return 0; } EOF if compile_prog "" "$pthread_lib" ; then pthread_setname_np_w_tid=yes fi # check for pthread_setname_np without thread id pthread_setname_np_wo_tid=no cat > $TMPC << EOF #include static void *f(void *p) { pthread_setname_np("QEMU"); } int main(void) { pthread_t thread; pthread_create(&thread, 0, f, 0); return 0; } EOF if compile_prog "" "$pthread_lib" ; then pthread_setname_np_wo_tid=yes fi if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then echo "ERROR: tcmalloc && jemalloc can't be used at the same time" exit 1 fi # Even if malloc_trim() is available, these non-libc memory allocators # do not support it. if test "$tcmalloc" = "yes" || test "$jemalloc" = "yes" ; then if test "$malloc_trim" = "yes" ; then echo "Disabling malloc_trim with non-libc memory allocator" fi malloc_trim="no" fi ####################################### # malloc_trim if test "$malloc_trim" != "no" ; then cat > $TMPC << EOF #include int main(void) { malloc_trim(0); return 0; } EOF if compile_prog "" "" ; then malloc_trim="yes" else malloc_trim="no" fi fi ########################################## # tcmalloc probe if test "$tcmalloc" = "yes" ; then cat > $TMPC << EOF #include int main(void) { malloc(1); return 0; } EOF if compile_prog "" "-ltcmalloc" ; then LIBS="-ltcmalloc $LIBS" else feature_not_found "tcmalloc" "install gperftools devel" fi fi ########################################## # jemalloc probe if test "$jemalloc" = "yes" ; then cat > $TMPC << EOF #include int main(void) { malloc(1); return 0; } EOF if compile_prog "" "-ljemalloc" ; then LIBS="-ljemalloc $LIBS" else feature_not_found "jemalloc" "install jemalloc devel" fi fi ########################################## # signalfd probe signalfd="no" cat > $TMPC << EOF #include #include #include int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); } EOF if compile_prog "" "" ; then signalfd=yes fi # check for sync_file_range sync_file_range=no cat > $TMPC << EOF #include int main(void) { sync_file_range(0, 0, 0, 0); return 0; } EOF if compile_prog "" "" ; then sync_file_range=yes fi # check for dup3 dup3=no cat > $TMPC << EOF #include int main(void) { dup3(0, 0, 0); return 0; } EOF if compile_prog "" "" ; then dup3=yes fi # check for prctl(PR_SET_TIMERSLACK , ... ) support prctl_pr_set_timerslack=no cat > $TMPC << EOF #include int main(void) { prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0); return 0; } EOF if compile_prog "" "" ; then prctl_pr_set_timerslack=yes fi # check for epoll support epoll=no cat > $TMPC << EOF #include int main(void) { epoll_create(0); return 0; } EOF if compile_prog "" "" ; then epoll=yes fi # clock_adjtime probe clock_adjtime=no cat > $TMPC < int main(void) { return clock_adjtime(0, 0); } EOF clock_adjtime=no if compile_prog "" "" ; then clock_adjtime=yes fi # syncfs probe syncfs=no cat > $TMPC < int main(void) { return syncfs(0); } EOF syncfs=no if compile_prog "" "" ; then syncfs=yes fi # Search for bswap_32 function byteswap_h=no cat > $TMPC << EOF #include int main(void) { return bswap_32(0); } EOF if compile_prog "" "" ; then byteswap_h=yes fi # Search for bswap32 function bswap_h=no cat > $TMPC << EOF #include #include #include int main(void) { return bswap32(0); } EOF if compile_prog "" "" ; then bswap_h=yes fi ########################################## # Do we need libm cat > $TMPC << EOF #include int main(int argc, char **argv) { return isnan(sin((double)argc)); } EOF if compile_prog "" "" ; then : elif compile_prog "" "-lm" ; then LIBS="-lm $LIBS" else error_exit "libm check failed" fi ########################################## # Do we need librt # uClibc provides 2 versions of clock_gettime(), one with realtime # support and one without. This means that the clock_gettime() don't # need -lrt. We still need it for timer_create() so we check for this # function in addition. cat > $TMPC < #include int main(void) { timer_create(CLOCK_REALTIME, NULL, NULL); return clock_gettime(CLOCK_REALTIME, NULL); } EOF if compile_prog "" "" ; then : # we need pthread for static linking. use previous pthread test result elif compile_prog "" "$pthread_lib -lrt" ; then LIBS="$LIBS -lrt" fi # Check whether we need to link libutil for openpty() cat > $TMPC << EOF extern int openpty(int *am, int *as, char *name, void *termp, void *winp); int main(void) { return openpty(0, 0, 0, 0, 0); } EOF if ! compile_prog "" "" ; then if compile_prog "" "-lutil" ; then libs_softmmu="-lutil $libs_softmmu" libs_tools="-lutil $libs_tools" fi fi ########################################## # check if we have madvise madvise=no cat > $TMPC << EOF #include #include #include int main(void) { return madvise(NULL, 0, MADV_DONTNEED); } EOF if compile_prog "" "" ; then madvise=yes fi ########################################## # check if we have posix_madvise posix_madvise=no cat > $TMPC << EOF #include #include int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); } EOF if compile_prog "" "" ; then posix_madvise=yes fi ########################################## # check if we have posix_memalign() posix_memalign=no cat > $TMPC << EOF #include int main(void) { void *p; return posix_memalign(&p, 8, 8); } EOF if compile_prog "" "" ; then posix_memalign=yes fi ########################################## # check if we have posix_syslog posix_syslog=no cat > $TMPC << EOF #include int main(void) { openlog("qemu", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "configure"); return 0; } EOF if compile_prog "" "" ; then posix_syslog=yes fi ########################################## # check if we have sem_timedwait sem_timedwait=no cat > $TMPC << EOF #include int main(void) { sem_t s; struct timespec t = {0}; return sem_timedwait(&s, &t); } EOF if compile_prog "" "" ; then sem_timedwait=yes fi ########################################## # check if we have strchrnul strchrnul=no cat > $TMPC << EOF #include int main(void); // Use a haystack that the compiler shouldn't be able to constant fold char *haystack = (char*)&main; int main(void) { return strchrnul(haystack, 'x') != &haystack[6]; } EOF if compile_prog "" "" ; then strchrnul=yes fi ######################################### # check if we have st_atim st_atim=no cat > $TMPC << EOF #include #include int main(void) { return offsetof(struct stat, st_atim); } EOF if compile_prog "" "" ; then st_atim=yes fi ########################################## # check if we have open_by_handle_at open_by_handle_at=no cat > $TMPC << EOF #include #if !defined(AT_EMPTY_PATH) # error missing definition #else int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); } #endif EOF if compile_prog "" "" ; then open_by_handle_at=yes fi ######################################## # check if we have linux/magic.h linux_magic_h=no cat > $TMPC << EOF #include int main(void) { return 0; } EOF if compile_prog "" "" ; then linux_magic_h=yes fi ######################################## # check whether we can disable warning option with a pragma (this is needed # to silence warnings in the headers of some versions of external libraries). # This test has to be compiled with -Werror as otherwise an unknown pragma is # only a warning. # # If we can't selectively disable warning in the code, disable -Werror so that # the build doesn't fail anyway. pragma_disable_unused_but_set=no cat > $TMPC << EOF #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstrict-prototypes" #pragma GCC diagnostic pop int main(void) { return 0; } EOF if compile_prog "-Werror" "" ; then pragma_diagnostic_available=yes else werror=no fi ######################################## # check if environ is declared has_environ=no cat > $TMPC << EOF #include int main(void) { environ = 0; return 0; } EOF if compile_prog "" "" ; then has_environ=yes fi ######################################## # check if cpuid.h is usable. cat > $TMPC << EOF #include int main(void) { unsigned a, b, c, d; int max = __get_cpuid_max(0, 0); if (max >= 1) { __cpuid(1, a, b, c, d); } if (max >= 7) { __cpuid_count(7, 0, a, b, c, d); } return 0; } EOF if compile_prog "" "" ; then cpuid_h=yes fi ########################################## # avx2 optimization requirement check # # There is no point enabling this if cpuid.h is not usable, # since we won't be able to select the new routines. if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then cat > $TMPC << EOF #pragma GCC push_options #pragma GCC target("avx2") #include #include static int bar(void *a) { __m256i x = *(__m256i *)a; return _mm256_testz_si256(x, x); } int main(int argc, char *argv[]) { return bar(argv[0]); } EOF if compile_object "" ; then avx2_opt="yes" else avx2_opt="no" fi fi ########################################## # avx512f optimization requirement check # # There is no point enabling this if cpuid.h is not usable, # since we won't be able to select the new routines. # by default, it is turned off. # if user explicitly want to enable it, check environment if test "$cpuid_h" = "yes" && test "$avx512f_opt" = "yes"; then cat > $TMPC << EOF #pragma GCC push_options #pragma GCC target("avx512f") #include #include static int bar(void *a) { __m512i x = *(__m512i *)a; return _mm512_test_epi64_mask(x, x); } int main(int argc, char *argv[]) { return bar(argv[0]); } EOF if ! compile_object "" ; then avx512f_opt="no" fi else avx512f_opt="no" fi ######################################## # check if __[u]int128_t is usable. int128=no cat > $TMPC << EOF __int128_t a; __uint128_t b; int main (void) { a = a + b; b = a * b; a = a * a; return 0; } EOF if compile_prog "" "" ; then int128=yes fi ######################################### # See if 128-bit atomic operations are supported. atomic128=no if test "$int128" = "yes"; then cat > $TMPC << EOF int main(void) { unsigned __int128 x = 0, y = 0; y = __atomic_load_16(&x, 0); __atomic_store_16(&x, y, 0); __atomic_compare_exchange_16(&x, &y, x, 0, 0, 0); return 0; } EOF if compile_prog "" "" ; then atomic128=yes fi fi cmpxchg128=no if test "$int128" = yes && test "$atomic128" = no; then cat > $TMPC << EOF int main(void) { unsigned __int128 x = 0, y = 0; __sync_val_compare_and_swap_16(&x, y, x); return 0; } EOF if compile_prog "" "" ; then cmpxchg128=yes fi fi ######################################### # See if 64-bit atomic operations are supported. # Note that without __atomic builtins, we can only # assume atomic loads/stores max at pointer size. cat > $TMPC << EOF #include int main(void) { uint64_t x = 0, y = 0; #ifdef __ATOMIC_RELAXED y = __atomic_load_8(&x, 0); __atomic_store_8(&x, y, 0); __atomic_compare_exchange_8(&x, &y, x, 0, 0, 0); __atomic_exchange_8(&x, y, 0); __atomic_fetch_add_8(&x, y, 0); #else typedef char is_host64[sizeof(void *) >= sizeof(uint64_t) ? 1 : -1]; __sync_lock_test_and_set(&x, y); __sync_val_compare_and_swap(&x, y, 0); __sync_fetch_and_add(&x, y); #endif return 0; } EOF if compile_prog "" "" ; then atomic64=yes fi ######################################### # See if --dynamic-list is supported by the linker ld_dynamic_list="no" if test "$static" = "no" ; then cat > $TMPTXT < $TMPC < void foo(void); void foo(void) { printf("foo\n"); } int main(void) { foo(); return 0; } EOF if compile_prog "" "-Wl,--dynamic-list=$TMPTXT" ; then ld_dynamic_list="yes" fi fi ######################################### # See if -exported_symbols_list is supported by the linker ld_exported_symbols_list="no" if test "$static" = "no" ; then cat > $TMPTXT < $TMPC << EOF int x = 1; extern const int y __attribute__((alias("x"))); int main(void) { return 0; } EOF if compile_prog "" "" ; then attralias=yes fi ######################################## # check if getauxval is available. getauxval=no cat > $TMPC << EOF #include int main(void) { return getauxval(AT_HWCAP) == 0; } EOF if compile_prog "" "" ; then getauxval=yes fi ######################################## # check if ccache is interfering with # semantic analysis of macros unset CCACHE_CPP2 ccache_cpp2=no cat > $TMPC << EOF static const int Z = 1; #define fn() ({ Z; }) #define TAUT(X) ((X) == Z) #define PAREN(X, Y) (X == Y) #define ID(X) (X) int main(int argc, char *argv[]) { int x = 0, y = 0; x = ID(x); x = fn(); fn(); if (PAREN(x, y)) return 0; if (TAUT(Z)) return 0; return 0; } EOF if ! compile_object "-Werror"; then ccache_cpp2=yes fi ########################################## # check for usable membarrier system call if test "$membarrier" = "yes"; then have_membarrier=no if test "$mingw32" = "yes" ; then have_membarrier=yes elif test "$linux" = "yes" ; then cat > $TMPC << EOF #include #include #include #include int main(void) { syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0); syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0); exit(0); } EOF if compile_prog "" "" ; then have_membarrier=yes fi fi if test "$have_membarrier" = "no"; then feature_not_found "membarrier" "membarrier system call not available" fi else # Do not enable it by default even for Mingw32, because it doesn't # work on Wine. membarrier=no fi ################################################# # Sparc implicitly links with --relax, which is # incompatible with -r, so --no-relax should be # given. It does no harm to give it on other # platforms too. # Note: the prototype is needed since QEMU_CFLAGS # contains -Wmissing-prototypes cat > $TMPC << EOF extern int foo(void); int foo(void) { return 0; } EOF if ! compile_object ""; then error_exit "Failed to compile object file for LD_REL_FLAGS test" fi for i in '-Wl,-r -Wl,--no-relax' -Wl,-r -r; do if do_cc -nostdlib $i -o $TMPMO $TMPO; then LD_REL_FLAGS=$i break fi done ########################################## # check for sysmacros.h have_sysmacros=no cat > $TMPC << EOF #include int main(void) { return makedev(0, 0); } EOF if compile_prog "" "" ; then have_sysmacros=yes fi ########################################## # check for _Static_assert() have_static_assert=no cat > $TMPC << EOF _Static_assert(1, "success"); int main(void) { return 0; } EOF if compile_prog "" "" ; then have_static_assert=yes fi ########################################## # check for utmpx.h, it is missing e.g. on OpenBSD have_utmpx=no cat > $TMPC << EOF #include struct utmpx user_info; int main(void) { return 0; } EOF if compile_prog "" "" ; then have_utmpx=yes fi ########################################## # check for getrandom() have_getrandom=no cat > $TMPC << EOF #include int main(void) { return getrandom(0, 0, GRND_NONBLOCK); } EOF if compile_prog "" "" ; then have_getrandom=yes fi ########################################## # checks for sanitizers have_asan=no have_ubsan=no have_asan_iface_h=no have_asan_iface_fiber=no if test "$sanitizers" = "yes" ; then write_c_skeleton if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then have_asan=yes fi # we could use a simple skeleton for flags checks, but this also # detect the static linking issue of ubsan, see also: # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285 cat > $TMPC << EOF #include int main(void) { void *tmp = malloc(10); return *(int *)(tmp + 2); } EOF if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then have_ubsan=yes fi if check_include "sanitizer/asan_interface.h" ; then have_asan_iface_h=yes fi cat > $TMPC << EOF #include int main(void) { __sanitizer_start_switch_fiber(0, 0, 0); return 0; } EOF if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then have_asan_iface_fiber=yes fi fi ########################################## # check for Apple Silicon JIT function if [ "$darwin" = "yes" ] ; then cat > $TMPC << EOF #include int main() { pthread_jit_write_protect_np(0); return 0; } EOF if ! compile_prog ""; then have_pthread_jit_protect='no' else have_pthread_jit_protect='yes' fi fi ########################################## # End of CC checks # After here, no more $cc or $ld runs write_c_skeleton if test "$have_asan" = "yes"; then QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS" QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS" if test "$have_asan_iface_h" = "no" ; then echo "ASAN build enabled, but ASAN header missing." \ "Without code annotation, the report may be inferior." elif test "$have_asan_iface_fiber" = "no" ; then echo "ASAN build enabled, but ASAN header is too old." \ "Without code annotation, the report may be inferior." fi fi if test "$have_ubsan" = "yes"; then QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS" QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS" fi # Now we've finished running tests it's OK to add -Werror to the compiler flags if test "$werror" = "yes"; then QEMU_CFLAGS="-Werror $QEMU_CFLAGS" fi if test "$solaris" = "no" ; then if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then QEMU_LDFLAGS="-Wl,--warn-common $QEMU_LDFLAGS" fi fi # Use ASLR, no-SEH and DEP if available if test "$mingw32" = "yes" ; then for flag in --dynamicbase --no-seh --nxcompat; do if ld_has $flag ; then QEMU_LDFLAGS="-Wl,$flag $QEMU_LDFLAGS" fi done fi # Disable OpenBSD W^X if available if test "$tcg" = "yes" && test "$targetos" = "OpenBSD"; then cat > $TMPC < $TMPC < $TMPCXX < $config_host_mak echo >> $config_host_mak echo all: >> $config_host_mak echo "prefix=$prefix" >> $config_host_mak echo "bindir=$bindir" >> $config_host_mak echo "libdir=$libdir" >> $config_host_mak echo "libexecdir=$libexecdir" >> $config_host_mak echo "includedir=$includedir" >> $config_host_mak echo "sysconfdir=$sysconfdir" >> $config_host_mak echo "qemu_confdir=$qemu_confdir" >> $config_host_mak if test "$mingw32" = "no" ; then echo "qemu_localstatedir=$local_statedir" >> $config_host_mak fi echo "qemu_helperdir=$libexecdir" >> $config_host_mak echo "qemu_localedir=$qemu_localedir" >> $config_host_mak echo "libs_cpu=$libs_cpu" >> $config_host_mak echo "libs_softmmu=$libs_softmmu" >> $config_host_mak echo "GIT=$git" >> $config_host_mak echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak echo "GIT_UPDATE=$git_update" >> $config_host_mak echo "ARCH=$ARCH" >> $config_host_mak if test "$strip_opt" = "yes" ; then echo "STRIP=${strip}" >> $config_host_mak fi if test "$bigendian" = "yes" ; then echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak fi if test "$mingw32" = "yes" ; then echo "CONFIG_WIN32=y" >> $config_host_mak rc_version=$(cat $source_path/VERSION) version_major=${rc_version%%.*} rc_version=${rc_version#*.} version_minor=${rc_version%%.*} rc_version=${rc_version#*.} version_subminor=${rc_version%%.*} version_micro=0 echo "CONFIG_FILEVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak echo "CONFIG_PRODUCTVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak else echo "CONFIG_POSIX=y" >> $config_host_mak fi if test "$linux" = "yes" ; then echo "CONFIG_LINUX=y" >> $config_host_mak fi if test "$darwin" = "yes" ; then echo "CONFIG_DARWIN=y" >> $config_host_mak fi if test "$solaris" = "yes" ; then echo "CONFIG_SOLARIS=y" >> $config_host_mak fi if test "$haiku" = "yes" ; then echo "CONFIG_HAIKU=y" >> $config_host_mak fi if test "$static" = "yes" ; then echo "CONFIG_STATIC=y" >> $config_host_mak fi qemu_version=$(head $source_path/VERSION) echo "VERSION=$qemu_version" >>$config_host_mak echo "PKGVERSION=$pkgversion" >>$config_host_mak echo "SRC_PATH=$source_path" >> $config_host_mak echo "TARGET_DIRS=$target_list" >> $config_host_mak if test "$sync_file_range" = "yes" ; then echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak fi if test "$dup3" = "yes" ; then echo "CONFIG_DUP3=y" >> $config_host_mak fi if test "$prctl_pr_set_timerslack" = "yes" ; then echo "CONFIG_PRCTL_PR_SET_TIMERSLACK=y" >> $config_host_mak fi if test "$epoll" = "yes" ; then echo "CONFIG_EPOLL=y" >> $config_host_mak fi if test "$clock_adjtime" = "yes" ; then echo "CONFIG_CLOCK_ADJTIME=y" >> $config_host_mak fi if test "$syncfs" = "yes" ; then echo "CONFIG_SYNCFS=y" >> $config_host_mak fi if test "$sem_timedwait" = "yes" ; then echo "CONFIG_SEM_TIMEDWAIT=y" >> $config_host_mak fi if test "$strchrnul" = "yes" ; then echo "HAVE_STRCHRNUL=y" >> $config_host_mak fi if test "$st_atim" = "yes" ; then echo "HAVE_STRUCT_STAT_ST_ATIM=y" >> $config_host_mak fi if test "$byteswap_h" = "yes" ; then echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak fi if test "$bswap_h" = "yes" ; then echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak fi if test "$have_broken_size_max" = "yes" ; then echo "HAVE_BROKEN_SIZE_MAX=y" >> $config_host_mak fi if test "$membarrier" = "yes" ; then echo "CONFIG_MEMBARRIER=y" >> $config_host_mak fi if test "$signalfd" = "yes" ; then echo "CONFIG_SIGNALFD=y" >> $config_host_mak fi if test "$tcg" = "yes"; then echo "CONFIG_TCG=y" >> $config_host_mak fi if test "$madvise" = "yes" ; then echo "CONFIG_MADVISE=y" >> $config_host_mak fi if test "$posix_madvise" = "yes" ; then echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak fi if test "$posix_memalign" = "yes" ; then echo "CONFIG_POSIX_MEMALIGN=y" >> $config_host_mak fi if test "$malloc_trim" = "yes" ; then echo "CONFIG_MALLOC_TRIM=y" >> $config_host_mak fi if test "$avx2_opt" = "yes" ; then echo "CONFIG_AVX2_OPT=y" >> $config_host_mak fi if test "$avx512f_opt" = "yes" ; then echo "CONFIG_AVX512F_OPT=y" >> $config_host_mak fi # XXX: suppress that if [ "$bsd" = "yes" ] ; then echo "CONFIG_BSD=y" >> $config_host_mak fi if test "$debug_stack_usage" = "yes" ; then echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak fi if test "$open_by_handle_at" = "yes" ; then echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak fi if test "$linux_magic_h" = "yes" ; then echo "CONFIG_LINUX_MAGIC_H=y" >> $config_host_mak fi if test "$pragma_diagnostic_available" = "yes" ; then echo "CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE=y" >> $config_host_mak fi if test "$have_asan_iface_fiber" = "yes" ; then echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak fi if test "$has_environ" = "yes" ; then echo "CONFIG_HAS_ENVIRON=y" >> $config_host_mak fi if test "$cpuid_h" = "yes" ; then echo "CONFIG_CPUID_H=y" >> $config_host_mak fi if test "$int128" = "yes" ; then echo "CONFIG_INT128=y" >> $config_host_mak fi if test "$atomic128" = "yes" ; then echo "CONFIG_ATOMIC128=y" >> $config_host_mak fi if test "$cmpxchg128" = "yes" ; then echo "CONFIG_CMPXCHG128=y" >> $config_host_mak fi if test "$atomic64" = "yes" ; then echo "CONFIG_ATOMIC64=y" >> $config_host_mak fi if test "$attralias" = "yes" ; then echo "CONFIG_ATTRIBUTE_ALIAS=y" >> $config_host_mak fi if test "$getauxval" = "yes" ; then echo "CONFIG_GETAUXVAL=y" >> $config_host_mak fi if test "$have_sysmacros" = "yes" ; then echo "CONFIG_SYSMACROS=y" >> $config_host_mak fi if test "$have_static_assert" = "yes" ; then echo "CONFIG_STATIC_ASSERT=y" >> $config_host_mak fi if test "$have_utmpx" = "yes" ; then echo "HAVE_UTMPX=y" >> $config_host_mak fi if test "$have_getrandom" = "yes" ; then echo "CONFIG_GETRANDOM=y" >> $config_host_mak fi if test "$have_pthread_jit_protect" = "yes" ; then echo "HAVE_PTHREAD_JIT_PROTECT=y" >> $config_host_mak fi # Hold two types of flag: # CONFIG_THREAD_SETNAME_BYTHREAD - we've got a way of setting the name on # a thread we have a handle to # CONFIG_PTHREAD_SETNAME_NP_W_TID - A way of doing it on a particular # platform if test "$pthread_setname_np_w_tid" = "yes" ; then echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak echo "CONFIG_PTHREAD_SETNAME_NP_W_TID=y" >> $config_host_mak elif test "$pthread_setname_np_wo_tid" = "yes" ; then echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak echo "CONFIG_PTHREAD_SETNAME_NP_WO_TID=y" >> $config_host_mak fi if test "$ARCH" = "sparc64" ; then QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/sparc $QEMU_INCLUDES" elif test "$ARCH" = "s390x" ; then QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/s390 $QEMU_INCLUDES" elif test "$ARCH" = "x86_64" || test "$ARCH" = "x32" ; then QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/i386 $QEMU_INCLUDES" elif test "$ARCH" = "ppc64" ; then QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/ppc $QEMU_INCLUDES" elif test "$ARCH" = "riscv32" || test "$ARCH" = "riscv64" ; then QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/riscv $QEMU_INCLUDES" else QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/\$(ARCH) $QEMU_INCLUDES" fi echo "TOOLS=$tools" >> $config_host_mak echo "MAKE=$make" >> $config_host_mak echo "INSTALL=$install" >> $config_host_mak echo "INSTALL_DIR=$install -d -m 0755" >> $config_host_mak echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak echo "CC=$cc" >> $config_host_mak if $iasl -h > /dev/null 2>&1; then echo "IASL=$iasl" >> $config_host_mak fi echo "HOST_CC=$host_cc" >> $config_host_mak echo "CXX=$cxx" >> $config_host_mak echo "OBJCC=$objcc" >> $config_host_mak echo "AR=$ar" >> $config_host_mak echo "ARFLAGS=$ARFLAGS" >> $config_host_mak echo "AS=$as" >> $config_host_mak echo "CCAS=$ccas" >> $config_host_mak echo "CPP=$cpp" >> $config_host_mak echo "OBJCOPY=$objcopy" >> $config_host_mak echo "LD=$ld" >> $config_host_mak echo "RANLIB=$ranlib" >> $config_host_mak echo "NM=$nm" >> $config_host_mak echo "PKG_CONFIG=$pkg_config_exe" >> $config_host_mak echo "CFLAGS=$CFLAGS" >> $config_host_mak echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak echo "QEMU_INCLUDES=$QEMU_INCLUDES" >> $config_host_mak echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak echo "LDFLAGS_NOPIE=$LDFLAGS_NOPIE" >> $config_host_mak echo "LD_REL_FLAGS=$LD_REL_FLAGS" >> $config_host_mak echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak echo "LIBS+=$LIBS" >> $config_host_mak echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak echo "PTHREAD_LIB=$PTHREAD_LIB" >> $config_host_mak echo "EXESUF=$EXESUF" >> $config_host_mak echo "DSOSUF=$DSOSUF" >> $config_host_mak echo "LDFLAGS_SHARED=$LDFLAGS_SHARED" >> $config_host_mak for target in $target_list; do target_dir="$target" config_target_mak=$target_dir/config-target.mak target_name=$(echo $target | cut -d '-' -f 1) target_aligned_only="no" case "$target_name" in alpha|hppa|mips64el|mips64|mipsel|mips|mipsn32|mipsn32el|sh4|sh4eb|sparc|sparc64|sparc32plus|xtensa|xtensaeb) target_aligned_only="yes" ;; esac target_bigendian="no" case "$target_name" in hppa|lm32|m68k|microblaze|mips|mipsn32|mips64|moxie|or1k|ppc|ppc64|ppc64abi32|s390x|sh4eb|sparc|sparc64|sparc32plus|xtensaeb) target_bigendian="yes" ;; esac target_user_only="no" target_linux_user="no" target_bsd_user="no" target_softmmu="yes" mkdir -p $target_dir echo "# Automatically generated by configure - do not modify" > $config_target_mak mttcg="no" TARGET_ARCH="$target_name" TARGET_BASE_ARCH="" TARGET_ABI_DIR="" case "$target_name" in i386) mttcg="yes" TARGET_SYSTBL_ABI=i386 ;; x86_64) TARGET_BASE_ARCH=i386 TARGET_SYSTBL_ABI=common,64 mttcg="yes" ;; alpha) mttcg="yes" TARGET_SYSTBL_ABI=common ;; arm) TARGET_ARCH=arm TARGET_SYSTBL_ABI=common,oabi mttcg="yes" ;; aarch64) TARGET_ARCH=aarch64 TARGET_BASE_ARCH=arm mttcg="yes" ;; cris) ;; hppa) mttcg="yes" TARGET_SYSTBL_ABI=common,32 ;; lm32) ;; m68k) TARGET_SYSTBL_ABI=common ;; microblaze|microblazeel) TARGET_ARCH=microblaze TARGET_SYSTBL_ABI=common echo "TARGET_ABI32=y" >> $config_target_mak ;; mips|mipsel) mttcg="yes" TARGET_ARCH=mips echo "TARGET_ABI_MIPSO32=y" >> $config_target_mak TARGET_SYSTBL_ABI=o32 ;; mipsn32|mipsn32el) mttcg="yes" TARGET_ARCH=mips64 TARGET_BASE_ARCH=mips echo "TARGET_ABI_MIPSN32=y" >> $config_target_mak echo "TARGET_ABI32=y" >> $config_target_mak TARGET_SYSTBL_ABI=n32 ;; mips64|mips64el) mttcg="no" TARGET_ARCH=mips64 TARGET_BASE_ARCH=mips echo "TARGET_ABI_MIPSN64=y" >> $config_target_mak TARGET_SYSTBL_ABI=n64 ;; moxie) ;; nios2) ;; or1k) TARGET_ARCH=openrisc TARGET_BASE_ARCH=openrisc ;; ppc) TARGET_SYSTBL_ABI=common,nospu,32 ;; ppc64) TARGET_BASE_ARCH=ppc TARGET_ABI_DIR=ppc TARGET_SYSTBL_ABI=common,nospu,64 mttcg=yes ;; ppc64le) TARGET_ARCH=ppc64 TARGET_BASE_ARCH=ppc TARGET_ABI_DIR=ppc TARGET_SYSTBL_ABI=common,nospu,64 mttcg=yes ;; ppc64abi32) TARGET_ARCH=ppc64 TARGET_BASE_ARCH=ppc TARGET_ABI_DIR=ppc TARGET_SYSTBL_ABI=common,nospu,32 echo "TARGET_ABI32=y" >> $config_target_mak ;; riscv32) TARGET_BASE_ARCH=riscv TARGET_ABI_DIR=riscv mttcg=yes ;; riscv64) TARGET_BASE_ARCH=riscv TARGET_ABI_DIR=riscv mttcg=yes ;; rx) TARGET_ARCH=rx target_compiler=$cross_cc_rx ;; sh4|sh4eb) TARGET_ARCH=sh4 TARGET_SYSTBL_ABI=common ;; sparc) TARGET_SYSTBL_ABI=common,32 ;; sparc64) TARGET_BASE_ARCH=sparc TARGET_SYSTBL_ABI=common,64 ;; sparc32plus) TARGET_ARCH=sparc64 TARGET_BASE_ARCH=sparc TARGET_ABI_DIR=sparc TARGET_SYSTBL_ABI=common,32 echo "TARGET_ABI32=y" >> $config_target_mak ;; s390x) TARGET_SYSTBL_ABI=common,64 mttcg=yes ;; tilegx) ;; tricore) TARGET_ARCH=tricore TARGET_BASE_ARCH=tricore ;; unicore32) ;; xtensa|xtensaeb) TARGET_ARCH=xtensa TARGET_SYSTBL_ABI=common mttcg="yes" ;; *) error_exit "Unsupported target CPU" ;; esac # TARGET_BASE_ARCH needs to be defined after TARGET_ARCH if [ "$TARGET_BASE_ARCH" = "" ]; then TARGET_BASE_ARCH=$TARGET_ARCH fi #symlink "$source_path/Makefile.target" "$target_dir/Makefile" upper() { echo "$@"| LC_ALL=C tr '[a-z]' '[A-Z]' } target_arch_name="$(upper $TARGET_ARCH)" echo "TARGET_$target_arch_name=y" >> $config_target_mak echo "TARGET_NAME=$target_name" >> $config_target_mak echo "TARGET_BASE_ARCH=$TARGET_BASE_ARCH" >> $config_target_mak if [ "$TARGET_ABI_DIR" = "" ]; then TARGET_ABI_DIR=$TARGET_ARCH fi echo "TARGET_ABI_DIR=$TARGET_ABI_DIR" >> $config_target_mak if [ "$HOST_VARIANT_DIR" != "" ]; then echo "HOST_VARIANT_DIR=$HOST_VARIANT_DIR" >> $config_target_mak fi if [ "$TARGET_SYSTBL_ABI" != "" ]; then echo "TARGET_SYSTBL_ABI=$TARGET_SYSTBL_ABI" >> $config_target_mak fi if test "$target_aligned_only" = "yes" ; then echo "TARGET_ALIGNED_ONLY=y" >> $config_target_mak fi if test "$target_bigendian" = "yes" ; then echo "TARGET_WORDS_BIGENDIAN=y" >> $config_target_mak fi if test "$target_softmmu" = "yes" ; then echo "CONFIG_SOFTMMU=y" >> $config_target_mak if test "$mttcg" = "yes" ; then echo "TARGET_SUPPORTS_MTTCG=y" >> $config_target_mak fi fi if test "$target_user_only" = "yes" ; then echo "CONFIG_USER_ONLY=y" >> $config_target_mak fi if test "$target_linux_user" = "yes" ; then echo "CONFIG_LINUX_USER=y" >> $config_target_mak fi if test "$target_bsd_user" = "yes" ; then echo "CONFIG_BSD_USER=y" >> $config_target_mak fi # generate QEMU_CFLAGS/QEMU_LDFLAGS for targets cflags="" ldflags="" case "$ARCH" in alpha) # Ensure there's only a single GP cflags="-msmall-data $cflags" ;; esac echo "QEMU_LDFLAGS+=$ldflags" >> $config_target_mak echo "QEMU_CFLAGS+=$cflags" >> $config_target_mak done # for target in $targets if test "$ccache_cpp2" = "yes"; then echo "export CCACHE_CPP2=y" >> $config_host_mak fi # Save the configure command line for later reuse. cat <config.status #!/bin/sh # Generated by configure. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. EOD preserve_env() { envname=$1 eval envval=\$$envname if test -n "$envval" then echo "$envname='$envval'" >> config.status echo "export $envname" >> config.status else echo "unset $envname" >> config.status fi } # Preserve various env variables that influence what # features/build target configure will detect preserve_env AR preserve_env AS preserve_env CC preserve_env CPP preserve_env CXX preserve_env INSTALL preserve_env LD preserve_env LD_LIBRARY_PATH preserve_env LIBTOOL preserve_env MAKE preserve_env NM preserve_env OBJCOPY preserve_env PATH preserve_env PKG_CONFIG preserve_env PKG_CONFIG_LIBDIR preserve_env PKG_CONFIG_PATH preserve_env STRIP printf "exec" >>config.status printf " '%s'" "$0" "$@" >>config.status echo ' "$@"' >>config.status chmod +x config.status rm -r "$TMPDIR1"