2016-01-14 4 views
27

Ich versuche ein einfaches Projekt auf CLion zu erstellen. Es benutzt CMake (ich bin neu hier), um Makefiles zu erzeugen, um Projekt (oder eine Art davon) zu erstellenCMake: Datei vom Quellverzeichnis in das Binärverzeichnis kopieren

Alles, was ich brauche, ist einige Nicht-Projekt-Datei (irgendeine Art von Ressourcendatei) in Binärverzeichnis jedes Mal zu übertragen wenn ich meinen Code ausführe.

Diese Datei enthält Testdaten und Anwendung öffnen sie, um sie zu lesen. Ich habe versucht, mehrere Möglichkeiten, dies zu tun:

  • Via file(COPY ...

    file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/input.txt 
         DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/input.txt 
    

    gut aus, sondern es nur einmal arbeiten und nicht Datei nach dem nächsten Lauf recopy.

  • Via add_custom_command

    • OUTPUT Version

      add_custom_command(
           OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/input.txt 
           COMMAND ${CMAKE_COMMAND} -E copy 
             ${CMAKE_CURRENT_SOURCE_DIR}/input.txt 
             ${CMAKE_CURRENT_BINARY_DIR}/input.txt) 
      
    • TARGET Version

      add_custom_target(foo) 
      add_custom_command(
           TARGET foo 
           COMMAND ${CMAKE_COMMAND} copy 
             ${CMAKE_CURRENT_BINARY_DIR}/test/input.txt 
             ${CMAKE_SOURCE_DIR}) 
      

    Aber nein Eine davon funktioniert.

Was mache ich falsch?

Antwort

51

Sie könnenverwendenmit der COPYONLY Option:

configure_file(<input> <output> COPYONLY) 

Im Gegensatz zu file(COPY ...) es eine Dateiebene Abhängigkeit zwischen Eingang und Ausgang erzeugt, das heißt:

Wenn die Eingabedatei des Build-System geändert wird, wird CMake erneut ausführen um die Datei neu zu konfigurieren und das Build-System erneut zu generieren.

17

beide Option gültig sind und zwei verschiedene Schritte des Build Targeting:

  1. file(COPY ... kopiert die Datei in Konfigurationsschritt und nur in diesem Schritt. Wenn Sie Ihr Projekt neu erstellen, ohne die cmake-Konfiguration geändert zu haben, wird dieser Befehl nicht ausgeführt.
  2. add_custom_command ist die bevorzugte Wahl, wenn Sie die Datei bei jedem Build-Schritt kopieren möchten.

wäre die richtige Version für Ihre Aufgabe:

add_custom_command(
     TARGET foo POST_BUILD 
     COMMAND ${CMAKE_COMMAND} -E copy 
       ${CMAKE_SOURCE_DIR}/test/input.txt 
       ${CMAKE_CURRENT_BINARY_DIR}/input.txt) 

Sie zwischen PRE_BUILD, PRE_LINK, wählen POST_BUILD am besten ist es, Sie in der Dokumentation von add_custom_command

ein Beispiel dafür, wie die Verwendung lesen Die erste Version kann hier gefunden werden: Use CMake add_custom_command to generate source for another target

3

Die erste der Optionen, die Sie ausprobiert haben, funktioniert aus zwei Gründen nicht.

Zuerst haben Sie vergessen, die Klammer zu schließen.

Zweitens sollte die DESTINATION ein Verzeichnis, kein Dateiname sein. Angenommen, Sie hätten die Klammer geschlossen, würde die Datei in einem Ordner mit dem Namen input.txt landen.

, damit es funktioniert, ist es einfach zu

ändern
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/input.txt 
    DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) 
Verwandte Themen