FortranCInterface

此模块提供了用于检测 Fortran/C 接口的变量和命令。

在 CMake 项目中加载此模块,使用

include(FortranCInterface)

此模块自动检测 C 和 Fortran 语言交互的 API。

变量

结果变量

包含此模块会定义以下变量,指示是否找到混淆(mangling)

FortranCInterface_GLOBAL_FOUND

布尔值,指示全局子程序和函数是否可用。

FortranCInterface_MODULE_FOUND

布尔值,指示模块子程序和函数(通过 MODULE PROCEDURE 声明)是否可用。

输入变量

此模块还提供以下变量来指定检测到的混淆,尽管典型用例不需要引用它们,而可以使用下面的 命令

FortranCInterface_GLOBAL_PREFIX

没有下划线的全局符号的前缀。

FortranCInterface_GLOBAL_SUFFIX

没有下划线的全局符号的后缀。

FortranCInterface_GLOBAL_CASE

没有下划线的全局符号的大小写,可以是 UPPERLOWER

FortranCInterface_GLOBAL__PREFIX

带下划线的全局符号的前缀。

FortranCInterface_GLOBAL__SUFFIX

带下划线的全局符号的后缀。

FortranCInterface_GLOBAL__CASE

带下划线的全局符号的大小写,可以是 UPPERLOWER

FortranCInterface_MODULE_PREFIX

没有下划线的模块符号的前缀。

FortranCInterface_MODULE_MIDDLE

没有下划线的模块符号的中间部分,出现在模块名和符号名之间。

FortranCInterface_MODULE_SUFFIX

没有下划线的模块符号的后缀。

FortranCInterface_MODULE_CASE

没有下划线的模块符号的大小写,可以是 UPPERLOWER

FortranCInterface_MODULE_ORDER

在 4.1 版本中新增。

没有下划线的模块符号的组件顺序

MODULE_THEN_SYMBOL

模块名出现在符号名前,即 <PREFIX><module><MIDDLE><symbol><SUFFIX>

SYMBOL_THEN_MODULE

模块名出现在符号名后,即 <PREFIX><symbol><MIDDLE><module><SUFFIX>

FortranCInterface_MODULE__PREFIX

带下划线的模块符号的前缀。

FortranCInterface_MODULE__MIDDLE

带下划线的模块符号的中间部分,出现在模块名和符号名之间。

FortranCInterface_MODULE__SUFFIX

带下划线的模块符号的后缀。

FortranCInterface_MODULE__CASE

带下划线的模块符号的大小写,可以是 UPPERLOWER

FortranCInterface_MODULE__ORDER

在 4.1 版本中新增。

带下划线的模块符号的组件顺序

MODULE_THEN_SYMBOL

模块名出现在符号名前,即 <PREFIX><module><MIDDLE><symbol><SUFFIX>

SYMBOL_THEN_MODULE

模块名出现在符号名后,即 <PREFIX><symbol><MIDDLE><module><SUFFIX>

附加混淆的变量

此模块了解许多 Fortran 编译器的可能 GLOBALMODULE 混淆,但它还提供了一个接口来指定新的可能的混淆。可以在包含此模块之前设置以下变量以指定附加混淆

FortranCInterface_GLOBAL_SYMBOLS

FortranCInterface_MODULE_SYMBOLS

在包含此模块之前,用于指定符号 MySubMy_SubMyModule:MySubMy_Module:My_Sub 的混淆。

命令

本模块提供以下命令

FortranCInterface_HEADER

生成一个 C 头文件,其中包含用于混淆符号名称的宏

FortranCInterface_HEADER(
  <file>
  [MACRO_NAMESPACE <macro-ns>]
  [SYMBOL_NAMESPACE <ns>]
  [SYMBOLS [<module>:]<function> ...]
)

此命令生成一个 <file>,其中包含以下宏的定义

#define FortranCInterface_GLOBAL (name,NAME) ...
#define FortranCInterface_GLOBAL_(name,NAME) ...
#define FortranCInterface_MODULE (mod,name, MOD,NAME) ...
#define FortranCInterface_MODULE_(mod,name, MOD,NAME) ...

这些宏分别混淆四类 Fortran 符号

  • 没有 '_' 的全局符号: call mysub()

  • 带 '_' 的全局符号: call my_sub()

  • 没有 '_' 的模块符号: use mymod; call mysub()

  • 带 '_' 的模块符号: use mymod; call my_sub()

如果某个类别的混淆未知,则其宏将保持未定义状态。所有宏都需要原始名称,并且区分大小写。

选项包括

MACRO_NAMESPACE

将默认的 FortranCInterface_ 前缀替换为给定的命名空间 <macro-ns>

SYMBOL_NAMESPACE

使用给定的命名空间 <ns>SYMBOLS 选项生成的所有预处理器定义添加前缀。

SYMBOLS

列出要自动使用 C 预处理器定义混淆的符号

<function>          ==> #define <ns><function> ...
<module>:<function> ==> #define <ns><module>_<function> ...

如果某些符号的混淆未知,则不会创建预处理器定义,并会显示警告。

FortranCInterface_VERIFY

验证 Fortran 和 C/C++ 编译器是否协同工作

FortranCInterface_VERIFY([CXX] [QUIET])

此命令测试使用 Fortran 和 C(以及 C++,如果提供了 CXX 选项)的简单测试可执行文件是否能成功编译和链接。结果将作为布尔值存储在缓存条目 FortranCInterface_VERIFIED_C(如果提供了 CXX,则为 FortranCInterface_VERIFIED_CXX)中。如果检查失败且未提供 QUIET 选项,则命令将以描述问题的致命错误消息终止。此检查的目的是在编译器组合不兼容时尽早停止构建。测试将在 Release 配置中构建。

示例

示例:基本用法

以下示例创建一个 FC.h 头文件,该文件定义了混淆宏 FC_GLOBAL()FC_GLOBAL_()FC_MODULE()FC_MODULE_()

include(FortranCInterface)
FortranCInterface_HEADER(FC.h MACRO_NAMESPACE "FC_")

下一个示例创建一个 FCMangle.h 头文件,该文件定义了与上一个示例相同的 FC_*() 混淆宏,此外还有预处理器符号 FC_mysubFC_mymod_my_sub

include(FortranCInterface)
FortranCInterface_HEADER(
  FCMangle.h
  MACRO_NAMESPACE "FC_"
  SYMBOL_NAMESPACE "FC_"
  SYMBOLS mysub mymod:my_sub
)

示例:附加混淆

以下示例演示了如何指定符号 MySubMy_SubMyModule:MySubMy_Module:My_Sub 的混淆。以下代码告诉此模块尝试给定的 GLOBALMODULE 混淆。(为清晰起见,在此示例中,插入符号 ^ 指向原始符号名称,但它们不是必需的。)

set(FortranCInterface_GLOBAL_SYMBOLS mysub_ my_sub__ MYSUB_)
  #                                  ^^^^^  ^^^^^^   ^^^^^
set(FortranCInterface_MODULE_SYMBOLS
    __mymodule_MOD_mysub __my_module_MOD_my_sub)
  #   ^^^^^^^^     ^^^^^   ^^^^^^^^^     ^^^^^^

include(FortranCInterface)

# ...