我想将某些文件复制到一个文件夹,然后覆盖其中的一些。但似乎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的评论-这可能与文件的相同时间戳有关。不幸的是,我被相同的时间戳卡住了。
1条答案
按热度按时间kfgdxczn1#
正如你已经发现的,在
file(COPY ...)
中没有强制执行该操作的选项。而且,它不会覆盖具有相同(或更新,我认为)时间戳的文件,请参阅CMake文档。另一方面,如果不使用
ONLY_IF_DIFFERENT
标志调用,较新的file(COPY_FILE ...)
将覆盖现有文件。为了避免枚举CMakeLists.txt中的所有XML文件,我们可以将它们全局化,让CMake循环遍历所有XML文件。这与指定FILES_MATCHING PATTERN
没有什么不同。下面是示例代码:
另一种方法是交换这两行代码,并添加一个注解,说明CMake不会覆盖现有文件。你已经在问题中写过了,我认为这可能是最优雅的解决方案。