让我们想象一下,我有一个不产生基于文件系统的一些其他文件的文件,但一些外部命令的输出可能会或可能不会改变。我可以在makefile中表达这个概念,并且只有在内容实际改变时才运行相关目标。生成文件重新编译只有当它的依赖实际上改变
具体的,我有一个文件date.h
其中有当前的日期,小时和分钟(而不是秒),这是由规则产生这样的:
echo "#define DATE" '"' $$(date '+%D-%H:%M') '"' > date.h
默认的“应用”目标依赖在date.h
和整个Makefile文件看起来像:
app: date.h
echo "Building app"
touch app
date.h: FORCE
echo "#define DATE" '"' $$(date '+%D-%H:%M') '"' > date.h
FORCE:
现在FORCE
目标造成date.h
要重建每一次,这将导致app
永远是过时的,并得到重修。另一方面,如果我不包含FORCE
目标,那么date.h
只有在不存在的情况下才会被重建(例如,在清理之后或初始克隆项目之后),但不会在之后再次重建。
我想要的只是如果date.h的内容实际上被echo
更改了 - 也就是说,当分钟发生变化时,但不是其他情况。有没有办法告诉make只考虑date.h
如果其实际字节在磁盘上发生更改,而不是按时间戳或另一种方式来实现此效果,则会发生更改?
回复日期到一个临时文件,然后有条件地更新date.h
基于比较他们的内容跨过我的脑海,但我不知道这是否是一个合理的方法。
这最后一句听起来像一个合理的办法给我。你必须每次执行'echo',Make看看文件修改时间,而不是内容,所以如果你想使用Make,我认为你必须这样做。 – Beta
通常的方法就像你描述的一样。生成文件作为临时文件,检查是否更改,如果是这样,用临时文件替换目标。海湾合作委员会为此目的有一个“如果改变”的脚本。 –
我可能表明,具有类似于在一个字符串/文件/编译时间的日变化项目是在其本身的错误。您应该改用版本标签。无论什么时候改变,版本标签都会改变。噗!突然间,这变成了一个非问题,你的Makefile可以小而性感,没有你现在正在思考的扭曲。 – Jens