📄 fortran.m4
字号:
# Some compilers don't accept -v (Lahey: -verbose, xlf: -V, Fujitsu: -###)AC_DEFUN([_AC_PROG_F77_V],[AC_CACHE_CHECK([how to get verbose linking output from $F77], [ac_cv_prog_f77_v],[AC_LANG_ASSERT(Fortran 77)AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],[ac_cv_prog_f77_v=# Try some options frequently used verbose outputfor ac_verb in -v -verbose --verbose -V -\#\#\#; do _AC_PROG_F77_V_OUTPUT($ac_verb) # look for -l* and *.a constructs in the output for ac_arg in $ac_f77_v_output; do case $ac_arg in [[\\/]]*.a | ?:[[\\/]]*.a | -[[lLRu]]*) ac_cv_prog_f77_v=$ac_verb break 2 ;; esac donedoneif test -z "$ac_cv_prog_f77_v"; then AC_MSG_WARN([cannot determine how to obtain linking information from $F77])fi], [AC_MSG_WARN([compilation failed])])])])# _AC_PROG_F77_V# AC_F77_LIBRARY_LDFLAGS# ----------------------## Determine the linker flags (e.g. "-L" and "-l") for the Fortran 77# intrinsic and run-time libraries that are required to successfully# link a Fortran 77 program or shared library. The output variable# FLIBS is set to these flags.## This macro is intended to be used in those situations when it is# necessary to mix, e.g. C++ and Fortran 77, source code into a single# program or shared library.## For example, if object files from a C++ and Fortran 77 compiler must# be linked together, then the C++ compiler/linker must be used for# linking (since special C++-ish things need to happen at link time# like calling global constructors, instantiating templates, enabling# exception support, etc.).## However, the Fortran 77 intrinsic and run-time libraries must be# linked in as well, but the C++ compiler/linker doesn't know how to# add these Fortran 77 libraries. Hence, the macro# "AC_F77_LIBRARY_LDFLAGS" was created to determine these Fortran 77# libraries.## This macro was packaged in its current form by Matthew D. Langston.# However, nearly all of this macro came from the "OCTAVE_FLIBS" macro# in "octave-2.0.13/aclocal.m4", and full credit should go to John# W. Eaton for writing this extremely useful macro. Thank you John.AC_DEFUN([AC_F77_LIBRARY_LDFLAGS],[AC_LANG_PUSH(Fortran 77)dnl_AC_PROG_F77_VAC_CACHE_CHECK([for Fortran 77 libraries], ac_cv_flibs,[if test "x$FLIBS" != "x"; then ac_cv_flibs="$FLIBS" # Let the user override the test.else_AC_PROG_F77_V_OUTPUTac_cv_flibs=# Save positional arguments (if any)ac_save_positional="$[@]"set X $ac_f77_v_outputwhile test $[@%:@] != 1; do shift ac_arg=$[1] case $ac_arg in [[\\/]]*.a | ?:[[\\/]]*.a) _AC_LIST_MEMBER_IF($ac_arg, $ac_cv_flibs, , ac_cv_flibs="$ac_cv_flibs $ac_arg") ;; -bI:*) _AC_LIST_MEMBER_IF($ac_arg, $ac_cv_flibs, , [_AC_LINKER_OPTION([$ac_arg], ac_cv_flibs)]) ;; # Ignore these flags. -lang* | -lcrt0.o | -lc | -lgcc | -libmil | -LANG:=*) ;; -lkernel32) test x"$CYGWIN" != xyes && ac_cv_flibs="$ac_cv_flibs $ac_arg" ;; -[[LRuY]]) # These flags, when seen by themselves, take an argument. # We remove the space between option and argument and re-iterate # unless we find an empty arg or a new option (starting with -) case $[2] in "" | -*);; *) ac_arg="$ac_arg$[2]" shift; shift set X $ac_arg "$[@]" ;; esac ;; -YP,*) for ac_j in `echo $ac_arg | sed -e 's/-YP,/-L/;s/:/ -L/g'`; do _AC_LIST_MEMBER_IF($ac_j, $ac_cv_flibs, , [ac_arg="$ac_arg $ac_j" ac_cv_flibs="$ac_cv_flibs $ac_j"]) done ;; -[[lLR]]*) _AC_LIST_MEMBER_IF($ac_arg, $ac_cv_flibs, , ac_cv_flibs="$ac_cv_flibs $ac_arg") ;; # Ignore everything else. esacdone# restore positional argumentsset X $ac_save_positional; shift# We only consider "LD_RUN_PATH" on Solaris systems. If this is seen,# then we insist that the "run path" must be an absolute path (i.e. it# must begin with a "/").case `(uname -sr) 2>/dev/null` in "SunOS 5"*) ac_ld_run_path=`echo $ac_f77_v_output | sed -n 's,^.*LD_RUN_PATH *= *\(/[[^ ]]*\).*$,-R\1,p'` test "x$ac_ld_run_path" != x && _AC_LINKER_OPTION([$ac_ld_run_path], ac_cv_flibs) ;;esacfi # test "x$FLIBS" = "x"])FLIBS="$ac_cv_flibs"AC_SUBST(FLIBS)AC_LANG_POP(Fortran 77)dnl])# AC_F77_LIBRARY_LDFLAGS# AC_F77_DUMMY_MAIN([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])# -----------------------------------------------------------## Detect name of dummy main routine required by the Fortran libraries,# (if any) and define F77_DUMMY_MAIN to this name (which should be# used for a dummy declaration, if it is defined). On some systems,# linking a C program to the Fortran library does not work unless you# supply a dummy function called something like MAIN__.## Execute ACTION-IF-NOT-FOUND if no way of successfully linking a C# program with the F77 libs is found; default to exiting with an error# message. Execute ACTION-IF-FOUND if a dummy routine name is needed# and found or if it is not needed (default to defining F77_DUMMY_MAIN# when needed).## What is technically happening is that the Fortran libraries provide# their own main() function, which usually initializes Fortran I/O and# similar stuff, and then calls MAIN__, which is the entry point of# your program. Usually, a C program will override this with its own# main() routine, but the linker sometimes complain if you don't# provide a dummy (never-called) MAIN__ routine anyway.## Of course, programs that want to allow Fortran subroutines to do# I/O, etcetera, should call their main routine MAIN__() (or whatever)# instead of main(). A separate autoconf test (AC_F77_MAIN) checks# for the routine to use in this case (since the semantics of the test# are slightly different). To link to e.g. purely numerical# libraries, this is normally not necessary, however, and most C/C++# programs are reluctant to turn over so much control to Fortran. =)## The name variants we check for are (in order):# MAIN__ (g77, MAIN__ required on some systems; IRIX, MAIN__ optional)# MAIN_, __main (SunOS)# MAIN _MAIN __MAIN main_ main__ _main (we follow DDD and try these too)AC_DEFUN([AC_F77_DUMMY_MAIN],[AC_REQUIRE([AC_F77_LIBRARY_LDFLAGS])dnlm4_define([_AC_LANG_PROGRAM_C_F77_HOOKS],[#ifdef F77_DUMMY_MAIN# ifdef __cplusplus extern "C"# endif int F77_DUMMY_MAIN() { return 1; }#endif])AC_CACHE_CHECK([for dummy main to link with Fortran 77 libraries], ac_cv_f77_dummy_main,[AC_LANG_PUSH(C)dnl ac_f77_dm_save_LIBS=$LIBS LIBS="$LIBS $FLIBS" # First, try linking without a dummy main: AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], [ac_cv_f77_dummy_main=none], [ac_cv_f77_dummy_main=unknown]) if test $ac_cv_f77_dummy_main = unknown; then for ac_func in MAIN__ MAIN_ __main MAIN _MAIN __MAIN main_ main__ _main; do AC_LINK_IFELSE([AC_LANG_PROGRAM([[@%:@define F77_DUMMY_MAIN $ac_func]])], [ac_cv_f77_dummy_main=$ac_func; break]) done fi rm -f conftest* LIBS=$ac_f77_dm_save_LIBS AC_LANG_POP(C)dnl])F77_DUMMY_MAIN=$ac_cv_f77_dummy_mainAS_IF([test "$F77_DUMMY_MAIN" != unknown], [m4_default([$1],[if test $F77_DUMMY_MAIN != none; then AC_DEFINE_UNQUOTED([F77_DUMMY_MAIN], $F77_DUMMY_MAIN, [Define to dummy `main' function (if any) required to link to the Fortran 77 libraries.])fi])], [m4_default([$2], [AC_MSG_FAILURE([linking to Fortran libraries from C fails])])])])# AC_F77_DUMMY_MAIN# AC_F77_MAIN# -----------# Define F77_MAIN to name of alternate main() function for use with# the Fortran libraries. (Typically, the libraries may define their# own main() to initialize I/O, etcetera, that then call your own# routine called MAIN__ or whatever.) See AC_F77_DUMMY_MAIN, above.# If no such alternate name is found, just define F77_MAIN to main.#AC_DEFUN([AC_F77_MAIN],[AC_REQUIRE([AC_F77_LIBRARY_LDFLAGS])dnlAC_CACHE_CHECK([for alternate main to link with Fortran 77 libraries], ac_cv_f77_main,[AC_LANG_PUSH(C)dnl ac_f77_m_save_LIBS=$LIBS LIBS="$LIBS $FLIBS" ac_cv_f77_main="main" # default entry point name for ac_func in MAIN__ MAIN_ __main MAIN _MAIN __MAIN main_ main__ _main; do AC_LINK_IFELSE([AC_LANG_PROGRAM([@%:@undef F77_DUMMY_MAIN@%:@define main $ac_func])], [ac_cv_f77_main=$ac_func; break]) done rm -f conftest* LIBS=$ac_f77_m_save_LIBS AC_LANG_POP(C)dnl])AC_DEFINE_UNQUOTED([F77_MAIN], $ac_cv_f77_main, [Define to alternate name for `main' routine that is called from a `main' in the Fortran libraries.])])# AC_F77_MAIN# _AC_F77_NAME_MANGLING# ---------------------# Test for the name mangling scheme used by the Fortran 77 compiler.## Sets ac_cv_f77_mangling. The value contains three fields, separated# by commas:## lower case / upper case:# case translation of the Fortran 77 symbols# underscore / no underscore:# whether the compiler appends "_" to symbol names# extra underscore / no extra underscore:# whether the compiler appends an extra "_" to symbol names already# containing at least one underscore#AC_DEFUN([_AC_F77_NAME_MANGLING],[AC_REQUIRE([AC_F77_LIBRARY_LDFLAGS])dnlAC_REQUIRE([AC_F77_DUMMY_MAIN])dnlAC_CACHE_CHECK([for Fortran 77 name-mangling scheme], ac_cv_f77_mangling,[AC_LANG_PUSH(Fortran 77)dnlAC_COMPILE_IFELSE([ subroutine foobar() return end subroutine foo_bar() return end],[mv conftest.$ac_objext cf77_test.$ac_objext AC_LANG_PUSH(C)dnl ac_save_LIBS=$LIBS LIBS="cf77_test.$ac_objext $LIBS $FLIBS" ac_success=no for ac_foobar in foobar FOOBAR; do for ac_underscore in "" "_"; do ac_func="$ac_foobar$ac_underscore" AC_LINK_IFELSE([AC_LANG_CALL([], [$ac_func])], [ac_success=yes; break 2]) done done if test "$ac_success" = "yes"; then case $ac_foobar in foobar) ac_case=lower ac_foo_bar=foo_bar ;; FOOBAR) ac_case=upper ac_foo_bar=FOO_BAR ;; esac ac_success_extra=no for ac_extra in "" "_"; do ac_func="$ac_foo_bar$ac_underscore$ac_extra" AC_LINK_IFELSE([AC_LANG_CALL([], [$ac_func])], [ac_success_extra=yes; break]) done if test "$ac_success_extra" = "yes"; then ac_cv_f77_mangling="$ac_case case" if test -z "$ac_underscore"; then ac_cv_f77_mangling="$ac_cv_f77_mangling, no underscore" else ac_cv_f77_mangling="$ac_cv_f77_mangling, underscore" fi if test -z "$ac_extra"; then ac_cv_f77_mangling="$ac_cv_f77_mangling, no extra underscore" else ac_cv_f77_mangling="$ac_cv_f77_mangling, extra underscore" fi else ac_cv_f77_mangling="unknown" fi else ac_cv_f77_mangling="unknown" fi LIBS=$ac_save_LIBS AC_LANG_POP(C)dnl rm -f cf77_test* conftest*], [AC_MSG_FAILURE([cannot compile a simple Fortran program])])AC_LANG_POP(Fortran 77)dnl])])# _AC_F77_NAME_MANGLING# The replacement is empty.AU_DEFUN([AC_F77_NAME_MANGLING], [])# AC_F77_WRAPPERS# ---------------# Defines C macros F77_FUNC(name,NAME) and F77_FUNC_(name,NAME) to# properly mangle the names of C identifiers, and C identifiers with# underscores, respectively, so that they match the name mangling# scheme used by the Fortran 77 compiler.AC_DEFUN([AC_F77_WRAPPERS],[AC_REQUIRE([_AC_F77_NAME_MANGLING])dnlAH_TEMPLATE([F77_FUNC], [Define to a macro mangling the given C identifier (in lower and upper case), which must not contain underscores, for linking with Fortran.])dnlAH_TEMPLATE([F77_FUNC_], [As F77_FUNC, but for C identifiers containing underscores.])dnlcase $ac_cv_f77_mangling in "lower case, no underscore, no extra underscore") AC_DEFINE([F77_FUNC(name,NAME)], [name]) AC_DEFINE([F77_FUNC_(name,NAME)], [name]) ;; "lower case, no underscore, extra underscore") AC_DEFINE([F77_FUNC(name,NAME)], [name]) AC_DEFINE([F77_FUNC_(name,NAME)], [name ## _]) ;; "lower case, underscore, no extra underscore") AC_DEFINE([F77_FUNC(name,NAME)], [name ## _]) AC_DEFINE([F77_FUNC_(name,NAME)], [name ## _]) ;; "lower case, underscore, extra underscore") AC_DEFINE([F77_FUNC(name,NAME)], [name ## _]) AC_DEFINE([F77_FUNC_(name,NAME)], [name ## __]) ;; "upper case, no underscore, no extra underscore") AC_DEFINE([F77_FUNC(name,NAME)], [NAME]) AC_DEFINE([F77_FUNC_(name,NAME)], [NAME]) ;; "upper case, no underscore, extra underscore") AC_DEFINE([F77_FUNC(name,NAME)], [NAME]) AC_DEFINE([F77_FUNC_(name,NAME)], [NAME ## _]) ;; "upper case, underscore, no extra underscore") AC_DEFINE([F77_FUNC(name,NAME)], [NAME ## _]) AC_DEFINE([F77_FUNC_(name,NAME)], [NAME ## _]) ;; "upper case, underscore, extra underscore") AC_DEFINE([F77_FUNC(name,NAME)], [NAME ## _]) AC_DEFINE([F77_FUNC_(name,NAME)], [NAME ## __]) ;; *) AC_MSG_WARN([unknown Fortran 77 name-mangling scheme]) ;;esac])# AC_F77_WRAPPERS# AC_F77_FUNC(NAME, [SHELLVAR = NAME])# ------------------------------------# For a Fortran subroutine of given NAME, define a shell variable# $SHELLVAR to the Fortran-77 mangled name. If the SHELLVAR# argument is not supplied, it defaults to NAME.AC_DEFUN([AC_F77_FUNC],[AC_REQUIRE([_AC_F77_NAME_MANGLING])dnlcase $ac_cv_f77_mangling in upper*) ac_val="m4_toupper([$1])" ;; lower*) ac_val="m4_tolower([$1])" ;; *) ac_val="unknown" ;;esaccase $ac_cv_f77_mangling in *," underscore"*) ac_val="$ac_val"_ ;; esacm4_if(m4_index([$1],[_]),-1,[],[case $ac_cv_f77_mangling in *," extra underscore"*) ac_val="$ac_val"_ ;; esac])m4_default([$2],[$1])="$ac_val"])# AC_F77_FUNC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -