UseSWIG

此檔案提供 SWIG 的支援。假設 FindSWIG 模組已載入。

CMake 命令

定義以下命令以用於 SWIG

swig_add_library

在版本 3.8 中新增。

使用給定的名稱和指定的語言定義 swig 模組

swig_add_library(<name>
                 [TYPE <SHARED|MODULE|STATIC|USE_BUILD_SHARED_LIBS>]
                 LANGUAGE <language>
                 [NO_PROXY]
                 [OUTPUT_DIR <directory>]
                 [OUTFILE_DIR <directory>]
                 SOURCES <file>...
                )

使用 swig_add_library 命令建立的目標具有與使用 add_library() 命令建立的目標相同的功能,因此這些目標可以與任何期望目標的命令一起使用(例如 target_link_libraries())。

在版本 3.13 中變更:當 policy CMP0078 設定為 NEW 時,此命令會使用指定的 <name> 建立目標。否則,舊版行為將選擇不同的目標名稱並將其儲存在 SWIG_MODULE_<name>_REAL_NAME 變數中。

在版本 3.15 中變更:替代的函式庫名稱(例如,使用 OUTPUT_NAME 屬性設定)將傳遞給 PythonCSharp 包裝函式庫。

在版本 3.21 中變更:當 policy CMP0122 設定為 NEW 時,產生的函式庫會使用 CSharp 語言的標準命名慣例。否則,將套用舊版行為。

注意

對於多組態產生器,此模組不支援 SWIG 產生的組態特定檔案。所有建置組態都必須產生相同的原始碼檔案。

注意

對於 Makefile 產生器,如果對於某些來源,USE_SWIG_DEPENDENCIES 屬性為 FALSE,則 swig_add_library 不會追蹤檔案相依性,因此對於需要 swig 產生的檔案存在的目標,需要依賴 <name>_swig_compilation 自訂目標。其他產生器可能依賴 SWIG 將產生的來源檔案。

TYPE

SHAREDMODULESTATICadd_library() 命令具有相同的語意。如果指定 USE_BUILD_SHARED_LIBS,則函式庫類型將為 STATICSHARED,具體取決於 BUILD_SHARED_LIBS 變數的目前值是否為 ON。如果未指定類型,則將使用 MODULE

LANGUAGE

指定目標語言。

在版本 3.1 中新增:Go 和 Lua 語言支援。

在版本 3.2 中新增:R 語言支援。

在版本 3.18 中新增:Fortran 語言支援。

NO_PROXY

在版本 3.12 中新增。

防止產生包裝函式層(swig -noproxy 選項)。

OUTPUT_DIR

在版本 3.12 中新增。

指定寫入語言特定檔案的位置(swig -outdir 選項)。如果未給定,將使用 CMAKE_SWIG_OUTDIR 變數。如果兩者都未指定,則預設值取決於 UseSWIG_MODULE_VERSION 變數的值,如下所示

  • 如果 UseSWIG_MODULE_VERSION 為 1 或未定義,則輸出會寫入 CMAKE_CURRENT_BINARY_DIR 目錄。

  • 如果 UseSWIG_MODULE_VERSION 為 2,則將使用專用目錄。此目錄的路徑可以從 SWIG_SUPPORT_FILES_DIRECTORY 目標屬性中檢索。

OUTFILE_DIR

在版本 3.12 中新增。

指定將放置產生來源檔案的輸出目錄名稱(swig -o 選項)。如果未指定,將使用 SWIG_OUTFILE_DIR 變數。如果兩者都未指定,則改為使用 OUTPUT_DIRCMAKE_SWIG_OUTDIR

SOURCES

函式庫的來源清單。副檔名為 .i 的檔案將被識別為 SWIG 工具的來源。其他檔案將以標準方式處理。

在版本 3.14 中新增:此行為可以透過指定變數 SWIG_SOURCE_FILE_EXTENSIONS 來覆寫。

注意

如果 UseSWIG_MODULE_VERSION 設定為 2,則強烈建議在指定 OUTPUT_DIR 選項或 CMAKE_SWIG_OUTDIR 變數時,使用目標唯一的專用目錄。輸出目錄內容會在目標建置過程中清除,因此為了防止目標之間的干擾或遺失其他重要檔案,每個目標都應具有自己的專用輸出目錄。

來源檔案的屬性

模組檔案上的來源檔案屬性必須在呼叫 swig_add_library 命令之前設定,以指定 SWIG 的特殊行為,並確保產生的檔案將接收所需的設定。

