依赖文件 (prerequisites)就是冒号后面的那些 .c 文件和 .h 文件。每一个 .o 文件都有
一组依赖文件,而这些 .o 文件又是执行文件 edit 的依赖文件。依赖关系的实质上就
是说明了目标文件是由哪些文件生成的,换言之,目标文件是哪些文件更新的。
在定义好依赖关系后, 后续的那一行定义了如何生成目标文件的操作系统命令, 一
定要以一个 Tab键作为开头。记住, make并不管命令是怎么工作的,他只管执行所定
义的命令。 make会比较 targets文件和 prerequisites文件的修改日期, 如果 prerequisites
文件的日期要比 targets文件的日期要新,或者 target不存在的话,那么, make就会
执行后续定义的命令。
这里要说明一点的是, clean 不是一个文件,它只不过是一个动作名字,有点像 C
语言中的 lable 一样,其冒号后什么也没有, 那么,make就不会自动去找文件的依赖性,
也就不会自动执行其后所定义的命令。要执行其后的命令,就要在 make命令后明显得
指出这个 lable 的名字。这样的方法非常有用,我们可以在一个 makefile 中定义不用的
编译或是和编译无关的命令,比如程序的打包,程序的备份,等等。
1.3 make是如何工作的
在默认的方式下,也就是我们只输入 make命令。那么,
1. make会在当前目录下找名字叫“ Makefile ”或“ makefile”的文件。
2. 如果找到,它会找文件中的第一个目标文件 (target),在上面的例子中,
他会找到“ edit”这个文件,并把这个文件作为最终的目标文件。
3. 如果 edit 文件不存在,或是 edit 所依赖的后面的 .o 文件的文件修改时
间要比 edit 这个文件新,那么,他就会执行后面所定义的命令来生成 edit 这个文件。
4. 如果 edit所依赖的 .o 文件也存在,那么 make会在当前文件中找目标为 .o
文件的依赖性, 如果找到则再根据那一个规则生成 .o 文件。(这有点像一个堆栈的过程)
5. 当然,你的 C 文件和 H 文件是存在的, 于是 make会生成 .o 文件,然
后再用 .o 文件声明 make的终极任务,也就是执行文件 edit 了。
这就是整个 make的依赖性, make会一层又一层地去找文件的依赖关系, 直到最终
编译出第一个目标文件。 在找寻的过程中, 如果出现错误, 比如最后被依赖的文件找不
到,那么 make就会直接退出, 并报错, 而对于所定义的命令的错误, 或是编译不成功,
make根本不理。 make 只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面