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.

Contact me via :)
虚怀乃若谷,水深则流缓。