Makefile学习之路5——通过函数增强功能

通过函数能显著增强Makefile的功能。对于simple项目的Makefile,尽管使用了模式规则,但还是有一件比较麻烦的事情,就是要在Makefile中指明每一个项目源文件。下面介绍几个后期会使用到的函数,更多请参考《GUN Make》。

1.abspath函数

从命名就应该能够猜出它的作用。abspath函数用于将_name中的各路径名转化成绝对路径,并将转化后的结果返回。调用形式为:

$(abspath _name)

1 .PHONY: all
2 root :=$(abspath /uer/../lib)
3 all:
4     @echo $(root)

2.addprefix函数

addprefix函数用于给名字列表_name中的每一个名字增加前缀_prefix,并将增加了前缀的名字列表返回,调用形式为:

$(addprefix _prefix,_name)

1 .PHONY: all
2 without_dir=main.c foo.c
3 with_dir :=$(addprefix objs/,$(without_dir))
4 all:
5     @echo $(with_dir)

3.addsuffix函数

和前面addprefix刚好相反,addsuffix函数为_name增加后缀_suffix,调用形式为:

$(addsuffix _suffix,_name)

1 .PHONY: all
2 without_dir=main foo
3 with_dir :=$(addsuffix .c,$(without_dir))
4 all:
5     @echo $(with_dir)

4.filter函数

filter函数被用于从一个名字列表_text中根据模式_patterm得到满足需要的名字列表并返回,其形式是:

$(filter _pattern,_text)

1 .PHONY: all
2 sources =foo.o bar.c main.c hell.s
3 sources :=$(filter %.c %.s,$(sources))
4 all:
5     @echo $(sources)

5.eval函数

eval函数的存在使得Makefile具有动态语言的特征。eval函数使得make将再一次解析_text语句。eval返回空字符串,调用形式为:

$(eval _text)

1 .PHONY: all
2 sources =foo.o bar.c main.c hell.s
3 $(eval sources :=$(filter %.c %.s,$(sources)))
4 all:
5     @echo $(sources)

虽然它和上面第四个函数运行结果完全一样,但是在某些场合却必须用eval。可参考:http://bbs.chinaunix.net/thread-2321462-3-1.html

eval的二次展开,是递归的一种形式,因为有时候在Makefile的表达式中,最后得出来的可能还是Makefile的表达式而非真正我们想要传递的值,需要再展开Makefile的表达式得到最终的结果。

时间: 2025-01-05 22:33:08

Makefile学习之路5——通过函数增强功能的相关文章

IOS学习之路-- 指针&宏函数

如果*p被()包住,说明指针变量p将来指向的是函数 //声明一个指针变量 //int (*p)(int, int) = sum; int (*p)(int, int); p = sum; // 如果*p被()包住,说明指针变量p将来指向的是函数 // 最左边的void说明p指向的函数没有返回值 // 最右边的()说明p指向的函数没有形参 void (*p)(); // 函数名test就是test函数的地址 // 将test函数的地址赋值给了指针变量p // 指针变量p成功指向了test函数 p

linux学习之路之LVM的快照功能

我们知道LVM可以弹性的调整文件系统的大小,其实LVM除了可以调整文件系统的大小之外,还有另一个功能就是系统快照. 所谓系统快照就是将某一时刻文件系统中的信息记录到快照区中,这里的某一时刻指的是在原始数据被改变的那一瞬间,原始数据会移到快照区里.而其他没有改变的数据,快照区和文件系统共享.所以刚建立快照时快照区内容和文件系统的内容一样. 由于我们知道只有改变的数据才会移动到快照区,因此快照区中保存的内容比较少. 快照区的原理图如下: 那么如何建立快照区呢? 使用lvcreate -s命令来创建快

Python学习之路第二天——函数

一.Python2.X内置函数表: 注:以上为pyton2.X内置函数,官方网址:https://docs.python.org/2/library/functions.html 二.Python3.X内置函数表: 注:以上为pyton3.X内置函数,官方网址:https://docs.python.org/3.5/library/functions.html 三.自定义函数: def 函数名(参数):     ... 函数体     ... def:是函数的关键字,告诉python解释器这是一

jquery学习之路之核心函数

jquery 1.核心 : 核心函数: jquery([sel,[context]]). each(callback). jquery(html,[ownerDoc]). size(). jquery(callback). length(). jquery.holdready(hold). selector. context. get([index]). index([selector|element]). data([key],[value]). removeData([name|list])

C++学习之路:虚函数与多态

summery:主要有以下几个内容 1.多态 2.静态绑定与动态绑定 3.虚函数 4.虚表指针 5.object slicing与虚函数 6.overload override overwrite的区别   @什么是多态性?  #多态是面向对象程序设计的重要特征之一 #多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为 #多态的实现:  $函数重载 $运算符重载 $模板  $虚函数 前三个都属于静态绑定, 虚函数属于动态绑定 tip: {静态绑定}:绑定过程出现在编译阶段,在

Makefile学习之路——4

变量的类别有递归扩展变量和简单扩展变量.只用一个"="符号定义的变量被称为递归扩展变量.通过下面例子观察递归扩展变量的特点. 1 .PHONY: all 2 3 foo=$(bar) 4 bar=$(ugh) 5 ugh=Huh? 6 7 all: 8 @echo $(foo) 从结果来看,递归扩展变量的引用是递归的. CFLAGS =$(CFLAGS) -O 上面的赋值代码将会造成一个死循环,无限递归. 简单变量扩展使用" :="操作符来定义的.对于这种变量,ma

No.18 selenium学习之路之匿名函数lambda

定义: lambda 参数列表:return(表达式) 匿名函数的表达式,只允许有一个. 匿名函数一般用于较简单的情况. 实例1: 实例2,配合高阶函数filter()使用: filter()函数是 Python 内置的另一个有用的高阶函数, filter()函数接收一个函数 f 和一个list, 这个函数 f 的作用是对每个元素进行判断, 返回 True或 False, filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list.

makefile学习之路——makefile简介

一.make简介 make是一个指令工具,它解释makefile中的指令或者说规则.makefile文件描述了整个工程中所有文件的**编译顺序,编译规则**.Makefile也有自己的编写规则,通常,我们所使用的IDE都会生成相应的makefile,然后再根据makefile来进行编译,只是这些操作是由IDE来完成,我们只需要点击一个编译按钮. 二.为什么要使用make 现在可以在GitHub上看到,很多的开源项目,在编译的时候,都是使用make来完成的,也就是说,都有其对应的makefile.

makefile学习之路——变量

在makefile中,支持程序设计语言中变量的概念,所有的变量只代表文本数据. 一.变量的定义和使用 #变量的定义 CC := gcc TARGET := hello.out #变量的使用 $(TARGET) : func.o main.o     $(CC) -o $(TARGET) func.o main.o 二.变量的赋值方式 1. 简单赋值        := 只针对当前语句的变量有效 2. 递归赋值        = 赋值操作可能影响多个其他变量,所有与目标变量相关的其他变量都将受到影