makefile

本文深入讲解Makefile的高级使用技巧,包括等号的不同用法、字符串处理、特殊变量的运用、隐含规则的理解、假象目标的应用、函数的调用以及其他实用知识。适合有一定基础的Makefile使用者进一步提升技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

 

等号的使用

= 递归扩展
:= 简单扩展
?= 未定义则赋值

override VARIABLE = VALUE
如果不希望命令行指定的变量值替代在Makefile中的变量定义,那么我们需要在Makefile中使用指示符“override”来对这个变量进行声明

字符串处理

(var:suffix=replacement)替换,等效于:(var:suffix=replacement) 替换,等效于:(var:suffix=replacement)(patsubst %suffix,%replacement,$(var))
$(foo:%.o=%.c)

一些内置特殊变量

MAKECMDGOALS 即make的target。
CURDIR, PWD 举例:cd a; make -C b; means: CURDIR=b, PWD=a
$@ 扩展成当前规则的目标名,
$< 扩展成依靠列表中的第一个依赖文件,
$^ 扩展成整个依赖列表(除掉了里面所有重复的文件名)
?比目标文件(target)新的dependentfile.而?比目标文件(target)新的dependent file.而?(target)dependentfile.?的值只有在使用外显示(explicit)的规则时才会被设定.
$*是内存dependent file的文件名,不含扩展名.

Shell定义的特殊变量

$#: 内存位置参数的个数
$$: 该shell script的进程代号(pid)
$!: 最后一个后台进程代号
$*: 所有位置参数字符串,不限于9个参数

隐含规则

$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@

假象目标

告诉 make 不用检查它们是否存在于磁碟上,也不用查找任何隐含规则,直接假设指定的目的需要被更新。在 makefile 里加入下面这行包含上面规则的规则:

.PHONY : veryclean

函数 (Functions)

用一个 $ 符号跟开括号,函数名,空格后跟一列由逗号分隔的参数,最后 用关括号结束。

例如,在 GNU Make 里有一个叫 ‘wildcard’ 的函数,它有一个参数,功能是展开成一列所有符合由其参数描述的文件名,文件间以空格间隔。你可以像下面所示使用这个命令:
SOURCES = $(wildcard *.c)

另一个有用的函数是 patsubst ( patten substitude, 匹配替换的缩写)函数。它需要3个参数——第一个是一个需要匹配的 式样,第二个表示用什么来替换它,第三个是一个需要被处理的 由空格分隔的字列。例如,
OBJS = (patsubst(patsubst %.c,%.o,(patsubst(SOURCES))

‘filter-out’ 函数使用两个用空格分开的列表,它把第二列表中所有的存在于第一列表中的项目删除。我用它来处理 DEPS 列表,把所有已经存在的项目都删除,而只保留缺少的那些。

其他

如果 CPPFLAGS 指定了 -MD , 它的 .d 文件也被重新产生。

如果make命令后不带参数,即不指定目标,则默认使用makefile中发现的第一个目标,但不包括带有通配符(%)的目标。
在一条规则中,将忽略空行(只含有空格或制表符),而命令行必须以制表符为起始字符,忽略起始制表符与命令中间的空格和制表符。

 

转载于:https://www.cnblogs.com/realplay/p/9867545.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值