2013-06-10 18 views
9

Sto facendo un piccolo programma che richiede un file immagine foo.bmp per eseguire
così posso compilare il programma ma per eseguirlo, devo copiare foo.bmp per 'compilare 'sottodirectory manualmenteCMake: aggiunta di risorse personalizzate per creare la directory

quale comando dovrei usare in CMakeLists.txt per aggiungere automaticamente foo.bmp per compilare la sottodirectory mentre il programma compila?

risposta

9

Per fare ciò è necessario utilizzare add_custom_command per generare regole di compilazione per il file necessario nella directory di generazione. Quindi aggiungi le dipendenze dalle tue destinazioni a quei file: CMake crea solo qualcosa se è necessario da un bersaglio.

È inoltre necessario assicurarsi di copiare solo i file se non si sta costruendo dalla directory di origine.

Qualcosa di simile a questo:

project(foo) 

cmake_minimum_required(VERSION 2.8) 

# we don't want to copy if we're building in the source dir 
if (NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR) 

    # list of files for which we add a copy rule 
    set(data_SHADOW yourimg.png) 

    foreach(item IN LISTS data_SHADOW) 
     message(STATUS ${item}) 
     add_custom_command(
      OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${item}" 
      COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/${item}" "${CMAKE_CURRENT_BINARY_DIR}/${item}" 
      DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${item}" 
     ) 
    endforeach() 
endif() 

# files are only copied if a target depends on them 
add_custom_target(data-target ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/yourimg.png") 

In questo caso sto usando un "ALL" target personalizzato con una dipendenza sul file yourimg.png per forzare la copia, ma si può anche aggiungere la dipendenza da un dei tuoi obiettivi esistenti.

+0

quello che fa add_custom_target linea facendo. ho provato a modificare il codice e ho incluso il ciclo foreach per la riga add_custom_target ma non funziona su più file – Archit

+0

Sì, credo che tu abbia un problema con le dipendenze ... come ho detto solo i file necessari per i target sono costruiti. Quindi, se non ci sono obiettivi dipendenti dalle tue immagini, non saranno costruiti. Ecco perché sto aggiungendo "add_custom_target" nel mio esempio. Una buona regola potrebbe essere 'add_custom_target (data-target ALL DEPENDS $ {data_SHADOW})' quindi dipende sempre da tutte le immagini. – Guillaume

1

In questo caso potrebbe essere utile, ho provato un'altra soluzione utilizzando il comando file. C'è l'opzione COPIA che semplicemente copia un file o una directory dall'origine alla destinazione.

Ti piace questa: FILE(COPY yourImg.png DESTINATION "${CMAKE_BINARY_DIR}")

Percorso relativo funziona anche per destinazione (. Si può semplicemente utilizzare per esempio)

di riferimento Doc: https://cmake.org/cmake/help/v3.0/command/file.html

Problemi correlati