Makefile学习(6)

 

上一次没有说明函数是如何定义的,今天就补补啦!

 

1.Make脚本中函数,按照调用方式可以分为三类:

 

  • 第一类是内置函数,即Make解释器内部定义好的函数,在任何脚本文件中可直接调用引用,调用格式:

 

$(<funtion> <arguments>)
或者
${<function> <arguments>}

function是函数的名称,arguments是参数,多个参数用逗号分隔,这个在上一节中已经进行了部分说明。

 

  • 第二类是用户自定义的、带参数的函数,使用define关键字进行定义,调用格式为:
$(call <function>  <arguments>)

call是调用的关键字,function代表函数的名称,arguments是函数参数,多个参数使用逗号分隔

 

  • 第三类也是用户自定义的,但不带参数,该类函数也称之为宏,其调用格式为:
$(<function>)

 
既不使用call关键字,也不包含参数。

 

 

2.用户自定义的函数语法如下:

 

define function
各种具体命令
endef
  • 在自定义函数中,命令前不需要加Tab键。

 

  • 函数内部使用$(n)代表调用函数时的参数,n为自然数:

$(0)代表函数名称本身;
$(1)代表第一个参数;
$(2)代表第二个参数。

 

 

示例:

define showFirstName
@echo $(1)
endef

.PHONY:name
name:
       $(call showFirstName,Yuandan,Kerr)
 
  • 这段代码中定义了函数showFirstName,其作用是将传入的第一个参数返回给调用者。
  • 执行命令:make name
  • 执行结果 :Yuandan


echo命令说明:

 

  • 功能:显示文字
  • 注:当我们用“@”字符在echo之前时,那么命令将不会被make显示出来

示例:

@echo 正在编译XXX模块...
  • 当make执行时,会输出“正在编译XXX模块...”字串,但不会输出命令。
  • 如果没有“@”,那么make将输出:

echo 正在编译XXX模块...

 正在编译XXX模块...

 

  • 如果make执行时,带入make参数  “-n”或“-just-print”,那么其只是显示命令,但是不会执行命令,这个功能有利于调试makefile。

 

 

下面介绍一些内置函数

 

3.foreach函数

  • 语法:
$(foreach <var>,<list>,<text>)
  •  说明:

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

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

 

  • 示例:
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中的<var>参数是一个临时的局部变量,其作用域只在foreach函数当中。

 

 

4.if函数

  • 语法:
$(if <condition>,<then-part>)
或者
$(if <condition>,<then-part>,<else-part>)
  •  说明:

<condition>参数是if的表达式,如果其返回的为非空字符串,那么这个表达式就相当于返回真,则<then-part>会执行,否之<else-part>会执行。

  • 示例:
$(if love,I am android fans,I am not)
  •  说明:

condition是“love”,不为空,所以结果为:I am android fans

 

 

你可能感兴趣的:(makefile)