FortranCInterface

Fortran/C 介面偵測

此模組自動偵測 C 和 Fortran 語言互動的 API。

模組變數

指示是否找到名稱修飾的變數

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__PREFIX

帶底線的模組符號的前綴。

FortranCInterface_MODULE__MIDDLE

帶底線的模組符號的中間部分,出現在模組名稱和符號名稱之間。

FortranCInterface_MODULE__SUFFIX

帶底線的模組符號的後綴。

FortranCInterface_MODULE__CASE

帶底線的模組符號的大小寫,可以是 UPPERLOWER

模組函式

FortranCInterface_HEADER

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>

SYMBOLS

列出要使用 C 預處理器定義自動修飾的符號

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

如果不知道某些符號的名稱修飾,則不會建立預處理器定義,並顯示警告。

SYMBOL_NAMESPACE

以給定的命名空間 <ns> 作為 SYMBOLS 選項產生的所有預處理器定義的前綴。

FortranCInterface_VERIFY

FortranCInterface_VERIFY 函式用於驗證 Fortran 和 C/C++ 編譯器是否協同工作

FortranCInterface_VERIFY([CXX] [QUIET])

它測試一個使用 Fortran 和 C (以及在給定 CXX 選項時使用 C++) 的簡單測試可執行檔是否成功編譯和連結。結果以布林值形式儲存在快取條目 FortranCInterface_VERIFIED_C (或給定 CXX 時為 FortranCInterface_VERIFIED_CXX) 中。如果檢查失敗且未給定 QUIET,則函式終止並顯示描述問題的嚴重錯誤訊息。此檢查的目的是為了在編譯器組合不相容時及早停止建置。測試在 Release 組態中建置。

範例用法

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

這會建立一個 "FC.h" 標頭檔,其中定義了名稱修飾巨集 FC_GLOBAL()FC_GLOBAL_()FC_MODULE()FC_MODULE_()

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

這會建立一個 "FCMangle.h" 標頭檔,其中定義了與前一個範例相同的 FC_*() 名稱修飾巨集,以及預處理器符號 FC_mysubFC_mymod_my_sub

其他名稱修飾

FortranCInterface 知道許多 Fortran 編譯器的可能 GLOBALMODULE 名稱修飾,但它也提供了一個介面來指定新的可能名稱修飾。在包含 FortranCInterface 之前設定變數

FortranCInterface_GLOBAL_SYMBOLS
FortranCInterface_MODULE_SYMBOLS

以指定符號 MySubMy_SubMyModule:MySubMy_Module:My_Sub 的名稱修飾。例如,以下程式碼

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

告訴 FortranCInterface 嘗試給定的 GLOBALMODULE 名稱修飾。(插入符號在此範例中指向原始符號名稱以求清晰,但並非必要。)