如何知道要更新哪些文件

neu*_*cer 31 c gcc makefile compilation

我注意到,当我对某些文件进行更改然后输入make时,它将运行与这些文件相关的某些命令.如果我没有改变任何东西,那么make不做任何事情,说该程序是最新的.这告诉我make有一种方法可以知道自上次运行以来哪些文件已被更改.怎么知道的?它似乎没有在运行它的目录中放置任何内容,因此它必须将此信息存储在其他位置.

unw*_*ind 28

它检查文件系统的修改日期元信息.

见,例如,STAT()手册页st_mtime成员struct stat.

它具有内置规则,告诉它(例如)如果相应的.c文件已更改,则需要重新生成.o文件; 规则语法手册部分说:

过时的标准是根据先决条件指定的,前提条件包括由空格分隔的文件名.(此处也允许使用通配符和存档成员(请参阅存档).)如果目标不存在或者它比任何先决条件(通过比较最后修改时间)更旧,则目标已过期.


caf*_*caf 14

make确定是否需要重建目标文件X,方法是检查其修改时间(记录在文件系统中)是否比其任何依赖项更旧.例如,如果您有一个make规则,例如:

foo.o: foo.c foo.h common.h
Run Code Online (Sandbox Code Playgroud)

然后它知道它需要重建,foo.o如果有的话foo.c,foo.h或者common.h有更新的修改时间foo.o.这意味着执行touch common.h将强制foo.o在下一个make重建.

这意味着make如果修改时间不可靠则可能会混淆 - 例如,如果系统时钟向后跳跃,或者您将文件存储在某些网络文件系统上并且有多个客户端访问它们(特别是如果各种机器上的时钟)在您的网络上不同步).如果您正在使用make通过网络分发的文件,通常最好运行NTP以正确设置时钟.


Dig*_*oss 14

Make比它在表面上看起来要复杂得多.它有一个带有复杂算法的推理引擎; 当与您的配置数据结合时,make是一种程序+数据库,称为专家系统.

无论如何,为了回答你的问题,检查make确实有点棘手,因为可能存在多个先决条件链,而这些先决条件链本身可以以任意方式交叉链接.

那么," 它怎么知道? " 的答案是:

  • make stat(2)是获取修改时间的文件
  • make然后在Makefile中生成的图形上进行拓扑排序

你是对的,make通常不会留下任何类型的cookie或其他状态跟踪文件.(有时候一些Makefile会自己创建时间戳cookie,但这种情况很少见.)但这并不重要,毕竟最后一次Make运行可能不会成功.它的作用是简单地将目标文件的日期与源文件上的日期进行比较.它只关心目标是否是最新的,它通常不会考虑make上次运行的时间.