> 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