
##------------------------------------------------------------##
# 
# 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.4.0.SVN, valgrind-users@lists.sourceforge.net)
AC_CONFIG_SRCDIR(coregrind/m_main.c)
AM_CONFIG_HEADER(config.h)
AM_INIT_AUTOMAKE([foreign])

AM_MAINTAINER_MODE

# Where is VEX ?
# Nb: For the 2nd arg, the help string, AS_HELP_STRING is the proper way, but
#     older autoconfs don't support it... here's what it would say:
#
#    AS_HELP_STRING([--with-vex], [Vex directory]),
#
AC_ARG_WITH(vex, 
    [  --with-vex=/path/to/vex/dir    Vex directory],
[
    AC_CHECK_FILE($withval/pub/libvex.h,
        [VEX_DIR=$withval],
        [AC_MSG_ERROR([Directory '$withval' does not exist, or does not contain Vex])])
],
[
    VEX_DIR='$(top_srcdir)/VEX'
])
AC_SUBST(VEX_DIR)

# "make distcheck" first builds a tarball, then extracts it.
# Then it creates a build directory different from the extracted sources
# (called _build), and issues
#
#   ../configure $(DISTCHECK_CONFIGURE_FLAGS)
#
# and then builds, runs "make check", installs using DESTDIR, runs make
# installcheck, uninstalls, checks whether the installed base is empty
# again, then does yet another "make dist" and compares the resulting
# tarball with the one it started off with for identical content.  Then it
# tests "make distclean" for no leftover files.  
#
# So this line means:  when doing "make dist", use the same --with-vex value
# that you used when running configure to configure this tree in the first
# place.
AC_SUBST([DISTCHECK_CONFIGURE_FLAGS], [--with-vex=$VEX_DIR])

# Checks for programs.
CFLAGS="-Wno-long-long"

AC_PROG_LN_S
AC_PROG_CC
AM_PROG_CC_C_O
AC_PROG_CPP
AC_PROG_CXX
AC_PROG_RANLIB

# 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], ["${LD%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)
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 we have GNU sed: some of the stuff done by "make install" relies
# on some pretty fancy sed expressions, and AIX sed doesn't produce the
# same results, causing install to fail

AC_MSG_CHECKING([for GNU sed])

[sed_firstline=`sed --version | head -n 1`]

case "${sed_firstline}" in
    GNU*)
	AC_MSG_RESULT([ok, looks like GNU sed])
	;;
    *)
	AC_MSG_RESULT([please ensure first 'sed' in your path is GNU sed])
	AC_MSG_RESULT([note: GNU sed is only required at build/install time])
	AC_MSG_ERROR([build/install requires that 'sed' is GNU sed])
	;;
esac


# We don't want gcc < 3.0
AC_MSG_CHECKING([for a supported version of gcc])

[gcc_version=`${CC} --version | head -n 1 | sed 's/^[^0-9]*\([0-9.]*\).*$/\1/'`]

case "${gcc_version}" in
     2.*)
	AC_MSG_RESULT([no (${gcc_version})])
	AC_MSG_ERROR([please use a recent (>= gcc-3.0) version of gcc])
	;;
     *)
	AC_MSG_RESULT([ok (${gcc_version})])
	;;
esac


# Checks for the platform, with the aim of setting VG_ARCH_MAX.  Note
# that VG_ARCH_MAX must be set to reflect 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.
#
# We will later in this file set VG_ARCH_PRI, which is the arch for
# the primary target.  For example, suppose we do a build on an amd64
# machine, but --enable-only32bit has been requested.  Then
# VG_ARCH_MAX will be "amd64" since that reflects the most that this
# cpu can do, but VG_ARCH_PRI will be "x86", since that reflects the
# arch corresponding to the primary build (VG_PLATFORM_PRI).

AC_CANONICAL_HOST

AC_MSG_CHECKING([for a supported CPU])
AC_SUBST(VG_ARCH_MAX)

AC_SUBST(VG_ARCH_ALL)
VG_ARCH_ALL="amd64 ppc32 ppc64 x86"

AC_SUBST(VALT_LOAD_ADDRESS)

