Makefile介绍(韦东⼭-嵌⼊式Linux系统开发学习笔记)
1. 简介
当有多个⽂件组成⼀个程序时,如果只修改了其中部分⽂件,那么为提⾼编译效率,只需重新编译修改的⽂件即可,再全部连接成⼀个新的程序。
判断⽂件需要重新编译的⽅法——⽐较.o和.c⽂件的更新时间,如果.c⽂件⽐.o⽂件时间更新,则需要重新编译。
在Linux中,使⽤Makefile来实现源⽂件、⽬标⽂件的时间⽐较,控制命令的执⾏。
在linux下执⾏make命令时,就是去分析并执⾏同⽬录下的名为Makefile的⽂件。
2. Makefile规则
详细规则参考《GNU Make使⽤⼿册》。
Makefile规则的样式:
⽬标(target)…: 依赖(prerequiries)…
命令(command)
⽬标(target)通常是要⽣成的⽂件的名称(可执⾏⽂件或OBJ⽂件),也可以是⼀个执⾏动作的名称(如clean)。
依赖是⽤来产⽣⽬标的材料(如源⽂件),⼀个⽬标经常有⼏个依赖。
命令时⽣成⽬标是执⾏的动作,⼀个规则可以含有⼏个命令,每个命令占⼀⾏(每个命令前必须是⼀个Tab字符)。
通常,如果⼀个依赖发⽣变化,就需要规则调⽤命令以更新或创建⽬标。
规则⼀般是⽤于解释怎样和何时重建⽬标。make⾸先调⽤命令处理依赖,进⽽才能创建或更新⽬标。
⼀个规则也可以是⽤于解释怎样和何时执⾏⼀个动作,即打印提⽰信息。
3. Makefile⽂件⾥的赋值⽅法
(1)延时变量:使⽤时才扩展开,使⽤时值才确定;
使⽤=, ?=或使⽤define指令定义
注:?=被⽤来定义第⼀次出现的延时变量
(2)⽴即变量:定义时值已确定;
使⽤:=定义
(3)附加操作符+=,右边变量在前⾯使⽤:=定义为⽴即变量则它也是⽴即变量,否则均为延时变量。
4. Makefile常⽤函数
函数调⽤的格式:
$(function arguments)
funtion为函数名,arguments为参数。函数名和参数之间⽤空格或Tab隔开,多个参数⽤逗号隔开。
(1)字符串替换和分析函数
$(subst from, to, text)
—— 在⽂本text中使⽤to替换每⼀处from。
$(patsubst pattern,replacement,text)
——寻text中符合格式pattern的字,⽤replacement替换他们。pattern和replacement可以使⽤通配符。
$(strip string)
——去掉前导和结尾空格,并将中间的多个空格压缩为单个空格。
$(findstring find,in)
——在字符串in中寻find,如果到,返回值是find,否则返回值为空。
$(filter pattern…,text)
——返回在text中由空格隔开且匹配格式pattern…的字符,去除不符合格式pattern…的字。
$(filter-out pattern…,text)
——filter的反函数,返回在text中由空格隔开且不匹配格式pattern…的字符,去除符合格式pattern…的字。
$(sort list)
——将list中的字按字母顺序排序,并去掉重复的字。输出有单个空格隔开的字的列表。
(2)⽂件名函数
$(dir names…)
——抽取names…中每⼀个⽂件名的路径部分(包括从⽂件名的⾸字母到最后⼀个斜杠),如果只有⽂件名则表⽰当前路径./ $(notdir names…)
——抽取路的真正的⽂件名
$(suffix names…)
——抽取⽂件名的后缀
$(basename names…)
$(basename names…)
——抽取⽂件名后缀外的⼀切字符
$(addsuffix suffix,names…)
——给所有names(空格隔开)增加⼀个后缀suffix
$(addprefix prefix, names…)
——给所有names(空格隔开)增加⼀个前缀prefix
$(wildcard pattern)
——搜寻并返回当前⽬录下格式为pattern的所有⽂件名。
(3)其他函数
$(foreach var,list,text)
韦东山嵌入式linux视频——类似循环函数,先扩展var和list,把list中的值逐个复制给var,然后再text中引⽤var进⾏扩展。
$(if condition, then-part[,else-part])
——先把condition去除前后空格,然后扩展。如果扩展为⾮空字符串,则条件condition为真(计算then-part值并返回),否则为假(如果else-part存在,则计算else-part值并返回,否则返回空值)
$(origin variable)
——返回字符串定义如下:
$(shell command arguments)
——make与外部环境的通讯⼯具。函数shell的执⾏结果和在控制台上执⾏command arguments的结果类似。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论