Ich habe eine Frage zu CMake, die hier häufig gestellt wird, aber keine der Antworten scheint mein Problem zu lösen.cmake, add_custom_command mit Abhängigkeiten aus einem anderen Verzeichnis
Im details
Unterverzeichnis gibt es ein CMakeLists.txt
, die enthält:
add_custom_command(OUTPUT part.out
COMMAND foo --input=part.src --output=part.out
DEPENDS part.src)
add_custom_target(part_out
DEPENDS part.out)
Im Hauptverzeichnis ein CMakeLists.txt
dort die part.out
zur Erzeugung eines andere Datei verwendet wird:
add_custom_command(OUTPUT full.out
COMMAND bar --input=./details/part.out --output=full.out)
add_custom_target(full_out
DEPENDS full.out)
Das Problem ist, dass Ich möchte 3 Dinge hier passieren:
- wenn
part.out
nicht vorhanden es - wenn
part.out
veralten erzeugt werden muss, ist (part.src
neuer ist alspart.out
) Ich will es - wenn
full.out
regeneriert werden veraltet ist (part.out
neuer ist alsfull.out
, oderfull.out
desn't existieren) ich habe es (wieder) erzeugt
So sein wollen, wenn ich hinzufügen DEPENDS ./details/part.out
zu add_custom_command(OUTPUT full.out)
werde ich Punkte erreichen 2 und 3, jedoch nicht mehr als 1 Punkt, denn wenn ich part.out
löschen und dann habe ich Rufen SieanIch erhalte eine Fehlermeldung, dass es keine Regel zu machen gibt ./details/part.out
(wie es eine Regel aus einem anderen Verzeichnis ist).
Wenn ich DEPENDS full_out
-add_custom_command(OUTPUT full.out)
hinzuzufügen oder zu add_custom_target(full_out)
werde ich erreichen Punkte 1 und 2, aber nicht mehr als 3, denn selbst wenn part.out
regeneriert wurde, wird ein full.out
nicht regeneriert werden, da es nicht auf der part.out
Datei abhängt selbst.
Also, wie kann ich beide Szenarien verbinden? Ich habe darüber nachgedacht, beide DEPENDS
hinzuzufügen, aber woher weiß ich, ob das immer funktioniert? Ich meine, in einem solchen Fall spielt die Reihenfolge der Builds eine Rolle.
ok, ich weiß, wie man Ziele verbindet. Problem ist, wie die Ausgabe eines custom_command wiederhergestellt wird, wenn sich eine Datei (die ein Ergebnis eines anderen benutzerdefinierten Befehls ** aus einem anderen Verzeichnis ist **) ändert –
@ MichałWalenciak Hm, ich sehe. Siehe meine erweiterte Antwort für eine Lösung. –
thx, jetzt ist es in Ordnung :) –