2013-01-16 10 views
13

Ich versuche, mehrere Dateien mit dem Format ${CMAKE_COMMAND} -E copy <from> <to> zu kopieren, aber ich frage mich, ob es eine Möglichkeit gab, eine Reihe von Dateien zum Kopieren in ein bestimmtes Verzeichnis bereitzustellen. Es scheint, dass die cmake-Kopie nur eine Datei gleichzeitig kopieren lässt. Ich möchte den Kopierbefehl nicht wirklich verwenden, wenn ich lieber eine Liste der zu kopierenden Dateien als erstes Argument bereitstellen möchte.CMake Custom Command mehrere Dateien kopieren

Ich denke, die einfachste Lösung ist die Verwendung des plattformabhängigen "cp" -Befehls. Dies ist zwar nicht gut für die Portabilität, aber unser System wird garantiert auf Linux basieren. Eine einfache, plattformunabhängige Lösung wäre besser.

Antwort

5

wäre eine relativ einfache Abhilfe seine ${CMAKE_COMMAND} -E tar zu verwenden, um die Quellen zu bündeln, den Tarball bewegen und es in dem Zielverzeichnis zu extrahieren.

Dies könnte mehr Probleme verursachen, als es wert ist, wenn Ihre Quellen über viele verschiedene Verzeichnisse verteilt sind, da das Extrahieren die ursprüngliche Verzeichnisstruktur beibehalten würde (im Gegensatz zu cp). Wenn sich jedoch alle Dateien in einem Verzeichnis befinden, können Sie die Kopie in nur 2 add_custom_command Aufrufen erreichen.

Angenommen, Ihre zu verschiebenden Quellen befinden sich alle in ${CMAKE_SOURCE_DIR}/source_dir, das Ziel ist ${CMAKE_SOURCE_DIR}/destination_dir und Ihre Liste von Dateinamen (nicht vollständige Pfade) lautet ${FileList}. Sie tun können:

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

Während ich deine Herangehensweise mag, suche ich immer noch nach etwas Einfachem als Teer. Nun vielleicht in eine CMake-Funktion in einigen, das könnte funktionieren. – jluzwick

+0

Ja - ich hatte gehofft, jemand anderes hätte eine bessere Antwort. Sie könnten tatsächlich eine CMake-Funktion erstellen, die dies intern tun würde, einschließlich das Abrufen nur der letzten Komponente des Pfades jeder Quelldatei (mit ['get_filename_component ( Dateiname NAME)]] (http://www.cmake.org/cmake/help) /v2.8.10/cmake.html#command:get_filename_component)), um das Verhalten von 'cp' besser zu simulieren. – Fraser

9

Ich habe es mit einer Schleife

# 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

Das würde funktionieren, aber würde dies nicht zu einem massiven Makefile führen, wenn man versucht, Hunderte von Dateien zu kopieren? – jluzwick

+1

Ich denke schon, aber Sie haben nicht geschrieben, dass Sie riesige Mengen an Dateien hatten. Tut mir leid, dass ich dir nicht helfen konnte. – Knitschi

+0

Wenn sich Ihre Dateien in einem Quellverzeichnis befinden, sollten Sie jeden Dateinamen auf $ {CMAKE_CURRENT_SOURCE_DIR} setzen. Auch wenn Sie in das aktuelle bin-Verzeichnis kopieren möchten. Zum Beispiel ARGS-E kopieren $ {CMAKE_CURRENT_SOURCE_DIR}/$ {file_i} $ {CMAKE_CURRENT_BINARY_DIR} –

Verwandte Themen