2013-01-16 11 views
13

Sto tentando di copiare più file utilizzando il formato ${CMAKE_COMMAND} -E copy <from> <to>, ma mi chiedevo se c'era un modo per fornire un numero di file da copiare in una directory specifica. Sembra che la copia di cmake consenta di copiare un solo file alla volta. Non voglio davvero usare ripetutamente il comando copy quando preferisco fornire un elenco di file da copiare come primo argomento.Comando personalizzato CMake copia più file

Sto pensando che la soluzione più semplice è utilizzare il comando "cp" dipendente dalla piattaforma. Mentre questo sicuramente non è buono per la portabilità, il nostro sistema è garantito per essere costruito su Linux. Una soluzione semplice e indipendente dalla piattaforma sarebbe meglio.

risposta

5

Una soluzione relativamente semplice sarebbe quella di utilizzare ${CMAKE_COMMAND} -E tar per raggruppare i sorgenti, spostare il tarball ed estrarlo nella directory di destinazione.

Questo potrebbe essere più difficile di quello che vale se le tue fonti sono sparse su molte directory diverse, poiché l'estrazione manterrebbe la struttura della directory originale (diversamente dall'uso di cp). Tuttavia, se tutti i file si trovano in una directory, è possibile ottenere la copia in solo 2 chiamate add_custom_command.

Dire che le origini da spostare sono tutte in ${CMAKE_SOURCE_DIR}/source_dir, la destinazione è ${CMAKE_SOURCE_DIR}/destination_dir e l'elenco dei nomi di file (non percorsi completi) sono in ${FileList}. Si potrebbe fare:

add_custom_command(
    TARGET MyExe POST_BUILD 
    COMMAND ${CMAKE_COMMAND} -E tar cfj ${CMAKE_BINARY_DIR}/temp.tar ${FileList} 
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/source_dir) 

add_custom_command(
    TARGET MyExe POST_BUILD 
    COMMAND ${CMAKE_COMMAND} -E rename ${CMAKE_BINARY_DIR}/temp.tar temp.tar 
    COMMAND ${CMAKE_COMMAND} -E tar xfj temp.tar ${FileList} 
    COMMAND ${CMAKE_COMMAND} -E remove temp.tar 
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/destination_dir) 
+0

Anche se mi piace il tuo approccio qui, sto ancora cercando qualcosa di un po 'più semplice dell'utilizzo di tar. Ora forse inserendo questa funzione in una funzione di CMake, potrebbe funzionare. – jluzwick

+0

Sì, speravo che qualcun altro avesse una risposta migliore. Potresti davvero creare una funzione CMake che lo farebbe internamente, incluso ottenere solo il componente finale del percorso di ogni file sorgente (usando ['get_filename_component ( NomeFile NOME)'] (http://www.cmake.org/cmake/help /v2.8.10/cmake.html#command:get_filename_component)) per simulare meglio il comportamento di 'cp'. – Fraser

9

l'ho fatto con un ciclo

# create a list of files to copy 
set(THIRD_PARTY_DLLS 
    C:/DLLFOLDER/my_dll_1.dll 
    C:/DLLFOLDER/my_dll_2.dll 
) 

# do the copying 
foreach(file_i ${THIRD_PARTY_DLLS}) 
    add_custom_command(
    TARGET ${VIEWER_NAME} 
    POST_BUILD 
    COMMAND ${CMAKE_COMMAND} 
    ARGS -E copy ${file_i} "C:/TargetDirectory" 
) 
endforeach(file_i) 
+1

Funzionerebbe, ma questo non creerebbe un enorme makefile quando si tenta di copiare centinaia di file? – jluzwick

+1

Credo di sì, ma non hai scritto che avevi enormi quantità di file. Mi dispiace di non poterti aiutare. – Knitschi

+0

Se i file si trovano in una directory di origine, è necessario assegnare ciascun nome di file a $ {CMAKE_CURRENT_SOURCE_DIR}. Inoltre, se si desidera copiare nella directory bin corrente. Per esempio ARGS -E copia $ {CMAKE_CURRENT_SOURCE_DIR}/$ {file_i} $ {CMAKE_CURRENT_BINARY_DIR} –

Problemi correlati