Makefile - Study Notes

通常情况下,执行失败的命令一旦改变了它所在规则的目标文件,则这个改变了的目标可能不是一个被正确重建的文件。但是这个文件的时间戳已经被更新过了(这种情况也会发生在使用一个信号来强制中止命令执行的时候)。因此在下一次执行make时,由于时间戳更新它不会被再次重建。因此终极目标的重建很难保证是正确的。为了避免这种错误的出现,应该在一次make执行失败之后使用“make clean”来清除已经重建的所有目标,之后再执行make。我们也可以让make自动完成这个动作,实现这个目的我们只需要Makefile中定义特殊目标“.DELETE_ON_ERROR”。但是这个做法存在不兼容。推荐的做法是:在make执行失败时,修改错误之后执行make之前,使用 “make clean”明确的删除第一次错误重建的所有目标。

“=”(递归)、“:=”(静态)、“+=”(追加)或者“?=”(条件)
第一种风格的变量,“递归方式”。这一类型的变量的定义是通过“=”或者使用指示符“define”定义的变量。对这种变量的引用,在引用的地方是严格的文本替换过程,就是说在变量定义时,变量值中对其他变量的引用不会被替换展开。其优点是:这种类型变量的定义时,可以引用其它的之前没有定义的变量(可能在后续部分定义,或者是通过make的命令行选项传递的变量)。
第二种风格的变量,“直接展开”。这种风格的变量使用“:=”来定义变量。在使用“:=”定义变量时,变量值中对另外变量的引用或者函数的引用在定义时被展开(对变量进行替换)。所以在变量被定义以后就是一个实际所需要定义的文本串,其中不再包含任何对其它变量的引用。

默认情况下,终极目标就是出现在Makefile中,除以点号“.”(参考 Makefile的特殊目标一节)开始的第一个规则中的第一个目标(如果第一个规则存在多个目标)。因此我们的Makefile就书写为:第一个目标的编译规则就描述了整个工程或者程序的编译过程和规则。如果在Makefile中的第一个规则有多个目标,那么默认的终极目标是多个目标中的第一个。我们在 Makefile所在的目录下执行“make”时,将完成对默认终极目标的重建。

Example:
CXX = gccBIN = test
OBJS = test.o
CXXFLAGS = -Wall -g

all:$(BIN)

$(BIN):$(OBJS)
$(CXX) $(CXXFLAGS) -o $@ $(OBJS)

%.o:%.c
$(CXX) $(INCPATH) $(CXXFLAGS) -c $<

clean:
$(RM) $(BIN) *.o
posted @ 2011-08-07 08:38  bambreeze  阅读(135)  评论(0编辑  收藏  举报