所以我有一个makefile,并且该makefile是一个规则,它首先执行预编译转换并修改源文件,然后将其编译为正确的目标。我想知道是否有办法欺骗/强制make认为源实际上没有被修改,因此make只会在用户修改时重新编译,而不是在make规则修改源时重新编译。我尝试使用touch
命令在修改后转回修改时间戳,但没有成功。有没有人有任何想法?感谢。
答案 0 :(得分:1)
实现目标的一种可能方法是创建一个辅助目标 - 这是一个零长度文件,就像一个标志,表示你是否已经完成了你想做的事情或不,并且具有基于该文件进行预编译转换的规则。
我想我对你要做的事情有疑问。为什么转换就地,而不是让转换创建一个中间文件然后被编译。
就地转换可能会有问题,特别是如果转换过程不是幂等的。
修改1
根据你的问题,我会说你可以这样做:
target.flag: target.original-file
touch target.save -r target.original-file
<do transformation>
touch target.original-file -r target.save
rm target.save
touch target.flag
使用带有“-r”选项的touch表示从指定文件中获取访问日期。因此,您将在临时文件中保存原始文件的日期。然后进行转换,然后使用touch从临时文件中获取日期并将其重新放回现在已转换的文件。
答案 1 :(得分:0)
这个怎么样:
foo.target: foo.source
$(TRANSFORM) $<
$(COMPILE) $<