Makefile基础入门(回顾版)

Makefile基础回顾

目标,依赖,命令

uboot和Linux kernel,需要通过Makefile来管理,分析uboot和Linux kernel 必须要对Makefile有所了解。

1)通配符%和makefile自动推导(规则)

%是makefile中的通配符,代表一个或者几个字母,也就是说%.o就是代表所有以.o为结尾的文件,%.s就是代表所有以.s为结尾的文件。
在这里插入图片描述
arm-linux-gcc -o <-c 这条命令就会加工把生成.s,然后生成.o,最后得到led.bin
2)所谓自动推导就是makefile的规则,当makefile需要某一个目标时会把这个目标去套规则说明,一旦套上了某个规则说明,则makefile会试图寻找这个规则中的依赖,如果能找到则会执行这个规则用依赖生成目标,
如果找不到就会报错。

只要能看懂就行,在实际工作中,会有模板,只需要根据自己的需求进行修改即可。

3)Makefile中定义和使用变量
makefile中定义和使用变量,和shell脚本中非常相似。相似是说:都没有变量类型,直接定义使用,引用变量时用$var(变量名)

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

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

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

Makefile的文件名
Makefile的文件名合法的一般有2个:Makefile或者makefile

Makefile中引用其他Makefile(include指令)
有时候Makefile总体比较复制,因此分成几个Makefile来写。然后在Makefile中引用其他的,用include指令来引用。引用的效果也是原地展开,和C语言中的头文件包含非常相似。

Makefile补充学习
Makefile中的注释用#,和shell一样

命令前面的@用来静默执行
在这里插入图片描述
echon “hello world”
hello world

makefile中默认情况下在执行一行命令前,会先把这个命令给打印出来,然后再执行这个命令,如果不想看到命令本身,只想看到命令行就静默执行即可。

Makefile中几种变量赋值运算符
1)= 最简单的赋值
2):= 一般也是赋值
以上这两个大部分情况下效果是一样的,但是有时候不一样。
在这里插入图片描述
abcdef
在这里插入图片描述
ghdef
用=赋值的变量,在被解析时他的值取决于最后一次赋值时的值,所以看变量引用的值时不能只往前面看,还要往后面看。
在这里插入图片描述
abcdef

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

3)?=
在这里插入图片描述
如果变量前面并没有赋值过则执行这条赋值,如果前面已经赋值过了则本行被忽略。
(实验可以看出:所谓的没有赋值过其实就是这个变量没有被定义过)
注意:Makefile中并不要求赋值运算符两边一定要有空格或者无空格,这一点比shell的格式要求要松一些。

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

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

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

Makefile中有一些环境变量可能是Makefile本身自己定义的内部的环境变量或者是当前的执行环境提供的环境变量(譬如我们在make执行时给Makefile传参)make CC = arm - linux - gcc,其实就是给当前Makefile传了一个环境变量CC,值是arm-liunx-gcc。我们在make时给Makefile传的环境变量值优先级最高的,可以覆盖Makefile中的赋值

这就好像C语言中编译器预定义的宏___LINE__ __FUNCTION___等一样。

在这里插入图片描述
先创建一些文件,然后用一个Makefile来管理
在这里插入图片描述
所有以.C的字符都打印出来了。
在这里插入图片描述
在这里插入图片描述
?打印一个任意字符的
在这里插入图片描述

在这里插入图片描述
拿中括号里面的跟外面的进行匹配,匹配成功的才打印
在这里插入图片描述

Makefile中使用的通配符
1)* 表示诺干个任意字符
2)? 一个任意字符
3) [ ] 将【】中的字符依次去和外面的结合匹配

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

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

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

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

常见的自动变量:
$@ 规则的目标文件夹名
$< 规则的依赖文件名
$^ 依赖的文件集合
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值