(一)Makefile学习
意义:项目管理,方便编译连接。用于大项目:uboot和linux kernel,都有很多个文件组成,因此都要通过Makefile来管理。所以要分析uboot必须对Makefile了解。
一、Makefile的组成与使用
Makefile由:目标、依赖、命令组成;
目标:就是生成的东西。
依赖:原材料。
命令:加工方法。
命令就是加工方法,所以用make
如:
exe(目标): a.c b.c(依赖)
gcc a.c b.c -o exe(命令)
Makefile中定义和使用变量,和shell脚本非常相似。不需要变量的类型,可直接定义使用。引用变量时候用$加变量名。
如:
自动推导是makefile的规则,当makefile需要某一个目标时候,他会把这个目标去套规则说明,一旦套上了某个规则说明则makefile会试图寻找这个规则中的依赖,如果能找到则会执行这个规则,用会生成目标。没找到规则作废。
要注意的一些点:
1、命令前面一定是Tab,不能是顶格,也不能说多个空格。命令就是要生成那 个目标需要做的动作。
2、%:是Makefile中的通配符,代表一个或几个自媒。也就是说%.o代表所有以.o为结尾的文件。
3、makefile的文件名合法的一般有2个:Makefile或者makefile。
二、伪目标(.PHONY)
伪目标的意思是这个目标本身不是一个文件,执行这个目标不是为了得到某个文件或者东西,而是单纯为了执行这个目标下面的命令。并且伪目标一般没有依赖,因为执行这个伪目标就是为了执行下面命令(无条件执行),加不加都可以。伪目标可以直接写,不影响使用。但是有时候为了明确声明,会在前面用(.PHONY)来明确声明他。
如:
(加不加这个.PHONY都可以)
三、多个Makefile
有时候makefile比较复杂,分成好几个makefile来写,用include来引用其他的,原地展开,和c语言的头文件包含非常相似。
Makefile注释用#
在makefile的命令行中静默执行用@
在默认情况下在执行一行命令前会把这行命令打印出来再执行这个命令,如果不想看到命令本身只想看到命令执行则可以用静默执行。
如:
四、makefile的赋值
= 用等号写:是从后往前数,被解析时他的值取决于最后一次引用的值,变量的值不能只往看看还要往后看。
:= 的赋值则是就地直接解析(解析谁考虑谁是不是冒号等号)
?= 如果变量前面并没有赋值过则执行这条赋值,如果前面已经赋值过了则本行被忽略
+= 把这此的值加到原来的值后面,相当于append
五、makefile环境变量
makefile全局变量(环境变量)大写。普通变量用小写。用export导出的就是环境变量。
环境变量和普通变量不同,可以这样理解:环境变量类似于整个工程中所有Makefile之间可以共享的全局变量,而普通变量只是当前版本Makefile
中使用的局部变量。所以要注意:定义了一个环境变量会影响到工程中别的Makefile文件,因此要小心!!!
Makefile中有些环境变量可能是makefile本身自己定义的内部的环境变量或者是当前的执行环境提供的环境变量(例如我们在make执行给makefile
传参。 make CC=arm-linux-gcc,其实就是给当前的Makefile传了一个环境变量CC,值是arm-linux-gcc)
我们在make时候给makefile传的值的优先级是最高的
六、Makefile中使用通配符
“*”:前面是任意字符都可以
如:
“? ” 一个任意字符
如:
“ [] ”
如:
七、Makefile中的自动变量
为什么使用自动变量。在有些情况下文件集合特别多,描述时候很麻烦,所以makefile就用一些特殊的符号来替代某种条件的文件集,这就形成了自动变量。
如:
用$开头的符号表示特殊含义。$@在这里表示%.o
![](https://i-blog.csdnimg.cn/blog_migrate/9b9b1a7e7215276b2585e80fd97f0081.png)