neu*_*cer 31 c gcc makefile compilation
我注意到,当我对某些文件进行更改然后输入make时,它将运行与这些文件相关的某些命令.如果我没有改变任何东西,那么make不做任何事情,说该程序是最新的.这告诉我make有一种方法可以知道自上次运行以来哪些文件已被更改.怎么知道的?它似乎没有在运行它的目录中放置任何内容,因此它必须将此信息存储在其他位置.
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
确实有点棘手,因为可能存在多个先决条件链,而这些先决条件链本身可以以任意方式交叉链接.
那么," 它怎么知道? " 的答案是:
stat(2)
是获取修改时间的文件你是对的,make
通常不会留下任何类型的cookie或其他状态跟踪文件.(有时候一些Makefile会自己创建时间戳cookie,但这种情况很少见.)但这并不重要,毕竟最后一次Make运行可能不会成功.它的作用是简单地将目标文件的日期与源文件上的日期进行比较.它只关心目标是否是最新的,它通常不会考虑make
上次运行的时间.