2016-05-13 4 views
2

Mit CMake 2.8+ können Sie vermeiden, Include-Verzeichnisse redundant zu setzen, indem Sie target_include_directories() verwenden.SWIG und CMake: Nutzen Sie die Informationen von `target_include_directories()`

z. von

add_libary(mylib SHARED ${SOURCES}) 
target_include_directories(mylib PUBLIC ./include) 

schreiben .. Sie müssen nur gegen mylib verbinden die benötigt sind Ordner auf Ihrem Ziel hinzuzufügen.

Aber wie kann ich diese Informationen nutzen, wenn ich CMake-Module verwenden muss, die diese Fähigkeit noch nicht nutzen? (In meinem Fall SWIG)

Wenn ich konfigurieren, dass ein SWIG Projekt, das ich zur Zeit hart zu codieren viele Informationen haben:

set(SWIG_MODULE_${PYTHON_MODULE_NAME}_EXTRA_DEPS 
    "../long/relative/path/1/include/some/header1.h" 
    "../long/relative/path/1/include/some/header2.h" 
    "../long/relative/path/2/include/some/header1.h" 
    "../long/relative/path/2/include/some/header2.h") 

Ich muss auch auf die altmodische include_directories() verwenden, um die swig Generator wissen zu machen, was es muss wissen:

include_directories(
    "../long/relative/path/1/include 
    "../long/relative/path/2/include) 

Im übrigen gelten die %include Anweisungen innerhalb .i Dateien wird nicht mehr funktionieren.

Natürlich I Variablen enthält die Pfade einstellen könnte, aber dann würde ich die Informationen zur Verfügung stellen wollte ich loswerden ..

Gibt es eine Möglichkeit, entweder die Verzeichnisinformationen von einem Ziel oder (besser natürlich extrahiert) das SWIG CMake-Modul korrekt benutzen?

Meine aktuelle Lösung:

Mit etwas (sehr schön) CMake Magie Sie automatisieren können von der Schnittstelle Teil einer Bibliothek alle Header-Dateien Auflistung und stellen Sie die Verzeichnisse enthalten:

function(swig_add_library_dependencies swig_module library_names) 
    foreach(library_name ${library_names}) 
     get_property(LIBRARY_INCLUDES 
        TARGET ${library_name} 
        PROPERTY INTERFACE_INCLUDE_DIRECTORIES) 
     foreach(INCLUDE_PATH ${LIBRARY_INCLUDES}) 
      include_directories(${INCLUDE_PATH}) 
      file(GLOB_RECURSE header_files "${INCLUDE_PATH}/*.h") 
      list(APPEND SWIG_MODULE_${swig_module}_EXTRA_DEPS ${header_files}) 
      # export variable to parent scope 
      set(SWIG_MODULE_${swig_module}_EXTRA_DEPS 
       ${SWIG_MODULE_${swig_module}_EXTRA_DEPS} PARENT_SCOPE) 
     endforeach() 
    endforeach() 
endfunction() 

zu werden wie folgt verwendet:

swig_add_library_dependencies(<swig_module_name> "library1;library2") 

oder diskret wie folgt aus:

swig_add_library_dependencies(<swig_module_name> library1) 
swig_add_library_dependencies(<swig_module_name> library2) 

Nachteile:

  • verwendet GLOB_RECURSE
  • funktioniert nur, wenn target_include_directories korrekt verwendet worden war
  • schafft Abhängigkeiten alle Header-Dateien in Verzeichnissen enthalten gefunden
+1

Wie etwa 'target_include_directories in der Dokumentation festgestellt ', wenn es mit dem PUBLIC-Schlüsselwort verwendet wird, füllt es [INTERFACE_INCLUDE_DIRECTORIES] (https://cmake.org/cmake/help/v3.0/prop_tgt/INTERFACE_INCLUDE_DIRECTORIES.html#prop_tgt:INTERFACE_INCLUDE_DIRECTORIES) des Ziels auf. So können Sie Informationen durch Lesen dieser Eigenschaft extrahieren. – Tsyvarev

+0

+1, weil es mit 'include_directories' hilft, aber ich brauche immer noch redundante Informationen für' SWIG_MODULE _ * _ EXTRA_DEPS' – frans

Antwort

1

a Haben Sehen Sie sich die Dokumentation für get_property an:

https://cmake.org/cmake/help/v3.0/command/get_property.html?highlight=get_property

Sie würde so etwas tun:

get_property(MY_INCLUDES TARGET my_target PROPERTY INTERFACE_INCLUDE_DIRECTORIES) 

die Schnittstelle enthalten Verzeichnisse von dem Ziel my_target und speichert sie in der Variablen MY_INCLUDES zu bekommen

+0

Das würde zwar das Problem mit 'include_directories' lösen - aber man müsste noch etwas für den' SWIG_MODULE _ * _ EXTRA_DEPS' Teil erfinden . Aber da ich explizit gefragt habe, wie ich diese Informationen extrahieren soll, haben Sie meine Frage natürlich beantwortet. Ich werde die Frage offen halten, während ich an 'get_property' ein wenig herumgebastelt habe. – frans

+0

@frans ah ich sehe. Diese EXTRA_DEPS, können sie algorithmisch erworben werden? Zum Beispiel, indem Sie einen Compiler verwenden, um einen Abhängigkeitswip über einige Quelldateien auszuführen? –

+1

derzeit versuche ich ein CMake-Makro zu schreiben, das über die INTERFACE_INCLUDE_DIRECTORIES iteriert - ich füge meine Ergebnisse zu meiner Frage hinzu. – frans

Verwandte Themen