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
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
+1, weil es mit 'include_directories' hilft, aber ich brauche immer noch redundante Informationen für' SWIG_MODULE _ * _ EXTRA_DEPS' – frans