279 lines (255 with data), 8.9 kB
# Check for some compiler version and options, Marc Tittgemeyer 04-04-03
# adapted from
# acinclude.m4 distributed with FFT-3.0, http://www.fftw.org
AC_DEFUN([ACX_CHECK_CXX_FLAGS],
[
AC_REQUIRE([AC_PROG_CXX])
ac_save_CXXFLAGS=$CXXFLAGS
CXXFLAGS="$1"
AC_CACHE_CHECK(whether $CXX accepts $1, ac_$2,
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [ac_$2=yes],
[ac_$2=no])])
CXXFLAGS=$ac_save_CXXFLAGS
if test "$ac_$2" = yes; then
:
$3
else
:
$4
fi
])
AC_DEFUN([ACX_PROG_GXX_VERSION],
[
AC_REQUIRE([AC_PROG_CXX])
AC_LANG_PUSH(C++)
AC_CACHE_CHECK(whether we are using g++ $1.$2 or later, ac_cv_prog_cxx_$1_$2,
[
dnl The semicolon after "yes" below is to pacify NeXT's syntax-checking cxxcpp.
cat > conftest.cc <<EOF
#ifdef __GNUC__ && define __cplusplus
# if (__GNUC__ > $1) || (__GNUC__ == $1 && __GNUC_MINOR__ >= $2)
yes;
# endif
#endif
EOF
if AC_TRY_COMMAND(${CXX-c++} -E conftest.cc) | egrep yes >/dev/null 2>&1; then
ac_cv_prog_cxx_$1_$2=yes
else
ac_cv_prog_cxx_$1_$2=no
fi
])
AC_LANG_POP(C++)
if test "$ac_cv_prog_cxx_$1_$2" = yes; then
:
$3
else
:
$4
fi
])
AC_DEFUN([ACX_PROG_CXX_EGCS],
[ACX_PROG_GXX_VERSION(2,90,acx_prog_egcs=yes,acx_prog_egcs=no)])
# Check to see if we are using a version of g++ that aligns the stack
# (true in g++-2.95+, which have the -mpreferred-stack-boundary flag).
# Also check for stack alignment bug in g++-2.95.x
# (see http://egcs.cygnus.com/ml/g++-bugs/1999-11/msg00259.html), and
# whether main() is correctly aligned by the OS/libc/loader.
AC_DEFUN([ACX_GXX_ALIGNS_STACK],
[
AC_REQUIRE([AC_PROG_CXX])
acx_gxx_aligns_stack=no
if test "$GXX" = "yes"; then
ACX_CHECK_CXX_FLAGS(-mpreferred-stack-boundary=4, m_pref_stack_boundary_4)
if test "$ac_m_pref_stack_boundary_4" = "yes"; then
AC_MSG_CHECKING([whether the stack is correctly aligned by g++])
save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS="-O -malign-double"
AC_LANG_PUSH(C++)
AC_TRY_RUN([#include <stdlib.h>
# include <stdio.h>
struct yuck { int blechh; };
int one(void) { return 1; }
struct yuck ick(void) { struct yuck y; y.blechh = 3; return y; }
# define CHK_ALIGN(x) if ((((long) &(x)) & 0x7)) { fprintf(stderr, "bad alignment of " #x "\n"); exit(1); }
void blah(int foo) { double foobar; CHK_ALIGN(foobar); }
int main2(void) {double ok1; struct yuck y; double ok2; CHK_ALIGN(ok1);
CHK_ALIGN(ok2); y = ick(); blah(one()); return 0;}
int main(void) { if ((((long) (__builtin_alloca(0))) & 0x7)) __builtin_alloca(4); return main2(); }
], [acx_gxx_aligns_stack=yes; acx_gxx_stack_align_bug=no],
acx_gxx_stack_align_bug=yes, acx_gxx_stack_align_bug=yes)
AC_LANG_POP(C++)
CXXFLAGS="$save_CXXFLAGS"
AC_MSG_RESULT($acx_gxx_aligns_stack)
fi
fi
if test "$acx_gxx_aligns_stack" = yes; then
:
$1
else
:
$2
fi
])
AC_DEFUN([ACX_PROG_CXX_MAXOPT],
[
AC_REQUIRE([AC_PROG_CXX])
AC_REQUIRE([ACX_PROG_CXX_EGCS])
AC_REQUIRE([AC_CANONICAL_HOST])
# Try to determine "good" native compiler flags if none specified on command
# line
if test "$ac_test_CXXFLAGS" != "set"; then
CXXFLAGS=""
case "${host_cpu}-${host_os}" in
*linux*)
;;
sparc-solaris2*) if test `basename "$CXX"` = c++; then
CXXFLAGS="-native -fast -xO5 -dalign"
fi;;
alpha*-osf*) if test "$CXX" = c++; then
CXXFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host -arch host"
fi;;
hppa*-hpux*) if test "$ac_compiler_gnu" != yes; then
CXXFLAGS="+O3 +Oall +Ofltac++"
fi;;
*-aix*)
if test "$CXX" = c++ -o "$CXX" = xlc; then
ACX_CHECK_CXX_FLAGS(-qarch=auto -qtune=auto, qarch_auto,
CXXFLAGS="-O3 -qansialias -w -qarch=auto -qtune=auto",
[CXXFLAGS="-O3 -qansialias -w"
echo "*******************************************************"
echo "* You seem to have AIX and the IBM compiler. It is *"
echo "* recommended for best performance that you use: *"
echo "* *"
echo "* CXXFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *"
echo "* ^^^ ^^^ *"
echo "* where xxx is pwr2, pwr3, 604, or whatever kind of *"
echo "* CPU you have. (Set the CXXFLAGS environment var. *"
echo "* and re-run configure.) For more info, man c++. *"
echo "*******************************************************"])
fi;;
esac
# use default flags for g++ on all systems
if test $ac_cv_prog_cxx_g = yes; then
CXXFLAGS="-fomit-frame-pointer"
fi
# the egcs scheduler is too smart and destroys our own schedule.
# Disable the first instruction scheduling pass. The second
# scheduling pass (after register reload) is ok.
if test "$acx_prog_egcs" = yes; then
if test "$1" = libmona; then
CXXFLAGS="$CXXFLAGS -fno-schedule-insns"
fi
fi
# test for g++-specific flags:
if test $ac_cv_prog_cxx_g = yes; then
# -malign-double for x86 systems
ACX_CHECK_CXX_FLAGS(-malign-double,align_double,
CXXFLAGS="$CXXFLAGS -malign-double")
# -fstrict-aliasing for g++-2.95+
ACX_CHECK_CXX_FLAGS(-fstrict-aliasing,fstrict_aliasing,
CXXFLAGS="$CXXFLAGS -fstrict-aliasing")
ACX_CHECK_CXX_FLAGS(-mpreferred-stack-boundary=4, m_psb_4,
CXXFLAGS="$CXXFLAGS -mpreferred-stack-boundary=4")
fi
CPU_FLAGS=""
CPU_OPTIM=""
CODELET_OPTIM=""
if test "$GXX" = "yes"; then
CPU_OPTIM=-O3
CODELET_OPTIM=-O3
dnl try to guess correct CPU flags, at least for linux
case "${host_cpu}" in
i586*) ACX_CHECK_CXX_FLAGS(-mcpu=i585,cpu_i586,
[CPU_FLAGS=-mcpu=i586],
[ACX_CHECK_CXX_FLAGS(-mpentium,pentium,
[CPU_FLAGS=-mpentium])])
if test "$1" = libmona; then
CODELET_OPTIM=-O
fi
if test "$1" = benchlibmona; then
CPU_OPTIM=-O2
fi
;;
i686*) ACX_CHECK_CXX_FLAGS(-mcpu=i686,cpu_i686,
[CPU_FLAGS=-mcpu=i686],
[ACX_CHECK_CXX_FLAGS(-mpentiumpro,pentiumpro,
[CPU_FLAGS=-mpentiumpro])])
if test "$1" = libmona; then
CODELET_OPTIM=-O
fi
if test "$1" = benchlibmona; then
CPU_OPTIM=-O2
fi
;;
sparc*) ACX_CHECK_CXX_FLAGS(-mcpu=ultrasparc,cpu_ultrasparc,
[CPU_FLAGS=-mcpu=ultrasparc])
;;
alphaev67) ACX_CHECK_CXX_FLAGS(-mcpu=ev67,cpu_ev67,
[CPU_FLAGS=-mcpu=ev67])
;;
alphaev6) ACX_CHECK_CXX_FLAGS(-mcpu=ev6,cpu_ev6,
[CPU_FLAGS=-mcpu=ev6])
;;
alphaev56) ACX_CHECK_CXX_FLAGS(-mcpu=ev56,cpu_ev56,
[CPU_FLAGS=-mcpu=ev56],
[ACX_CHECK_CXX_FLAGS(-mcpu=ev5,cpu_ev5,
[CPU_FLAGS=-mcpu=ev5])])
;;
alphaev5) ACX_CHECK_CXX_FLAGS(-mcpu=ev5,cpu_ev5,
[CPU_FLAGS=-mcpu=ev5])
;;
powerpc*)
cputype=`((grep cpu /proc/cpuinfo | head -1 | cut -d: -f2 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine) 2> /dev/null`
cputype=`echo $cputype | sed -e s/ppc//g`
is60x=`echo $cputype | egrep "^60[[0-9]]e?$"`
is750=`echo $cputype | grep "750"`
is74xx=`echo $cputype | egrep "^74[[0-9]][[0-9]]$"`
if test -n "$is60x"; then
ACX_CHECK_CXX_FLAGS(-mcpu=$cputype,m_cpu_60x,
CPU_FLAGS=-mcpu=$cputype)
elif test -n "$is750"; then
ACX_CHECK_CXX_FLAGS(-mcpu=750,m_cpu_750,
CPU_FLAGS=-mcpu=750)
elif test -n "$is74xx"; then
ACX_CHECK_CXX_FLAGS(-mcpu=$cputype,m_cpu_74xx,
CPU_FLAGS=-mcpu=$cputype)
fi
if test -z "$CPU_FLAGS"; then
ACX_CHECK_CXX_FLAGS(-mcpu=powerpc,m_cpu_powerpc,
CPU_FLAGS=-mcpu=powerpc)
fi
if test -z "$CPU_FLAGS"; then
ACX_CHECK_CXX_FLAGS(-mpowerpc,m_powerpc,
CPU_FLAGS=-mpowerpc)
fi
esac
fi
if test -n "$CPU_OPTIM"; then
CXXFLAGS="$CPU_OPTIM $CXXFLAGS"
fi
if test -n "$CPU_FLAGS"; then
CXXFLAGS="$CXXFLAGS $CPU_FLAGS"
fi
AC_SUBST(CODELET_OPTIM)
if test -z "$CXXFLAGS"; then
echo ""
echo "**********************************************************"
echo "* WARNING: Don't know the best CXXFLAGS for this system *"
echo "* Use make CXXFLAGS=..., or edit the top level Makefile *"
echo "* (otherwise, a default of CXXFLAGS=-O3 will be used) *"
echo "**********************************************************"
echo ""
CXXFLAGS="-O3"
fi
ACX_CHECK_CXX_FLAGS(${CXXFLAGS}, guessed_cflags, , [
echo ""
echo "**********************************************************"
echo "* WARNING: The guessed CXXFLAGS don't seem to work with *"
echo "* your compiler. *"
echo "* Use make CXXFLAGS=..., or edit the top level Makefile *"
echo "**********************************************************"
echo ""
CXXFLAGS=""
])
fi
])