这样的方法非常有用,我
们可以在一个 makele 中定义不用的编译或是和编译无关的命令,比如程序
的打包,程序的备份,等
等。
1.3 make 是如何工作的
在默认的方式下,也就是我们只输入 make 命令。那么,
1. make 会在当前目录下找名字叫“Makele”或“makele”的文件。
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 只管文件的依赖性,
即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我
就不工作啦。
通过上述分析,我们知道,像 clean 这种,没有被第一个目标文件直接或间接
关联,那么它后面所定义
的命令将不会被自动执行,不过,我们可以显示要 make 执行。即命令——
“make clean”,以此来
清除所有的目标文件,以便重编译。
于是在我们编程中,如果这个工程已被编译过了,当我们修改了其中一个源文
件,比如 le.c,那么根
据我们的依赖性,我们的目标 le.o 会被重编译(也就是在这个依性关系后面
所定义的命令),于是
le.o 的文件也是最新的啦,于是 le.o 的文件修改时间要比 edit 要新,所以