2016-01-14 20 views
27

Sto provando a creare un semplice progetto su CLion. Usa CMake (sono nuovo qui) per generare Makefile per costruire un progetto (o qualcosa del genere)CMake: copia il file dalla directory di origine nella directory binaria

Tutto ciò di cui ho bisogno è trasferire ogni volta un file non di progetto (una sorta di file di risorse) in una directory binaria quando eseguo il mio codice.

Quel file contiene dati di test e l'applicazione lo apre per leggerli. Ho provato diversi modi per farlo:

  • Via file(COPY ...

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

    Guardando bene, ma funzionerà solo una volta e non ricopiare file dopo successiva esecuzione.

  • Via add_custom_command

    • OUTPUT versione

      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 versione

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

    Ma no uno di questi funziona.

Cosa sto sbagliando?

risposta

51

Si può considerare l'utilizzo di configure_file con l'opzione COPYONLY:

configure_file(<input> <output> COPYONLY) 

differenza file(COPY ...) crea una dipendenza a livello di file tra ingresso e uscita, vale a dire:

Se il file di input viene modificato il sistema di compilazione si ri-eseguire CMake riconfigurare il file e generare nuovamente il sistema di generazione.

17

entrambe le opzioni sono valide e il targeting due diverse fasi del vostro costruire:

  1. file(COPY ... copia il file in fase di configurazione e solo in questo passaggio. Quando si ricostruisce il progetto senza aver modificato la configurazione cmake, questo comando non verrà eseguito.
  2. add_custom_command è la scelta preferita quando si desidera copiare il file in ogni fase della creazione.

La versione giusta per il vostro compito sarebbe:

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

si può scegliere tra PRE_BUILD, PRE_LINK, POST_BUILD migliore è leggere la documentazione di add_custom_command

un esempio su come utilizzare la prima versione può essere trovata qui: Use CMake add_custom_command to generate source for another target

3

La prima opzione che hai provato non funziona per due motivi.

In primo luogo, si è dimenticato di chiudere la parentesi.

In secondo luogo, il DESTINATION deve essere una directory, non un nome di file. Supponendo di aver chiuso la parentesi, il file sarebbe finito in una cartella denominata input.txt.

per farlo funzionare, basta cambiare a

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