使占位符依赖

时间:2013-08-14 21:28:10

标签: makefile gnu-make

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

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

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

我尝试添加占位符作为依赖实际来源作为中间人。这种方式有效,但如果占位符更新,则用它覆盖所有实际的源文件。

有没有一种优雅的方法来实现这个目标?

2 个答案:

答案 0 :(得分:0)

这个怎么样:

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

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

答案 1 :(得分:0)

如果$(DEST)中的文件是在外部构建的(也就是说,不是通过make recipe),那么你可以通过在你的食谱中嵌入一个小的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将不知道何时实际上不需要重新运行此规则。你每次都会无条件地运行它。