第六篇 变量的高级主题(上)

 上一节中我们分享了变量的定义与使用,这一节我们来研究一下变量值得替换,具体语法格式如下所示:
 执行make,上图的输出结果如下:
 
  在上图中的变量值替换中a是var变量中每个变量的后缀,make解释器去var变量中搜索匹配每一个子变量,遇到后缀为a的子变量即将这个后缀a替换成b,变量值的替换这种语法只能替换变量的后缀。
 
 变量的模式替换,语法格式如下:
 模式替换可以替换任意形式的字符串,%作为模式字符串,可以匹配任意长度的字符串,变量var中查找匹配到的a替换为x,查找匹配到的b替换为y,而%模式字符串部分保持不变。
 
 规则中的模式替换,语法如下:
具体示例如下:
 
 在上例中,make解释器从通过%.o在OBJS中匹配子目标,首先找到子目标func.o,这时$(OBJS):%.o部分变成了func.o,make再根据这个子目标生成依赖func.c。进而构成了整个规则,然后make继续搜索OBJS中的其它子目标,直到所有的子目标全部搜索完毕。
 在大型工程中,我们不可能去一条一条的写规则,那将繁琐无比,因此,一般通过模式规则这种写法来让make自动生成一条一条的规则,只是这种写法较为晦涩难懂。
 
 变量值的嵌套使用,语法如下:
 
命令行变量使用,具体如下:
执行make hm:=CMD,输出结果如下:
 
使用override关键字可以防止makefile中定义的变量被命令行变量覆盖,override用法如下:
 
 将hm关键字用override修饰,再次执行make hm:=CMD,输出如下:
 
 命令行变量常用于某一个版本的可执行程序的生成,例如使用命令行变量将makefile中定义的变量覆盖,从而生成测试版本的程序。
 
 如果想定义一个多行变量,可以使用define关键字,用法如下:
 
 
当定义的多行变量为命令时,例如上图中的@echo "run cmd ls ..."和@ls,这时这两条命令前面必须是以tab键开头的,否则报错。而foo变量是普通变量,不能以tab键开头,否则被认为是命令。
 
 
参考如下:
    狄泰软件教程与课件
    GUN make手册
    专业嵌入式软件开发
 
 
 
 
 
 
 
 
 
 
 
 

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">





原文地址:https://www.cnblogs.com/wanmeishenghuo/p/8413829.html