make update-copyright
[autoconf.git] / tests / fortran.at
blob75b50b1a70d8654e772c129b20f3caaaa4ee4e0a
1 #                                                       -*- Autotest -*-
3 AT_BANNER([Fortran low level compiling/preprocessing macros.])
5 # Copyright (C) 2000-2001, 2003, 2008-2017, 2020-2022 Free Software
6 # Foundation, Inc.
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.
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.
18 # You should have received a copy of the GNU General Public License
19 # along with this program.  If not, see <https://www.gnu.org/licenses/>.
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.
26 ## --------------------- ##
27 ## Fortran 77 Compiler.  ##
28 ## --------------------- ##
31 AT_CHECK_MACRO([GNU Fortran 77],
32 [[AC_LANG(Fortran 77)
33 AC_LANG_COMPILER
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])
52 ]])
56 ## ------------------ ##
57 ## Fortran Compiler.  ##
58 ## ------------------ ##
61 AT_CHECK_MACRO([GNU Fortran],
62 [[AC_LANG(Fortran)
63 AC_LANG_COMPILER
65 # No Fortran compiler is known not to support "*.f".
66 AC_FC_SRCEXT([f])
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
77 ]])
80 ## ------------------------- ##
81 ## AC_OPENMP and Fortran 77. ##
82 ## ------------------------- ##
84 AT_SETUP([AC_OPENMP and Fortran 77])
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])
94 FFLAGS="$FFLAGS $OPENMP_FFLAGS"
95 AC_CONFIG_FILES([Makefile])
96 AC_OUTPUT
97 ]])
99 AT_DATA([Makefile.in],
100 [[foo@EXEEXT@: foo.@OBJEXT@
101         @F77@ @FFLAGS@ @LDFLAGS@ -o $@ foo.@OBJEXT@
103 foo.@OBJEXT@: foo.f
104         @F77@ @FFLAGS@ -c foo.f
107 AT_DATA([foo.f],
108 [[       program main
109       end
112 # Prevent autoreconf from running aclocal, which might not exist,
113 # or could barf over warnings in third-party macro files.
114 AT_DATA([aclocal.m4])
115 ACLOCAL=true
116 export ACLOCAL
118 AT_CHECK([autoreconf -vi], [], [ignore], [ignore])
119 AT_CHECK_CONFIGURE
120 AT_CHECK_MAKE
122 AT_CLEANUP
125 ## ---------------------- ##
126 ## AC_OPENMP and Fortran. ##
127 ## ---------------------- ##
129 AT_SETUP([AC_OPENMP and Fortran])
131 AT_DATA([configure.ac],
132 [[AC_INIT
133 AC_PROG_FC
134 AC_LANG([Fortran])
135 AC_OPENMP
136 if test "X$ac_cv_prog_fc_openmp" = Xunsupported; then
137   AS_EXIT([77])
139 FCFLAGS="$FCFLAGS $OPENMP_FCFLAGS"
140 AC_CONFIG_FILES([Makefile])
141 AC_OUTPUT
144 AT_DATA([Makefile.in],
145 [[foo@EXEEXT@: foo.@OBJEXT@
146         @FC@ @FCFLAGS@ @LDFLAGS@ -o $@ foo.@OBJEXT@
148 foo.@OBJEXT@: foo.f
149         @FC@ @FCFLAGS@ -c foo.f
152 AT_DATA([foo.f],
153 [[      program main
154       end
157 # Prevent autoreconf from running aclocal, which might not exist,
158 # or could barf over warnings in third-party macro files.
159 AT_DATA([aclocal.m4])
160 ACLOCAL=true
161 export ACLOCAL
163 AT_CHECK([autoreconf -vi], [], [ignore], [ignore])
164 AT_CHECK_CONFIGURE
165 AT_CHECK_MAKE
167 AT_CLEANUP
170 # We don't test the AC_F77_LIBRARY_LDFLAGS macro on its own because of
171 # (autoconf.info)Fortran Compiler:
172 #      The macros 'AC_F77_DUMMY_MAIN' and 'AC_FC_DUMMY_MAIN' or
173 #    'AC_F77_MAIN' and 'AC_FC_MAIN' are probably also necessary to link
174 #    C/C++ with Fortran; see below.
176 # and we would need libtool to create shared libraries.
178 # Further, for any sensible test of the AC_F{77,C}(_DUMMY)?_MAIN macros
179 # we also need to use AC_F{77,C}_WRAPPERS, in order to be able to actually
180 # call the functions.
182 ## ------------------------ ##
183 ## AC_F77_DUMMY_MAIN usage. ##
184 ## ------------------------ ##
186 AT_SETUP([AC_F77_DUMMY_MAIN usage])
188 AT_CONFIGURE_AC([[
189 AC_PROG_F77
190 AC_F77_DUMMY_MAIN([], [AC_MSG_FAILURE([failed to determine F77 dummy main], [77])])
191 AC_F77_WRAPPERS
192 AC_PROG_CC
193 AC_CONFIG_FILES([Makefile])
196 AT_DATA([Makefile.in],
198 all: cprogram@EXEEXT@
200 cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@
201         @CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FLIBS@
203 .SUFFIXES: .c .f .@OBJEXT@
204 .f.@OBJEXT@:
205         @F77@ @FFLAGS@ -c $<
206 .c.@OBJEXT@:
207         @CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $<
210 AT_DATA([foobar.f],
211 [[C     This is just a purely numeric routine, no I/O needed.
212 C     Taken from autoconf.texi:Fortran Compiler.
213       subroutine foobar (x, y)
214       double precision x, y
215       y = 3.14159 * x
216       return
217       end
220 AT_DATA([cprogram.c],
221 [[#include <config.h>
222 #include <math.h>
224 /* Taken from autoconf.texi:Fortran Compiler. */
225 #define FOOBAR_F77 F77_FUNC (foobar, FOOBAR)
226 #ifdef __cplusplus
227 extern "C"  /* prevent C++ name mangling */
228 #endif
229 void FOOBAR_F77 (double *x, double *y);
231 /* Taken from autoconf.texi:Fortran Compiler.  */
232 #ifdef F77_DUMMY_MAIN
233 #  ifdef __cplusplus
234      extern "C"
235 #  endif
236    int F77_DUMMY_MAIN () { return 1; }
237 #endif
239 int main(int argc, char *argv[])
241   double x = 2.7183, y;
242   FOOBAR_F77 (&x, &y);
243   if (fabs (8.539784097 - y) > 1.e-6)
244     return 1;
245   return 0;
249 AT_CHECK_AUTOCONF
250 AT_CHECK_AUTOHEADER([], [
251   F77_DUMMY_MAIN
252   F77_FUNC
253   F77_FUNC_
254   FC_DUMMY_MAIN_EQ_F77
256 AT_CHECK_CONFIGURE
257 AT_CHECK_MAKE
258 AT_CHECK([./cprogram])
260 AT_CLEANUP
263 ## ----------------------- ##
264 ## AC_FC_DUMMY_MAIN usage. ##
265 ## ----------------------- ##
267 AT_SETUP([AC_FC_DUMMY_MAIN usage])
269 AT_CONFIGURE_AC([[
270 AC_PROG_FC
271 AC_FC_FIXEDFORM
272 AC_FC_DUMMY_MAIN([], [AC_MSG_FAILURE([failed to determine FC dummy main], [77])])
273 AC_FC_WRAPPERS
274 AC_PROG_CC
275 AC_CONFIG_FILES([Makefile])
278 AT_DATA([Makefile.in],
280 all: cprogram@EXEEXT@
282 cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@
283         @CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FCLIBS@
285 .SUFFIXES: .c .f .@OBJEXT@
286 .f.@OBJEXT@:
287         @FC@ @FCFLAGS@ -c $<
288 .c.@OBJEXT@:
289         @CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $<
292 AT_DATA([foobar.f],
293 [[C     This is just a purely numeric routine, no I/O needed.
294 C     Taken from autoconf.texi:Fortran Compiler.
295       subroutine foobar (x, y)
296       double precision x, y
297       y = 3.14159 * x
298       return
299       end
302 AT_DATA([cprogram.c],
303 [[#include <config.h>
304 #include <math.h>
306 /* Taken from autoconf.texi:Fortran Compiler. */
307 #define FOOBAR_FC FC_FUNC (foobar, FOOBAR)
308 #ifdef __cplusplus
309 extern "C"  /* prevent C++ name mangling */
310 #endif
311 void FOOBAR_FC(double *x, double *y);
313 /* Taken from autoconf.texi:Fortran Compiler.  */
314 #ifdef FC_DUMMY_MAIN
315 #  ifdef __cplusplus
316      extern "C"
317 #  endif
318    int FC_DUMMY_MAIN () { return 1; }
319 #endif
321 int main (int argc, char *argv[])
323   double x = 2.7183, y;
324   FOOBAR_FC (&x, &y);
325   if (fabs (8.539784097 - y) > 1.e-6)
326     return 1;
327   return 0;
331 AT_CHECK_AUTOCONF
332 AT_CHECK_AUTOHEADER([], [
333   FC_DUMMY_MAIN
334   FC_DUMMY_MAIN_EQ_F77
335   FC_FUNC
336   FC_FUNC_
338 AT_CHECK_CONFIGURE
339 AT_CHECK_MAKE
340 AT_CHECK([./cprogram])
342 AT_CLEANUP
345 ## ------------------ ##
346 ## AC_F77_MAIN usage. ##
347 ## ------------------ ##
349 AT_SETUP([AC_F77_MAIN usage])
351 AT_CONFIGURE_AC([[
352 AC_PROG_F77
353 AC_F77_MAIN
354 AC_F77_WRAPPERS
355 AC_PROG_CC
356 AC_CONFIG_FILES([Makefile])
359 AT_DATA([Makefile.in],
361 all: cprogram@EXEEXT@
363 cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@
364         @CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FLIBS@
366 .SUFFIXES: .c .f .@OBJEXT@
367 .f.@OBJEXT@:
368         @F77@ @FFLAGS@ -c $<
369 .c.@OBJEXT@:
370         @CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $<
373 AT_DATA([foobar.f],
374 [[C     This uses Fortran I/O, so is likely to require Fortran startup.
375       subroutine foobar (x)
376       integer x
377       if (x == 42) then
378         write(*,*) 'some output from Fortran sources'
379       end if
380       end
383 AT_DATA([cprogram.c],
384 [[#include <config.h>
385 #include <stdio.h>
387 /* Taken from autoconf.texi:Fortran Compiler. */
388 #define FOOBAR_F77 F77_FUNC (foobar, FOOBAR)
389 #ifdef __cplusplus
390 extern "C"  /* prevent C++ name mangling */
391 #endif
392 void FOOBAR_F77 (int *x);
394 /* Taken from autoconf.texi:Fortran Compiler.  */
395 #ifdef __cplusplus
396   extern "C"
397 #endif
398 int F77_MAIN (int argc, char *argv[]);
400 int F77_MAIN (int argc, char *argv[])
402   int x = 42;
403   puts ("output from C main");
404   fflush (stdout);
405   FOOBAR_F77 (&x);
406   puts ("more output from C main");
407   return 0;
411 AT_CHECK_AUTOCONF
412 AT_CHECK_AUTOHEADER([], [
413   F77_DUMMY_MAIN
414   F77_FUNC
415   F77_FUNC_
416   F77_MAIN
417   FC_DUMMY_MAIN_EQ_F77
419 AT_CHECK_CONFIGURE
420 AT_CHECK_MAKE
421 AT_CHECK([./cprogram], [], [output from C main
422  some output from Fortran sources
423 more output from C main
426 AT_CLEANUP
429 ## ----------------- ##
430 ## AC_FC_MAIN usage. ##
431 ## ----------------- ##
433 AT_SETUP([AC_FC_MAIN usage])
435 AT_CONFIGURE_AC([[
436 AC_PROG_FC
437 AC_FC_FIXEDFORM
438 AC_FC_MAIN
439 AC_FC_WRAPPERS
440 AC_PROG_CC
441 AC_CONFIG_FILES([Makefile])
444 AT_DATA([Makefile.in],
445 [[all: cprogram@EXEEXT@
447 cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@
448         @CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FCLIBS@
450 .SUFFIXES: .c .f .@OBJEXT@
451 .f.@OBJEXT@:
452         @FC@ @FCFLAGS@ -c $<
453 .c.@OBJEXT@:
454         @CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $<
457 AT_DATA([foobar.f],
458 [[C     This uses Fortran I/O, so is likely to require Fortran startup.
459       subroutine foobar (x)
460       integer x
461       if (x == 42) then
462         write (*,*) 'some output from Fortran sources'
463       end if
464       end
467 AT_DATA([cprogram.c],
468 [[#include <config.h>
469 #include <stdio.h>
471 /* Taken from autoconf.texi:Fortran Compiler. */
472 #define FOOBAR_FC FC_FUNC (foobar, FOOBAR)
473 #ifdef __cplusplus
474 extern "C"  /* prevent C++ name mangling */
475 #endif
476 void FOOBAR_FC (int *x);
478 /* Taken from autoconf.texi:Fortran Compiler.  */
479 #ifdef __cplusplus
480   extern "C"
481 #endif
482 int FC_MAIN (int argc, char *argv[]);
484 int FC_MAIN (int argc, char *argv[])
486   int x = 42;
487   puts ("output from C main");
488   fflush (stdout);
489   FOOBAR_FC (&x);
490   puts ("more output from C main");
491   return 0;
495 AT_CHECK_AUTOCONF
496 AT_CHECK_AUTOHEADER([], [
497   FC_DUMMY_MAIN
498   FC_DUMMY_MAIN_EQ_F77
499   FC_FUNC
500   FC_FUNC_
501   FC_MAIN
503 AT_CHECK_CONFIGURE
504 AT_CHECK_MAKE
505 AT_CHECK([./cprogram], [], [output from C main
506  some output from Fortran sources
507 more output from C main
510 AT_CLEANUP
513 ## ------------------ ##
514 ## AC_F77_FUNC usage. ##
515 ## ------------------ ##
517 AT_SETUP([AC_F77_FUNC usage])
519 AT_CONFIGURE_AC([[
520 AC_PROG_F77
521 AC_F77_FUNC([foobar])
522 AC_SUBST([foobar])
523 AC_PROG_CC
524 AC_CONFIG_FILES([cprogram.c:cprogram.in])
525 AC_CONFIG_FILES([Makefile])
528 AT_DATA([Makefile.in],
530 all: cprogram@EXEEXT@
532 cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@
533         @CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FLIBS@
535 .SUFFIXES: .c .f .@OBJEXT@
536 .f.@OBJEXT@:
537         @F77@ @FFLAGS@ -c $<
538 .c.@OBJEXT@:
539         @CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $<
542 AT_DATA([foobar.f],
543 [[      subroutine foobar (x)
544       integer x
545       x = 42
546       return
547       end
550 AT_DATA([cprogram.in],
551 [[#include <config.h>
552 #include <math.h>
554 #ifdef __cplusplus
555 extern "C"  /* prevent C++ name mangling */
556 #endif
557 void @foobar@ (int *x);
559 /* Taken from autoconf.texi:Fortran Compiler.  */
560 #ifdef F77_DUMMY_MAIN
561 #  ifdef __cplusplus
562      extern "C"
563 #  endif
564    int F77_DUMMY_MAIN () { return 1; }
565 #endif
567 int main(int argc, char *argv[])
569   int x;
570   @foobar@ (&x);
571   if (x != 42)
572     return 1;
573   return 0;
577 AT_CHECK_AUTOCONF
578 AT_CHECK_AUTOHEADER([], [
579   F77_DUMMY_MAIN
580   FC_DUMMY_MAIN_EQ_F77
582 AT_CHECK_CONFIGURE
583 AT_CHECK_MAKE
584 AT_CHECK([./cprogram])
586 AT_CLEANUP
589 ## ----------------- ##
590 ## AC_FC_FUNC usage. ##
591 ## ----------------- ##
593 AT_SETUP([AC_FC_FUNC usage])
595 AT_CONFIGURE_AC([[
596 AC_PROG_FC
597 AC_FC_FUNC([foobar])
598 AC_SUBST([foobar])
599 AC_PROG_CC
600 AC_CONFIG_FILES([cprogram.c:cprogram.in])
601 AC_CONFIG_FILES([Makefile])
604 AT_DATA([Makefile.in],
606 all: cprogram@EXEEXT@
608 cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@
609         @CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FCLIBS@
611 .SUFFIXES: .c .f .@OBJEXT@
612 .f.@OBJEXT@:
613         @FC@ @FCFLAGS@ -c $<
614 .c.@OBJEXT@:
615         @CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $<
618 AT_DATA([foobar.f],
619 [[      subroutine foobar (x)
620       integer x
621       x = 42
622       return
623       end
626 AT_DATA([cprogram.in],
627 [[#include <config.h>
628 #include <math.h>
630 #ifdef __cplusplus
631 extern "C"  /* prevent C++ name mangling */
632 #endif
633 void @foobar@ (int *x);
635 /* Taken from autoconf.texi:Fortran Compiler.  */
636 #ifdef FC_DUMMY_MAIN
637 #  ifdef __cplusplus
638      extern "C"
639 #  endif
640    int FC_DUMMY_MAIN () { return 1; }
641 #endif
643 int main(int argc, char *argv[])
645   int x;
646   @foobar@ (&x);
647   if (x != 42)
648     return 1;
649   return 0;
653 AT_CHECK_AUTOCONF
654 AT_CHECK_AUTOHEADER([], [
655   FC_DUMMY_MAIN
656   FC_DUMMY_MAIN_EQ_F77
658 AT_CHECK_CONFIGURE
659 AT_CHECK_MAKE
660 AT_CHECK([./cprogram])
662 AT_CLEANUP
665 ## ------------------- ##
666 ## AC_FC_SRCEXT usage. ##
667 ## ------------------- ##
669 AT_SETUP([AC_FC_SRCEXT usage])
671 AT_DATA([configure.ac],
672 [[AC_INIT
673 AC_PROG_FC
674 FCFLAGS_NOFREE=$FCFLAGS
675 AC_SUBST([FCFLAGS_NOFREE])
676 AC_FC_FREEFORM
677 # Unconditionally require .f to work.
678 AC_FC_SRCEXT([f])
679 # For each other extension, fail gracefully if it does not work:
680 # Not all compilers support all extensions/language versions.
681 m4@&t@_foreach([ext], [f77, f90, f95, f03, f08],
682   [AC_FC_SRCEXT(ext, ext[_object='foo]ext[.$(OBJEXT)'], ext[_object=])
683    AC_SUBST(ext[_object])])
684 AC_CONFIG_FILES([Makefile])
685 AC_OUTPUT
688 AT_DATA([Makefile.in],
689 [[OBJEXT = @OBJEXT@
691 all: prog@EXEEXT@
692 prog@EXEEXT@: foof.@OBJEXT@ @f77_object@ @f90_object@ \
693               @f95_object@ @f03_object@ @f08_object@
694         @FC@ @FCFLAGS@ -o $@ foof.@OBJEXT@ @f77_object@ @f90_object@ \
695                              @f95_object@ @f03_object@ @f08_object@
697 .SUFFIXES: .f .f77 .f90 .f95 .f03 .f08 .@OBJEXT@
698 .f.@OBJEXT@:
699         @FC@ -c @FCFLAGS_NOFREE@ @FCFLAGS_f@ $<
700 .f77.@OBJEXT@:
701         @FC@ -c @FCFLAGS_NOFREE@ @FCFLAGS_f77@ $<
702 .f90.@OBJEXT@:
703         @FC@ -c @FCFLAGS@ @FCFLAGS_f90@ $<
704 .f95.@OBJEXT@:
705         @FC@ -c @FCFLAGS@ @FCFLAGS_f95@ $<
706 .f03.@OBJEXT@:
707         @FC@ -c @FCFLAGS@ @FCFLAGS_f03@ $<
708 .f08.@OBJEXT@:
709         @FC@ -c @FCFLAGS@ @FCFLAGS_f08@ $<
712 AT_DATA([foof.f],
713 [[      program main
714       end
717 AT_DATA([foof77.f77],
718 [[      subroutine foof77
719       end
722 AT_DATA([foof90.f90],
723 [[subroutine foof90
727 AT_DATA([foof95.f95],
728 [[subroutine foof95
732 AT_DATA([foof03.f03],
733 [[subroutine foof03
737 AT_DATA([foof08.f08],
738 [[subroutine foof08
742 AT_CHECK_AUTOCONF
743 AT_CHECK_CONFIGURE
744 AT_CHECK_MAKE
746 AT_CLEANUP
749 ## ---------------------- ##
750 ## AC_FC_PP_SRCEXT usage. ##
751 ## ---------------------- ##
753 AT_SETUP([AC_FC_PP_SRCEXT usage])
755 AT_DATA([configure.ac],
756 [[AC_INIT
757 AC_PROG_FC
758 # Unconditionally require .f and .F to work.
759 AC_FC_PP_SRCEXT([f])
760 AC_FC_PP_SRCEXT([F])
761 # For each other extension, fail gracefully if it does not work:
762 # Not all compilers support all extensions/language versions.
763 m4@&t@_foreach([ext], [f77, f90, f95, f03, f08],
764   [AC_FC_PP_SRCEXT(ext, ext[_object='foo]ext[.$(OBJEXT)'], ext[_object=])
765    AC_SUBST(ext[_object])])
766 m4@&t@_foreach([ext], [F77, F90, F95, F03, F08],
767   [AC_FC_PP_SRCEXT(ext, ext[_object='bar]ext[.$(OBJEXT)'], ext[_object=])
768    AC_SUBST(ext[_object])])
769 AC_CONFIG_FILES([Makefile])
770 AC_OUTPUT
773 AT_DATA([Makefile.in],
774 [[OBJEXT = @OBJEXT@
776 all: prog@EXEEXT@
777 prog@EXEEXT@: foof.@OBJEXT@ @f77_object@ @f90_object@ \
778               @f95_object@ @f03_object@ @f08_object@ \
779               barF.@OBJEXT@ @F77_object@ @F90_object@ \
780               @F95_object@ @F03_object@ @F08_object@
781         @FC@ @FCFLAGS@ -o $@ foof.@OBJEXT@ @f77_object@ @f90_object@ \
782                              @f95_object@ @f03_object@ @f08_object@ \
783                              barF.@OBJEXT@ @F77_object@ @F90_object@ \
784                              @F95_object@ @F03_object@ @F08_object@
786 .SUFFIXES: .f .f77 .f90 .f95 .f03 .f08 .F .F77 .F90 .F95 .F03 .F08 .@OBJEXT@
787 .f.@OBJEXT@:
788         @FC@ -c @FCFLAGS@ @FCFLAGS_f@ $<
789 .f77.@OBJEXT@:
790         @FC@ -c @FCFLAGS@ @FCFLAGS_f77@ $<
791 .f90.@OBJEXT@:
792         @FC@ -c @FCFLAGS@ @FCFLAGS_f90@ $<
793 .f95.@OBJEXT@:
794         @FC@ -c @FCFLAGS@ @FCFLAGS_f95@ $<
795 .f03.@OBJEXT@:
796         @FC@ -c @FCFLAGS@ @FCFLAGS_f03@ $<
797 .f08.@OBJEXT@:
798         @FC@ -c @FCFLAGS@ @FCFLAGS_f08@ $<
799 .F.@OBJEXT@:
800         @FC@ -c @FCFLAGS@ @FCFLAGS_F@ $<
801 .F77.@OBJEXT@:
802         @FC@ -c @FCFLAGS@ @FCFLAGS_F77@ $<
803 .F90.@OBJEXT@:
804         @FC@ -c @FCFLAGS@ @FCFLAGS_F90@ $<
805 .F95.@OBJEXT@:
806         @FC@ -c @FCFLAGS@ @FCFLAGS_F95@ $<
807 .F03.@OBJEXT@:
808         @FC@ -c @FCFLAGS@ @FCFLAGS_F03@ $<
809 .F08.@OBJEXT@:
810         @FC@ -c @FCFLAGS@ @FCFLAGS_F08@ $<
813 for ext in f77 f90 f95 f03 f08; do
814   cat > foo$ext.$ext <<EOF
815       subroutine foo$ext
816 #if 0
817 this is not correct fortran
818 #endif
819       end
821 done
823 for ext in F F77 F90 F95 F03 F08; do
824   cat > bar$ext.$ext <<EOF
825       subroutine bar$ext
826 #if 0
827 this is not correct fortran
828 #endif
829       end
831 done
833 AT_DATA([foof.f],
834 [[      program main
835 #if 0
836 this is not correct fortran
837 #endif
838       end
841 AT_CHECK_AUTOCONF
842 AT_CHECK_CONFIGURE
843 AT_CHECK_MAKE
844 AT_CHECK([./prog])
846 AT_CLEANUP
849 ## --------------- ##
850 ## AC_FC_FREEFORM. ##
851 ## --------------- ##
853 AT_SETUP([AC_FC_FREEFORM])
855 AT_DATA([configure.ac],
856 [[AC_INIT
857 AC_PROG_FC
858 AC_FC_FREEFORM
859 AC_CONFIG_FILES([Makefile])
860 AC_OUTPUT
863 AT_DATA([Makefile.in],
864 [[prog: prog.@OBJEXT@
865         @FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
867 .SUFFIXES: .f .@OBJEXT@
868 .f.@OBJEXT@:
869         @FC@ @FCFLAGS@ -c $<
872 AT_DATA([prog.f],
873 [[program main
877 AT_CHECK_AUTOCONF
878 AT_CHECK_CONFIGURE
879 AT_CHECK_MAKE
880 AT_CHECK([./prog])
882 AT_CLEANUP
885 ## --------------------------------- ##
886 ## AC_FC_FREEFORM with AC_FC_SRCEXT. ##
887 ## --------------------------------- ##
889 AT_SETUP([AC_FC_FREEFORM with AC_FC_SRCEXT])
891 AT_DATA([configure.ac],
892 [[AC_INIT
893 AC_FC_SRCEXT([f90], [], [AS_EXIT([77])])
894 AC_PROG_FC
895 AC_FC_FREEFORM
896 AC_CONFIG_FILES([Makefile])
897 AC_OUTPUT
900 AT_DATA([Makefile.in],
901 [[prog: prog.@OBJEXT@
902         @FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
904 .SUFFIXES: .f90 .@OBJEXT@
905 .f90.@OBJEXT@:
906         @FC@ @FCFLAGS@ -c @FCFLAGS_f90@ $<
909 AT_DATA([prog.f90],
910 [[program main
914 AT_CHECK_AUTOCONF
915 AT_CHECK_CONFIGURE
916 AT_CHECK_MAKE
917 AT_CHECK([./prog])
919 AT_CLEANUP
922 ## ---------------- ##
923 ## AC_FC_FIXEDFORM. ##
924 ## ---------------- ##
926 AT_SETUP([AC_FC_FIXEDFORM])
928 AT_DATA([configure.ac],
929 [[AC_INIT
930 AC_PROG_FC
931 AC_FC_FIXEDFORM
932 AC_CONFIG_FILES([Makefile])
933 AC_OUTPUT
936 AT_DATA([Makefile.in],
937 [[prog: prog.@OBJEXT@
938         @FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
940 .SUFFIXES: .f .@OBJEXT@
941 .f.@OBJEXT@:
942         @FC@ @FCFLAGS@ -c $<
945 AT_DATA([prog.f],
946 [[      program main
947 C      fixed-form style comment
948        end
951 AT_CHECK_AUTOCONF
952 AT_CHECK_CONFIGURE
953 AT_CHECK_MAKE
954 AT_CHECK([./prog])
956 AT_CLEANUP
959 ## ---------------------------------- ##
960 ## AC_FC_FIXEDFORM with AC_FC_SRCEXT. ##
961 ## ---------------------------------- ##
963 AT_SETUP([AC_FC_FIXEDFORM with AC_FC_SRCEXT])
965 AT_DATA([configure.ac],
966 [[AC_INIT
967 AC_PROG_FC
968 AC_FC_SRCEXT([f90], [], [AS_EXIT([77])])
969 AC_FC_FIXEDFORM
970 AC_CONFIG_FILES([Makefile])
971 AC_OUTPUT
974 AT_DATA([Makefile.in],
975 [[prog: prog.@OBJEXT@
976         @FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
978 .SUFFIXES: .f90 .@OBJEXT@
979 .f90.@OBJEXT@:
980         @FC@ @FCFLAGS@ -c @FCFLAGS_f90@ $<
983 AT_DATA([prog.f90],
984 [[      program main
985 C      fixed-form style comment
986        end
989 AT_CHECK_AUTOCONF
990 AT_CHECK_CONFIGURE
991 AT_CHECK_MAKE
992 AT_CHECK([./prog])
994 AT_CLEANUP
997 ## ------------------ ##
998 ## AC_FC_LINE_LENGTH. ##
999 ## ------------------ ##
1001 AT_SETUP([AC_FC_LINE_LENGTH])
1003 AT_DATA([Makefile.in],
1004 [[prog@EXEEXT@: prog.@OBJEXT@
1005         @FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
1007 .SUFFIXES: .f .@OBJEXT@
1008 .f.@OBJEXT@:
1009         @FC@ @FCFLAGS@ -c @FCFLAGS_f@ $<
1011 clean:
1012         rm -f *.@OBJEXT@ prog@EXEEXT@
1015 # When preceded by 7 spaces and followed by newline, line_80 generates
1016 # a line of exactly 79 columns, line_132 generates a line of exactly 131
1017 # coluns, and line_250 generates a line of exactly 250 columns.
1018 # FIXME: Shouldn't line_80 and line_132 generate lines that are one column
1019 # longer, so that their contents match the variable names?
1020 line_80=\
1021 'subroutine foo(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11)'
1022 line_132=\
1023 'subroutine foo(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,'\
1024 'arg12,arg13,arg14,arg15,arg16,arg17,arg18,arg19)'
1025 line_250=\
1026 'subroutine foofoo(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,'\
1027 'arg12,arg13,arg14,arg15,arg16,arg17,arg18,arg19,arg20,arg21,arg22,arg23,'\
1028 'arg24,arg25,arg26,arg27,arg28,arg29,arg30,arg31,arg32,arg33,arg34,arg35,'\
1029 'arg36,arg37,arg38,arg39)'
1031 for len in 80 132 250
1033   if test $len -eq 250; then arg=unlimited; else arg=$len; fi
1034   eval long_line=\$line_$len
1036   # Try free-form first, it has a bigger chance of succeeding.
1037   for fixed_or_free in FREEFORM FIXEDFORM
1038   do
1040     cat >configure.ac <<EOF
1041 AC_INIT
1042 AC_PROG_FC
1043 AC_FC_SRCEXT([f])
1044 AC_FC_$fixed_or_free
1045 AC_FC_LINE_LENGTH([$arg])
1046 AC_CONFIG_FILES([Makefile])
1047 AC_OUTPUT
1050     cat >prog.f <<EOF
1051        $long_line
1052        end subroutine
1053        program main
1054        end program
1057     AT_CHECK_AUTOCONF
1058     AT_CHECK_CONFIGURE
1059     AT_CHECK_MAKE
1060     AT_CHECK([./prog])
1061     AT_CHECK_MAKE([clean])
1063   done
1064 done
1066 AT_CLEANUP
1069 ## ------------------- ##
1070 ## AC_FC_CHECK_BOUNDS. ##
1071 ## ------------------- ##
1073 AT_SETUP([AC_FC_CHECK_BOUNDS])
1075 AT_DATA([Makefile.in],
1076 [[prog@EXEEXT@: prog.@OBJEXT@
1077         @FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
1079 .SUFFIXES: .f .@OBJEXT@
1080 .f.@OBJEXT@:
1081         @FC@ @FCFLAGS@ -c @FCFLAGS_f@ $<
1083 clean:
1084         rm -f *.@OBJEXT@ prog@EXEEXT@
1087 cat >configure.ac <<EOF
1088 AC_INIT
1089 AC_PROG_FC
1090 AC_FC_SRCEXT([f])
1091 AC_FC_CHECK_BOUNDS
1092 AC_CONFIG_FILES([Makefile])
1093 AC_OUTPUT
1096 AT_DATA([prog.f],
1098       subroutine copy(a,b,n)
1099       integer a(:), b(:), n, i
1100       do i = 1, n
1101          a(i) = b(i)
1102       end do
1103       end subroutine
1105       program main
1106       integer, parameter :: n = 20
1107       integer a(1:n), b(1:n-1), i
1108       interface
1109          subroutine copy(a,b,n)
1110          integer a(:), b(:), i
1111          end subroutine
1112       end interface
1114       call copy(a,b,n)
1115       end program
1118 AT_CHECK_AUTOCONF
1119 AT_CHECK_CONFIGURE
1120 AT_CHECK_MAKE
1121 AT_CHECK([./prog || exit 1], [1], [ignore], [ignore])
1122 AT_CHECK_MAKE([clean])
1124 AT_CLEANUP
1127 ## ------------------ ##
1128 ## AC_FC_MODULE_FLAG. ##
1129 ## ------------------ ##
1131 AT_SETUP([AC_FC_MODULE_FLAG])
1133 AT_DATA([Makefile.in],
1134 [[OBJEXT = @OBJEXT@
1135 EXEEXT = @EXEEXT@
1136 LIBS = @LIBS@
1137 ac_empty = @ac_empty@
1138 FC = @FC@
1139 FC_MODEXT = @FC_MODEXT@
1140 FC_MODINC = @FC_MODINC@
1141 FCFLAGS = @FCFLAGS@
1142 FCFLAGS_f = @FCFLAGS_f@
1144 prog$(EXEEXT): sub/mod.$(OBJEXT) prog.$(OBJEXT)
1145         $(FC) $(FCFLAGS) -o $@ prog.$(OBJEXT) sub/mod.$(OBJEXT) $(LIBS)
1147 sub/mod.$(OBJEXT): sub/mod.f
1148         cd sub && $(FC) $(FCFLAGS) -c $(FCFLAGS_f) mod.f
1150 # Depend on the object, for the module dependency.
1151 prog.$(OBJEXT): prog.f sub/mod.$(OBJEXT)
1152         $(FC) $(FCFLAGS) $(FC_MODINC). $(FC_MODINC)sub -c $(FCFLAGS_f) $<
1154 clean:
1155         -test -z "$(FC_MODEXT)" || rm -f *.$(FC_MODEXT) sub/*.$(FC_MODEXT)
1156         -rm -f *.$(OBJEXT) sub/*.$(OBJEXT) prog$(EXEEXT)
1159 AT_DATA([configure.ac],
1160 [[AC_INIT
1161 AC_PROG_FC
1162 AC_FC_SRCEXT([f])
1163 AC_FC_MODULE_FLAG
1164 if test -n "$FC_MODINC"; then
1165   FCFLAGS="$FCFLAGS $FC_MODINC. ${FC_MODINC}sub"
1167 AC_FC_MODULE_EXTENSION
1168 AC_CONFIG_FILES([Makefile])
1169 AC_OUTPUT
1172 mkdir sub
1174 AT_DATA([sub/mod.f],
1175 [[      module foobar
1176       end module foobar
1179 AT_DATA([prog.f],
1180 [[      program main
1181       use foobar
1182       end program
1185 AT_CHECK_AUTOCONF
1186 AT_CHECK_CONFIGURE
1187 AT_CHECK_MAKE([], [], [], [stdout], [stderr])
1188 # Both the FCFLAGS setting from configure.ac, and the Makefile rule
1189 # should add to the module search path.
1190 AT_CHECK([grep 'sub .*sub ' stdout stderr], [], [ignore])
1191 AT_CHECK([./prog], [], [ignore], [ignore])
1192 AT_CHECK_MAKE([clean])
1194 AT_CLEANUP
1197 ## --------------------- ##
1198 ## AC_F77_CRAY_POINTERS. ##
1199 ## --------------------- ##
1201 AT_SETUP([AC_F77_CRAY_POINTERS])
1203 AT_DATA([configure.ac],
1204 [[AC_INIT
1205 AC_PROG_F77
1206 AC_F77_CRAY_POINTERS
1207 AC_CONFIG_FILES([Makefile])
1208 AC_OUTPUT
1211 AT_DATA([Makefile.in],
1212 [[prog@EXEEXT@: prog.@OBJEXT@
1213         @F77@ @FFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
1215 .SUFFIXES: .f .@OBJEXT@
1216 .f.@OBJEXT@:
1217         @F77@ @FFLAGS@ -c $<
1219 clean:
1220         rm -f *.@OBJEXT@ prog@EXEEXT@
1223 AT_DATA([prog.f],
1224 [[      program main
1225       integer aptr(2)
1226       pointer (iptr, aptr)
1227       end
1230 AT_CHECK_AUTOCONF
1231 AT_CHECK_CONFIGURE
1232 AT_CHECK_MAKE
1233 AT_CHECK([./prog])
1234 AT_CHECK_MAKE([clean])
1236 AT_CLEANUP
1239 ## -------------------- ##
1240 ## AC_FC_CRAY_POINTERS. ##
1241 ## -------------------- ##
1243 AT_SETUP([AC_FC_CRAY_POINTERS])
1245 AT_DATA([configure.ac],
1246 [[AC_INIT
1247 AC_PROG_FC
1248 AC_FC_SRCEXT([f])
1249 AC_FC_CRAY_POINTERS
1250 AC_CONFIG_FILES([Makefile])
1251 AC_OUTPUT
1254 AT_DATA([Makefile.in],
1255 [[prog@EXEEXT@: prog.@OBJEXT@
1256         @FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
1258 .SUFFIXES: .f .@OBJEXT@
1259 .f.@OBJEXT@:
1260         @FC@ @FCFLAGS@ -c @FCFLAGS_f@ $<
1262 clean:
1263         rm -f *.@OBJEXT@ prog@EXEEXT@
1266 AT_DATA([prog.f],
1267 [[      program main
1268       integer aptr(2)
1269       pointer (iptr, aptr)
1270       end
1273 AT_CHECK_AUTOCONF
1274 AT_CHECK_CONFIGURE
1275 AT_CHECK_MAKE
1276 AT_CHECK([./prog])
1277 AT_CHECK_MAKE([clean])
1279 AT_CLEANUP