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 版本中已更改:当策略 CMP0078 设置为 NEW 时,此命令使用指定的 <name> 创建一个目标。否则,旧行为将选择一个不同的目标名称并将其存储在 SWIG_MODULE_<name>_REAL_NAME 变量中。

3.15 版本中已更改:替代库名称(例如通过 OUTPUT_NAME 属性设置)将传递给 PythonCSharp 封装库。

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

注意

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

注意

对于Makefile 生成器,如果某些源代码中 USE_SWIG_DEPENDENCIES 属性为 FALSEswig_add_library 将不会追踪文件依赖项,因此需要 <name>_swig_compilation 自定义目标,以确保需要 swig 生成的文件存在。其他生成器可能依赖于 SWIG 生成的源文件。

类型

SHAREDMODULESTATIC 的语义与 add_library() 命令的语义相同。如果指定了 USE_BUILD_SHARED_LIBS,那么库类型将根据变量 BUILD_SHARED_LIBS 的当前值(ON)确定是 STATIC 还是 SHARED。如果未指定类型,将使用 MODULE

语言

指定目标语言。

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 版中更改: 如果策略 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",或者在 3.12 以前的 CMake 版本),最好使用 target_link_libraries(${SWIG_MODULE_<name>_REAL_NAME} ...) 来代替此命令。