uboot之Makefile学习

1Makefiel的作用及意义:

Makefiel主要用于管理C语言的工程文件,如同EDA一样,这不过这里是通过Makefile这个文件来管理这个歌工程文件的。相对于传统EDA而言更见灵活也可以随时对文件进行必要的处理。这里主要用与ubootLiunx

 

2Makefile的用法:

1)Makefile的文件名一般是Makefilemakefile

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,在这里,CCmakefile中定义的一个环境变量,而后面的linux-arm-gcc则是我们现场传递进去的一个值,而这个现场传递进去的值可以直接覆盖内部CC原本的值。

5)自动变量:

·有时候Makefile里面的变量名字太多了,而我们为了方便起见,都统一规定了一个名字,用它来代替符合某种条件的变量的文件集。Makefile其实可以不用自动变量的,但是,为了方便起见还是用了比较好。

·自动变量其实就是预定义了特殊意义的符号而已。

 

3Makefile语法规则:

1Makefile中定义和使用变量。Makefileshell中定义和使用变量几乎是一样都,都是直接定义并赋值的,也是通过$符号来使用变量的 如:$var

2Makefile的注释用 # ,和uboot是一样的。

3Makefile中引用其他的Makefileinclude指令,这里的include指令其实就是将要引用Makefile原地展开,和C语言中的include头文件十分相似。

4Makefile中的符号应用:

符号

说明

用法

#

注释使用

#注释内容(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

注意:ca之间有空格

``

用于执行相应的命令

也可以用$(shell 命令)代替

`命令`等价于$(shell 命令)

var=`pwd`

all:

    echo $(var)

输出:

文件的路径,相当于执行了这个pwd的命令

*

任意字符(通配符)

*.c 代表 .c结尾的文件

?

第一字符(通配符)

 

[]

选择匹配(通配符)

[123].c 表示只含有113这三个关键字的 .c文件。注意:123之间不能包含空格

{}

 

 

()

用于执行括号内部的命令

 = $(shell xxx xxx)

此时相当于我们直接执行()内部的shell命令,前面用$相当于将其当作一个变量去解析了。

%

只能用于描述规则的时候(规则通配符)

%.o : %.s .o文件全变成 .s文件。

$@

(自动变量)规则的目标文件名

$@ 直接可以替换掉目标(使用方便)

$<

(自动变量)规则的依赖文件名

 

$^

(自动变量)依赖的文件集合

 

 

5)关键字:

all:

依赖,后面跟的是目标文件,表示将

export

 

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_25827755/article/details/53672039