Ich bin gerade dabei, ein altes CMake-Setup neu zu schreiben, um moderne Funktionen wie die automatische Weitergabe von Abhängigkeiten zu verwenden. (dh mit Dingen wie target_include_directories(<target> PUBLIC <dir>)
anstelle von include_directories(<dir>)
.) Derzeit verarbeiten wir alle Projektabhängigkeitsinformationen manuell, indem wir eine Reihe globaler Verzeichniseigenschaften festlegen.
Bei meinen Tests habe ich einige Beispiele gefunden, bei denen ein Ziel im neuen Build mit einer Bibliothek verknüpft wird, die im alten Build nicht vorhanden ist. Ich verlinke nicht explizit darauf, daher weiß ich, dass dies von den Abhängigkeiten des Ziels herrührt, aber um herauszufinden, welche davon ich rekursiv durch alle Projekte schauen muss, verfolge ich CMakeLists.txt
die Abhängigkeitshierarchie, bis ich sie finde eine, die in die fragliche Bibliothek zieht. Wir haben Dutzende von Bibliotheken, daher ist dies kein trivialer Prozess.
Bietet CMake eine Möglichkeit, für jedes Ziel zu sehen, welche seiner Abhängigkeiten explizit hinzugefügt wurden und welche durch transitive Abhängigkeiten weitergegeben wurden?
Es sieht aus wie der --graphviz
Ausgang macht diesen Unterschied zeigen, so klar CMake kennt den intern Kontext. Ich möchte jedoch ein tree
ähnliches Skript schreiben , um Abhängigkeitsinformationen in der Befehlszeile anzuzeigen, und das Parsen von Graphviz-Dateien klingt sowohl nach einem Albtraum als auch nach einem Hack.
Soweit ich das beurteilen kann, cmake-file-api
ist nicht enthalten diese Informationen. Ich dachte, das codemodel/target/dependencies
Feld könnte funktionieren, aber es listet sowohl lokale als auch transitive Abhängigkeiten auf, die miteinander vermischt sind. Und das backtrace
Feld jeder Abhängigkeit ist nur mit dem add_executable
/ add_library
call für das aktuelle Ziel verknüpft.
--graphiz
beantwortet Option Ihre Frage nicht? Warum fühlt sich das Parsen von Punktdateien wie ein Albtraum an? Punktdateien sind die einfachste, gebräuchlichste und flexibelste Methode, um von Menschen lesbare verbundene Punkte darzustellen. Mit demgvpr
Dienstprogramm können Sie alles im awk-artigen Stil tun und sie in andere Sprachen importieren. Warum ist eine Punktdatei, die buchstäblich eine baumartige Struktur von Abhängigkeiten zwischen Zielen darstellt, keine "Möglichkeit, das zu sehen", wonach Sie fragen?Antworten:
Sie können
dot
die von generierte Datei analysierengraphviz
und die gewünschten Details extrahieren. Unten finden Sie ein Beispiel für ein Python-Skript.Sie können dieses Skript auch hinzufügen, um es von cmake als benutzerdefiniertes Ziel auszuführen, sodass Sie es von Ihrem Build-System aus aufrufen können. Ein Beispiel für ein cmake-Projekt finden Sie hier
quelle
pydot
.