CMake:创建具有不同行为的COPY_IF_DIFFERENT宏

时间:2012-02-01 16:45:30

标签: file macros copy cmake

有两种可能的行为彼此不同。这种差异是我特别感兴趣的,我想在你的帮助下调查它的原因和可能的缺陷。

实施

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 存在:

  • 如果还没有复制(即第一次调用),则会发生复制(当然);
  • 如果我编辑原文并且副本已经存在,则复制也会发生(确实);
  • 如果我编辑副本,则复制不要发生。因为我使用 copy_if_different 命令,所以很奇怪。 (*)但是,我怀疑在这种情况下甚至没有调用此命令,因为副本的编辑时间戳总是高于原始值,导致死目标。
  • 如果我保留原件和副本不变,请复制不要发生,因为时间戳会再次出现。

行为#2 在我们仅取消注释B时出现(不需要C和D - 哇!):

  • 如果还没有复制(即第一次调用),则会发生复制(当然);

  • 如果我编辑原文并且副本已经存在,那么复制也会发生;

  • 如果我编辑副本,则复制 HAPPENS TOO 。这是我特别感兴趣的,因为我想要这种行为。然而,在开始时我预计它会从#1开始,但根据我标记为(*)的论点似乎是不可能的(BTW请注意它)。我在实验过程中偶然发现了#2,但我不明白它为什么会那样起作用?安全吗?它有任何陷阱吗?

  • 如果我保持原件和副本不变,请复制不要发生,因为copy_if_different命令建议(无论时间戳记如何)。

我知道帖子很大,但这是传达主题的唯一方法:)

先谢谢你们

0 个答案:

没有答案