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属性设置)将传递给Python和CSharp包装器库。在 3.21 版本中已更改: 当策略
CMP0122设置为NEW时,生成的库将使用CSharp语言的标准命名约定。否则,将应用旧行为。注意
对于多配置生成器,此模块不支持
SWIG生成的特定于配置的文件。所有构建配置都必须产生相同的文件。注意
对于 Makefile 生成器,如果对于某些源,
USE_SWIG_DEPENDENCIES属性为FALSE,则swig_add_library不会跟踪文件依赖关系,因此需要依赖<name>_swig_compilation自定义目标来生成swig生成的文件。其他生成器可能依赖于 SWIG 生成的源文件。类型SHARED、MODULE和STATIC与add_library()命令具有相同的语义。如果指定了USE_BUILD_SHARED_LIBS,则库类型将是STATIC或SHARED,具体取决于BUILD_SHARED_LIBS变量的当前值是否为ON。如果未指定类型,将使用MODULE。语言指定目标语言。
在 3.1 版本中已添加: Go 和 Lua 语言支持。
在 3.2 版本中已添加: R 语言支持。
在 3.18 版本中已添加: Fortran 语言支持。
NO_PROXY3.12 版本新增。
阻止生成包装器层(swig
-noproxy选项)。DEBUG_POSTFIX版本 4.2 中添加。
管理
DEBUG_POSTFIX目标属性。目前,仅对python语言有意义。如果定义了
DEBUG_CONFIGURATIONS全局属性,则为每个调试配置定义<CONFIG>_POSTFIX目标属性。OUTPUT_DIR3.12 版本新增。
指定将语言相关文件写入何处(swig
-outdir选项)。如果未给出,将使用CMAKE_SWIG_OUTDIR变量。如果两者均未指定,则默认行为如下:如果
UseSWIG_MODULE_VERSION为 1 或未定义,输出将写入CMAKE_CURRENT_BINARY_DIR目录。如果
UseSWIG_MODULE_VERSION为 2,将使用专用目录。此目录的路径可从SWIG_SUPPORT_FILES_DIRECTORY目标属性中检索。
OUTFILE_DIR3.12 版本新增。
指定一个输出目录名,生成的文件将放置在该目录中(swig
-o选项)。如果未指定,将使用SWIG_OUTFILE_DIR变量。如果两者均未指定,则改用OUTPUT_DIR或CMAKE_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_DIRECTORIES、COMPILE_DEFINITIONS和COMPILE_OPTIONS3.12 版本新增。
向 SWIG 编译器添加自定义标志,其语义与属性
INCLUDE_DIRECTORIES、COMPILE_DEFINITIONS和COMPILE_OPTIONS相同。USE_TARGET_INCLUDE_DIRECTORIES3.13 版本新增。
如果设置为
TRUE,则目标属性INCLUDE_DIRECTORIES的内容将被转发给SWIG编译器。如果设置为FALSE,则目标属性INCLUDE_DIRECTORIES将被忽略。如果未设置,将考虑目标属性SWIG_USE_TARGET_INCLUDE_DIRECTORIES。GENERATED_INCLUDE_DIRECTORIES、GENERATED_COMPILE_DEFINITIONS和GENERATED_COMPILE_OPTIONS3.12 版本新增。
向 C/C++ 生成的源文件添加自定义标志。它们将分别填充已生成 C/C++ 文件的属性
INCLUDE_DIRECTORIES、COMPILE_DEFINITIONS和COMPILE_OPTIONS。DEPENDS3.12 版本新增。
为源文件指定其他依赖项。
USE_SWIG_DEPENDENCIES在 3.20 版本中添加。
如果设置为
TRUE,则隐式依赖由swig工具本身生成。此属性仅对 Makefile、Ninja、Xcode和 Visual 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_DIR3.19 版本新增。
为考虑的源文件指定将语言相关文件写入何处(swig
-outdir选项)。如果未指定,则应用其他定义输出目录的方式(请参阅swig_add_library()命令的OUTPUT_DIR选项)。OUTFILE_DIR3.19 版本新增。
为考虑的源文件指定一个输出目录,生成的文件将放置在该目录中(swig
-o选项)。如果未指定,将使用OUTPUT_DIR源属性。如果两者均未指定,则应用其他定义输出文件目录的方式(请参阅swig_add_library()命令的OUTFILE_DIR选项)。
目标属性¶
目标库属性可以设置为对所有 SWIG 输入文件应用相同的配置。
SWIG_INCLUDE_DIRECTORIES、SWIG_COMPILE_DEFINITIONS和SWIG_COMPILE_OPTIONS3.12 版本新增。
这些属性将应用于所有 SWIG 输入文件,其语义与目标属性
INCLUDE_DIRECTORIES、COMPILE_DEFINITIONS和COMPILE_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_DIRECTORIES3.13 版本新增。
如果设置为
TRUE,则目标属性INCLUDE_DIRECTORIES的内容将被转发给SWIG编译器。如果设置为FALSE或未定义,则目标属性INCLUDE_DIRECTORIES将被忽略。可以通过指定源属性USE_TARGET_INCLUDE_DIRECTORIES来覆盖此行为。SWIG_GENERATED_INCLUDE_DIRECTORIES、SWIG_GENERATED_COMPILE_DEFINITIONS和SWIG_GENERATED_COMPILE_OPTIONS3.12 版本新增。
这些属性将分别填充所有生成的 C/C++ 文件的属性
INCLUDE_DIRECTORIES、COMPILE_DEFINITIONS和COMPILE_FLAGS。SWIG_DEPENDS3.12 版本新增。
为所有 SWIG 输入文件添加依赖项。
只读目标属性¶
以下目标属性是输出属性,可用于获取有关 SWIG 接口编译期间生成的支持文件的信息。
SWIG_SUPPORT_FILES3.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_DIRECTORY3.12 版本新增。
此输出属性指定支持文件将被生成到的目录。
注意
当源属性
OUTPUT_DIR被定义时,可以在SWIG_SUPPORT_FILES_DIRECTORY中指定多个目录。
CMake 变量¶
可以设置一些变量来定制 swig_add_library 和 SWIG 的行为。
UseSWIG_MODULE_VERSION3.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_EXTENSIONS3.14 版新增。
指定源文件扩展名列表,以覆盖将仅
.i文件视为SWIG工具源文件的默认行为。例如:set(SWIG_SOURCE_FILE_EXTENSIONS ".i" ".swg")
SWIG_USE_SWIG_DEPENDENCIES在 3.20 版本中添加。
如果设置为
TRUE,则隐式依赖由swig工具本身生成。此变量仅对 Makefile、Ninja、Xcode和 Visual Studio 生成器有意义。默认值为FALSE。源文件属性
USE_SWIG_DEPENDENCIES,如果未定义,将用此变量的值进行初始化。在 3.21 版本中已添加: 添加了对
Xcode生成器的支持。在 3.22 版本中已添加: 添加了对 Visual Studio 生成器 的支持。
已弃用命令¶
- swig_link_libraries¶
已弃用,版本 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} ...)而不是此命令。