0

我正在使用 make 将文件复制到DEST目录。我有以下规则

$(THUMBS): $(DEST)/% : %
    mkdir -p $(dir $@)
    cp $^ $@

问题是有时源文件可能不存在。我宁愿复制一个占位符文件,而不是生成错误。

我尝试将占位符添加为依赖关系,并将实际来源作为中间体。那种工作,但如果占位符被更新,make会用它覆盖所有实际的源文件。

有没有一种优雅的方法来实现这一点?

4

2 回答 2

0

这个怎么样:

$(DEST)/% : %
    mkdir -p $(dir $@)
    cp $^ $@

$(DEST)/% :
    mkdir -p $(dir $@)
    touch $@
于 2013-08-14T22:20:17.037 回答
0

如果其中的文件$(DEST)是在外部构建的(也就是说,不是通过 make 配方),那么您可以通过在您的配方中嵌入一个小 shell 脚本来做到这一点:

$(THUMBS):
    mkdir -p $(@D)
    for file in $(DEST_FILES); do\
        if [[ -f $file ]]; then\
            cp -f $file $@;\
        else\
            cp -f $(PLACEHOLDER_FILE) $@;\
        fi;\
    done

您没有将文件$(DEST)列为先决条件,因此 make 永远不应该尝试重建它们。您将需要设置PLACEHOLDER_FILE为您希望用于丢失文件的占位符文件的名称,并设置DEST_FILES为您希望在DEST. 缺点是没有先决条件,make 不知道什么时候它实际上不需要重新运行这个规则。你每次都会无条件地运行它。

于 2013-08-16T00:31:16.887 回答