Wie kopiere ich den Inhalt eines Verzeichnisses nach dem Erstellen mit CMake in das Build-Verzeichnis?

78

Ich habe einige Konfigurationsdateien (xml, ini, ...) im configVerzeichnis neben den Quelldateien. Wie kann ich bei jedem Projekt alle Dateien im Konfigurationsverzeichnis in das Erstellungsverzeichnis (neben der ausführbaren Datei) kopieren?

B Faley
quelle

Antworten:

141

Sie können verwenden add_custom_command.

Angenommen, Ihr Ziel wird aufgerufen MyTarget, dann können Sie Folgendes tun:

add_custom_command(TARGET MyTarget PRE_BUILD
                   COMMAND ${CMAKE_COMMAND} -E copy_directory
                       ${CMAKE_SOURCE_DIR}/config/ $<TARGET_FILE_DIR:MyTarget>)

Dies wird jedes Mal ausgeführt, wenn Sie MyTargetden Inhalt von "/ config" erstellen und in das Verzeichnis kopieren, in dem die Ziel-exe / lib landen wird.

Wie Mark Lakata in einem Kommentar unten ausführt, stellt das Ersetzen PRE_BUILDdurch POST_BUILDin add_custom_commandsicher, dass das Kopieren nur dann erfolgt, wenn der Build erfolgreich ist.

Erläuterung

  • ${CMAKE_COMMAND} ist der Weg zu CMake
  • -E Lässt CMake Befehle ausführen, anstatt zu erstellen
  • copy_directoryist ein Befehlszeilen-Tool
  • config ist das Verzeichnis (das unter das Stammverzeichnis des Projekts fällt), dessen Inhalt in das Build-Ziel kopiert wird
  • $<TARGET_FILE_DIR:MyTarget>ist ein Generatorausdruck , der in der add_custom_commandDokumentation beschrieben wird.
Fraser
quelle
1
Eines Ihrer tatsächlichen Ziele, das Sie in Ihrer CMakeLists.txt haben - dh etwas, das über add_executableoder hinzugefügt wurde add_library.
Fraser
1
Ja - ich denke, es makeist klug genug, nicht einmal auszuführen, make MyTargetwenn es feststellt, dass es unverändert ist. Wenn sich an Ihrem Ziel etwas ändert, wird make auf diesem Ziel ausgeführt und die Dateien werden kopiert.
Fraser
7
POST_BUILD ist wahrscheinlich eine bessere Option, was bedeutet, dass die Dateien nur kopiert werden, wenn der Build erfolgreich ist.
Mark Lakata
6
Gibt es eine Möglichkeit, darauf make cleanhinzuweisen, dass die kopierten Dateien beim Bereinigen des Projekts gelöscht werden müssen?
Moonwalker
3
Gibt es eine Möglichkeit, das Verzeichnis selbst anstelle des Inhalts zu kopieren?
10

Neben der Top-Antwort

Um das Verzeichnis selbst anstelle des Inhalts zu kopieren, können Sie /${FOLDER_NAME}am Ende des zweiten Parameters hinzufügen .

So was:

add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                   COMMAND ${CMAKE_COMMAND} -E copy_directory
                       ${CMAKE_SOURCE_DIR}/config $<TARGET_FILE_DIR:${PROJECT_NAME}>/config)
Hyrchao
quelle
-5

In meinem Projekt verwende ich INSTALL, um in CMake anzugeben, was und wo ich meine Binärdatei mit conf-Datei verschiebe. Verwenden Sie nach der Ausführung von cmake "make install".

Luigi Menale
quelle
OP fragte, wie dies nach Abschluss des Builds zu tun sei. Die Implikation erfolgt ohne einen weiteren Befehl, der in die Shell eingegeben wird. Führen Sie die Build und puh die Dateien , die Ihr Binär - Bedarf magisch sind. Ich verwende auch den install()Befehl, aber dies ist für einen speziellen Fall: Der Code wird erstellt, besteht Unit-Tests und ist für eine bestimmte Verwendungsstufe durch andere bereit. Ich installiere es nicht, um es zu debuggen.
PfunnyGuy