blah: blah.o
cc blah.o -o blah # Runs third
blah.o: blah.c
cc -c blah.c -o blah.o # Runs second
blah.c:
echo "int main() { return 0; }" > blah.c # Runs first
当我运行make
命令时,它给出了预期的输出。现在,如果我运行touch
blah.c 文件,输出为cc -c blah.c -o blah.o cc blah.o -o blah
,但是当我运行delete
blah.c 文件时,它继续创建它并且输出为echo "int main() {return 0; }" > blah.c cc -c blah.c -o blah.o cc blah.o -o blah
。
现在我无法理解的是,“blah”如何知道 blah.c 不可用。它只是检查了 blah.o,其时间戳没有改变。是不是 blah.o 自己在被“blah”检查时检查了 blah.c 是否有任何更新。无论如何,为什么两个输出不同。是不是touch
ing 文件 blah.c 并没有删除它,而 blah.o 知道这一点,所以它只是更新了它的时间戳。到底发生了什么?
好的:回答有关删除或触摸文件的实际问题:
当您
touch
编辑文件(或通过编辑、从存储库下载源代码、修补文件等方式更新文件)时,它会变得比任何其他文件都新。make
然后,运行将执行受该情况影响的命令,并确保按照依赖关系树确定的顺序评估每个依赖关系。当您处理
delete
文件时,它将被视为无限旧(或可能是 01-Jan-1970 00:00:00)。运行make
将执行受该不同情况影响的任何规则。make
将修复 Makefile 选择的所有内容。例如,如果您更改了.h
在十八个文件中的七个中提到的文件.c
(并且相应的规则是正确的),make
则将运行这七个文件的编译.c
,以及任何依赖于其文件的规则.o
。您的依赖项行
blah.c
未列出任何依赖项,因此 make 没有文件可以与之比较以决定是否重建它。因此,只有当它不存在时,它才会重建它。由于创建 blah.c 的所有内容都在 makefile 本身中,因此我建议将 makfile 作为依赖项。
然后,每次您编辑(或触摸)Makefile 时,它都会重建 blah.c。
为了更加花哨,不要直接写入 blah.c,而是直接写入 blah.c.new,如果它们不同,则替换 blah.c,如果它们相同,则删除 blah.c.new