UseSWIG

此模块提供对 SWIG 的支持。假设 FindSWIG 模块已加载。

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

include(UseSWIG)

CMake 命令

为与 SWIG 结合使用而定义的以下命令:

swig_add_library

版本 3.8 新增。

使用给定名称和指定语言定义 swig 模块

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

使用 swig_add_library 命令创建的目标与使用 add_library() 命令创建的目标具有相同的功能,因此这些目标可以与任何需要目标的命令一起使用(例如 target_link_libraries())。

在 3.13 版本中已更改: 当策略 CMP0078 设置为 NEW 时,此命令会创建具有指定 <name> 的目标。否则,旧行为将选择不同的目标名称并将其存储在 SWIG_MODULE_<name>_REAL_NAME 变量中。

在 3.15 版本中已更改: 备用库名称(例如,使用 OUTPUT_NAME 属性设置)将传递给 PythonCSharp 包装器库。

在 3.21 版本中已更改: 当策略 CMP0122 设置为 NEW 时,生成的库将使用 CSharp 语言的标准命名约定。否则,将应用旧行为。

注意

对于多配置生成器,此模块不支持 SWIG 生成的特定于配置的文件。所有构建配置都必须产生相同的文件。

注意

对于 Makefile 生成器,如果对于某些源,USE_SWIG_DEPENDENCIES 属性为 FALSE,则 swig_add_library 不会跟踪文件依赖关系,因此需要依赖 <name>_swig_compilation 自定义目标来生成 swig 生成的文件。其他生成器可能依赖于 SWIG 生成的源文件。

类型

SHAREDMODULESTATICadd_library() 命令具有相同的语义。如果指定了 USE_BUILD_SHARED_LIBS,则库类型将是 STATICSHARED,具体取决于 BUILD_SHARED_LIBS 变量的当前值是否为 ON。如果未指定类型,将使用 MODULE

语言

指定目标语言。

在 3.1 版本中已添加: Go 和 Lua 语言支持。

在 3.2 版本中已添加: R 语言支持。

在 3.18 版本中已添加: Fortran 语言支持。

NO_PROXY

3.12 版本新增。

阻止生成包装器层(swig -noproxy 选项)。

DEBUG_POSTFIX

版本 4.2 中添加。

管理 DEBUG_POSTFIX 目标属性。目前,仅对 python 语言有意义。

如果定义了 DEBUG_CONFIGURATIONS 全局属性,则为每个调试配置定义 <CONFIG>_POSTFIX 目标属性。

OUTPUT_DIR

3.12 版本新增。

指定将语言相关文件写入何处(swig -outdir 选项)。如果未给出,将使用 CMAKE_SWIG_OUTDIR 变量。如果两者均未指定,则默认行为如下:

  • 如果 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++ 生成的源文件添加自定义标志。它们将分别填充已生成 C/C++ 文件的属性 INCLUDE_DIRECTORIESCOMPILE_DEFINITIONSCOMPILE_OPTIONS

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 版本中已更改: 如果策略 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_librarySWIG 的行为。

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() 命令具有相同的功能。

注意

当策略 CMP0078 设置为 NEW 时,swig_add_library() 会创建具有指定 <name> 的标准目标,并且必须使用 target_link_libraries() 而不是此命令。

对于旧行为(当 CMP0078 设置为 OLD 并且 UseSWIG_TARGET_NAME_PREFERENCE 变量设置为 "LEGACY",或者在 CMake 版本早于 3.12 时),建议使用 target_link_libraries(${SWIG_MODULE_<name>_REAL_NAME} ...) 而不是此命令。