2012-10-16 12 views
5

Ich habe ein CMake-Projekt mit vielen Teilprojekten. Jede von ihnen kann eine Funktion verwenden, die ich zur Verfügung stelle, um eine kleine Textdatei mit bestimmten Informationen zu generieren (durch Aufruf von add_custom_command). Im letzten Schritt möchte ich alle diese Dateien in einer großen Textdatei kombinieren.CMake: Hinzufügen von Abhängigkeit add_custom_command dynamisch

Ich habe einen benutzerdefinierten Befehl erstellt, der nach erstellten Dateien (alle an einem Ort) sucht und sie zusammenführt.

Das Problem ist, dass ich diesen letzten Schritt abhängig von allen kleinen Schritten in Teilprojekten machen möchte, während ich eigentlich nicht weiß, wie viele Dateien zur Verfügung gestellt werden.

Meine letzte Befehl wie folgt aussieht:

add_custom_command(OUTPUT combination.txt 
        COMMAND create combination.txt from all files from /path/) 

und meine create-small-Text-Datei-für-jeden-Teilprojekt wie Befehl aussieht:

add_custom_command(OUTPUT /path/${sub_project_name}.txt 
        COMMAND create /path/${sub_project_name}.txt) 

Und wenn ich schaffen die kleinen Dateien ich möchte etwas zu tun, wie „combination.txt“ hängen

Also auf /path/${sub_project_name}.txt machen wünschte, ich könnte ich:

add_dependency(combination.txt /path/${sub_project_name}.txt) 

Dies funktioniert jedoch nur für Ziele.

Ich habe auch versucht set_source_files_properties mit OBJECT_DEPENDS zu verwenden, aber es scheint nicht zu funktionieren (seine vielleicht die Absicht, mit add_target CPP-Dateien verwendet werden?)

Der letzte Weg ist, um es Arbeit zu bekommen ich sehe, eine Cache-Variable zu verwenden, die alle diese kleinen Dateien Pfade ansammeln würden und es dann wie folgt verwenden:

add_custom_command(OUTPUT combination.txt 
        COMMAND create combination.txt from all files from /path/ 
        DEPENDS ${all_small_files_list}) 

aber das ist das letzte, was ich tun möchte.

Antwort

4

Anstatt add_custom_command zu verwenden, könnten Sie add_custom_target mit einer korrekten Abhängigkeitsdefinition verwenden (so dass es nicht jedes Mal erstellt wird).

add_custom_target(project 
        COMMAND touch project.txt) 

add_custom_target(project2 
        COMMAND touch project2.txt) 

add_custom_target(combination 
        COMMAND cat project.txt project2.txt > combination.txt) 

add_dependencies(combination project2) 
add_dependencies(combination project) 

add_executable(t t.c) 
add_dependencies(t combination.txt) 

wieder: Stellen Sie sicher, dass Sie das DEPENDS Argument von add_custom_target verwenden eine echte Abhängigkeitskette zu schaffen, so dass ein Projekt-Ziel und damit die Kombination Ziel veralten wird.

UPDATE: Ich war zu früh. Tatsächlich funktioniert CMake (mindestens bis zu 2.8.9) wie folgt für Abhängigkeiten: mit einem Aufruf an add_dependencies können Sie keine Abhängigkeit hinzufügen, die die OUTPUT eines benutzerdefinierten Befehls IOW eine (generierte) Datei ist. Mit add_dependencies können Sie nur target hinzufügen, wie von add_custom_target erstellt. In einem add_custom_target können Sie sich jedoch auf eine Ausgabe von add_custom_command verlassen, indem Sie die DEPENDS-Richtlinie verwenden. Das heißt dies macht es Arbeit:

add_custom_command(OUTPUT project.txt 
        COMMAND uptime >> project.txt MAIN_DEPENDENCY t2.c) 
add_custom_target(project DEPENDS project.txt) 

add_custom_target(combination 
        COMMAND cat project.txt project2.txt > combination.txt) 
add_dependencies(combination project) 

Dies wird die Kombination Ziel machen immer regeneriert werden, da sie keine MAIN_DEPENDENCY oder DEPENDS hat, aber die Verwendung von add_dependencies ist erlaubt.

+0

Es wird funktionieren, aber nicht genau wie erwartet: Jedes Mal, wenn ich make aufrufen, werden alle Ziele (Kombination, Projekt und Projekt2) neu aufgebaut - so werden die Dateien neu generiert. Das ist nicht so schön wie es sein könnte;) Das erwartete Verhalten für mich ist, keine Dateien neu zu generieren, es sei denn, es ist notwendig. Nach CMake-Dokumenten - add_custom_target wird jedes Mal erstellt. Ich wünschte, ich hätte eine Lösung, die als add_custom_command funktioniert - die nur erstellt wird, wenn sich die Abhängigkeit geändert hat. –

+0

Was verwenden Sie als Abhängigkeit, um project.txt zu generieren? Ich denke, was der CMake-Doc sagen will ist, dass ein custom_target immer überprüft wird, ob es neu erstellt werden muss oder nicht - zumindest scheint es so zu funktionieren. –

+0

Nun, nachdem ich richtig gelesen habe, wie wir es machen, muss ich zugeben, dass ich zu früh war. Siehe mein Update der Antwort. –

Verwandte Themen