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