嵌入式系统开发工具3

Makefile 特性介绍

源文件数量越是多的程序,其编译规则就会越复杂,导致Makefile文件也越复杂。为了简化Makefile的编写,丰富编译程序的方法和手段。Makefile提供了很多类似高级编程语言的语法机制。

  1. 变量
    在Makefile文件中,存在着大量的文件名,而且这些文件名都是重复出现的。所以在源文件比较多的情况下,很容易发生遗漏或写错文件名。而且一旦源文件的名称发生了变化,还容易造成与其他文件名不一致的错误。于是,Makefile提供了变量来代替文件名。变量的使用方式为:
    $(变量名)
    例如:
    obj = a.o b.o

test : $(obj)
cc -o test $(obj)
a.o : a.c b.h
cc -c a.c
b.o : b.c
cc -c b.c
该Makefile使用了变量obj来代替“a.o b.o”。当源文件名发生改动或增删源文件时,只要对变量obj的值进行相应的修改就可以了,这样可以避免文件名不一致或遗漏的错误。Makefile中变量的命名可以使用字符、数字和下划线,但要注意变量名对大小写是敏感的。
此外,Make工程管理器提供了灵活的变量定义方式,具体有以下几种实现方式。
(1)通过“=”来实现
例如:
a1= $(a2)
a2= $(a3)
a3= a.o
这种方式下变量a1的值是a.o,也就是说前面的变量可以通过后面的变量来定义。但使用这种方式定义变量时,要防止出现死循环的情况。
(2)通过“:=”来实现
例如:
a1:= a.o
a2:= $(a1) b.o
这种方式下变量a1的值是a.o,变量a2的值是a.o b.o。
例如:
a1:= $(a2) b.o
a2:= a.o
这种方式下变量a1的值是b.o,而不是“a.o b.o”。也就是说前面的变量不能通过后面的变量来定义。
(3)通过“+=”来实现
例如:
a1= a.o
a1+= b.o
这种方式下变量a1的值是“a.o b.o”。也就是说“+=”可以实现给变量追加值。等同于如下示例:
a1= a.o
a1:= $(a1) b.o
可以看到,Makefile的“+=”和C语言中的“+=”是非常相似的。
(4)通过“?=”来实现
例如:
a1:= a.o
a1?=b.o
这种方式下变量a1的值是a.o,而不是b.o。也就是说,如果变量a1已经在前面定义过了,那么后面的定义就无效了。
以上所介绍的变量都是全局变量,也就是在整个Makefile文件中都可以访问的。
2. 自动推导
为了进一步简化Makefile的书写,Make工程管理器提供了自动推导的功能。自动推导功能默认每个目标文件都有一个与之对应的依赖文件。比如a.o文件有依赖文件a.c与之对应)。这样在Makefile中就不需要指定与目标文件对应的依赖文件名了。此外,自动推导功能还能推导出与目标文件对应的基本编译规则命令。比如a.o文件的规则命令为“gcc –c –o a.c”。
例如:
obj = a.o b.o

test : $(obj)
cc -o test $(obj)
a.o : b.h
结果为:
[root@localhost home]#make
cc –c –o a.o a.c
cc –c –o b.o b.c
cc –o test a.o b.o
可以看到,Makefile分别推导出了目标文件a.o和b.o的规则命令“cc -c -o a.o a.c”与“cc -c -o b.o b.c”。

函数

对于编程语言来说,函数的作用是非常重要的。为此,Make工程管理器也引入了函数机制,以丰富Make控制编译过程的方法。和变量一样,函数也用符号$进行标识,其使用格式为:
KaTeX parse error: Unexpected character: '' at position 60: …简单介绍一些常用的基本函数。 ̲ subst 格式:(subset 参数1,参数2,参数3)
功能:把参数3中的参数1替换成参数2
返回值:被替换后的参数3
例如:
result := KaTeX parse error: Unexpected character: '' at position 69: …ve the world”。 ̲ patsubst 格式:(patsubset模式参数,参数1,参数2)
功能:把参数2中符合模式参数的单词(单词是指参数中被空格隔开的字符串)替换成参数1
返回值:被替换后的参数2
例如:
result := KaTeX parse error: Unexpected character: '' at position 50: …t的值为“x.o y.o”。 ̲ wildcard 格式:(wildcard模式参数)
功能:列出当前目录下所有符合模式参数的文件名
返回值:当前目录下所有符合模式参数的文件名
例如:
result := KaTeX parse error: Unexpected character: '' at position 39: …为当前目录下所有的C文件名。 ̲ strip 参数 格式:(strip 参数)
功能:去掉参数中开头和结尾的空格
返回值:被去掉空格的参数
例如:
result := KaTeX parse error: Unexpected character: '' at position 39: …ult的值为“China”。 ̲ findstring 格式:(findstring 参数1,参数2)
功能:在参数2中查找参数1
返回值:如果找到返回参数1,如果没找到返回空
例如:
result := $(findstring me, you and me)
result的值为“me”。
result := KaTeX parse error: Unexpected character: '' at position 43: …) result的值为“”。 ̲ filter 格式:(filter模式参数,参数1)
功能:从参数1中筛选出符合模式参数的字符串
返回值:符合参数模式的字符串
例如:
a := x.c y.c z.h
result := $(filter %.c, KaTeX parse error: Unexpected character: '' at position 26: …t的值为“x.c y.c”。 ̲ addsuffix 格式:(addsuffix 参数1,参数2)
功能:在参数2中的每个单词加上后缀参数1
返回值:加上后缀的所有单词
例如:
result := KaTeX parse error: Unexpected character: '' at position 41: …t的值为“x.c y.c”。 ̲ addprefix 格式:(addprefix 参数1,参数2)
功能:在参数2中的每个单词加上前缀参数1
返回值:加上前缀的所有单词
例如:
result := KaTeX parse error: Unexpected character: '' at position 55: …/x.c src/y.c”。 ̲ foreach 格式:(foreach 变量参数,参数1,表达式)
功能:循环取出参数1中的单词赋给变量参数,然后运行表达式
返回值:表达式的运行结果
例如:
a:= x y z
result := $(foreach b, $(a), KaTeX parse error: Unexpected character: '' at position 49: …,b在这里是一个临时的变量。 ̲ call 格式:(call 变量参数,参数…)
功能:循环把参数依次赋给变量参数中的 ( 1 ) 、 (1)、 (1)(2)…
返回值:赋值后的变量值
例如:
a:= $(2) $(1)
result := $(call KaTeX parse error: Unexpected character: '' at position 26: …result的值为“yx”。 ̲ if 格式:(if 条件参数,执行参数)
功能:如果条件参数非空,运行执行参数部分
返回值:条件参数非空,返回执行参数部分
例如:
result := ( i f C h i n a , w o r l d ) r e s u l t 的 值 为 “ w o r l d ” 。 格 式 : (if China, world) result的值为“world”。 格式: (ifChina,world)resultworld(if 条件参数,执行参数1,执行参数2)
功能:如果条件参数非空,运行执行参数1部分;反之运行执行参数2部分
返回值:条件参数非空,返回执行参数1;反之返回执行参数2
例如:
a:=
result := $(if KaTeX parse error: Unexpected character: '' at position 38: …ult的值为“world”。 ̲ dir 格式:(dir 参数)
功能:从参数中取出目录部分
返回值:目录部分
例如:
result:=KaTeX parse error: Unexpected character: '' at position 46: …“/home/test/”。 ̲ error 格式:(error 参数)
功能:停止“Make”运行并显示参数
返回值:参数
例如:
result:=KaTeX parse error: Unexpected character: '' at position 49: …rror occure!”。 ̲ warning 格式:(warning 参数)
功能:“Make”运行时显示参数
返回值:参数
例如:
result:=$( warning warning occure!)
result的值为“warning occure!”。

shell编程(脚本:批处理)

Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。
Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它互动式地解释和执行用户输入的命令;
作为程序设计语言,它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包括循环和分支。它虽然不是 Linux系统内核的一部分,但它调用了系统内核的大部分功能来执行程序、创建文档并以并行的方式协调各个程序的运行。
shell提供了你与操作系统之间通讯的方式。
本质上,shell script是命令行命令简单的组合到一个文件里面。
Linux系统运维工程师(嵌入式系统开发—系统移植)
shell:
1、命令解析器(将用户输入的命令解析,调用相应的命令的可执行文件)
2.脚本语言
变量:if for while until case 函数传参 函数返回值 键盘输入read
底层嵌入式开发:shell命令拼接

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值