2013-01-16 33 views
13

我試圖複製使用${CMAKE_COMMAND} -E copy <from> <to>格式的多個文件,但我想知道是否有辦法提供一些文件複製到特定的目錄。似乎cmake副本只允許一次拷貝一個文件。我真的不想重複使用copy命令,我寧願提供一份要複製的文件列表作爲第一個參數。CMake自定義命令複製多個文件

我在想最簡單的解決方案是使用平臺相關的「cp」命令。雖然這絕對不利於可移植性,但我們的系統保證在Linux上構建。一個簡單的,獨立於平臺的解決方案會更好。

回答

5

一個相對簡單的解決方法是使用${CMAKE_COMMAND} -E tar捆綁源代碼,移動tarball並將其提取到目標目錄中。

如果您的源代碼分散在多個不同的目錄中,這可能比它的價值更麻煩,因爲解壓縮將保留原始目錄結構(與使用cp不同)。但是,如果所有文件都在一個目錄中,則可以在僅有2 add_custom_command調用中實現副本。

說你要移動的源都在${CMAKE_SOURCE_DIR}/source_dir,目的地是${CMAKE_SOURCE_DIR}/destination_dir,你的文件名列表(不是完整路徑)在${FileList}。你可以這樣做:

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

雖然我喜歡你的方法,但我仍然在尋找比使用tar更簡單的方法。現在可能把它放入一些包含CMake的函數中,這可能會起作用。 – jluzwick

+0

是的 - 我希望別人會有更好的答案。你確實可以創建一個CMake函數,它可以在內部完成這些工作,包括獲取每個源文件路徑的最終組件(使用['get_filename_component( FileName NAME)'](http://www.cmake.org/cmake/help /v2.8.10/cmake.html#command:get_filename_component))來更好地模擬'cp'的行爲。 – Fraser

9

我有一個循環做到了

# 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

這將工作,但是當試圖複製數百個文件時,這不會創建大量的makefile文件嗎? – jluzwick

+1

我想是這樣,但你沒有寫出你有大量的文件。對不起,我幫不了你。 – Knitschi

+0

如果您的文件位於源目錄中,則應將每個文件名連接到$ {CMAKE_CURRENT_SOURCE_DIR}。另外如果你想複製到當前的bin目錄。例如ARGS -E複製$ {CMAKE_CURRENT_SOURCE_DIR}/$ {file_i} $ {CMAKE_CURRENT_BINARY_DIR} –