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