CMake:文件副本未覆盖现有文件

2fjabf4q  于 2023-04-12  发布在  其他
关注(0)|答案(1)|浏览(259)

我想将某些文件复制到一个文件夹,然后覆盖其中的一些。但似乎file(COPY ..)没有覆盖现有的文件。
这是我正在尝试做的:

file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/common/ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/tmp/ FILES_MATCHING PATTERN "*.xml")

if(MY_OPTION)
    file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/custom/ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/tmp/ FILES_MATCHING PATTERN "*.xml")

我可以交换上面的行-首先复制custom,然后是common,此时common的副本不会覆盖custom的现有副本。这很好用,但有点混乱,我正在寻找更好的解决方案(使用复制/安装而不是自定义命令)。
我没有看到任何选项来显式覆盖...
file(COPY_FILE ...)是一个选项,但我不想指定每个文件...
编辑:来自Tsyvarev的评论-这可能与文件的相同时间戳有关。不幸的是,我被相同的时间戳卡住了。

kfgdxczn

kfgdxczn1#

正如你已经发现的,在file(COPY ...)中没有强制执行该操作的选项。而且,它不会覆盖具有相同(或更新,我认为)时间戳的文件,请参阅CMake文档。
另一方面,如果不使用ONLY_IF_DIFFERENT标志调用,较新的file(COPY_FILE ...)将覆盖现有文件。为了避免枚举CMakeLists.txt中的所有XML文件,我们可以将它们全局化,让CMake循环遍历所有XML文件。这与指定FILES_MATCHING PATTERN没有什么不同。
下面是示例代码:

# Create target dir if it does not already exist
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/tmp)

# Existing line, copy everything from common
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/common/ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/tmp/ FILES_MATCHING PATTERN "*.xml")

# Glob all XML files in custom
file(GLOB xml_files custom/*.xml)
# Loop over all the XML files that were found
foreach(in_file IN LISTS xml_files)
    # Get just the file name, w/o path
    get_filename_component(out_file ${in_file} NAME)
    # Do the actual copy
    file(COPY_FILE ${in_file} ${CMAKE_BINARY_DIR}/tmp/${out_file})
endforeach()

另一种方法是交换这两行代码,并添加一个注解,说明CMake不会覆盖现有文件。你已经在问题中写过了,我认为这可能是最优雅的解决方案。

相关问题