FortranCInterface

Fortran/C 介面偵測

此模組會自動偵測 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__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 修飾。(為清楚起見,在此範例中,插入符號指向原始符號名稱,但不需要。)