我正在使用make将文件复制到DEST
目录。我有以下规则
$(THUMBS): $(DEST)/% : %
mkdir -p $(dir $@)
cp $^ $@
问题是有时源文件可能不存在。我宁愿复制一个占位符文件,而不是生成错误。
我尝试添加占位符作为依赖实际来源作为中间人。这种方式有效,但如果占位符更新,则用它覆盖所有实际的源文件。
有没有一种优雅的方法来实现这个目标?
答案 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将不知道何时实际上不需要重新运行此规则。你每次都会无条件地运行它。