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
UPPER
orLOWER
. -
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
UPPER
orLOWER
. -
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
UPPER
orLOWER
. -
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
UPPER
orLOWER
.
Module Functions
-
FortranCInterface_HEADER
-
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_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
SYMBOLS
option with a given namespace<ns>
.
- Global symbols without ‘_’:
-
FortranCInterface_VERIFY
-
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
(orFortranCInterface_VERIFIED_CXX
ifCXX
is given) as a boolean. If the check fails andQUIET
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 theRelease
configuration.
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.)
© 2000–2020 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.15/module/FortranCInterface.html