Swig -includeall except...

Swig -includeall except...

本文关键字:except -includeall Swig      更新时间:2023-10-16

我有一个大型项目,其中使用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);
}

我知道这不是一个完整的解决方案,但希望可以指导您获得所需的行为。