diff options
author | Ralf Wildenhues <Ralf.Wildenhues@gmx.de> | 2011-04-02 14:52:20 +0200 |
---|---|---|
committer | Ralf Wildenhues <Ralf.Wildenhues@gmx.de> | 2011-04-02 15:06:29 +0200 |
commit | 1c3373c5f06e4c2d2551354f03b8da5c0f831040 (patch) | |
tree | ef838f512b030e19968a68f0b64a4144a66e4c6b | |
parent | ac427166c5945445e307c82d44301da9480f017a (diff) | |
download | autoconf-1c3373c5f06e4c2d2551354f03b8da5c0f831040.tar.gz |
New macro AC_FC_PP_SRCEXT for preprocessed file extensions.
* lib/autoconf/fortran.m4 (AC_FC_PP_SRCEXT): New macro.
* lib/autom4te.in (Automake-preselections): Preselect it.
* doc/autoconf.texi (Fortran Compiler): Document it, rewriting
the documentation for AC_FC_SRCEXT along the way.
* tests/fortran.at (AC_FC_PP_SRCEXT usage): New test.
* tests/mktests.sh: Exclude the macro from default testing.
* NEWS: Update.
Signed-off-by: Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | doc/autoconf.texi | 63 | ||||
-rw-r--r-- | lib/autoconf/fortran.m4 | 99 | ||||
-rw-r--r-- | lib/autom4te.in | 1 | ||||
-rw-r--r-- | tests/fortran.at | 100 | ||||
-rwxr-xr-x | tests/mktests.sh | 2 |
7 files changed, 253 insertions, 22 deletions
@@ -1,5 +1,14 @@ 2011-04-02 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> + New macro AC_FC_PP_SRCEXT for preprocessed file extensions. + * lib/autoconf/fortran.m4 (AC_FC_PP_SRCEXT): New macro. + * lib/autom4te.in (Automake-preselections): Preselect it. + * doc/autoconf.texi (Fortran Compiler): Document it, rewriting + the documentation for AC_FC_SRCEXT along the way. + * tests/fortran.at (AC_FC_PP_SRCEXT usage): New test. + * tests/mktests.sh: Exclude the macro from default testing. + * NEWS: Update. + New macro AC_FC_MODULE_OUTPUT_FLAG: module output directory. * lib/autoconf/fortran.m4 (AC_FC_MODULE_OUTPUT_FLAG): New macro. * doc/autoconf.texi (Fortran Compiler): Document it. @@ -19,6 +19,7 @@ GNU Autoconf NEWS - User visible changes. AC_FC_MODULE_EXTENSION to compute the Fortran 90 module name extension AC_FC_MODULE_FLAG for the Fortran 90 module search path flag AC_FC_MODULE_OUTPUT_FLAG for the Fortran 90 module output directory flag + AC_FC_PP_SRCEXT for preprocessed Fortran source files extensions * Noteworthy changes in release 2.68 (2010-09-22) [stable] Released by Eric Blake, based on git versions 2.67.*. diff --git a/doc/autoconf.texi b/doc/autoconf.texi index cfedf1d0..730b590f 100644 --- a/doc/autoconf.texi +++ b/doc/autoconf.texi @@ -8198,47 +8198,68 @@ to call Fortran routines from some language other than C/C++. @defmac AC_FC_SRCEXT (@var{ext}, @ovar{action-if-success}, @ @dvar{action-if-failure, AC_MSG_FAILURE}) +@defmacx AC_FC_PP_SRCEXT (@var{ext}, @ovar{action-if-success}, @ + @dvar{action-if-failure, AC_MSG_FAILURE}) @acindex{FC_SRCEXT} +@acindex{FC_PP_SRCEXT} +@caindex fc_srcext_@var{ext} +@caindex fc_pp_srcext_@var{ext} By default, the @code{FC} macros perform their tests using a @file{.f} extension for source-code files. Some compilers, however, only enable newer language features for appropriately named files, e.g., Fortran 90 -features only for @file{.f90} files. On the other hand, some other -compilers expect all source files to end in @file{.f} and require -special flags to support other file name extensions. The -@code{AC_FC_SRCEXT} macro deals with both of these issues. - -The @code{AC_FC_SRCEXT} tries to get the @code{FC} compiler to accept files -ending with the extension .@var{ext} (i.e., @var{ext} does @emph{not} -contain the dot). If any special compiler flags are needed for this, it -stores them in the output variable @code{FCFLAGS_}@var{ext}. This -extension and these flags are then used for all subsequent @code{FC} tests -(until @code{AC_FC_SRCEXT} is called again). +features only for @file{.f90} files, or preprocessing only with +@file{.F} files or maybe other upper-case extensions. On the other +hand, some other compilers expect all source files to end in @file{.f} +and require special flags to support other file name extensions. The +@code{AC_FC_SRCEXT} and @code{AC_FC_PP_SRCEXT} macros deal with these +issues. + +The @code{AC_FC_SRCEXT} macro tries to get the @code{FC} compiler to +accept files ending with the extension @file{.@var{ext}} (i.e., +@var{ext} does @emph{not} contain the dot). If any special compiler +flags are needed for this, it stores them in the output variable +@code{FCFLAGS_@var{ext}}. This extension and these flags are then used +for all subsequent @code{FC} tests (until @code{AC_FC_SRCEXT} or +@code{AC_FC_PP_SRCEXT} is called another time). For example, you would use @code{AC_FC_SRCEXT(f90)} to employ the @file{.f90} extension in future tests, and it would set the @code{FCFLAGS_f90} output variable with any extra flags that are needed to compile such files. -The @code{FCFLAGS_}@var{ext} can @emph{not} be simply absorbed into -@code{FCFLAGS}, for two reasons based on the limitations of some -compilers. First, only one @code{FCFLAGS_}@var{ext} can be used at a +Similarly, the @code{AC_FC_PP_SRCEXT} macro tries to get the @code{FC} +compiler to preprocess and compile files with the extension +@file{.@var{ext}}. When both @command{fpp} and @command{cpp} style +preprocessing are provided, the former is preferred, as the latter may +treat continuation lines, @code{//} tokens, and white space differently +from what some Fortran dialects expect. Conversely, if you do not want +files to be preprocessed, use only lower-case characters in the file +name extension. Like with @code{AC_FC_SRCEXT(f90)}, any needed flags +are stored in the @code{FCFLAGS_@var{ext}} variable. + +The @code{FCFLAGS_@var{ext}} flags can @emph{not} be simply absorbed +into @code{FCFLAGS}, for two reasons based on the limitations of some +compilers. First, only one @code{FCFLAGS_@var{ext}} can be used at a time, so files with different extensions must be compiled separately. -Second, @code{FCFLAGS_}@var{ext} must appear @emph{immediately} before +Second, @code{FCFLAGS_@var{ext}} must appear @emph{immediately} before the source-code file name when compiling. So, continuing the example above, you might compile a @file{foo.f90} file in your makefile with the command: @example foo.o: foo.f90 - $(FC) -c $(FCFLAGS) $(FCFLAGS_f90) '$(srcdir)/foo.f90' + $(FC) -c $(FCFLAGS) $(FCFLAGS_f90) '$(srcdir)/foo.f90' @end example -If @code{AC_FC_SRCEXT} succeeds in compiling files with the @var{ext} -extension, it calls @var{action-if-success} (defaults to nothing). If -it fails, and cannot find a way to make the @code{FC} compiler accept such -files, it calls @var{action-if-failure} (defaults to exiting with an -error message). +If @code{AC_FC_SRCEXT} or @code{AC_FC_PP_SRCEXT} succeeds in compiling +files with the @var{ext} extension, it calls @var{action-if-success} +(defaults to nothing). If it fails, and cannot find a way to make the +@code{FC} compiler accept such files, it calls @var{action-if-failure} +(defaults to exiting with an error message). +The @code{AC_FC_SRCEXT} and @code{AC_FC_PP_SRCEXT} macros cache their +results in @code{ac_cv_fc_srcext_@var{ext}} and +@code{ac_cv_fc_pp_srcext_@var{ext}} variables, respectively. @end defmac @defmac AC_FC_FREEFORM (@ovar{action-if-success}, @dvar{action-if-failure, @ diff --git a/lib/autoconf/fortran.m4 b/lib/autoconf/fortran.m4 index 9a37604f..1c313926 100644 --- a/lib/autoconf/fortran.m4 +++ b/lib/autoconf/fortran.m4 @@ -1176,6 +1176,105 @@ AC_LANG_POP(Fortran)dnl ])# AC_FC_SRCEXT +# AC_FC_PP_SRCEXT(EXT, [ACTION-IF-SUCCESS], [ACTION-IF-FAILURE]) +# -------------------------------------------------------------- +# Like AC_FC_SRCEXT, set the source-code extension used in Fortran (FC) tests +# to EXT (which defaults to f). Also, look for any necessary additional +# FCFLAGS needed to allow this extension for preprocessed Fortran, and store +# them in the output variable FCFLAGS_<EXT> (e.g. FCFLAGS_f90 for EXT=f90). +# If successful, call ACTION-IF-SUCCESS. If unable to compile preprocessed +# source code with EXT, call ACTION-IF-FAILURE, which defaults to failing with +# an error message. +# +# Some compilers allow preprocessing with either a Fortran preprocessor or +# with the C preprocessor (cpp). Prefer the Fortran preprocessor, to deal +# correctly with continuation lines, `//' (not a comment), and preserve white +# space (for fixed form). +# +# (The flags for the current source-code extension, if any, are stored in +# $ac_fcflags_srcext and used automatically in subsequent autoconf tests.) +# +# For ordinary extensions like f90, etcetera, the modified FCFLAGS +# are needed for IBM's xlf*. Also, for Intel's ifort compiler, the +# $FCFLAGS_<EXT> variable *must* go immediately before the source file on the +# command line, unlike other $FCFLAGS. Ugh. +# +# Known extensions that enable preprocessing by default, and flags to force it: +# GNU: .F .F90 .F95 .F03 .F08, -cpp for most others, +# -x f77-cpp-input for .f77 .F77; -x f95-cpp-input for gfortran < 4.4 +# SGI: .F .F90, -ftpp or -cpp for .f .f90, -E write preproc to stdout +# -macro_expand enable macro expansion everywhere (with -ftpp) +# -P preproc only, save in .i, no #line's +# SUN: .F .F95, -fpp for others; -xpp={fpp,cpp} for preprocessor selection +# -F preprocess only (save in lowercase extension) +# IBM: .F .F77 .F90 .F95 .F03, -qsuffix=cpp=EXT for extension .EXT to invoke cpp +# -WF,-qnofpp -WF,-qfpp=comment:linecont:nocomment:nolinecont +# -WF,-qlanglvl=classic or not -qnoescape (trigraph problems) +# -d no #line in output, -qnoobject for preprocessing only (output in .f) +# -q{no,}ppsuborigarg substitute original macro args before expansion +# HP: .F, +cpp={yes|no|default} use cpp, -cpp, +cpp_keep save in .i/.i90 +# PGI: -Mpreprocess +# Absoft: .F .FOR .F90 .F95, -cpp for others +# Cray: .F .F90 .FTN, -e Z for others; -F enable macro expansion everywhere +# Intel: .F .F90, -fpp for others, but except for .f and .f90, -Tf may also be +# needed right before the source file name +# PathScale: .F .F90 .F95, -ftpp or -cpp for .f .f90 .f95 +# -macro_expand for expansion everywhere, -P for no #line in output +# Lahey: .F .FOR .F90 .F95, -Cpp +# NAGWare: .F .F90 .F95, .ff .ff90 .ff95 (new), -fpp for others +# Compaq/Tru64: .F .F90, -cpp, -P keep .i file, -P keep .i file +# f2c: .F, -cpp +# g95: .F .FOR .F90 .F95 .F03, -cpp -no-cpp, -E for stdout +AC_DEFUN([AC_FC_PP_SRCEXT], +[AC_LANG_PUSH(Fortran)dnl +AC_CACHE_CHECK([for Fortran flag to compile preprocessed .$1 files], + ac_cv_fc_pp_srcext_$1, +[ac_ext=$1 +ac_fcflags_pp_srcext_save=$ac_fcflags_srcext +ac_fcflags_srcext= +ac_cv_fc_pp_srcext_$1=unknown +case $ac_ext in #( + [[fF]]77) ac_try=f77-cpp-input;; #( + *) ac_try=f95-cpp-input;; +esac +for ac_flag in none -ftpp -fpp -Tf "-fpp -Tf" -xpp=fpp -Mpreprocess "-e Z" \ + -cpp -xpp=cpp -qsuffix=cpp=$1 "-x $ac_try" +cpp -Cpp; do + test "x$ac_flag" != xnone && ac_fcflags_srcext="$ac_flag" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[ +#if 0 +#include <ac_nonexistent.h> + choke me +#endif]])], + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[ +#if 1 +#include <ac_nonexistent.h> + choke me +#endif]])], + [], + [ac_cv_fc_pp_srcext_$1=$ac_flag; break])]) +done +rm -f conftest.$ac_objext conftest.$1 +ac_fcflags_srcext=$ac_fcflags_pp_srcext_save +]) +if test "x$ac_cv_fc_pp_srcext_$1" = xunknown; then + m4_default([$3], + [AC_MSG_ERROR([Fortran could not compile preprocessed .$1 files])]) +else + ac_fc_srcext=$1 + if test "x$ac_cv_fc_pp_srcext_$1" = xnone; then + ac_fcflags_srcext="" + FCFLAGS_[]$1[]="" + else + ac_fcflags_srcext=$ac_cv_fc_pp_srcext_$1 + FCFLAGS_[]$1[]=$ac_cv_fc_pp_srcext_$1 + fi + AC_SUBST(FCFLAGS_[]$1) + $2 +fi +AC_LANG_POP(Fortran)dnl +])# AC_FC_PP_SRCEXT + + # AC_FC_FREEFORM([ACTION-IF-SUCCESS], [ACTION-IF-FAILURE = FAILURE]) # ------------------------------------------------------------------ # Look for a compiler flag to make the Fortran (FC) compiler accept diff --git a/lib/autom4te.in b/lib/autom4te.in index 05b325ff..0f868429 100644 --- a/lib/autom4te.in +++ b/lib/autom4te.in @@ -44,6 +44,7 @@ args: --preselect AC_CONFIG_LIBOBJ_DIR args: --preselect AC_CONFIG_LINKS args: --preselect AC_FC_FREEFORM args: --preselect AC_FC_SRCEXT +args: --preselect AC_FC_PP_SRCEXT args: --preselect AC_INIT args: --preselect AC_LIBSOURCE args: --preselect AC_REQUIRE_AUX_FILE diff --git a/tests/fortran.at b/tests/fortran.at index 208c4666..524a8c38 100644 --- a/tests/fortran.at +++ b/tests/fortran.at @@ -714,6 +714,106 @@ AT_CHECK([$MAKE], [], [ignore], [ignore]) AT_CLEANUP +## ---------------------- ## +## AC_FC_PP_SRCEXT usage. ## +## ---------------------- ## + +AT_SETUP([AC_FC_PP_SRCEXT usage]) + +AT_DATA([configure.ac], +[[AC_INIT +AC_PROG_FC +# Unconditionally require .f and .F to work. +AC_FC_PP_SRCEXT([f]) +AC_FC_PP_SRCEXT([F]) +# For each other extension, fail gracefully if it does not work: +# Not all compilers support all extensions/language versions. +m4@&t@_foreach([ext], [f77, f90, f95, f03, f08], + [AC_FC_PP_SRCEXT(ext, ext[_object='foo]ext[.$(OBJEXT)'], ext[_object=]) + AC_SUBST(ext[_object])]) +m4@&t@_foreach([ext], [F77, F90, F95, F03, F08], + [AC_FC_PP_SRCEXT(ext, ext[_object='bar]ext[.$(OBJEXT)'], ext[_object=]) + AC_SUBST(ext[_object])]) +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT +]]) + +AT_DATA([Makefile.in], +[[OBJEXT = @OBJEXT@ + +all: prog@EXEEXT@ +prog@EXEEXT@: foof.@OBJEXT@ @f77_object@ @f90_object@ \ + @f95_object@ @f03_object@ @f08_object@ \ + barF.@OBJEXT@ @F77_object@ @F90_object@ \ + @F95_object@ @F03_object@ @F08_object@ + @FC@ @FCFLAGS@ -o $@ foof.@OBJEXT@ @f77_object@ @f90_object@ \ + @f95_object@ @f03_object@ @f08_object@ \ + barF.@OBJEXT@ @F77_object@ @F90_object@ \ + @F95_object@ @F03_object@ @F08_object@ + +.SUFFIXES: .f .f77 .f90 .f95 .f03 .f08 .F .F77 .F90 .F95 .F03 .F08 .@OBJEXT@ +.f.@OBJEXT@: + @FC@ -c @FCFLAGS@ @FCFLAGS_f@ $< +.f77.@OBJEXT@: + @FC@ -c @FCFLAGS@ @FCFLAGS_f77@ $< +.f90.@OBJEXT@: + @FC@ -c @FCFLAGS@ @FCFLAGS_f90@ $< +.f95.@OBJEXT@: + @FC@ -c @FCFLAGS@ @FCFLAGS_f95@ $< +.f03.@OBJEXT@: + @FC@ -c @FCFLAGS@ @FCFLAGS_f03@ $< +.f08.@OBJEXT@: + @FC@ -c @FCFLAGS@ @FCFLAGS_f08@ $< +.F.@OBJEXT@: + @FC@ -c @FCFLAGS@ @FCFLAGS_F@ $< +.F77.@OBJEXT@: + @FC@ -c @FCFLAGS@ @FCFLAGS_F77@ $< +.F90.@OBJEXT@: + @FC@ -c @FCFLAGS@ @FCFLAGS_F90@ $< +.F95.@OBJEXT@: + @FC@ -c @FCFLAGS@ @FCFLAGS_F95@ $< +.F03.@OBJEXT@: + @FC@ -c @FCFLAGS@ @FCFLAGS_F03@ $< +.F08.@OBJEXT@: + @FC@ -c @FCFLAGS@ @FCFLAGS_F08@ $< +]]) + +for ext in f77 f90 f95 f03 f08; do + cat > foo$ext.$ext <<EOF + subroutine foo$ext +#if 0 +this is not correct fortran +#endif + end +EOF +done + +for ext in F F77 F90 F95 F03 F08; do + cat > bar$ext.$ext <<EOF + subroutine bar$ext +#if 0 +this is not correct fortran +#endif + end +EOF +done + +AT_DATA([foof.f], +[[ program main +#if 0 +this is not correct fortran +#endif + end +]]) + +AT_CHECK_AUTOCONF +AT_CHECK_CONFIGURE +: "${MAKE=make}" +AT_CHECK([$MAKE], [], [ignore], [ignore]) + +AT_CLEANUP + + ## --------------- ## ## AC_FC_FREEFORM. ## ## --------------- ## diff --git a/tests/mktests.sh b/tests/mktests.sh index 3559f0c2..908092ac 100755 --- a/tests/mktests.sh +++ b/tests/mktests.sh @@ -100,7 +100,7 @@ ac_exclude_list=' # Produce "= val" because $1, the variable used to store the result, # is empty. /^AC_(F77|FC)_FUNC$/ {next} - /^AC_FC_SRCEXT$/ {next} + /^AC_FC_(PP_)?SRCEXT$/ {next} /^AC_PATH_((TARGET_)?TOOL|PROG)S?$/ {next} # Is a number. |