case "${host_cpu}" in
     i?86) 
	AC_MSG_RESULT([ok (${host_cpu})])
        VG_ARCH_MAX="x86"
        valt_load_address_normal="0x38000000"
        valt_load_address_inner="0x28000000"
        ;;

     x86_64) 
        AC_MSG_RESULT([ok (${host_cpu})])
        VG_ARCH_MAX="amd64"
        valt_load_address_normal="0x38000000"
        valt_load_address_inner="0x28000000"
        ;;

     powerpc64)
#       This value can only happen on Linux, not on AIX
        AC_MSG_RESULT([ok (${host_cpu})])
        VG_ARCH_MAX="ppc64"
        valt_load_address_normal="0x38000000"
        valt_load_address_inner="0x28000000"
        ;;

     powerpc)
#       Complexity.  'powerpc' on AIX implies a 64-bit capable CPU.
#       Whereas in Linux that means only a 32-bit capable CPU.
        AC_MSG_RESULT([ok (${host_cpu})])
	case "${host_os}" in
	   aix5.*)
	      VG_ARCH_MAX="ppc64"
              ;;
           *)
              VG_ARCH_MAX="ppc32"
              ;;
        esac
        valt_load_address_normal="0x38000000"
        valt_load_address_inner="0x28000000"
        ;;

     *) 
	AC_MSG_RESULT([no (${host_cpu})])
	AC_MSG_ERROR([Unsupported host architecture. Sorry])
	;;
esac

# Check if this should be built as an inner Valgrind, to be run within
# another Valgrind.  Choose the load address accordingly.
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=$valt_load_address_inner
else
    VALT_LOAD_ADDRESS=$valt_load_address_normal
fi

# 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 :-)

# 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



AC_MSG_CHECKING([for a supported OS])
AC_SUBST(VG_OS)

case "${host_os}" in
     *linux*)
	AC_MSG_RESULT([ok (${host_os})])
        VG_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.*) 
        	    AC_MSG_RESULT([2.6 family (${kernel})])
        	    AC_DEFINE([KERNEL_2_6], 1, [Define to 1 if you're using Linux 2.6.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

        ;;

     aix5.1.*)
        AC_MSG_RESULT([ok (${host_os})])
        VG_OS="aix5"
        ;;
     aix5.2.*)
        AC_MSG_RESULT([ok (${host_os})])
        VG_OS="aix5"
        ;;       
     aix5.3.*)
        AC_MSG_RESULT([ok (${host_os})])
        VG_OS="aix5"
        ;;       

     *freebsd*)
        AC_MSG_RESULT([ok (${host_os})])
        VG_OS="freebsd"
        ;;

     *) 
	AC_MSG_RESULT([no (${host_os})])
	AC_MSG_ERROR([Valgrind is operating system specific. Sorry. Please consider doing a port.])
	;;
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 "$VG_ARCH_MAX-$VG_OS" in
     amd64-linux|ppc64-linux)
        AC_MSG_CHECKING([for 32 bit build support])
        safe_CFLAGS=$CFLAGS
        CFLAGS="-m32"
        AC_TRY_LINK(, [
        int main () { 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

# Establish VG_PLATFORM_PRI.  This is the primary build target.  The
# entire system, including regression and performance tests, will be
# built for this target.
#
# Also establish VG_PLATFORM_SEC, the secondary build target, if
# possible.  The system will also be built for this target, but not
# the regression or performance tests.
#
# Also establish VG_ARCH_PRI, which is the arch for the primary
# build target.  The various makefiles building regression tests
# sometimes need to see this.
AC_MSG_CHECKING([for a supported CPU/OS combination])

AC_SUBST(VG_PLATFORM_PRI)
AC_SUBST(VG_PLATFORM_SEC)
AC_SUBST(VG_ARCH_PRI)

# By default, the primary arch is the same as the "max" arch, as
# commented above (at the definition of VG_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.
VG_ARCH_PRI=$VG_ARCH_MAX

case "$VG_ARCH_MAX-$VG_OS" in
     x86-linux)
	VG_PLATFORM_PRI="X86_LINUX"
	VG_PLATFORM_SEC=""
        AC_MSG_RESULT([ok (${host_cpu}-${host_os})])
	;;
     amd64-linux)
	if test x$vg_cv_only64bit = xyes; then
	   VG_PLATFORM_PRI="AMD64_LINUX"
	   VG_PLATFORM_SEC=""
	elif test x$vg_cv_only32bit = xyes; then
	   VG_PLATFORM_PRI="X86_LINUX"
	   VG_PLATFORM_SEC=""
	   VG_ARCH_PRI="x86"
	else
	   VG_PLATFORM_PRI="AMD64_LINUX"
	   VG_PLATFORM_SEC="X86_LINUX"
	fi
        AC_MSG_RESULT([ok (${host_cpu}-${host_os})])
	;;
     ppc32-linux)
	VG_PLATFORM_PRI="PPC32_LINUX"
	VG_PLATFORM_SEC=""
        AC_MSG_RESULT([ok (${host_cpu}-${host_os})])
	;;
     ppc64-aix5)
	if test x$vg_cv_only64bit = xyes; then
	   VG_PLATFORM_PRI="PPC64_AIX5"
	   VG_PLATFORM_SEC=""
	elif test x$vg_cv_only32bit = xyes; then
	   VG_PLATFORM_PRI="PPC32_AIX5"
	   VG_PLATFORM_SEC=""
	   VG_ARCH_PRI="ppc32"
	else
	   VG_PLATFORM_PRI="PPC64_AIX5"
	   VG_PLATFORM_SEC="PPC32_AIX5"
	fi
        AC_MSG_RESULT([ok (${host_cpu}-${host_os})])
	;;
     ppc64-linux)
	if test x$vg_cv_only64bit = xyes; then
	   VG_PLATFORM_PRI="PPC64_LINUX"
	   VG_PLATFORM_SEC=""
	elif test x$vg_cv_only32bit = xyes; then
	   VG_PLATFORM_PRI="PPC32_LINUX"
	   VG_PLATFORM_SEC=""
	   VG_ARCH_PRI="ppc32"
	else
	   VG_PLATFORM_PRI="PPC64_LINUX"
	   VG_PLATFORM_SEC="PPC32_LINUX"
	fi
        AC_MSG_RESULT([ok (${host_cpu}-${host_os})])
	;;
    *)
	VG_PLATFORM_PRI="unknown"
	VG_PLATFORM_SEC="unknown"
        AC_MSG_RESULT([no (${host_cpu}-${host_os})])
        AC_MSG_ERROR([Valgrind is platform specific. Sorry. Please consider doing a port.])
        ;;
