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