FortranCInterface¶
Fortran/C Interface Detection
This module automatically detects the API by which C and Fortran languages interact.
Module Variables¶
Variables that indicate if the mangling is found:
- FortranCInterface_GLOBAL_FOUND
- Global subroutines and functions. 
- FortranCInterface_MODULE_FOUND
- Module 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_PREFIX
- Prefix for a global symbol without an underscore. 
- FortranCInterface_GLOBAL_SUFFIX
- Suffix for a global symbol without an underscore. 
- FortranCInterface_GLOBAL_CASE
- The case for a global symbol without an underscore, either - UPPERor- LOWER.
- FortranCInterface_GLOBAL__PREFIX
- Prefix for a global symbol with an underscore. 
- FortranCInterface_GLOBAL__SUFFIX
- Suffix for a global symbol with an underscore. 
- FortranCInterface_GLOBAL__CASE
- The case for a global symbol with an underscore, either - UPPERor- LOWER.
- FortranCInterface_MODULE_PREFIX
- Prefix for a module symbol without an underscore. 
- FortranCInterface_MODULE_MIDDLE
- Middle of a module symbol without an underscore that appears between the name of the module and the name of the symbol. 
- FortranCInterface_MODULE_SUFFIX
- Suffix for a module symbol without an underscore. 
- FortranCInterface_MODULE_CASE
- The case for a module symbol without an underscore, either - UPPERor- LOWER.
- FortranCInterface_MODULE__PREFIX
- Prefix for a module symbol with an underscore. 
- FortranCInterface_MODULE__MIDDLE
- Middle of a module symbol with an underscore that appears between the name of the module and the name of the symbol. 
- FortranCInterface_MODULE__SUFFIX
- Suffix for a module symbol with an underscore. 
- FortranCInterface_MODULE__CASE
- The case for a module symbol with an underscore, either - UPPERor- LOWER.
Module Functions¶
- FortranCInterface_HEADER¶
- The - FortranCInterface_HEADERfunction 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_NAMESPACE
- Replace the default - FortranCInterface_prefix with a given namespace- <macro-ns>.
- SYMBOLS
- List 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_NAMESPACE
- Prefix all preprocessor definitions generated by the - SYMBOLSoption with a given namespace- <ns>.
 
- FortranCInterface_VERIFY¶
- The - FortranCInterface_VERIFYfunction 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_CXXif- CXXis given) as a boolean. If the check fails and- QUIETis 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- Releaseconfiguration.
Example Usage¶
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.
Additional Manglings¶
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.)
