GNU make 学习总结

 

 

个人写了一个简单的makefile通用模板,编译CPP或者C程序,见下一篇日志。

http://blog.csdn.net/felixit0120/article/details/7663756

 

GNU make学习总结:

 1.$(patsubst PATTERN,REPLACEMENT,TEXT)
函数功能:搜索"TEXT"中以空格分开的单词,将符合模式PATTERN替换为REPLACEMENT.参数PATTERN中可以使用模式通配符%来代表一个单词中的若干字符。如果参数REPLACEMENT中也包含一个%,

那么REPLACEMENT中的%将是PATTERN中的那%所代表的字符。
示例:$(patsubst %.c,%.o,x.c.c bar.c)
把字符串"x.c.c bar.c"中以.c结尾的单词替换成以.o结尾的字符,函数的返回结果是"x.c.o bar.o"


2.简化版的patsubst
$(VAR:PATTERN=REPLACEMENT)   等价    $(patsubst PATTERN,REPLACEMENT,$(VAR))
而另外一种更为简单的替换字符后缀的实现:
$(VAR:SUFFIX=REPLACEMENT)    等价    $(patsubst %SUFFIX,%REPLACEMENT,$(VAR))
例如我们存在一个代表所有.o文件的变量。定义为“objects = foo.o bar.o baz.o”。为了得到这些.o文件所对应的.c源文件。我们可以使用以下两种方式的任意一个:
$(objects:.o=.c)
$(patsubst %.o,%.c,$(objects))


3.$(wildcard PATTERN)
函数功能:列出当前目录下所有符合模式"PATTERN"格式的文件名
函数说明:"PATTERN"使用shell可识别的通配符,包括?(单字符),*(多字符)等。
示例:   $(wildcard *.c)
返回值为当前目录下所有.c源文件列表
复杂的一些用法:可以使用$(patsubst %.c,%.o,$(wildcard *.c))
首先使用wildcard函数获取工作目录下的.c文件列表,之后将列表中所有文件名的后缀替换为.o,这样就可以得到当前目录可生成的.o文件列表。
在一个目录下可以使用如下内容的Makefile将工作目录下的所有.c文件进行编译并最后连接成一个可执行文件。

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

foo:$(objects)
 cc -o foo $(objects)
这里使用了make的隐含规则来编译.c的源文件。

 

4.一般搜索(变量VPATH)
make可识别一个特殊的变量VPATH.通过变量VPATH可以指定依赖文件的搜索路径,在规则的依赖文件在当前目录不存在时,make会在此变量所指定的目录下去寻找这些依赖文件.一般我们都用此变量来说明规则中的依赖文件的搜索路径。其实VPATH变量所指定的是Makefile中所有文件的搜索路径,包括依赖文件和目标文件.
变量VPATH的定义中,使用空格或者冒号将多个目录分开。make搜索的目录顺序安装变量VPATH定义中的顺序进行(当前目录永远是第一搜索目录).
VPATH = src:../headers
通过VPAHT变量指定的路径在Makefile中对所有文件有效。当需要为不同类型的文件指定不同的搜索目录时,需要使用另外一种方式。


5.选择性搜索(关键字vpath)
另一个设置文件搜索路径的方法是使用make的vpath关键字(全小写)。它不是一个变量,是一个make的关键字。
它可以为不同类型的文件(由文件名区分)指定不同的搜索目录。它的使用有三种。
1. vpath PATTERN DIRECTORIES
为符合模式PATTERN的文件指定搜索目录DIRECTORYS.多个目录使用空格或者冒号分开
2.vpath PATTERN
清楚之前为符合模式PATTERN的文件设置的搜索路径。
3.vpath
清楚所有已被设置的文件搜索路径。
vpath使用方法中的PATTERN需要包含模式字符%.%意思是匹配一个或者多个字符,例如%.h表示所有以.h结尾的文件。
vpath %.h ../headers
含义是:Makefile中出现的.h文件,如果不能在当前目录下找到,则到目录../headers
注意:这里指定的路径仅限于在Makefile文件中出现的.h文件.并不能指定源文件中包含的头文件所在路径(在.c源文件中所包含的头文件需要使用gcc的命令来说明)

 

 

自动化变量
$@  代表规则中的目标文件名。在多目标的模式规则中,它代表的是哪个触发规则被执行的目标文件名
$<  规则的第一个依赖文件名。如果是隐含规则,则它代表通过目标指定的第一个依赖文件.
$^  规则的所有依赖文件列表,使用空格分隔。如果目标是静态库文件名,它代表的只能是所有库成员(.o)名。一个文件可重复的出现在目标的依赖中,变量$^只会记录它的一次引用情况。就是说变量$^会去掉重复的依赖文件.

 

 

makefile的终极目标:

makefile的第一个目标为该makefile的终极目标

所谓终极目标就是make最终要重建的,makefile中某个规则的目标。
为了完成对终极目标的重建,可能会触发它的依赖或者依赖的依赖文件被重建的过程。
默认情况下,终极目标就是出现在makefile中,除以点号.开始的第一个规则中的第一个目标(如果第一个规则存在多个目标).
因此我们的makefile就书写为:第一个目标的编译规则就描述了整个工程或者程序的编译过程和规则,如果在makefile中的第一个规则有多个目标,那么默认的终极目标是多个目标中的第一个。
我们在makefile所在的目录下执行make时,将完成对默认终极目标的重建.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

szwm1010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值