esac

# Set up VGP_<platform>.  Either one or two of these become defined.
#
AM_CONDITIONAL(VGP_X86_LINUX,   
               test x$VG_PLATFORM_PRI = xX86_LINUX \
                 -o x$VG_PLATFORM_SEC = xX86_LINUX)
AM_CONDITIONAL(VGP_AMD64_LINUX, 
               test x$VG_PLATFORM_PRI = xAMD64_LINUX)
AM_CONDITIONAL(VGP_PPC32_LINUX, 
               test x$VG_PLATFORM_PRI = xPPC32_LINUX \ 
                 -o x$VG_PLATFORM_SEC = xPPC32_LINUX)
AM_CONDITIONAL(VGP_PPC64_LINUX, 
               test x$VG_PLATFORM_PRI = xPPC64_LINUX)
AM_CONDITIONAL(VGP_PPC32_AIX5, 
               test x$VG_PLATFORM_PRI = xPPC32_AIX5 \ 
                 -o x$VG_PLATFORM_SEC = xPPC32_AIX5)
AM_CONDITIONAL(VGP_PPC64_AIX5, 
               test x$VG_PLATFORM_PRI = xPPC64_AIX5)

# Similarly, set up VGO_<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(VGO_LINUX,
               test x$VG_PLATFORM_PRI = xX86_LINUX \
                 -o x$VG_PLATFORM_PRI = xAMD64_LINUX \
                 -o x$VG_PLATFORM_PRI = xPPC32_LINUX \
                 -o x$VG_PLATFORM_PRI = xPPC64_LINUX)
AM_CONDITIONAL(VGO_AIX5,
               test x$VG_PLATFORM_PRI = xPPC32_AIX5 \
                 -o x$VG_PLATFORM_PRI = xPPC64_AIX5)


