有两种可能的行为彼此不同。这种差异是我特别感兴趣的,我想在你的帮助下调查它的原因和可能的缺陷。
实施
macro(COPY_IF_DIFFERENT SRC_FILES SRC_DIR DST_DIR DST_FILE_TARGETS)
foreach(SRC_FILE ${SRC_FILES})
set(DST_FILE ${SRC_FILE}) # Currently names of original and copy are the same.
# set(DST_FILE_TARGET ${DST_DIR}/${DST_FILE}) # <--- A
# set(DST_FILE_TARGET ${SRC_FILE}) # <--- B
add_custom_command(
OUTPUT ${DST_FILE_TARGET}
COMMAND ${CMAKE_COMMAND}
ARGS -E copy_if_different ${SRC_DIR}/${SRC_FILE} ${DST_DIR}/${DST_FILE}
# MAIN_DEPENDENCY ${SRC_DIR}/${SRC_FILE} # <--- C
# DEPENDS ${SRC_DIR}/${SRC_FILE} # <--- D
)
set(dstFileTargets ${dstFileTargets} ${DST_FILE_TARGET})
endforeach()
set(${DST_FILE_TARGETS} ${dstFileTargets})
set(CUSTOM_TARGET ${ARGV4})
if(CUSTOM_TARGET)
add_custom_target(${CUSTOM_TARGET} ALL DEPENDS ${dstFileTargets})
endif()
endmacro()
只是为了澄清宏观用途的目的:
set(H_FILES header1.h header2.h ...)
COPY_IF_DIFFERENT(${H_FILES} ${CMAKE_CURRENT_SOURCE_DIR} ${MY_AWESOME_INCLUDE_DIR} H_FILE_TARGETS "MyAwesomeIncludeTarget")
基本上,这个宏会做的只是将列出的文件$ {H_FILES}从$ {CMAKE_CURRENT_SOURCE_DIR}复制到$ {MY_AWESOME_INCLUDE_DIR}。它还将返回$ {H_FILE_TARGETS}中每个目标副本的目标列表。
注意:如果宏的最后一个参数存在(如上例所示),那么宏将自动创建一个自定义目标,其名称由最后一个参数提供(&#34; MyAwesomeIncludeTarget&#34;)为makefile中的$ {H_FILE_TARGETS}创建每个目标的真实复制规则。否则,如果缺少最后一个参数,则必须手动为$ {H_FILE_TARGETS}创建自定义目标,或将$ {H_FILE_TARGETS}附加到另一个目标,如ADD_EXECUTABLE(whatever ${SOURCES_OF_WHATEVER} ${H_FILE_TARGETS})
。您可以找到有关此微妙细节的更多信息here。
回到正轨。首先,请注意评论中的A,B,C和D,因为我们需要它们进行进一步的讨论。
当我们取消注释A和(C或D或两者)时,行为#1 存在:
行为#2 在我们仅取消注释B时出现(不需要C和D - 哇!):
如果还没有复制(即第一次调用),则会发生复制(当然);
如果我编辑原文并且副本已经存在,那么复制也会发生;
如果我编辑副本,则复制 HAPPENS TOO 。这是我特别感兴趣的,因为我想要这种行为。然而,在开始时我预计它会从#1开始,但根据我标记为(*)的论点似乎是不可能的(BTW请注意它)。我在实验过程中偶然发现了#2,但我不明白它为什么会那样起作用?安全吗?它有任何陷阱吗?
如果我保持原件和副本不变,请复制不要发生,因为copy_if_different命令建议(无论时间戳记如何)。
我知道帖子很大,但这是传达主题的唯一方法:)
先谢谢你们