make/makefile学习

Source

1、makefile函数

1.1、字符串替换函数:subst

函数原型: $(subst <from>,<to>,<text>)
名称: 字符串替换函数——subst。
功能: 把字串<text>中的<from>字符串替换成<to>
返回: 函数返回被替换过后的字符串。

1.2、模式字符串替换函数:patsubst

函数原型: $(patsubst <pattern>,<replacement>,<text>)
功能: 查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。这里,<pattern>可以包括通配符“%”, 表示任意长度的字串。 如果<replacement>中也包含“%”, 那么, <replacement>中的这个“%”将是<pattern>中的那个“%”所代表的字串。(可以用“\”来转义, 以“%”来表示真实含义的“%”字符)
返回: 函数返回被替换过后的字符串。

1.3、去空格函数:strip

函数原型:$(strip <string>)
名称:去空格函数——strip。
功能:去掉<string>字串中开头和结尾的空字符。注意这里只去掉开头和结尾。
返回:返回被去掉空格的字符串值。

1.4、查找字符串函数:findstring

2、=、:=、?=区别

通过查询资料及试验,个人感觉这3中赋值语法的区别主要是:

  • = 赋值,无论变量在makefile中被赋值多少次,最后一次赋值将被应用于整个makefile.
  • :=赋值,变量在makefile中的赋值立即生效,如果变量被更改,更改也立即生效。
  • ?=赋值,变量没有被定义时,定义变量并赋值。如果变量已经存在,则忽略赋值操作。

试验代码:


a = hello # not the last, skip
b = $(a) world
a = okay # not the last, skip
a = OKAY # the last change is applied.

c := hello # the immediate value is applied
d := $(c) world
c := okay

e ?= hello # the first change is applied
e ?= HELLO # already exist, skip
f ?= $(e) world
e ?= world

all:
    @echo "=        "$(b)
    @echo ":=       "$(d)
    @echo "?=       "$(f)                  

输出:
在这里插入图片描述