我有一个元数据点文件,我和我的代码一起存储(在一个大项目的每个目录中)。此元数据文件具有每个目录中满足特定约束(不是自动生成)的文件列表。此元数据在Makefile中为sinclude
。
我想在此元数据文件上删除其他目标(自动生成的文件)。如果dir中的“真实”代码文件列表发生更改,请更新此元数据文件,这将导致重新生成自动生成的文件(复数)。
我有一个元数据文件的规则,当该规则触发make
时正确重启。但我无法想象如何描述我想要的东西。我希望规则运行,但只考虑$ @,如果我实际触摸该文件已被更改。我无法使用dir的时间戳,因为自动生成文件A的行为会导致时间戳发生变化,这会触发重新生成文件B的需要,从而导致时间戳发生变化......
我觉得我错过了一些明显的东西,但我不能把手指放在它上面......
all: prep my-bin
# For demonstration purposes.
prep: real-code.foobar
real-code.foobar:
@touch real-code.foobar
my-bin: meta real-code.foobar genfile-A.foobar genfile-B.foobar genfile-C.foobar
touch $@
meta: .
F=$$(ls *.foobar | grep -v genfile); \
echo "FILES := $$F" > $@
sinclude meta
genfile-A.foobar: meta
touch $@
genfile-B.foobar: meta
touch $@
genfile-C.foobar: meta
touch $@
clean:
rm -f *.foobar my-bin meta
答案 0 :(得分:0)
您可以在Makefile开头的shell脚本中更新元数据:
$(shell ls *.foobar | grep -v genfile > meta.tmp; \
diff -q meta.tmp meta && mv meta.tmp meta || rm meta.tmp)
这样,meta的时间戳只有在更改后才会更新,并且在make决定运行哪些规则之前会更新(意味着meta的依赖关系不会自动重新运行)。
约翰