call函数是唯一一个可以创建定制化参数函数的引用函数。

支持对自定义函数的引用;

支持将一个变量定义为一个复杂的表达式,用call函数根据不同的参数对它进行展开来获取不同的结果;

函数语法:

$(call VARIABLE,PARAM,PARAM,...)

函数功能:

在执行时,将它的参数"PARAM"依次赋给临时变量"$(1)","$(2)".call对参数的数目没有限制,也可以没有参数值。

最后再对VARIABLE展开后的表达式进行处理.

函数返回值:

VARIABLE展开后的表达式的值

函数说明:

1. 变量VARIABLE在定义时最好定义为递归展开式;

2. call函数中对VARIABLE的调用,直接给函数或变量名就好了,不要用"$";

3. 多个PARAM使用逗号分割开,且逗号和PARAM之间不能有空格,否则会导致解析异常;(PS:我自己在这个挖过坑,因为习惯c编码时,在逗号后面加一个空格)

1. 变量的引用

1.1 变量定义为直接展开式

如果这里将VARIABLE1定义为直接展开式,最终调用call函数后,返回值为空

我的理解是,直接展开式在定义时将\((1)和\)(2)展开,而此时它们的值为空,所以变量的值为空.当执行到call函数时,尽管带上了需要传递的参数,但PARAM(\((1)和\)(2))之前已经被展开了,故此时已经取不到传递进来的参数值.

VARIABLE1 := $(2) $(1)

$(info 1-$(VARIABLE1))

aa=$(call VARIABLE1,hello,world)

$(info 1-$(aa))
all:
@echo Done

1.2 变量定义为递归展开式

VARIABLE1 = $(2) $(1)

$(info 2-$(VARIABLE1))

aa=$(call VARIABLE1,hello,world)

$(info 2-$(aa))
all:
@echo Done

这里变量类型的定义再罗嗦一下,所谓的直接展开式,即在定义的时候立即展开;递归展开式,在定义的时候其实相当于声明,只有在实际引用时才展开.

2. 函数的引用

2.1 不带参数的函数引用

define FUNC1
$(info echo 3-"hello")
endef
$(call FUNC1)
all:
@echo Done

2.2 带参数的函数引用

define FUNC1
$(info echo 4-$(1) $(2))
endef $(call FUNC1,hello,wolrd) all:
@echo Done

2.3 逗号和参数之间有空格的示例

define FUNC1
$(info echo 5-$(1) $(2))
endef $(call FUNC1, hello, wolrd) all:
@echo Done

从执行的结果会发现,逗号和参数之间的空格也被作为参数的一部分.在这个例子中可能看不出明显的负面影响,后面我在举个栗子.

makefile之call函数的更多相关文章

  1. Linux makefile教程之函数七[转]

    使用函数 ———— 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能.make所支持的函数也不算很多,不过已经足够我们的操作了.函数调用后,函数的返回值可以当做 ...

  2. linux makefile字符串操作函数 替换subst、模式替换patsubst、去首尾空格strip、查找字符串findstring、过滤filter、反过滤filter-out、排序函数sort、取单词word、取单词串wordlist、个数统计words

    1.1       字符操作函数使用 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能.make所支持的函数也不算很多,不过已经足够我们的操作了.函数调用后,函 ...

  3. Makefile中的函数

    Makefile 中的函数 Makefile 中自带了一些函数, 利用这些函数可以简化 Makefile 的编写. 函数调用语法如下: $(<function> <arguments ...

  4. makefile 字符串处理函数

    截取自<跟我一起写Makefile> (1)  $(subst <from>, <to>, <text>) 名称: 字符串替换函数 subst 功能: ...

  5. Makefile编写 四 函数篇

    一.函数的调用语法 函数调用与变量一样,也是以“$”来标识的,其语法如下: $(<function> <arguments>) 或是 ${<function> &l ...

  6. makefile之shell函数

    shell函数不同于除"wildcard"函数之外的其它函数.make可以使用它来和外部通信. 函数功能:函数"shell"所实现的功能和shell中的引用(` ...

  7. makefile之origin函数

    origin 函数的作用是告诉你变量是哪里来的,其出生状况如何,他并不改变变量. 函数语法: $(origin ) 为变量的名字,而不是引用,所以一般没有"$"字符在前. orig ...

  8. 【makefile】symbol <函数> : can't resolve symbol 问题分析

    调试程序的时候,在linux编译器上可以编译通过,但是编译生成的firmware烧录到板子上的后出现以下异常: can't resolve symbol,无法解析元素符号. review一下code, ...

  9. Makefile内嵌函数

    subst字符串替换函数 $(subst <from>, <to>, <text>),把<text>中的<from>字符串替换成<to ...

  10. makefile之wildcard函数

    $(wildcard PATTERN) 函数功能: 获取匹配 PATTERN 的所有对象 返回值: 使用空格分割的匹配对象列表 1. 示例1

随机推荐

  1. Efficient GPU Screen-Space Ray Tracing

    http://jcgt.org/published/0003/04/04/paper.pdf 一个号称只有2ms的实时gpu光线追踪 screen space reflection用到了 和其他ray ...

  2. Jupyter Notebook 快捷键

    Jupyter Notebook 快捷键 从命令模式进入编辑模式需按 Enter 键,从编辑模式切换到命令模式需按Esc 键. Jupyter Notebook 是一个交互式笔记本程序, 其有丰富的快 ...

  3. Add Two Numbers(from leetcode python 链表)

    给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...

  4. Vue使用中遇到问题汇总(二)

    1.vue cli使用npm run dev报错cannot get / config/index.js里有两个环境:一个是build,一个dev. 在config/index.js里面修改,buil ...

  5. C# http Post 方法

    摘自: http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx Http Post in C# Searched out on t ...

  6. C# SQLite 创建数据库的方法增删查改语法和命令

    SQLite介绍 SQLite是一个开源.免费的小型RDBMS(关系型数据库),能独立运行.无服务器.零配置.支持事物,用C实现,内存占用较小,支持绝大数的SQL92标准. SQLite数据库官方主页 ...

  7. DotNetBar ComboBoxEx

    DotNetBar ComboBoxEx using System; using System.ComponentModel; using System.Drawing; using System.R ...

  8. 在 TDA 工具里看到 Java Thread State 的第一反应是

    转载:http://itindex.net/detail/43158-tda-%E5%B7%A5%E5%85%B7-java   使用 TDA 工具,看到大量 Java Thread State 的第 ...

  9. Win7双屏显示设置

    双显示器:一个是T410自己的屏幕,一个是宏基的Acer1296*768显示器. 连接:将宏基显示器的Display端子连接到笔记本的Display口上,电源接上. 设置过程: 1.右键点屏幕,选“S ...

  10. MySQL外键及级联删除 && 表的存储引擎与创建索引 && 删除数据库和表

    Messages表: mysql>create table Messages( ->message_id int auto_increment primary key, ->user ...