# Sometimes, in the Makefile.am-s, it's useful to know
# whether or not there is a secondary target.
#
AM_CONDITIONAL(VGP_HAVE_SECONDARY,
               test x$VG_PLATFORM_SEC != x)


# This variable will collect the individual suppression files
# depending on the results of autoconf
DEFAULT_SUPP=""
AC_SUBST(DEFAULT_SUPP)


GLIBC_VERSION=""

AC_EGREP_CPP([GLIBC_22], [
#include <features.h>
#ifdef __GNU_LIBRARY__
 #if (__GLIBC__ == 2 && __GLIBC_MINOR__ == 2)
  GLIBC_22
 #endif
#endif
],
GLIBC_VERSION="2.2")

AC_EGREP_CPP([GLIBC_23], [
#include <features.h>
#ifdef __GNU_LIBRARY__
 #if (__GLIBC__ == 2 && __GLIBC_MINOR__ == 3)
  GLIBC_23
 #endif
#endif
],
GLIBC_VERSION="2.3")

AC_EGREP_CPP([GLIBC_24], [
#include <features.h>
#ifdef __GNU_LIBRARY__
 #if (__GLIBC__ == 2 && __GLIBC_MINOR__ == 4)
  GLIBC_24
 #endif
#endif
],
GLIBC_VERSION="2.4")

AC_EGREP_CPP([GLIBC_25], [
#include <features.h>
#ifdef __GNU_LIBRARY__
 #if (__GLIBC__ == 2 && __GLIBC_MINOR__ == 5)
  GLIBC_25
 #endif
#endif
],
GLIBC_VERSION="2.5")

AC_EGREP_CPP([GLIBC_26], [
#include <features.h>
#ifdef __GNU_LIBRARY__
 #if (__GLIBC__ == 2 && __GLIBC_MINOR__ == 6)
  GLIBC_26
 #endif
#endif
],
GLIBC_VERSION="2.6")

AC_EGREP_CPP([GLIBC_27], [
#include <features.h>
#ifdef __GNU_LIBRARY__
 #if (__GLIBC__ == 2 && __GLIBC_MINOR__ == 7)
  GLIBC_27
 #endif
#endif
],
GLIBC_VERSION="2.7")

AC_EGREP_CPP([GLIBC_28], [
#include <features.h>
#ifdef __GNU_LIBRARY__
 #if (__GLIBC__ == 2 && __GLIBC_MINOR__ == 8)
  GLIBC_28
 #endif
#endif
],
GLIBC_VERSION="2.8")

AC_EGREP_CPP([AIX5_LIBC], [
#include <standards.h>
#if defined(_AIXVERSION_510) || defined(_AIXVERSION_520) || defined(_AIXVERSION_530)
  AIX5_LIBC
#endif
],
GLIBC_VERSION="aix5")

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}"
	;;

     aix5)
	AC_MSG_RESULT(AIX 5.1 or 5.2 or 5.3)
	AC_DEFINE([AIX5_LIBC], 1, [Define to 1 if you're using AIX 5.1 or 5.2 or 5.3])
	DEFAULT_SUPP="aix5libc.supp ${DEFAULT_SUPP}"
	;;

     *)
	AC_MSG_RESULT(unsupported version)
	AC_MSG_ERROR([Valgrind requires glibc version 2.2 - 2.8])
	AC_MSG_ERROR([or AIX 5.1 or 5.2 or 5.3 GLIBC_VERSION])
	;;
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-ptrcheck
DEFAULT_SUPP="exp-ptrcheck.supp ${DEFAULT_SUPP}"


# Check for CLOCK_MONOTONIC

AC_MSG_CHECKING([for CLOCK_MONOTONIC])

AC_TRY_COMPILE(
[
#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_MUTEX_ADAPTIVE_NP

AC_MSG_CHECKING([for PTHREAD_MUTEX_ADAPTIVE_NP])

AC_TRY_COMPILE(
[
#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_TRY_COMPILE(
[
#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_TRY_COMPILE(
[
#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_TRY_COMPILE(
[
#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 FILE has a member called _lock and whether it's a pointer.

AC_MSG_CHECKING([for FILE::_lock])

AC_TRY_COMPILE(
[
  #include <stdio.h>
], [
  void *p;
  p = stdout->_lock;
  return 0;
], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_LIBC_FILE_LOCK], 1,
          [Define to 1 if FILE has a member called _lock.])
], [
AC_MSG_RESULT([no])
])


# Check whether pthread_mutex_t has a member called __m_kind.

AC_MSG_CHECKING([for pthread_mutex_t::__m_kind])

AC_TRY_COMPILE(
[
  #include <pthread.h>
], [
  pthread_mutex_t m;
  return m.__m_kind;
], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_PTHREAD_MUTEX_T__M_KIND], 1,
          [Define to 1 if pthread_mutex_t has a member called __m_kind.])
], [
AC_MSG_RESULT([no])
])


# Check whether pthread_mutex_t has a member called __data.__kind.

AC_MSG_CHECKING([for pthread_mutex_t::__data.__kind])

AC_TRY_COMPILE(
[
#include <pthread.h>
], [
  pthread_mutex_t m;
  return m.__data.__kind;
], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_PTHREAD_MUTEX_T__DATA__KIND], 1,
          [Define to 1 if pthread_mutex_t has a member __data.__kind.])
], [
AC_MSG_RESULT([no])
])


