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 or 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 UPPER or 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 UPPER or 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 UPPER or LOWER.

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>.
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 (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.

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.)

Table Of Contents

Previous topic

FindZLIB

Next topic

GenerateExportHeader

This Page