当前位置: 技术问答>linux和unix
谁能看懂下面这段Makefile代码我就服
来源: 互联网 发布时间:2016-03-17
本文导语: SRC = libsample.c SRC.C = $(filter %.C, $(SRC)) ..... ..... $(SRC.C:%.C=%.c): #last line in this file | 1。是空 可用如下脚本进行确认: ----------------------------- SRC = libsample.c #libsample.C SRC.C = $(filter %.C, $(SRC)) a...
SRC = libsample.c
SRC.C = $(filter %.C, $(SRC))
.....
.....
$(SRC.C:%.C=%.c): #last line in this file
SRC.C = $(filter %.C, $(SRC))
.....
.....
$(SRC.C:%.C=%.c): #last line in this file
|
1。是空
可用如下脚本进行确认:
-----------------------------
SRC = libsample.c #libsample.C
SRC.C = $(filter %.C, $(SRC))
all:
@echo "print SRC.C = "$(SRC.C)
-----------------------------
2。是宏展开的语法(http://radiofly.to/nishi/programming/make-guide.html)
$(SRC.C:%.C=%.c):
是将SRC.C中的所有.C作为后缀的文件替换成.c文件,并以此作为一个没有依赖的目标
a.如果SRC = libsample.C
则经过宏展开之后,最后一行就变成
libsample.c:
根据make规则,没有依赖的目标总是最新的,那么在Makefile中的其他地方,
所有以libsample.c作为依赖的目标都需要被更新。
但是如果libsample.c不存在,那么根据Make的另一个规则,不存在的目标都是最旧的,
该目标需要被更新。那么这个不存在的libsample.c会被更新成最新的,
这样又得到所有以libsample.c作为依赖的目标都需要被更新这个结论。
b.如果SRC = libsample.c
则经过宏展开之后,最后一行就变成
:
无目标,无依赖,无规则,就是什么都不做。
欢迎拍砖。
可用如下脚本进行确认:
-----------------------------
SRC = libsample.c #libsample.C
SRC.C = $(filter %.C, $(SRC))
all:
@echo "print SRC.C = "$(SRC.C)
-----------------------------
2。是宏展开的语法(http://radiofly.to/nishi/programming/make-guide.html)
$(SRC.C:%.C=%.c):
是将SRC.C中的所有.C作为后缀的文件替换成.c文件,并以此作为一个没有依赖的目标
a.如果SRC = libsample.C
则经过宏展开之后,最后一行就变成
libsample.c:
根据make规则,没有依赖的目标总是最新的,那么在Makefile中的其他地方,
所有以libsample.c作为依赖的目标都需要被更新。
但是如果libsample.c不存在,那么根据Make的另一个规则,不存在的目标都是最旧的,
该目标需要被更新。那么这个不存在的libsample.c会被更新成最新的,
这样又得到所有以libsample.c作为依赖的目标都需要被更新这个结论。
b.如果SRC = libsample.c
则经过宏展开之后,最后一行就变成
:
无目标,无依赖,无规则,就是什么都不做。
欢迎拍砖。
|
我来回答下,各位排砖:)
SRC = libsample.c # 得到原文件列表为 “libsample.c”
SRC.C = $(filter %.C, $(SRC)) # 将上面得到的原文件列表进行过滤,找出形如*.C的文件列表,保存到SRC.C中
.....
.....
$(SRC.C:%.C=%.c): # 将SRC.C中的*.C文件转化成*.c输出(实际存在于文件系统中的的文件名并没有改变),并作为taget
SRC = libsample.c # 得到原文件列表为 “libsample.c”
SRC.C = $(filter %.C, $(SRC)) # 将上面得到的原文件列表进行过滤,找出形如*.C的文件列表,保存到SRC.C中
.....
.....
$(SRC.C:%.C=%.c): # 将SRC.C中的*.C文件转化成*.c输出(实际存在于文件系统中的的文件名并没有改变),并作为taget