首页 > 代码库 > Makefile常用函数

Makefile常用函数

1. 格式

Makefile 中函数的调用格式如下:

$(function arguments)

其中,function 为函数名,arguments 为参数。

函数名与参数之间由空格Tab分隔,如果有多个参数,这些参数之间由逗号分隔。

 

2. 常用函数介绍

内核的 Makefile 中用到大量的函数,以下介绍一些常用的函数。

 

2.1 字符串替换和分析函数

  • $(subst from,to,text)

   其中,subst 为 substitude(v 替代) 的缩写。

   功能:在字符串 text 中,使用 to 替换每一处 from.

   返回:替换过后产生的新的字符串。

   举例:$(subst ee,EE,feet on the street)

   返回结果:fEEt on the strEET

 

  • $(patsubst pattern,replacement,text)

   其中,patsubst 为 pattern 和 substitude 的缩写。

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

   返回:替换过后产生的新的字符串。

   举例:$(patsubst %.c,%.o,x.c.c bar.c)

   返回结果:x.c.o bar.o

 

   一种更为简单的批量替换文件后缀的方法--变量的替换引用

   $(VAR:PATTERN=REPLACEMENT)

   它相当于 $(patsubst PATTERN,REPLACEMENT,$(VAR))

   举例:假设有变量定义为“objects = foo.o bar.o baz.o”。为了得到这些.o文件所对应的.c源文件。我们可以使用以下两种方式的任意一个:

   $(objects:.o=.c)
   $(patsubst %.o,%.c,$(objects))

 

  • $(strip string)

   strip意为“脱去”

   功能:去除 string 中前导和结尾的空格,并将中间的多个空格压缩为一个空格。

   返回:脱掉冗余空格之后的新的字符串。

   举例:$(strip a     b   c   )

   返回结果:a b c

 

  • $(findstring find,in)

   功能:在字符串 in 中搜寻 find ,如果找到,则返回值是传入的参数 find, 否则返回值为空。

   举例:$(findstring a,a b c)

   返回结果:a

   举例:$(findstring a,b c)

   返回结果:

 

  • $(filter pattern…,text)

   功能:过滤掉 text 中不符合 pattern 的字符串

   举例:$(filter %.c %.s,foo.c bar.c baz.s ugh.h)

   返回结果:foo.c bar.c baz.s

 

  • $(filter-out pattern…,text)

   功能:$(filter pattern…,text) 的反函数,过滤掉 text 中符合 pattern 的字符串。

   举例:$(filter %.c %.s,foo.c bar.c baz.s ugh.h)

   返回结果:ugh.h

 

  • $(sort list)

   功能:将 list 中的单词以首字母为准进行升序排序,并去掉重复的单词。

   举例:$(sort foo bar lose foo)

   返回结果:bar foo lose

 

2.2 文件名函数

  • $(dir names…)

   功能:从文件名序列 names… 中取出各个文件名的目录部分。文件名的目录部分就是包含在文件名中的最后一个斜线(“/”)(包括斜线)之前的部分。如果没有反斜杠,那么返回./。

   举例:$(dir src/foo.c hacks)

   返回结果:src/ ./

   注意:以上例子中其实是两个文件 src/foo.c 和 ./hacks

 

  • $(notdir names…)

   功能:从文件名序列 names 中取出非目录部分。非目录部分是指最後一个反斜杠(/)之后的部分,即文件名。

   举例:$(notdir src/foo.c hacks)

   返回结果:foo.c hacks

 

  • $(basename names…)

   功能:抽取 names 中每一个文件名中除后缀外的一切字符。

   举例:$(basename src/foo.c src-1.0/bar hacks)

   返回结果:src/foo src-1.0/bar hacks

 

  • $(addsuffix suffix,names…)

   功能:添加后缀。

   举例:$(addsuffix .c foo bar)

   返回结果:foo.c bar.c

 

  • $(addprefix prefix,names…)

   功能:把前缀 prefix 加到 names 中的每个单词后面

   举例:$(addprefix src/,foo bar)

   返回结果:src/foo src/bar

 

2.3 其他函数

  • $(foreach var,list,text)

   功能:把参数 list 中的单词逐一取出放到参数 var 所指定的变量中,然后再执行 text 所包含的表达式。每一次 text 会返回一个字符串,循环过程中, text 的所返回的每个字符串会以空格分隔,最后当整个循环结束时, text 所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。

   举例:names := a b c d

            files := $(foreach n,$(names),$(n).o)

   返回结果:a.o b.o c.o d.o

 

  • $(if condition,then-part)

   或是 $(if condition,then-part,else-part)

   功能:if 函数可以包含 else 部分,或是不含。即 if 函数的参数可以是两个,也可以是三个。 condition 参数是 if 的表达式,如果其返回的为非空字符串,那么这个表达式就相当于返回真,于是, then-part 会被计算,否则 else-part 会被计算。

           而 if 函数的返回值是,如果 condition 为真(非空字符串),那个 then-part 会是整个函数的返回值,如果 condition 为假(空字符串),那么 else-part 会是整个函数的返回值,此时如果 else-part 没有被定义,那么,整个函数返回空字串。

           所以, then-part 和 else-part 只会有一个被计算。

 

  • $(origin variable)

   功能:origin函数不像其它的函数,他并不操作变量的值,他只是告诉你你的这个变量是哪里来的?

            注意,  variable 是变量的名字,不应该是引用。所以你最好不要在 variable 中使用$ 字符。Origin 函数会以其返回值来告诉你这个变量的“出生情况”。

   返回值:

            undefined       如果 variable 从来没有定义过,origin 函数返回这个值。

            default            如果 variable 是一个默认的定义,比如“CC”这个变量。
            environment   如果 variable 是一个环境变量,并且当 Makefile 被执行时, -e 参数没有
被打开。
            file                  如果 variable 这个变量被定义在 Makefile 中。
            command line 如果 variable 这个变量是被命令行定义的。
            override          如果 variable 是被 override 指示符重新定义的。

            automatic       如果 variable 是一个命令运行中的自动化变量。

 

  • $(shell command argument)

      功能:相当于在 shell 中执行 command argument。

Makefile常用函数