我想写一个看起来像这样的规则:
foo.out: (out of date if foo.in is newer than foo.out.stamp)
# update foo.out if and only if the new foo.out has different contents
# than the old foo.out (a change to foo.in may or may not change foo.out)
&& touch foo.out.stamp
我不能这样做:
foo.out.stamp: foo.in
# update foo.out if and only if the new foo.out has different contents
# than the old foo.out (a change to foo.in may or may not change foo.out)
&& touch foo.out.stamp
foo.out: foo.out.stamp
因为如果foo.in更改,但配方foo.out.stamp不变foo.out,make将始终foo.out视为已过期。
有没有办法写这种规则?
编辑:解释为什么我不无条件触摸foo.out:
我正在和瓦拉一起工作。Vala 编译过程如下所示:
- 对于每个
.vala文件,生成一个.vapi文件(类似于头文件)。 - 对于每个
.vala文件,生成一个.c文件(这需要将单个.vala文件和每个.vapi文件都提供给编译器) - 继续典型
.c -> .o -> executable/library过程。
对于第 1 步和第 2 步,Vala 编译器仅在.vapi/.c文件的内容已更改时才更新它。这是为了防止不必要的.c -> .o重新编译。
在 makefile 术语中:
- 如果文件自上次 Vala 编译器重新生成文件(不是上次修改文件)后已更改
.vapi,则该文件已过期。.vala.vapi.vapi - 如果自上次 Vala 编译器重新生成文件(不是上次修改文件)以来该文件或任何
.c文件已更改,则该文件已过期。.vala.vapi.c.c