在默认方式下,只输入make命令。其会做如下工作:
make会在当前目录下找名字为“Makefile文件”或“makefile文件”的文件。如果找到,它会找文件中的第一个目标文件(target)。在上面的例子中,它会找到makefiletest这个文件,并把test作为最终的目标文件;如果test文件不存在,或是test所依赖的后面的 .o 文件的修改时间要比test这个文件新,它就会执行后面所定义的命令来生成test文件。
如果test所依赖的.o文件也存在,make会在当前文件中找目标为.o文件的依赖性,如果找到,则会根据规则生成.o文件(这有点像一个堆栈的过程)。
当然,C文件和H文件如果存在,make会生成 .o 文件,然后再用 .o 文件生成make的最终结果,也就是执行文件test。
这就是整个 make 的依赖性, make 会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到, make 就会直接退出,并报错。而对于所定义的命令的错误,或是编译不成功, make 就不会处理。如果在 make 找到了依赖关系之后,冒号后面的文件不存在, make 仍不工作通过上述分析,可以看出像clean这样没有被第一个目标文件直接或间接关联时,它后面所定义的命令将不会被自动执行,不过,可以显式使make执行。即使用命令make clean,以此来清除所有的目标文件,并重新编译。
在编程中,如果这个工程已被编译过了,当修改了其中一个源文件时,比如test.c,根据依赖性,目标test.o会被重新编译(也就是在这个依赖性关系后面所定义的命令),则test.o文件也是最新的,即test.o文件的修改时间要比test要新,所以test也会被重新连接了。
3 定义变量:.PHONY : clean
clean :
-rm test.o test
include <filename>
filename可以是当前操作系统Shell的文件模式(可以保含路径和通配符)。在include前面可以有一些空字符,但是绝不能以[Tab]键开始。include和<filename>可以用一个或多个空格隔开。举个例子,有这样几个makefile文件:a.mk、b.mk、c.mk,还有一个文件叫foo.make,以及一个变量$(bar),其包含了e.mk和f.mk,下面的语句:
include foo.make *.mk $(bar)
等价于:
include foo.make a.mk b.mk c.mk e.mk f.mk
10 -include和sinclude 都可以ignore error,(1) 读入所有的makefile文件。
(2) 读入被include包括的其他makefile文件。
(3) 初始化文件中的变量。
(4) 推导隐式规则,并分析所有规则。
(5) 为所有的目标文件创建依赖关系链。
(6) 根据依赖关系,决定哪些目标要重新生成。
(7) 执行生成命令。
12.转义字符与通配符