【发布时间】:2011-06-07 20:00:43
【问题描述】:
在与.PHONY 目标的战斗中,我重写了:
# Makefile v0
tar:
tar -cf tarfile.tar dir
.PHONY: tar
成为:
# Makefile v1
tar: tarfile.tar
tarfile.tar: $(shell find dir)
tar -cf $@ dir
.PHONY: tar
这似乎适用于玩具示例。
但是,我可以看到这可能会做错事,具体取决于评估 $(shell find dir) 的时间。如果在解析 Makefile 后有一些规则会在 dir 中创建或删除文件,这可能会中断。
更新
根据@user562374的回答,我似乎有更好的解决方案,但考虑一下这种情况:
# Makefile v2
tar: tarfile.tar
tarfile.tar: dir/.dirstamp
tar --create --exclude $< --file $@ $(<D)
dir/.dirstamp: .FORCE
[ ! -e $@ -o "$(find $(@D) -newer $@ -print -quit)" ] && touch $@
dir/a: src/a
cp $< $@
.FORCE:
.PHONY: .FORCE tar
现在假设 src/a 已更改。由于tarfile.tar 和dir/a 之间没有依赖关系(不是直接的也不是间接的),tarfile.tar: 目标可能在dir/a: 之前被评估,因此tarfile.tar 不会是最新的。
所以,我的问题是:处理此类案件的最佳做法是什么?我必须单独维护dir 中的文件列表吗?如果是这样,最简单的方法是什么?
【问题讨论】:
标签: dependencies directory makefile tar