CMake Custom Command复制多个文件

jlu*_*ick 20 cmake

我试图使用该${CMAKE_COMMAND} -E copy <from> <to>格式复制多个文件,但我想知道是否有办法提供一些文件复制到特定目录.似乎cmake副本只允许一次复制一个文件.当我宁愿提供要复制的文件列表作为第一个参数时,我真的不想重复使用复制命令.

我认为最简单的解决方案是使用平台相关的"cp"命令.虽然这对于便携性肯定不好,但我们的系统保证在Linux上构建.一个简单的,独立于平台的解决方案会更好.

Kni*_*chi 11

I did it with a loop

# 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 )
Run Code Online (Sandbox Code Playgroud)

  • 在Windows上(至少),它实际上被连接成一个很长的单一命令行,足够长以至于cmd.exe实际上可以抱怨并拒绝执行它。CMake确实需要更好的方法来做到这一点。 (2认同)

luk*_*kee 8

可以从CMake 3.5获得复制多个文件

cmake -E copy <file>... <destination>
Run Code Online (Sandbox Code Playgroud)

"cmake -E copy"支持多个文件

命令行工具模式


Fra*_*ser 7

一个相对简单的解决方法是使用${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)
Run Code Online (Sandbox Code Playgroud)