AC_DEFUN(ACX_CHECK_CC_FLAGS, [ AC_REQUIRE([AC_PROG_CC]) AC_CACHE_CHECK(whether ${CC-cc} accepts $1, ac_$2, [echo 'void f(){}' > conftest.c if test -z "`${CC-cc} $1 -c conftest.c 2>&1`"; then ac_$2=yes else ac_$2=no fi rm -f conftest* ]) if test "$ac_$2" = yes; then : $3 else : $4 fi ]) AC_DEFUN(ACX_PROG_GCC_VERSION, [ AC_REQUIRE([AC_PROG_CC]) AC_CACHE_CHECK(whether we are using gcc $1.$2 or later, ac_cv_prog_gcc_$1_$2, [ dnl The semicolon after "yes" below is to pacify NeXT's syntax-checking cpp. cat > conftest.c < $1) || (__GNUC__ == $1 && __GNUC_MINOR__ >= $2) yes; # endif #endif EOF if AC_TRY_COMMAND(${CC-cc} -E conftest.c) | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc_$1_$2=yes else ac_cv_prog_gcc_$1_$2=no fi ]) if test "$ac_cv_prog_gcc_$1_$2" = yes; then : $3 else : $4 fi ]) AC_DEFUN(ACX_PROG_CC_EGCS, [ACX_PROG_GCC_VERSION(2,90,acx_prog_egcs=yes,acx_prog_egcs=no)]) # Check to see if we are using a version of gcc that aligns the stack # (true in gcc-2.95+, which have the -mpreferred-stack-boundary flag). # Also check for stack alignment bug in gcc-2.95.x # (see http://egcs.cygnus.com/ml/gcc-bugs/1999-11/msg00259.html), and # whether main() is correctly aligned by the OS/libc/loader. AC_DEFUN(ACX_GCC_ALIGNS_STACK, [ AC_REQUIRE([AC_PROG_CC]) acx_gcc_aligns_stack=no if test "$GCC" = "yes"; then ACX_CHECK_CC_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 gcc]) save_CFLAGS="$CFLAGS" CFLAGS="-O -malign-double" AC_TRY_RUN([#include # include 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 main(void) { double ok1; struct yuck y; double ok2; CHK_ALIGN(ok1); CHK_ALIGN(ok2); y = ick(); blah(one()); return 0; } ], [acx_gcc_aligns_stack=yes; acx_gcc_stack_align_bug=no], acx_gcc_stack_align_bug=yes, acx_gcc_stack_align_bug=yes) CFLAGS="$save_CFLAGS" AC_MSG_RESULT($acx_gcc_aligns_stack) fi fi if test "$acx_gcc_aligns_stack" = yes; then : $1 else : $2 fi ]) AC_DEFUN(ACX_PROG_CC_MAXOPT, [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([ACX_PROG_CC_EGCS]) AC_REQUIRE([AC_CANONICAL_HOST]) # Try to determine "good" native compiler flags if none specified on command # line if test "$ac_test_CFLAGS" != "set"; then CFLAGS="" case "${host_cpu}-${host_os}" in *linux*) echo "*******************************************************" echo "* Congratulations! You are running linux. *" echo "*******************************************************" ;; sparc-solaris2*) if test "$CC" = cc; then CFLAGS="-native -fast -xO5 -dalign" fi;; alpha*-osf*) if test "$CC" = cc; then CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host -arch host -std1" fi;; hppa*-hpux*) if test "$CC" = cc; then CFLAGS="-Ae +O3 +Oall" fi;; rs6000*-aix*) if test "$CC" = cc -o "$CC" = xlc; then CFLAGS="-O3 -qarch=pwrx -qtune=pwrx -qansialias -w" fi;; powerpc*-aix*) if test "$CC" = cc -o "$CC" = xlc; then CFLAGS="-O3 -qarch=ppc -qansialias -w" echo "*******************************************************" echo "* You have AIX on an unknown powerpc system. It is *" echo "* recommended that you use *" echo "* *" echo "* CFLAGS=-O3 -qarch=ppc -qtune=xxx -qansialias -w *" echo "* ^^^ *" echo "* where xxx is 601, 603, 604, or whatever kind of *" echo "* PowerPC CPU you have. For more info, man cc. *" echo "*******************************************************" fi;; esac # use default flags for gcc on all systems if test $ac_cv_prog_gcc = yes; then CFLAGS="-O6 -fomit-frame-pointer -Wall -W -Wcast-qual -Wpointer-arith -Wcast-align -pedantic" 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 CFLAGS="$CFLAGS -fno-schedule-insns -fschedule-insns2" fi # test for gcc-specific flags: if test $ac_cv_prog_gcc = yes; then # -malign-double for x86 systems ACX_CHECK_CC_FLAGS(-malign-double,align_double, CFLAGS="$CFLAGS -malign-double") # -fstrict-aliasing for gcc-2.95+ ACX_CHECK_CC_FLAGS(-fstrict-aliasing,fstrict_aliasing, CFLAGS="$CFLAGS -fstrict-aliasing") fi CPU_FLAGS="" if test "$GCC" = "yes"; then dnl try to guess correct CPU flags, at least for linux case "${host_cpu}" in i586*) ACX_CHECK_CC_FLAGS(-mcpu=pentium,cpu_pentium, [CPU_FLAGS=-mcpu=pentium], [ACX_CHECK_CC_FLAGS(-mpentium,pentium, [CPU_FLAGS=-mpentium])]) ;; i686*) ACX_CHECK_CC_FLAGS(-mcpu=pentiumpro,cpu_pentiumpro, [CPU_FLAGS=-mcpu=pentiumpro], [ACX_CHECK_CC_FLAGS(-mpentiumpro,pentiumpro, [CPU_FLAGS=-mpentiumpro])]) ;; powerpc*) cputype=`(grep cpu /proc/cpuinfo | head -1 | cut -d: -f2 | sed 's/ //g') 2> /dev/null` is60x=`echo $cputype | egrep "^60[0-9]e?$"` if test -n "$is60x"; then ACX_CHECK_CC_FLAGS(-mcpu=$cputype,m_cpu_60x, CPU_FLAGS=-mcpu=$cputype) elif test "$cputype" = 750; then ACX_PROG_GCC_VERSION(2,95, ACX_CHECK_CC_FLAGS(-mcpu=750,m_cpu_750, CPU_FLAGS=-mcpu=750)) fi if test -z "$CPU_FLAGS"; then ACX_CHECK_CC_FLAGS(-mcpu=powerpc,m_cpu_powerpc, CPU_FLAGS=-mcpu=powerpc) fi if test -z "$CPU_FLAGS"; then ACX_CHECK_CC_FLAGS(-mpowerpc,m_powerpc, CPU_FLAGS=-mpowerpc) fi esac fi if test -n "$CPU_FLAGS"; then CFLAGS="$CFLAGS $CPU_FLAGS" fi if test -z "$CFLAGS"; then echo "" echo "********************************************************" echo "* WARNING: Don't know the best CFLAGS for this system *" echo "* Use make CFLAGS=..., or edit the top level Makefile *" echo "* (otherwise, a default of CFLAGS=-O3 will be used) *" echo "********************************************************" echo "" CFLAGS="-O3" fi ACX_CHECK_CC_FLAGS(${CFLAGS}, guessed_cflags, , [ echo "" echo "********************************************************" echo "* WARNING: The guessed CFLAGS don't seem to work with *" echo "* your compiler. *" echo "* Use make CFLAGS=..., or edit the top level Makefile *" echo "********************************************************" echo "" CFLAGS="" ]) fi ]) dnl--------------------------------------------------------------------------- dnl detect Fortran name-mangling scheme AC_DEFUN(ACX_F77_FUNC_MANGLE, [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_PROG_F77]) AC_REQUIRE([AC_F77_LIBRARY_LDFLAGS]) AC_MSG_CHECKING(how f77 mangles function names) cat > mangle-func.f <&AC_FD_CC cat mangle-func.f >&AC_FD_CC rm -f mangle-func* AC_MSG_ERROR(failed to compile fortran test program) fi ac_f77_mangle_type=unknown AC_LANG_SAVE AC_LANG_C ac_save_LIBS="$LIBS" LIBS="mangle-func.o $FLIBS $LIBS" AC_TRY_LINK(,foobar();, ac_f77_mangle_type=lowercase, AC_TRY_LINK(,foobar_();, ac_f77_mangle_type=lowercase-underscore, AC_TRY_LINK(,FOOBAR();, ac_f77_mangle_type=uppercase, AC_TRY_LINK(,FOOBAR_();, ac_f77_mangle_type=uppercase-underscore)))) LIBS="$ac_save_LIBS" AC_LANG_RESTORE AC_MSG_RESULT($ac_f77_mangle_type) mangle_try=unknown case $ac_f77_mangle_type in lowercase) AC_DEFINE(FFTW_FORTRANIZE_LOWERCASE) mangle_try=foo_bar_ ;; lowercase-underscore) AC_DEFINE(FFTW_FORTRANIZE_LOWERCASE_UNDERSCORE) mangle_try=foo_bar__ ;; uppercase) AC_DEFINE(FFTW_FORTRANIZE_UPPERCASE) mangle_try=FOO_BAR_ ;; uppercase-underscore) AC_DEFINE(FFTW_FORTRANIZE_UPPERCASE_UNDERSCORE) mangle_try=FOO_BAR__ ;; esac AC_MSG_CHECKING(if f77 functions with an underscore get an extra underscore) AC_LANG_SAVE AC_LANG_C ac_save_LIBS="$LIBS" LIBS="mangle-func.o $FLIBS $LIBS" AC_TRY_LINK(,$mangle_try();, [ac_f77_mangle_underscore=yes; AC_DEFINE(FFTW_FORTRANIZE_EXTRA_UNDERSCORE)], [ac_f77_mangle_underscore=no]) LIBS="$ac_save_LIBS" AC_LANG_RESTORE rm -f mangle-func* AC_MSG_RESULT($ac_f77_mangle_underscore) ]) dnl like AC_SUBST, but replace XXX_variable_XXX instead of @variable@ dnl This macro protects VARIABLE from being diverted twice dnl if this macro is called twice for it. dnl AC_SUBST(VARIABLE) define(ACX_SUBST_XXX, [ifdef([ACX_SUBST_XXX_$1], , [define([ACX_SUBST_XXX_$1], )dnl AC_DIVERT_PUSH(AC_DIVERSION_SED)dnl s=XXX_$1_XXX=[$]$1=g AC_DIVERT_POP()dnl ])])