对前述例子, 在脚本所在目录直接输入命令“make”就可以生成最终目标edit。
(1)首先, Make 会在当前目录下按顺序找GNUmakefile, makefile 或Makefile 名字的文件。 如果找到, 它会以该脚本文件中的第一个目标(如上例的edit)作为最终的目标文件。如果不用默认的makefile 文件而是自己写脚本文件并命名为mymake, 可以执行命令makef mymake, 通过-f 参数指定mymake 为编译使用的makefile 文件。
(2)如果edit 文件不存在, 或edit 所依赖的.o 文件的文件修改时间比edit 文件新, 就会执行紧跟其后定义的命令来生成edit 文件。
(3)由于edit 所依赖的文件main.o、 kbd.o 等文件不存在, Make 会继续向下在当前目录中找这些.o 文件的依赖, 再根据其规则生成.o 文件。
(4)Make 一层一层地找文件的依赖关系, 子目标生成后再返回上一层目标的生成, 直到最终编译出默认的第一个目标文件, 从主目标向下找子目标、 找依赖, 再通过命令实现目标依次返回的过程是典型的递归返回。(www.daowen.com)
(5)在找寻依赖关系过程中, 如果出现错误, 如被依赖的文件找不到, 那么make 就会直接退出, 并报错。 如果是目标下定义的操作命令执行时出错, 并不会影响make 向下找依赖关系的执行。
(6)clean 这种没有被第一个目标文件直接或间接关联, 其后面定义的命令将不会被自动执行, 但我们可以通过“make clean”显式地执行生成该目标。 clean 是一种伪目标, 并不生成文件, 而是用于清除所有的目标文件, 以便重新编译。 每个Makefile 中都应写一个清空目标文件(.o 和执行文件)的规则, 这不仅便于重编译, 也利于保持文件的清洁。 要注意clean 规则一般放在文件末尾, 不要放在文件的开头, 不然, 这就会变成make 的默认目标。
(7)这个多文件组成的工程如果已被编译过, 修改其中一个源文件, 比如file.c, 那么根据依赖性, 目标file.o 会依据后面定义的命令被重编译, 而由于file.o 文件更新了, 于是依赖于file.o 的文件edit 也会被重新链接。 而如果我们改变了“command.h”, 那么,kdb.o、 command.o 和files.o 都会被重编译, 并且, edit 会被重链接, 这就是脚本规则提供的自动增量编译处理。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。