首先,意识到 make 不是在运行程序。make 文件是一组推理规则。
你告诉 make 如何将一件事变成另一件事,然后给它一个目标。然后它将您的推理规则组合在一起以找出步骤,并在此过程中检查文件上的时间戳以确保它不会重复不必要的工作。
SUFFIXES 告诉 make 应该在文件上识别哪些后缀。
列出两个后缀的规则: .co 表示将带有 .c 后缀的 SINGLE 文件转换为带有 .o 后缀的 SINGLE FILE 的规则。
cc -c x.c
构建 xo 所以,
.c.o:
<TAB>cc -c $<
说“获取 $< 中的任何源文件,并使用此命令将其转换为 .o 文件”
然后你可以制定这样的规则:
mycmd: x.o y.o z.o
<TAB>cc -o $@ $^
如果当前目录中有三个 c 文件(xc、yc 和 zc),make 将能够推断出当您要制作 mycmd 时,它需要 .o 文件,并且它知道可以从.c,所以它会的。
特殊变量定义在这里:http ://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html
因此,当您键入(在命令行)时:
make mycmd
make 浏览规则列表并看到: 哦,要做到这一点,我需要 xo、yo 和 zo 然后它进入磁盘。假设它找到了 xc、xo、yc 和 zc 现在它认为:
我有 xo ..但是 .o 文件是由 .c 文件制成的...我应该检查源是否已更改。它检查时间戳,如果 .c 文件比 .o 文件新,它会重建它。
对于 yc 和 zc,它知道可以使用 cc 将它们转换为 .o 文件。
假设 xo 比 xc 更新,make 将:
cc -c y.c
cc -c z.c
cc -o myprog x.o y.o z.o
如果您再次运行 make,它会执行相同的步骤,但这次发现 myprog 比所有 .o 文件都新,而所有 .o 文件都比 .c 文件新……所以它什么也不做。
现在,假设您编辑 xc 并再次运行 make:它将再次检查整个序列,发现 xc 比 xo 新,因此它将重建它,然后它会注意到 mycmd 现在比 xo 旧,所以它会重新链接它。
因此,对于一组非常短的规则,您可以为您完成很多工作。