| # f77demo.at -- Fortran 77 language support. -*- Autotest -*- |
| # |
| # Copyright (C) 2003, 2005-2006, 2011-2019, 2021-2025 Free Software |
| # Foundation, Inc. |
| # Written by Eric Lindahl, 2002 |
| # Written by Gary V. Vaughan, 2003 |
| # |
| # This file is part of GNU Libtool. |
| # |
| # GNU Libtool is free software; you can redistribute it and/or |
| # modify it under the terms of the GNU General Public License as |
| # published by the Free Software Foundation; either version 2 of |
| # the License, or (at your option) any later version. |
| # |
| # GNU Libtool is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with GNU Libtool. If not, see <https://www.gnu.org/licenses/>. |
| #### |
| |
| |
| AT_BANNER([F77 language support.]) |
| |
| |
| # _LT_SETUP |
| # --------- |
| m4_define([_LT_SETUP], |
| [LT_AT_TAG([F77]) |
| AT_KEYWORDS([libtool]) |
| |
| AT_DATA([configure.ac], |
| [[AC_INIT([f77demo], ]AT_PACKAGE_VERSION[, ]AT_PACKAGE_BUGREPORT[) |
| AC_CONFIG_AUX_DIR([build-aux]) |
| AM_INIT_AUTOMAKE |
| AC_PROG_CC |
| |
| AC_PROG_F77 |
| dnl When configuring for 'make dist' purposes, skip checks that may yield fatal |
| dnl errors when there is no working F77 compiler. |
| if test -z "$with_dist"; then |
| dnl Check the flags needed to link f77 programs with ld (i.e. cc) |
| AC_F77_LIBRARY_LDFLAGS |
| dnl Check for underscoring of external names |
| AC_F77_WRAPPERS |
| fi |
| LT_INIT |
| AC_SUBST([LIBTOOL_DEPS]) |
| AC_CONFIG_FILES([Makefile]) |
| AC_CONFIG_HEADERS([config.h:config.in.h]) |
| AC_OUTPUT |
| ]]) |
| |
| AT_DATA([Makefile.am], |
| [[AUTOMAKE_OPTIONS = no-dependencies foreign |
| ACLOCAL_AMFLAGS = -I m4 |
| |
| lib_LTLIBRARIES = libfoo.la libmix.la libfoo2.la libfoo3.la |
| |
| libfoo_la_SOURCES = foof.f |
| libfoo_la_LIBADD = libfoo2.la |
| libfoo_la_LDFLAGS = -no-undefined |
| |
| libfoo2_la_SOURCES = foof2.f |
| libfoo2_la_LDFLAGS = -no-undefined |
| |
| libfoo3_la_SOURCES = foof3.f |
| libfoo3_la_LDFLAGS = -no-undefined |
| |
| libmix_la_SOURCES = foof.f foof2.f fooc.c |
| libmix_la_LDFLAGS = -no-undefined |
| |
| noinst_HEADERS = foo.h |
| |
| bin_PROGRAMS = fprogram cprogram |
| |
| fprogram_SOURCES = fprogram.f |
| fprogram_LDADD = libfoo.la libfoo3.la |
| |
| cprogram_SOURCES = cprogram.c |
| cprogram_LDADD = libmix.la $(FLIBS) |
| |
| libtool: $(LIBTOOL_DEPS) |
| $(SHELL) ./config.status --recheck |
| ]]) |
| |
| AT_DATA([fprogram.f], |
| [[ program fprogram |
| implicit none |
| integer*4 arg,res |
| |
| write(*,*) 'Welcome to GNU libtool Fortran demo!' |
| write(*,*) 'Real programmers write in FORTRAN.' |
| arg=2 |
| |
| call fsub(arg,res) |
| |
| write(*,*) 'fsub returned, saying that 2 *',arg,' =',res |
| |
| if (res.eq.4) then |
| write(*,*) 'fsub is ok!' |
| endif |
| |
| call fsub3(arg,res) |
| |
| write(*,*) 'fsub3 returned, saying that 4 *',arg,' =',res |
| |
| if (res.eq.8) then |
| write(*,*) 'fsub3 is ok!' |
| endif |
| |
| stop |
| end |
| ]]) |
| |
| AT_DATA([cprogram.c], |
| [[#include <config.h> |
| #include <stdio.h> |
| |
| #include "foo.h" |
| |
| int |
| main () |
| { |
| int arg,cres,fres; |
| |
| printf ("Welcome to GNU libtool mixed C/Fortran demo!\n"); |
| |
| arg=2; |
| |
| cres=csub(arg); |
| |
| printf ("The C subroutine returned, claiming that 2*%d = %d\n",arg,cres); |
| |
| if(cres==2*arg) |
| printf ("The C subroutine is ok!\n"); |
| |
| printf("\nCalling the C wrapper routine...\n"); |
| fres=fwrapper(arg); |
| |
| printf ("The C wrapper to the fortran subroutine returned,\n" |
| "claiming that 2*%d = %d\n",arg,fres); |
| |
| if(fres==2*arg) |
| printf ("The Fortran 77 subroutine is ok!\n"); |
| |
| return 0; |
| } |
| ]]) |
| |
| AT_DATA([foo.h], |
| [[#ifndef _FOO_H_ |
| #define _FOO_H_ 1 |
| |
| /* config.h is necessary for the fortran name mangling */ |
| #include <config.h> |
| |
| /* csub is an extremely useful subroutine that |
| * returns the argument multiplied by two :-) |
| */ |
| extern int csub(int); |
| |
| /* This routine performs the same action, but |
| * calls the fortran subroutine fsub to do the |
| * real work. |
| */ |
| extern int fwrapper(int); |
| |
| /* fsub does the same thing as csub, i.e. res=arg*2. |
| * Use autoconf macro for fortran function names. |
| * Note that fortran passes args by reference, so |
| * you need to provide pointers to your ints. |
| */ |
| extern |
| #ifdef __cplusplus |
| "C" |
| #endif |
| void F77_FUNC(fsub,FSUB)(int *arg, int *res); |
| |
| #endif |
| ]]) |
| |
| AT_DATA([fooc.c], |
| [[#include <config.h> |
| #include <stdio.h> |
| |
| #include "foo.h" |
| |
| int csub(int arg) |
| { |
| return (2*arg); |
| } |
| |
| |
| int fwrapper(int arg) |
| { |
| int res; |
| printf("Calling the Fortran 77 subroutine from the C wrapper...\n"); |
| F77_FUNC(fsub,FSUB)(&arg,&res); |
| printf("Returned from the Fortran 77 subroutine...\n"); |
| return res; |
| } |
| ]]) |
| |
| AT_DATA([foof.f], |
| [[ subroutine fsub(arg,res) |
| write(*,*) 'fsub called' |
| call fsubf(arg,res) |
| return |
| end |
| ]]) |
| |
| AT_DATA([foof2.f], |
| [[ subroutine fsubf(arg,res) |
| implicit none |
| integer*4 arg,res |
| write(*,*) 'fsubf called' |
| res=arg*2 |
| return |
| end |
| ]]) |
| |
| AT_DATA([foof3.f], |
| [[ subroutine fsub3(arg,res) |
| implicit none |
| integer*4 arg,res |
| write(*,*) 'fsub3 called' |
| res=arg*4 |
| return |
| end |
| ]]) |
| |
| LT_AT_AUTOHEADER |
| ]) # _LT_SETUP |
| |
| |
| # _LT_CHECK_EXECUTE |
| # ----------------- |
| # Run the default make rule, and check that the built binaries work. |
| m4_define([_LT_CHECK_EXECUTE], |
| [LT_AT_MAKE |
| |
| # Due to differences in line-endings between C stdout and Fortran |
| # stdout, as well as unpredictable output ordering between platforms |
| # and runtimes, we can't reliably check the output here... although |
| # it should be some variation of the following: |
| LT_AT_HOST_DATA([expout], |
| [[ Welcome to GNU libtool Fortran demo! |
| Real programmers write in FORTRAN. |
| fsub called |
| fsubf called |
| fsub returned, saying that 2 * 2 = 4 |
| fsub is ok! |
| fsub3 called |
| fsub3 returned, saying that 4 * 2 = 8 |
| fsub3 is ok! |
| ]]) |
| LT_AT_EXEC_CHECK([./fprogram], 0, [stdout]) |
| |
| # A weaker output content check that is agnostic to the issues above. |
| AT_CHECK([$GREP 'Welcome to GNU libtool Fortran demo!' stdout], |
| [0], [ignore]) |
| |
| # Similarly, we can't reliably compare actual output with the following. |
| LT_AT_HOST_DATA([expout], |
| [[Welcome to GNU libtool mixed C/Fortran demo! |
| The C subroutine returned, claiming that 2*2 = 4 |
| The C subroutine is ok! |
| |
| Calling the C wrapper routine... |
| Calling the Fortran 77 subroutine from the C wrapper... |
| fsub called |
| fsubf called |
| Returned from the Fortran 77 subroutine... |
| The C wrapper to the fortran subroutine returned, |
| claiming that 2*2 = 4 |
| The Fortran 77 subroutine is ok! |
| ]]) |
| LT_AT_EXEC_CHECK([./cprogram], 0, [stdout]) |
| |
| # A weaker output content check that is agnostic to the issues above. |
| AT_CHECK([$GREP 'Welcome to GNU libtool mixed C/Fortran demo!' stdout], |
| [0], [ignore]) |
| ]) |
| |
| |
| ## --------------- ## |
| ## F77demo static. ## |
| ## --------------- ## |
| |
| AT_SETUP([static library]) |
| |
| # Using clang with fsanitize results in an incompatible ASan runtime. |
| # It results in the warning message "linked against incompatible ASan |
| # runtimes". This only occurs with the mixed Fortran/C demo. |
| if $LIBTOOL --config | $EGREP '^CC="clang'; |
| then |
| AT_CHECK([echo "$LDFLAGS" | $EGREP 'fsanitize=' && (exit 77)], 1) |
| fi |
| |
| # Executing the static fprogram might be interactive on MSYS. |
| AT_KEYWORDS([interactive]) |
| |
| _LT_SETUP |
| |
| LT_AT_CHECK_CONFIG([--disable-shared], |
| [^build_old_libs=yes], [^build_libtool_libs=no]) |
| _LT_CHECK_EXECUTE |
| |
| AT_CLEANUP |
| |
| |
| ## --------------- ## |
| ## F77demo shared. ## |
| ## --------------- ## |
| |
| AT_SETUP([shared library]) |
| |
| # Using clang with fsanitize results in an incompatible ASan runtime. |
| # It results in the warning message "linked against incompatible ASan |
| # runtimes". This only occurs with the mixed Fortran/C demo. |
| if $LIBTOOL --config | $EGREP '^CC="clang'; |
| then |
| AT_CHECK([echo "$LDFLAGS" | $EGREP 'fsanitize=' && (exit 77)], 1) |
| fi |
| |
| _LT_SETUP |
| |
| LT_AT_CHECK_CONFIG([--disable-static], |
| [^build_old_libs=no], [^build_libtool_libs=yes]) |
| _LT_CHECK_EXECUTE |
| |
| AT_CLEANUP |
| |
| |
| ## ------------- ## |
| ## F77demo conf. ## |
| ## ------------- ## |
| |
| AT_SETUP([shared and static together]) |
| |
| # Using clang with fsanitize results in an incompatible ASan runtime. |
| # It results in the warning message "linked against incompatible ASan |
| # runtimes". This only occurs with the mixed Fortran/C demo. |
| if $LIBTOOL --config | $EGREP '^CC="clang'; |
| then |
| AT_CHECK([echo "$LDFLAGS" | $EGREP 'fsanitize=' && (exit 77)], 1) |
| fi |
| |
| _LT_SETUP |
| |
| LT_AT_CHECK_CONFIG([], |
| [^build_old_libs=yes], [^build_libtool_libs=yes]) |
| _LT_CHECK_EXECUTE |
| |
| AT_CLEANUP |