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没有下划线的全局符号的大小写,可以是
UPPER或LOWER。FortranCInterface_GLOBAL__PREFIX带下划线的全局符号的前缀。
FortranCInterface_GLOBAL__SUFFIX带下划线的全局符号的后缀。
FortranCInterface_GLOBAL__CASE带下划线的全局符号的大小写,可以是
UPPER或LOWER。FortranCInterface_MODULE_PREFIX没有下划线的模块符号的前缀。
FortranCInterface_MODULE_MIDDLE没有下划线的模块符号的中间部分,出现在模块名和符号名之间。
FortranCInterface_MODULE_SUFFIX没有下划线的模块符号的后缀。
FortranCInterface_MODULE_CASE没有下划线的模块符号的大小写,可以是
UPPER或LOWER。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带下划线的模块符号的大小写,可以是
UPPER或LOWER。FortranCInterface_MODULE__ORDER在 4.1 版本中新增。
带下划线的模块符号的组件顺序
MODULE_THEN_SYMBOL模块名出现在符号名前,即
<PREFIX><module><MIDDLE><symbol><SUFFIX>。SYMBOL_THEN_MODULE模块名出现在符号名后,即
<PREFIX><symbol><MIDDLE><module><SUFFIX>。
附加混淆的变量¶
此模块了解许多 Fortran 编译器的可能 GLOBAL 和 MODULE 混淆,但它还提供了一个接口来指定新的可能的混淆。可以在包含此模块之前设置以下变量以指定附加混淆
FortranCInterface_GLOBAL_SYMBOLS
FortranCInterface_MODULE_SYMBOLS
在包含此模块之前,用于指定符号 MySub、My_Sub、MyModule:MySub 和 My_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_mysub 和 FC_mymod_my_sub
include(FortranCInterface)
FortranCInterface_HEADER(
FCMangle.h
MACRO_NAMESPACE "FC_"
SYMBOL_NAMESPACE "FC_"
SYMBOLS mysub mymod:my_sub
)
示例:附加混淆¶
以下示例演示了如何指定符号 MySub、My_Sub、MyModule:MySub 和 My_Module:My_Sub 的混淆。以下代码告诉此模块尝试给定的 GLOBAL 和 MODULE 混淆。(为清晰起见,在此示例中,插入符号 ^ 指向原始符号名称,但它们不是必需的。)
set(FortranCInterface_GLOBAL_SYMBOLS mysub_ my_sub__ MYSUB_)
# ^^^^^ ^^^^^^ ^^^^^
set(FortranCInterface_MODULE_SYMBOLS
__mymodule_MOD_mysub __my_module_MOD_my_sub)
# ^^^^^^^^ ^^^^^ ^^^^^^^^^ ^^^^^^
include(FortranCInterface)
# ...