2
0

fortran.at 23 KB

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