I have a large project where using the Swig -includeall flag seems to make sense. However, there are certain files I would not like expanded, primarily the STL libraries (e.g. vector and list). Is it possible to use the -includeall flag, but to blacklist certain files from expansion (like vector and list)?
From the Docs about the SWIG Preprocessor:
SWIG fully supports the use of #if, #ifdef, #ifndef, #else, #endif to conditionally include parts of an interface. The following symbols are predefined by SWIG when it is parsing the interface:
SWIG - Always defined when SWIG is processing a file
So you can write something like this:
#ifndef SWIG
#include <string>
#include <vector>
#endif // !SWIG
and SWIG will ignore it during the -includeall pass.
I'm not an expert in SWIG but taking a look at both documentation for latest version and source code (specifically to the Source/Modules/main.cxx file, where command line arguments are read), is it clear that such option doesn't exist (even not a hidden one).
On the other hand, if you feel like you can modify the source code quite easily to do so.
You can add a new command line option in the main.cxx file to add filenames to exclude and then compare such names to find a match. You can add a global function in the Source/Preprocessor/preprocessor.h file, which is already included by main.cxx.
The code for the -includeall option is in Source/Preprocessor/cpp.c. In that file there is also a global variable called include_all that is set to 1 when the analog argument is set in the command line (it will guide you to find where such option is executed too).
Now, in the Preprocessor_parse(...) function you can find where the header files are parsed (starting at line 1715 for version 3.0.12):
s1 = cpp_include(fn, sysfile);
if (s1) {
  /* ....... */
}
You will be interested in the String *Swig_last_file(void) function, that will return the filename of the header line just parsed.
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);
}
I know it is not a full solution but hope can guide you to get the desired behavior.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With