| # -*- Autotest -*- |
| |
| AT_BANNER([Fortran low level compiling/preprocessing macros.]) |
| |
| # Copyright (C) 2000-2001, 2003, 2008-2017, 2020-2026 Free Software |
| # Foundation, Inc. |
| # |
| # This program is free software: you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation, either version 3 of the License, or |
| # (at your option) any later version. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program. If not, see <https://www.gnu.org/licenses/>. |
| |
| # Since the macros which compile are required by most tests, check |
| # them first. But remember that looking for a compiler is even more |
| # primitive, so check those first. |
| |
| |
| ## --------------------- ## |
| ## Fortran 77 Compiler. ## |
| ## --------------------- ## |
| |
| |
| AT_CHECK_MACRO([GNU Fortran 77], |
| [[AC_LANG(Fortran 77) |
| AC_LANG_COMPILER |
| |
| : > conftest.f |
| if AC_TRY_COMMAND([$F77 --version | grep GNU >&2]) \ |
| || AC_TRY_COMMAND([$F77 -v -c conftest.f 2>&1 | grep "f2c " >&2]); then |
| # Be sure to remove files which might be created by compilers that |
| # don't support --version, or by the second compile. |
| rm -f a.exe a.out conftest.f conftest.$ac_objext |
| # Has GNU in --version. |
| test "$G77" != yes && |
| AC_MSG_ERROR([failed to recognize GNU Fortran 77 compiler]) |
| else |
| # Be sure to remove files which might be created by compilers that |
| # don't support --version, or by the second compile. |
| rm -f a.exe a.out conftest.f conftest.$ac_objext |
| # Has not. |
| test "$G77" = yes && |
| AC_MSG_ERROR([incorrectly recognized a GNU Fortran 77 compiler]) |
| fi |
| ]]) |
| |
| |
| |
| ## ------------------ ## |
| ## Fortran Compiler. ## |
| ## ------------------ ## |
| |
| |
| AT_CHECK_MACRO([GNU Fortran], |
| [[AC_LANG(Fortran) |
| AC_LANG_COMPILER |
| |
| # No Fortran compiler is known not to support "*.f". |
| AC_FC_SRCEXT([f]) |
| |
| # GNU Fortran is known to support freeform. |
| AC_FC_FREEFORM([], |
| [AC_MSG_WARN([Fortran does not accept free-form source])]) |
| if test "$ac_compiler_gnu" = yes; then |
| case $FCFLAGS in |
| *-ffree-form*) ;; |
| *) AC_MSG_ERROR([failed to recognize GNU Fortran's -ffree-form option]);; |
| esac |
| fi |
| ]]) |
| |
| |
| ## ------------------------- ## |
| ## AC_OPENMP and Fortran 77. ## |
| ## ------------------------- ## |
| |
| AT_SETUP([AC_OPENMP and Fortran 77]) |
| |
| AT_DATA([configure.ac], |
| [[AC_INIT |
| AC_PROG_F77 |
| AC_LANG([Fortran 77]) |
| AC_OPENMP |
| if test "X$ac_cv_prog_f77_openmp" = Xunsupported; then |
| AS_EXIT([77]) |
| fi |
| FFLAGS="$FFLAGS $OPENMP_FFLAGS" |
| AC_CONFIG_FILES([Makefile]) |
| AC_OUTPUT |
| ]]) |
| |
| AT_DATA([Makefile.in], |
| [[foo@EXEEXT@: foo.@OBJEXT@ |
| @F77@ @FFLAGS@ @LDFLAGS@ -o $@ foo.@OBJEXT@ |
| |
| foo.@OBJEXT@: foo.f |
| @F77@ @FFLAGS@ -c foo.f |
| ]]) |
| |
| AT_DATA([foo.f], |
| [[ program main |
| end |
| ]]) |
| |
| AT_SUPPRESS_ACLOCAL |
| AT_CHECK([autoreconf -vi], [], [ignore], [ignore]) |
| AT_CHECK_CONFIGURE |
| AT_CHECK_MAKE |
| |
| AT_CLEANUP |
| |
| |
| ## ---------------------- ## |
| ## AC_OPENMP and Fortran. ## |
| ## ---------------------- ## |
| |
| AT_SETUP([AC_OPENMP and Fortran]) |
| |
| AT_DATA([configure.ac], |
| [[AC_INIT |
| AC_PROG_FC |
| AC_LANG([Fortran]) |
| AC_OPENMP |
| if test "X$ac_cv_prog_fc_openmp" = Xunsupported; then |
| AS_EXIT([77]) |
| fi |
| FCFLAGS="$FCFLAGS $OPENMP_FCFLAGS" |
| AC_CONFIG_FILES([Makefile]) |
| AC_OUTPUT |
| ]]) |
| |
| AT_DATA([Makefile.in], |
| [[foo@EXEEXT@: foo.@OBJEXT@ |
| @FC@ @FCFLAGS@ @LDFLAGS@ -o $@ foo.@OBJEXT@ |
| |
| foo.@OBJEXT@: foo.f |
| @FC@ @FCFLAGS@ -c foo.f |
| ]]) |
| |
| AT_DATA([foo.f], |
| [[ program main |
| end |
| ]]) |
| |
| AT_SUPPRESS_ACLOCAL |
| AT_CHECK([autoreconf -vi], [], [ignore], [ignore]) |
| AT_CHECK_CONFIGURE |
| AT_CHECK_MAKE |
| |
| AT_CLEANUP |
| |
| |
| # We don't test the AC_F77_LIBRARY_LDFLAGS macro on its own because of |
| # (autoconf.info)Fortran Compiler: |
| # The macros 'AC_F77_DUMMY_MAIN' and 'AC_FC_DUMMY_MAIN' or |
| # 'AC_F77_MAIN' and 'AC_FC_MAIN' are probably also necessary to link |
| # C/C++ with Fortran; see below. |
| # |
| # and we would need libtool to create shared libraries. |
| |
| # Further, for any sensible test of the AC_F{77,C}(_DUMMY)?_MAIN macros |
| # we also need to use AC_F{77,C}_WRAPPERS, in order to be able to actually |
| # call the functions. |
| |
| ## ------------------------ ## |
| ## AC_F77_DUMMY_MAIN usage. ## |
| ## ------------------------ ## |
| |
| AT_SETUP([AC_F77_DUMMY_MAIN usage]) |
| |
| AT_CONFIGURE_AC([[ |
| AC_PROG_F77 |
| AC_F77_DUMMY_MAIN([], [AC_MSG_FAILURE([failed to determine F77 dummy main], [77])]) |
| AC_F77_WRAPPERS |
| AC_PROG_CC |
| AC_CONFIG_FILES([Makefile]) |
| ]]) |
| |
| AT_DATA([Makefile.in], |
| [[ |
| all: cprogram@EXEEXT@ |
| |
| cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@ |
| @CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FLIBS@ |
| |
| .SUFFIXES: .c .f .@OBJEXT@ |
| .f.@OBJEXT@: |
| @F77@ @FFLAGS@ -c $< |
| .c.@OBJEXT@: |
| @CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $< |
| ]]) |
| |
| AT_DATA([foobar.f], |
| [[C This is just a purely numeric routine, no I/O needed. |
| C Taken from autoconf.texi:Fortran Compiler. |
| subroutine foobar (x, y) |
| double precision x, y |
| y = 3.14159 * x |
| return |
| end |
| ]]) |
| |
| AT_DATA([cprogram.c], |
| [[#include <config.h> |
| #include <math.h> |
| |
| /* Taken from autoconf.texi:Fortran Compiler. */ |
| #define FOOBAR_F77 F77_FUNC (foobar, FOOBAR) |
| #ifdef __cplusplus |
| extern "C" /* prevent C++ name mangling */ |
| #endif |
| void FOOBAR_F77 (double *x, double *y); |
| |
| /* Taken from autoconf.texi:Fortran Compiler. */ |
| #ifdef F77_DUMMY_MAIN |
| # ifdef __cplusplus |
| extern "C" |
| # endif |
| int F77_DUMMY_MAIN (void) { return 1; } |
| #endif |
| |
| int main(int argc, char *argv[]) |
| { |
| double x = 2.7183, y; |
| FOOBAR_F77 (&x, &y); |
| if (fabs (8.539784097 - y) > 1.e-6) |
| return 1; |
| return 0; |
| } |
| ]]) |
| |
| AT_CHECK_AUTOCONF |
| AT_CHECK_AUTOHEADER([], [ |
| F77_DUMMY_MAIN |
| F77_FUNC |
| F77_FUNC_ |
| FC_DUMMY_MAIN_EQ_F77 |
| ]) |
| AT_CHECK_CONFIGURE |
| AT_CHECK_MAKE |
| AT_CHECK([./cprogram]) |
| |
| AT_CLEANUP |
| |
| |
| ## ----------------------- ## |
| ## AC_FC_DUMMY_MAIN usage. ## |
| ## ----------------------- ## |
| |
| AT_SETUP([AC_FC_DUMMY_MAIN usage]) |
| |
| AT_CONFIGURE_AC([[ |
| AC_PROG_FC |
| AC_FC_FIXEDFORM |
| AC_FC_DUMMY_MAIN([], [AC_MSG_FAILURE([failed to determine FC dummy main], [77])]) |
| AC_FC_WRAPPERS |
| AC_PROG_CC |
| AC_CONFIG_FILES([Makefile]) |
| ]]) |
| |
| AT_DATA([Makefile.in], |
| [[ |
| all: cprogram@EXEEXT@ |
| |
| cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@ |
| @CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FCLIBS@ |
| |
| .SUFFIXES: .c .f .@OBJEXT@ |
| .f.@OBJEXT@: |
| @FC@ @FCFLAGS@ -c $< |
| .c.@OBJEXT@: |
| @CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $< |
| ]]) |
| |
| AT_DATA([foobar.f], |
| [[C This is just a purely numeric routine, no I/O needed. |
| C Taken from autoconf.texi:Fortran Compiler. |
| subroutine foobar (x, y) |
| double precision x, y |
| y = 3.14159 * x |
| return |
| end |
| ]]) |
| |
| AT_DATA([cprogram.c], |
| [[#include <config.h> |
| #include <math.h> |
| |
| /* Taken from autoconf.texi:Fortran Compiler. */ |
| #define FOOBAR_FC FC_FUNC (foobar, FOOBAR) |
| #ifdef __cplusplus |
| extern "C" /* prevent C++ name mangling */ |
| #endif |
| void FOOBAR_FC(double *x, double *y); |
| |
| /* Taken from autoconf.texi:Fortran Compiler. */ |
| #ifdef FC_DUMMY_MAIN |
| # ifdef __cplusplus |
| extern "C" |
| # endif |
| int FC_DUMMY_MAIN (void) { return 1; } |
| #endif |
| |
| int main (int argc, char *argv[]) |
| { |
| double x = 2.7183, y; |
| FOOBAR_FC (&x, &y); |
| if (fabs (8.539784097 - y) > 1.e-6) |
| return 1; |
| return 0; |
| } |
| ]]) |
| |
| AT_CHECK_AUTOCONF |
| AT_CHECK_AUTOHEADER([], [ |
| FC_DUMMY_MAIN |
| FC_DUMMY_MAIN_EQ_F77 |
| FC_FUNC |
| FC_FUNC_ |
| ]) |
| AT_CHECK_CONFIGURE |
| AT_CHECK_MAKE |
| AT_CHECK([./cprogram]) |
| |
| AT_CLEANUP |
| |
| |
| ## ------------------ ## |
| ## AC_F77_MAIN usage. ## |
| ## ------------------ ## |
| |
| AT_SETUP([AC_F77_MAIN usage]) |
| |
| AT_CONFIGURE_AC([[ |
| AC_PROG_F77 |
| AC_F77_MAIN |
| AC_F77_WRAPPERS |
| AC_PROG_CC |
| AC_CONFIG_FILES([Makefile]) |
| ]]) |
| |
| AT_DATA([Makefile.in], |
| [[ |
| all: cprogram@EXEEXT@ |
| |
| cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@ |
| @CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FLIBS@ |
| |
| .SUFFIXES: .c .f .@OBJEXT@ |
| .f.@OBJEXT@: |
| @F77@ @FFLAGS@ -c $< |
| .c.@OBJEXT@: |
| @CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $< |
| ]]) |
| |
| AT_DATA([foobar.f], |
| [[C This uses Fortran I/O, so is likely to require Fortran startup. |
| subroutine foobar (x) |
| integer x |
| if (x == 42) then |
| write(*,*) 'some output from Fortran sources' |
| end if |
| end |
| ]]) |
| |
| AT_DATA([cprogram.c], |
| [[#include <config.h> |
| #include <stdio.h> |
| |
| /* Taken from autoconf.texi:Fortran Compiler. */ |
| #define FOOBAR_F77 F77_FUNC (foobar, FOOBAR) |
| #ifdef __cplusplus |
| extern "C" /* prevent C++ name mangling */ |
| #endif |
| void FOOBAR_F77 (int *x); |
| |
| /* Taken from autoconf.texi:Fortran Compiler. */ |
| #ifdef __cplusplus |
| extern "C" |
| #endif |
| int F77_MAIN (int argc, char *argv[]); |
| |
| int F77_MAIN (int argc, char *argv[]) |
| { |
| int x = 42; |
| puts ("output from C main"); |
| fflush (stdout); |
| FOOBAR_F77 (&x); |
| puts ("more output from C main"); |
| return 0; |
| } |
| ]]) |
| |
| AT_CHECK_AUTOCONF |
| AT_CHECK_AUTOHEADER([], [ |
| F77_DUMMY_MAIN |
| F77_FUNC |
| F77_FUNC_ |
| F77_MAIN |
| FC_DUMMY_MAIN_EQ_F77 |
| ]) |
| AT_CHECK_CONFIGURE |
| AT_CHECK_MAKE |
| AT_CHECK([./cprogram], [], [output from C main |
| some output from Fortran sources |
| more output from C main |
| ]) |
| |
| AT_CLEANUP |
| |
| |
| ## ----------------- ## |
| ## AC_FC_MAIN usage. ## |
| ## ----------------- ## |
| |
| AT_SETUP([AC_FC_MAIN usage]) |
| |
| AT_CONFIGURE_AC([[ |
| AC_PROG_FC |
| AC_FC_FIXEDFORM |
| AC_FC_MAIN |
| AC_FC_WRAPPERS |
| AC_PROG_CC |
| AC_CONFIG_FILES([Makefile]) |
| ]]) |
| |
| AT_DATA([Makefile.in], |
| [[all: cprogram@EXEEXT@ |
| |
| cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@ |
| @CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FCLIBS@ |
| |
| .SUFFIXES: .c .f .@OBJEXT@ |
| .f.@OBJEXT@: |
| @FC@ @FCFLAGS@ -c $< |
| .c.@OBJEXT@: |
| @CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $< |
| ]]) |
| |
| AT_DATA([foobar.f], |
| [[C This uses Fortran I/O, so is likely to require Fortran startup. |
| subroutine foobar (x) |
| integer x |
| if (x == 42) then |
| write (*,*) 'some output from Fortran sources' |
| end if |
| end |
| ]]) |
| |
| AT_DATA([cprogram.c], |
| [[#include <config.h> |
| #include <stdio.h> |
| |
| /* Taken from autoconf.texi:Fortran Compiler. */ |
| #define FOOBAR_FC FC_FUNC (foobar, FOOBAR) |
| #ifdef __cplusplus |
| extern "C" /* prevent C++ name mangling */ |
| #endif |
| void FOOBAR_FC (int *x); |
| |
| /* Taken from autoconf.texi:Fortran Compiler. */ |
| #ifdef __cplusplus |
| extern "C" |
| #endif |
| int FC_MAIN (int argc, char *argv[]); |
| |
| int FC_MAIN (int argc, char *argv[]) |
| { |
| int x = 42; |
| puts ("output from C main"); |
| fflush (stdout); |
| FOOBAR_FC (&x); |
| puts ("more output from C main"); |
| return 0; |
| } |
| ]]) |
| |
| AT_CHECK_AUTOCONF |
| AT_CHECK_AUTOHEADER([], [ |
| FC_DUMMY_MAIN |
| FC_DUMMY_MAIN_EQ_F77 |
| FC_FUNC |
| FC_FUNC_ |
| FC_MAIN |
| ]) |
| AT_CHECK_CONFIGURE |
| AT_CHECK_MAKE |
| AT_CHECK([./cprogram], [], [output from C main |
| some output from Fortran sources |
| more output from C main |
| ]) |
| |
| AT_CLEANUP |
| |
| |
| ## ------------------ ## |
| ## AC_F77_FUNC usage. ## |
| ## ------------------ ## |
| |
| AT_SETUP([AC_F77_FUNC usage]) |
| |
| AT_CONFIGURE_AC([[ |
| AC_PROG_F77 |
| AC_F77_FUNC([foobar]) |
| AC_SUBST([foobar]) |
| AC_PROG_CC |
| AC_CONFIG_FILES([cprogram.c:cprogram.in]) |
| AC_CONFIG_FILES([Makefile]) |
| ]]) |
| |
| AT_DATA([Makefile.in], |
| [[ |
| all: cprogram@EXEEXT@ |
| |
| cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@ |
| @CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FLIBS@ |
| |
| .SUFFIXES: .c .f .@OBJEXT@ |
| .f.@OBJEXT@: |
| @F77@ @FFLAGS@ -c $< |
| .c.@OBJEXT@: |
| @CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $< |
| ]]) |
| |
| AT_DATA([foobar.f], |
| [[ subroutine foobar (x) |
| integer x |
| x = 42 |
| return |
| end |
| ]]) |
| |
| AT_DATA([cprogram.in], |
| [[#include <config.h> |
| #include <math.h> |
| |
| #ifdef __cplusplus |
| extern "C" /* prevent C++ name mangling */ |
| #endif |
| void @foobar@ (int *x); |
| |
| /* Taken from autoconf.texi:Fortran Compiler. */ |
| #ifdef F77_DUMMY_MAIN |
| # ifdef __cplusplus |
| extern "C" |
| # endif |
| int F77_DUMMY_MAIN (void) { return 1; } |
| #endif |
| |
| int main(int argc, char *argv[]) |
| { |
| int x; |
| @foobar@ (&x); |
| if (x != 42) |
| return 1; |
| return 0; |
| } |
| ]]) |
| |
| AT_CHECK_AUTOCONF |
| AT_CHECK_AUTOHEADER([], [ |
| F77_DUMMY_MAIN |
| FC_DUMMY_MAIN_EQ_F77 |
| ]) |
| AT_CHECK_CONFIGURE |
| AT_CHECK_MAKE |
| AT_CHECK([./cprogram]) |
| |
| AT_CLEANUP |
| |
| |
| ## ----------------- ## |
| ## AC_FC_FUNC usage. ## |
| ## ----------------- ## |
| |
| AT_SETUP([AC_FC_FUNC usage]) |
| |
| AT_CONFIGURE_AC([[ |
| AC_PROG_FC |
| AC_FC_FUNC([foobar]) |
| AC_SUBST([foobar]) |
| AC_PROG_CC |
| AC_CONFIG_FILES([cprogram.c:cprogram.in]) |
| AC_CONFIG_FILES([Makefile]) |
| ]]) |
| |
| AT_DATA([Makefile.in], |
| [[ |
| all: cprogram@EXEEXT@ |
| |
| cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@ |
| @CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FCLIBS@ |
| |
| .SUFFIXES: .c .f .@OBJEXT@ |
| .f.@OBJEXT@: |
| @FC@ @FCFLAGS@ -c $< |
| .c.@OBJEXT@: |
| @CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $< |
| ]]) |
| |
| AT_DATA([foobar.f], |
| [[ subroutine foobar (x) |
| integer x |
| x = 42 |
| return |
| end |
| ]]) |
| |
| AT_DATA([cprogram.in], |
| [[#include <config.h> |
| #include <math.h> |
| |
| #ifdef __cplusplus |
| extern "C" /* prevent C++ name mangling */ |
| #endif |
| void @foobar@ (int *x); |
| |
| /* Taken from autoconf.texi:Fortran Compiler. */ |
| #ifdef FC_DUMMY_MAIN |
| # ifdef __cplusplus |
| extern "C" |
| # endif |
| int FC_DUMMY_MAIN (void) { return 1; } |
| #endif |
| |
| int main(int argc, char *argv[]) |
| { |
| int x; |
| @foobar@ (&x); |
| if (x != 42) |
| return 1; |
| return 0; |
| } |
| ]]) |
| |
| AT_CHECK_AUTOCONF |
| AT_CHECK_AUTOHEADER([], [ |
| FC_DUMMY_MAIN |
| FC_DUMMY_MAIN_EQ_F77 |
| ]) |
| AT_CHECK_CONFIGURE |
| AT_CHECK_MAKE |
| AT_CHECK([./cprogram]) |
| |
| AT_CLEANUP |
| |
| |
| ## ------------------- ## |
| ## AC_FC_SRCEXT usage. ## |
| ## ------------------- ## |
| |
| AT_SETUP([AC_FC_SRCEXT usage]) |
| |
| AT_DATA([configure.ac], |
| [[AC_INIT |
| AC_PROG_FC |
| FCFLAGS_NOFREE=$FCFLAGS |
| AC_SUBST([FCFLAGS_NOFREE]) |
| AC_FC_FREEFORM |
| # Unconditionally require .f to work. |
| AC_FC_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_SRCEXT(ext, ext[_object='foo]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@ |
| @FC@ @FCFLAGS@ -o $@ foof.@OBJEXT@ @f77_object@ @f90_object@ \ |
| @f95_object@ @f03_object@ @f08_object@ |
| |
| .SUFFIXES: .f .f77 .f90 .f95 .f03 .f08 .@OBJEXT@ |
| .f.@OBJEXT@: |
| @FC@ -c @FCFLAGS_NOFREE@ @FCFLAGS_f@ $< |
| .f77.@OBJEXT@: |
| @FC@ -c @FCFLAGS_NOFREE@ @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@ $< |
| ]]) |
| |
| AT_DATA([foof.f], |
| [[ program main |
| end |
| ]]) |
| |
| AT_DATA([foof77.f77], |
| [[ subroutine foof77 |
| end |
| ]]) |
| |
| AT_DATA([foof90.f90], |
| [[subroutine foof90 |
| end |
| ]]) |
| |
| AT_DATA([foof95.f95], |
| [[subroutine foof95 |
| end |
| ]]) |
| |
| AT_DATA([foof03.f03], |
| [[subroutine foof03 |
| end |
| ]]) |
| |
| AT_DATA([foof08.f08], |
| [[subroutine foof08 |
| end |
| ]]) |
| |
| AT_CHECK_AUTOCONF |
| AT_CHECK_CONFIGURE |
| AT_CHECK_MAKE |
| |
| 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 |
| AT_CHECK_MAKE |
| AT_CHECK([./prog]) |
| |
| AT_CLEANUP |
| |
| |
| ## --------------- ## |
| ## AC_FC_FREEFORM. ## |
| ## --------------- ## |
| |
| AT_SETUP([AC_FC_FREEFORM]) |
| |
| AT_DATA([configure.ac], |
| [[AC_INIT |
| AC_PROG_FC |
| AC_FC_FREEFORM |
| AC_CONFIG_FILES([Makefile]) |
| AC_OUTPUT |
| ]]) |
| |
| AT_DATA([Makefile.in], |
| [[prog: prog.@OBJEXT@ |
| @FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@ |
| |
| .SUFFIXES: .f .@OBJEXT@ |
| .f.@OBJEXT@: |
| @FC@ @FCFLAGS@ -c $< |
| ]]) |
| |
| AT_DATA([prog.f], |
| [[program main |
| end |
| ]]) |
| |
| AT_CHECK_AUTOCONF |
| AT_CHECK_CONFIGURE |
| AT_CHECK_MAKE |
| AT_CHECK([./prog]) |
| |
| AT_CLEANUP |
| |
| |
| ## --------------------------------- ## |
| ## AC_FC_FREEFORM with AC_FC_SRCEXT. ## |
| ## --------------------------------- ## |
| |
| AT_SETUP([AC_FC_FREEFORM with AC_FC_SRCEXT]) |
| |
| AT_DATA([configure.ac], |
| [[AC_INIT |
| AC_FC_SRCEXT([f90], [], [AS_EXIT([77])]) |
| AC_PROG_FC |
| AC_FC_FREEFORM |
| AC_CONFIG_FILES([Makefile]) |
| AC_OUTPUT |
| ]]) |
| |
| AT_DATA([Makefile.in], |
| [[prog: prog.@OBJEXT@ |
| @FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@ |
| |
| .SUFFIXES: .f90 .@OBJEXT@ |
| .f90.@OBJEXT@: |
| @FC@ @FCFLAGS@ -c @FCFLAGS_f90@ $< |
| ]]) |
| |
| AT_DATA([prog.f90], |
| [[program main |
| end |
| ]]) |
| |
| AT_CHECK_AUTOCONF |
| AT_CHECK_CONFIGURE |
| AT_CHECK_MAKE |
| AT_CHECK([./prog]) |
| |
| AT_CLEANUP |
| |
| |
| ## ---------------- ## |
| ## AC_FC_FIXEDFORM. ## |
| ## ---------------- ## |
| |
| AT_SETUP([AC_FC_FIXEDFORM]) |
| |
| AT_DATA([configure.ac], |
| [[AC_INIT |
| AC_PROG_FC |
| AC_FC_FIXEDFORM |
| AC_CONFIG_FILES([Makefile]) |
| AC_OUTPUT |
| ]]) |
| |
| AT_DATA([Makefile.in], |
| [[prog: prog.@OBJEXT@ |
| @FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@ |
| |
| .SUFFIXES: .f .@OBJEXT@ |
| .f.@OBJEXT@: |
| @FC@ @FCFLAGS@ -c $< |
| ]]) |
| |
| AT_DATA([prog.f], |
| [[ program main |
| C fixed-form style comment |
| end |
| ]]) |
| |
| AT_CHECK_AUTOCONF |
| AT_CHECK_CONFIGURE |
| AT_CHECK_MAKE |
| AT_CHECK([./prog]) |
| |
| AT_CLEANUP |
| |
| |
| ## ---------------------------------- ## |
| ## AC_FC_FIXEDFORM with AC_FC_SRCEXT. ## |
| ## ---------------------------------- ## |
| |
| AT_SETUP([AC_FC_FIXEDFORM with AC_FC_SRCEXT]) |
| |
| AT_DATA([configure.ac], |
| [[AC_INIT |
| AC_PROG_FC |
| AC_FC_SRCEXT([f90], [], [AS_EXIT([77])]) |
| AC_FC_FIXEDFORM |
| AC_CONFIG_FILES([Makefile]) |
| AC_OUTPUT |
| ]]) |
| |
| AT_DATA([Makefile.in], |
| [[prog: prog.@OBJEXT@ |
| @FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@ |
| |
| .SUFFIXES: .f90 .@OBJEXT@ |
| .f90.@OBJEXT@: |
| @FC@ @FCFLAGS@ -c @FCFLAGS_f90@ $< |
| ]]) |
| |
| AT_DATA([prog.f90], |
| [[ program main |
| C fixed-form style comment |
| end |
| ]]) |
| |
| AT_CHECK_AUTOCONF |
| AT_CHECK_CONFIGURE |
| AT_CHECK_MAKE |
| AT_CHECK([./prog]) |
| |
| AT_CLEANUP |
| |
| |
| ## ------------------ ## |
| ## AC_FC_LINE_LENGTH. ## |
| ## ------------------ ## |
| |
| AT_SETUP([AC_FC_LINE_LENGTH]) |
| |
| AT_DATA([Makefile.in], |
| [[prog@EXEEXT@: prog.@OBJEXT@ |
| @FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@ |
| |
| .SUFFIXES: .f .@OBJEXT@ |
| .f.@OBJEXT@: |
| @FC@ @FCFLAGS@ -c @FCFLAGS_f@ $< |
| |
| clean: |
| rm -f *.@OBJEXT@ prog@EXEEXT@ |
| ]]) |
| |
| # When preceded by 7 spaces and followed by newline, line_80 generates |
| # a line of exactly 79 columns, line_132 generates a line of exactly 131 |
| # coluns, and line_250 generates a line of exactly 250 columns. |
| # FIXME: Shouldn't line_80 and line_132 generate lines that are one column |
| # longer, so that their contents match the variable names? |
| line_80=\ |
| 'subroutine foo(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11)' |
| line_132=\ |
| 'subroutine foo(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,'\ |
| 'arg12,arg13,arg14,arg15,arg16,arg17,arg18,arg19)' |
| line_250=\ |
| 'subroutine foofoo(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,'\ |
| 'arg12,arg13,arg14,arg15,arg16,arg17,arg18,arg19,arg20,arg21,arg22,arg23,'\ |
| 'arg24,arg25,arg26,arg27,arg28,arg29,arg30,arg31,arg32,arg33,arg34,arg35,'\ |
| 'arg36,arg37,arg38,arg39)' |
| |
| for len in 80 132 250 |
| do |
| if test $len -eq 250; then arg=unlimited; else arg=$len; fi |
| eval long_line=\$line_$len |
| |
| # Try free-form first, it has a bigger chance of succeeding. |
| for fixed_or_free in FREEFORM FIXEDFORM |
| do |
| |
| cat >configure.ac <<EOF |
| AC_INIT |
| AC_PROG_FC |
| AC_FC_SRCEXT([f]) |
| AC_FC_$fixed_or_free |
| AC_FC_LINE_LENGTH([$arg]) |
| AC_CONFIG_FILES([Makefile]) |
| AC_OUTPUT |
| EOF |
| |
| cat >prog.f <<EOF |
| $long_line |
| end subroutine |
| program main |
| end program |
| EOF |
| |
| AT_CHECK_AUTOCONF |
| AT_CHECK_CONFIGURE |
| AT_CHECK_MAKE |
| AT_CHECK([./prog]) |
| AT_CHECK_MAKE([clean]) |
| |
| done |
| done |
| |
| AT_CLEANUP |
| |
| |
| ## ------------------- ## |
| ## AC_FC_CHECK_BOUNDS. ## |
| ## ------------------- ## |
| |
| AT_SETUP([AC_FC_CHECK_BOUNDS]) |
| |
| AT_DATA([Makefile.in], |
| [[prog@EXEEXT@: prog.@OBJEXT@ |
| @FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@ |
| |
| .SUFFIXES: .f .@OBJEXT@ |
| .f.@OBJEXT@: |
| @FC@ @FCFLAGS@ -c @FCFLAGS_f@ $< |
| |
| clean: |
| rm -f *.@OBJEXT@ prog@EXEEXT@ |
| ]]) |
| |
| cat >configure.ac <<EOF |
| AC_INIT |
| AC_PROG_FC |
| AC_FC_SRCEXT([f]) |
| AC_FC_CHECK_BOUNDS |
| AC_CONFIG_FILES([Makefile]) |
| AC_OUTPUT |
| EOF |
| |
| AT_DATA([prog.f], |
| [[ |
| subroutine copy(a,b,n) |
| integer a(:), b(:), n, i |
| do i = 1, n |
| a(i) = b(i) |
| end do |
| end subroutine |
| |
| program main |
| integer, parameter :: n = 20 |
| integer a(1:n), b(1:n-1), i |
| interface |
| subroutine copy(a,b,n) |
| integer a(:), b(:), i |
| end subroutine |
| end interface |
| |
| call copy(a,b,n) |
| end program |
| ]]) |
| |
| AT_CHECK_AUTOCONF |
| AT_CHECK_CONFIGURE |
| AT_CHECK_MAKE |
| AT_CHECK([./prog || exit 1], [1], [ignore], [ignore]) |
| AT_CHECK_MAKE([clean]) |
| |
| AT_CLEANUP |
| |
| |
| ## ------------------ ## |
| ## AC_FC_MODULE_FLAG. ## |
| ## ------------------ ## |
| |
| AT_SETUP([AC_FC_MODULE_FLAG]) |
| |
| AT_DATA([Makefile.in], |
| [[OBJEXT = @OBJEXT@ |
| EXEEXT = @EXEEXT@ |
| LIBS = @LIBS@ |
| ac_empty = @ac_empty@ |
| FC = @FC@ |
| FC_MODEXT = @FC_MODEXT@ |
| FC_MODINC = @FC_MODINC@ |
| FCFLAGS = @FCFLAGS@ |
| FCFLAGS_f = @FCFLAGS_f@ |
| |
| prog$(EXEEXT): sub/mod.$(OBJEXT) prog.$(OBJEXT) |
| $(FC) $(FCFLAGS) -o $@ prog.$(OBJEXT) sub/mod.$(OBJEXT) $(LIBS) |
| |
| sub/mod.$(OBJEXT): sub/mod.f |
| cd sub && $(FC) $(FCFLAGS) -c $(FCFLAGS_f) mod.f |
| |
| # Depend on the object, for the module dependency. |
| prog.$(OBJEXT): prog.f sub/mod.$(OBJEXT) |
| $(FC) $(FCFLAGS) $(FC_MODINC). $(FC_MODINC)sub -c $(FCFLAGS_f) $< |
| |
| clean: |
| -test -z "$(FC_MODEXT)" || rm -f *.$(FC_MODEXT) sub/*.$(FC_MODEXT) |
| -rm -f *.$(OBJEXT) sub/*.$(OBJEXT) prog$(EXEEXT) |
| ]]) |
| |
| AT_DATA([configure.ac], |
| [[AC_INIT |
| AC_PROG_FC |
| AC_FC_SRCEXT([f]) |
| AC_FC_MODULE_FLAG |
| if test -n "$FC_MODINC"; then |
| FCFLAGS="$FCFLAGS $FC_MODINC. ${FC_MODINC}sub" |
| fi |
| AC_FC_MODULE_EXTENSION |
| AC_CONFIG_FILES([Makefile]) |
| AC_OUTPUT |
| ]]) |
| |
| mkdir sub |
| |
| AT_DATA([sub/mod.f], |
| [[ module foobar |
| end module foobar |
| ]]) |
| |
| AT_DATA([prog.f], |
| [[ program main |
| use foobar |
| end program |
| ]]) |
| |
| AT_CHECK_AUTOCONF |
| AT_CHECK_CONFIGURE |
| AT_CHECK_MAKE([], [], [], [stdout], [stderr]) |
| # Both the FCFLAGS setting from configure.ac, and the Makefile rule |
| # should add to the module search path. |
| AT_CHECK([grep 'sub .*sub ' stdout stderr], [], [ignore]) |
| AT_CHECK([./prog], [], [ignore], [ignore]) |
| AT_CHECK_MAKE([clean]) |
| |
| AT_CLEANUP |
| |
| |
| ## --------------------- ## |
| ## AC_F77_CRAY_POINTERS. ## |
| ## --------------------- ## |
| |
| AT_SETUP([AC_F77_CRAY_POINTERS]) |
| |
| AT_DATA([configure.ac], |
| [[AC_INIT |
| AC_PROG_F77 |
| AC_F77_CRAY_POINTERS |
| AC_CONFIG_FILES([Makefile]) |
| AC_OUTPUT |
| ]]) |
| |
| AT_DATA([Makefile.in], |
| [[prog@EXEEXT@: prog.@OBJEXT@ |
| @F77@ @FFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@ |
| |
| .SUFFIXES: .f .@OBJEXT@ |
| .f.@OBJEXT@: |
| @F77@ @FFLAGS@ -c $< |
| |
| clean: |
| rm -f *.@OBJEXT@ prog@EXEEXT@ |
| ]]) |
| |
| AT_DATA([prog.f], |
| [[ program main |
| integer aptr(2) |
| pointer (iptr, aptr) |
| end |
| ]]) |
| |
| AT_CHECK_AUTOCONF |
| AT_CHECK_CONFIGURE |
| AT_CHECK_MAKE |
| AT_CHECK([./prog]) |
| AT_CHECK_MAKE([clean]) |
| |
| AT_CLEANUP |
| |
| |
| ## -------------------- ## |
| ## AC_FC_CRAY_POINTERS. ## |
| ## -------------------- ## |
| |
| AT_SETUP([AC_FC_CRAY_POINTERS]) |
| |
| AT_DATA([configure.ac], |
| [[AC_INIT |
| AC_PROG_FC |
| AC_FC_SRCEXT([f]) |
| AC_FC_CRAY_POINTERS |
| AC_CONFIG_FILES([Makefile]) |
| AC_OUTPUT |
| ]]) |
| |
| AT_DATA([Makefile.in], |
| [[prog@EXEEXT@: prog.@OBJEXT@ |
| @FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@ |
| |
| .SUFFIXES: .f .@OBJEXT@ |
| .f.@OBJEXT@: |
| @FC@ @FCFLAGS@ -c @FCFLAGS_f@ $< |
| |
| clean: |
| rm -f *.@OBJEXT@ prog@EXEEXT@ |
| ]]) |
| |
| AT_DATA([prog.f], |
| [[ program main |
| integer aptr(2) |
| pointer (iptr, aptr) |
| end |
| ]]) |
| |
| AT_CHECK_AUTOCONF |
| AT_CHECK_CONFIGURE |
| AT_CHECK_MAKE |
| AT_CHECK([./prog]) |
| AT_CHECK_MAKE([clean]) |
| |
| AT_CLEANUP |