Home | History | Annotate | Line # | Download | only in tests
      1 #							-*- Autotest -*-
      2 
      3 AT_BANNER([Fortran low level compiling/preprocessing macros.])
      4 
      5 # Copyright (C) 2000-2001, 2003, 2008-2012 Free Software Foundation,
      6 # Inc.
      7 #
      8 # This program is free software: you can redistribute it and/or modify
      9 # it under the terms of the GNU General Public License as published by
     10 # the Free Software Foundation, either version 3 of the License, or
     11 # (at your option) any later version.
     12 #
     13 # This program is distributed in the hope that it will be useful,
     14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16 # GNU General Public License for more details.
     17 #
     18 # You should have received a copy of the GNU General Public License
     19 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
     20 
     21 # Since the macros which compile are required by most tests, check
     22 # them first.  But remember that looking for a compiler is even more
     23 # primitive, so check those first.
     24 
     25 
     26 ## --------------------- ##
     27 ## Fortran 77 Compiler.  ##
     28 ## --------------------- ##
     29 
     30 
     31 AT_CHECK_MACRO([GNU Fortran 77],
     32 [[AC_LANG(Fortran 77)
     33 AC_LANG_COMPILER
     34 
     35 : > conftest.f
     36 if AC_TRY_COMMAND([$F77 --version | grep GNU >&2]) \
     37    || AC_TRY_COMMAND([$F77 -v -c conftest.f 2>&1 | grep "f2c " >&2]); then
     38   # Be sure to remove files which might be created by compilers that
     39   # don't support --version, or by the second compile.
     40   rm -f a.exe a.out conftest.f conftest.$ac_objext
     41   # Has GNU in --version.
     42   test "$G77" != yes &&
     43     AC_MSG_ERROR([failed to recognize GNU Fortran 77 compiler])
     44 else
     45   # Be sure to remove files which might be created by compilers that
     46   # don't support --version, or by the second compile.
     47   rm -f a.exe a.out conftest.f conftest.$ac_objext
     48   # Has not.
     49   test "$G77" = yes &&
     50     AC_MSG_ERROR([incorrectly recognized a GNU Fortran 77 compiler])
     51 fi
     52 ]])
     53 
     54 
     55 
     56 ## ------------------ ##
     57 ## Fortran Compiler.  ##
     58 ## ------------------ ##
     59 
     60 
     61 AT_CHECK_MACRO([GNU Fortran],
     62 [[AC_LANG(Fortran)
     63 AC_LANG_COMPILER
     64 
     65 # No Fortran compiler is known not to support "*.f".
     66 AC_FC_SRCEXT([f])
     67 
     68 # GNU Fortran is known to support freeform.
     69 AC_FC_FREEFORM([],
     70                [AC_MSG_WARN([Fortran does not accept free-form source])])
     71 if test "$ac_compiler_gnu" = yes; then
     72   case $FCFLAGS in
     73    *-ffree-form*) ;;
     74    *) AC_MSG_ERROR([failed to recognize GNU Fortran's -ffree-form option]);;
     75   esac
     76 fi
     77 ]])
     78 
     79 
     80 ## ------------------------- ##
     81 ## AC_OPENMP and Fortran 77. ##
     82 ## ------------------------- ##
     83 
     84 AT_SETUP([AC_OPENMP and Fortran 77])
     85 
     86 AT_DATA([configure.ac],
     87 [[AC_INIT
     88 AC_PROG_F77
     89 AC_LANG([Fortran 77])
     90 AC_OPENMP
     91 if test "X$ac_cv_prog_f77_openmp" = Xunsupported; then
     92   AS_EXIT([77])
     93 fi
     94 FFLAGS="$FFLAGS $OPENMP_FFLAGS"
     95 AC_CONFIG_FILES([Makefile])
     96 AC_OUTPUT
     97 ]])
     98 
     99 AT_DATA([Makefile.in],
    100 [[foo@EXEEXT@: foo.@OBJEXT@
    101 	@F77@ @FFLAGS@ @LDFLAGS@ -o $@ foo.@OBJEXT@
    102 
    103 foo.@OBJEXT@: foo.f
    104 	@F77@ @FFLAGS@ -c foo.f
    105 ]])
    106 
    107 AT_DATA([foo.f],
    108 [[       program main
    109       end
    110 ]])
    111 
    112 : "${MAKE=make}"
    113 AT_CHECK([env ACLOCAL=true autoreconf -vi], [], [ignore], [ignore])
    114 AT_CHECK_CONFIGURE
    115 AT_CHECK([$MAKE], [], [ignore], [ignore])
    116 
    117 AT_CLEANUP
    118 
    119 
    120 ## ---------------------- ##
    121 ## AC_OPENMP and Fortran. ##
    122 ## ---------------------- ##
    123 
    124 AT_SETUP([AC_OPENMP and Fortran])
    125 
    126 AT_DATA([configure.ac],
    127 [[AC_INIT
    128 AC_PROG_FC
    129 AC_LANG([Fortran])
    130 AC_OPENMP
    131 if test "X$ac_cv_prog_fc_openmp" = Xunsupported; then
    132   AS_EXIT([77])
    133 fi
    134 FCFLAGS="$FCFLAGS $OPENMP_FCFLAGS"
    135 AC_CONFIG_FILES([Makefile])
    136 AC_OUTPUT
    137 ]])
    138 
    139 AT_DATA([Makefile.in],
    140 [[foo@EXEEXT@: foo.@OBJEXT@
    141 	@FC@ @FCFLAGS@ @LDFLAGS@ -o $@ foo.@OBJEXT@
    142 
    143 foo.@OBJEXT@: foo.f
    144 	@FC@ @FCFLAGS@ -c foo.f
    145 ]])
    146 
    147 AT_DATA([foo.f],
    148 [[      program main
    149       end
    150 ]])
    151 
    152 : "${MAKE=make}"
    153 AT_CHECK([env ACLOCAL=true autoreconf -vi], [], [ignore], [ignore])
    154 AT_CHECK_CONFIGURE
    155 AT_CHECK([$MAKE], [], [ignore], [ignore])
    156 
    157 AT_CLEANUP
    158 
    159 
    160 # We don't test the AC_F77_LIBRARY_LDFLAGS macro on its own because of
    161 # (autoconf.info)Fortran Compiler:
    162 #      The macros `AC_F77_DUMMY_MAIN' and `AC_FC_DUMMY_MAIN' or
    163 #    `AC_F77_MAIN' and `AC_FC_MAIN' are probably also necessary to link
    164 #    C/C++ with Fortran; see below.
    165 #
    166 # and we would need libtool to create shared libraries.
    167 
    168 # Further, for any sensible test of the AC_F{77,C}(_DUMMY)?_MAIN macros
    169 # we also need to use AC_F{77,C}_WRAPPERS, in order to be able to actually
    170 # call the functions.
    171 
    172 ## ------------------------ ##
    173 ## AC_F77_DUMMY_MAIN usage. ##
    174 ## ------------------------ ##
    175 
    176 AT_SETUP([AC_F77_DUMMY_MAIN usage])
    177 
    178 AT_CONFIGURE_AC([[
    179 AC_PROG_F77
    180 AC_F77_DUMMY_MAIN([], [AC_MSG_FAILURE([failed to determine F77 dummy main], [77])])
    181 AC_F77_WRAPPERS
    182 AC_PROG_CC
    183 AC_CONFIG_FILES([Makefile])
    184 ]])
    185 
    186 AT_DATA([Makefile.in],
    187 [[
    188 all: cprogram@EXEEXT@
    189 
    190 cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@
    191 	@CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FLIBS@
    192 
    193 .SUFFIXES: .c .f .@OBJEXT@
    194 .f.@OBJEXT@:
    195 	@F77@ @FFLAGS@ -c $<
    196 .c.@OBJEXT@:
    197 	@CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $<
    198 ]])
    199 
    200 AT_DATA([foobar.f],
    201 [[C     This is just a purely numeric routine, no I/O needed.
    202 C     Taken from autoconf.texi:Fortran Compiler.
    203       subroutine foobar (x, y)
    204       double precision x, y
    205       y = 3.14159 * x
    206       return
    207       end
    208 ]])
    209 
    210 AT_DATA([cprogram.c],
    211 [[#include <config.h>
    212 #include <math.h>
    213 
    214 /* Taken from autoconf.texi:Fortran Compiler. */
    215 #define FOOBAR_F77 F77_FUNC (foobar, FOOBAR)
    216 #ifdef __cplusplus
    217 extern "C"  /* prevent C++ name mangling */
    218 #endif
    219 void FOOBAR_F77 (double *x, double *y);
    220 
    221 /* Taken from autoconf.texi:Fortran Compiler.  */
    222 #ifdef F77_DUMMY_MAIN
    223 #  ifdef __cplusplus
    224      extern "C"
    225 #  endif
    226    int F77_DUMMY_MAIN () { return 1; }
    227 #endif
    228 
    229 int main(int argc, char *argv[])
    230 {
    231   double x = 2.7183, y;
    232   FOOBAR_F77 (&x, &y);
    233   if (fabs (8.539784097 - y) > 1.e-6)
    234     return 1;
    235   return 0;
    236 }
    237 ]])
    238 
    239 AT_CHECK_AUTOCONF
    240 AT_CHECK_AUTOHEADER
    241 AT_CHECK_CONFIGURE
    242 : "${MAKE=make}"
    243 AT_CHECK([$MAKE], [], [ignore], [ignore])
    244 dnl AT_CHECK([./cprogram])
    245 
    246 AT_CLEANUP
    247 
    248 
    249 ## ----------------------- ##
    250 ## AC_FC_DUMMY_MAIN usage. ##
    251 ## ----------------------- ##
    252 
    253 AT_SETUP([AC_FC_DUMMY_MAIN usage])
    254 
    255 AT_CONFIGURE_AC([[
    256 AC_PROG_FC
    257 AC_FC_FIXEDFORM
    258 AC_FC_DUMMY_MAIN([], [AC_MSG_FAILURE([failed to determine FC dummy main], [77])])
    259 AC_FC_WRAPPERS
    260 AC_PROG_CC
    261 AC_CONFIG_FILES([Makefile])
    262 ]])
    263 
    264 AT_DATA([Makefile.in],
    265 [[
    266 all: cprogram@EXEEXT@
    267 
    268 cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@
    269 	@CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FCLIBS@
    270 
    271 .SUFFIXES: .c .f .@OBJEXT@
    272 .f.@OBJEXT@:
    273 	@FC@ @FCFLAGS@ -c $<
    274 .c.@OBJEXT@:
    275 	@CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $<
    276 ]])
    277 
    278 AT_DATA([foobar.f],
    279 [[C     This is just a purely numeric routine, no I/O needed.
    280 C     Taken from autoconf.texi:Fortran Compiler.
    281       subroutine foobar (x, y)
    282       double precision x, y
    283       y = 3.14159 * x
    284       return
    285       end
    286 ]])
    287 
    288 AT_DATA([cprogram.c],
    289 [[#include <config.h>
    290 #include <math.h>
    291 
    292 /* Taken from autoconf.texi:Fortran Compiler. */
    293 #define FOOBAR_FC FC_FUNC (foobar, FOOBAR)
    294 #ifdef __cplusplus
    295 extern "C"  /* prevent C++ name mangling */
    296 #endif
    297 void FOOBAR_FC(double *x, double *y);
    298 
    299 /* Taken from autoconf.texi:Fortran Compiler.  */
    300 #ifdef FC_DUMMY_MAIN
    301 #  ifdef __cplusplus
    302      extern "C"
    303 #  endif
    304    int FC_DUMMY_MAIN () { return 1; }
    305 #endif
    306 
    307 int main (int argc, char *argv[])
    308 {
    309   double x = 2.7183, y;
    310   FOOBAR_FC (&x, &y);
    311   if (fabs (8.539784097 - y) > 1.e-6)
    312     return 1;
    313   return 0;
    314 }
    315 ]])
    316 
    317 AT_CHECK_AUTOCONF
    318 AT_CHECK_AUTOHEADER
    319 AT_CHECK_CONFIGURE
    320 : "${MAKE=make}"
    321 AT_CHECK([$MAKE], [], [ignore], [ignore])
    322 dnl AT_CHECK([./cprogram])
    323 
    324 AT_CLEANUP
    325 
    326 
    327 ## ------------------ ##
    328 ## AC_F77_MAIN usage. ##
    329 ## ------------------ ##
    330 
    331 AT_SETUP([AC_F77_MAIN usage])
    332 
    333 AT_CONFIGURE_AC([[
    334 AC_PROG_F77
    335 AC_F77_MAIN
    336 AC_F77_WRAPPERS
    337 AC_PROG_CC
    338 AC_CONFIG_FILES([Makefile])
    339 ]])
    340 
    341 AT_DATA([Makefile.in],
    342 [[
    343 all: cprogram@EXEEXT@
    344 
    345 cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@
    346 	@CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FLIBS@
    347 
    348 .SUFFIXES: .c .f .@OBJEXT@
    349 .f.@OBJEXT@:
    350 	@F77@ @FFLAGS@ -c $<
    351 .c.@OBJEXT@:
    352 	@CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $<
    353 ]])
    354 
    355 AT_DATA([foobar.f],
    356 [[C     This uses Fortran I/O, so is likely to require Fortran startup.
    357       subroutine foobar (x)
    358       integer x
    359       if (x == 42) then
    360         write(*,*) 'some output from Fortran sources'
    361       end if
    362       end
    363 ]])
    364 
    365 AT_DATA([cprogram.c],
    366 [[#include <config.h>
    367 #include <stdio.h>
    368 
    369 /* Taken from autoconf.texi:Fortran Compiler. */
    370 #define FOOBAR_F77 F77_FUNC (foobar, FOOBAR)
    371 #ifdef __cplusplus
    372 extern "C"  /* prevent C++ name mangling */
    373 #endif
    374 void FOOBAR_F77 (int *x);
    375 
    376 /* Taken from autoconf.texi:Fortran Compiler.  */
    377 #ifdef __cplusplus
    378   extern "C"
    379 #endif
    380 int F77_MAIN (int argc, char *argv[]);
    381 
    382 int F77_MAIN (int argc, char *argv[])
    383 {
    384   int x = 42;
    385   puts ("output from C main");
    386   fflush (stdout);
    387   FOOBAR_F77 (&x);
    388   puts ("more output from C main");
    389   return 0;
    390 }
    391 ]])
    392 
    393 AT_CHECK_AUTOCONF
    394 AT_CHECK_AUTOHEADER
    395 AT_CHECK_CONFIGURE
    396 : "${MAKE=make}"
    397 AT_CHECK([$MAKE], [], [ignore], [ignore])
    398 dnl AT_CHECK([./cprogram], [], [output from C main
    399 dnl  some output from Fortran sources
    400 dnl more output from C main
    401 dnl ])
    402 
    403 AT_CLEANUP
    404 
    405 
    406 ## ----------------- ##
    407 ## AC_FC_MAIN usage. ##
    408 ## ----------------- ##
    409 
    410 AT_SETUP([AC_FC_MAIN usage])
    411 
    412 AT_CONFIGURE_AC([[
    413 AC_PROG_FC
    414 AC_FC_FIXEDFORM
    415 AC_FC_MAIN
    416 AC_FC_WRAPPERS
    417 AC_PROG_CC
    418 AC_CONFIG_FILES([Makefile])
    419 ]])
    420 
    421 AT_DATA([Makefile.in],
    422 [[all: cprogram@EXEEXT@
    423 
    424 cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@
    425 	@CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FCLIBS@
    426 
    427 .SUFFIXES: .c .f .@OBJEXT@
    428 .f.@OBJEXT@:
    429 	@FC@ @FCFLAGS@ -c $<
    430 .c.@OBJEXT@:
    431 	@CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $<
    432 ]])
    433 
    434 AT_DATA([foobar.f],
    435 [[C     This uses Fortran I/O, so is likely to require Fortran startup.
    436       subroutine foobar (x)
    437       integer x
    438       if (x == 42) then
    439         write (*,*) 'some output from Fortran sources'
    440       end if
    441       end
    442 ]])
    443 
    444 AT_DATA([cprogram.c],
    445 [[#include <config.h>
    446 #include <stdio.h>
    447 
    448 /* Taken from autoconf.texi:Fortran Compiler. */
    449 #define FOOBAR_FC FC_FUNC (foobar, FOOBAR)
    450 #ifdef __cplusplus
    451 extern "C"  /* prevent C++ name mangling */
    452 #endif
    453 void FOOBAR_FC (int *x);
    454 
    455 /* Taken from autoconf.texi:Fortran Compiler.  */
    456 #ifdef __cplusplus
    457   extern "C"
    458 #endif
    459 int FC_MAIN (int argc, char *argv[]);
    460 
    461 int FC_MAIN (int argc, char *argv[])
    462 {
    463   int x = 42;
    464   puts ("output from C main");
    465   fflush (stdout);
    466   FOOBAR_FC (&x);
    467   puts ("more output from C main");
    468   return 0;
    469 }
    470 ]])
    471 
    472 AT_CHECK_AUTOCONF
    473 AT_CHECK_AUTOHEADER
    474 AT_CHECK_CONFIGURE
    475 : "${MAKE=make}"
    476 AT_CHECK([$MAKE], [], [ignore], [ignore])
    477 dnl AT_CHECK([./cprogram], [], [output from C main
    478 dnl  some output from Fortran sources
    479 dnl more output from C main
    480 dnl ])
    481 
    482 AT_CLEANUP
    483 
    484 
    485 ## ------------------ ##
    486 ## AC_F77_FUNC usage. ##
    487 ## ------------------ ##
    488 
    489 AT_SETUP([AC_F77_FUNC usage])
    490 
    491 AT_CONFIGURE_AC([[
    492 AC_PROG_F77
    493 AC_F77_FUNC([foobar])
    494 AC_SUBST([foobar])
    495 AC_PROG_CC
    496 AC_CONFIG_FILES([cprogram.c:cprogram.in])
    497 AC_CONFIG_FILES([Makefile])
    498 ]])
    499 
    500 AT_DATA([Makefile.in],
    501 [[
    502 all: cprogram@EXEEXT@
    503 
    504 cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@
    505 	@CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FLIBS@
    506 
    507 .SUFFIXES: .c .f .@OBJEXT@
    508 .f.@OBJEXT@:
    509 	@F77@ @FFLAGS@ -c $<
    510 .c.@OBJEXT@:
    511 	@CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $<
    512 ]])
    513 
    514 AT_DATA([foobar.f],
    515 [[      subroutine foobar (x)
    516       integer x
    517       x = 42
    518       return
    519       end
    520 ]])
    521 
    522 AT_DATA([cprogram.in],
    523 [[#include <config.h>
    524 #include <math.h>
    525 
    526 #ifdef __cplusplus
    527 extern "C"  /* prevent C++ name mangling */
    528 #endif
    529 void @foobar@ (int *x);
    530 
    531 /* Taken from autoconf.texi:Fortran Compiler.  */
    532 #ifdef F77_DUMMY_MAIN
    533 #  ifdef __cplusplus
    534      extern "C"
    535 #  endif
    536    int F77_DUMMY_MAIN () { return 1; }
    537 #endif
    538 
    539 int main(int argc, char *argv[])
    540 {
    541   int x;
    542   @foobar@ (&x);
    543   if (x != 42)
    544     return 1;
    545   return 0;
    546 }
    547 ]])
    548 
    549 AT_CHECK_AUTOCONF
    550 AT_CHECK_AUTOHEADER
    551 AT_CHECK_CONFIGURE
    552 : "${MAKE=make}"
    553 AT_CHECK([$MAKE], [], [ignore], [ignore])
    554 dnl AT_CHECK([./cprogram])
    555 
    556 AT_CLEANUP
    557 
    558 
    559 ## ----------------- ##
    560 ## AC_FC_FUNC usage. ##
    561 ## ----------------- ##
    562 
    563 AT_SETUP([AC_FC_FUNC usage])
    564 
    565 AT_CONFIGURE_AC([[
    566 AC_PROG_FC
    567 AC_FC_FUNC([foobar])
    568 AC_SUBST([foobar])
    569 AC_PROG_CC
    570 AC_CONFIG_FILES([cprogram.c:cprogram.in])
    571 AC_CONFIG_FILES([Makefile])
    572 ]])
    573 
    574 AT_DATA([Makefile.in],
    575 [[
    576 all: cprogram@EXEEXT@
    577 
    578 cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@
    579 	@CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FCLIBS@
    580 
    581 .SUFFIXES: .c .f .@OBJEXT@
    582 .f.@OBJEXT@:
    583 	@FC@ @FCFLAGS@ -c $<
    584 .c.@OBJEXT@:
    585 	@CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $<
    586 ]])
    587 
    588 AT_DATA([foobar.f],
    589 [[      subroutine foobar (x)
    590       integer x
    591       x = 42
    592       return
    593       end
    594 ]])
    595 
    596 AT_DATA([cprogram.in],
    597 [[#include <config.h>
    598 #include <math.h>
    599 
    600 #ifdef __cplusplus
    601 extern "C"  /* prevent C++ name mangling */
    602 #endif
    603 void @foobar@ (int *x);
    604 
    605 /* Taken from autoconf.texi:Fortran Compiler.  */
    606 #ifdef FC_DUMMY_MAIN
    607 #  ifdef __cplusplus
    608      extern "C"
    609 #  endif
    610    int FC_DUMMY_MAIN () { return 1; }
    611 #endif
    612 
    613 int main(int argc, char *argv[])
    614 {
    615   int x;
    616   @foobar@ (&x);
    617   if (x != 42)
    618     return 1;
    619   return 0;
    620 }
    621 ]])
    622 
    623 AT_CHECK_AUTOCONF
    624 AT_CHECK_AUTOHEADER
    625 AT_CHECK_CONFIGURE
    626 : "${MAKE=make}"
    627 AT_CHECK([$MAKE], [], [ignore], [ignore])
    628 dnl AT_CHECK([./cprogram])
    629 AT_CLEANUP
    630 
    631 
    632 ## ------------------- ##
    633 ## AC_FC_SRCEXT usage. ##
    634 ## ------------------- ##
    635 
    636 AT_SETUP([AC_FC_SRCEXT usage])
    637 
    638 AT_DATA([configure.ac],
    639 [[AC_INIT
    640 AC_PROG_FC
    641 FCFLAGS_NOFREE=$FCFLAGS
    642 AC_SUBST([FCFLAGS_NOFREE])
    643 AC_FC_FREEFORM
    644 # Unconditionally require .f to work.
    645 AC_FC_SRCEXT([f])
    646 # For each other extension, fail gracefully if it does not work:
    647 # Not all compilers support all extensions/language versions.
    648 m4@&t@_foreach([ext], [f77, f90, f95, f03, f08],
    649   [AC_FC_SRCEXT(ext, ext[_object='foo]ext[.$(OBJEXT)'], ext[_object=])
    650    AC_SUBST(ext[_object])])
    651 AC_CONFIG_FILES([Makefile])
    652 AC_OUTPUT
    653 ]])
    654 
    655 AT_DATA([Makefile.in],
    656 [[OBJEXT = @OBJEXT@
    657 
    658 all: prog@EXEEXT@
    659 prog@EXEEXT@: foof.@OBJEXT@ @f77_object@ @f90_object@ \
    660 	      @f95_object@ @f03_object@ @f08_object@
    661 	@FC@ @FCFLAGS@ -o $@ foof.@OBJEXT@ @f77_object@ @f90_object@ \
    662 			     @f95_object@ @f03_object@ @f08_object@
    663 
    664 .SUFFIXES: .f .f77 .f90 .f95 .f03 .f08 .@OBJEXT@
    665 .f.@OBJEXT@:
    666 	@FC@ -c @FCFLAGS_NOFREE@ @FCFLAGS_f@ $<
    667 .f77.@OBJEXT@:
    668 	@FC@ -c @FCFLAGS_NOFREE@ @FCFLAGS_f77@ $<
    669 .f90.@OBJEXT@:
    670 	@FC@ -c @FCFLAGS@ @FCFLAGS_f90@ $<
    671 .f95.@OBJEXT@:
    672 	@FC@ -c @FCFLAGS@ @FCFLAGS_f95@ $<
    673 .f03.@OBJEXT@:
    674 	@FC@ -c @FCFLAGS@ @FCFLAGS_f03@ $<
    675 .f08.@OBJEXT@:
    676 	@FC@ -c @FCFLAGS@ @FCFLAGS_f08@ $<
    677 ]])
    678 
    679 AT_DATA([foof.f],
    680 [[      program main
    681       end
    682 ]])
    683 
    684 AT_DATA([foof77.f77],
    685 [[      subroutine foof77
    686       end
    687 ]])
    688 
    689 AT_DATA([foof90.f90],
    690 [[subroutine foof90
    691 end
    692 ]])
    693 
    694 AT_DATA([foof95.f95],
    695 [[subroutine foof95
    696 end
    697 ]])
    698 
    699 AT_DATA([foof03.f03],
    700 [[subroutine foof03
    701 end
    702 ]])
    703 
    704 AT_DATA([foof08.f08],
    705 [[subroutine foof08
    706 end
    707 ]])
    708 
    709 AT_CHECK_AUTOCONF
    710 AT_CHECK_CONFIGURE
    711 : "${MAKE=make}"
    712 AT_CHECK([$MAKE], [], [ignore], [ignore])
    713 
    714 AT_CLEANUP
    715 
    716 
    717 ## ---------------------- ##
    718 ## AC_FC_PP_SRCEXT usage. ##
    719 ## ---------------------- ##
    720 
    721 AT_SETUP([AC_FC_PP_SRCEXT usage])
    722 
    723 AT_DATA([configure.ac],
    724 [[AC_INIT
    725 AC_PROG_FC
    726 # Unconditionally require .f and .F to work.
    727 AC_FC_PP_SRCEXT([f])
    728 AC_FC_PP_SRCEXT([F])
    729 # For each other extension, fail gracefully if it does not work:
    730 # Not all compilers support all extensions/language versions.
    731 m4@&t@_foreach([ext], [f77, f90, f95, f03, f08],
    732   [AC_FC_PP_SRCEXT(ext, ext[_object='foo]ext[.$(OBJEXT)'], ext[_object=])
    733    AC_SUBST(ext[_object])])
    734 m4@&t@_foreach([ext], [F77, F90, F95, F03, F08],
    735   [AC_FC_PP_SRCEXT(ext, ext[_object='bar]ext[.$(OBJEXT)'], ext[_object=])
    736    AC_SUBST(ext[_object])])
    737 AC_CONFIG_FILES([Makefile])
    738 AC_OUTPUT
    739 ]])
    740 
    741 AT_DATA([Makefile.in],
    742 [[OBJEXT = @OBJEXT@
    743 
    744 all: prog@EXEEXT@
    745 prog@EXEEXT@: foof.@OBJEXT@ @f77_object@ @f90_object@ \
    746 	      @f95_object@ @f03_object@ @f08_object@ \
    747 	      barF.@OBJEXT@ @F77_object@ @F90_object@ \
    748 	      @F95_object@ @F03_object@ @F08_object@
    749 	@FC@ @FCFLAGS@ -o $@ foof.@OBJEXT@ @f77_object@ @f90_object@ \
    750 			     @f95_object@ @f03_object@ @f08_object@ \
    751 			     barF.@OBJEXT@ @F77_object@ @F90_object@ \
    752 			     @F95_object@ @F03_object@ @F08_object@
    753 
    754 .SUFFIXES: .f .f77 .f90 .f95 .f03 .f08 .F .F77 .F90 .F95 .F03 .F08 .@OBJEXT@
    755 .f.@OBJEXT@:
    756 	@FC@ -c @FCFLAGS@ @FCFLAGS_f@ $<
    757 .f77.@OBJEXT@:
    758 	@FC@ -c @FCFLAGS@ @FCFLAGS_f77@ $<
    759 .f90.@OBJEXT@:
    760 	@FC@ -c @FCFLAGS@ @FCFLAGS_f90@ $<
    761 .f95.@OBJEXT@:
    762 	@FC@ -c @FCFLAGS@ @FCFLAGS_f95@ $<
    763 .f03.@OBJEXT@:
    764 	@FC@ -c @FCFLAGS@ @FCFLAGS_f03@ $<
    765 .f08.@OBJEXT@:
    766 	@FC@ -c @FCFLAGS@ @FCFLAGS_f08@ $<
    767 .F.@OBJEXT@:
    768 	@FC@ -c @FCFLAGS@ @FCFLAGS_F@ $<
    769 .F77.@OBJEXT@:
    770 	@FC@ -c @FCFLAGS@ @FCFLAGS_F77@ $<
    771 .F90.@OBJEXT@:
    772 	@FC@ -c @FCFLAGS@ @FCFLAGS_F90@ $<
    773 .F95.@OBJEXT@:
    774 	@FC@ -c @FCFLAGS@ @FCFLAGS_F95@ $<
    775 .F03.@OBJEXT@:
    776 	@FC@ -c @FCFLAGS@ @FCFLAGS_F03@ $<
    777 .F08.@OBJEXT@:
    778 	@FC@ -c @FCFLAGS@ @FCFLAGS_F08@ $<
    779 ]])
    780 
    781 for ext in f77 f90 f95 f03 f08; do
    782   cat > foo$ext.$ext <<EOF
    783       subroutine foo$ext
    784 #if 0
    785 this is not correct fortran
    786 #endif
    787       end
    788 EOF
    789 done
    790 
    791 for ext in F F77 F90 F95 F03 F08; do
    792   cat > bar$ext.$ext <<EOF
    793       subroutine bar$ext
    794 #if 0
    795 this is not correct fortran
    796 #endif
    797       end
    798 EOF
    799 done
    800 
    801 AT_DATA([foof.f],
    802 [[      program main
    803 #if 0
    804 this is not correct fortran
    805 #endif
    806       end
    807 ]])
    808 
    809 AT_CHECK_AUTOCONF
    810 AT_CHECK_CONFIGURE
    811 : "${MAKE=make}"
    812 AT_CHECK([$MAKE], [], [ignore], [ignore])
    813 
    814 AT_CLEANUP
    815 
    816 
    817 ## --------------- ##
    818 ## AC_FC_FREEFORM. ##
    819 ## --------------- ##
    820 
    821 AT_SETUP([AC_FC_FREEFORM])
    822 
    823 AT_DATA([configure.ac],
    824 [[AC_INIT
    825 AC_PROG_FC
    826 AC_FC_FREEFORM
    827 AC_CONFIG_FILES([Makefile])
    828 AC_OUTPUT
    829 ]])
    830 
    831 AT_DATA([Makefile.in],
    832 [[prog: prog.@OBJEXT@
    833 	@FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
    834 
    835 .SUFFIXES: .f .@OBJEXT@
    836 .f.@OBJEXT@:
    837 	@FC@ @FCFLAGS@ -c $<
    838 ]])
    839 
    840 AT_DATA([prog.f],
    841 [[program main
    842 end
    843 ]])
    844 
    845 AT_CHECK_AUTOCONF
    846 AT_CHECK_CONFIGURE
    847 : "${MAKE=make}"
    848 AT_CHECK([$MAKE], [], [ignore], [ignore])
    849 dnl AT_CHECK([./prog])
    850 
    851 AT_CLEANUP
    852 
    853 
    854 ## --------------------------------- ##
    855 ## AC_FC_FREEFORM with AC_FC_SRCEXT. ##
    856 ## --------------------------------- ##
    857 
    858 AT_SETUP([AC_FC_FREEFORM with AC_FC_SRCEXT])
    859 
    860 AT_DATA([configure.ac],
    861 [[AC_INIT
    862 AC_FC_SRCEXT([f90], [], [AS_EXIT([77])])
    863 AC_PROG_FC
    864 AC_FC_FREEFORM
    865 AC_CONFIG_FILES([Makefile])
    866 AC_OUTPUT
    867 ]])
    868 
    869 AT_DATA([Makefile.in],
    870 [[prog: prog.@OBJEXT@
    871 	@FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
    872 
    873 .SUFFIXES: .f90 .@OBJEXT@
    874 .f90.@OBJEXT@:
    875 	@FC@ @FCFLAGS@ -c @FCFLAGS_f90@ $<
    876 ]])
    877 
    878 AT_DATA([prog.f90],
    879 [[program main
    880 end
    881 ]])
    882 
    883 AT_CHECK_AUTOCONF
    884 AT_CHECK_CONFIGURE
    885 : "${MAKE=make}"
    886 AT_CHECK([$MAKE], [], [ignore], [ignore])
    887 dnl AT_CHECK([./prog])
    888 
    889 AT_CLEANUP
    890 
    891 
    892 ## ---------------- ##
    893 ## AC_FC_FIXEDFORM. ##
    894 ## ---------------- ##
    895 
    896 AT_SETUP([AC_FC_FIXEDFORM])
    897 
    898 AT_DATA([configure.ac],
    899 [[AC_INIT
    900 AC_PROG_FC
    901 AC_FC_FIXEDFORM
    902 AC_CONFIG_FILES([Makefile])
    903 AC_OUTPUT
    904 ]])
    905 
    906 AT_DATA([Makefile.in],
    907 [[prog: prog.@OBJEXT@
    908 	@FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
    909 
    910 .SUFFIXES: .f .@OBJEXT@
    911 .f.@OBJEXT@:
    912 	@FC@ @FCFLAGS@ -c $<
    913 ]])
    914 
    915 AT_DATA([prog.f],
    916 [[      program main
    917 C      fixed-form style comment
    918        end
    919 ]])
    920 
    921 AT_CHECK_AUTOCONF
    922 AT_CHECK_CONFIGURE
    923 : "${MAKE=make}"
    924 AT_CHECK([$MAKE], [], [ignore], [ignore])
    925 dnl AT_CHECK([./prog])
    926 
    927 AT_CLEANUP
    928 
    929 
    930 ## ---------------------------------- ##
    931 ## AC_FC_FIXEDFORM with AC_FC_SRCEXT. ##
    932 ## ---------------------------------- ##
    933 
    934 AT_SETUP([AC_FC_FIXEDFORM with AC_FC_SRCEXT])
    935 
    936 AT_DATA([configure.ac],
    937 [[AC_INIT
    938 AC_PROG_FC
    939 AC_FC_SRCEXT([f90], [], [AS_EXIT([77])])
    940 AC_FC_FIXEDFORM
    941 AC_CONFIG_FILES([Makefile])
    942 AC_OUTPUT
    943 ]])
    944 
    945 AT_DATA([Makefile.in],
    946 [[prog: prog.@OBJEXT@
    947 	@FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
    948 
    949 .SUFFIXES: .f90 .@OBJEXT@
    950 .f90.@OBJEXT@:
    951 	@FC@ @FCFLAGS@ -c @FCFLAGS_f90@ $<
    952 ]])
    953 
    954 AT_DATA([prog.f90],
    955 [[      program main
    956 C      fixed-form style comment
    957        end
    958 ]])
    959 
    960 AT_CHECK_AUTOCONF
    961 AT_CHECK_CONFIGURE
    962 : "${MAKE=make}"
    963 AT_CHECK([$MAKE], [], [ignore], [ignore])
    964 dnl AT_CHECK([./prog])
    965 
    966 AT_CLEANUP
    967 
    968 
    969 ## ------------------ ##
    970 ## AC_FC_LINE_LENGTH. ##
    971 ## ------------------ ##
    972 
    973 AT_SETUP([AC_FC_LINE_LENGTH])
    974 
    975 AT_DATA([Makefile.in],
    976 [[prog@EXEEXT@: prog.@OBJEXT@
    977 	@FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
    978 
    979 .SUFFIXES: .f .@OBJEXT@
    980 .f.@OBJEXT@:
    981 	@FC@ @FCFLAGS@ -c @FCFLAGS_f@ $<
    982 
    983 clean:
    984 	rm -f *.@OBJEXT@ prog@EEXEXT@
    985 ]])
    986 
    987 line_80=\
    988 'subroutine foo(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11)'
    989 line_132=\
    990 'subroutine foo(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,'\
    991 'arg12,arg13,arg14,arg15,arg16,arg17,arg18,arg19)'
    992 line_254=\
    993 'subroutine foo(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,'\
    994 'arg12,arg13,arg14,arg15,arg16,arg17,arg18,arg19,arg20,arg21,arg22,arg23,'\
    995 'arg24,arg25,arg26,arg27,arg28,arg29,arg30,arg31,arg32,arg33,arg34,arg35,'\
    996 'arg36,arg37,arg38,arg39,arg40)'
    997 
    998 for len in 80 132 254
    999 do
   1000   if test $len -eq 254; then arg=unlimited; else arg=$len; fi
   1001   eval long_line=\$line_$len
   1002 
   1003   # Try free-form first, it has a bigger chance of succeeding.
   1004   for fixed_or_free in FREEFORM FIXEDFORM
   1005   do
   1006 
   1007     cat >configure.ac <<EOF
   1008 AC_INIT
   1009 AC_PROG_FC
   1010 AC_FC_SRCEXT([f])
   1011 AC_FC_$fixed_or_free
   1012 AC_FC_LINE_LENGTH([$arg])
   1013 AC_CONFIG_FILES([Makefile])
   1014 AC_OUTPUT
   1015 EOF
   1016 
   1017     cat >prog.f <<EOF
   1018        $long_line
   1019        end subroutine
   1020        program main
   1021        end program
   1022 EOF
   1023 
   1024     AT_CHECK_AUTOCONF
   1025     AT_CHECK_CONFIGURE
   1026     : "${MAKE=make}"
   1027     AT_CHECK([$MAKE], [], [ignore], [ignore])
   1028     dnl AT_CHECK([./prog])
   1029     AT_CHECK([$MAKE clean], [], [ignore], [ignore])
   1030 
   1031   done
   1032 done
   1033 
   1034 AT_CLEANUP
   1035 
   1036 
   1037 ## ------------------- ##
   1038 ## AC_FC_CHECK_BOUNDS. ##
   1039 ## ------------------- ##
   1040 
   1041 AT_SETUP([AC_FC_CHECK_BOUNDS])
   1042 
   1043 AT_DATA([Makefile.in],
   1044 [[prog@EXEEXT@: prog.@OBJEXT@
   1045 	@FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
   1046 
   1047 .SUFFIXES: .f .@OBJEXT@
   1048 .f.@OBJEXT@:
   1049 	@FC@ @FCFLAGS@ -c @FCFLAGS_f@ $<
   1050 
   1051 clean:
   1052 	rm -f *.@OBJEXT@ prog@EEXEXT@
   1053 ]])
   1054 
   1055 cat >configure.ac <<EOF
   1056 AC_INIT
   1057 AC_PROG_FC
   1058 AC_FC_SRCEXT([f])
   1059 AC_FC_CHECK_BOUNDS
   1060 AC_CONFIG_FILES([Makefile])
   1061 AC_OUTPUT
   1062 EOF
   1063 
   1064 AT_DATA([prog.f],
   1065 [[
   1066       subroutine copy(a,b,n)
   1067       integer a(:), b(:), n, i
   1068       do i = 1, n
   1069          a(i) = b(i)
   1070       end do
   1071       end subroutine
   1072 
   1073       program main
   1074       integer, parameter :: n = 20
   1075       integer a(1:n), b(1:n-1), i
   1076       interface
   1077          subroutine copy(a,b,n)
   1078          integer a(:), b(:), i
   1079          end subroutine
   1080       end interface
   1081 
   1082       call copy(a,b,n)
   1083       end program
   1084 ]])
   1085 
   1086 AT_CHECK_AUTOCONF
   1087 AT_CHECK_CONFIGURE
   1088 : "${MAKE=make}"
   1089 AT_CHECK([$MAKE], [], [ignore], [ignore])
   1090 AT_CHECK([./prog || exit 1], [1], [ignore], [ignore])
   1091 AT_CHECK([$MAKE clean], [], [ignore], [ignore])
   1092 
   1093 AT_CLEANUP
   1094 
   1095 
   1096 ## ------------------ ##
   1097 ## AC_FC_MODULE_FLAG. ##
   1098 ## ------------------ ##
   1099 
   1100 AT_SETUP([AC_FC_MODULE_FLAG])
   1101 
   1102 AT_DATA([Makefile.in],
   1103 [[OBJEXT = @OBJEXT@
   1104 EXEEXT = @EXEEXT@
   1105 LIBS = @LIBS@
   1106 ac_empty = @ac_empty@
   1107 FC = @FC@
   1108 FC_MODEXT = @FC_MODEXT@
   1109 FC_MODINC = @FC_MODINC@
   1110 FCFLAGS = @FCFLAGS@
   1111 FCFLAGS_f = @FCFLAGS_f@
   1112 
   1113 prog$(EXEEXT): sub/mod.$(OBJEXT) prog.$(OBJEXT)
   1114 	$(FC) $(FCFLAGS) -o $@ prog.$(OBJEXT) sub/mod.$(OBJEXT) $(LIBS)
   1115 
   1116 sub/mod.$(OBJEXT): sub/mod.f
   1117 	cd sub && $(FC) $(FCFLAGS) -c $(FCFLAGS_f) mod.f
   1118 
   1119 # Depend on the object, for the module dependency.
   1120 prog.$(OBJEXT): prog.f sub/mod.$(OBJEXT)
   1121 	$(FC) $(FCFLAGS) $(FC_MODINC). $(FC_MODINC)sub -c $(FCFLAGS_f) $<
   1122 
   1123 clean:
   1124 	-test -z "$(FC_MODEXT)" || rm -f *.$(FC_MODEXT) sub/*.$(FC_MODEXT)
   1125 	-rm -f *.$(OBJEXT) sub/*.$(OBJEXT) prog$(EXEEXT)
   1126 ]])
   1127 
   1128 AT_DATA([configure.ac],
   1129 [[AC_INIT
   1130 AC_PROG_FC
   1131 AC_FC_SRCEXT([f])
   1132 AC_FC_MODULE_FLAG
   1133 if test -n "$FC_MODINC"; then
   1134   FCFLAGS="$FCFLAGS $FC_MODINC. ${FC_MODINC}sub"
   1135 fi
   1136 AC_FC_MODULE_EXTENSION
   1137 AC_CONFIG_FILES([Makefile])
   1138 AC_OUTPUT
   1139 ]])
   1140 
   1141 mkdir sub
   1142 
   1143 AT_DATA([sub/mod.f],
   1144 [[      module foobar
   1145       end module foobar
   1146 ]])
   1147 
   1148 AT_DATA([prog.f],
   1149 [[      program main
   1150       use foobar
   1151       end program
   1152 ]])
   1153 
   1154 AT_CHECK_AUTOCONF
   1155 AT_CHECK_CONFIGURE
   1156 : "${MAKE=make}"
   1157 AT_CHECK([$MAKE], [], [stdout], [stderr])
   1158 # Both the FCFLAGS setting from configure.ac, and the Makefile rule
   1159 # should add to the module search path.
   1160 AT_CHECK([grep 'sub .*sub ' stdout stderr], [], [ignore])
   1161 AT_CHECK([./prog], [], [ignore], [ignore])
   1162 AT_CHECK([$MAKE clean], [], [ignore], [ignore])
   1163 
   1164 AT_CLEANUP
   1165