Wie füge ich_custom_command () für den CMake-Build-Prozess selbst hinzu?

Gibt es eine Möglichkeit, das Äquivalent zu add_custom_command (Ausführen eines externen Skripts, wenn sich eine bestimmte Datei ändert), aber für etwas, das während der Ausführung des CMake-Skripts selbst ausgeführt werden sollte? (Das heißt, für die Erzeugung von Abhängigkeitsgraphen.)

Wir haben unsere Quellcodedateien in mehrere Unterbibliotheken aufgeteilt, und es gibt Konfigurationsdateien, in denen aufgelistet ist, welche Quelldatei zu welcher Bibliothek gehört. (Das Format dieser Konfigurationsdateien wird von einem anderen von uns verwendeten Tool festgelegt.) Derzeit führen wir ein benutzerdefiniertes externes Skript aus, das diese Konfigurationsdateien analysiert und neue Dateien schreibt, die dann vom CMake-Erstellungsprozess geladen werden, um die Liste der Dateinamen zu erhalten an add_library () übergeben werden. Dies bedeutet, dass wir jedes Mal, wenn eine Quelldatei hinzugefügt / entfernt wird, daran denken müssen, den Befehl prebuild erneut auszuführen, bevor CMake erneut ausgeführt und anschließend den Befehl build erneut gestartet wird.

Ich weiß, dass CMake erkennen kann, dass es sich selbst neu starten muss, und ich hoffe, dass wir CMake dazu bringen können, 1) zu erkennen, dass die Konfigurationsdateien geändert wurden 2) den Konfigurationsdatei-Parser erneut auszuführen 3) die neue Dateiliste zu laden 4 ) Verwenden Sie die neue Dateiliste, um den Abhängigkeitsbaum neu zu erstellen. 5) Starten Sie schließlich den eigentlichen Erstellungs- / Kompilierungsprozess mit den neuen enthaltenen Dateien. ... und das alles mit dem Standard-Build-Befehl, ohne den externen Konfigurationsdatei-Parser manuell ausführen oder den CMake-Befehl erneut ausführen zu müssen und ohne unnötige Ausführung, wenn sich die Konfigurationsdatei nicht geändert hat.

uf der Suche habe ich @ gefunddiese Frag, wobei die Verwendung von configure_file () empfohlen wird, aber nicht das Aufrufen des externen Configfile-Parser-Skripts.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage