Re: Fortran wrappers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



>    We have a project which is comprised of Fortran and C++ code, linked

>    together at the end with the C++ compiler. I have configure setup

>    with AC_LANG([C++]), and push/pop to Fortran as required. I notice that

>    using AC_FC_WRAPPERS() results in configure containing all the extra

>    infrastructure for C compilation and those tests use CC and CFLAGS.

>

>    Looking at fortran.m4 I see the reason is there are a few instances of

>    explicitly using the C compiler. Would it somehow be possible via an extra

>    argument or otherwise to add the ability to instruct those macros to use

>    the C++ compiler instead?



Is it causing problems to have the C infrastructure within the Makefile?  Or are you simply hoping for a cleaner, stripped-down Makefile?



If you’re worried about the C compiler configure checks automatically testing for headers, etc., just make sure you test for the same features with the C++ compiler first and those C tests should (I think) get skipped since the results were already provided using the C++ compiler.



Looks like the Fortran tests that trigger a C compiler are:

_AC_FC_DUMMY_MAIN

_AC_FC_MAIN

__AC_FC_NAME_MANGLING



And _AC_FC_DUMMY_MAIN is required by AC_FC_WRAPPERS, eventually.



Though not ideal, you could write your own name mangling configure test and substitute the C++ compiler.  I’ve attached a file “my_fc_name_mangling.m4” that does just that.  Not sure it’ll make it to the autoconf list as an attachment, so I’ll copy and paste below.  I’ve renamed the various __AC_* and _AC_* and AC_* macros to “MY”, commented out the required call to _AC_FC_DUMMY_MAIN (YMMV whether you need that, but I’ll require a C compile again), and substituted the C++ compiler within the name mangling test code.  Place that file wherever your ACLOCAL_AMFLAGS variable in the top of your Makefile.am points to so that autoreconf will pick it up.  Use “MY_FC_NAME_MANGLING” – or the F77 one – in your configure.ac file.





File: my_fc_name_mangling.m4



# This file was copied and modified from Autoconf.  Original license

# information appears below.



# This file is part of Autoconf.                       -*- Autoconf -*-

# Fortran languages support.

# Copyright (C) 2001, 2003-2012 Free Software Foundation, Inc.



# This file is part of Autoconf.  This program 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 3 of the License, or

# (at your option) any later version.

#

# This program 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.

#

# Under Section 7 of GPL version 3, you are granted additional

# permissions described in the Autoconf Configure Script Exception,

# version 3.0, as published by the Free Software Foundation.

#

# You should have received a copy of the GNU General Public License

# and a copy of the Autoconf Configure Script Exception along with

# this program; see the files COPYINGv3 and COPYING.EXCEPTION

# respectively.  If not, see <http://www.gnu.org/licenses/>.



# Written by David MacKenzie, with help from

# Franc,ois Pinard, Karl Berry, Richard Pixley, Ian Lance Taylor,

# Roland McGrath, Noah Friedman, david d zuhn, and many others.



# __MY_FC_NAME_MANGLING

# ---------------------

# Test for the name mangling scheme used by the Fortran compiler.

#

# Sets ac_cv_{f77,fc}_mangling. The value contains three fields, separated

# by commas:

#

# lower case / upper case:

#    case translation of the Fortran 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([__MY_FC_NAME_MANGLING],

[_AC_FORTRAN_ASSERT()dnl

AC_CACHE_CHECK([for _AC_LANG name-mangling scheme],

            ac_cv_[]_AC_LANG_ABBREV[]_mangling,

[AC_COMPILE_IFELSE(

[[      subroutine foobar()

      return

      end

      subroutine foo_bar()

      return

      end]],

[mv conftest.$ac_objext cfortran_test.$ac_objext



  ac_save_LIBS=$LIBS

  LIBS="cfortran_test.$ac_objext $LIBS $[]_AC_LANG_PREFIX[]LIBS"



  AC_LANG_PUSH(C++)dnl

  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

  AC_LANG_POP(C++)dnl



  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_LANG_PUSH(C++)dnl

     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

     AC_LANG_POP(C++)dnl



     if test "$ac_success_extra" = "yes"; then

      ac_cv_[]_AC_LANG_ABBREV[]_mangling="$ac_case case"

      if test -z "$ac_underscore"; then

        ac_cv_[]_AC_LANG_ABBREV[]_mangling="$ac_cv_[]_AC_LANG_ABBREV[]_mangling, no underscore"

      else

        ac_cv_[]_AC_LANG_ABBREV[]_mangling="$ac_cv_[]_AC_LANG_ABBREV[]_mangling, underscore"

      fi

      if test -z "$ac_extra"; then

        ac_cv_[]_AC_LANG_ABBREV[]_mangling="$ac_cv_[]_AC_LANG_ABBREV[]_mangling, no extra underscore"

      else

        ac_cv_[]_AC_LANG_ABBREV[]_mangling="$ac_cv_[]_AC_LANG_ABBREV[]_mangling, extra underscore"

      fi

      else

      ac_cv_[]_AC_LANG_ABBREV[]_mangling="unknown"

      fi

  else

     ac_cv_[]_AC_LANG_ABBREV[]_mangling="unknown"

  fi



  LIBS=$ac_save_LIBS

  rm -rf conftest*

  rm -f cfortran_test*],

  [AC_MSG_FAILURE([cannot compile a simple Fortran program])])

])

])# __MY_FC_NAME_MANGLING





# The replacement is empty.

AU_DEFUN([AC_F77_NAME_MANGLING], [])





# _MY_F77_NAME_MANGLING

# ---------------------

AC_DEFUN([_MY_F77_NAME_MANGLING],

[AC_REQUIRE([AC_F77_LIBRARY_LDFLAGS])dnl

dnl AC_REQUIRE([AC_F77_DUMMY_MAIN])dnl

AC_LANG_PUSH(Fortran 77)dnl

__MY_FC_NAME_MANGLING

AC_LANG_POP(Fortran 77)dnl

])# _MY_F77_NAME_MANGLING





# _MY_FC_NAME_MANGLING

# --------------------

AC_DEFUN([_MY_FC_NAME_MANGLING],

[AC_REQUIRE([AC_FC_LIBRARY_LDFLAGS])dnl

dnl AC_REQUIRE([AC_FC_DUMMY_MAIN])dnl

AC_LANG_PUSH(Fortran)dnl

__MY_FC_NAME_MANGLING

AC_LANG_POP(Fortran)dnl

])# _MY_FC_NAME_MANGLING





# _MY_FC_WRAPPERS

# ---------------

# Defines C macros {F77,FC}_FUNC(name,NAME) and {F77,FC}_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 compiler.

AC_DEFUN([_MY_FC_WRAPPERS],

[_AC_FORTRAN_ASSERT()dnl

AH_TEMPLATE(_AC_FC[_FUNC],

    [Define to a macro mangling the given C identifier (in lower and upper

     case), which must not contain underscores, for linking with Fortran.])dnl

AH_TEMPLATE(_AC_FC[_FUNC_],

    [As ]_AC_FC[_FUNC, but for C identifiers containing underscores.])dnl

case $ac_cv_[]_AC_LANG_ABBREV[]_mangling in

  "lower case, no underscore, no extra underscore")

        AC_DEFINE(_AC_FC[_FUNC(name,NAME)],  [name])

        AC_DEFINE(_AC_FC[_FUNC_(name,NAME)], [name]) ;;

  "lower case, no underscore, extra underscore")

        AC_DEFINE(_AC_FC[_FUNC(name,NAME)],  [name])

        AC_DEFINE(_AC_FC[_FUNC_(name,NAME)], [name [##] _]) ;;

  "lower case, underscore, no extra underscore")

        AC_DEFINE(_AC_FC[_FUNC(name,NAME)],  [name [##] _])

        AC_DEFINE(_AC_FC[_FUNC_(name,NAME)], [name [##] _]) ;;

  "lower case, underscore, extra underscore")

        AC_DEFINE(_AC_FC[_FUNC(name,NAME)],  [name [##] _])

        AC_DEFINE(_AC_FC[_FUNC_(name,NAME)], [name [##] __]) ;;

  "upper case, no underscore, no extra underscore")

        AC_DEFINE(_AC_FC[_FUNC(name,NAME)],  [NAME])

        AC_DEFINE(_AC_FC[_FUNC_(name,NAME)], [NAME]) ;;

  "upper case, no underscore, extra underscore")

        AC_DEFINE(_AC_FC[_FUNC(name,NAME)],  [NAME])

        AC_DEFINE(_AC_FC[_FUNC_(name,NAME)], [NAME [##] _]) ;;

  "upper case, underscore, no extra underscore")

        AC_DEFINE(_AC_FC[_FUNC(name,NAME)],  [NAME [##] _])

        AC_DEFINE(_AC_FC[_FUNC_(name,NAME)], [NAME [##] _]) ;;

  "upper case, underscore, extra underscore")

        AC_DEFINE(_AC_FC[_FUNC(name,NAME)],  [NAME [##] _])

        AC_DEFINE(_AC_FC[_FUNC_(name,NAME)], [NAME [##] __]) ;;

  *)

        AC_MSG_WARN([unknown Fortran name-mangling scheme])

        ;;

esac

])# _MY_FC_WRAPPERS





# MY_F77_WRAPPERS

# ---------------

AC_DEFUN([MY_F77_WRAPPERS],

[AC_REQUIRE([_MY_F77_NAME_MANGLING])dnl

AC_LANG_PUSH(Fortran 77)dnl

_MY_FC_WRAPPERS

AC_LANG_POP(Fortran 77)dnl

])# MY_F77_WRAPPERS





# MY_FC_WRAPPERS

# --------------

AC_DEFUN([MY_FC_WRAPPERS],

[AC_REQUIRE([_MY_FC_NAME_MANGLING])dnl

AC_LANG_PUSH(Fortran)dnl

_MY_FC_WRAPPERS

AC_LANG_POP(Fortran)dnl

])# MY_FC_WRAPPERS


Attachment: my_fc_name_mangling.m4
Description: my_fc_name_mangling.m4

_______________________________________________
Autoconf mailing list
Autoconf@xxxxxxx
https://lists.gnu.org/mailman/listinfo/autoconf

[Index of Archives]     [GCC Help]     [Kernel Discussion]     [RPM Discussion]     [Red Hat Development]     [Yosemite News]     [Linux USB]     [Samba]

  Powered by Linux