Makefile
Table of Contents
Makefile中的变量
Makefile Test Source
all: aaa bbb ccc foo.a(bar.o)
ccc.o:
@
bar.o:
@
foo.a(bar.o ccc.o):
@echo "\$$%" $%
aaa bbb ccc: bar.o ccc.o
@echo "\$$@" $@
@echo "\$$<" $<
@echo "\$$?" $?
b%b:
@echo "target: $@" pattern: b%b \$$*: $*
c%c:
@echo "target: $@" pattern: c%c \$$*: $*
%dd:
@echo "target: $@" pattern: %dd \$$*: $*
%e:
@echo "target: $@" pattern: %e \$$*: $*
stem: src/bbb src/ccc src/ddd src/eee
make -f Makefile
| $@ | aaa | |
| $< | bar.o | |
| $? | bar.o | ccc.o |
| $@ | bbb | |
| $< | bar.o | |
| $? | bar.o | ccc.o |
| $@ | ccc | |
| $< | bar.o | |
| $? | bar.o | ccc.o |
| $% | bar.o | |
Automatic Variables
- $@
- 目标文件名
- $%
- 当目标是归档文件时,表示其目标成员名
- $<
- 第一个依赖的target名字
- $?
- 所有的已经更新的依赖项
- $^
- 所有的依赖项, 如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。
- $+
- 所有的依赖项, 不删除重复项
- $|
- 所有的依赖项, 按照顺序排序
- $*
目标模式中 % 及其之前的部分
匹配模式匹配到的词根1
当匹配模式不包含/时,匹配时将会首先去掉文件夹路径, 最后在形成词根(stem)时,又会把文件夹路径加上.
所以在使用时应当避免使用前缀, 否则将很可能出现预料之外的$*变量值
make -f Makefile stem
$% The target member name, when the target is an archive member.
$% 当目标是归档文件时,
Footnotes:
1
: 词根,手册中的定义如下所示:
A target pattern is composed of a ‘%’ between a prefix and a suffix, either or both of which may be empty. The pattern matches a file name only if the file name starts with the prefix and ends with the suffix, without overlap. The text between the prefix and the suffix is called the stem.