官方标准uboot移植3之Makefile概述

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangdapao12138/article/details/81610398

1.烧录步骤bash脚本的编写

我们需要更智能化的编写处理程序。

2.makefile文件的编写

2.1Makefile的作用和意义

1)工程项目中c文件太多管理不方便,因此用Makefile来做项目管理,方便编译链接过程。

2)uboot和linux kernel本质上都是C语言的项目,都由很多个文件组成,因此都需要通过Makefile来管理。所以要分析uboot必须对Makefile有所了解。

2.2目标、依赖、命令

1)目标就是我们要去make xxx的那个xxx,就是我们最终要生成的东西。目标顶格写,后面是冒号(冒号后面是依赖)

2)依赖是用来生成目标的原材料

3)命令就是加工方法,所以make xxx的过程其实就是使用命令将依赖加工成目标的过程。命令前面一定是Tab,不能是定格,也不能说多个空格。命令就是要生成那个目标需要做的动作。

all这个目标不产生任何东西,所以是伪目标,加上.PHONY。但目前的makefile版本很新,已经可以自动识别了,所以有时候可以不写。

伪目标(.PHONY

1)伪目标意思是这个目标本身不代表一个文件,执行这个目标不是为了得到某个文件或东西,而是单纯为了执行这个目标下面的命令。

2)伪目标一般都没有依赖,因为执行伪目标就是为了执行目标下面的命令。既然一定要执行命令了那就不必加依赖,因为不加依赖意思就是无条件执行。

3)伪目标可以直接写,不影响使用;但是有时候为了明确声明这个目标是伪目标会在伪目标的前面用.PHONY来明确声明它是伪目标。

2.3自动化变量的概念

1)为什么使用自动变量。在有些情况下文件集合中文件非常多,描述的时候很麻烦,所以我们Makefile就用一些特殊的符号来替代符合某种条件的文件集,这就形成了自动变量。

2)自动变量的含义:预定义的特殊意义的符号。就类似于C语言编译器中预制的那些宏__FILE__一样。

3)常见自动变量:

$@          所有的目标集合

$% 档案文件成员(archive file)结构中的文件名元素

$<   所有依赖文件中的第一个文件

$?   时间戳在工作目录(的时间戳)之后的所有依赖文件,并以空格隔开这些依赖文件

$^   所有依赖文件的文件名,并以空格隔开这些文件名。这份列表已删掉重复的文件名,因为对大多数的应用而言,比如编译,复制等,并不会用到重复的文件名

$+   如同$^,代表所有依赖文件的文件名,并以空格隔开这些文件名。不过,$+包含重复的文件名。此变量会中特殊的状态下被创建,比如将自变量传递给链接器(linker)时重复的值是有意义的。

$*   工作目标的主文件名。一个文件名称是由两个部分组成:主文件名(stem)和扩展名(suffix)。请不要中模式规则以外使用此变量。

2.4.通配符

1)*   若干个任意字符

2)?   1个任意字符

3)[]  []中的字符依次去和外面的结合匹配

4)%  也是通配符,表示任意多个字符,和*很相似,但是%一般只用于规则描述中,又叫做规则通配符。

关于通配符,Makefile还有一些wildcard等比较复杂的通配符用法,具体参考《跟我一起学Makefile》即可。

2.5 加上依赖和目标指令

2.6 Makefile中的注释用#

Makefile中注释使用#,和shell一样。

命令前面的@用来静默执行

1)makefile的命令行中前面的@表示静默执行。

2)Makefile中默认情况下在执行一行命令前会先把这行命令给打印出来,然后再执行这行命令。

3)如果你不想看到命令本身,只想看到命令执行就静默执行即可。

2.7Makefile中几种变量赋值运算符

1)=   最简单的赋值

2):= 一般也是赋值

以上这两个大部分情况下效果是一样的,但是有时候不一样。

=赋值的变量,在被解析时他的值取决于最后一次赋值时的值,所以你看变量引用的值时不能只往前面看,还要往后面看。

:=来赋值的,则是就地直接解析,只用往前看即可。

3)?= 如果变量前面并没有赋值过则执行这条赋值,如果前面已经赋值过了则本行被忽略。(实验可以看出:所谓的没有赋值过其实就是这个变量没有被定义过)

4)+=      用来给一个已经赋值的变量接续赋值,意思就是把这次的值加到原来的值的后面,有点类似于strcat。(在shell makefile等文件中,可以认为所有变量都是字符串,+=就相当于给字符串stcat接续内容)(注意一个细节,+=续接的内容和原来的内容之间会自动加一个空格隔开)

注意:Makefile中并不要求赋值运算符两边一定要有空格或者无空格,这一点比shell的格式要求要松一些。

2.8 Makefile的环境变量

1)makefile中用export导出的就是环境变量。一般情况下要求环境变量名用大写,普通变量名用小写。

2)环境变量和普通变量不同,可以这样理解:环境变量类似于整个工程中所有Makefile之间可以共享的全局变量,而普通变量只是当前本Makefile中使用的局部变量。所以要注意:定义了一个环境变量会影响到工程中别的Makefile文件,因此要小心。

3)Makefile中可能有一些环境变量可能是makefile本身自己定义的内部的环境变量或者是当前的执行环境提供的环境变量(譬如我们在make执行时给makefile传参。make CC=arm-linux-gcc,其实就是给当前Makefile传了一个环境变量CC,值是arm-linux-gcc。我们在make时给makefile传的环境变量值优先级最高的,可以覆盖makefile中的赋值)。这就好像C语言中编译器预定义的宏__LINE__ __FUNCTION__等一样。

猜你喜欢

转载自blog.csdn.net/wangdapao12138/article/details/81610398
今日推荐