CPLUSPLUS

在 c++ 模式下呼叫 SWIG。例如

set_property(SOURCE mymod.i PROPERTY CPLUSPLUS ON)
swig_add_library(mymod LANGUAGE python SOURCES mymod.i)
SWIG_FLAGS

在版本 3.12 中已棄用:已替換為後續的細粒度屬性。

將自訂旗標傳遞給 SWIG 可執行檔。

INCLUDE_DIRECTORIESCOMPILE_DEFINITIONSCOMPILE_OPTIONS

在版本 3.12 中新增。

將自訂旗標新增至 SWIG 編譯器,並具有與屬性 INCLUDE_DIRECTORIESCOMPILE_DEFINITIONSCOMPILE_OPTIONS 相同的語意。

USE_TARGET_INCLUDE_DIRECTORIES

在版本 3.13 中新增。

如果設定為 TRUE,則目標屬性 INCLUDE_DIRECTORIES 的內容將轉發到 SWIG 編譯器。如果設定為 FALSE,則目標屬性 INCLUDE_DIRECTORIES 將被忽略。如果未設定,將考慮目標屬性 SWIG_USE_TARGET_INCLUDE_DIRECTORIES

GENERATED_INCLUDE_DIRECTORIESGENERATED_COMPILE_DEFINITIONSGENERATED_COMPILE_OPTIONS

在版本 3.12 中新增。

將自訂旗標新增至產生的 C/C++ 原始碼。它們將分別填入屬性 INCLUDE_DIRECTORIESCOMPILE_DEFINITIONSCOMPILE_OPTIONS 的產生的 C/C++ 檔案。

DEPENDS

在版本 3.12 中新增。

指定來源檔案的其他相依性。

USE_SWIG_DEPENDENCIES

在版本 3.20 中新增。

如果設定為 TRUE,則隱含相依性由 swig 工具本身產生。此屬性僅對 MakefileNinjaXcodeVisual Studio 產生器有意義。預設值為 FALSE

在版本 3.21 中新增:新增了 Xcode 產生器的支援。

在版本 3.22 中新增:新增了 Visual Studio 產生器 的支援。

SWIG_MODULE_NAME

指定目標語言中模組的實際匯入名稱。如果無法從來源自動掃描或與模組檔案基本名稱不同,則這是必需的。例如

set_property(SOURCE mymod.i PROPERTY SWIG_MODULE_NAME mymod_realname)

在版本 3.14 中變更:如果 policy CMP0086 設定為 NEW,則 -module <module_name> 會傳遞到 SWIG 編譯器。

OUTPUT_DIR

在版本 3.19 中新增。

指定寫入考量來源檔案的語言特定檔案的位置(swig -outdir 選項)。如果未指定,則適用定義輸出目錄的其他方式(請參閱 swig_add_library() 命令的 OUTPUT_DIR 選項)。

OUTFILE_DIR

在版本 3.19 中新增。

指定放置考量來源檔案的產生來源檔案的輸出目錄(swig -o 選項)。如果未指定,將使用 OUTPUT_DIR 來源屬性。如果兩者都未指定,則適用定義輸出檔案目錄的其他方式(請參閱 swig_add_library() 命令的 OUTFILE_DIR 選項)。

目標的屬性

可以設定目標函式庫屬性,以將相同的組態套用於所有 SWIG 輸入檔案。

SWIG_INCLUDE_DIRECTORIESSWIG_COMPILE_DEFINITIONSSWIG_COMPILE_OPTIONS

在版本 3.12 中新增。

這些屬性將套用於所有 SWIG 輸入檔案,並具有與目標屬性 INCLUDE_DIRECTORIESCOMPILE_DEFINITIONSCOMPILE_OPTIONS 相同的語意。

set (UseSWIG_TARGET_NAME_PREFERENCE STANDARD)
swig_add_library(mymod LANGUAGE python SOURCES mymod.i)
set_property(TARGET mymod PROPERTY SWIG_COMPILE_DEFINITIONS MY_DEF1 MY_DEF2)
set_property(TARGET mymod PROPERTY SWIG_COMPILE_OPTIONS -bla -blb)
SWIG_USE_TARGET_INCLUDE_DIRECTORIES

在版本 3.13 中新增。

如果設定為 TRUE,則目標屬性 INCLUDE_DIRECTORIES 的內容將轉發到 SWIG 編譯器。如果設定為 FALSE 或未定義,則目標屬性 INCLUDE_DIRECTORIES 將被忽略。此行為可以透過指定來源屬性 USE_TARGET_INCLUDE_DIRECTORIES 來覆寫。

