第九部分 使用函数 (四)

目录

一、foreach 函数

二、if 函数

三、call 函数


一、foreach 函数

        foreach 函数和别的函数非常的不一样。因为这个函数是用来做循环用的,Makefile 中的 foreach 函数几乎是仿照于 Unix 标准 Shell(/bin/sh)中的 for 语句,或是 C-Shell (/bin/csh)中的 foreach 语句而构建的。它的语法是:

$(foreach ,,)

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

        所以,最好是一个变量名,可以是一个表达式,而中一般会使用 这个参数来依次枚举中的单词。举个例子:

names := a b c d

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

        上面的例子中,$(name)中的单词会被挨个取出,并存到变量“n”中,“$(n).o”每次 根据“$(n)”计算出一个值,这些值以空格分隔,最后作为 foreach 函数的返回,所以, $(files)的值是“a.o b.o c.o d.o”。

        注意,foreach 中的参数是一个临时的局部变量,foreach 函数执行完后,参数 的变量将不在作用,其作用域只在 foreach 函数当中。

二、if 函数

        if 函数很像 GNU 的 make 所支持的条件语句——ifeq(参见前面所述的章节),if 函数 的语法是:

$(if ,)

或是

$(if ,,)

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

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

        所以,只会有一个被计算。

三、call 函数

        call 函数是唯一一个可以用来创建新的参数化的函数。你可以写一个非常复杂的表达 式,这个表达式中,你可以定义许多参数,然后你可以用 call 函数来向这个表达式传递参 数。其语法是:

$(call ,,,...)

        当 make 执行这个函数时,参数中的变量,如$(1),$(2),$(3)等,会被 参数,,依次取代。而的返回值就是 call 函数的返回 值。例如:

reverse = $(1) $(2)

foo = $(call reverse,a,b)

        那么,foo 的值就是“a b”。当然,参数的次序是可以自定义的,不一定是顺序的,

如:

reverse = $(2) $(1)

foo = $(call reverse,a,b)

此时的 foo 的值就是“b a”。

你可能感兴趣的:(一起学习Makefile,linux,运维,服务器,makefile)