我想写一个看起来像这样的规则:
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