xref: /netbsd-src/external/gpl3/autoconf/dist/tests/fortran.at (revision d874e91932377fc40d53f102e48fc3ee6f4fe9de)
1#							-*- Autotest -*-
2
3AT_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
31AT_CHECK_MACRO([GNU Fortran 77],
32[[AC_LANG(Fortran 77)
33AC_LANG_COMPILER
34
35: > conftest.f
36if 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])
44else
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])
51fi
52]])
53
54
55
56## ------------------ ##
57## Fortran Compiler.  ##
58## ------------------ ##
59
60
61AT_CHECK_MACRO([GNU Fortran],
62[[AC_LANG(Fortran)
63AC_LANG_COMPILER
64
65# No Fortran compiler is known not to support "*.f".
66AC_FC_SRCEXT([f])
67
68# GNU Fortran is known to support freeform.
69AC_FC_FREEFORM([],
70               [AC_MSG_WARN([Fortran does not accept free-form source])])
71if 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
76fi
77]])
78
79
80## ------------------------- ##
81## AC_OPENMP and Fortran 77. ##
82## ------------------------- ##
83
84AT_SETUP([AC_OPENMP and Fortran 77])
85
86AT_DATA([configure.ac],
87[[AC_INIT
88AC_PROG_F77
89AC_LANG([Fortran 77])
90AC_OPENMP
91if test "X$ac_cv_prog_f77_openmp" = Xunsupported; then
92  AS_EXIT([77])
93fi
94FFLAGS="$FFLAGS $OPENMP_FFLAGS"
95AC_CONFIG_FILES([Makefile])
96AC_OUTPUT
97]])
98
99AT_DATA([Makefile.in],
100[[foo@EXEEXT@: foo.@OBJEXT@
101	@F77@ @FFLAGS@ @LDFLAGS@ -o $@ foo.@OBJEXT@
102
103foo.@OBJEXT@: foo.f
104	@F77@ @FFLAGS@ -c foo.f
105]])
106
107AT_DATA([foo.f],
108[[       program main
109      end
110]])
111
112: "${MAKE=make}"
113AT_CHECK([env ACLOCAL=true autoreconf -vi], [], [ignore], [ignore])
114AT_CHECK_CONFIGURE
115AT_CHECK([$MAKE], [], [ignore], [ignore])
116
117AT_CLEANUP
118
119
120## ---------------------- ##
121## AC_OPENMP and Fortran. ##
122## ---------------------- ##
123
124AT_SETUP([AC_OPENMP and Fortran])
125
126AT_DATA([configure.ac],
127[[AC_INIT
128AC_PROG_FC
129AC_LANG([Fortran])
130AC_OPENMP
131if test "X$ac_cv_prog_fc_openmp" = Xunsupported; then
132  AS_EXIT([77])
133fi
134FCFLAGS="$FCFLAGS $OPENMP_FCFLAGS"
135AC_CONFIG_FILES([Makefile])
136AC_OUTPUT
137]])
138
139AT_DATA([Makefile.in],
140[[foo@EXEEXT@: foo.@OBJEXT@
141	@FC@ @FCFLAGS@ @LDFLAGS@ -o $@ foo.@OBJEXT@
142
143foo.@OBJEXT@: foo.f
144	@FC@ @FCFLAGS@ -c foo.f
145]])
146
147AT_DATA([foo.f],
148[[      program main
149      end
150]])
151
152: "${MAKE=make}"
153AT_CHECK([env ACLOCAL=true autoreconf -vi], [], [ignore], [ignore])
154AT_CHECK_CONFIGURE
155AT_CHECK([$MAKE], [], [ignore], [ignore])
156
157AT_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
176AT_SETUP([AC_F77_DUMMY_MAIN usage])
177
178AT_CONFIGURE_AC([[
179AC_PROG_F77
180AC_F77_DUMMY_MAIN([], [AC_MSG_FAILURE([failed to determine F77 dummy main], [77])])
181AC_F77_WRAPPERS
182AC_PROG_CC
183AC_CONFIG_FILES([Makefile])
184]])
185
186AT_DATA([Makefile.in],
187[[
188all: cprogram@EXEEXT@
189
190cprogram@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
200AT_DATA([foobar.f],
201[[C     This is just a purely numeric routine, no I/O needed.
202C     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
210AT_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
217extern "C"  /* prevent C++ name mangling */
218#endif
219void 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
229int 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
239AT_CHECK_AUTOCONF
240AT_CHECK_AUTOHEADER
241AT_CHECK_CONFIGURE
242: "${MAKE=make}"
243AT_CHECK([$MAKE], [], [ignore], [ignore])
244dnl AT_CHECK([./cprogram])
245
246AT_CLEANUP
247
248
249## ----------------------- ##
250## AC_FC_DUMMY_MAIN usage. ##
251## ----------------------- ##
252
253AT_SETUP([AC_FC_DUMMY_MAIN usage])
254
255AT_CONFIGURE_AC([[
256AC_PROG_FC
257AC_FC_FIXEDFORM
258AC_FC_DUMMY_MAIN([], [AC_MSG_FAILURE([failed to determine FC dummy main], [77])])
259AC_FC_WRAPPERS
260AC_PROG_CC
261AC_CONFIG_FILES([Makefile])
262]])
263
264AT_DATA([Makefile.in],
265[[
266all: cprogram@EXEEXT@
267
268cprogram@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
278AT_DATA([foobar.f],
279[[C     This is just a purely numeric routine, no I/O needed.
280C     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
288AT_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
295extern "C"  /* prevent C++ name mangling */
296#endif
297void 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
307int 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
317AT_CHECK_AUTOCONF
318AT_CHECK_AUTOHEADER
319AT_CHECK_CONFIGURE
320: "${MAKE=make}"
321AT_CHECK([$MAKE], [], [ignore], [ignore])
322dnl AT_CHECK([./cprogram])
323
324AT_CLEANUP
325
326
327## ------------------ ##
328## AC_F77_MAIN usage. ##
329## ------------------ ##
330
331AT_SETUP([AC_F77_MAIN usage])
332
333AT_CONFIGURE_AC([[
334AC_PROG_F77
335AC_F77_MAIN
336AC_F77_WRAPPERS
337AC_PROG_CC
338AC_CONFIG_FILES([Makefile])
339]])
340
341AT_DATA([Makefile.in],
342[[
343all: cprogram@EXEEXT@
344
345cprogram@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
355AT_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
365AT_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
372extern "C"  /* prevent C++ name mangling */
373#endif
374void FOOBAR_F77 (int *x);
375
376/* Taken from autoconf.texi:Fortran Compiler.  */
377#ifdef __cplusplus
378  extern "C"
379#endif
380int F77_MAIN (int argc, char *argv[]);
381
382int 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
393AT_CHECK_AUTOCONF
394AT_CHECK_AUTOHEADER
395AT_CHECK_CONFIGURE
396: "${MAKE=make}"
397AT_CHECK([$MAKE], [], [ignore], [ignore])
398dnl AT_CHECK([./cprogram], [], [output from C main
399dnl  some output from Fortran sources
400dnl more output from C main
401dnl ])
402
403AT_CLEANUP
404
405
406## ----------------- ##
407## AC_FC_MAIN usage. ##
408## ----------------- ##
409
410AT_SETUP([AC_FC_MAIN usage])
411
412AT_CONFIGURE_AC([[
413AC_PROG_FC
414AC_FC_FIXEDFORM
415AC_FC_MAIN
416AC_FC_WRAPPERS
417AC_PROG_CC
418AC_CONFIG_FILES([Makefile])
419]])
420
421AT_DATA([Makefile.in],
422[[all: cprogram@EXEEXT@
423
424cprogram@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
434AT_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
444AT_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
451extern "C"  /* prevent C++ name mangling */
452#endif
453void FOOBAR_FC (int *x);
454
455/* Taken from autoconf.texi:Fortran Compiler.  */
456#ifdef __cplusplus
457  extern "C"
458#endif
459int FC_MAIN (int argc, char *argv[]);
460
461int 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
472AT_CHECK_AUTOCONF
473AT_CHECK_AUTOHEADER
474AT_CHECK_CONFIGURE
475: "${MAKE=make}"
476AT_CHECK([$MAKE], [], [ignore], [ignore])
477dnl AT_CHECK([./cprogram], [], [output from C main
478dnl  some output from Fortran sources
479dnl more output from C main
480dnl ])
481
482AT_CLEANUP
483
484
485## ------------------ ##
486## AC_F77_FUNC usage. ##
487## ------------------ ##
488
489AT_SETUP([AC_F77_FUNC usage])
490
491AT_CONFIGURE_AC([[
492AC_PROG_F77
493AC_F77_FUNC([foobar])
494AC_SUBST([foobar])
495AC_PROG_CC
496AC_CONFIG_FILES([cprogram.c:cprogram.in])
497AC_CONFIG_FILES([Makefile])
498]])
499
500AT_DATA([Makefile.in],
501[[
502all: cprogram@EXEEXT@
503
504cprogram@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
514AT_DATA([foobar.f],
515[[      subroutine foobar (x)
516      integer x
517      x = 42
518      return
519      end
520]])
521
522AT_DATA([cprogram.in],
523[[#include <config.h>
524#include <math.h>
525
526#ifdef __cplusplus
527extern "C"  /* prevent C++ name mangling */
528#endif
529void @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
539int 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
549AT_CHECK_AUTOCONF
550AT_CHECK_AUTOHEADER
551AT_CHECK_CONFIGURE
552: "${MAKE=make}"
553AT_CHECK([$MAKE], [], [ignore], [ignore])
554dnl AT_CHECK([./cprogram])
555
556AT_CLEANUP
557
558
559## ----------------- ##
560## AC_FC_FUNC usage. ##
561## ----------------- ##
562
563AT_SETUP([AC_FC_FUNC usage])
564
565AT_CONFIGURE_AC([[
566AC_PROG_FC
567AC_FC_FUNC([foobar])
568AC_SUBST([foobar])
569AC_PROG_CC
570AC_CONFIG_FILES([cprogram.c:cprogram.in])
571AC_CONFIG_FILES([Makefile])
572]])
573
574AT_DATA([Makefile.in],
575[[
576all: cprogram@EXEEXT@
577
578cprogram@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
588AT_DATA([foobar.f],
589[[      subroutine foobar (x)
590      integer x
591      x = 42
592      return
593      end
594]])
595
596AT_DATA([cprogram.in],
597[[#include <config.h>
598#include <math.h>
599
600#ifdef __cplusplus
601extern "C"  /* prevent C++ name mangling */
602#endif
603void @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
613int 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
623AT_CHECK_AUTOCONF
624AT_CHECK_AUTOHEADER
625AT_CHECK_CONFIGURE
626: "${MAKE=make}"
627AT_CHECK([$MAKE], [], [ignore], [ignore])
628dnl AT_CHECK([./cprogram])
629AT_CLEANUP
630
631
632## ------------------- ##
633## AC_FC_SRCEXT usage. ##
634## ------------------- ##
635
636AT_SETUP([AC_FC_SRCEXT usage])
637
638AT_DATA([configure.ac],
639[[AC_INIT
640AC_PROG_FC
641FCFLAGS_NOFREE=$FCFLAGS
642AC_SUBST([FCFLAGS_NOFREE])
643AC_FC_FREEFORM
644# Unconditionally require .f to work.
645AC_FC_SRCEXT([f])
646# For each other extension, fail gracefully if it does not work:
647# Not all compilers support all extensions/language versions.
648m4@&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])])
651AC_CONFIG_FILES([Makefile])
652AC_OUTPUT
653]])
654
655AT_DATA([Makefile.in],
656[[OBJEXT = @OBJEXT@
657
658all: prog@EXEEXT@
659prog@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
679AT_DATA([foof.f],
680[[      program main
681      end
682]])
683
684AT_DATA([foof77.f77],
685[[      subroutine foof77
686      end
687]])
688
689AT_DATA([foof90.f90],
690[[subroutine foof90
691end
692]])
693
694AT_DATA([foof95.f95],
695[[subroutine foof95
696end
697]])
698
699AT_DATA([foof03.f03],
700[[subroutine foof03
701end
702]])
703
704AT_DATA([foof08.f08],
705[[subroutine foof08
706end
707]])
708
709AT_CHECK_AUTOCONF
710AT_CHECK_CONFIGURE
711: "${MAKE=make}"
712AT_CHECK([$MAKE], [], [ignore], [ignore])
713
714AT_CLEANUP
715
716
717## ---------------------- ##
718## AC_FC_PP_SRCEXT usage. ##
719## ---------------------- ##
720
721AT_SETUP([AC_FC_PP_SRCEXT usage])
722
723AT_DATA([configure.ac],
724[[AC_INIT
725AC_PROG_FC
726# Unconditionally require .f and .F to work.
727AC_FC_PP_SRCEXT([f])
728AC_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.
731m4@&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])])
734m4@&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])])
737AC_CONFIG_FILES([Makefile])
738AC_OUTPUT
739]])
740
741AT_DATA([Makefile.in],
742[[OBJEXT = @OBJEXT@
743
744all: prog@EXEEXT@
745prog@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
781for ext in f77 f90 f95 f03 f08; do
782  cat > foo$ext.$ext <<EOF
783      subroutine foo$ext
784#if 0
785this is not correct fortran
786#endif
787      end
788EOF
789done
790
791for ext in F F77 F90 F95 F03 F08; do
792  cat > bar$ext.$ext <<EOF
793      subroutine bar$ext
794#if 0
795this is not correct fortran
796#endif
797      end
798EOF
799done
800
801AT_DATA([foof.f],
802[[      program main
803#if 0
804this is not correct fortran
805#endif
806      end
807]])
808
809AT_CHECK_AUTOCONF
810AT_CHECK_CONFIGURE
811: "${MAKE=make}"
812AT_CHECK([$MAKE], [], [ignore], [ignore])
813
814AT_CLEANUP
815
816
817## --------------- ##
818## AC_FC_FREEFORM. ##
819## --------------- ##
820
821AT_SETUP([AC_FC_FREEFORM])
822
823AT_DATA([configure.ac],
824[[AC_INIT
825AC_PROG_FC
826AC_FC_FREEFORM
827AC_CONFIG_FILES([Makefile])
828AC_OUTPUT
829]])
830
831AT_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
840AT_DATA([prog.f],
841[[program main
842end
843]])
844
845AT_CHECK_AUTOCONF
846AT_CHECK_CONFIGURE
847: "${MAKE=make}"
848AT_CHECK([$MAKE], [], [ignore], [ignore])
849dnl AT_CHECK([./prog])
850
851AT_CLEANUP
852
853
854## --------------------------------- ##
855## AC_FC_FREEFORM with AC_FC_SRCEXT. ##
856## --------------------------------- ##
857
858AT_SETUP([AC_FC_FREEFORM with AC_FC_SRCEXT])
859
860AT_DATA([configure.ac],
861[[AC_INIT
862AC_FC_SRCEXT([f90], [], [AS_EXIT([77])])
863AC_PROG_FC
864AC_FC_FREEFORM
865AC_CONFIG_FILES([Makefile])
866AC_OUTPUT
867]])
868
869AT_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
878AT_DATA([prog.f90],
879[[program main
880end
881]])
882
883AT_CHECK_AUTOCONF
884AT_CHECK_CONFIGURE
885: "${MAKE=make}"
886AT_CHECK([$MAKE], [], [ignore], [ignore])
887dnl AT_CHECK([./prog])
888
889AT_CLEANUP
890
891
892## ---------------- ##
893## AC_FC_FIXEDFORM. ##
894## ---------------- ##
895
896AT_SETUP([AC_FC_FIXEDFORM])
897
898AT_DATA([configure.ac],
899[[AC_INIT
900AC_PROG_FC
901AC_FC_FIXEDFORM
902AC_CONFIG_FILES([Makefile])
903AC_OUTPUT
904]])
905
906AT_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
915AT_DATA([prog.f],
916[[      program main
917C      fixed-form style comment
918       end
919]])
920
921AT_CHECK_AUTOCONF
922AT_CHECK_CONFIGURE
923: "${MAKE=make}"
924AT_CHECK([$MAKE], [], [ignore], [ignore])
925dnl AT_CHECK([./prog])
926
927AT_CLEANUP
928
929
930## ---------------------------------- ##
931## AC_FC_FIXEDFORM with AC_FC_SRCEXT. ##
932## ---------------------------------- ##
933
934AT_SETUP([AC_FC_FIXEDFORM with AC_FC_SRCEXT])
935
936AT_DATA([configure.ac],
937[[AC_INIT
938AC_PROG_FC
939AC_FC_SRCEXT([f90], [], [AS_EXIT([77])])
940AC_FC_FIXEDFORM
941AC_CONFIG_FILES([Makefile])
942AC_OUTPUT
943]])
944
945AT_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
954AT_DATA([prog.f90],
955[[      program main
956C      fixed-form style comment
957       end
958]])
959
960AT_CHECK_AUTOCONF
961AT_CHECK_CONFIGURE
962: "${MAKE=make}"
963AT_CHECK([$MAKE], [], [ignore], [ignore])
964dnl AT_CHECK([./prog])
965
966AT_CLEANUP
967
968
969## ------------------ ##
970## AC_FC_LINE_LENGTH. ##
971## ------------------ ##
972
973AT_SETUP([AC_FC_LINE_LENGTH])
974
975AT_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
983clean:
984	rm -f *.@OBJEXT@ prog@EEXEXT@
985]])
986
987line_80=\
988'subroutine foo(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11)'
989line_132=\
990'subroutine foo(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,'\
991'arg12,arg13,arg14,arg15,arg16,arg17,arg18,arg19)'
992line_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
998for len in 80 132 254
999do
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
1008AC_INIT
1009AC_PROG_FC
1010AC_FC_SRCEXT([f])
1011AC_FC_$fixed_or_free
1012AC_FC_LINE_LENGTH([$arg])
1013AC_CONFIG_FILES([Makefile])
1014AC_OUTPUT
1015EOF
1016
1017    cat >prog.f <<EOF
1018       $long_line
1019       end subroutine
1020       program main
1021       end program
1022EOF
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
1032done
1033
1034AT_CLEANUP
1035
1036
1037## ------------------- ##
1038## AC_FC_CHECK_BOUNDS. ##
1039## ------------------- ##
1040
1041AT_SETUP([AC_FC_CHECK_BOUNDS])
1042
1043AT_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
1051clean:
1052	rm -f *.@OBJEXT@ prog@EEXEXT@
1053]])
1054
1055cat >configure.ac <<EOF
1056AC_INIT
1057AC_PROG_FC
1058AC_FC_SRCEXT([f])
1059AC_FC_CHECK_BOUNDS
1060AC_CONFIG_FILES([Makefile])
1061AC_OUTPUT
1062EOF
1063
1064AT_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
1086AT_CHECK_AUTOCONF
1087AT_CHECK_CONFIGURE
1088: "${MAKE=make}"
1089AT_CHECK([$MAKE], [], [ignore], [ignore])
1090AT_CHECK([./prog || exit 1], [1], [ignore], [ignore])
1091AT_CHECK([$MAKE clean], [], [ignore], [ignore])
1092
1093AT_CLEANUP
1094
1095
1096## ------------------ ##
1097## AC_FC_MODULE_FLAG. ##
1098## ------------------ ##
1099
1100AT_SETUP([AC_FC_MODULE_FLAG])
1101
1102AT_DATA([Makefile.in],
1103[[OBJEXT = @OBJEXT@
1104EXEEXT = @EXEEXT@
1105LIBS = @LIBS@
1106ac_empty = @ac_empty@
1107FC = @FC@
1108FC_MODEXT = @FC_MODEXT@
1109FC_MODINC = @FC_MODINC@
1110FCFLAGS = @FCFLAGS@
1111FCFLAGS_f = @FCFLAGS_f@
1112
1113prog$(EXEEXT): sub/mod.$(OBJEXT) prog.$(OBJEXT)
1114	$(FC) $(FCFLAGS) -o $@ prog.$(OBJEXT) sub/mod.$(OBJEXT) $(LIBS)
1115
1116sub/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.
1120prog.$(OBJEXT): prog.f sub/mod.$(OBJEXT)
1121	$(FC) $(FCFLAGS) $(FC_MODINC). $(FC_MODINC)sub -c $(FCFLAGS_f) $<
1122
1123clean:
1124	-test -z "$(FC_MODEXT)" || rm -f *.$(FC_MODEXT) sub/*.$(FC_MODEXT)
1125	-rm -f *.$(OBJEXT) sub/*.$(OBJEXT) prog$(EXEEXT)
1126]])
1127
1128AT_DATA([configure.ac],
1129[[AC_INIT
1130AC_PROG_FC
1131AC_FC_SRCEXT([f])
1132AC_FC_MODULE_FLAG
1133if test -n "$FC_MODINC"; then
1134  FCFLAGS="$FCFLAGS $FC_MODINC. ${FC_MODINC}sub"
1135fi
1136AC_FC_MODULE_EXTENSION
1137AC_CONFIG_FILES([Makefile])
1138AC_OUTPUT
1139]])
1140
1141mkdir sub
1142
1143AT_DATA([sub/mod.f],
1144[[      module foobar
1145      end module foobar
1146]])
1147
1148AT_DATA([prog.f],
1149[[      program main
1150      use foobar
1151      end program
1152]])
1153
1154AT_CHECK_AUTOCONF
1155AT_CHECK_CONFIGURE
1156: "${MAKE=make}"
1157AT_CHECK([$MAKE], [], [stdout], [stderr])
1158# Both the FCFLAGS setting from configure.ac, and the Makefile rule
1159# should add to the module search path.
1160AT_CHECK([grep 'sub .*sub ' stdout stderr], [], [ignore])
1161AT_CHECK([./prog], [], [ignore], [ignore])
1162AT_CHECK([$MAKE clean], [], [ignore], [ignore])
1163
1164AT_CLEANUP
1165