为什么要用Makefile ,因为工程中的.c文件太多,因此用makefile作项目管理
uboot和linux kernel本质都是由很多c文件组成,都是由makefile来管理
有目标,有依赖,有命令
1.目标就是我们要生成的东西
2.依赖就是我们生成目标的原材料
3.命令就是加工方法
2.makefile的自动推导和通配符
%是makefile中的通配符,%.o代表所有以.o为结尾的文件
makefile是很聪明的东西,他有个依赖关系,比如说想要得到.bin文件,就必须得到.o,想要得到.o,就必须得到.S,所以,makefile就会先生成.S,然后再生成.o,最后生成.bin文件。
如果没找到,就会报错
2.变量的定义和使用,都没有变量类型,和shell一样,都是直接定义,引用变量时加$。
3. .PHONY是什么意思
伪目标意思是这个目标并不代表一个文件,执行这个目标不是为了得到某个东西,而是单纯为了执行这条目标下面的指令。
伪目标一般都没有依赖,既然一定要执行命令了,就不要加依赖(无条件执行) 伪目标前面可以加.PHONY来声明它是伪目标。
仅仅是为了好看而已。
4.makefile中引用其他makefile
用include来引用其他makefile include/config.mk
5.makefile补充学习
makefile前面的@表示静默执行
前面加@表示静默执行,不把命令本身打印出来
6.makefile的几种赋值运算符
?= 表示前面变量如果已经被赋值,那么就不用执行下面的命令,没有被赋值就是这个变量没有被命令
+=就是把原来的值加到原来的值后面,类似于strcat,两段文字之间会自动加空格
=如果用该号赋值,那么这个变量的值取决于最后一次赋给他的值
:=如果用这个来赋值,就会就地直接解析
makefile不要求=两边有空格
3.makefile的环境变量
makefile用export导出的就是环境变量,一般情况下环境变量名要大写,
环境变量是工程中所有makefile可以刚享的变量,定义一个环境变量会影响别人的,导出就是
makefile中可能有一些环境变量是makefile本身自己内部定义的,我们在make时传给环境变量的值优先级最高
编译器预定的宏 _LINE_ _FUNCTION_
4.makefile中使用通配符
1.* 表示任意字符
echo *.c
2.? 代表一个任意字符
3.[]将中括号里面的值进行匹配
4.%为规则通配符
makefile的自动变量
常见自动变量
$@ 直接等于目标 all
$< 等于依赖文件的第一个 如果在规则里面用,就又变成所有的了
$^ 等于依赖文件的集合