嵌⼊式开发---Makefile编写规则
⼀、Makefile⾥⾯包括什么:
1.显式规则
2.隐晦规则
3.变量的定义
4.⽂件指⽰
5.注释
Makefile规则:
:
command
target也就是⼀个⽬标⽂件,可以使Object file,也可以是⼀个执⾏⽂件,或者是⼀个标签。(Makefile中的第⼀个⽬标⽂件被当做是最终的⽬标⽂件。)
prerequisites是⽣成⽬标⽂件的依赖⽂件。
command是Make需要执⾏的命令。
隐晦规则:Makefike的⾃动推导功能,隐晦规则可以让我们粗糙的简略的书写Makefile,这是由make所⽀持。
变量的定义:Makefile中定义的⼀系列变量,⼀般都是字符串,类似于C语⾔中的宏,Makefile执⾏时,变量的值会进⾏扩展。
⽂件指⽰:其包括了三个部分,⼀个是在⼀个Makefile中引⽤另⼀个Makefile,就像C语⾔中的include⼀样;另外⼀个是根据某些情况指定Makefile中的有效部分,就像C语⾔中预编译的#if⼀样;第三点是定义⼀个多⾏的命令。
注释:#开头进⾏注释。
⼆、伪⽬标
clean:
rm *.o temp
伪⽬标不是⽂件,所以make⽆法⽣成它的依赖关系和决定它是否要执⾏。我们只有通过显式的指明这个⽬标才能让其⽣效。
如下:
.PHONY:clean
执⾏clean命令时接 make clean就可以。
整个过程可以写成以下形式:
.PHONY:clean
clean:
rm *.o temp
三、Makefile的执⾏过程
1.依次读取变量“MAKEFILES”定义的makefile⽂件列表;
2.读取⼯作⽬录下的makefile⽂件(根据命名的查顺序“GNU makefile”“makefile”“Makefile”,⾸先到哪个就执⾏哪个。);
3.依次读取⼯作⽬录“makefile”⽂件中使⽤的指⽰符“include”包含的⽂件;
4.查重建所有已经读取的makefile⽂件的规则,如果存在⼀个⽬标是当前读取的某⼀个makefile⽂件,则执⾏规则重建此makefile⽂件,完成以后从第⼀部开始执⾏;
5.初始化变量值并展开那些需要⽴即展开的变量和函数并根据预设条件确定执⾏分⽀;
6.根据“终极⽬标”以及其他的⽬标依赖关系建⽴依赖关系链表。
7.执⾏除“终极⽬标”以及所有⽬标的规则(规则中如果依赖⽂件中任⼀个⽂件的时间戳⽐⽬标⽂件新,则使⽤规则所定义的命令重建⽬标⽂件。)
8.执⾏终极⽬标所在规则。
四、Makefile常见的⾃动化变量
$* 不包括扩展名的⽬标⽂件名称
$+ 所有的依赖⽂件以空格分开,并以出现的先后顺序,可能包含重复的依赖⽂件
$< 第⼀个依赖⽂件的名称
$? 所有时间戳⽐⽬标⽂件晚的依赖⽂件,并以空额分开
$@ ⽬标⽂件的完整名称
$^ 所有不重复的依赖⽂件,以空格分开
$% 如果⽬标⽂件归档成员,则该变量表⽰的⽬标的归档成员名称
五、make的命令⾏选项
-C dir 读⼊指定⽬录下的Makefile
-f file 读⼊当前⽬录下file⽂件作为makefile
-i 忽略所有命令执⾏错误
-I dir 指定被包含的Makefile所在⽬录
-n 只打印要执⾏的命令,但不执⾏这个命令
-p 显⽰make变量数据库和隐含规则
-s 在执⾏命令是时不显⽰命令
-w 如果make在执⾏过程中改变⽬录,则打印当前的⽬录名。
六、Makefile中wildcard的⽤法
在Makefile规则中,通配符会被⾃动展开。但在变量定义和函数引⽤时,通配符将失效。这种情况如果需要通配符有效,就需要使⽤函数“wildcard”,它的⽤法是$(),在Makefile中它将被展开为已经存在的,使⽤空格分开的,匹配此模式的所有⽂件。
⼀般我们可以⽤$(wildcard *.c)来获取⼯作⽬录下所有c⽂件列表。
wildcard:扩展通配符
notdir:去除路径
patsubst:替换通配符
七、Makefile中⽂件搜寻
在⼀些⼤的⼯程中,有⼤量的源⽂件,我们通常的做法是吧这许多的源⽂件进⾏分类,并存放在不同的⽬录中。所以,当make需要去寻⽂件的依赖关系时,你可以在⽂件前加路径,但最好的⽅法是把⼀个路径告诉make,让make⾃动去寻。
Makefilewe⽂件中的特殊变量“VPATH”就是完成这个功能的,如果没有指明这个变量,make只会在当前⽬录中去寻依赖⽂件和⽬标⽂件。如果定义了这个变量,那么make就会在当前⽬录中不到的情况下到所指定的⽬录下去寻⽂件名。
VPATH = src:.../headers
上⾯的定义指定了两个⽬录“src”和“../headers”,make会按照这个顺序进⾏搜索,⽬录由“冒号”分隔(当然,当前⽬录永远是最⾼优先搜索的地⽅)
makefile phony 另⼀个设置⽂件搜索路径的⽅法是使⽤makefile的“vpath”关键字,(注意,它是全⼩写),这不是变量。这是⼀个make的关键字。这和上⾯提到的那个VPATH变量很类似,但是它更为灵活。它可以指定不同的⽂件在不同的搜索路径中,这是⼀个很灵活的功能。
它的使⽤⽅法由三种:
vpath <pattern><direction>为符合模式的⽂件指定指定搜索⽬录direction
vpath <pattern>清楚符合模式<pattern>的⽂件的搜索⽬录
vpath 清除所有已被设置好的⽂件搜索⽬录
vpath使⽤⽅法中的<pattern>需要包含"%"字符,“%”字符的意思是匹配零或是若⼲字符,例如“%h”表⽰所有以"h"结尾的⽂件。
<pattern>指定了要搜索的⽂件级,⽽<direction>则指定了⽂件集的搜索⽬录。
注意点:在Makefile中使⽤shell命令必须加shell,例如$(shell pwd),不加的话是空值。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论