2017-09-20 2 views
5

Ich habe ein großes Projekt, wo die Verwendung der Swig-includeall Flag scheint sinnvoll zu sein. Es gibt jedoch bestimmte Dateien, die ich nicht erweitern möchte, hauptsächlich die STL-Bibliotheken (z. B. Vektor und Liste). Ist es möglich, das Flag-includeall zu verwenden, aber bestimmte Dateien aus der Erweiterung zu entfernen (wie Vektor und Liste)?Swig -includeall außer ...

Antwort

2

Ich bin kein Experte in SWIG, aber einen Blick auf documentation for latest version und Quellcode (speziell auf die Source/Modules/main.cxx Datei, wo Befehlszeilenargumente gelesen werden), ist klar, dass eine solche Option nicht existiert (auch nicht ein versteckter).

Auf der anderen Seite, wenn Sie das Gefühl haben, können Sie den Quellcode sehr leicht ändern, um dies zu tun.

Sie können in der Datei main.cxx eine neue Befehlszeilenoption hinzufügen, um auszuschließende Dateinamen hinzuzufügen und diese Namen dann zu vergleichen, um eine Übereinstimmung zu finden. Sie können eine globale Funktion in der Datei Source/Preprocessor/preprocessor.h hinzufügen, die bereits in main.cxx enthalten ist.

Der Code für die Option -includeall ist in Source/Preprocessor/cpp.c. In dieser Datei gibt es auch eine globale Variable mit dem Namen include_all, die auf 1 gesetzt wird, wenn das analoge Argument in der Befehlszeile gesetzt wird (es wird Sie führen, um zu finden, wo diese Option auch ausgeführt wird).

, jetzt in der Preprocessor_parse(...) Funktion können Sie feststellen, wo die Header-Dateien analysiert werden (in Zeile 1715 für Version 3.0.12 Start):

s1 = cpp_include(fn, sysfile); 
if (s1) { 
    /* ....... */ 
} 

Sie werden in der String *Swig_last_file(void) Funktion interessiert sein, das zurück Der Dateiname der gerade analysierten Kopfzeile.

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); 
} 

Ich weiß, es ist keine vollständige Lösung, aber Hoffnung kann Ihnen helfen, das gewünschte Verhalten zu erhalten.