ftmemsim-valgrind/configure.ac
Petar Jovanovic fde6d8320b mips64: modify configure.ac to check for cavium supported toolchain
Modify configure to check if we can pass -march=octeon or -march=octeon2
flags to the compiler. This part is required as it gives us information how
to compile (i.e. whether to compile) tests specific for Cavium Octeon boards.

Patch by Zahid Anwar, with minor modifications.

Related to Bugzilla issue 326444.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13783
2014-01-29 18:08:50 +00:00

2971 lines
87 KiB
Plaintext

##------------------------------------------------------------##
#
# The multiple-architecture stuff in this file is pretty
# cryptic. Read docs/internals/multiple-architectures.txt
# for at least a partial explanation of what is going on.
#
##------------------------------------------------------------##
# Process this file with autoconf to produce a configure script.
AC_INIT([Valgrind],[3.10.0.SVN],[valgrind-users@lists.sourceforge.net])
AC_CONFIG_SRCDIR(coregrind/m_main.c)
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([foreign subdir-objects])
AM_MAINTAINER_MODE
#----------------------------------------------------------------------------
# Checks for various programs.
#----------------------------------------------------------------------------
CFLAGS="-Wno-long-long $CFLAGS"
CXXFLAGS="-Wno-long-long $CXXFLAGS"
AC_PROG_LN_S
AC_PROG_CC
AM_PROG_CC_C_O
AC_PROG_CPP
AC_PROG_CXX
# AC_PROG_OBJC apparently causes problems on older Linux distros (eg. with
# autoconf 2.59). If we ever have any Objective-C code in the Valgrind code
# base (eg. most likely as Darwin-specific tests) we'll need one of the
# following:
# - put AC_PROG_OBJC in a Darwin-specific part of this file
# - Use AC_PROG_OBJC here and up the minimum autoconf version
# - Use the following, which is apparently equivalent:
# m4_ifdef([AC_PROG_OBJC],
# [AC_PROG_OBJC],
# [AC_CHECK_TOOL([OBJC], [gcc])
# AC_SUBST([OBJC])
# AC_SUBST([OBJCFLAGS])
# ])
AC_PROG_RANLIB
# provide a very basic definition for AC_PROG_SED if it's not provided by
# autoconf (as e.g. in autoconf 2.59).
m4_ifndef([AC_PROG_SED],
[AC_DEFUN([AC_PROG_SED],
[AC_ARG_VAR([SED])
AC_CHECK_PROGS([SED],[gsed sed])])])
AC_PROG_SED
# If no AR variable was specified, look up the name of the archiver. Otherwise
# do not touch the AR variable.
if test "x$AR" = "x"; then
AC_PATH_PROGS([AR], [`echo $LD | $SED 's/ld$/ar/'` "ar"], [ar])
fi
AC_ARG_VAR([AR],[Archiver command])
# Check for the compiler support
if test "${GCC}" != "yes" ; then
AC_MSG_ERROR([Valgrind relies on GCC to be compiled])
fi
# figure out where perl lives
AC_PATH_PROG(PERL, perl)
# figure out where gdb lives
AC_PATH_PROG(GDB, gdb, "/no/gdb/was/found/at/configure/time")
AC_DEFINE_UNQUOTED(GDB_PATH, "$GDB", [path to GDB])
# some older automake's don't have it so try something on our own
ifdef([AM_PROG_AS],[AM_PROG_AS],
[
AS="${CC}"
AC_SUBST(AS)
ASFLAGS=""
AC_SUBST(ASFLAGS)
])
# Check if 'diff' supports -u (universal diffs) and use it if possible.
AC_MSG_CHECKING([for diff -u])
AC_SUBST(DIFF)
# Comparing two identical files results in 0.
tmpfile="tmp-xxx-yyy-zzz"
touch $tmpfile;
if diff -u $tmpfile $tmpfile ; then
AC_MSG_RESULT([yes])
DIFF="diff -u"
else
AC_MSG_RESULT([no])
DIFF="diff"
fi
rm $tmpfile
# We don't want gcc < 3.0
AC_MSG_CHECKING([for a supported version of gcc])
# Obtain the compiler version.
#
# A few examples of how the ${CC} --version output looks like:
#
# Arch Linux: i686-pc-linux-gnu-gcc (GCC) 4.6.2
# Debian Linux: gcc (Debian 4.3.2-1.1) 4.3.2
# openSUSE: gcc (SUSE Linux) 4.5.1 20101208 [gcc-4_5-branch revision 167585]
# Exherbo Linux: x86_64-pc-linux-gnu-gcc (Exherbo gcc-4.6.2) 4.6.2
# MontaVista Linux for ARM: arm-none-linux-gnueabi-gcc (Sourcery G++ Lite 2009q1-203) 4.3.3
# OS/X 10.6: i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
# OS/X 10.7: i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)
# Clang: clang version 2.9 (tags/RELEASE_29/final)
# Apple clang: Apple clang version 3.1 (tags/Apple/clang-318.0.58) (based on LLVM 3.1svn)
# FreeBSD clang: FreeBSD clang version 3.1 (branches/release_31 156863) 20120523
#
[
if test "x`${CC} --version | $SED -n -e 's/.*\(clang\) version.*/\1/p'`" = "xclang" ; then
is_clang="clang"
# Don't use -dumpversion with clang: it will always produce "4.2.1".
gcc_version=`${CC} --version | $SED -n -e 's/.*clang version \([0-9.]*\).*$/\1/p'`
CFLAGS="$CFLAGS -Wno-tautological-compare -Wno-cast-align -Wno-self-assign"
CXXFLAGS="$CXXFLAGS -Wno-tautological-compare -Wno-cast-align -Wno-self-assign"
else
is_clang="notclang"
gcc_version=`${CC} -dumpversion 2>/dev/null`
if test "x$gcc_version" = x; then
gcc_version=`${CC} --version | $SED -n -e 's/[^ ]*gcc[^ ]* ([^)]*) \([0-9.]*\).*$/\1/p'`
fi
fi
]
AM_CONDITIONAL(COMPILER_IS_CLANG, test $is_clang = clang)
case "${is_clang}-${gcc_version}" in
notclang-3.*)
AC_MSG_RESULT([ok (${gcc_version})])
;;
notclang-4.*)
AC_MSG_RESULT([ok (${gcc_version})])
;;
clang-2.9|clang-3.*|clang-4.*)
AC_MSG_RESULT([ok (clang-${gcc_version})])
;;
*)
AC_MSG_RESULT([no (${gcc_version})])
AC_MSG_ERROR([please use gcc >= 3.0 or clang >= 2.9])
;;
esac
#----------------------------------------------------------------------------
# Arch/OS/platform tests.
#----------------------------------------------------------------------------
# We create a number of arch/OS/platform-related variables. We prefix them
# all with "VGCONF_" which indicates that they are defined at
# configure-time, and distinguishes them from the VGA_*/VGO_*/VGP_*
# variables used when compiling C files.
AC_CANONICAL_HOST
AC_MSG_CHECKING([for a supported CPU])
# ARCH_MAX reflects the most that this CPU can do: for example if it
# is a 64-bit capable PowerPC, then it must be set to ppc64 and not ppc32.
# Ditto for amd64. It is used for more configuration below, but is not used
# outside this file.
case "${host_cpu}" in
i?86)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="x86"
;;
x86_64)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="amd64"
;;
powerpc64)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="ppc64"
;;
powerpc)
# On Linux this means only a 32-bit capable CPU.
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="ppc32"
;;
s390x)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="s390x"
;;
armv7*)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="arm"
;;
aarch64*)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="arm64"
;;
mips)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="mips32"
;;
mipsel)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="mips32"
;;
mipsisa32r2)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="mips32"
;;
mips64*)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="mips64"
;;
mipsisa64*)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="mips64"
;;
*)
AC_MSG_RESULT([no (${host_cpu})])
AC_MSG_ERROR([Unsupported host architecture. Sorry])
;;
esac
#----------------------------------------------------------------------------
# Sometimes it's convenient to subvert the bi-arch build system and
# just have a single build even though the underlying platform is
# capable of both. Hence handle --enable-only64bit and
# --enable-only32bit. Complain if both are issued :-)
# [Actually, if either of these options are used, I think both get built,
# but only one gets installed. So if you use an in-place build, both can be
# used. --njn]
# Check if a 64-bit only build has been requested
AC_CACHE_CHECK([for a 64-bit only build], vg_cv_only64bit,
[AC_ARG_ENABLE(only64bit,
[ --enable-only64bit do a 64-bit only build],
[vg_cv_only64bit=$enableval],
[vg_cv_only64bit=no])])
# Check if a 32-bit only build has been requested
AC_CACHE_CHECK([for a 32-bit only build], vg_cv_only32bit,
[AC_ARG_ENABLE(only32bit,
[ --enable-only32bit do a 32-bit only build],
[vg_cv_only32bit=$enableval],
[vg_cv_only32bit=no])])
# Stay sane
if test x$vg_cv_only64bit = xyes -a x$vg_cv_only32bit = xyes; then
AC_MSG_ERROR(
[Nonsensical: both --enable-only64bit and --enable-only32bit.])
fi
#----------------------------------------------------------------------------
# VGCONF_OS is the primary build OS, eg. "linux". It is passed in to
# compilation of many C files via -VGO_$(VGCONF_OS) and
# -VGP_$(VGCONF_ARCH_PRI)_$(VGCONF_OS).
AC_MSG_CHECKING([for a supported OS])
AC_SUBST(VGCONF_OS)
DEFAULT_SUPP=""
case "${host_os}" in
*linux*)
AC_MSG_RESULT([ok (${host_os})])
VGCONF_OS="linux"
# Ok, this is linux. Check the kernel version
AC_MSG_CHECKING([for the kernel version])
kernel=`uname -r`
case "${kernel}" in
2.6.*|3.*)
AC_MSG_RESULT([2.6.x/3.x family (${kernel})])
AC_DEFINE([KERNEL_2_6], 1, [Define to 1 if you're using Linux 2.6.x or Linux 3.x])
;;
2.4.*)
AC_MSG_RESULT([2.4 family (${kernel})])
AC_DEFINE([KERNEL_2_4], 1, [Define to 1 if you're using Linux 2.4.x])
;;
*)
AC_MSG_RESULT([unsupported (${kernel})])
AC_MSG_ERROR([Valgrind works on kernels 2.4, 2.6])
;;
esac
;;
*darwin*)
AC_MSG_RESULT([ok (${host_os})])
VGCONF_OS="darwin"
AC_DEFINE([DARWIN_10_5], 100500, [DARWIN_VERS value for Mac OS X 10.5])
AC_DEFINE([DARWIN_10_6], 100600, [DARWIN_VERS value for Mac OS X 10.6])
AC_DEFINE([DARWIN_10_7], 100700, [DARWIN_VERS value for Mac OS X 10.7])
AC_DEFINE([DARWIN_10_8], 100800, [DARWIN_VERS value for Mac OS X 10.8])
AC_MSG_CHECKING([for the kernel version])
kernel=`uname -r`
# Nb: for Darwin we set DEFAULT_SUPP here. That's because Darwin
# has only one relevant version, the OS version. The `uname` check
# is a good way to get that version (i.e. "Darwin 9.6.0" is Mac OS
# X 10.5.6, and "Darwin 10.x" is Mac OS X 10.6.x Snow Leopard,
# and possibly "Darwin 11.x" is Mac OS X 10.7.x Lion),
# and we don't know of an macros similar to __GLIBC__ to get that info.
#
# XXX: `uname -r` won't do the right thing for cross-compiles, but
# that's not a problem yet.
#
# jseward 21 Sept 2011: I seriously doubt whether V 3.7.0 will work
# on OS X 10.5.x; I haven't tested yet, and only plan to test 3.7.0
# on 10.6.8 and 10.7.1. Although tempted to delete the configure
# time support for 10.5 (the 9.* pattern just below), I'll leave it
# in for now, just in case anybody wants to give it a try. But I'm
# assuming that 3.7.0 is a Snow Leopard and Lion-only release.
case "${kernel}" in
9.*)
AC_MSG_RESULT([Darwin 9.x (${kernel}) / Mac OS X 10.5 Leopard])
AC_DEFINE([DARWIN_VERS], DARWIN_10_5, [Darwin / Mac OS X version])
DEFAULT_SUPP="darwin9.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="darwin9-drd.supp ${DEFAULT_SUPP}"
;;
10.*)
AC_MSG_RESULT([Darwin 10.x (${kernel}) / Mac OS X 10.6 Snow Leopard])
AC_DEFINE([DARWIN_VERS], DARWIN_10_6, [Darwin / Mac OS X version])
DEFAULT_SUPP="darwin10.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="darwin10-drd.supp ${DEFAULT_SUPP}"
;;
11.*)
AC_MSG_RESULT([Darwin 11.x (${kernel}) / Mac OS X 10.7 Lion])
AC_DEFINE([DARWIN_VERS], DARWIN_10_7, [Darwin / Mac OS X version])
DEFAULT_SUPP="darwin11.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="darwin10-drd.supp ${DEFAULT_SUPP}"
;;
12.*)
AC_MSG_RESULT([Darwin 12.x (${kernel}) / Mac OS X 10.8 Mountain Lion])
AC_DEFINE([DARWIN_VERS], DARWIN_10_8, [Darwin / Mac OS X version])
DEFAULT_SUPP="darwin12.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="darwin10-drd.supp ${DEFAULT_SUPP}"
;;
*)
AC_MSG_RESULT([unsupported (${kernel})])
AC_MSG_ERROR([Valgrind works on Darwin 10.x and 11.x (Mac OS X 10.6/7)])
;;
esac
;;
*)
AC_MSG_RESULT([no (${host_os})])
AC_MSG_ERROR([Valgrind is operating system specific. Sorry.])
;;
esac
#----------------------------------------------------------------------------
# If we are building on a 64 bit platform test to see if the system
# supports building 32 bit programs and disable 32 bit support if it
# does not support building 32 bit programs
case "$ARCH_MAX-$VGCONF_OS" in
amd64-linux|ppc64-linux)
AC_MSG_CHECKING([for 32 bit build support])
safe_CFLAGS=$CFLAGS
CFLAGS="-m32"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
AC_MSG_RESULT([yes])
], [
vg_cv_only64bit="yes"
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS;;
esac
if test x$vg_cv_only64bit = xyes -a x$vg_cv_only32bit = xyes; then
AC_MSG_ERROR(
[--enable-only32bit was specified but system does not support 32 bit builds])
fi
#----------------------------------------------------------------------------
# VGCONF_ARCH_PRI is the arch for the primary build target, eg. "amd64". By
# default it's the same as ARCH_MAX. But if, say, we do a build on an amd64
# machine, but --enable-only32bit has been requested, then ARCH_MAX (see
# above) will be "amd64" since that reflects the most that this cpu can do,
# but VGCONF_ARCH_PRI will be downgraded to "x86", since that reflects the
# arch corresponding to the primary build (VGCONF_PLATFORM_PRI_CAPS). It is
# passed in to compilation of many C files via -VGA_$(VGCONF_ARCH_PRI) and
# -VGP_$(VGCONF_ARCH_PRI)_$(VGCONF_OS).
AC_SUBST(VGCONF_ARCH_PRI)
# VGCONF_ARCH_SEC is the arch for the secondary build target, eg. "x86".
# It is passed in to compilation of many C files via -VGA_$(VGCONF_ARCH_SEC)
# and -VGP_$(VGCONF_ARCH_SEC)_$(VGCONF_OS), if there is a secondary target.
# It is empty if there is no secondary target.
AC_SUBST(VGCONF_ARCH_SEC)
# VGCONF_PLATFORM_PRI_CAPS is the primary build target, eg. "AMD64_LINUX".
# The entire system, including regression and performance tests, will be
# built for this target. The "_CAPS" indicates that the name is in capital
# letters, and it also uses '_' rather than '-' as a separator, because it's
# used to create various Makefile variables, which are all in caps by
# convention and cannot contain '-' characters. This is in contrast to
# VGCONF_ARCH_PRI and VGCONF_OS which are not in caps.
AC_SUBST(VGCONF_PLATFORM_PRI_CAPS)
# VGCONF_PLATFORM_SEC_CAPS is the secondary build target, if there is one.
# Valgrind and tools will also be built for this target, but not the
# regression or performance tests.
#
# By default, the primary arch is the same as the "max" arch, as commented
# above (at the definition of ARCH_MAX). We may choose to downgrade it in
# the big case statement just below here, in the case where we're building
# on a 64 bit machine but have been requested only to do a 32 bit build.
AC_SUBST(VGCONF_PLATFORM_SEC_CAPS)
AC_MSG_CHECKING([for a supported CPU/OS combination])
# NB. The load address for a given platform may be specified in more
# than one place, in some cases, depending on whether we're doing a biarch,
# 32-bit only or 64-bit only build. eg see case for amd64-linux below.
# Be careful to give consistent values in all subcases. Also, all four
# valt_load_addres_{pri,sec}_{norml,inner} values must always be set,
# even if it is to "0xUNSET".
#
case "$ARCH_MAX-$VGCONF_OS" in
x86-linux)
VGCONF_ARCH_PRI="x86"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="X86_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x38000000"
valt_load_address_pri_inner="0x28000000"
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
amd64-linux)
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
if test x$vg_cv_only64bit = xyes; then
VGCONF_ARCH_PRI="amd64"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="AMD64_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x38000000"
valt_load_address_pri_inner="0x28000000"
elif test x$vg_cv_only32bit = xyes; then
VGCONF_ARCH_PRI="x86"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="X86_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x38000000"
valt_load_address_pri_inner="0x28000000"
else
VGCONF_ARCH_PRI="amd64"
VGCONF_ARCH_SEC="x86"
VGCONF_PLATFORM_PRI_CAPS="AMD64_LINUX"
VGCONF_PLATFORM_SEC_CAPS="X86_LINUX"
valt_load_address_pri_norml="0x38000000"
valt_load_address_pri_inner="0x28000000"
valt_load_address_sec_norml="0x38000000"
valt_load_address_sec_inner="0x28000000"
fi
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
ppc32-linux)
VGCONF_ARCH_PRI="ppc32"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="PPC32_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x38000000"
valt_load_address_pri_inner="0x28000000"
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
ppc64-linux)
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
if test x$vg_cv_only64bit = xyes; then
VGCONF_ARCH_PRI="ppc64"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="PPC64_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x38000000"
valt_load_address_pri_inner="0x28000000"
elif test x$vg_cv_only32bit = xyes; then
VGCONF_ARCH_PRI="ppc32"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="PPC32_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x38000000"
valt_load_address_pri_inner="0x28000000"
else
VGCONF_ARCH_PRI="ppc64"
VGCONF_ARCH_SEC="ppc32"
VGCONF_PLATFORM_PRI_CAPS="PPC64_LINUX"
VGCONF_PLATFORM_SEC_CAPS="PPC32_LINUX"
valt_load_address_pri_norml="0x38000000"
valt_load_address_pri_inner="0x28000000"
valt_load_address_sec_norml="0x38000000"
valt_load_address_sec_inner="0x28000000"
fi
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
# Darwin gets identified as 32-bit even when it supports 64-bit.
# (Not sure why, possibly because 'uname' returns "i386"?) Just about
# all Macs support both 32-bit and 64-bit, so we just build both. If
# someone has a really old 32-bit only machine they can (hopefully?)
# build with --enable-only32bit. See bug 243362.
x86-darwin|amd64-darwin)
ARCH_MAX="amd64"
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
if test x$vg_cv_only64bit = xyes; then
VGCONF_ARCH_PRI="amd64"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="AMD64_DARWIN"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x138000000"
valt_load_address_pri_inner="0x128000000"
elif test x$vg_cv_only32bit = xyes; then
VGCONF_ARCH_PRI="x86"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="X86_DARWIN"
VGCONF_PLATFORM_SEC_CAPS=""
VGCONF_ARCH_PRI_CAPS="x86"
valt_load_address_pri_norml="0x38000000"
valt_load_address_pri_inner="0x28000000"
else
VGCONF_ARCH_PRI="amd64"
VGCONF_ARCH_SEC="x86"
VGCONF_PLATFORM_PRI_CAPS="AMD64_DARWIN"
VGCONF_PLATFORM_SEC_CAPS="X86_DARWIN"
valt_load_address_pri_norml="0x138000000"
valt_load_address_pri_inner="0x128000000"
valt_load_address_sec_norml="0x38000000"
valt_load_address_sec_inner="0x28000000"
fi
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
arm-linux)
VGCONF_ARCH_PRI="arm"
VGCONF_PLATFORM_PRI_CAPS="ARM_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x38000000"
valt_load_address_pri_inner="0x28000000"
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
AC_MSG_RESULT([ok (${host_cpu}-${host_os})])
;;
arm64-linux)
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
if test x$vg_cv_only64bit = xyes; then
VGCONF_ARCH_PRI="arm64"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="ARM64_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x38000000"
valt_load_address_pri_inner="0x28000000"
elif test x$vg_cv_only32bit = xyes; then
VGCONF_ARCH_PRI="arm"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="ARM_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x38000000"
valt_load_address_pri_inner="0x28000000"
else
VGCONF_ARCH_PRI="arm64"
VGCONF_ARCH_SEC="arm"
VGCONF_PLATFORM_PRI_CAPS="ARM64_LINUX"
VGCONF_PLATFORM_SEC_CAPS="ARM_LINUX"
valt_load_address_pri_norml="0x38000000"
valt_load_address_pri_inner="0x28000000"
valt_load_address_sec_norml="0x38000000"
valt_load_address_sec_inner="0x28000000"
fi
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
s390x-linux)
VGCONF_ARCH_PRI="s390x"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="S390X_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
# To improve branch prediction hit rate we want to have
# the generated code close to valgrind (host) code
valt_load_address_pri_norml="0x800000000"
valt_load_address_pri_inner="0x810000000"
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
mips32-linux)
VGCONF_ARCH_PRI="mips32"
VGCONF_PLATFORM_PRI_CAPS="MIPS32_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x38000000"
valt_load_address_pri_inner="0x28000000"
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
mips64-linux)
VGCONF_ARCH_PRI="mips64"
VGCONF_PLATFORM_PRI_CAPS="MIPS64_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x38000000"
valt_load_address_pri_inner="0x28000000"
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
*)
VGCONF_ARCH_PRI="unknown"
VGCONF_ARCH_SEC="unknown"
VGCONF_PLATFORM_PRI_CAPS="UNKNOWN"
VGCONF_PLATFORM_SEC_CAPS="UNKNOWN"
valt_load_address_pri_norml="0xUNSET"
valt_load_address_pri_inner="0xUNSET"
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
AC_MSG_RESULT([no (${ARCH_MAX}-${VGCONF_OS})])
AC_MSG_ERROR([Valgrind is platform specific. Sorry. Please consider doing a port.])
;;
esac
#----------------------------------------------------------------------------
# Set up VGCONF_ARCHS_INCLUDE_<arch>. Either one or two of these become
# defined.
AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_X86,
test x$VGCONF_PLATFORM_PRI_CAPS = xX86_LINUX \
-o x$VGCONF_PLATFORM_SEC_CAPS = xX86_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xX86_DARWIN \
-o x$VGCONF_PLATFORM_SEC_CAPS = xX86_DARWIN )
AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_AMD64,
test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_DARWIN )
AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_PPC32,
test x$VGCONF_PLATFORM_PRI_CAPS = xPPC32_LINUX \
-o x$VGCONF_PLATFORM_SEC_CAPS = xPPC32_LINUX )
AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_PPC64,
test x$VGCONF_PLATFORM_PRI_CAPS = xPPC64_LINUX )
AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_ARM,
test x$VGCONF_PLATFORM_PRI_CAPS = xARM_LINUX \
-o x$VGCONF_PLATFORM_SEC_CAPS = xARM_LINUX )
AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_ARM64,
test x$VGCONF_PLATFORM_PRI_CAPS = xARM64_LINUX )
AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_S390X,
test x$VGCONF_PLATFORM_PRI_CAPS = xS390X_LINUX )
AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_MIPS32,
test x$VGCONF_PLATFORM_PRI_CAPS = xMIPS32_LINUX )
AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_MIPS64,
test x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_LINUX )
# Set up VGCONF_PLATFORMS_INCLUDE_<platform>. Either one or two of these
# become defined.
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_X86_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xX86_LINUX \
-o x$VGCONF_PLATFORM_SEC_CAPS = xX86_LINUX)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_AMD64_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_LINUX)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_PPC32_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xPPC32_LINUX \
-o x$VGCONF_PLATFORM_SEC_CAPS = xPPC32_LINUX)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_PPC64_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xPPC64_LINUX)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_ARM_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xARM_LINUX \
-o x$VGCONF_PLATFORM_SEC_CAPS = xARM_LINUX)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_ARM64_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xARM64_LINUX)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_S390X_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xS390X_LINUX \
-o x$VGCONF_PLATFORM_SEC_CAPS = xS390X_LINUX)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_MIPS32_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xMIPS32_LINUX)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_MIPS64_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_LINUX)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_X86_DARWIN,
test x$VGCONF_PLATFORM_PRI_CAPS = xX86_DARWIN \
-o x$VGCONF_PLATFORM_SEC_CAPS = xX86_DARWIN)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_AMD64_DARWIN,
test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_DARWIN)
# Similarly, set up VGCONF_OS_IS_<os>. Exactly one of these becomes defined.
# Relies on the assumption that the primary and secondary targets are
# for the same OS, so therefore only necessary to test the primary.
AM_CONDITIONAL(VGCONF_OS_IS_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xX86_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xPPC32_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xPPC64_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xARM_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xARM64_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xS390X_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS32_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_LINUX)
AM_CONDITIONAL(VGCONF_OS_IS_DARWIN,
test x$VGCONF_PLATFORM_PRI_CAPS = xX86_DARWIN \
-o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_DARWIN)
# Sometimes, in the Makefile.am files, it's useful to know whether or not
# there is a secondary target.
AM_CONDITIONAL(VGCONF_HAVE_PLATFORM_SEC,
test x$VGCONF_PLATFORM_SEC_CAPS != x)
dnl automake-1.10 does not have AM_COND_IF (added in 1.11), so we supply a
dnl fallback definition
dnl The macro is courtesy of Dave Hart:
dnl https://lists.gnu.org/archive/html/automake/2010-12/msg00045.html
m4_ifndef([AM_COND_IF], [AC_DEFUN([AM_COND_IF], [
if test -z "$$1_TRUE"; then :
m4_n([$2])[]dnl
m4_ifval([$3],
[else
$3
])dnl
fi[]dnl
])])
#----------------------------------------------------------------------------
# Inner Valgrind?
#----------------------------------------------------------------------------
# Check if this should be built as an inner Valgrind, to be run within
# another Valgrind. Choose the load address accordingly.
AC_SUBST(VALT_LOAD_ADDRESS_PRI)
AC_SUBST(VALT_LOAD_ADDRESS_SEC)
AC_CACHE_CHECK([for use as an inner Valgrind], vg_cv_inner,
[AC_ARG_ENABLE(inner,
[ --enable-inner enables self-hosting],
[vg_cv_inner=$enableval],
[vg_cv_inner=no])])
if test "$vg_cv_inner" = yes; then
AC_DEFINE([ENABLE_INNER], 1, [configured to run as an inner Valgrind])
VALT_LOAD_ADDRESS_PRI=$valt_load_address_pri_inner
VALT_LOAD_ADDRESS_SEC=$valt_load_address_sec_inner
else
VALT_LOAD_ADDRESS_PRI=$valt_load_address_pri_norml
VALT_LOAD_ADDRESS_SEC=$valt_load_address_sec_norml
fi
#----------------------------------------------------------------------------
# Define MIPS_PAGE_SHIFT (--with-pagesize)
#----------------------------------------------------------------------------
AC_ARG_WITH(pagesize,
[ --with-pagesize= override detected page size (4, 16 or 64)],
[psize=$withval],
[psize=0]
)
if test "$psize" = "0"; then
psizer=`getconf PAGESIZE`
let "psize=${psizer}/1024"
fi
if test "$psize" = "4"; then
AC_DEFINE([MIPS_PAGE_SHIFT], 12, [configured page size 4k])
elif test "$psize" = "16"; then
AC_DEFINE([MIPS_PAGE_SHIFT], 14, [configured page size 16k])
elif test "$psize" = "64"; then
AC_DEFINE([MIPS_PAGE_SHIFT], 16, [configured page size 64k])
else
AC_DEFINE([MIPS_PAGE_SHIFT], 12, [configured default page size 4k])
fi
AC_MSG_RESULT([checking for Pagesize... ${psize}k])
#----------------------------------------------------------------------------
# Extra fine-tuning of installation directories
#----------------------------------------------------------------------------
AC_ARG_WITH(tmpdir,
[ --with-tmpdir=PATH Specify path for temporary files],
tmpdir="$withval",
tmpdir="/tmp")
AC_DEFINE_UNQUOTED(VG_TMPDIR, "$tmpdir", [Temporary files directory])
#----------------------------------------------------------------------------
# Libc and suppressions
#----------------------------------------------------------------------------
# This variable will collect the suppression files to be used.
AC_SUBST(DEFAULT_SUPP)
AC_CHECK_HEADER([features.h])
if test x$ac_cv_header_features_h = xyes; then
rm -f conftest.$ac_ext
cat <<_ACEOF >conftest.$ac_ext
#include <features.h>
#if defined(__GNU_LIBRARY__) && defined(__GLIBC__) && defined(__GLIBC_MINOR__)
glibc version is: __GLIBC__ __GLIBC_MINOR__
#endif
_ACEOF
GLIBC_VERSION="`$CPP conftest.$ac_ext | $SED -n 's/^glibc version is: //p' | $SED 's/ /./g'`"
fi
# not really a version check
AC_EGREP_CPP([DARWIN_LIBC], [
#include <sys/cdefs.h>
#if defined(__DARWIN_VERS_1050)
DARWIN_LIBC
#endif
],
GLIBC_VERSION="darwin")
# not really a version check
AC_EGREP_CPP([BIONIC_LIBC], [
#if defined(__ANDROID__)
BIONIC_LIBC
#endif
],
GLIBC_VERSION="bionic")
AC_MSG_CHECKING([the GLIBC_VERSION version])
case "${GLIBC_VERSION}" in
2.2)
AC_MSG_RESULT(2.2 family)
AC_DEFINE([GLIBC_2_2], 1, [Define to 1 if you're using glibc 2.2.x])
DEFAULT_SUPP="glibc-2.2.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.2-LinuxThreads-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
2.3)
AC_MSG_RESULT(2.3 family)
AC_DEFINE([GLIBC_2_3], 1, [Define to 1 if you're using glibc 2.3.x])
DEFAULT_SUPP="glibc-2.3.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
2.4)
AC_MSG_RESULT(2.4 family)
AC_DEFINE([GLIBC_2_4], 1, [Define to 1 if you're using glibc 2.4.x])
DEFAULT_SUPP="glibc-2.4.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
2.5)
AC_MSG_RESULT(2.5 family)
AC_DEFINE([GLIBC_2_5], 1, [Define to 1 if you're using glibc 2.5.x])
DEFAULT_SUPP="glibc-2.5.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
2.6)
AC_MSG_RESULT(2.6 family)
AC_DEFINE([GLIBC_2_6], 1, [Define to 1 if you're using glibc 2.6.x])
DEFAULT_SUPP="glibc-2.6.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
2.7)
AC_MSG_RESULT(2.7 family)
AC_DEFINE([GLIBC_2_7], 1, [Define to 1 if you're using glibc 2.7.x])
DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
2.8)
AC_MSG_RESULT(2.8 family)
AC_DEFINE([GLIBC_2_8], 1, [Define to 1 if you're using glibc 2.8.x])
DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
2.9)
AC_MSG_RESULT(2.9 family)
AC_DEFINE([GLIBC_2_9], 1, [Define to 1 if you're using glibc 2.9.x])
DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
2.10)
AC_MSG_RESULT(2.10 family)
AC_DEFINE([GLIBC_2_10], 1, [Define to 1 if you're using glibc 2.10.x])
DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
2.11)
AC_MSG_RESULT(2.11 family)
AC_DEFINE([GLIBC_2_11], 1, [Define to 1 if you're using glibc 2.11.x])
DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
2.12)
AC_MSG_RESULT(2.12 family)
AC_DEFINE([GLIBC_2_12], 1, [Define to 1 if you're using glibc 2.12.x])
DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
2.13)
AC_MSG_RESULT(2.13 family)
AC_DEFINE([GLIBC_2_13], 1, [Define to 1 if you're using glibc 2.13.x])
DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
2.14)
AC_MSG_RESULT(2.14 family)
AC_DEFINE([GLIBC_2_14], 1, [Define to 1 if you're using glibc 2.14.x])
DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
2.15)
AC_MSG_RESULT(2.15 family)
AC_DEFINE([GLIBC_2_15], 1, [Define to 1 if you're using glibc 2.15.x])
DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
2.16)
AC_MSG_RESULT(2.16 family)
AC_DEFINE([GLIBC_2_16], 1, [Define to 1 if you're using glibc 2.16.x])
DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
2.17)
AC_MSG_RESULT(2.17 family)
AC_DEFINE([GLIBC_2_17], 1, [Define to 1 if you're using glibc 2.17.x])
DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
2.18)
AC_MSG_RESULT(2.18 family)
AC_DEFINE([GLIBC_2_18], 1, [Define to 1 if you're using glibc 2.18.x])
DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
darwin)
AC_MSG_RESULT(Darwin)
AC_DEFINE([DARWIN_LIBC], 1, [Define to 1 if you're using Darwin])
# DEFAULT_SUPP set by kernel version check above.
;;
bionic)
AC_MSG_RESULT(Bionic)
AC_DEFINE([BIONIC_LIBC], 1, [Define to 1 if you're using Bionic])
DEFAULT_SUPP="bionic.supp ${DEFAULT_SUPP}"
;;
*)
AC_MSG_RESULT([unsupported version ${GLIBC_VERSION}])
AC_MSG_ERROR([Valgrind requires glibc version 2.2 - 2.17])
AC_MSG_ERROR([or Darwin libc])
;;
esac
AC_SUBST(GLIBC_VERSION)
# Add default suppressions for the X client libraries. Make no
# attempt to detect whether such libraries are installed on the
# build machine (or even if any X facilities are present); just
# add the suppressions antidisirregardless.
DEFAULT_SUPP="xfree-4.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="xfree-3.supp ${DEFAULT_SUPP}"
# Add glibc and X11 suppressions for exp-sgcheck
DEFAULT_SUPP="exp-sgcheck.supp ${DEFAULT_SUPP}"
#----------------------------------------------------------------------------
# Platform variants?
#----------------------------------------------------------------------------
# Normally the PLAT = (ARCH, OS) characterisation of the platform is enough.
# But there are times where we need a bit more control. The motivating
# and currently only case is Android: this is almost identical to
# {x86,arm,mips}-linux, but not quite. So this introduces the concept of
# platform variant tags, which get passed in the compile as
# -DVGPV_<arch>_<os>_<variant> along with the main -DVGP_<arch>_<os> definition.
#
# In almost all cases, the <variant> bit is "vanilla". But for Android
# it is "android" instead.
#
# Consequently (eg), plain arm-linux would build with
#
# -DVGP_arm_linux -DVGPV_arm_linux_vanilla
#
# whilst an Android build would have
#
# -DVGP_arm_linux -DVGPV_arm_linux_android
#
# Same for x86. The setup of the platform variant is pushed relatively far
# down this file in order that we can inspect any of the variables set above.
# In the normal case ..
VGCONF_PLATVARIANT="vanilla"
# Android ?
if test "$GLIBC_VERSION" = "bionic";
then
VGCONF_PLATVARIANT="android"
fi
AC_SUBST(VGCONF_PLATVARIANT)
# FIXME: do we also want to define automake variables
# VGCONF_PLATVARIANT_IS_<WHATEVER>, where WHATEVER is (currently)
# VANILLA or ANDROID ? This would be in the style of VGCONF_ARCHS_INCLUDE,
# VGCONF_PLATFORMS_INCLUDE and VGCONF_OS_IS above? Could easily enough
# do that. Problem is that we can't do and-ing in Makefile.am's, but
# that's what we'd need to do to use this, since what we'd want to write
# is something like
#
# VGCONF_PLATFORMS_INCLUDE_ARM_LINUX && VGCONF_PLATVARIANT_IS_ANDROID
#
# Hmm. Can't think of a nice clean solution to this.
AM_CONDITIONAL(VGCONF_PLATVARIANT_IS_VANILLA,
test x$VGCONF_PLATVARIANT = xvanilla)
AM_CONDITIONAL(VGCONF_PLATVARIANT_IS_ANDROID,
test x$VGCONF_PLATVARIANT = xandroid)
#----------------------------------------------------------------------------
# Checking for various library functions and other definitions
#----------------------------------------------------------------------------
# Check for AT_FDCWD
AC_MSG_CHECKING([for AT_FDCWD])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#define _GNU_SOURCE
#include <fcntl.h>
#include <unistd.h>
]], [[
int a = AT_FDCWD;
]])], [
ac_have_at_fdcwd=yes
AC_MSG_RESULT([yes])
], [
ac_have_at_fdcwd=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL([HAVE_AT_FDCWD], [test x$ac_have_at_fdcwd = xyes])
# Check for stpncpy function definition in string.h
# This explicitly checks with _GNU_SOURCE defined since that is also
# used in the test case (some systems might define it without anyway
# since stpncpy is part of The Open Group Base Specifications Issue 7
# IEEE Std 1003.1-2008.
AC_MSG_CHECKING([for stpncpy])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#define _GNU_SOURCE
#include <string.h>
]], [[
char *d;
char *s;
size_t n = 0;
char *r = stpncpy(d, s, n);
]])], [
ac_have_gnu_stpncpy=yes
AC_MSG_RESULT([yes])
], [
ac_have_gnu_stpncpy=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL([HAVE_GNU_STPNCPY], [test x$ac_have_gnu_stpncpy = xyes])
# Check for PTRACE_GETREGS
AC_MSG_CHECKING([for PTRACE_GETREGS])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <stddef.h>
#include <sys/ptrace.h>
#include <sys/user.h>
]], [[
void *p;
long res = ptrace (PTRACE_GETREGS, 0, p, p);
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_PTRACE_GETREGS], 1,
[Define to 1 if you have the `PTRACE_GETREGS' ptrace request.])
], [
AC_MSG_RESULT([no])
])
# Check for CLOCK_MONOTONIC
AC_MSG_CHECKING([for CLOCK_MONOTONIC])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <time.h>
]], [[
struct timespec t;
clock_gettime(CLOCK_MONOTONIC, &t);
return 0;
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_CLOCK_MONOTONIC], 1,
[Define to 1 if you have the `CLOCK_MONOTONIC' constant.])
], [
AC_MSG_RESULT([no])
])
# Check for PTHREAD_RWLOCK_T
AC_MSG_CHECKING([for pthread_rwlock_t])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#define _GNU_SOURCE
#include <pthread.h>
]], [[
pthread_rwlock_t rwl;
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_PTHREAD_RWLOCK_T], 1,
[Define to 1 if you have the `pthread_rwlock_t' type.])
], [
AC_MSG_RESULT([no])
])
# Check for PTHREAD_MUTEX_ADAPTIVE_NP
AC_MSG_CHECKING([for PTHREAD_MUTEX_ADAPTIVE_NP])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#define _GNU_SOURCE
#include <pthread.h>
]], [[
return (PTHREAD_MUTEX_ADAPTIVE_NP);
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_PTHREAD_MUTEX_ADAPTIVE_NP], 1,
[Define to 1 if you have the `PTHREAD_MUTEX_ADAPTIVE_NP' constant.])
], [
AC_MSG_RESULT([no])
])
# Check for PTHREAD_MUTEX_ERRORCHECK_NP
AC_MSG_CHECKING([for PTHREAD_MUTEX_ERRORCHECK_NP])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#define _GNU_SOURCE
#include <pthread.h>
]], [[
return (PTHREAD_MUTEX_ERRORCHECK_NP);
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_PTHREAD_MUTEX_ERRORCHECK_NP], 1,
[Define to 1 if you have the `PTHREAD_MUTEX_ERRORCHECK_NP' constant.])
], [
AC_MSG_RESULT([no])
])
# Check for PTHREAD_MUTEX_RECURSIVE_NP
AC_MSG_CHECKING([for PTHREAD_MUTEX_RECURSIVE_NP])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#define _GNU_SOURCE
#include <pthread.h>
]], [[
return (PTHREAD_MUTEX_RECURSIVE_NP);
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_PTHREAD_MUTEX_RECURSIVE_NP], 1,
[Define to 1 if you have the `PTHREAD_MUTEX_RECURSIVE_NP' constant.])
], [
AC_MSG_RESULT([no])
])
# Check for PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
AC_MSG_CHECKING([for PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#define _GNU_SOURCE
#include <pthread.h>
]], [[
pthread_mutex_t m = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
return 0;
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP], 1,
[Define to 1 if you have the `PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP' constant.])
], [
AC_MSG_RESULT([no])
])
# Check whether pthread_mutex_t has a member called __m_kind.
AC_CHECK_MEMBER([pthread_mutex_t.__m_kind],
[AC_DEFINE([HAVE_PTHREAD_MUTEX_T__M_KIND],
1,
[Define to 1 if pthread_mutex_t has a member called __m_kind.])
],
[],
[#include <pthread.h>])
# Check whether pthread_mutex_t has a member called __data.__kind.
AC_CHECK_MEMBER([pthread_mutex_t.__data.__kind],
[AC_DEFINE([HAVE_PTHREAD_MUTEX_T__DATA__KIND],
1,
[Define to 1 if pthread_mutex_t has a member __data.__kind.])
],
[],
[#include <pthread.h>])
# does this compiler support -maltivec and does it have the include file
# <altivec.h> ?
AC_MSG_CHECKING([for Altivec])
safe_CFLAGS=$CFLAGS
CFLAGS="-maltivec"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <altivec.h>
]], [[
vector unsigned int v;
]])], [
ac_have_altivec=yes
AC_MSG_RESULT([yes])
AC_DEFINE([HAS_ALTIVEC], 1,
[Define to 1 if gcc/as can do Altivec.])
], [
ac_have_altivec=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AM_CONDITIONAL([HAS_ALTIVEC], [test x$ac_have_altivec = xyes])
# Check that both: the compiler supports -mvsx and that the assembler
# understands VSX instructions. If either of those doesn't work,
# conclude that we can't do VSX. NOTE: basically this is a kludge
# in that it conflates two things that should be separate -- whether
# the compiler understands the flag vs whether the assembler
# understands the opcodes. This really ought to be cleaned up
# and done properly, like it is for x86/x86_64.
AC_MSG_CHECKING([for VSX])
safe_CFLAGS=$CFLAGS
CFLAGS="-mvsx"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <altivec.h>
]], [[
vector unsigned int v;
__asm__ __volatile__("xsmaddadp 32, 32, 33" ::: "memory","cc");
]])], [
ac_have_vsx=yes
AC_MSG_RESULT([yes])
], [
ac_have_vsx=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AM_CONDITIONAL(HAS_VSX, test x$ac_have_vsx = xyes)
AC_MSG_CHECKING([that assembler knows DFP])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
]], [[
__asm__ __volatile__("dadd 1, 2, 3");
__asm__ __volatile__("dcffix 1, 2");
]])], [
ac_asm_have_dfp=yes
AC_MSG_RESULT([yes])
], [
ac_asm_have_dfp=no
AC_MSG_RESULT([no])
])
AC_MSG_CHECKING([that compiler knows -mhard-dfp switch])
safe_CFLAGS=$CFLAGS
CFLAGS="-mhard-dfp"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
]], [[
__asm__ __volatile__("dadd 1, 2, 3");
__asm__ __volatile__("dcffix 1, 2");
]])], [
ac_gcc_have_dfp=yes
AC_MSG_RESULT([yes])
], [
ac_gcc_have_dfp=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AM_CONDITIONAL(HAS_DFP, test x$ac_asm_have_dfp = xyes -a x$ac_gcc_have_dfp = xyes)
AC_MSG_CHECKING([that compiler knows DFP datatypes])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
]], [[
_Decimal64 x = 0.0DD;
]])], [
ac_gcc_have_dfp_type=yes
AC_MSG_RESULT([yes])
], [
ac_gcc_have_dfp_type=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_DFP_TESTS, test x$ac_gcc_have_dfp_type = xyes)
# isa 2.07 checking
AC_MSG_CHECKING([that assembler knows ISA 2.07 ])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
]], [[
__asm__ __volatile__("mtvsrd 1,2 ");
]])], [
ac_asm_have_isa_2_07=yes
AC_MSG_RESULT([yes])
], [
ac_asm_have_isa_2_07=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(HAS_ISA_2_07, test x$ac_asm_have_isa_2_07 = xyes)
# Check for pthread_create@GLIBC2.0
AC_MSG_CHECKING([for pthread_create@GLIBC2.0()])
safe_CFLAGS=$CFLAGS
CFLAGS="-lpthread"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
extern int pthread_create_glibc_2_0(void*, const void*,
void *(*)(void*), void*);
__asm__(".symver pthread_create_glibc_2_0, pthread_create@GLIBC_2.0");
]], [[
#ifdef __powerpc__
/*
* Apparently on PowerPC linking this program succeeds and generates an
* executable with the undefined symbol pthread_create@GLIBC_2.0.
*/
#error This test does not work properly on PowerPC.
#else
pthread_create_glibc_2_0(0, 0, 0, 0);
#endif
return 0;
]])], [
ac_have_pthread_create_glibc_2_0=yes
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_PTHREAD_CREATE_GLIBC_2_0], 1,
[Define to 1 if you have the `pthread_create@glibc2.0' function.])
], [
ac_have_pthread_create_glibc_2_0=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AM_CONDITIONAL(HAVE_PTHREAD_CREATE_GLIBC_2_0,
test x$ac_have_pthread_create_glibc_2_0 = xyes)
# Check for eventfd_t, eventfd() and eventfd_read()
AC_MSG_CHECKING([for eventfd()])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <sys/eventfd.h>
]], [[
eventfd_t ev;
int fd;
fd = eventfd(5, 0);
eventfd_read(fd, &ev);
return 0;
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_EVENTFD], 1,
[Define to 1 if you have the `eventfd' function.])
AC_DEFINE([HAVE_EVENTFD_READ], 1,
[Define to 1 if you have the `eventfd_read' function.])
], [
AC_MSG_RESULT([no])
])
# Check whether compiler can process #include <thread> without errors
# clang 3.3 cannot process <thread> from e.g.
# gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
AC_MSG_CHECKING([that C++ compiler can include <thread> header file])
AC_LANG(C++)
safe_CXXFLAGS=$CXXFLAGS
CXXFLAGS=-std=c++0x
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
#include <thread>
])],
[
ac_cxx_can_include_thread_header=yes
AC_MSG_RESULT([yes])
], [
ac_cxx_can_include_thread_header=no
AC_MSG_RESULT([no])
])
CXXFLAGS=$safe_CXXFLAGS
AC_LANG(C)
AM_CONDITIONAL(CXX_CAN_INCLUDE_THREAD_HEADER, test x$ac_cxx_can_include_thread_header = xyes)
#----------------------------------------------------------------------------
# Checking for supported compiler flags.
#----------------------------------------------------------------------------
# does this compiler support -m32 ?
AC_MSG_CHECKING([if gcc accepts -m32])
safe_CFLAGS=$CFLAGS
CFLAGS="-m32"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
FLAG_M32="-m32"
AC_MSG_RESULT([yes])
], [
FLAG_M32=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_M32)
# does this compiler support -m64 ?
AC_MSG_CHECKING([if gcc accepts -m64])
safe_CFLAGS=$CFLAGS
CFLAGS="-m64"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
FLAG_M64="-m64"
AC_MSG_RESULT([yes])
], [
FLAG_M64=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_M64)
# does this compiler support -march=octeon (Cavium OCTEON I Specific) ?
AC_MSG_CHECKING([if gcc accepts -march=octeon])
safe_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS -march=octeon"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
FLAG_OCTEON="-march=octeon"
AC_MSG_RESULT([yes])
], [
FLAG_OCTEON=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_OCTEON)
# does this compiler support -march=octeon2 (Cavium OCTEON II Specific) ?
AC_MSG_CHECKING([if gcc accepts -march=octeon2])
safe_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS -march=octeon2"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
FLAG_OCTEON2="-march=octeon2"
AC_MSG_RESULT([yes])
], [
FLAG_OCTEON2=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_OCTEON2)
# does this compiler support -mmmx ?
AC_MSG_CHECKING([if gcc accepts -mmmx])
safe_CFLAGS=$CFLAGS
CFLAGS="-mmmx"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
FLAG_MMMX="-mmmx"
AC_MSG_RESULT([yes])
], [
FLAG_MMMX=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_MMMX)
# does this compiler support -msse ?
AC_MSG_CHECKING([if gcc accepts -msse])
safe_CFLAGS=$CFLAGS
CFLAGS="-msse"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
FLAG_MSSE="-msse"
AC_MSG_RESULT([yes])
], [
FLAG_MSSE=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_MSSE)
# does this compiler support -mpreferred-stack-boundary=2 ?
AC_MSG_CHECKING([if gcc accepts -mpreferred-stack-boundary])
safe_CFLAGS=$CFLAGS
CFLAGS="-mpreferred-stack-boundary=2"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
PREFERRED_STACK_BOUNDARY="-mpreferred-stack-boundary=2"
AC_MSG_RESULT([yes])
], [
PREFERRED_STACK_BOUNDARY=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(PREFERRED_STACK_BOUNDARY)
# does this compiler support -Wno-pointer-sign ?
AC_MSG_CHECKING([if gcc accepts -Wno-pointer-sign])
safe_CFLAGS=$CFLAGS
CFLAGS="-Wno-pointer-sign"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
no_pointer_sign=yes
AC_MSG_RESULT([yes])
], [
no_pointer_sign=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AM_CONDITIONAL(HAS_POINTER_SIGN_WARNING, test x$no_pointer_sign = xyes)
# does this compiler support -Wno-write-strings ?
AC_MSG_CHECKING([if gcc accepts -Wwrite-strings])
safe_CFLAGS=$CFLAGS
CFLAGS="-Wwrite-strings"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
no_write_strings=yes
AC_MSG_RESULT([yes])
], [
no_write_strings=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
if test x$no_write_strings = xyes; then
CFLAGS="$CFLAGS -Wwrite-strings"
CXXFLAGS="$CXXFLAGS -Wwrite-strings"
fi
AM_CONDITIONAL(HAS_WRITE_STRINGS_WARNING, test x$no_write_strings = xyes)
# does this compiler support -Wno-empty-body ?
AC_MSG_CHECKING([if gcc accepts -Wno-empty-body])
safe_CFLAGS=$CFLAGS
CFLAGS="-Wno-empty-body"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
return 0;
]])], [
AC_SUBST([FLAG_W_NO_EMPTY_BODY], [-Wno-empty-body])
AC_MSG_RESULT([yes])
], [
AC_SUBST([FLAG_W_NO_EMPTY_BODY], [])
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
# does this compiler support -Wno-format-zero-length ?
AC_MSG_CHECKING([if gcc accepts -Wno-format-zero-length])
safe_CFLAGS=$CFLAGS
CFLAGS="-Wno-format-zero-length"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
return 0;
]])], [
AC_SUBST([FLAG_W_NO_FORMAT_ZERO_LENGTH], [-Wno-format-zero-length])
AC_MSG_RESULT([yes])
], [
AC_SUBST([FLAG_W_NO_FORMAT_ZERO_LENGTH], [])
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
# does this compiler support -Wno-nonnull ?
AC_MSG_CHECKING([if gcc accepts -Wno-nonnull])
safe_CFLAGS=$CFLAGS
CFLAGS="-Wno-nonnull"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
return 0;
]])], [
AC_SUBST([FLAG_W_NO_NONNULL], [-Wno-nonnull])
AC_MSG_RESULT([yes])
], [
AC_SUBST([FLAG_W_NO_NONNULL], [])
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
# does this compiler support -Wno-overflow ?
AC_MSG_CHECKING([if gcc accepts -Wno-overflow])
safe_CFLAGS=$CFLAGS
CFLAGS="-Wno-overflow"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
return 0;
]])], [
AC_SUBST([FLAG_W_NO_OVERFLOW], [-Wno-overflow])
AC_MSG_RESULT([yes])
], [
AC_SUBST([FLAG_W_NO_OVERFLOW], [])
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
# does this compiler support -Wno-uninitialized ?
AC_MSG_CHECKING([if gcc accepts -Wno-uninitialized])
safe_CFLAGS=$CFLAGS
CFLAGS="-Wno-uninitialized"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
return 0;
]])], [
AC_SUBST([FLAG_W_NO_UNINITIALIZED], [-Wno-uninitialized])
AC_MSG_RESULT([yes])
], [
AC_SUBST([FLAG_W_NO_UNINITIALIZED], [])
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
# does this compiler support -Wextra or the older -W ?
AC_MSG_CHECKING([if gcc accepts -Wextra or -W])
safe_CFLAGS=$CFLAGS
CFLAGS="-Wextra"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
return 0;
]])], [
AC_SUBST([FLAG_W_EXTRA], [-Wextra])
AC_MSG_RESULT([-Wextra])
], [
CFLAGS="-W"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
return 0;
]])], [
AC_SUBST([FLAG_W_EXTRA], [-W])
AC_MSG_RESULT([-W])
], [
AC_SUBST([FLAG_W_EXTRA], [])
AC_MSG_RESULT([not supported])
])
])
CFLAGS=$safe_CFLAGS
# does this compiler support -fno-stack-protector ?
AC_MSG_CHECKING([if gcc accepts -fno-stack-protector])
safe_CFLAGS=$CFLAGS
CFLAGS="-fno-stack-protector"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
no_stack_protector=yes
FLAG_FNO_STACK_PROTECTOR="-fno-stack-protector"
AC_MSG_RESULT([yes])
], [
no_stack_protector=no
FLAG_FNO_STACK_PROTECTOR=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_FNO_STACK_PROTECTOR)
if test x$no_stack_protector = xyes; then
CFLAGS="$CFLAGS -fno-stack-protector"
CXXFLAGS="$CXXFLAGS -fno-stack-protector"
fi
# does this compiler support --param inline-unit-growth=... ?
AC_MSG_CHECKING([if gcc accepts --param inline-unit-growth])
safe_CFLAGS=$CFLAGS
CFLAGS="--param inline-unit-growth=900"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
return 0;
]])], [
AC_SUBST([FLAG_UNLIMITED_INLINE_UNIT_GROWTH],
["--param inline-unit-growth=900"])
AC_MSG_RESULT([yes])
], [
AC_SUBST([FLAG_UNLIMITED_INLINE_UNIT_GROWTH], [""])
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
# does this compiler support -gdwarf-4 -fdebug-types-section ?
AC_MSG_CHECKING([if gcc accepts -gdwarf-4 -fdebug-types-section])
safe_CFLAGS=$CFLAGS
CFLAGS="-gdwarf-4 -fdebug-types-section"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
return 0;
]])], [
ac_have_dwarf4=yes
AC_MSG_RESULT([yes])
], [
ac_have_dwarf4=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(DWARF4, test x$ac_have_dwarf4 = xyes)
CFLAGS=$safe_CFLAGS
# does this compiler support -gstabs ?
AC_MSG_CHECKING([if gcc accepts -gstabs])
safe_CFLAGS=$CFLAGS
CFLAGS="-gstabs"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
ac_have_gstabs=yes
AC_MSG_RESULT([yes])
], [
ac_have_gstabs=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AM_CONDITIONAL([HAVE_GSTABS], [test x$ac_have_gstabs = xyes])
# does this compiler support nested functions ?
AC_MSG_CHECKING([if gcc accepts nested functions])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
int foo() { return 1; }
return foo();
]])], [
ac_have_nested_functions=yes
AC_MSG_RESULT([yes])
], [
ac_have_nested_functions=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL([HAVE_NESTED_FUNCTIONS], [test x$ac_have_nested_functions = xyes])
# does this compiler support the 'p' constraint in ASM statements ?
AC_MSG_CHECKING([if gcc accepts the 'p' constraint in asm statements])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
char *p;
__asm__ __volatile__ ("movdqa (%0),%%xmm6\n" : "=p" (p));
]])], [
ac_have_asm_constraint_p=yes
AC_MSG_RESULT([yes])
], [
ac_have_asm_constraint_p=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL([HAVE_ASM_CONSTRAINT_P], [test x$ac_have_asm_constraint_p = xyes])
# We want to use use the -Ttext-segment option to the linker.
# GNU (bfd) ld supports this directly. Newer GNU gold linkers
# support it as an alias of -Ttext. Sadly GNU (bfd) ld's -Ttext
# semantics are NOT what we want (GNU gold -Ttext is fine).
#
# For GNU (bfd) ld -Ttext-segment chooses the base at which ELF headers
# will reside. -Ttext aligns just the .text section start (but not any
# other section).
#
# So test for -Ttext-segment which is supported by all bfd ld versions
# and use that if it exists. If it doesn't exist it must be an older
# version of gold and we can fall back to using -Ttext which has the
# right semantics.
AC_MSG_CHECKING([if the linker accepts -Wl,-Ttext-segment])
safe_CFLAGS=$CFLAGS
CFLAGS="-static -nodefaultlibs -nostartfiles -Wl,-Ttext-segment=$valt_load_address_pri_norml"
AC_LINK_IFELSE(
[AC_LANG_SOURCE([int _start () { return 0; }])],
[
linker_using_t_text="no"
AC_SUBST([FLAG_T_TEXT], ["-Ttext-segment"])
AC_MSG_RESULT([yes])
], [
linker_using_t_text="yes"
AC_SUBST([FLAG_T_TEXT], ["-Ttext"])
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
# If the linker only supports -Ttext (not -Ttext-segment) then we will
# have to strip any build-id ELF NOTEs from the staticly linked tools.
# Otherwise the build-id NOTE might end up at the default load address.
# (Pedantically if the linker is gold then -Ttext is fine, but newer
# gold versions also support -Ttext-segment. So just assume that unless
# we can use -Ttext-segment we need to strip the build-id NOTEs.
if test "x${linker_using_t_text}" == "xyes"; then
AC_MSG_NOTICE([ld -Ttext used, need to strip build-id NOTEs.])
# does the linker support -Wl,--build-id=none ? Note, it's
# important that we test indirectly via whichever C compiler
# is selected, rather than testing /usr/bin/ld or whatever
# directly.
AC_MSG_CHECKING([if the linker accepts -Wl,--build-id=none])
safe_CFLAGS=$CFLAGS
CFLAGS="-Wl,--build-id=none"
AC_LINK_IFELSE(
[AC_LANG_PROGRAM([ ], [return 0;])],
[
AC_SUBST([FLAG_NO_BUILD_ID], ["-Wl,--build-id=none"])
AC_MSG_RESULT([yes])
], [
AC_SUBST([FLAG_NO_BUILD_ID], [""])
AC_MSG_RESULT([no])
])
else
AC_MSG_NOTICE([ld -Ttext-segment used, no need to strip build-id NOTEs.])
AC_SUBST([FLAG_NO_BUILD_ID], [""])
fi
CFLAGS=$safe_CFLAGS
# does the ppc assembler support "mtocrf" et al?
AC_MSG_CHECKING([if ppc32/64 as supports mtocrf/mfocrf])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
__asm__ __volatile__("mtocrf 4,0");
__asm__ __volatile__("mfocrf 0,4");
]])], [
ac_have_as_ppc_mftocrf=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_ppc_mftocrf=no
AC_MSG_RESULT([no])
])
if test x$ac_have_as_ppc_mftocrf = xyes ; then
AC_DEFINE(HAVE_AS_PPC_MFTOCRF, 1, [Define to 1 if as supports mtocrf/mfocrf.])
fi
# does the ppc assembler support "lfdp" and other phased out floating point insns?
AC_MSG_CHECKING([if ppc32/64 asm supports phased out floating point instructions])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do { typedef struct {
double hi;
double lo;
} dbl_pair_t;
dbl_pair_t dbl_pair[3];
__asm__ volatile ("lfdp 10, %0"::"m" (dbl_pair[0]));
} while (0)
]])], [
ac_have_as_ppc_fpPO=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_ppc_fpPO=no
AC_MSG_RESULT([no])
])
if test x$ac_have_as_ppc_fpPO = xyes ; then
AC_DEFINE(HAVE_AS_PPC_FPPO, 1, [Define to 1 if as supports floating point phased out category.])
fi
CFLAGS=$safe_CFLAGS
# does the x86/amd64 assembler understand SSE3 instructions?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_SSE3_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler speaks SSE3])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do { long long int x;
__asm__ __volatile__("fisttpq (%0)" : :"r"(&x) ); }
while (0)
]])], [
ac_have_as_sse3=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_sse3=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_SSE3_TESTS, test x$ac_have_as_sse3 = xyes)
# Ditto for SSSE3 instructions (note extra S)
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_SSSE3_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler speaks SSSE3])
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -msse"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do { long long int x;
__asm__ __volatile__(
"pabsb (%0),%%xmm7" : : "r"(&x) : "xmm7" ); }
while (0)
]])], [
ac_have_as_ssse3=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_ssse3=no
AC_MSG_RESULT([no])
])
CFLAGS="$save_CFLAGS"
AM_CONDITIONAL(BUILD_SSSE3_TESTS, test x$ac_have_as_ssse3 = xyes)
# does the x86/amd64 assembler understand the PCLMULQDQ instruction?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_PCLMULQDQ_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler supports 'pclmulqdq'])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do {
__asm__ __volatile__(
"pclmulqdq \$17,%%xmm6,%%xmm7" : : : "xmm6", "xmm7" ); }
while (0)
]])], [
ac_have_as_pclmulqdq=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_pclmulqdq=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_PCLMULQDQ_TESTS, test x$ac_have_as_pclmulqdq = xyes)
# does the x86/amd64 assembler understand the VPCLMULQDQ instruction?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_VPCLMULQDQ_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler supports 'vpclmulqdq'])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do {
/*
* Carry-less multiplication of xmm1 with xmm2 and store the result in
* xmm3. The immediate is used to determine which quadwords of xmm1 and
* xmm2 should be used.
*/
__asm__ __volatile__(
"vpclmulqdq \$0,%%xmm1,%%xmm2,%%xmm3" : : : );
} while (0)
]])], [
ac_have_as_vpclmulqdq=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_vpclmulqdq=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_VPCLMULQDQ_TESTS, test x$ac_have_as_vpclmulqdq = xyes)
# does the x86/amd64 assembler understand the LZCNT instruction?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_LZCNT_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler supports 'lzcnt'])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do {
__asm__ __volatile__("lzcnt %%rax,%%rax" : : : "rax");
} while (0)
]])], [
ac_have_as_lzcnt=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_lzcnt=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL([BUILD_LZCNT_TESTS], [test x$ac_have_as_lzcnt = xyes])
# does the x86/amd64 assembler understand the LOOPNEL instruction?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_LOOPNEL_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler supports 'loopnel'])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do {
__asm__ __volatile__("1: loopnel 1b\n");
} while (0)
]])], [
ac_have_as_loopnel=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_loopnel=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL([BUILD_LOOPNEL_TESTS], [test x$ac_have_as_loopnel = xyes])
# does the x86/amd64 assembler understand ADDR32 ?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_ADDR32_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler supports 'addr32'])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do {
asm volatile ("addr32 rep movsb");
} while (0)
]])], [
ac_have_as_addr32=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_addr32=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL([BUILD_ADDR32_TESTS], [test x$ac_have_as_addr32 = xyes])
# does the x86/amd64 assembler understand SSE 4.2 instructions?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_SSE42_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler speaks SSE4.2])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do { long long int x;
__asm__ __volatile__(
"crc32q %%r15,%%r15" : : : "r15" );
__asm__ __volatile__(
"pblendvb (%%rcx), %%xmm11" : : : "memory", "xmm11");
__asm__ __volatile__(
"aesdec %%xmm2, %%xmm1" : : : "xmm2", "xmm1"); }
while (0)
]])], [
ac_have_as_sse42=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_sse42=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_SSE42_TESTS, test x$ac_have_as_sse42 = xyes)
# does the x86/amd64 assembler understand AVX instructions?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_AVX_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler speaks AVX])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do { long long int x;
__asm__ __volatile__(
"vmovupd (%%rsp), %%ymm7" : : : "xmm7" );
__asm__ __volatile__(
"vaddpd %%ymm6,%%ymm7,%%ymm8" : : : "xmm6","xmm7","xmm8"); }
while (0)
]])], [
ac_have_as_avx=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_avx=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_AVX_TESTS, test x$ac_have_as_avx = xyes)
# does the x86/amd64 assembler understand AVX2 instructions?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_AVX2_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler speaks AVX2])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do { long long int x;
__asm__ __volatile__(
"vpsravd (%%rsp), %%ymm8, %%ymm7" : : : "xmm7", "xmm8" );
__asm__ __volatile__(
"vpaddb %%ymm6,%%ymm7,%%ymm8" : : : "xmm6","xmm7","xmm8"); }
while (0)
]])], [
ac_have_as_avx2=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_avx2=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_AVX2_TESTS, test x$ac_have_as_avx2 = xyes)
# does the x86/amd64 assembler understand TSX instructions and
# the XACQUIRE/XRELEASE prefixes?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_TSX_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler speaks TSX])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do {
__asm__ __volatile__(
" xbegin Lfoo \n\t"
"Lfoo: xend \n\t"
" xacquire lock incq 0(%rsp) \n\t"
" xrelease lock incq 0(%rsp) \n"
);
} while (0)
]])], [
ac_have_as_tsx=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_tsx=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_TSX_TESTS, test x$ac_have_as_tsx = xyes)
# does the x86/amd64 assembler understand BMI1 and BMI2 instructions?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_BMI_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler speaks BMI1 and BMI2])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do { unsigned int h, l;
__asm__ __volatile__(
"andn %2, %1, %0" : "=r" (h) : "r" (0x1234567), "r" (0x7654321) );
__asm__ __volatile__(
"movl %2, %%edx; mulx %3, %1, %0" : "=r" (h), "=r" (l) : "g" (0x1234567), "rm" (0x7654321) : "edx" ); }
while (0)
]])], [
ac_have_as_bmi=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_bmi=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_BMI_TESTS, test x$ac_have_as_bmi = xyes)
# does the x86/amd64 assembler understand FMA instructions?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_FMA_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler speaks FMA])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do { unsigned int h, l;
__asm__ __volatile__(
"vfmadd132ps (%%rsp), %%ymm8, %%ymm7" : : : "xmm7", "xmm8" );
__asm__ __volatile__(
"vfnmsub231sd (%%rsp), %%xmm8, %%xmm7" : : : "xmm7", "xmm8" );
__asm__ __volatile__(
"vfmsubadd213pd (%%rsp), %%xmm8, %%xmm7" : : : "xmm7", "xmm8" ); }
while (0)
]])], [
ac_have_as_fma=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_fma=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_FMA_TESTS, test x$ac_have_as_fma = xyes)
# does the x86/amd64 assembler understand MOVBE?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_MOVBE_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler knows the MOVBE insn])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do { long long int x;
__asm__ __volatile__(
"movbe (%%rsp), %%r15" : : : "memory", "r15" ); }
while (0)
]])], [
ac_have_as_movbe=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_movbe=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_MOVBE_TESTS, test x$ac_have_as_movbe = xyes)
# Does the C compiler support the "ifunc" attribute
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_IFUNC_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if gcc supports the ifunc attribute])
AC_LINK_IFELSE([AC_LANG_SOURCE([[
static void mytest(void) {}
static void (*resolve_test(void))(void)
{
return (void (*)(void))&mytest;
}
void test(void) __attribute__((ifunc("resolve_test")));
int main()
{
test();
return 0;
}
]])], [
ac_have_ifunc_attr=yes
AC_MSG_RESULT([yes])
], [
ac_have_ifunc_attr=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_IFUNC_TESTS, test x$ac_have_ifunc_attr = xyes)
# XXX JRS 2010 Oct 13: what is this for? For sure, we don't need this
# when building the tool executables. I think we should get rid of it.
#
# Check for TLS support in the compiler and linker
AC_LINK_IFELSE([AC_LANG_PROGRAM([[static __thread int foo;]],
[[return foo;]])],
[vg_cv_linktime_tls=yes],
[vg_cv_linktime_tls=no])
# Native compilation: check whether running a program using TLS succeeds.
# Linking only is not sufficient -- e.g. on Red Hat 7.3 linking TLS programs
# succeeds but running programs using TLS fails.
# Cross-compiling: check whether linking a program using TLS succeeds.
AC_CACHE_CHECK([for TLS support], vg_cv_tls,
[AC_ARG_ENABLE(tls, [ --enable-tls platform supports TLS],
[vg_cv_tls=$enableval],
[AC_RUN_IFELSE([AC_LANG_PROGRAM([[static __thread int foo;]],
[[return foo;]])],
[vg_cv_tls=yes],
[vg_cv_tls=no],
[vg_cv_tls=$vg_cv_linktime_tls])])])
if test "$vg_cv_tls" = yes; then
AC_DEFINE([HAVE_TLS], 1, [can use __thread to define thread-local variables])
fi
#----------------------------------------------------------------------------
# Checks for C header files.
#----------------------------------------------------------------------------
AC_HEADER_STDC
AC_CHECK_HEADERS([ \
asm/unistd.h \
endian.h \
mqueue.h \
sys/endian.h \
sys/epoll.h \
sys/eventfd.h \
sys/klog.h \
sys/poll.h \
sys/signal.h \
sys/signalfd.h \
sys/syscall.h \
sys/time.h \
sys/types.h \
])
# Verify whether the <linux/futex.h> header is usable.
AC_MSG_CHECKING([if <linux/futex.h> is usable])
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -D__user="
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <linux/futex.h>
]], [[
return FUTEX_WAIT;
]])], [
ac_have_usable_linux_futex_h=yes
AC_DEFINE([HAVE_USABLE_LINUX_FUTEX_H], 1,
[Define to 1 if you have a usable <linux/futex.h> header file.])
AC_MSG_RESULT([yes])
], [
ac_have_usable_linux_futex_h=no
AC_MSG_RESULT([no])
])
CFLAGS="$save_CFLAGS"
#----------------------------------------------------------------------------
# Checks for typedefs, structures, and compiler characteristics.
#----------------------------------------------------------------------------
AC_TYPE_UID_T
AC_TYPE_OFF_T
AC_TYPE_SIZE_T
AC_HEADER_TIME
#----------------------------------------------------------------------------
# Checks for library functions.
#----------------------------------------------------------------------------
AC_FUNC_MEMCMP
AC_FUNC_MMAP
AC_CHECK_LIB([pthread], [pthread_create])
AC_CHECK_LIB([rt], [clock_gettime])
AC_CHECK_FUNCS([ \
clock_gettime\
epoll_create \
epoll_pwait \
klogctl \
mallinfo \
memchr \
memset \
mkdir \
mremap \
ppoll \
pthread_barrier_init \
pthread_condattr_setclock \
pthread_mutex_timedlock \
pthread_rwlock_timedrdlock \
pthread_rwlock_timedwrlock \
pthread_spin_lock \
pthread_yield \
pthread_setname_np \
readlinkat \
semtimedop \
signalfd \
sigwaitinfo \
strchr \
strdup \
strpbrk \
strrchr \
strstr \
syscall \
utimensat \
process_vm_readv \
process_vm_writev \
])
# AC_CHECK_LIB adds any library found to the variable LIBS, and links these
# libraries with any shared object and/or executable. This is NOT what we
# want for e.g. vgpreload_core-x86-linux.so
LIBS=""
AM_CONDITIONAL([HAVE_PTHREAD_BARRIER],
[test x$ac_cv_func_pthread_barrier_init = xyes])
AM_CONDITIONAL([HAVE_PTHREAD_MUTEX_TIMEDLOCK],
[test x$ac_cv_func_pthread_mutex_timedlock = xyes])
AM_CONDITIONAL([HAVE_PTHREAD_SPINLOCK],
[test x$ac_cv_func_pthread_spin_lock = xyes])
AM_CONDITIONAL([HAVE_PTHREAD_SETNAME_NP],
[test x$ac_cv_func_pthread_setname_np = xyes])
if test x$VGCONF_PLATFORM_PRI_CAPS = xMIPS32_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_LINUX ; then
AC_DEFINE([DISABLE_PTHREAD_SPINLOCK_INTERCEPT], 1,
[Disable intercept pthread_spin_lock() on MIPS32 and MIPS64.])
fi
#----------------------------------------------------------------------------
# MPI checks
#----------------------------------------------------------------------------
# Do we have a useable MPI setup on the primary and/or secondary targets?
# On Linux, by default, assumes mpicc and -m32/-m64
# Note: this is a kludge in that it assumes the specified mpicc
# understands -m32/-m64 regardless of what is specified using
# --with-mpicc=.
MPI_CC="mpicc"
mflag_primary=
if test x$VGCONF_PLATFORM_PRI_CAPS = xX86_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xPPC32_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xARM_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS32_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_LINUX ; then
mflag_primary=$FLAG_M32
elif test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xPPC64_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xARM64_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xS390X_LINUX ; then
mflag_primary=$FLAG_M64
elif test x$VGCONF_PLATFORM_PRI_CAPS = xX86_DARWIN ; then
mflag_primary="$FLAG_M32 -arch i386"
elif test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_DARWIN ; then
mflag_primary="$FLAG_M64 -arch x86_64"
fi
mflag_secondary=
if test x$VGCONF_PLATFORM_SEC_CAPS = xX86_LINUX \
-o x$VGCONF_PLATFORM_SEC_CAPS = xPPC32_LINUX ; then
mflag_secondary=$FLAG_M32
elif test x$VGCONF_PLATFORM_SEC_CAPS = xX86_DARWIN ; then
mflag_secondary="$FLAG_M32 -arch i386"
fi
AC_ARG_WITH(mpicc,
[ --with-mpicc= Specify name of MPI2-ised C compiler],
MPI_CC=$withval
)
AC_SUBST(MPI_CC)
## We AM_COND_IF here instead of automake "if" in mpi/Makefile.am so that we can
## use these values in the check for a functioning mpicc.
##
## We leave the MPI_FLAG_M3264_ logic in mpi/Makefile.am and assume that
## mflag_primary/mflag_secondary are sufficient approximations of that behavior
AM_COND_IF([VGCONF_OS_IS_LINUX],
[CFLAGS_MPI="-g -O -fno-omit-frame-pointer -Wall -fpic"
LDFLAGS_MPI="-fpic -shared"])
AM_COND_IF([VGCONF_OS_IS_DARWIN],
[CFLAGS_MPI="-g -O -fno-omit-frame-pointer -Wall -dynamic"
LDFLAGS_MPI="-dynamic -dynamiclib -all_load"])
AC_SUBST([CFLAGS_MPI])
AC_SUBST([LDFLAGS_MPI])
## See if MPI_CC works for the primary target
##
AC_MSG_CHECKING([primary target for usable MPI2-compliant C compiler and mpi.h])
saved_CC=$CC
saved_CFLAGS=$CFLAGS
CC=$MPI_CC
CFLAGS="$CFLAGS_MPI $mflag_primary"
saved_LDFLAGS="$LDFLAGS"
LDFLAGS="$LDFLAGS_MPI $mflag_primary"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <mpi.h>
#include <stdio.h>
]], [[
int ni, na, nd, comb;
int r = MPI_Init(NULL,NULL);
r |= MPI_Type_get_envelope( MPI_INT, &ni, &na, &nd, &comb );
r |= MPI_Finalize();
return r;
]])], [
ac_have_mpi2_pri=yes
AC_MSG_RESULT([yes, $MPI_CC])
], [
ac_have_mpi2_pri=no
AC_MSG_RESULT([no])
])
CC=$saved_CC
CFLAGS=$saved_CFLAGS
LDFLAGS="$saved_LDFLAGS"
AM_CONDITIONAL(BUILD_MPIWRAP_PRI, test x$ac_have_mpi2_pri = xyes)
## See if MPI_CC works for the secondary target. Complication: what if
## there is no secondary target? We need this to then fail.
## Kludge this by making MPI_CC something which will surely fail in
## such a case.
##
AC_MSG_CHECKING([secondary target for usable MPI2-compliant C compiler and mpi.h])
saved_CC=$CC
saved_CFLAGS=$CFLAGS
saved_LDFLAGS="$LDFLAGS"
LDFLAGS="$LDFLAGS_MPI $mflag_secondary"
if test x$VGCONF_PLATFORM_SEC_CAPS = x ; then
CC="$MPI_CC this will surely fail"
else
CC=$MPI_CC
fi
CFLAGS="$CFLAGS_MPI $mflag_secondary"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <mpi.h>
#include <stdio.h>
]], [[
int ni, na, nd, comb;
int r = MPI_Init(NULL,NULL);
r |= MPI_Type_get_envelope( MPI_INT, &ni, &na, &nd, &comb );
r |= MPI_Finalize();
return r;
]])], [
ac_have_mpi2_sec=yes
AC_MSG_RESULT([yes, $MPI_CC])
], [
ac_have_mpi2_sec=no
AC_MSG_RESULT([no])
])
CC=$saved_CC
CFLAGS=$saved_CFLAGS
LDFLAGS="$saved_LDFLAGS"
AM_CONDITIONAL(BUILD_MPIWRAP_SEC, test x$ac_have_mpi2_sec = xyes)
#----------------------------------------------------------------------------
# Other library checks
#----------------------------------------------------------------------------
# There now follow some tests for Boost, and OpenMP. These
# tests are present because Drd has some regression tests that use
# these packages. All regression test programs all compiled only
# for the primary target. And so it is important that the configure
# checks that follow, use the correct -m32 or -m64 flag for the
# primary target (called $mflag_primary). Otherwise, we can end up
# in a situation (eg) where, on amd64-linux, the test for Boost checks
# for usable 64-bit Boost facilities, but because we are doing a 32-bit
# only build (meaning, the primary target is x86-linux), the build
# of the regtest programs that use Boost fails, because they are
# build as 32-bit (IN THIS EXAMPLE).
#
# Hence: ALWAYS USE $mflag_primary FOR CONFIGURE TESTS FOR FACILITIES
# NEEDED BY THE REGRESSION TEST PROGRAMS.
# Check whether the boost library 1.35 or later has been installed.
# The Boost.Threads library has undergone a major rewrite in version 1.35.0.
AC_MSG_CHECKING([for boost])
AC_LANG(C++)
safe_CXXFLAGS=$CXXFLAGS
CXXFLAGS="$mflag_primary"
safe_LIBS="$LIBS"
LIBS="-lboost_thread-mt $LIBS"
AC_LINK_IFELSE([AC_LANG_SOURCE([
#include <boost/thread.hpp>
static void thread_func(void)
{ }
int main(int argc, char** argv)
{
boost::thread t(thread_func);
return 0;
}
])],
[
ac_have_boost_1_35=yes
AC_SUBST([BOOST_CFLAGS], [])
AC_SUBST([BOOST_LIBS], [-lboost_thread-mt])
AC_MSG_RESULT([yes])
], [
ac_have_boost_1_35=no
AC_MSG_RESULT([no])
])
LIBS="$safe_LIBS"
CXXFLAGS=$safe_CXXFLAGS
AC_LANG(C)
AM_CONDITIONAL([HAVE_BOOST_1_35], [test x$ac_have_boost_1_35 = xyes])
# does this compiler support -fopenmp, does it have the include file
# <omp.h> and does it have libgomp ?
AC_MSG_CHECKING([for OpenMP])
safe_CFLAGS=$CFLAGS
CFLAGS="-fopenmp $mflag_primary"
AC_LINK_IFELSE([AC_LANG_SOURCE([
#include <omp.h>
int main(int argc, char** argv)
{
omp_set_dynamic(0);
return 0;
}
])],
[
ac_have_openmp=yes
AC_MSG_RESULT([yes])
], [
ac_have_openmp=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AM_CONDITIONAL([HAVE_OPENMP], [test x$ac_have_openmp = xyes])
# does this compiler have built-in functions for atomic memory access for the
# primary target ?
AC_MSG_CHECKING([if gcc supports __sync_add_and_fetch for the primary target])
safe_CFLAGS=$CFLAGS
CFLAGS="$mflag_primary"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[
int variable = 1;
return (__sync_bool_compare_and_swap(&variable, 1, 2)
&& __sync_add_and_fetch(&variable, 1) ? 1 : 0)
]])], [
ac_have_builtin_atomic_primary=yes
AC_MSG_RESULT([yes])
AC_DEFINE(HAVE_BUILTIN_ATOMIC, 1, [Define to 1 if gcc supports __sync_bool_compare_and_swap() and __sync_add_and_fetch() for the primary target])
], [
ac_have_builtin_atomic_primary=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AM_CONDITIONAL([HAVE_BUILTIN_ATOMIC],
[test x$ac_have_builtin_atomic_primary = xyes])
# does this compiler have built-in functions for atomic memory access for the
# secondary target ?
if test x$VGCONF_PLATFORM_SEC_CAPS != x; then
AC_MSG_CHECKING([if gcc supports __sync_add_and_fetch for the secondary target])
safe_CFLAGS=$CFLAGS
CFLAGS="$mflag_secondary"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[
int variable = 1;
return (__sync_add_and_fetch(&variable, 1) ? 1 : 0)
]])], [
ac_have_builtin_atomic_secondary=yes
AC_MSG_RESULT([yes])
], [
ac_have_builtin_atomic_secondary=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
fi
AM_CONDITIONAL([HAVE_BUILTIN_ATOMIC_SECONDARY],
[test x$ac_have_builtin_atomic_secondary = xyes])
# does this compiler have built-in functions for atomic memory access on
# 64-bit integers for all targets ?
AC_MSG_CHECKING([if gcc supports __sync_add_and_fetch on uint64_t for all targets])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <stdint.h>
]], [[
uint64_t variable = 1;
return __sync_add_and_fetch(&variable, 1)
]])], [
ac_have_builtin_atomic64_primary=yes
], [
ac_have_builtin_atomic64_primary=no
])
if test x$VGCONF_PLATFORM_SEC_CAPS != x; then
safe_CFLAGS=$CFLAGS
CFLAGS="$mflag_secondary"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <stdint.h>
]], [[
uint64_t variable = 1;
return __sync_add_and_fetch(&variable, 1)
]])], [
ac_have_builtin_atomic64_secondary=yes
], [
ac_have_builtin_atomic64_secondary=no
])
CFLAGS=$safe_CFLAGS
fi
if test x$ac_have_builtin_atomic64_primary = xyes && \
test x$VGCONF_PLATFORM_SEC_CAPS = x \
-o x$ac_have_builtin_atomic64_secondary = xyes; then
AC_MSG_RESULT([yes])
ac_have_builtin_atomic64=yes
else
AC_MSG_RESULT([no])
ac_have_builtin_atomic64=no
fi
AM_CONDITIONAL([HAVE_BUILTIN_ATOMIC64],
[test x$ac_have_builtin_atomic64 = xyes])
# does g++ have built-in functions for atomic memory access ?
AC_MSG_CHECKING([if g++ supports __sync_add_and_fetch])
safe_CXXFLAGS=$CXXFLAGS
CXXFLAGS="$mflag_primary"
AC_LANG_PUSH(C++)
AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[
int variable = 1;
return (__sync_bool_compare_and_swap(&variable, 1, 2)
&& __sync_add_and_fetch(&variable, 1) ? 1 : 0)
]])], [
ac_have_builtin_atomic_cxx=yes
AC_MSG_RESULT([yes])
AC_DEFINE(HAVE_BUILTIN_ATOMIC_CXX, 1, [Define to 1 if g++ supports __sync_bool_compare_and_swap() and __sync_add_and_fetch()])
], [
ac_have_builtin_atomic_cxx=no
AC_MSG_RESULT([no])
])
AC_LANG_POP(C++)
CXXFLAGS=$safe_CXXFLAGS
AM_CONDITIONAL([HAVE_BUILTIN_ATOMIC_CXX], [test x$ac_have_builtin_atomic_cxx = xyes])
if test x$ac_have_usable_linux_futex_h = xyes \
-a x$ac_have_builtin_atomic_primary = xyes; then
ac_enable_linux_ticket_lock_primary=yes
fi
AM_CONDITIONAL([ENABLE_LINUX_TICKET_LOCK_PRIMARY],
[test x$ac_enable_linux_ticket_lock_primary = xyes])
if test x$VGCONF_PLATFORM_SEC_CAPS != x \
-a x$ac_have_usable_linux_futex_h = xyes \
-a x$ac_have_builtin_atomic_secondary = xyes; then
ac_enable_linux_ticket_lock_secondary=yes
fi
AM_CONDITIONAL([ENABLE_LINUX_TICKET_LOCK_SECONDARY],
[test x$ac_enable_linux_ticket_lock_secondary = xyes])
# does libstdc++ support annotating shared pointers ?
AC_MSG_CHECKING([if libstdc++ supports annotating shared pointers])
safe_CXXFLAGS=$CXXFLAGS
CXXFLAGS="-std=c++0x"
AC_LANG_PUSH(C++)
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <memory>
]], [[
std::shared_ptr<int> p
]])], [
ac_have_shared_ptr=yes
], [
ac_have_shared_ptr=no
])
if test x$ac_have_shared_ptr = xyes; then
# If compilation of the program below fails because of a syntax error
# triggered by substituting one of the annotation macros then that
# means that libstdc++ supports these macros.
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#define _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(a) (a)----
#define _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(a) (a)----
#include <memory>
]], [[
std::shared_ptr<int> p
]])], [
ac_have_shared_pointer_annotation=no
AC_MSG_RESULT([no])
], [
ac_have_shared_pointer_annotation=yes
AC_MSG_RESULT([yes])
AC_DEFINE(HAVE_SHARED_POINTER_ANNOTATION, 1,
[Define to 1 if libstd++ supports annotating shared pointers])
])
else
ac_have_shared_pointer_annotation=no
AC_MSG_RESULT([no])
fi
AC_LANG_POP(C++)
CXXFLAGS=$safe_CXXFLAGS
AM_CONDITIONAL([HAVE_SHARED_POINTER_ANNOTATION],
[test x$ac_have_shared_pointer_annotation = xyes])
#----------------------------------------------------------------------------
# Ok. We're done checking.
#----------------------------------------------------------------------------
# Nb: VEX/Makefile is generated from Makefile.vex.in.
AC_CONFIG_FILES([
Makefile
VEX/Makefile:Makefile.vex.in
valgrind.spec
valgrind.pc
glibc-2.X.supp
docs/Makefile
tests/Makefile
tests/vg_regtest
perf/Makefile
perf/vg_perf
gdbserver_tests/Makefile
include/Makefile
auxprogs/Makefile
mpi/Makefile
coregrind/Makefile
memcheck/Makefile
memcheck/tests/Makefile
memcheck/tests/common/Makefile
memcheck/tests/amd64/Makefile
memcheck/tests/x86/Makefile
memcheck/tests/linux/Makefile
memcheck/tests/darwin/Makefile
memcheck/tests/amd64-linux/Makefile
memcheck/tests/x86-linux/Makefile
memcheck/tests/ppc32/Makefile
memcheck/tests/ppc64/Makefile
memcheck/tests/s390x/Makefile
memcheck/tests/vbit-test/Makefile
cachegrind/Makefile
cachegrind/tests/Makefile
cachegrind/tests/x86/Makefile
cachegrind/cg_annotate
cachegrind/cg_diff
callgrind/Makefile
callgrind/callgrind_annotate
callgrind/callgrind_control
callgrind/tests/Makefile
helgrind/Makefile
helgrind/tests/Makefile
massif/Makefile
massif/tests/Makefile
massif/ms_print
lackey/Makefile
lackey/tests/Makefile
none/Makefile
none/tests/Makefile
none/tests/amd64/Makefile
none/tests/ppc32/Makefile
none/tests/ppc64/Makefile
none/tests/x86/Makefile
none/tests/arm/Makefile
none/tests/s390x/Makefile
none/tests/mips32/Makefile
none/tests/mips64/Makefile
none/tests/linux/Makefile
none/tests/darwin/Makefile
none/tests/x86-linux/Makefile
exp-sgcheck/Makefile
exp-sgcheck/tests/Makefile
drd/Makefile
drd/scripts/download-and-build-splash2
drd/tests/Makefile
exp-bbv/Makefile
exp-bbv/tests/Makefile
exp-bbv/tests/x86/Makefile
exp-bbv/tests/x86-linux/Makefile
exp-bbv/tests/amd64-linux/Makefile
exp-bbv/tests/ppc32-linux/Makefile
exp-bbv/tests/arm-linux/Makefile
exp-dhat/Makefile
exp-dhat/tests/Makefile
])
AC_CONFIG_FILES([coregrind/link_tool_exe_linux],
[chmod +x coregrind/link_tool_exe_linux])
AC_CONFIG_FILES([coregrind/link_tool_exe_darwin],
[chmod +x coregrind/link_tool_exe_darwin])
AC_OUTPUT
cat<<EOF
Maximum build arch: ${ARCH_MAX}
Primary build arch: ${VGCONF_ARCH_PRI}
Secondary build arch: ${VGCONF_ARCH_SEC}
Build OS: ${VGCONF_OS}
Primary build target: ${VGCONF_PLATFORM_PRI_CAPS}
Secondary build target: ${VGCONF_PLATFORM_SEC_CAPS}
Platform variant: ${VGCONF_PLATVARIANT}
Primary -DVGPV string: -DVGPV_${VGCONF_ARCH_PRI}_${VGCONF_OS}_${VGCONF_PLATVARIANT}=1
Default supp files: ${DEFAULT_SUPP}
EOF