我試圖複製使用${CMAKE_COMMAND} -E copy <from> <to>
格式的多個文件,但我想知道是否有辦法提供一些文件複製到特定的目錄。似乎cmake副本只允許一次拷貝一個文件。我真的不想重複使用copy命令,我寧願提供一份要複製的文件列表作爲第一個參數。CMake自定義命令複製多個文件
我在想最簡單的解決方案是使用平臺相關的「cp」命令。雖然這絕對不利於可移植性,但我們的系統保證在Linux上構建。一個簡單的,獨立於平臺的解決方案會更好。
我試圖複製使用${CMAKE_COMMAND} -E copy <from> <to>
格式的多個文件,但我想知道是否有辦法提供一些文件複製到特定的目錄。似乎cmake副本只允許一次拷貝一個文件。我真的不想重複使用copy命令,我寧願提供一份要複製的文件列表作爲第一個參數。CMake自定義命令複製多個文件
我在想最簡單的解決方案是使用平臺相關的「cp」命令。雖然這絕對不利於可移植性,但我們的系統保證在Linux上構建。一個簡單的,獨立於平臺的解決方案會更好。
一個相對簡單的解決方法是使用${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)
我有一個循環做到了
# 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)
雖然我喜歡你的方法,但我仍然在尋找比使用tar更簡單的方法。現在可能把它放入一些包含CMake的函數中,這可能會起作用。 – jluzwick
是的 - 我希望別人會有更好的答案。你確實可以創建一個CMake函數,它可以在內部完成這些工作,包括獲取每個源文件路徑的最終組件(使用['get_filename_component( FileName NAME)'](http://www.cmake.org/cmake/help /v2.8.10/cmake.html#command:get_filename_component))來更好地模擬'cp'的行爲。 – Fraser