add_custom_command - Abhängigkeitsliste über Neuerstellungen aktualisieren

Letzte Statusaktualisierung anzeigen

Anfangsbedingunge

code-Generator, der eine Reihe von c ++ - Quellen generiert, wobei eine Eingabedatei als Parameter @ verwendet wi Eingabedatei kann andere Eingabedateien enthalten

Bereits gelöste Aufgabe, eine Liste der Ausgabedateien abzurufen und die Codegen-Eingabedateien zu analysieren, um eine vollständige Liste der Codegen-Eingaben zu erhalten. Das heißt add_custom_command wird zum ersten Mal mit den richtigen Abhängigkeiten versehen:

add_custom_command(OUTPUT ${generatedSources}
                   COMMAND ${codegenCommand} ARGS ${codegenArgs}
                   DEPENDS ${codegenInputFiles})

Problemszenario

current funktioniert so lange, bis jemand eine der Codegen-Eingabedateien so ändert, dass sie eine neue Eingabedatei enthält, oder eine vorhandene entfernt. In diesem Fall muss die Liste der für add_custom_command bereitgestellten Codegen-Eingabedateien als Abhängigkeiten aktualisiert werden, aber ich habe keine Ahnung, wie

Was fehl

Möglichkeit, Abhängigkeiten zwischen add_custom_command und Projektneubauten zu aktualisieren

Gibt es eine Möglichkeit, das Problem zu lösen, ohne das Projekt vollständig neu zu erstellen?

UPDATE - Alternative (besser?) Problembeschreibung

Ich habe eine ähnliche, nicht beantwortete Frage auf der cmake-Mailingliste gefunden. Zur besseren Übersicht hier posten:http: //article.gmane.org/gmane.comp.programming.tools.cmake.user/5227

Ich versuche, ein Tool zur Codegenerierung zu erstellen, das sich in Bezug auf Abhängigkeiten wie eine C-Quelldatei verhält. Damit meine ich, dass Sie eine C-Datei "a.c" haben. Da es # Dateien einschließen kann, wird jedes Mal der Inhalt vona.cenn sich @ ändert, haben sich möglicherweise auch die Abhängigkeiten geändert. Die Abhängigkeiten werden mit -MMD erneut gescannt. Ich möchte eine Möglichkeit, dies für meinen Codegenerator zu emulieren. Zuerst habe ich den Befehl add_custom_command ausprobiert, der eine feste DEPENDS-Liste annimmt, die zum Zeitpunkt der Definition des benutzerdefinierten Befehls festgelegt wird. Konkret meine ich so etwas:

function(add_generated_library)
   figure_out_dependencies(deps ${ARGN})
   add_custom_command(... DEPENDS ${deps})
endfunction()

Aber das erfasst nur die Abhängigkeiten zum Zeitpunkt der Erstellung des Systems. Bei jeder Ausführung des benutzerdefinierten Befehls muss die DEPENDS-Liste möglicherweise geändert werden, da die Änderungen möglicherweise neue Abhängigkeiten implizieren. Wie soll ich vorgehen?

UPDATE 2 - Mögliche Lösung

Folgendes halte ich für Fakten - es gibt Stimmen im Internet, die sich auf die Unterstützung dynamischer Abhängigkeiten beziehen, die für die reibungslose Integration vieler nicht-trivialer Tools zur Codegenerierung erforderlich sind - es gibt keine gebrauchsfertige, optimale Lösung Wir brauchen eigentlich einen Hook, um IMPLICIT_DEPENDS @ Unterstützung für benutzerdefiniertes DSL hinzuzufüge

Von cmake Handbuch:

Die Option IMPLICIT_DEPENDS fordert das Scannen impliziter Abhängigkeiten einer Eingabedatei an. Die angegebene Sprache gibt die Programmiersprache an, deren entsprechender Abhängigkeitsscanner verwendet werden soll. Derzeit werden nur C- und CXX-Sprachscanner unterstützt. Die Sprache muss für jede Datei in der IMPLICIT_DEPENDS-Liste angegeben werden.Abhängigkeiten, die beim Scannen festgestellt wurden, werden zum Zeitpunkt der Erstellung zu denen des benutzerdefinierten Befehls hinzugefügt..

Lösung unten entspricht (hoffentlich) den folgenden Kriterien:

Vermeiden Sie nicht notwendiges Scannen von Abhängigkeiten beim Neuaufbau Vermeiden Sie unnötigen Code-Generator, der beim Neuerstellen ausgeführt wirdkönnen Clients Cmake-Funktionen bereitstellen, um ihre Modelle zu registrieren und Code zu generieren / Bibliotheken aus diesem Code zu erstellen, ohne dass Anforderungen an die Projektstruktur gestellt werden (dh kein Teilprojekt ist für die Codegenerierung verantwortlich, Modelle werden mithilfe projektspezifischer Richtlinien über die Projekthierarchie verteilt).

Lösungsidee

Es ist nicht möglich, einen benutzerdefinierten Sprachscanner zu registrieren, es ist jedoch möglich, einen vorhandenen wiederzuverwenden. Die Idee ist, dass Abhängigkeiten / Hierarchien von benutzerdefinierten Modelldateien als Hierarchien von "C" -Headerdateien widergespiegelt werden. Jeder Hierarchieknoten wird beim Registrieren von Modelldatei- und C-Datei-Includes hinzugefügt. Wenn die Modelldatei eine Änderung enthält, wird die C-Datei geändert. Daher würde jeder Codegen-Aufruf von nur einem generierten C-Header abhängen, der das übergebene Modell widerspiegelt. Jede reflektierte Datei hängt von der Modelldatei ab und wird beim Ändern der Modelldatei berücksichtigt.

Zur Zusammenfassung: Wahrscheinlich ist mein Wortlaut zu diesem Zeitpunkt noch nicht so klar, aber im Hinblick auf die Bedürfnisse und die Community anderer Leute, die mir bei der Untersuchung dieses Problems geholfen haben, werde ich eine generische Lösung veröffentlichen (+ Link zu Github oder neuer cmake-Wiki-Seite) ohne Sobald das Projekt fertig ist (in 1-3 Tagen), werden die Projektdetails angezeigt.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage