Makefile相关内容学习(一)

1.Makefile里主要包含五个东西:显式规则、隐晦规则、变量定义、文件指示和注释
2.Makefile中的注释为 # 字符,可以使用反斜框进行转义,如 #
3.在Makefile中的 命令,必须要以 [Tab]键 开始
4.一般情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,找到了就解释这个文件。一般使用 Makefile 命名文件名。你也可以使用别的文件名来书写Makefile。例如:make -f Make.Linux 或者 make –file Make.AIX
5.make工具的参数选项
-f filename 显示地指定文件作为makefile
-C dimame 指定make在开始运行后的工作目录为dimame
-e 不允许在Makefile中替换环境变量的赋值
-k 执行命令出错时,放弃当前目标,继续维护其他目标
-n 按实际运行时的执行顺序模拟执行命令(包括用@开头的命令),没有实际执行效果,仅仅用于显示执行过程
-p 显示Makefile中所有的变量和内部规则
-r 忽略内部规则
-s 执行但不显示命令,常用来检查Makefile的正确性
-S 如果执行命令出错就退出
-i 忽略运行make中执行命令的错误
-v 显示make的版本号
6.伪目标的使用:
在这里插入图片描述
对于clean而言,如果不使用伪目标,当你在同目录下创建clean文件时,再执行make clean进行清理操作则无效。
7.在Makefile使用include关键字可以把别的Makefile包含进来,被包含的文件会原模原样的放在当前文件的包含位置。
语法为:include < filename >
例如有以下几个Makefile文件:a.mk、b.mk、c.mk、foo.make、$(bar)、e.mk、f.mk
include foo.make .mk $(bar)
等价于
include foo.make a.mk b.mk c.mk e.mk f.mk
如果形如: -include< filename >
则表示无论include过程中出现什么错误,都不要报错继续执行。
8.make支持三种通配符:
、?、[…]
$? 表示一个自动化变量,表示所有比目标新的依赖文件的集合
object = .o
需要注意的是,这里的
.o不会展开,object的值就是*.o
如果想让其展开,则需要这样操作:object := $(wildcard *.o)
9.文件搜寻:Makefile文件中的特殊变量 “VPATH” 就是完成这个功能。
VPATH = src:…/headers
表示指定两个目录,“src”和“…/headers”,make会按照这个顺序进行搜索。目录由“冒号”进行分割,但是当前目录永远是最高优先搜索的地方。
另一种是使用make的 vpath 关键字(全部小写),它的用法有三种:
(1)vpath< pattern >< directories >
为符合模式< pattern >的文件指定搜索目录< directories >
(2)vpath< pattern >:清除符合模式< pattern >的文件的搜索目录
(3)vpath:清除所有已被设置好了的文件搜索目录
例如 vpath %.h …/headers
表示要求make在 …/headers 目录下搜索所有以 .h 结尾的文件
vpath %.c foo:bar
vpath % blish
表示:以.c结尾的文件现在foo目录下搜索,然后是bar目录最后是blish目录
10.如果
exec :
cd /home/123
pwd
则执行make exec 后pwd仍然显示Makefile的目录,若写成如下
exec:
cd /home/123;pwd
则pwd会显示为/home/123
11.=和:=的区别: :=表示前面的变量不能使用后面的变量,只能使用前面已经定义好的变量
12.?=的使用: FOO ?= bar 意思为如果变量FOO没有被定义过,那么变量FOO的值就是bar,如果FOO先前已经被定义过,那么这条语句将什么都不做。
13.+=的使用 :它可以给变量追加值。
例如:objects = main.o foo.o bar.o utils.o
objects += another.o
则objects就会变为:main.o foo.o bar.o utils.o another.o
14.常用函数的调用: $(< function> < arguments>)或者 ${< function> < arguments>} 前者为函数名,后者为函数的参数,参数间以逗号隔开,函数名和参数之间用空格分隔。
15. 字符串处理函数:
(1)字符串替换函数subst
$(subst < from>,< to>,< next>)
功能:把字符串< next>中的< from>替换成< to>
返回:函数返回被替换后的字符串
(2)模式字符串替换函数patsubst
格式: $(patsubst < pattern>,< replacement>,< text>)
功能:查找< text>中的单词(单词以空格、Tab、回车或换行分隔)是否符合模式< pattern>,如果匹配的话,则以< replacement>模式替换。
返回:函数返回被替换后的字符串
例如:
$(patsubst %.c,%.o,x.c.c bar.c)
% 表示任意长度的字符串
则表示将x.c.c bar.c中符合%.c的替换为%.o
x.c.o bar.o
(3)查找字符串函数findstring
格式: $(findstring < find>,< in>)
功能:在字符串< in>中查找< find>字符串
返回:如果找到,则返回find字符串,否则返回空字符串(4)过滤函数filter
格式: $(filter < pattern…>,< text>)
功能:以< pattern>模式过滤< text>字符串中的单词,保留符合模式< pattern>的单词,可以有多个模式
返回:返回符合模式< pattern>的字符串
例如 sources :=foo.c bar.c baz.s ugh.h
foo: $(sources)
cc $(filter %.c %.s, $(sources)) -o foo
此时 $(filter %.c %.s, $(sources))返回的结果为foo.c bar.c baz.s
(5)反过滤函数filter-out
格式: $(filter-out < pattern…>,< text>)
功能:以< pattern>模式过滤< text>字符串中的单词,去除符合模式< pattern>的单词,可以有多个模式
返回:返回不符合模式< pattern>的字符串
例如 sources :=foo.c bar.c baz.s ugh.h
sources1 :=foo.c bar.c bar.s
$(filter-out $(sources1), $(sources))
返回的结果为ugh.h
(6)排序函数sort
格式: $(sort < list>)
功能:将字符串< list>中的单词按照字母顺序(升序)进行排序,先比较单词的首字母,首字母相同,则比较下一个字母,以此类推。当遇到相同的单词时,sort函数会自动删掉它们
返回:返回排序后的字符串
例如:
$(sort lose foo bar lost lost)则返回
bar foo lose lost
(7)取单词函数word
格式: $(word < n>,< next>)
功能:从字符串< next>中取出第< n>个单词,单词计数从1开始
返回:返回字符串< next >中的第< n>个单词,如果< n>值比< next>中的单词书大,则返回空字符串
例如:
$( word 2,programing linux c programing)返回值是:linux
$( word 5,programing linux c programing)返回值是:" "
(8)取字符串函数wordlist
格式: $(wordlist < s>,< e>,< text>)
功能:从字符串< text>中取出从< s>开始到< e>的单词串,< s>和< e>是一个数字,单词计数从1开始
返回:返回字符串< text>中从< s>到< e>的单词字串。如果< s>比< text>中的单词数要大,那么返回空字符串。如果< e>大于< text>的单词数,那么返回从< s>开始,到< next>结束的单词串。
例如:
$( wordlist 2,4,I like linux c programing)返回值是:like linux c
$( wordlist 6,8,programing linux c programing)返回值是:" "
$( wordlist 2,8,I like linux c programing)返回值是:like linux c programing
(9)单词个数统计函数 words
格式: $(words < text>)
功能:统计< text>字符串中的单词个数,计数从1开始
返回:返回< text >中的单词数
例如:
$(words, I like linux c programing)
返回值为:5
(10) 首单词函数firstword
格式: $(firstword < text>)
功能:取字符串< text>中的第一个单词
返回:返回字符串< text>的第一个单词
例如:
$(firstword I like linux c programing)
返回值:I
(11)strip
格式: $(strip < string>)
功能:去掉< string>字符串中开头和结尾的空字符
返回:返回去掉空格的字符串
(12)join
格式: $(join < list1>,< list2>)
功能:把< list2>中的单词对应地加到< list1>的单词后面。如果< list1>的单词个数要比< list2>的多,那么,< list1>中的多出来的单词将保持原样。如果< list2>比< list1>多,则< list2>多出来的单词将被复制到< list2>中
例如:
$(join aaa bbb,111 222 333)
返回值:“aaa111 bbb222 333”

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值