8.makefile初步编程学习


8.1.makefile的作用和意义
(1)因为工程项目中的c文件太多管理不方便,所以使用makefile来管理项目,方便项目的编译链接过程。
(2)uboot和linux kernel的本质都是c语言编写的项目,都由很多个c文件构成,因此都使用makefile进行项目管理。则分析uboot项目必须对makefile有所了解。


8.2.目标、依赖、命令
(1)目标就是我们最终要生成的东西,make xxx中的xxx就是目标。
(2)依赖就是用来生成目标的原材料。
(3)命令就是加工方法。则make xxx的过程就是使用命令将依赖加工成目标的过程。


8.3.通配符%和makefile自动推导
(1)%是makefile种的通配符,代表任意字母,则%.o就代表所有以.o为后缀的文件。
(2)自动推导其实就是makefile的规则。当makefile需要某个目标时,它会将该目标去套用规则说明,一旦匹配到某个规则说明,则makefile会寻找该规则中的依赖,如果找到该依赖则执行这个规则用依赖生成目标。


8.4.makefile中定义和使用变量
(1)makefile中的变量没有变量类型,可直接定义使用,引用变量时用dollar-var即可,该特性和shell脚本中非常类似。


8.5.伪目标.PHONY
(1)伪目标即该目标本身不代表一个文件,该目标的的存在不是为了得到该目标本身,而是单纯为了执行该目标下面的命令。
(2)伪目标一般没有依赖,不加依赖的意思即无条件执行该目标下面的命令。
(3)伪目标可以直接写,不影响使用,但有时候为了明确声明该目标是伪目标就会在该伪目标的前面加上.PHONY来明确声明它是伪目标。


8.6.makfile的文件名
(1)makefile中合法的文件名一般有两个:Makefile或者makefile。


8.7.makefile中引用其他makefile
(1)有时候makefile比较复杂,因为需要分成好几个makefile来写,然后在主makefile中引用其它的makefile,使用include指令来引用。引用的效果是原地展开,类似于c语言中的头文件包含。


8.8.makefile中的注释用#
(1)makefile中的注释使用#,和shell一样。


8.9.命令前面的@用来静默执行
(1)在makefile的命令行中前面的@表示静默执行。
(2)makefile中默认情况下在执行一行命令前会先将这行命令打印出来,然后在执行该命令。如果不想看到命令本身,只在乎命令的执行可选择静默执行即可。


8.10.makefile中几种变量赋值运算符
(1)=最简单的赋值,在被解析时变量的值是整个文件中最后一次被赋值的值,所以在分析引用变量的值时需要找到整个文件中该变量最后一次的赋值。
(2):=也是赋值,变量的值被解析时是就地直接解析,只需要往该赋值语句前面去分析即可,不需要关注该赋值语句后面针对该引用变量的赋值语句。
(3)?=若变量之前并没有被赋值过则执行该条赋值语句,若变量之前已经被赋值过则忽略此条赋值语句。所谓的没被赋值过是指该变量没有被定义过。
(4)+=用来给一个已经赋值的变量接续赋值,意思就是把该次赋值加到原来的赋值后面。类似于strcat,在shell和makefile中可认为所有的变量都是字符串。注意+=续接的内容和原来的内容之间会自动加一个空格隔开。
(5)makefile中并不要求赋值运算符两边一定要有空格或者无空格,在该点上比shell的格式要求要低一些。


8.11.makefile的环境变量
(1)makefile中用export导出的变量就是环境变量。一般情况下要求环境变量名用大写,普通变量名用小写。
(2)环境变量和普通变量不同,环境变量类似于整个工程中所有makefile之间共享的全局变量,而普通变量类似于只是当前本makefile文件中使用的局部变量。所以当定义了某个环境变量会影响到别的makefile文件,需谨慎对待。
(3)makefile中可能有一些环境变量是makefile本身自己定义的内部的环境变量,或者是当前执行环境中提供了一些环境变量。譬如我们在make执行时给makefile传参使用make CC=arm-linux-gcc,其实就是给makefile文件中传入一个环境变量CC,环境变量CC的值arm-linux-gcc。我们在make中给makefile传的环境变量值优先级最高,可覆盖makefile文件中的赋值。


8.12.makefile中使用通配符
(1)*代表若干个任意字符。
(2)?代表1个任意字符。
(3)[]代表将[]中的单个字符依次和外面匹配。
(4)%代表任意多个字符,类似于*,但是%一般用于规则描述中,又叫规则通配符。
(5)关于通配符,makefile中还有一些wildcard等比较复杂的通配符用法,具体参考《跟我一起学Makefile》即可。


8.13.makefile的自动变量
(1)在某些情况下文件集合中的文件非常多,描述的时候非常麻烦,所以makefile中使用了一些特殊的符号来替代符合某种条件的文件集,这样就形成了自动变量。
(2)自动变量即makfile中预定了特殊意义的符号,类似于C语言编译器中预制的宏如FILE一样。
(3)常见的自动变量:dollar@代表规则的目标文件名;dollar<代表规则的依赖文件名;dollar^代表依赖的文件集合。


8.Makefile
# 8.makefile初步编程学习

# 伪目标演示和静默执行
#all:
#   echo "this is a test!"
#   @echo "hello world!"

# 验证?=变量赋值运算符
#var = 
#var ?= "efgh"

#all:
#   echo $(var)

# 验证+=变量赋值运算符
#var = "abcd"
#var += "efgh"

#all:
#   echo $(var)

# 演示=和:=的区别
#A=abc
#B:=$(A)def
#A=gh

#all:
#   echo $(B)

# 演示makefile传参
CC=gcc

all:
    echo $(CC)

8.wildcard/Makefile
# 在8.wildcard/文件夹下新建1.c 1.h 2.c 12.c test.c共5个空文件
# 演示Makefile中的通配符
#all : 1.c 1.h 2.c 12.c test.c
#   echo *.c
#   echo ?.c
#   echo [12].c

# 演示Makfile中的自动变量
all : 1.c 1.h 2.c 12.c test.c
    echo $@
    echo $^
    echo $<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值