Makefile规则,可以选择更新输出

时间:2016-05-31 06:08:01

标签: makefile gnu-make

我有一个元数据点文件,我和我的代码一起存储(在一个大项目的每个目录中)。此元数据文件具有每个目录中满足特定约束(不是自动生成)的文件列表。此元数据在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

1 个答案:

答案 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的依赖关系不会自动重新运行)。

约翰