Skip to content

Commit 326e224

Browse files
committed
对makefile规则的大致介绍及其解析
1 parent 3e32eda commit 326e224

1 file changed

Lines changed: 78 additions & 0 deletions

File tree

kernel/c.kernel-makefile

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,83 @@ kbuild Makefiles 内核源代码的各个子目录都包含了与特定驱动程
1818
顶层的Makefile文本上包括了一个在arch/$(ARCH)/Makefile的架构Makefile文件,这个架
1919
够Makefile文件向顶层的Makefile提供了具体的架构信息.
2020

21+
22+
makefile的作用
23+
--------------
24+
25+
在一个kernel中这样的大工程中,如何去编译这个工程?应该make,是的.为什么一条make命
26+
令就能够做到?其实make命令的背后是许多的makefile在为make命令出谋划策,makefile作
27+
为路线图指导make编译的每一个步骤.
28+
29+
make是一个命令工具,是一个解释makefile文件中指令的命令工具.make作为makefile这个
30+
语法文件的解释器在工作.makefile的语法是一种在工程方面的编译方法,以告诉make命令
31+
需要怎样去编译和链接目标程序.
32+
33+
makefile给这个大工程带来的是自动化编译kernel.
34+
35+
36+
makefile规则介绍
37+
----------------
38+
39+
目标文件... : 依赖文件...
40+
命令
41+
...
42+
...
43+
44+
目标文件的生成依赖于其它的文件,按照规则执行相应的命令就能够生成目标文件所需的
45+
依赖文件.
46+
47+
makefile规则中,如果使用一个没有依赖只有命令行的双冒号规则去更新一个文件,那么每
48+
次执行make时,此规则的目标文件将会被无条件的更新(即此规则定义的命令会被无条件执
49+
行).
50+
51+
通常我们在工程中会遇到,其中一个(makefile-A)需要使用另外一个(makefile-B)中所定
52+
义的变量和规则.这时候用include(用来包含其它文件)并不保险,因为这两个文件可能存
53+
在规则重复定义的问题.如下可解决问题:
54+
55+
#sample GUNmakefile
56+
foo:
57+
frobnicate > foo
58+
%:force
59+
@$(MAKE) -f Makefile $@
60+
force:;
61+
62+
63+
makefile清除规则
64+
----------------
65+
66+
清除当前目录中编译过程中产生的临时文件的规则
67+
68+
clean :
69+
rm edit $(objects)
70+
71+
也可以如下这样写让清除工作不会出现任何差错
72+
73+
.PHONY : clean
74+
clean :
75+
-rm edit $(objects)
76+
77+
有两个不同点:
78+
1)通过.PHONY特殊目标将clean目标声明为伪目标.避免当磁盘上存在一个名为clean文件
79+
时,目标clean所在的规则的命令无法执行.
80+
2)在命令之前使用"-",意思是忽略命令rm的执行错误.
81+
82+
这样的一个目标在makefile中,不能将其作为终极目标(makefile的第一个目标).因为我们
83+
的初衷并不是在命令行上输入make以后执行删除动作,而是要创建或者更新程序.
84+
85+
86+
make如何解析makefile文件
87+
------------------------
88+
89+
分为两个阶段
90+
91+
第一阶段:读取所有的makefile文件(包括指示符"include"指定的,以及命令行选项"-f"指
92+
定的makefile文件),内建所有的变量,明确规则和隐含规则,并建立所有目标和依赖之间的
93+
依赖关系结构链表.
94+
95+
第二阶段:根据第一阶段已经建立的依赖关系结构链表决定哪些目标需要更新和创建,并使
96+
用对应的规则来重建这些目标.
97+
98+
2199
==============================================================================
22100
==============================================================================

0 commit comments

Comments
 (0)