makefile详解
①Makefile中包含五种内容:显式规则,隐式规则,变量定义,指令(directive)和注释。
1.显式规则:描述如何生成规则的目标,它列出了目标依赖的文件,指定了产生或更新目标的命令
2.隐式规则:描述如何生成基于文件名的一类文件,说明目标可能依赖于和其文件名类似的文件,指定了相应的命令。
3.变量定义:定义一个变量
3.指令:类似与编译器的伪指令,包含:指示make读入另一个makefile,决定是否忽略makefile中的一部 分
4.注释:以‘#’开始直到行末,除非遇到续行符号。在’define’和命令中不能有注释,其它情况下注 释可出现在任何地方。
②内建的特殊目标
某些名字作为目标存在时有特殊含义。
a) .PHONY 该目标的依赖被认为是phony目标,处理这些目标时,命令无条件被执行,不管文件名是否
存在及其最后修改时间
b) .SUFFIXES 该目标的依赖被认为是一个后缀列表,在检查后缀规则时使用
c) .DEFAULT 该目标的规则被使用在没有规则(显式的或隐含的)的目标上。如果’DEFAULT’命令定
义了,则对所有不是规则目标的依赖文件都会执行该组命令
d) .PRECIOUS 该目标的依赖文件会受到特别对待:如果make被kill或命令的执行被中止,这些目标并不
删除;而且如果该目标是中间文件,在不需要时不会被删除。可以将隐含规则的目标模式(如%.o)
做为’.PRECIOUS’的依赖文件,这样可以保存这些规则产生的中间文件。
e) .INTERMEDIATE 该目标的依赖文件被当作中间文件;如果该目标没有依赖文件,则makefile中所有的
目标文件均被认为是中间文件。
f) .IGNORE 在执行该目标的依赖规则的命令时,make会忽略错误,此规则本身的命令没有意义。如果该
规则没有依赖关系,表示忽略所有命令执行的错误,这种用法只是为了向后兼容;由于会影响到所
有的命令,所以不是特别有用,推荐使用其它更有选择性忽略错误的方法。
g) .SILENT 在执行该目标的依赖规则的命令时,make并不打印命令本身。该规则的命令没有意义。
在’.SILIENT’没有依赖关系时,表示执行makefile中的所有命令都不会打印,该规则只是为了向
后兼容提供的。
h) .EXPORT_ALL_VARIABLES 只是作为一个目标存在,指示make将所有变量输出到子进程中。
定义的隐含规则的后缀作为目标时,也认为它是特殊目标;两个后缀的连接也是一样,比
如’.c.o’。这些目标是后缀规则,一中定义隐式规则的过时方法(但仍然广泛使用)。后缀通常 以’.’开始,
所以特殊目标也以’.’开始。
※②静态模式规则(TARGETS ...: TARGET-PATTERN: DEP-PATTERNS ...)
静态模式规则(static pattern rules)可以指定多个目标,并且使用目标名字来建议依赖文件的名字;
比普通多目标规则更通用因为不需要依赖关系是相同的:依赖关系必须类似但不需要相同。
目标的依赖文件名通过将DEP-PATTERNS中的’%’替换为词干形成:如果依赖模式为’%.c’,在替换词干’foo’可以得到’foo.c’。
objects = foo.o bar.o
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
依赖模式中不包含’%’也是合法的,此依赖文件对所有的目标均有效。
bigoutput littleoutput : %output : text.g
generate text.g -$* > $@
③隐式规则
省略
④双冒号规则
同一目标的双冒号规则事实是完全孤立的,每条规则被被单独处理,就象不同目标的规则一样;
规则按照在makefile中出现的次序被处理,此类规则真正有意义的是那些于命令执行次序无关的。
这种规则有时比较晦涩不是特别有用;它提供了一种机制:通过不同依赖文件的更新来对目标进行不同的处理,
这种情形很罕见。每个这种规则应当提供命令,如果没有,适用的隐式规则将使用。
浙公网安备 33010602011771号