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