Fortran/C Interface Detection
This module automatically detects the API by which C and Fortran languages interact.
Variables that indicate if the mangling is found:
FortranCInterface_GLOBAL_FOUNDGlobal subroutines and functions.
FortranCInterface_MODULE_FOUNDModule subroutines and functions (declared by "MODULE PROCEDURE").
This module also provides the following variables to specify the detected mangling, though a typical use case does not need to reference them and can use the Module Functions below.
FortranCInterface_GLOBAL_PREFIXPrefix for a global symbol without an underscore.
FortranCInterface_GLOBAL_SUFFIXSuffix for a global symbol without an underscore.
FortranCInterface_GLOBAL_CASEThe case for a global symbol without an underscore,
either UPPER or LOWER.
FortranCInterface_GLOBAL__PREFIXPrefix for a global symbol with an underscore.
FortranCInterface_GLOBAL__SUFFIXSuffix for a global symbol with an underscore.
FortranCInterface_GLOBAL__CASEThe case for a global symbol with an underscore,
either UPPER or LOWER.
FortranCInterface_MODULE_PREFIXPrefix for a module symbol without an underscore.
FortranCInterface_MODULE_MIDDLEMiddle of a module symbol without an underscore that appears between the name of the module and the name of the symbol.
FortranCInterface_MODULE_SUFFIXSuffix for a module symbol without an underscore.
FortranCInterface_MODULE_CASEThe case for a module symbol without an underscore,
either UPPER or LOWER.
FortranCInterface_MODULE__PREFIXPrefix for a module symbol with an underscore.
FortranCInterface_MODULE__MIDDLEMiddle of a module symbol with an underscore that appears between the name of the module and the name of the symbol.
FortranCInterface_MODULE__SUFFIXSuffix for a module symbol with an underscore.
FortranCInterface_MODULE__CASEThe case for a module symbol with an underscore,
either UPPER or LOWER.
The FortranCInterface_HEADER function is provided to generate a
C header file containing macros to mangle symbol names:
FortranCInterface_HEADER(<file>
[MACRO_NAMESPACE <macro-ns>]
[SYMBOL_NAMESPACE <ns>]
[SYMBOLS [<module>:]<function> ...])
It generates in <file> definitions of the following macros:
#define FortranCInterface_GLOBAL (name,NAME) ...
#define FortranCInterface_GLOBAL_(name,NAME) ...
#define FortranCInterface_MODULE (mod,name, MOD,NAME) ...
#define FortranCInterface_MODULE_(mod,name, MOD,NAME) ...
These macros mangle four categories of Fortran symbols, respectively:
Global symbols without '_': call mysub()
Global symbols with '_' : call my_sub()
Module symbols without '_': use mymod; call mysub()
Module symbols with '_' : use mymod; call my_sub()
If mangling for a category is not known, its macro is left undefined. All macros require raw names in both lower case and upper case.
The options are:
MACRO_NAMESPACEReplace the default FortranCInterface_ prefix with a given
namespace <macro-ns>.
SYMBOLSList symbols to mangle automatically with C preprocessor definitions:
<function> ==> #define <ns><function> ...
<module>:<function> ==> #define <ns><module>_<function> ...
If the mangling for some symbol is not known then no preprocessor definition is created, and a warning is displayed.
SYMBOL_NAMESPACEPrefix all preprocessor definitions generated by the SYMBOLS
option with a given namespace <ns>.
The FortranCInterface_VERIFY function is provided to verify
that the Fortran and C/C++ compilers work together:
FortranCInterface_VERIFY([CXX] [QUIET])
It tests whether a simple test executable using Fortran and C (and C++
when the CXX option is given) compiles and links successfully. The
result is stored in the cache entry FortranCInterface_VERIFIED_C
(or FortranCInterface_VERIFIED_CXX if CXX is given) as a boolean.
If the check fails and QUIET is not given the function terminates with a
fatal error message describing the problem. The purpose of this check
is to stop a build early for incompatible compiler combinations. The
test is built in the Release configuration.
include(FortranCInterface)
FortranCInterface_HEADER(FC.h MACRO_NAMESPACE "FC_")
This creates a "FC.h" header that defines mangling macros FC_GLOBAL(),
FC_GLOBAL_(), FC_MODULE(), and FC_MODULE_().
include(FortranCInterface)
FortranCInterface_HEADER(FCMangle.h
MACRO_NAMESPACE "FC_"
SYMBOL_NAMESPACE "FC_"
SYMBOLS mysub mymod:my_sub)
This creates a "FCMangle.h" header that defines the same FC_*()
mangling macros as the previous example plus preprocessor symbols
FC_mysub and FC_mymod_my_sub.
FortranCInterface is aware of possible GLOBAL and MODULE manglings
for many Fortran compilers, but it also provides an interface to specify
new possible manglings. Set the variables:
FortranCInterface_GLOBAL_SYMBOLS
FortranCInterface_MODULE_SYMBOLS
before including FortranCInterface to specify manglings of the symbols
MySub, My_Sub, MyModule:MySub, and My_Module:My_Sub.
For example, the code:
set(FortranCInterface_GLOBAL_SYMBOLS mysub_ my_sub__ MYSUB_)
# ^^^^^ ^^^^^^ ^^^^^
set(FortranCInterface_MODULE_SYMBOLS
__mymodule_MOD_mysub __my_module_MOD_my_sub)
# ^^^^^^^^ ^^^^^ ^^^^^^^^^ ^^^^^^
include(FortranCInterface)
tells FortranCInterface to try given GLOBAL and MODULE manglings.
(The carets point at raw symbol names for clarity in this example but
are not needed.)