# 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"

AC_LINK_IFELSE(
[
#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 support -maltivec and does it have the include file
# <altivec.h> ?

AC_MSG_CHECKING([for Altivec])

safe_CFLAGS=$CFLAGS
CFLAGS="-maltivec"

AC_TRY_COMPILE(
[
#include <altivec.h>
], [
  vector unsigned int v;
],
[
ac_have_altivec=yes
AC_MSG_RESULT([yes])
], [
ac_have_altivec=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS

AM_CONDITIONAL([HAS_ALTIVEC], [test x$ac_have_altivec = xyes])
AM_CONDITIONAL([HAVE_ALTIVEC_H], [test x$ac_have_altivec = xyes])


# Check for eventfd_t, eventfd() and eventfd_read()
AC_MSG_CHECKING([for eventfd()])

AC_TRY_LINK(
[
#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])
])


# does this compiler support -m32 ?
AC_MSG_CHECKING([if gcc accepts -m32])

safe_CFLAGS=$CFLAGS
CFLAGS="-m32"

AC_TRY_COMPILE(, [
int main () { 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 -maix32 ?
AC_MSG_CHECKING([if gcc accepts -maix32])

safe_CFLAGS=$CFLAGS
CFLAGS="-maix32"

AC_TRY_COMPILE(, [
int main () { return 0 ; }
],
[
FLAG_MAIX32="-maix32"
AC_MSG_RESULT([yes])
], [
FLAG_MAIX32=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS

AC_SUBST(FLAG_MAIX32)


# does this compiler support -m64 ?
AC_MSG_CHECKING([if gcc accepts -m64])

safe_CFLAGS=$CFLAGS
CFLAGS="-m64"

AC_TRY_COMPILE(, [
int main () { 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 -maix64 ?
AC_MSG_CHECKING([if gcc accepts -maix64])

safe_CFLAGS=$CFLAGS
CFLAGS="-maix64"

AC_TRY_COMPILE(, [
int main () { return 0 ; }
],
[
FLAG_MAIX64="-maix64"
AC_MSG_RESULT([yes])
], [
FLAG_MAIX64=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS

AC_SUBST(FLAG_MAIX64)


# does this compiler support -mmmx ?
AC_MSG_CHECKING([if gcc accepts -mmmx])

safe_CFLAGS=$CFLAGS
CFLAGS="-mmmx"

AC_TRY_COMPILE(, [
int main () { 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_TRY_COMPILE(, [
int main () { 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_TRY_COMPILE(, [
int main () { 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_TRY_COMPILE(, [
int main () { return 0 ; }
],
[
no_pointer_sign=yes
AC_MSG_RESULT([yes])
], [
no_pointer_sign=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS

if test x$no_pointer_sign = xyes; then
  CFLAGS="$CFLAGS -Wno-pointer-sign"
fi


# does this compiler support -Wdeclaration-after-statement ?
AC_MSG_CHECKING([if gcc accepts -Wdeclaration-after-statement])

safe_CFLAGS=$CFLAGS
CFLAGS="-Wdeclaration-after-statement"

AC_TRY_COMPILE(, [
int main () { return 0 ; }
],
[
declaration_after_statement=yes
FLAG_WDECL_AFTER_STMT="-Wdeclaration-after-statement"
AC_MSG_RESULT([yes])
], [
declaration_after_statement=no
FLAG_WDECL_AFTER_STMT=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS

AC_SUBST(FLAG_WDECL_AFTER_STMT)

if test x$declaration_after_statement = xyes; then
  CFLAGS="$CFLAGS -Wdeclaration-after-statement"
fi


# 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_TRY_COMPILE(
[ ],
[
  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 -Wextra or the older -W ?

AC_MSG_CHECKING([if gcc accepts -Wextra or -W])

safe_CFLAGS=$CFLAGS
CFLAGS="-Wextra"

AC_TRY_COMPILE(
[ ],
[
  return 0;
],
[
AC_SUBST([FLAG_W_EXTRA], [-Wextra])
AC_MSG_RESULT([-Wextra])
], [
  CFLAGS="-W"
  AC_TRY_COMPILE(
  [ ],
  [
    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_TRY_COMPILE(, [
int main () { 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"
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_TRY_COMPILE(
[ ],
[
  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 __builtin_expect?
AC_MSG_CHECKING([if gcc supports __builtin_expect])

AC_TRY_LINK(, [
return __builtin_expect(1, 1) ? 1 : 0
],
[
ac_have_builtin_expect=yes
AC_MSG_RESULT([yes])
], [
ac_have_builtin_expect=no
AC_MSG_RESULT([no])
])
if test x$ac_have_builtin_expect = xyes ; then
  AC_DEFINE(HAVE_BUILTIN_EXPECT, 1, [Define to 1 if gcc supports __builtin_expect.])
fi


# does this compiler have built-in functions for atomic memory access ?
AC_MSG_CHECKING([if gcc supports __sync_bool_compare_and_swap])

AC_TRY_LINK(,
[
  int variable = 1;
  return (__sync_bool_compare_and_swap(&variable, 1, 2)
         && __sync_add_and_fetch(&variable, 1) ? 1 : 0
],
[
  AC_MSG_RESULT([yes])
  AC_DEFINE(HAVE_BUILTIN_ATOMIC, 1, [Define to 1 if gcc supports __sync_bool_compare_and_swap() a.o.])
],
[
  AC_MSG_RESULT([no])
])


# does the ppc assembler support "mtocrf" et al?
AC_MSG_CHECKING([if ppc32/64 as supports mtocrf/mfocrf])

AC_TRY_COMPILE(, [
__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 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_TRY_COMPILE(, [
  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])

AC_TRY_COMPILE(, [
  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])
])

AM_CONDITIONAL(BUILD_SSSE3_TESTS, test x$ac_have_as_ssse3 = xyes)


# Check for TLS support in the compiler and linker
if test "x${cross_compiling}" = "xno"; then
# 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.
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])])])
else
# 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_LINK_IFELSE([AC_LANG_PROGRAM([[static __thread int foo;]],
                                                [[return foo;]])],
                               [vg_cv_tls=yes],
                               [vg_cv_tls=no])])])
fi

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([       \
        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      \
        ])

# 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_TYPE_SIGNAL

AC_CHECK_LIB([rt], [clock_gettime])

AC_CHECK_FUNCS([     \
        clock_gettime\
        epoll_create \
        epoll_pwait  \
        floor        \
        klogctl      \
        mallinfo     \
        memchr       \
        memset       \
        mkdir        \
        ppoll        \
        pthread_condattr_setclock \
        semtimedop   \
        signalfd     \
        syscall      \
        strchr       \
        strdup       \
        strpbrk      \
        strrchr      \
        strstr       \
        timerfd      \
        utimensat    \
        ])

# 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=""

# Do we have a useable MPI setup on the primary and/or secondary targets?
# On Linux, by default, assumes mpicc and -m32/-m64
# On AIX, by default, assumes mpxlc and -q32/-q64
# Note: this is a kludge in that it assumes the specified mpicc 
# understands -m32/-m64/-q32/-q64 regardless of what is specified using
# --with-mpicc=.
MPI_CC="mpicc"
if test x$VG_PLATFORM_PRI = xPPC32_AIX5 \
     -o x$VG_PLATFORM_PRI = xPPC64_AIX5 ; then
  MPI_CC="mpxlc"
fi

mflag_primary=
if test x$VG_PLATFORM_PRI = xX86_LINUX \
     -o x$VG_PLATFORM_PRI = xPPC32_LINUX ; then
  mflag_primary=$FLAG_M32
elif test x$VG_PLATFORM_PRI = xAMD64_LINUX \
       -o x$VG_PLATFORM_PRI = xPPC64_LINUX ; then
  mflag_primary=$FLAG_M64
elif test x$VG_PLATFORM_PRI = xPPC32_AIX5 ; then
  mflag_primary=-q32
elif test x$VG_PLATFORM_PRI = xPPC64_AIX5 ; then
  mflag_primary=-q64
fi

mflag_secondary=
if test x$VG_PLATFORM_SEC = xX86_LINUX \
     -o x$VG_PLATFORM_SEC = xPPC32_LINUX ; then
  mflag_secondary=$FLAG_M32
elif test x$VG_PLATFORM_SEC = xPPC32_AIX5 ; then
  mflag_secondary=-q32
fi


AC_ARG_WITH(mpicc,
   [  --with-mpicc=           Specify name of MPI2-ised C compiler],
   MPI_CC=$withval
)
AC_SUBST(MPI_CC)

## 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=$mflag_primary
AC_TRY_LINK([
#include <mpi.h>
#include <stdio.h>
],[
  int r = MPI_Init(NULL,NULL);
  r |= MPI_Type_get_contents( MPI_INT, 0,0,0, NULL,NULL,NULL );
  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
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
if test x$VG_PLATFORM_SEC = x ; then
  CC="$MPI_CC this will surely fail"
else
  CC=$MPI_CC
fi
CFLAGS=$mflag_secondary
AC_TRY_LINK([
#include <mpi.h>
#include <stdio.h>
],[
  int r = MPI_Init(NULL,NULL);
  r |= MPI_Type_get_contents( MPI_INT, 0,0,0, NULL,NULL,NULL );
  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
AM_CONDITIONAL(BUILD_MPIWRAP_SEC, test x$ac_have_mpi2_sec = xyes)


# The test below verifies whether the QtCore package been installed.
# This test works as follows:
# - If pkg-config was not installed at the time autogen.sh was run,
#   the definition of the PKG_CHECK_EXISTS() macro will not be found by
#   autogen.sh. Augogen.sh will generate a configure script that prints
#   a warning about pkg-config and proceeds as if Qt4 has not been installed.
# - If pkg-config was installed at the time autogen.sh was run,
#   the generated configure script will try to detect the presence of the
#   Qt4 QtCore library by looking up compile and linker flags in the file
#   called QtCore.pc.
# - pkg-config settings can be overridden via the configure variables
#   QTCORE_CFLAGS and QTCORE_LIBS (added by the pkg-config m4 macro's to the
#   configure script -- see also ./configure --help).
# - The QTCORE_CFLAGS and QTCORE_LIBS configure variables can be used even if
#   the pkg-config executable is not present on the system on which the
#   configure script is run.

ifdef(
  [PKG_CHECK_EXISTS],
  [PKG_CHECK_EXISTS(
    [QtCore],
    [
      PKG_CHECK_MODULES([QTCORE], [QtCore])
      # Paranoia: don't trust the result reported by pkg-config, but when
      # pkg-config reports that QtCore has been found, verify whether linking
      # programs with QtCore succeeds.
      AC_LANG(C++)
      safe_CXXFLAGS="${CXXFLAGS}"
      CXXFLAGS="${QTCORE_CFLAGS} ${QTCORE_LIBS}"
      if test x$vg_cv_only32bit = xyes; then
        CXXFLAGS="${CXXFLAGS} -m32"
      fi
      AC_TRY_LINK(
        [#include <QMutex>],
        [QMutex Mutex;],
        [ac_have_qtcore=yes],
        [
          AC_MSG_WARN([Although pkg-config detected Qt4, linking Qt4 programs fails. Skipping Qt4.])
          ac_have_qtcore=no
        ]
        )
      CXXFLAGS="${safe_CXXFLAGS}"
    ],
    [
      ac_have_qtcore=no
    ]
    )
  ],
  AC_MSG_WARN([pkg-config has not been installed or is too old.])
  AC_MSG_WARN([Detection of Qt4 will be skipped.])
  [ac_have_qtcore=no]
)

AM_CONDITIONAL([HAVE_QTCORE], [test x$ac_have_qtcore = xyes])


# Test for QMutex::tryLock(int), which has been introduced in Qt 4.3.
# See also http://doc.trolltech.com/4.3/qmutex.html.
if test x$ac_have_qtcore = xyes; then
  AC_MSG_CHECKING([for Qt4 QMutex::tryLock(int)])
  AC_LANG(C++)
  safe_CXXFLAGS="${CXXFLAGS}"
  CXXFLAGS="${QTCORE_CFLAGS}"
  AC_TRY_COMPILE([
    #include <QtCore/QMutex>
  ],
  [
    QMutex M;
    M.tryLock(1);
    M.unlock();
    return 0;
  ],
  [
    AC_MSG_RESULT([yes])
    AC_DEFINE([HAVE_QTCORE_QMUTEX_TRYLOCK_INT], [1], [Define to 1 if the installed version of Qt4 provides QMutex::tryLock(int).])
  ],
  [
    AC_MSG_RESULT([no])
  ])
  CXXFLAGS="${safe_CXXFLAGS}"
  AC_LANG(C)
fi


# -------------------- ok.  We're done. --------------------

AC_OUTPUT(
   Makefile 
   valgrind.spec
   valgrind.pc
   glibc-2.X.supp
   docs/Makefile 
   docs/lib/Makefile
   docs/images/Makefile
   docs/internals/Makefile
   docs/xml/Makefile
   tests/Makefile 
   tests/vg_regtest 
   perf/Makefile 
   perf/vg_perf
   include/Makefile 
   include/vki/Makefile 
   auxprogs/Makefile
   coregrind/Makefile 
   memcheck/Makefile
   memcheck/tests/Makefile
   memcheck/tests/amd64/Makefile
   memcheck/tests/ppc32/Makefile
   memcheck/tests/ppc64/Makefile
   memcheck/tests/x86/Makefile
   memcheck/docs/Makefile
   cachegrind/Makefile
   cachegrind/tests/Makefile
   cachegrind/tests/amd64/Makefile
   cachegrind/tests/ppc32/Makefile
   cachegrind/tests/ppc64/Makefile
   cachegrind/tests/x86/Makefile
   cachegrind/docs/Makefile
   cachegrind/cg_annotate
   callgrind/Makefile
   callgrind/callgrind_annotate
   callgrind/callgrind_control
   callgrind/tests/Makefile
   callgrind/docs/Makefile
   helgrind/Makefile
   helgrind/tests/Makefile
   helgrind/docs/Makefile
   massif/Makefile
   massif/tests/Makefile
   massif/perf/Makefile
   massif/docs/Makefile
   massif/ms_print
   lackey/Makefile
   lackey/tests/Makefile
   lackey/docs/Makefile
   none/Makefile
   none/tests/Makefile
   none/tests/amd64/Makefile
   none/tests/ppc32/Makefile
   none/tests/ppc64/Makefile
   none/tests/x86/Makefile
   none/docs/Makefile
   exp-omega/Makefile
   exp-omega/tests/Makefile
   exp-omega/docs/Makefile
   exp-ptrcheck/Makefile
   exp-ptrcheck/tests/Makefile
   exp-ptrcheck/docs/Makefile
   drd/Makefile
   drd/docs/Makefile
   drd/scripts/download-and-build-splash2
   drd/tests/Makefile
)

cat<<EOF

 configure.in: VG_ARCH_MAX = ${VG_ARCH_MAX}
 configure.in: VG_ARCH_PRI = ${VG_ARCH_PRI}

       Primary build target: ${VG_PLATFORM_PRI}
     Secondary build target: ${VG_PLATFORM_SEC}
         Default supp files: ${DEFAULT_SUPP}

EOF

cat<<EOF > default.supp
# This is a generated file, composed of the following suppression rules:
#
#      ${DEFAULT_SUPP}
#

EOF

for file in ${DEFAULT_SUPP} ; do
    cat ${srcdir}/$file >> default.supp
done
