Swig -includeall except...
Swig -includeall except...
我有一个大型项目,其中使用swig -includeAll标志似乎很有意义。但是,我不希望扩展某些文件,主要是STL库(例如向量和列表)。是否可以使用-includeAll标志,但可以将某些文件列入扩展(例如向量和列表)?
来自有关SWIG预处理器的文档:
swig完全支持#if,#ifdef,#ifndef,#else,#endif的使用,以有条件地包括接口的一部分。当swig解析接口时,以下符号是由swig预定的:
swig-始终定义swig正在处理文件
这样您就可以写下这样的东西:
#ifndef SWIG
#include <string>
#include <vector>
#endif // !SWIG
和swig会在-includeall通过时忽略它。
我不是SWIG的专家,而是查看最新版本和源代码的文档(特别是读取命令行参数的Source/Modules/main.cxx
文件),是否清楚这种选项不存在(即使不是隐藏的选项)。
另一方面,如果您觉得可以很容易地修改源代码。
您可以在main.cxx
文件中添加新的命令行选项,以添加文件名以排除,然后比较此类名称以找到匹配项。您可以在Source/Preprocessor/preprocessor.h
文件中添加一个全局函数,该文件已包含在main.cxx
。
-includeall
选项的代码在Source/Preprocessor/cpp.c
中。在该文件中,当在命令行中设置模拟参数时,也有一个称为include_all
的全局变量,该变量设置为1
(它将指导您找到该选项的执行位置)。
现在,在Preprocessor_parse(...)
函数中,您可以找到分析标头文件的位置(从第1715行开始,版本为3.0.12):
s1 = cpp_include(fn, sysfile);
if (s1) {
/* ....... */
}
您将对String *Swig_last_file(void)
函数感兴趣,该功能将返回刚被解析的标题线的文件名。
s1 = cpp_include(fn, sysfile);
if (s1) {
int found = 0;
String* filename = Swig_last_file();
/* Here find for a match in the exclusion list */
if (!found) { /* keep working as usual */
/* ....... */
} /* if found, just ignore the include directive for that file */
Delete(s1);
}
我知道这不是一个完整的解决方案,但希望可以指导您获得所需的行为。