Port to AIX 7.2 ksh93
[autoconf.git] / tests / fortran.at
blob8574300e65fc1d071751c9ed2b098a124788cd1c
1 #                                                       -*- Autotest -*-
3 AT_BANNER([Fortran low level compiling/preprocessing macros.])
5 # Copyright (C) 2000-2001, 2003, 2008-2017, 2020-2024 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 AT_SUPPRESS_ACLOCAL
113 AT_CHECK([autoreconf -vi], [], [ignore], [ignore])
114 AT_CHECK_CONFIGURE
115 AT_CHECK_MAKE
117 AT_CLEANUP
120 ## ---------------------- ##
121 ## AC_OPENMP and Fortran. ##
122 ## ---------------------- ##
124 AT_SETUP([AC_OPENMP and Fortran])
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])
134 FCFLAGS="$FCFLAGS $OPENMP_FCFLAGS"
135 AC_CONFIG_FILES([Makefile])
136 AC_OUTPUT
139 AT_DATA([Makefile.in],
140 [[foo@EXEEXT@: foo.@OBJEXT@
141         @FC@ @FCFLAGS@ @LDFLAGS@ -o $@ foo.@OBJEXT@
143 foo.@OBJEXT@: foo.f
144         @FC@ @FCFLAGS@ -c foo.f
147 AT_DATA([foo.f],
148 [[      program main
149       end
152 AT_SUPPRESS_ACLOCAL
153 AT_CHECK([autoreconf -vi], [], [ignore], [ignore])
154 AT_CHECK_CONFIGURE
155 AT_CHECK_MAKE
157 AT_CLEANUP
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.
166 # and we would need libtool to create shared libraries.
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.
172 ## ------------------------ ##
173 ## AC_F77_DUMMY_MAIN usage. ##
174 ## ------------------------ ##
176 AT_SETUP([AC_F77_DUMMY_MAIN usage])
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])
186 AT_DATA([Makefile.in],
188 all: cprogram@EXEEXT@
190 cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@
191         @CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FLIBS@
193 .SUFFIXES: .c .f .@OBJEXT@
194 .f.@OBJEXT@:
195         @F77@ @FFLAGS@ -c $<
196 .c.@OBJEXT@:
197         @CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $<
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
210 AT_DATA([cprogram.c],
211 [[#include <config.h>
212 #include <math.h>
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);
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 (void) { return 1; }
227 #endif
229 int main(int argc, char *argv[])
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;
239 AT_CHECK_AUTOCONF
240 AT_CHECK_AUTOHEADER([], [
241   F77_DUMMY_MAIN
242   F77_FUNC
243   F77_FUNC_
244   FC_DUMMY_MAIN_EQ_F77
246 AT_CHECK_CONFIGURE
247 AT_CHECK_MAKE
248 AT_CHECK([./cprogram])
250 AT_CLEANUP
253 ## ----------------------- ##
254 ## AC_FC_DUMMY_MAIN usage. ##
255 ## ----------------------- ##
257 AT_SETUP([AC_FC_DUMMY_MAIN usage])
259 AT_CONFIGURE_AC([[
260 AC_PROG_FC
261 AC_FC_FIXEDFORM
262 AC_FC_DUMMY_MAIN([], [AC_MSG_FAILURE([failed to determine FC dummy main], [77])])
263 AC_FC_WRAPPERS
264 AC_PROG_CC
265 AC_CONFIG_FILES([Makefile])
268 AT_DATA([Makefile.in],
270 all: cprogram@EXEEXT@
272 cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@
273         @CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FCLIBS@
275 .SUFFIXES: .c .f .@OBJEXT@
276 .f.@OBJEXT@:
277         @FC@ @FCFLAGS@ -c $<
278 .c.@OBJEXT@:
279         @CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $<
282 AT_DATA([foobar.f],
283 [[C     This is just a purely numeric routine, no I/O needed.
284 C     Taken from autoconf.texi:Fortran Compiler.
285       subroutine foobar (x, y)
286       double precision x, y
287       y = 3.14159 * x
288       return
289       end
292 AT_DATA([cprogram.c],
293 [[#include <config.h>
294 #include <math.h>
296 /* Taken from autoconf.texi:Fortran Compiler. */
297 #define FOOBAR_FC FC_FUNC (foobar, FOOBAR)
298 #ifdef __cplusplus
299 extern "C"  /* prevent C++ name mangling */
300 #endif
301 void FOOBAR_FC(double *x, double *y);
303 /* Taken from autoconf.texi:Fortran Compiler.  */
304 #ifdef FC_DUMMY_MAIN
305 #  ifdef __cplusplus
306      extern "C"
307 #  endif
308    int FC_DUMMY_MAIN (void) { return 1; }
309 #endif
311 int main (int argc, char *argv[])
313   double x = 2.7183, y;
314   FOOBAR_FC (&x, &y);
315   if (fabs (8.539784097 - y) > 1.e-6)
316     return 1;
317   return 0;
321 AT_CHECK_AUTOCONF
322 AT_CHECK_AUTOHEADER([], [
323   FC_DUMMY_MAIN
324   FC_DUMMY_MAIN_EQ_F77
325   FC_FUNC
326   FC_FUNC_
328 AT_CHECK_CONFIGURE
329 AT_CHECK_MAKE
330 AT_CHECK([./cprogram])
332 AT_CLEANUP
335 ## ------------------ ##
336 ## AC_F77_MAIN usage. ##
337 ## ------------------ ##
339 AT_SETUP([AC_F77_MAIN usage])
341 AT_CONFIGURE_AC([[
342 AC_PROG_F77
343 AC_F77_MAIN
344 AC_F77_WRAPPERS
345 AC_PROG_CC
346 AC_CONFIG_FILES([Makefile])
349 AT_DATA([Makefile.in],
351 all: cprogram@EXEEXT@
353 cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@
354         @CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FLIBS@
356 .SUFFIXES: .c .f .@OBJEXT@
357 .f.@OBJEXT@:
358         @F77@ @FFLAGS@ -c $<
359 .c.@OBJEXT@:
360         @CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $<
363 AT_DATA([foobar.f],
364 [[C     This uses Fortran I/O, so is likely to require Fortran startup.
365       subroutine foobar (x)
366       integer x
367       if (x == 42) then
368         write(*,*) 'some output from Fortran sources'
369       end if
370       end
373 AT_DATA([cprogram.c],
374 [[#include <config.h>
375 #include <stdio.h>
377 /* Taken from autoconf.texi:Fortran Compiler. */
378 #define FOOBAR_F77 F77_FUNC (foobar, FOOBAR)
379 #ifdef __cplusplus
380 extern "C"  /* prevent C++ name mangling */
381 #endif
382 void FOOBAR_F77 (int *x);
384 /* Taken from autoconf.texi:Fortran Compiler.  */
385 #ifdef __cplusplus
386   extern "C"
387 #endif
388 int F77_MAIN (int argc, char *argv[]);
390 int F77_MAIN (int argc, char *argv[])
392   int x = 42;
393   puts ("output from C main");
394   fflush (stdout);
395   FOOBAR_F77 (&x);
396   puts ("more output from C main");
397   return 0;
401 AT_CHECK_AUTOCONF
402 AT_CHECK_AUTOHEADER([], [
403   F77_DUMMY_MAIN
404   F77_FUNC
405   F77_FUNC_
406   F77_MAIN
407   FC_DUMMY_MAIN_EQ_F77
409 AT_CHECK_CONFIGURE
410 AT_CHECK_MAKE
411 AT_CHECK([./cprogram], [], [output from C main
412  some output from Fortran sources
413 more output from C main
416 AT_CLEANUP
419 ## ----------------- ##
420 ## AC_FC_MAIN usage. ##
421 ## ----------------- ##
423 AT_SETUP([AC_FC_MAIN usage])
425 AT_CONFIGURE_AC([[
426 AC_PROG_FC
427 AC_FC_FIXEDFORM
428 AC_FC_MAIN
429 AC_FC_WRAPPERS
430 AC_PROG_CC
431 AC_CONFIG_FILES([Makefile])
434 AT_DATA([Makefile.in],
435 [[all: cprogram@EXEEXT@
437 cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@
438         @CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FCLIBS@
440 .SUFFIXES: .c .f .@OBJEXT@
441 .f.@OBJEXT@:
442         @FC@ @FCFLAGS@ -c $<
443 .c.@OBJEXT@:
444         @CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $<
447 AT_DATA([foobar.f],
448 [[C     This uses Fortran I/O, so is likely to require Fortran startup.
449       subroutine foobar (x)
450       integer x
451       if (x == 42) then
452         write (*,*) 'some output from Fortran sources'
453       end if
454       end
457 AT_DATA([cprogram.c],
458 [[#include <config.h>
459 #include <stdio.h>
461 /* Taken from autoconf.texi:Fortran Compiler. */
462 #define FOOBAR_FC FC_FUNC (foobar, FOOBAR)
463 #ifdef __cplusplus
464 extern "C"  /* prevent C++ name mangling */
465 #endif
466 void FOOBAR_FC (int *x);
468 /* Taken from autoconf.texi:Fortran Compiler.  */
469 #ifdef __cplusplus
470   extern "C"
471 #endif
472 int FC_MAIN (int argc, char *argv[]);
474 int FC_MAIN (int argc, char *argv[])
476   int x = 42;
477   puts ("output from C main");
478   fflush (stdout);
479   FOOBAR_FC (&x);
480   puts ("more output from C main");
481   return 0;
485 AT_CHECK_AUTOCONF
486 AT_CHECK_AUTOHEADER([], [
487   FC_DUMMY_MAIN
488   FC_DUMMY_MAIN_EQ_F77
489   FC_FUNC
490   FC_FUNC_
491   FC_MAIN
493 AT_CHECK_CONFIGURE
494 AT_CHECK_MAKE
495 AT_CHECK([./cprogram], [], [output from C main
496  some output from Fortran sources
497 more output from C main
500 AT_CLEANUP
503 ## ------------------ ##
504 ## AC_F77_FUNC usage. ##
505 ## ------------------ ##
507 AT_SETUP([AC_F77_FUNC usage])
509 AT_CONFIGURE_AC([[
510 AC_PROG_F77
511 AC_F77_FUNC([foobar])
512 AC_SUBST([foobar])
513 AC_PROG_CC
514 AC_CONFIG_FILES([cprogram.c:cprogram.in])
515 AC_CONFIG_FILES([Makefile])
518 AT_DATA([Makefile.in],
520 all: cprogram@EXEEXT@
522 cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@
523         @CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FLIBS@
525 .SUFFIXES: .c .f .@OBJEXT@
526 .f.@OBJEXT@:
527         @F77@ @FFLAGS@ -c $<
528 .c.@OBJEXT@:
529         @CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $<
532 AT_DATA([foobar.f],
533 [[      subroutine foobar (x)
534       integer x
535       x = 42
536       return
537       end
540 AT_DATA([cprogram.in],
541 [[#include <config.h>
542 #include <math.h>
544 #ifdef __cplusplus
545 extern "C"  /* prevent C++ name mangling */
546 #endif
547 void @foobar@ (int *x);
549 /* Taken from autoconf.texi:Fortran Compiler.  */
550 #ifdef F77_DUMMY_MAIN
551 #  ifdef __cplusplus
552      extern "C"
553 #  endif
554    int F77_DUMMY_MAIN (void) { return 1; }
555 #endif
557 int main(int argc, char *argv[])
559   int x;
560   @foobar@ (&x);
561   if (x != 42)
562     return 1;
563   return 0;
567 AT_CHECK_AUTOCONF
568 AT_CHECK_AUTOHEADER([], [
569   F77_DUMMY_MAIN
570   FC_DUMMY_MAIN_EQ_F77
572 AT_CHECK_CONFIGURE
573 AT_CHECK_MAKE
574 AT_CHECK([./cprogram])
576 AT_CLEANUP
579 ## ----------------- ##
580 ## AC_FC_FUNC usage. ##
581 ## ----------------- ##
583 AT_SETUP([AC_FC_FUNC usage])
585 AT_CONFIGURE_AC([[
586 AC_PROG_FC
587 AC_FC_FUNC([foobar])
588 AC_SUBST([foobar])
589 AC_PROG_CC
590 AC_CONFIG_FILES([cprogram.c:cprogram.in])
591 AC_CONFIG_FILES([Makefile])
594 AT_DATA([Makefile.in],
596 all: cprogram@EXEEXT@
598 cprogram@EXEEXT@: cprogram.@OBJEXT@ foobar.@OBJEXT@
599         @CC@ @CFLAGS@ @LDFLAGS@ -o $@ cprogram.@OBJEXT@ foobar.@OBJEXT@ @LIBS@ @FCLIBS@
601 .SUFFIXES: .c .f .@OBJEXT@
602 .f.@OBJEXT@:
603         @FC@ @FCFLAGS@ -c $<
604 .c.@OBJEXT@:
605         @CC@ @DEFS@ -I. @CPPFLAGS@ @CFLAGS@ -c $<
608 AT_DATA([foobar.f],
609 [[      subroutine foobar (x)
610       integer x
611       x = 42
612       return
613       end
616 AT_DATA([cprogram.in],
617 [[#include <config.h>
618 #include <math.h>
620 #ifdef __cplusplus
621 extern "C"  /* prevent C++ name mangling */
622 #endif
623 void @foobar@ (int *x);
625 /* Taken from autoconf.texi:Fortran Compiler.  */
626 #ifdef FC_DUMMY_MAIN
627 #  ifdef __cplusplus
628      extern "C"
629 #  endif
630    int FC_DUMMY_MAIN (void) { return 1; }
631 #endif
633 int main(int argc, char *argv[])
635   int x;
636   @foobar@ (&x);
637   if (x != 42)
638     return 1;
639   return 0;
643 AT_CHECK_AUTOCONF
644 AT_CHECK_AUTOHEADER([], [
645   FC_DUMMY_MAIN
646   FC_DUMMY_MAIN_EQ_F77
648 AT_CHECK_CONFIGURE
649 AT_CHECK_MAKE
650 AT_CHECK([./cprogram])
652 AT_CLEANUP
655 ## ------------------- ##
656 ## AC_FC_SRCEXT usage. ##
657 ## ------------------- ##
659 AT_SETUP([AC_FC_SRCEXT usage])
661 AT_DATA([configure.ac],
662 [[AC_INIT
663 AC_PROG_FC
664 FCFLAGS_NOFREE=$FCFLAGS
665 AC_SUBST([FCFLAGS_NOFREE])
666 AC_FC_FREEFORM
667 # Unconditionally require .f to work.
668 AC_FC_SRCEXT([f])
669 # For each other extension, fail gracefully if it does not work:
670 # Not all compilers support all extensions/language versions.
671 m4@&t@_foreach([ext], [f77, f90, f95, f03, f08],
672   [AC_FC_SRCEXT(ext, ext[_object='foo]ext[.$(OBJEXT)'], ext[_object=])
673    AC_SUBST(ext[_object])])
674 AC_CONFIG_FILES([Makefile])
675 AC_OUTPUT
678 AT_DATA([Makefile.in],
679 [[OBJEXT = @OBJEXT@
681 all: prog@EXEEXT@
682 prog@EXEEXT@: foof.@OBJEXT@ @f77_object@ @f90_object@ \
683               @f95_object@ @f03_object@ @f08_object@
684         @FC@ @FCFLAGS@ -o $@ foof.@OBJEXT@ @f77_object@ @f90_object@ \
685                              @f95_object@ @f03_object@ @f08_object@
687 .SUFFIXES: .f .f77 .f90 .f95 .f03 .f08 .@OBJEXT@
688 .f.@OBJEXT@:
689         @FC@ -c @FCFLAGS_NOFREE@ @FCFLAGS_f@ $<
690 .f77.@OBJEXT@:
691         @FC@ -c @FCFLAGS_NOFREE@ @FCFLAGS_f77@ $<
692 .f90.@OBJEXT@:
693         @FC@ -c @FCFLAGS@ @FCFLAGS_f90@ $<
694 .f95.@OBJEXT@:
695         @FC@ -c @FCFLAGS@ @FCFLAGS_f95@ $<
696 .f03.@OBJEXT@:
697         @FC@ -c @FCFLAGS@ @FCFLAGS_f03@ $<
698 .f08.@OBJEXT@:
699         @FC@ -c @FCFLAGS@ @FCFLAGS_f08@ $<
702 AT_DATA([foof.f],
703 [[      program main
704       end
707 AT_DATA([foof77.f77],
708 [[      subroutine foof77
709       end
712 AT_DATA([foof90.f90],
713 [[subroutine foof90
717 AT_DATA([foof95.f95],
718 [[subroutine foof95
722 AT_DATA([foof03.f03],
723 [[subroutine foof03
727 AT_DATA([foof08.f08],
728 [[subroutine foof08
732 AT_CHECK_AUTOCONF
733 AT_CHECK_CONFIGURE
734 AT_CHECK_MAKE
736 AT_CLEANUP
739 ## ---------------------- ##
740 ## AC_FC_PP_SRCEXT usage. ##
741 ## ---------------------- ##
743 AT_SETUP([AC_FC_PP_SRCEXT usage])
745 AT_DATA([configure.ac],
746 [[AC_INIT
747 AC_PROG_FC
748 # Unconditionally require .f and .F to work.
749 AC_FC_PP_SRCEXT([f])
750 AC_FC_PP_SRCEXT([F])
751 # For each other extension, fail gracefully if it does not work:
752 # Not all compilers support all extensions/language versions.
753 m4@&t@_foreach([ext], [f77, f90, f95, f03, f08],
754   [AC_FC_PP_SRCEXT(ext, ext[_object='foo]ext[.$(OBJEXT)'], ext[_object=])
755    AC_SUBST(ext[_object])])
756 m4@&t@_foreach([ext], [F77, F90, F95, F03, F08],
757   [AC_FC_PP_SRCEXT(ext, ext[_object='bar]ext[.$(OBJEXT)'], ext[_object=])
758    AC_SUBST(ext[_object])])
759 AC_CONFIG_FILES([Makefile])
760 AC_OUTPUT
763 AT_DATA([Makefile.in],
764 [[OBJEXT = @OBJEXT@
766 all: prog@EXEEXT@
767 prog@EXEEXT@: foof.@OBJEXT@ @f77_object@ @f90_object@ \
768               @f95_object@ @f03_object@ @f08_object@ \
769               barF.@OBJEXT@ @F77_object@ @F90_object@ \
770               @F95_object@ @F03_object@ @F08_object@
771         @FC@ @FCFLAGS@ -o $@ foof.@OBJEXT@ @f77_object@ @f90_object@ \
772                              @f95_object@ @f03_object@ @f08_object@ \
773                              barF.@OBJEXT@ @F77_object@ @F90_object@ \
774                              @F95_object@ @F03_object@ @F08_object@
776 .SUFFIXES: .f .f77 .f90 .f95 .f03 .f08 .F .F77 .F90 .F95 .F03 .F08 .@OBJEXT@
777 .f.@OBJEXT@:
778         @FC@ -c @FCFLAGS@ @FCFLAGS_f@ $<
779 .f77.@OBJEXT@:
780         @FC@ -c @FCFLAGS@ @FCFLAGS_f77@ $<
781 .f90.@OBJEXT@:
782         @FC@ -c @FCFLAGS@ @FCFLAGS_f90@ $<
783 .f95.@OBJEXT@:
784         @FC@ -c @FCFLAGS@ @FCFLAGS_f95@ $<
785 .f03.@OBJEXT@:
786         @FC@ -c @FCFLAGS@ @FCFLAGS_f03@ $<
787 .f08.@OBJEXT@:
788         @FC@ -c @FCFLAGS@ @FCFLAGS_f08@ $<
789 .F.@OBJEXT@:
790         @FC@ -c @FCFLAGS@ @FCFLAGS_F@ $<
791 .F77.@OBJEXT@:
792         @FC@ -c @FCFLAGS@ @FCFLAGS_F77@ $<
793 .F90.@OBJEXT@:
794         @FC@ -c @FCFLAGS@ @FCFLAGS_F90@ $<
795 .F95.@OBJEXT@:
796         @FC@ -c @FCFLAGS@ @FCFLAGS_F95@ $<
797 .F03.@OBJEXT@:
798         @FC@ -c @FCFLAGS@ @FCFLAGS_F03@ $<
799 .F08.@OBJEXT@:
800         @FC@ -c @FCFLAGS@ @FCFLAGS_F08@ $<
803 for ext in f77 f90 f95 f03 f08; do
804   cat > foo$ext.$ext <<EOF
805       subroutine foo$ext
806 #if 0
807 this is not correct fortran
808 #endif
809       end
811 done
813 for ext in F F77 F90 F95 F03 F08; do
814   cat > bar$ext.$ext <<EOF
815       subroutine bar$ext
816 #if 0
817 this is not correct fortran
818 #endif
819       end
821 done
823 AT_DATA([foof.f],
824 [[      program main
825 #if 0
826 this is not correct fortran
827 #endif
828       end
831 AT_CHECK_AUTOCONF
832 AT_CHECK_CONFIGURE
833 AT_CHECK_MAKE
834 AT_CHECK([./prog])
836 AT_CLEANUP
839 ## --------------- ##
840 ## AC_FC_FREEFORM. ##
841 ## --------------- ##
843 AT_SETUP([AC_FC_FREEFORM])
845 AT_DATA([configure.ac],
846 [[AC_INIT
847 AC_PROG_FC
848 AC_FC_FREEFORM
849 AC_CONFIG_FILES([Makefile])
850 AC_OUTPUT
853 AT_DATA([Makefile.in],
854 [[prog: prog.@OBJEXT@
855         @FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
857 .SUFFIXES: .f .@OBJEXT@
858 .f.@OBJEXT@:
859         @FC@ @FCFLAGS@ -c $<
862 AT_DATA([prog.f],
863 [[program main
867 AT_CHECK_AUTOCONF
868 AT_CHECK_CONFIGURE
869 AT_CHECK_MAKE
870 AT_CHECK([./prog])
872 AT_CLEANUP
875 ## --------------------------------- ##
876 ## AC_FC_FREEFORM with AC_FC_SRCEXT. ##
877 ## --------------------------------- ##
879 AT_SETUP([AC_FC_FREEFORM with AC_FC_SRCEXT])
881 AT_DATA([configure.ac],
882 [[AC_INIT
883 AC_FC_SRCEXT([f90], [], [AS_EXIT([77])])
884 AC_PROG_FC
885 AC_FC_FREEFORM
886 AC_CONFIG_FILES([Makefile])
887 AC_OUTPUT
890 AT_DATA([Makefile.in],
891 [[prog: prog.@OBJEXT@
892         @FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
894 .SUFFIXES: .f90 .@OBJEXT@
895 .f90.@OBJEXT@:
896         @FC@ @FCFLAGS@ -c @FCFLAGS_f90@ $<
899 AT_DATA([prog.f90],
900 [[program main
904 AT_CHECK_AUTOCONF
905 AT_CHECK_CONFIGURE
906 AT_CHECK_MAKE
907 AT_CHECK([./prog])
909 AT_CLEANUP
912 ## ---------------- ##
913 ## AC_FC_FIXEDFORM. ##
914 ## ---------------- ##
916 AT_SETUP([AC_FC_FIXEDFORM])
918 AT_DATA([configure.ac],
919 [[AC_INIT
920 AC_PROG_FC
921 AC_FC_FIXEDFORM
922 AC_CONFIG_FILES([Makefile])
923 AC_OUTPUT
926 AT_DATA([Makefile.in],
927 [[prog: prog.@OBJEXT@
928         @FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
930 .SUFFIXES: .f .@OBJEXT@
931 .f.@OBJEXT@:
932         @FC@ @FCFLAGS@ -c $<
935 AT_DATA([prog.f],
936 [[      program main
937 C      fixed-form style comment
938        end
941 AT_CHECK_AUTOCONF
942 AT_CHECK_CONFIGURE
943 AT_CHECK_MAKE
944 AT_CHECK([./prog])
946 AT_CLEANUP
949 ## ---------------------------------- ##
950 ## AC_FC_FIXEDFORM with AC_FC_SRCEXT. ##
951 ## ---------------------------------- ##
953 AT_SETUP([AC_FC_FIXEDFORM with AC_FC_SRCEXT])
955 AT_DATA([configure.ac],
956 [[AC_INIT
957 AC_PROG_FC
958 AC_FC_SRCEXT([f90], [], [AS_EXIT([77])])
959 AC_FC_FIXEDFORM
960 AC_CONFIG_FILES([Makefile])
961 AC_OUTPUT
964 AT_DATA([Makefile.in],
965 [[prog: prog.@OBJEXT@
966         @FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
968 .SUFFIXES: .f90 .@OBJEXT@
969 .f90.@OBJEXT@:
970         @FC@ @FCFLAGS@ -c @FCFLAGS_f90@ $<
973 AT_DATA([prog.f90],
974 [[      program main
975 C      fixed-form style comment
976        end
979 AT_CHECK_AUTOCONF
980 AT_CHECK_CONFIGURE
981 AT_CHECK_MAKE
982 AT_CHECK([./prog])
984 AT_CLEANUP
987 ## ------------------ ##
988 ## AC_FC_LINE_LENGTH. ##
989 ## ------------------ ##
991 AT_SETUP([AC_FC_LINE_LENGTH])
993 AT_DATA([Makefile.in],
994 [[prog@EXEEXT@: prog.@OBJEXT@
995         @FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
997 .SUFFIXES: .f .@OBJEXT@
998 .f.@OBJEXT@:
999         @FC@ @FCFLAGS@ -c @FCFLAGS_f@ $<
1001 clean:
1002         rm -f *.@OBJEXT@ prog@EXEEXT@
1005 # When preceded by 7 spaces and followed by newline, line_80 generates
1006 # a line of exactly 79 columns, line_132 generates a line of exactly 131
1007 # coluns, and line_250 generates a line of exactly 250 columns.
1008 # FIXME: Shouldn't line_80 and line_132 generate lines that are one column
1009 # longer, so that their contents match the variable names?
1010 line_80=\
1011 'subroutine foo(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11)'
1012 line_132=\
1013 'subroutine foo(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,'\
1014 'arg12,arg13,arg14,arg15,arg16,arg17,arg18,arg19)'
1015 line_250=\
1016 'subroutine foofoo(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,'\
1017 'arg12,arg13,arg14,arg15,arg16,arg17,arg18,arg19,arg20,arg21,arg22,arg23,'\
1018 'arg24,arg25,arg26,arg27,arg28,arg29,arg30,arg31,arg32,arg33,arg34,arg35,'\
1019 'arg36,arg37,arg38,arg39)'
1021 for len in 80 132 250
1023   if test $len -eq 250; then arg=unlimited; else arg=$len; fi
1024   eval long_line=\$line_$len
1026   # Try free-form first, it has a bigger chance of succeeding.
1027   for fixed_or_free in FREEFORM FIXEDFORM
1028   do
1030     cat >configure.ac <<EOF
1031 AC_INIT
1032 AC_PROG_FC
1033 AC_FC_SRCEXT([f])
1034 AC_FC_$fixed_or_free
1035 AC_FC_LINE_LENGTH([$arg])
1036 AC_CONFIG_FILES([Makefile])
1037 AC_OUTPUT
1040     cat >prog.f <<EOF
1041        $long_line
1042        end subroutine
1043        program main
1044        end program
1047     AT_CHECK_AUTOCONF
1048     AT_CHECK_CONFIGURE
1049     AT_CHECK_MAKE
1050     AT_CHECK([./prog])
1051     AT_CHECK_MAKE([clean])
1053   done
1054 done
1056 AT_CLEANUP
1059 ## ------------------- ##
1060 ## AC_FC_CHECK_BOUNDS. ##
1061 ## ------------------- ##
1063 AT_SETUP([AC_FC_CHECK_BOUNDS])
1065 AT_DATA([Makefile.in],
1066 [[prog@EXEEXT@: prog.@OBJEXT@
1067         @FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
1069 .SUFFIXES: .f .@OBJEXT@
1070 .f.@OBJEXT@:
1071         @FC@ @FCFLAGS@ -c @FCFLAGS_f@ $<
1073 clean:
1074         rm -f *.@OBJEXT@ prog@EXEEXT@
1077 cat >configure.ac <<EOF
1078 AC_INIT
1079 AC_PROG_FC
1080 AC_FC_SRCEXT([f])
1081 AC_FC_CHECK_BOUNDS
1082 AC_CONFIG_FILES([Makefile])
1083 AC_OUTPUT
1086 AT_DATA([prog.f],
1088       subroutine copy(a,b,n)
1089       integer a(:), b(:), n, i
1090       do i = 1, n
1091          a(i) = b(i)
1092       end do
1093       end subroutine
1095       program main
1096       integer, parameter :: n = 20
1097       integer a(1:n), b(1:n-1), i
1098       interface
1099          subroutine copy(a,b,n)
1100          integer a(:), b(:), i
1101          end subroutine
1102       end interface
1104       call copy(a,b,n)
1105       end program
1108 AT_CHECK_AUTOCONF
1109 AT_CHECK_CONFIGURE
1110 AT_CHECK_MAKE
1111 AT_CHECK([./prog || exit 1], [1], [ignore], [ignore])
1112 AT_CHECK_MAKE([clean])
1114 AT_CLEANUP
1117 ## ------------------ ##
1118 ## AC_FC_MODULE_FLAG. ##
1119 ## ------------------ ##
1121 AT_SETUP([AC_FC_MODULE_FLAG])
1123 AT_DATA([Makefile.in],
1124 [[OBJEXT = @OBJEXT@
1125 EXEEXT = @EXEEXT@
1126 LIBS = @LIBS@
1127 ac_empty = @ac_empty@
1128 FC = @FC@
1129 FC_MODEXT = @FC_MODEXT@
1130 FC_MODINC = @FC_MODINC@
1131 FCFLAGS = @FCFLAGS@
1132 FCFLAGS_f = @FCFLAGS_f@
1134 prog$(EXEEXT): sub/mod.$(OBJEXT) prog.$(OBJEXT)
1135         $(FC) $(FCFLAGS) -o $@ prog.$(OBJEXT) sub/mod.$(OBJEXT) $(LIBS)
1137 sub/mod.$(OBJEXT): sub/mod.f
1138         cd sub && $(FC) $(FCFLAGS) -c $(FCFLAGS_f) mod.f
1140 # Depend on the object, for the module dependency.
1141 prog.$(OBJEXT): prog.f sub/mod.$(OBJEXT)
1142         $(FC) $(FCFLAGS) $(FC_MODINC). $(FC_MODINC)sub -c $(FCFLAGS_f) $<
1144 clean:
1145         -test -z "$(FC_MODEXT)" || rm -f *.$(FC_MODEXT) sub/*.$(FC_MODEXT)
1146         -rm -f *.$(OBJEXT) sub/*.$(OBJEXT) prog$(EXEEXT)
1149 AT_DATA([configure.ac],
1150 [[AC_INIT
1151 AC_PROG_FC
1152 AC_FC_SRCEXT([f])
1153 AC_FC_MODULE_FLAG
1154 if test -n "$FC_MODINC"; then
1155   FCFLAGS="$FCFLAGS $FC_MODINC. ${FC_MODINC}sub"
1157 AC_FC_MODULE_EXTENSION
1158 AC_CONFIG_FILES([Makefile])
1159 AC_OUTPUT
1162 mkdir sub
1164 AT_DATA([sub/mod.f],
1165 [[      module foobar
1166       end module foobar
1169 AT_DATA([prog.f],
1170 [[      program main
1171       use foobar
1172       end program
1175 AT_CHECK_AUTOCONF
1176 AT_CHECK_CONFIGURE
1177 AT_CHECK_MAKE([], [], [], [stdout], [stderr])
1178 # Both the FCFLAGS setting from configure.ac, and the Makefile rule
1179 # should add to the module search path.
1180 AT_CHECK([grep 'sub .*sub ' stdout stderr], [], [ignore])
1181 AT_CHECK([./prog], [], [ignore], [ignore])
1182 AT_CHECK_MAKE([clean])
1184 AT_CLEANUP
1187 ## --------------------- ##
1188 ## AC_F77_CRAY_POINTERS. ##
1189 ## --------------------- ##
1191 AT_SETUP([AC_F77_CRAY_POINTERS])
1193 AT_DATA([configure.ac],
1194 [[AC_INIT
1195 AC_PROG_F77
1196 AC_F77_CRAY_POINTERS
1197 AC_CONFIG_FILES([Makefile])
1198 AC_OUTPUT
1201 AT_DATA([Makefile.in],
1202 [[prog@EXEEXT@: prog.@OBJEXT@
1203         @F77@ @FFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
1205 .SUFFIXES: .f .@OBJEXT@
1206 .f.@OBJEXT@:
1207         @F77@ @FFLAGS@ -c $<
1209 clean:
1210         rm -f *.@OBJEXT@ prog@EXEEXT@
1213 AT_DATA([prog.f],
1214 [[      program main
1215       integer aptr(2)
1216       pointer (iptr, aptr)
1217       end
1220 AT_CHECK_AUTOCONF
1221 AT_CHECK_CONFIGURE
1222 AT_CHECK_MAKE
1223 AT_CHECK([./prog])
1224 AT_CHECK_MAKE([clean])
1226 AT_CLEANUP
1229 ## -------------------- ##
1230 ## AC_FC_CRAY_POINTERS. ##
1231 ## -------------------- ##
1233 AT_SETUP([AC_FC_CRAY_POINTERS])
1235 AT_DATA([configure.ac],
1236 [[AC_INIT
1237 AC_PROG_FC
1238 AC_FC_SRCEXT([f])
1239 AC_FC_CRAY_POINTERS
1240 AC_CONFIG_FILES([Makefile])
1241 AC_OUTPUT
1244 AT_DATA([Makefile.in],
1245 [[prog@EXEEXT@: prog.@OBJEXT@
1246         @FC@ @FCFLAGS@ -o $@ prog.@OBJEXT@ @LIBS@
1248 .SUFFIXES: .f .@OBJEXT@
1249 .f.@OBJEXT@:
1250         @FC@ @FCFLAGS@ -c @FCFLAGS_f@ $<
1252 clean:
1253         rm -f *.@OBJEXT@ prog@EXEEXT@
1256 AT_DATA([prog.f],
1257 [[      program main
1258       integer aptr(2)
1259       pointer (iptr, aptr)
1260       end
1263 AT_CHECK_AUTOCONF
1264 AT_CHECK_CONFIGURE
1265 AT_CHECK_MAKE
1266 AT_CHECK([./prog])
1267 AT_CHECK_MAKE([clean])
1269 AT_CLEANUP