使用SWIG¶
此文件提供对 SWIG 的支持。假设 FindSWIG 模块已经加载。
命令¶
以下命令被定义为与 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()命令创建的目标具有相同的功能,因此这些目标可以与任何需要目标的命令一起使用(例如:command:target_link_libraries)。在 3.13 版本发生变更: 当策略
CMP0078设置为NEW时,此命令创建一个具有指定<name>的目标。否则,遗留行为将选择不同的目标名称并将其存储在SWIG_MODULE_<name>_REAL_NAME变量中。在 3.15 版本发生变更: 备用库名称(例如,使用
OUTPUT_NAME属性设置)将传递给Python和CSharp包装器库。在 3.21 版本发生变更: 当策略:policy: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_PROXY在 3.12 版本加入.
防止生成包装层(swig
-noproxy选项)。输出目录在 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_DIR或CMAKE_SWIG_OUTDIR代替。来源库的源列表。扩展名为“.i”的文件将被识别为“SWIG”工具的来源。其他文件将以标准方式处理。
在 3.14 版本加入: 可以通过指定变量“SWIG_SOURCE_FILE_EXTENSIONS”来覆盖此行为。
备注
如果
UseSWIG_MODULE_VERSION设置为 2,则**强烈**建议在指定OUTPUT_DIR选项或CMAKE_SWIG_OUTDIR变量时使用目标唯一的专用目录。输出目录内容作为目标构建的一部分被删除,因此为了防止目标之间的干扰或丢失其他重要文件,每个目标都应该有自己的专用输出目录。
源文件的属性¶
模块文件的源文件属性**必须**在调用 swig_add_library 命令之前设置,以指定 SWIG 的特殊行为并确保生成的文件将接收所需的设置。
CPLUS在 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_OPTIONS在 3.12 版本加入.
向 SWIG 编译器添加自定义标志,并与属性 INCLUDE_DIRECTORIES、COMPILE_DEFINITIONS 和 COMPILE_OPTIONS 具有相同的语义。
USE_TARGET_INCLUDE_DIRECTORIES在 3.13 版本加入.
如果设置为 TRUE,目标属性 :prop_tgt:INCLUDE_DIRECTORIES 的内容将被转发到 SWIG 编译器。如果设置为
FALSE目标属性INCLUDE_DIRECTORIES将被忽略。如果未设置,将考虑目标属性“SWIG_USE_TARGET_INCLUDE_DIRECTORIES”。GENERATED_INCLUDE_DIRECTORIES、GENERATED_COMPILE_DEFINITIONS和GENERATED_COMPILE_OPTIONS在 3.12 版本加入.
将自定义标志添加到 C/C++ 生成的源代码。它们将分别填充生成的 C/C++ 文件的属性
INCLUDE_DIRECTORIES、COMPILE_DEFINITIONS和COMPILE_OPTIONS。取决于在 3.12 版本加入.
指定对源文件的附加依赖项。
USE_SWIG_DEPENDENCIES在 3.20 版本加入.
如果设置为“TRUE”,则隐式依赖项由“swig”工具本身生成。此属性仅对 Makefile、 Ninja、
Xcode和 Visual Studio 有意义(Visual Studio 11 2012及以上)生成器。默认值为“假”。在 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编译器。输出目录在 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_DIRECTORIES、SWIG_COMPILE_DEFINITIONS和SWIG_COMPILE_OPTIONS在 3.12 版本加入.
这些属性将应用于所有 SWIG 输入文件,并与目标属性具有相同的语义:prop_tgt: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_DIRECTORIES在 3.13 版本加入.
如果设置为 TRUE,目标属性 :prop_tgt:INCLUDE_DIRECTORIES 的内容将被转发到 SWIG 编译器。如果设置为``FALSE`` 或未定义,目标属性
INCLUDE_DIRECTORIES将被忽略。可以通过指定源属性“USE_TARGET_INCLUDE_DIRECTORIES”来覆盖此行为。SWIG_GENERATED_INCLUDE_DIRECTORIES、SWIG_GENERATED_COMPILE_DEFINITIONS和SWIG_GENERATED_COMPILE_OPTIONS在 3.12 版本加入.
这些属性将分别填充所有生成的 C/C++ 文件的属性:prop_sf:INCLUDE_DIRECTORIES、
COMPILE_DEFINITIONS和COMPILE_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 的行为:
使用 SWIG_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”工具本身生成。此变量仅对 Makefile、 Ninja、
Xcode和 Visual Studio 有意义(Visual Studio 11 2012及以上)生成器。默认值为“假”。源文件属性“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()而不是这个命令。对于遗留行为(当:policy:CMP0078 设置为``OLD`` 并且``UseSWIG_TARGET_NAME_PREFERENCE`` 变量设置为``"LEGACY"
,或者在 3.12 之前的 CMake 版本中),它是最好使用``target_link_libraries(${SWIG_MODULE_<name>_REAL_NAME} ...)而不是这个命令。