SWIG_GENERATED_INCLUDE_DIRECTORIESSWIG_GENERATED_COMPILE_DEFINITIONSSWIG_GENERATED_COMPILE_OPTIONS

在版本 3.12 中新增。

這些屬性將分別填入所有產生的 C/C++ 檔案的屬性 INCLUDE_DIRECTORIESCOMPILE_DEFINITIONSCOMPILE_FLAGS

SWIG_DEPENDS

在版本 3.12 中新增。

將相依性新增至所有 SWIG 輸入檔案。

唯讀目標屬性

以下目標屬性是輸出屬性,可用於取得有關 SWIG 介面編譯產生的支援檔案的資訊。

SWIG_SUPPORT_FILES

在版本 3.12 中新增。

此輸出屬性列出了 SWIG 編譯期間產生的包裝函式檔案。

set (UseSWIG_TARGET_NAME_PREFERENCE STANDARD)
swig_add_library(mymod LANGUAGE python SOURCES mymod.i)
get_property(support_files TARGET mymod PROPERTY SWIG_SUPPORT_FILES)

注意

僅列出最主要的支援檔案。如果使用 SWIG 的某些進階功能(例如 %template),則可能未列出相關聯的支援檔案。建議使用 SWIG_SUPPORT_FILES_DIRECTORY 屬性來處理支援檔案。

SWIG_SUPPORT_FILES_DIRECTORY

在版本 3.12 中新增。

此輸出屬性指定將產生支援檔案的目錄。

注意

當來源屬性 OUTPUT_DIR 定義時,可以將多個目錄指定為 SWIG_SUPPORT_FILES_DIRECTORY 的一部分。

CMake 變數

可以設定某些變數來自訂 swig_add_library 以及 SWIG 的行為

UseSWIG_MODULE_VERSION

在版本 3.12 中新增。

指定 UseSWIG 模組的不同行為。

  • 設定為 1 或未定義:套用舊版行為。

  • 設定為 2:對於支援檔案套用新的策略:支援檔案的輸出目錄在 SWIG 介面編譯之前清除。

CMAKE_SWIG_FLAGS

將旗標新增至所有 swig 呼叫。

CMAKE_SWIG_OUTDIR

指定寫入語言特定檔案的位置(swig -outdir 選項)。

SWIG_OUTFILE_DIR

在版本 3.8 中新增。

指定將放置產生來源檔案的輸出目錄名稱。如果未指定,則使用 CMAKE_SWIG_OUTDIR

SWIG_MODULE_<name>_EXTRA_DEPS

指定為 <name> 產生的模組的其他相依性。

SWIG_SOURCE_FILE_EXTENSIONS

在版本 3.14 中新增。

指定來源檔案副檔名清單,以覆寫僅將 .i 檔案視為 SWIG 工具來源的預設行為。例如

set(SWIG_SOURCE_FILE_EXTENSIONS ".i" ".swg")
SWIG_USE_SWIG_DEPENDENCIES

在版本 3.20 中新增。

如果設定為 TRUE,則隱含相依性由 swig 工具本身產生。此變數僅對 MakefileNinjaXcodeVisual Studio 產生器有意義。預設值為 FALSE

來源檔案屬性 USE_SWIG_DEPENDENCIES (如果未定義)將使用此變數的值初始化。

在版本 3.21 中新增:新增了 Xcode 產生器的支援。

在版本 3.22 中新增:新增了 Visual Studio 產生器 的支援。

已棄用的命令

在版本 3.13 中已棄用:target_link_libraries() 與標準目標名稱一起使用,或將 ${SWIG_MODULE_<name>_REAL_NAME} 用於舊版目標命名。

將函式庫連結到 swig 模組

swig_link_libraries(<name> <item>...)

此命令具有與 target_link_libraries() 命令相同的功能。

注意

當 policy CMP0078 設定為 NEW 時,swig_add_library() 會使用指定的 <name> 建立標準目標,並且必須使用 target_link_libraries() 而不是此命令。

使用舊版行為(當 CMP0078 設定為 OLDUseSWIG_TARGET_NAME_PREFERENCE 變數設定為 "LEGACY",或在 3.12 之前的 CMake 版本中),最好使用 target_link_libraries(${SWIG_MODULE_<name>_REAL_NAME} ...) 而不是此命令。