uboot之Makefile学习
来源:互联网 发布:伪娘 知乎 编辑:程序博客网 时间:2024/05/16 17:51
1、Makefiel的作用及意义:
Makefiel主要用于管理C语言的工程文件,如同EDA一样,这不过这里是通过Makefile这个文件来管理这个歌工程文件的。相对于传统EDA而言更见灵活也可以随时对文件进行必要的处理。这里主要用与uboot和Liunx
2、Makefile的用法:
1)Makefile的文件名一般是Makefile或makefile
2)Makefile主要由目标,依赖,命令这几部分组成的。
·目标:目标就是我们要去make xxx,这个xxx就是我们最终要生成的东西。如:对C文件的make会生成目标文件,然后再给我们去执行。
·依赖:依赖就是要生成这个文件所需的原材料。就像是.h文件对于.c文件一样重要。
·命令:命令就是加工方法。我们可以通过Makefile来选择将我们写的C程序如何生成我们想要的如.bin .o 或 .s 文件。
3)伪目标(.PHONY):
·伪目标的意思是这个目标本身不代表一个文件,执行这个目标不是为了得到某个文件或东西,而是单纯的为了执行这个目标下面的命令。
·伪目标一般没有依赖,因为伪目标就是为了执行目标下面的命令。而没有依赖实际上就是无条件执行下面的命令。
·伪目标可以直接写,而不用加说明。但是,有时为了明确声明这个目标是伪目标,会再他的前面加上.PHONY来声明它是为目标。
4)环境变量:
·makefile中用export导出的就是环境变量。一般情况下,环境变量要大写,普通变量要小写。
·环境变量和普通变量是不同的。环境变量在整个Makefile中都具有作用(即使是引用了其他的Makefile),而普通变量只有在当前的Makefile中起作用。可以将环境变量理解为C语言中的全局变量,而普通变量理解为C语言中的局部变量。因此,定义全局变量的时候要小心了。
·Makefile中的环境变量可以是在写Makefile时在文件内定义的,也可以是我们在执行的时候传递进去的。例如:make CC=liunx-arm-gcc,在这里,CC是makefile中定义的一个环境变量,而后面的linux-arm-gcc则是我们现场传递进去的一个值,而这个现场传递进去的值可以直接覆盖内部CC原本的值。
5)自动变量:
·有时候Makefile里面的变量名字太多了,而我们为了方便起见,都统一规定了一个名字,用它来代替符合某种条件的变量的文件集。Makefile其实可以不用自动变量的,但是,为了方便起见还是用了比较好。
·自动变量其实就是预定义了特殊意义的符号而已。
3、Makefile语法规则:
1)Makefile中定义和使用变量。Makefile和shell中定义和使用变量几乎是一样都,都是直接定义并赋值的,也是通过$符号来使用变量的如:$var
2)Makefile的注释用 #,和uboot是一样的。
3)Makefile中引用其他的Makefile用include指令,这里的include指令其实就是将要引用Makefile原地展开,和C语言中的include头文件十分相似。
4)Makefile中的符号应用:
符号
说明
用法
#
注释使用
#注释内容(和shell类似)
$
引用变量
$变量名
@
静默执行
使用它可以是命令执行过程不显示出来。
@echo "hello",
使用前执行:
echo "hello"
hello
使用后执行:
hello
>
创建一个文件
echo "ARCH = $2" > config.mk
>>
追加文件内容
echo "CPU = $3" >> config.mk
=
赋值(赋的是变量最后一次引用的值)
a="abc"
b=$a
a="fgh"
all:
@echo $b
输出:fgh
:=
赋值(赋的是变量引用前一直的值)
a="abc"
b:=$a
a="fgh"
all:
@echo $b
输出:abc
?=
如果变量没有赋值,则执行这条赋值,否则跳过这条赋值。
a = "a"
b = "b"
c = "c"
c ?= $a;
all:
@echo $c
输出:c
+=
用来给赋值变量连续赋值的。
a = "a"
c = "c"
c += $a;
all:
@echo $c
输出:c a
注意:c和a之间有空格
``
用于执行相应的命令
也可以用$(shell命令)代替
`命令`等价于$(shell命令)
var=`pwd`
all:
echo $(var)
输出:
文件的路径,相当于执行了这个pwd的命令
*
任意字符(通配符)
*.c代表 以.c结尾的文件
?
第一字符(通配符)
[]
选择匹配(通配符)
[123].c表示只含有1,1,3这三个关键字的 .c文件。注意:123之间不能包含空格
{}
()
用于执行括号内部的命令
= $(shell xxx xxx)
此时相当于我们直接执行()内部的shell命令,前面用$相当于将其当作一个变量去解析了。
%
只能用于描述规则的时候(规则通配符)
%.o : %.s将.o文件全变成 .s文件。
$@
(自动变量)规则的目标文件名
$@直接可以替换掉目标(使用方便)
$<
(自动变量)规则的依赖文件名
$^
(自动变量)依赖的文件集合
5)关键字:
all:
依赖,后面跟的是目标文件,表示将
export
- uboot之makefile学习
- uboot之makefile学习
- uboot之Makefile学习
- uboot之makefile学习(配置)
- uboot之makefile学习(配置)
- uboot 学习 Makefile分析
- Uboot 之Makefile 分析
- uboot之Makefile分析
- uboot makefile 之make
- Uboot 之Makefile 分析
- uboot之Makefile分析
- uboot makefile 之make
- uboot之Makefile分析
- Uboot 之Makefile 分析
- uboot makefile 之make
- Uboot 之Makefile 分析
- uboot分析之Makefile
- uboot之makefile源码
- iOS中使用NSSerialization把对象转为JSON字符串后,多出来反斜杠的问题
- intent的startActivityForResult及appcan jar 中 oncallback 方法的使用
- php后台查询结果赋值给前台js的一位数组
- 【DragonBones】为什么我的DragonBones改变了资源库的图片名称,会出现提示
- 中端智能机应主打什么?C9 Pro告诉你!
- uboot之Makefile学习
- Android 的线程(AsyncTask、HandlerThread、IntentService详解)和线程池
- 激光雷达与 D1 的坐标校正
- RBAC基于角色的权限控制
- Codeforces 743D Chloe and pleasant prizes 树型dp
- Python下用于监视文件系统的pyinotify包
- DialogFragment使用中show()方法遇到的IllegalStateException
- [kpw] Kindle Paperwhite 升级到 5.6.5 后,kterm无法启动
- Saitama Destroys Hotel CodeForces - 608A